From 9c25cef93f2d244e8e664d17c3ba4914932b0cd4 Mon Sep 17 00:00:00 2001 From: Cellie Date: Mon, 18 Nov 2024 08:43:31 +0100 Subject: [PATCH 001/183] Update pins_arduino.h (#10610) The correct pin is GPIO4. --- variants/m5stack_fire/pins_arduino.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/m5stack_fire/pins_arduino.h b/variants/m5stack_fire/pins_arduino.h index 3759219d1bf..2202e6bb4bc 100644 --- a/variants/m5stack_fire/pins_arduino.h +++ b/variants/m5stack_fire/pins_arduino.h @@ -9,7 +9,7 @@ static const uint8_t RX = 3; static const uint8_t SDA = 21; static const uint8_t SCL = 22; -static const uint8_t SS = 5; +static const uint8_t SS = 4; static const uint8_t MOSI = 23; static const uint8_t MISO = 19; static const uint8_t SCK = 18; From 02b03286a25d5e73b7280cd77a96f8c2c3675c9c Mon Sep 17 00:00:00 2001 From: Mikey Sklar Date: Sun, 17 Nov 2024 23:44:22 -0800 Subject: [PATCH 002/183] Feather V2 and Qt PY Pico PartitionScheme (#10604) Default stays the same, additional option for larger SPIFFS area. Using existing partition CSV. Tested on Feather V2 Arduino 2.3.3 ESP32 BSP 3.0.7 --- boards.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/boards.txt b/boards.txt index 9bb3f53b7bf..5c2ec8a4e91 100644 --- a/boards.txt +++ b/boards.txt @@ -13479,6 +13479,9 @@ adafruit_feather_esp32_v2.menu.PSRAM.disabled.build.defines= adafruit_feather_esp32_v2.menu.PartitionScheme.default_8MB=Default (3MB APP/1.5MB SPIFFS) adafruit_feather_esp32_v2.menu.PartitionScheme.default_8MB.build.partitions=default_8MB adafruit_feather_esp32_v2.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 +adafruit_feather_esp32_v2.menu.PartitionScheme.large_spiffs_8MB=Large SPIFFS (1.2MB APP / 5.3MB SPIFFS) +adafruit_feather_esp32_v2.menu.PartitionScheme.large_spiffs_8MB.build.partitions=large_spiffs_8MB +adafruit_feather_esp32_v2.menu.PartitionScheme.large_spiffs_8MB.upload.maximum_size=1310720 adafruit_feather_esp32_v2.menu.CPUFreq.240=240MHz (WiFi/BT) adafruit_feather_esp32_v2.menu.CPUFreq.240.build.f_cpu=240000000L @@ -15167,6 +15170,9 @@ adafruit_qtpy_esp32_pico.menu.PSRAM.disabled.build.defines= adafruit_qtpy_esp32_pico.menu.PartitionScheme.default_8MB=Default (3MB APP/1.5MB SPIFFS) adafruit_qtpy_esp32_pico.menu.PartitionScheme.default_8MB.build.partitions=default_8MB adafruit_qtpy_esp32_pico.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 +adafruit_qtpy_esp32_pico.menu.PartitionScheme.large_spiffs_8MB=Large SPIFFS (1.2MB APP / 5.3MB SPIFFS) +adafruit_qtpy_esp32_pico.menu.PartitionScheme.large_spiffs_8MB.build.partitions=large_spiffs_8MB +adafruit_qtpy_esp32_pico.menu.PartitionScheme.large_spiffs_8MB.upload.maximum_size=1310720 adafruit_qtpy_esp32_pico.menu.CPUFreq.240=240MHz (WiFi/BT) adafruit_qtpy_esp32_pico.menu.CPUFreq.240.build.f_cpu=240000000L From 1cdd8e8ce0d0003518fb2b68365bb4f2809f11d1 Mon Sep 17 00:00:00 2001 From: Unexpected Maker Date: Mon, 18 Nov 2024 23:43:28 +1100 Subject: [PATCH 003/183] Fixed incorrect Flash size for UM FeatherS3 Neo build flash size (#10614) Signed-off-by: Seon Rozenblum --- boards.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards.txt b/boards.txt index 5c2ec8a4e91..069a0340cf0 100644 --- a/boards.txt +++ b/boards.txt @@ -3895,7 +3895,7 @@ um_feathers3neo.build.cdc_on_boot=1 um_feathers3neo.build.msc_on_boot=0 um_feathers3neo.build.dfu_on_boot=0 um_feathers3neo.build.f_cpu=240000000L -um_feathers3neo.build.flash_size=16MB +um_feathers3neo.build.flash_size=8MB um_feathers3neo.build.flash_freq=80m um_feathers3neo.build.flash_mode=dio um_feathers3neo.build.boot=qio From 4a8ba4294ec9d21f64e42566710fca720a25aeda Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 19 Nov 2024 11:18:06 +0100 Subject: [PATCH 004/183] fix weird formatting, no code change (#10617) * fix formatting * Disable formatter for these lines --------- Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> --- cores/esp32/esp32-hal-cpu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-cpu.c b/cores/esp32/esp32-hal-cpu.c index f0a30b50afc..40e2cf0fdf0 100644 --- a/cores/esp32/esp32-hal-cpu.c +++ b/cores/esp32/esp32-hal-cpu.c @@ -259,6 +259,7 @@ bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) { if (apb_change_callbacks) { triggerApbChangeCallback(APB_AFTER_CHANGE, capb, apb); } + // clang-format off #ifdef SOC_CLK_APLL_SUPPORTED log_d( "%s: %u / %u = %u Mhz, APB: %u Hz", @@ -268,7 +269,7 @@ bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) { #ifdef CONFIG_IDF_TARGET_ESP32P4 : "17.5M"), #else - : "8M")), + : "8M")), #endif conf.source_freq_mhz, conf.div, conf.freq_mhz, apb ); @@ -278,6 +279,7 @@ bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) { conf.source_freq_mhz, conf.div, conf.freq_mhz, apb ); #endif + // clang-format on return true; } From fe0f016b4f6476d83e0422e2d9193e8f08f93d9d Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 19 Nov 2024 07:18:23 -0300 Subject: [PATCH 005/183] Matter example patch (#10618) * feat(matter): adjust preferences labels in matter examples * feat(matter): adjust preferences labels in matter examples * fix(matter_example): extra blank space in code added by mistake * feat(matter_example): use const char * instead of #define * feat(matter_example): use const char * instead of #define * feat(matter_example): change Preferences names * fix(matter_example): missing semicolon in code --- .../MatterDimmableLight/MatterDimmableLight.ino | 14 ++++++++------ .../examples/MatterOnOffLight/MatterOnOffLight.ino | 9 +++++---- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index ded0118b7d1..5fd3152dacf 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -22,7 +22,9 @@ MatterDimmableLight DimmableLight; // it will keep last OnOff & Brightness state stored, using Preferences -Preferences lastStatePref; +Preferences matterPref; +const char *onOffPrefKey = "OnOffState"; +const char *brightnessPrefKey = "BrightnessState"; // set your board RGB LED pin here #ifdef RGB_BUILTIN @@ -51,8 +53,8 @@ bool setLightState(bool state, uint8_t brightness) { digitalWrite(ledPin, LOW); } // store last Brightness and OnOff state for when the Light is restarted / power goes off - lastStatePref.putUChar("lastBrightness", brightness); - lastStatePref.putBool("lastOnOffState", state); + matterPref.putUChar(brightnessPrefKey, brightness); + matterPref.putBool(onOffPrefKey, state); // This callback must return the success state to Matter core return true; } @@ -86,11 +88,11 @@ void setup() { delay(500); // Initialize Matter EndPoint - lastStatePref.begin("matterLight", false); + matterPref.begin("MatterPrefs", false); // default OnOff state is ON if not stored before - bool lastOnOffState = lastStatePref.getBool("lastOnOffState", true); + bool lastOnOffState = matterPref.getBool(onOffPrefKey, true); // default brightness ~= 6% (15/255) - uint8_t lastBrightness = lastStatePref.getUChar("lastBrightness", 15); + uint8_t lastBrightness = matterPref.getUChar(brightnessPrefKey, 15); DimmableLight.begin(lastOnOffState, lastBrightness); // set the callback function to handle the Light state change DimmableLight.onChange(setLightState); diff --git a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino index 675e9e989f2..8f4276643e2 100644 --- a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino +++ b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino @@ -22,7 +22,8 @@ MatterOnOffLight OnOffLight; // it will keep last OnOff state stored, using Preferences -Preferences lastStatePref; +Preferences matterPref; +const char *onOffPrefKey = "OnOffState"; // set your board LED pin here #ifdef LED_BUILTIN @@ -48,7 +49,7 @@ bool setLightOnOff(bool state) { digitalWrite(ledPin, LOW); } // store last OnOff state for when the Light is restarted / power goes off - lastStatePref.putBool("lastOnOffState", state); + matterPref.putBool(onOffPrefKey, state); // This callback must return the success state to Matter core return true; } @@ -82,8 +83,8 @@ void setup() { delay(500); // Initialize Matter EndPoint - lastStatePref.begin("matterLight", false); - bool lastOnOffState = lastStatePref.getBool("lastOnOffState", true); + matterPref.begin("MatterPrefs", false); + bool lastOnOffState = matterPref.getBool(onOffPrefKey, true); OnOffLight.begin(lastOnOffState); OnOffLight.onChange(setLightOnOff); From 2b6b5c74cead63e51e3fb5043647302109b5c6df Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 19 Nov 2024 07:18:43 -0300 Subject: [PATCH 006/183] feat(uart): adds Serial4 as a keyword - used by ESP32-P4 (#10619) * feat(uart): adds Serial4 as a keyword - used by ESP32-P4 * fix(keywords): added 2 new lines to keep consistancy --- libraries/ESP32/keywords.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/ESP32/keywords.txt b/libraries/ESP32/keywords.txt index 6cfd3fcab4c..7e36360c840 100644 --- a/libraries/ESP32/keywords.txt +++ b/libraries/ESP32/keywords.txt @@ -6,6 +6,8 @@ # Datatypes (KEYWORD1) ####################################### +Serial4 KEYWORD1 + ####################################### # Methods and Functions (KEYWORD2) ####################################### From f5ce3f76755851537b846fb9eb402c7a30b0dc5b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 19 Nov 2024 11:19:02 +0100 Subject: [PATCH 007/183] Guard ethernet parts to make it possible to use without (#10609) * Update ETH.cpp * Update ETH.h * Update WiFiGeneric.h * Update NetworkEvents.h * remove unnecessary include "sdkconfig.h" * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- libraries/Ethernet/src/ETH.cpp | 3 +++ libraries/Ethernet/src/ETH.h | 4 ++++ libraries/Network/src/NetworkEvents.h | 6 +++++- libraries/WiFi/src/WiFiGeneric.h | 2 ++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/libraries/Ethernet/src/ETH.cpp b/libraries/Ethernet/src/ETH.cpp index 1bd8f367c3d..fa8a2b97122 100644 --- a/libraries/Ethernet/src/ETH.cpp +++ b/libraries/Ethernet/src/ETH.cpp @@ -22,6 +22,7 @@ #define ARDUINO_CORE_BUILD #include "ETH.h" +#if CONFIG_ETH_ENABLED #include "esp_system.h" #include "esp_event.h" #include "esp_eth.h" @@ -1056,3 +1057,5 @@ size_t ETHClass::printDriverInfo(Print &out) const { } ETHClass ETH; + +#endif /* CONFIG_ETH_ENABLED */ diff --git a/libraries/Ethernet/src/ETH.h b/libraries/Ethernet/src/ETH.h index 10d6b504c2a..582835cf8ac 100644 --- a/libraries/Ethernet/src/ETH.h +++ b/libraries/Ethernet/src/ETH.h @@ -18,6 +18,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "sdkconfig.h" +#if CONFIG_ETH_ENABLED + #ifndef _ETH_H_ #define _ETH_H_ @@ -249,3 +252,4 @@ class ETHClass : public NetworkInterface { extern ETHClass ETH; #endif /* _ETH_H_ */ +#endif /* CONFIG_ETH_ENABLED */ diff --git a/libraries/Network/src/NetworkEvents.h b/libraries/Network/src/NetworkEvents.h index a84ced88496..34a54cab092 100644 --- a/libraries/Network/src/NetworkEvents.h +++ b/libraries/Network/src/NetworkEvents.h @@ -5,18 +5,20 @@ */ #pragma once +#include "sdkconfig.h" #include "soc/soc_caps.h" #include "esp_err.h" #include "esp_event.h" #include "esp_netif_types.h" +#if CONFIG_ETH_ENABLED #include "esp_eth_driver.h" +#endif #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "freertos/semphr.h" #include "freertos/event_groups.h" -#include "sdkconfig.h" #if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 #include #endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 @@ -98,7 +100,9 @@ typedef union { ip_event_ap_staipassigned_t wifi_ap_staipassigned; ip_event_got_ip_t got_ip; ip_event_got_ip6_t got_ip6; +#if CONFIG_ETH_ENABLED esp_eth_handle_t eth_connected; +#endif #if SOC_WIFI_SUPPORTED || CONFIG_ESP_WIFI_REMOTE_ENABLED wifi_event_sta_scan_done_t wifi_scan_done; wifi_event_sta_authmode_change_t wifi_sta_authmode_change; diff --git a/libraries/WiFi/src/WiFiGeneric.h b/libraries/WiFi/src/WiFiGeneric.h index 27b41043abf..ed216229ed4 100644 --- a/libraries/WiFi/src/WiFiGeneric.h +++ b/libraries/WiFi/src/WiFiGeneric.h @@ -33,7 +33,9 @@ #include "IPAddress.h" #include "esp_smartconfig.h" #include "esp_netif_types.h" +#if CONFIG_ETH_ENABLED #include "esp_eth_driver.h" +#endif #if CONFIG_NETWORK_PROV_NETWORK_TYPE_WIFI #include "network_provisioning/manager.h" #endif From d7b5bb111e9d957995d668285655803d92b877df Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 20 Nov 2024 09:42:43 +0100 Subject: [PATCH 008/183] Guard WPA Enterprise support (#10616) * Guard WPA Enterprise support * guard `WIFI_ENTERPRISE_SUPPORT` * wrong part guarded * fix guard start and end * add guard enterprise --- libraries/WiFi/src/STA.cpp | 2 ++ libraries/WiFi/src/WiFiSTA.cpp | 2 ++ libraries/WiFi/src/WiFiSTA.h | 5 +++++ 3 files changed, 9 insertions(+) diff --git a/libraries/WiFi/src/STA.cpp b/libraries/WiFi/src/STA.cpp index a7163ba0434..547a27d1c47 100644 --- a/libraries/WiFi/src/STA.cpp +++ b/libraries/WiFi/src/STA.cpp @@ -421,6 +421,7 @@ bool STAClass::connect(const char *ssid, const char *passphrase, int32_t channel return true; } +#if CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT /** * Start Wifi connection with a WPA2 Enterprise AP * if passphrase is set the most secure supported mode will be automatically selected @@ -519,6 +520,7 @@ bool STAClass::connect( return connect(wpa2_ssid, NULL, channel, bssid, tryConnect); //connect to wifi } +#endif /* CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT */ bool STAClass::disconnect(bool eraseap, unsigned long timeout) { if (eraseap) { diff --git a/libraries/WiFi/src/WiFiSTA.cpp b/libraries/WiFi/src/WiFiSTA.cpp index b636e692a04..b956e35ba26 100644 --- a/libraries/WiFi/src/WiFiSTA.cpp +++ b/libraries/WiFi/src/WiFiSTA.cpp @@ -63,6 +63,7 @@ wl_status_t WiFiSTAClass::status() { return STA.status(); } +#if CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT wl_status_t WiFiSTAClass::begin( const char *wpa2_ssid, wpa2_auth_method_t method, const char *wpa2_identity, const char *wpa2_username, const char *wpa2_password, const char *ca_pem, const char *client_crt, const char *client_key, int ttls_phase2_type, int32_t channel, const uint8_t *bssid, bool connect @@ -77,6 +78,7 @@ wl_status_t WiFiSTAClass::begin( return STA.status(); } +#endif /* CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT */ wl_status_t WiFiSTAClass::begin(const char *ssid, const char *passphrase, int32_t channel, const uint8_t *bssid, bool connect) { if (!STA.begin()) { diff --git a/libraries/WiFi/src/WiFiSTA.h b/libraries/WiFi/src/WiFiSTA.h index 96a3aa59dbd..3c8adbd8502 100644 --- a/libraries/WiFi/src/WiFiSTA.h +++ b/libraries/WiFi/src/WiFiSTA.h @@ -54,11 +54,13 @@ class STAClass : public NetworkInterface { bool connect(); bool connect(const char *ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t *bssid = NULL, bool connect = true); +#if CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT bool connect( const char *wpa2_ssid, wpa2_auth_method_t method, const char *wpa2_identity = NULL, const char *wpa2_username = NULL, const char *wpa2_password = NULL, const char *ca_pem = NULL, const char *client_crt = NULL, const char *client_key = NULL, int ttls_phase2_type = -1, int32_t channel = 0, const uint8_t *bssid = 0, bool connect = true ); +#endif /* CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT */ bool disconnect(bool eraseap = false, unsigned long timeout = 0); bool reconnect(); bool erase(); @@ -109,6 +111,7 @@ class WiFiSTAClass { public: STAClass STA; +#if CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT wl_status_t begin( const char *wpa2_ssid, wpa2_auth_method_t method, const char *wpa2_identity = NULL, const char *wpa2_username = NULL, const char *wpa2_password = NULL, const char *ca_pem = NULL, const char *client_crt = NULL, const char *client_key = NULL, int ttls_phase2_type = -1, int32_t channel = 0, @@ -124,6 +127,8 @@ class WiFiSTAClass { ttls_phase2_type, channel, bssid, connect ); } +#endif /* CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT */ + wl_status_t begin(const char *ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t *bssid = NULL, bool connect = true); wl_status_t begin(const String &ssid, const String &passphrase = (const char *)NULL, int32_t channel = 0, const uint8_t *bssid = NULL, bool connect = true) { return begin(ssid.c_str(), passphrase.c_str(), channel, bssid, connect); From 442679d22563f4071d0152114c0ba83fabd74744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Wed, 20 Nov 2024 09:47:27 +0100 Subject: [PATCH 009/183] fix(Zigbee): Add missing direction to report commands (#10623) * fix(Zigbee): Add missing direction to report commands * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- libraries/Zigbee/src/ZigbeeEP.cpp | 1 + libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index abb5c5ce3dc..cd77b99996b 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -104,6 +104,7 @@ void ZigbeeEP::reportBatteryPercentage() { esp_zb_zcl_report_attr_cmd_t report_attr_cmd; report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_POWER_CONFIG; report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp index f7004d5ab92..718c892f638 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp @@ -80,6 +80,7 @@ void ZigbeeTempSensor::reportTemperature() { esp_zb_zcl_report_attr_cmd_t report_attr_cmd; report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; @@ -120,6 +121,7 @@ void ZigbeeTempSensor::reportHumidity() { esp_zb_zcl_report_attr_cmd_t report_attr_cmd; report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT; report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; From f0ded24b3f563c18f30521086440d64cec0532aa Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Wed, 20 Nov 2024 05:47:46 -0300 Subject: [PATCH 010/183] OTA Library adjust (#10627) * feat(ota): library revision * feat(ota): license * feat(ota): license addtion * feat(ota): license addition into example --- .../ArduinoOTA/examples/BasicOTA/BasicOTA.ino | 14 +++++++++++ libraries/ArduinoOTA/keywords.txt | 23 ++++++++++++++++++- libraries/ArduinoOTA/src/ArduinoOTA.cpp | 14 +++++++++++ libraries/ArduinoOTA/src/ArduinoOTA.h | 14 +++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) diff --git a/libraries/ArduinoOTA/examples/BasicOTA/BasicOTA.ino b/libraries/ArduinoOTA/examples/BasicOTA/BasicOTA.ino index cac1e4f4bdc..b3b01be61cd 100644 --- a/libraries/ArduinoOTA/examples/BasicOTA/BasicOTA.ino +++ b/libraries/ArduinoOTA/examples/BasicOTA/BasicOTA.ino @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #include #include #include diff --git a/libraries/ArduinoOTA/keywords.txt b/libraries/ArduinoOTA/keywords.txt index 0f3921b73fc..9774de881ea 100644 --- a/libraries/ArduinoOTA/keywords.txt +++ b/libraries/ArduinoOTA/keywords.txt @@ -7,19 +7,40 @@ ####################################### ArduinoOTA KEYWORD1 +ArduinoOTAClass KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) ####################################### begin KEYWORD2 -setup KEYWORD2 +end KEYWORD2 handle KEYWORD2 onStart KEYWORD2 onEnd KEYWORD2 onError KEYWORD2 onProgress KEYWORD2 +setPort KEYWORD2 +setHostname KEYWORD2 +getHostname KEYWORD2 +setPassword KEYWORD2 +setPasswordHash KEYWORD2 +setPartitionLabel KEYWORD2 +getPartitionLabel KEYWORD2 +setRebootOnSuccess KEYWORD2 +setMdnsEnabled KEYWORD2 +getCommand KEYWORD2 +setTimeout KEYWORD2 ####################################### # Constants (LITERAL1) ####################################### + +OTA_IDLE LITERAL1 +OTA_WAITAUTH LITERAL1 +OTA_RUNUPDATE LITERAL1 +OTA_AUTH_ERROR LITERAL1 +OTA_BEGIN_ERROR LITERAL1 +OTA_CONNECT_ERROR LITERAL1 +OTA_RECEIVE_ERROR LITERAL1 +OTA_END_ERROR LITERAL1 diff --git a/libraries/ArduinoOTA/src/ArduinoOTA.cpp b/libraries/ArduinoOTA/src/ArduinoOTA.cpp index 160c55764fe..9dcf93a1d23 100644 --- a/libraries/ArduinoOTA/src/ArduinoOTA.cpp +++ b/libraries/ArduinoOTA/src/ArduinoOTA.cpp @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #ifndef LWIP_OPEN_SRC #define LWIP_OPEN_SRC #endif diff --git a/libraries/ArduinoOTA/src/ArduinoOTA.h b/libraries/ArduinoOTA/src/ArduinoOTA.h index 02960d06f63..7916e3b328d 100644 --- a/libraries/ArduinoOTA/src/ArduinoOTA.h +++ b/libraries/ArduinoOTA/src/ArduinoOTA.h @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #ifndef __ARDUINO_OTA_H #define __ARDUINO_OTA_H From 268b31c3f69d2d60d52002cdcaa8203164b2df73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Wed, 20 Nov 2024 09:51:47 +0100 Subject: [PATCH 011/183] feat(zigbee): Add setLight APIs to manually operate lights (#10626) * feat(zigbee): Add setLight APIs to manually operate lights * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../Zigbee_Color_Dimmable_Light.ino | 6 ++ .../Zigbee_On_Off_Light.ino | 2 + .../src/ep/ZigbeeColorDimmableLight.cpp | 62 +++++++++++++++++++ .../Zigbee/src/ep/ZigbeeColorDimmableLight.h | 22 +++++++ libraries/Zigbee/src/ep/ZigbeeLight.cpp | 13 ++++ libraries/Zigbee/src/ep/ZigbeeLight.h | 9 ++- 6 files changed, 113 insertions(+), 1 deletion(-) diff --git a/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino b/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino index c03d26d3aba..7acf6e362df 100644 --- a/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino +++ b/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino @@ -41,6 +41,10 @@ ZigbeeColorDimmableLight zbColorLight = ZigbeeColorDimmableLight(ZIGBEE_LIGHT_EN /********************* RGB LED functions **************************/ void setRGBLight(bool state, uint8_t red, uint8_t green, uint8_t blue, uint8_t level) { + if (!state) { + rgbLedWrite(LED_PIN, 0, 0, 0); + return; + } float brightness = (float)level / 255; rgbLedWrite(LED_PIN, red * brightness, green * brightness, blue * brightness); } @@ -98,6 +102,8 @@ void loop() { Zigbee.factoryReset(); } } + // Increase blightness by 50 every time the button is pressed + zbColorLight.setLightLevel(zbColorLight.getLightLevel() + 50); } delay(100); } diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino b/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino index 30e3cd2d109..53d43895365 100644 --- a/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino +++ b/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino @@ -81,6 +81,8 @@ void loop() { Zigbee.factoryReset(); } } + // Toggle light by pressing the button + zbLight.setLight(!zbLight.getLightState()); } delay(100); } diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp index 08828f7c280..f034daba54a 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp @@ -47,6 +47,24 @@ void ZigbeeColorDimmableLight::calculateRGB(uint16_t x, uint16_t y, uint8_t &red blue = (uint8_t)(b * (float)255); } +void ZigbeeColorDimmableLight::calculateXY(uint8_t red, uint8_t green, uint8_t blue, uint16_t &x, uint16_t &y) { + // Convert RGB to XYZ + float r = (float)red / 255.0f; + float g = (float)green / 255.0f; + float b = (float)blue / 255.0f; + + float X, Y, Z; + RGB_TO_XYZ(r, g, b, X, Y, Z); + + // Convert XYZ to xy chromaticity coordinates + float color_x = X / (X + Y + Z); + float color_y = Y / (X + Y + Z); + + // Convert normalized xy to 16-bit values + x = (uint16_t)(color_x * 65535.0f); + y = (uint16_t)(color_y * 65535.0f); +} + //set attribute method -> method overridden in child class void ZigbeeColorDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) { //check the data and call right method @@ -109,4 +127,48 @@ void ZigbeeColorDimmableLight::lightChanged() { } } +void ZigbeeColorDimmableLight::setLight(bool state, uint8_t level, uint8_t red, uint8_t green, uint8_t blue) { + //Update all attributes + _current_state = state; + _current_level = level; + _current_red = red; + _current_green = green; + _current_blue = blue; + lightChanged(); + + log_v("Updating on/off light state to %d", state); + /* Update light clusters */ + esp_zb_lock_acquire(portMAX_DELAY); + //set on/off state + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_ON_OFF, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID, &_current_state, false + ); + //set level + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_LEVEL_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_LEVEL_CONTROL_CURRENT_LEVEL_ID, &_current_level, false + ); + //set color + uint16_t color_x, color_y; + calculateXY(red, green, blue, color_x, color_y); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_X_ID, &color_x, false + ); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_Y_ID, &color_y, false + ); + esp_zb_lock_release(); +} + +void ZigbeeColorDimmableLight::setLightState(bool state) { + setLight(state, _current_level, _current_red, _current_green, _current_blue); +} + +void ZigbeeColorDimmableLight::setLightLevel(uint8_t level) { + setLight(_current_state, level, _current_red, _current_green, _current_blue); +} + +void ZigbeeColorDimmableLight::setLightColor(uint8_t red, uint8_t green, uint8_t blue) { + setLight(_current_state, _current_level, red, green, blue); +} + #endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h index 1edb6b5468c..9fa59dcfffc 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h @@ -21,9 +21,31 @@ class ZigbeeColorDimmableLight : public ZigbeeEP { lightChanged(); } + void setLightState(bool state); + void setLightLevel(uint8_t level); + void setLightColor(uint8_t red, uint8_t green, uint8_t blue); + void setLight(bool state, uint8_t level, uint8_t red, uint8_t green, uint8_t blue); + + bool getLightState() { + return _current_state; + } + uint8_t getLightLevel() { + return _current_level; + } + uint8_t getLightRed() { + return _current_red; + } + uint8_t getLightGreen() { + return _current_green; + } + uint8_t getLightBlue() { + return _current_blue; + } + private: void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override; void calculateRGB(uint16_t x, uint16_t y, uint8_t &red, uint8_t &green, uint8_t &blue); + void calculateXY(uint8_t red, uint8_t green, uint8_t blue, uint16_t &x, uint16_t &y); uint16_t getCurrentColorX(); uint16_t getCurrentColorY(); diff --git a/libraries/Zigbee/src/ep/ZigbeeLight.cpp b/libraries/Zigbee/src/ep/ZigbeeLight.cpp index 6b602db35c1..100efe34a86 100644 --- a/libraries/Zigbee/src/ep/ZigbeeLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeLight.cpp @@ -33,4 +33,17 @@ void ZigbeeLight::lightChanged() { } } +void ZigbeeLight::setLight(bool state) { + _current_state = state; + lightChanged(); + + log_v("Updating on/off light state to %d", state); + /* Update on/off light state */ + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_ON_OFF, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID, &_current_state, false + ); + esp_zb_lock_release(); +} + #endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeLight.h b/libraries/Zigbee/src/ep/ZigbeeLight.h index 1f57bbf66e5..9b8fc409d4a 100644 --- a/libraries/Zigbee/src/ep/ZigbeeLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeLight.h @@ -14,13 +14,20 @@ class ZigbeeLight : public ZigbeeEP { ZigbeeLight(uint8_t endpoint); ~ZigbeeLight(); - // Use tp set a cb function to be called on light change + // Use to set a cb function to be called on light change void onLightChange(void (*callback)(bool)) { _on_light_change = callback; } + // Use to restore light state void restoreLight() { lightChanged(); } + // Use to control light state + void setLight(bool state); + // Use to get light state + bool getLightState() { + return _current_state; + } private: void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override; From ff613b3f29fd6702709996a702c5868ba93ca478 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 20 Nov 2024 10:10:39 -0300 Subject: [PATCH 012/183] ci(uart): Disable UART test for P4 until it is fixed in Wokwi --- tests/validation/uart/ci.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/validation/uart/ci.json b/tests/validation/uart/ci.json index 54da33b6176..dc24acbaee2 100644 --- a/tests/validation/uart/ci.json +++ b/tests/validation/uart/ci.json @@ -1,5 +1,8 @@ { "platforms": { "qemu": false + }, + "targets": { + "esp32p4": false } } From 6bc3ce68febf553be3d569923870f44dedf66f9d Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Wed, 20 Nov 2024 17:02:34 -0300 Subject: [PATCH 013/183] feat(matter): New Matter Endpoint (#10628) * feat(matter): add new endpoint - color temperature light --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- CMakeLists.txt | 2 + .../MatterDimmableLight.ino | 4 +- .../MatterOnOffLight/MatterOnOffLight.ino | 2 +- .../Matter_CW_WW_Light/Matter_CW_WW_Light.ino | 196 ++++++++++++++ .../examples/Matter_CW_WW_Light/ci.json | 7 + libraries/Matter/keywords.txt | 21 ++ libraries/Matter/src/Matter.h | 3 + .../MatterColorTemperatureLight.cpp | 245 ++++++++++++++++++ .../MatterColorTemperatureLight.h | 94 +++++++ .../MatterEndpoints/MatterDimmableLight.cpp | 6 + .../src/MatterEndpoints/MatterDimmableLight.h | 4 +- .../Matter/src/MatterUtil/ColorFormat.cpp | 203 +++++++++++++++ libraries/Matter/src/MatterUtil/ColorFormat.h | 47 ++++ 13 files changed, 829 insertions(+), 5 deletions(-) create mode 100644 libraries/Matter/examples/Matter_CW_WW_Light/Matter_CW_WW_Light.ino create mode 100644 libraries/Matter/examples/Matter_CW_WW_Light/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h create mode 100644 libraries/Matter/src/MatterUtil/ColorFormat.cpp create mode 100644 libraries/Matter/src/MatterUtil/ColorFormat.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ba41d9ae962..9ccfecc2dac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -169,6 +169,8 @@ set(ARDUINO_LIBRARY_OpenThread_SRCS set(ARDUINO_LIBRARY_Matter_SRCS libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp + libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp + libraries/Matter/src/MatterUtil/ColorFormat.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index 5fd3152dacf..cac511926aa 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -23,8 +23,8 @@ MatterDimmableLight DimmableLight; // it will keep last OnOff & Brightness state stored, using Preferences Preferences matterPref; -const char *onOffPrefKey = "OnOffState"; -const char *brightnessPrefKey = "BrightnessState"; +const char *onOffPrefKey = "OnOff"; +const char *brightnessPrefKey = "Brightness"; // set your board RGB LED pin here #ifdef RGB_BUILTIN diff --git a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino index 8f4276643e2..0bdd0eb19b7 100644 --- a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino +++ b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino @@ -23,7 +23,7 @@ MatterOnOffLight OnOffLight; // it will keep last OnOff state stored, using Preferences Preferences matterPref; -const char *onOffPrefKey = "OnOffState"; +const char *onOffPrefKey = "OnOff"; // set your board LED pin here #ifdef LED_BUILTIN diff --git a/libraries/Matter/examples/Matter_CW_WW_Light/Matter_CW_WW_Light.ino b/libraries/Matter/examples/Matter_CW_WW_Light/Matter_CW_WW_Light.ino new file mode 100644 index 00000000000..39392d90225 --- /dev/null +++ b/libraries/Matter/examples/Matter_CW_WW_Light/Matter_CW_WW_Light.ino @@ -0,0 +1,196 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Matter Manager +#include +#include +#include + +// List of Matter Endpoints for this Node +// Color Temperature CW/WW Light Endpoint +MatterColorTemperatureLight CW_WW_Light; + +// it will keep last OnOff & Brightness state stored, using Preferences +Preferences matterPref; +const char *onOffPrefKey = "OnOff"; +const char *brightnessPrefKey = "Brightness"; +const char *temperaturePrefKey = "Temperature"; + +// set your board RGB LED pin here +#ifdef RGB_BUILTIN +const uint8_t ledPin = RGB_BUILTIN; +#else +const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN +#warning "Do not forget to set the RGB LED pin" +#endif + +// set your board USER BUTTON pin here +const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9. + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Set the RGB LED Light based on the current state of the Color Temperature Light +bool setLightState(bool state, uint8_t brightness, uint16_t temperature_Mireds) { + + if (state) { +#ifdef RGB_BUILTIN + CtColor_t ct = {temperature_Mireds}; + RgbColor_t rgb_ct = CTToRgb(ct); + // simple intensity correction + float brightnessPercent = (float)brightness / MatterColorTemperatureLight::MAX_BRIGHTNESS; + rgb_ct.r = brightnessPercent * rgb_ct.r; + rgb_ct.g = brightnessPercent * rgb_ct.g; + rgb_ct.b = brightnessPercent * rgb_ct.b; + // set the RGB LED + rgbLedWrite(ledPin, rgb_ct.r, rgb_ct.g, rgb_ct.b); +#else + // No Color RGB LED, just use the brightness to control the LED + analogWrite(ledPin, brightness); +#endif + } else { + digitalWrite(ledPin, LOW); + } + // store last Brightness and OnOff state for when the Light is restarted / power goes off + matterPref.putUChar(brightnessPrefKey, brightness); + matterPref.putBool(onOffPrefKey, state); + matterPref.putUShort(temperaturePrefKey, temperature_Mireds); + // This callback must return the success state to Matter core + return true; +} + +void setup() { + // Initialize the USER BUTTON (Boot button) GPIO that will act as a toggle switch + pinMode(buttonPin, INPUT_PULLUP); + // Initialize the LED (light) GPIO and Matter End Point + pinMode(ledPin, OUTPUT); + + Serial.begin(115200); + while (!Serial) { + delay(100); + } + + // We start by connecting to a WiFi network + Serial.print("Connecting to "); + Serial.println(ssid); + // enable IPv6 + WiFi.enableIPv6(true); + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println("\r\nWiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + delay(500); + + // Initialize Matter EndPoint + matterPref.begin("MatterPrefs", false); + // default OnOff state is ON if not stored before + bool lastOnOffState = matterPref.getBool(onOffPrefKey, true); + // default brightness ~= 6% (15/255) + uint8_t lastBrightness = matterPref.getUChar(brightnessPrefKey, 15); + // default temperature ~= 454 Mireds (Warm White) + uint16_t lastTemperature = matterPref.getUShort(temperaturePrefKey, MatterColorTemperatureLight::WARM_WHITE_COLOR_TEMPERATURE); + CW_WW_Light.begin(lastOnOffState, lastBrightness, lastTemperature); + // set the callback function to handle the Light state change + CW_WW_Light.onChange(setLightState); + + // lambda functions are used to set the attribute change callbacks + CW_WW_Light.onChangeOnOff([](bool state) { + Serial.printf("Light OnOff changed to %s\r\n", state ? "ON" : "OFF"); + return true; + }); + CW_WW_Light.onChangeBrightness([](uint8_t level) { + Serial.printf("Light Brightness changed to %d\r\n", level); + return true; + }); + CW_WW_Light.onChangeColorTemperature([](uint16_t temperature) { + Serial.printf("Light Color Temperature changed to %d\r\n", temperature); + return true; + }); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + // This may be a restart of a already commissioned Matter accessory + if (Matter.isDeviceCommissioned()) { + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.printf( + "Initial state: %s | brightness: %d | Color Temperature: %d mireds \r\n", CW_WW_Light ? "ON" : "OFF", CW_WW_Light.getBrightness(), + CW_WW_Light.getColorTemperature() + ); + // configure the Light based on initial on-off state and brightness + CW_WW_Light.updateAccessory(); + } +} +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the light + +void loop() { + // Check Matter Light Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Light Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.printf( + "Initial state: %s | brightness: %d | Color Temperature: %d mireds \r\n", CW_WW_Light ? "ON" : "OFF", CW_WW_Light.getBrightness(), + CW_WW_Light.getColorTemperature() + ); + // configure the Light based on initial on-off state and brightness + CW_WW_Light.updateAccessory(); + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } + + // A button is also used to control the light + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + // Onboard User Button is used as a Light toggle switch or to decommission it + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > debouceTime && digitalRead(buttonPin) == HIGH) { + button_state = false; // released + // Toggle button is released - toggle the light + Serial.println("User button released. Toggling Light!"); + CW_WW_Light.toggle(); // Matter Controller also can see the change + + // Factory reset is triggered if the button is pressed longer than 10 seconds + if (time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + CW_WW_Light = false; // turn the light off + Matter.decommission(); + } + } +} diff --git a/libraries/Matter/examples/Matter_CW_WW_Light/ci.json b/libraries/Matter/examples/Matter_CW_WW_Light/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/Matter_CW_WW_Light/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index 98abce410b1..bcc99253e72 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -10,7 +10,12 @@ Matter KEYWORD1 ArduinoMatter KEYWORD1 MatterOnOffLight KEYWORD1 MatterDimmableLight KEYWORD1 +MatterColorTemperatureLight KEYWORD1 MatterEndPoint KEYWORD1 +CtColor_t KEYWORD1 +XyColor_t KEYWORD1 +HsvColor_t KEYWORD1 +RgbColor_t KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -30,12 +35,28 @@ setOnOff KEYWORD2 getOnOff KEYWORD2 setBrightness KEYWORD2 getBrightness KEYWORD2 +setColorTemperature KEYWORD2 +getColorTemperature KEYWORD2 toggle KEYWORD2 updateAccessory KEYWORD2 onChange KEYWORD2 onChangeOnOff KEYWORD2 onChangeBrightness KEYWORD2 +onChangeColorTemperature KEYWORD2 +XYToRgb KEYWORD2 +HsvToRgb KEYWORD2 +CTToRgb KEYWORD2 +RgbToHsv KEYWORD2 ####################################### # Constants (LITERAL1) ####################################### + +MAX_BRIGHTNESS LITERAL1 +MAX_COLOR_TEMPERATURE LITERAL1 +MIN_COLOR_TEMPERATURE LITERAL1 +COOL_WHITE_COLOR_TEMPERATURE LITERAL1 +DAYLIGHT_WHITE_COLOR_TEMPERATURE LITERAL1 +WHITE_COLOR_TEMPERATURE LITERAL1 +SOFT_WHITE_COLOR_TEMPERATURE LITERAL1 +WARM_WHITE_COLOR_TEMPERATURE LITERAL1 diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index f88b7788016..e9d8b715388 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -18,8 +18,10 @@ #include #include +#include #include #include +#include using namespace esp_matter; @@ -47,6 +49,7 @@ class ArduinoMatter { // list of Matter EndPoints Friend Classes friend class MatterOnOffLight; friend class MatterDimmableLight; + friend class MatterColorTemperatureLight; protected: static void _init(); diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp new file mode 100644 index 00000000000..7bbcb83dcfe --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp @@ -0,0 +1,245 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +bool MatterColorTemperatureLight::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { + bool ret = true; + if (!started) { + log_e("Matter CW_WW Light device has not begun."); + return false; + } + + log_d("CW_WW Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); + + if (endpoint_id == getEndPointId()) { + switch (cluster_id) { + case OnOff::Id: + if (attribute_id == OnOff::Attributes::OnOff::Id) { + log_d("CW_WW Light On/Off State changed to %d", val->val.b); + if (_onChangeOnOffCB != NULL) { + ret &= _onChangeOnOffCB(val->val.b); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(val->val.b, brightnessLevel, colorTemperatureLevel); + } + if (ret == true) { + onOffState = val->val.b; + } + } + break; + case LevelControl::Id: + if (attribute_id == LevelControl::Attributes::CurrentLevel::Id) { + log_d("CW_WW Light Brightness changed to %d", val->val.u8); + if (_onChangeBrightnessCB != NULL) { + ret &= _onChangeBrightnessCB(val->val.u8); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(onOffState, val->val.u8, colorTemperatureLevel); + } + if (ret == true) { + brightnessLevel = val->val.u8; + } + } + break; + case ColorControl::Id: + if (attribute_id == ColorControl::Attributes::ColorTemperatureMireds::Id) { + log_d("CW_WW Light Temperature changed to %d", val->val.u16); + if (_onChangeTemperatureCB != NULL) { + ret &= _onChangeTemperatureCB(val->val.u16); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(onOffState, brightnessLevel, val->val.u16); + } + if (ret == true) { + colorTemperatureLevel = val->val.u16; + } + } + break; + } + } + return ret; +} + +MatterColorTemperatureLight::MatterColorTemperatureLight() {} + +MatterColorTemperatureLight::~MatterColorTemperatureLight() { + end(); +} + +bool MatterColorTemperatureLight::begin(bool initialState, uint8_t brightness, uint16_t ColorTemperature) { + ArduinoMatter::_init(); + color_temperature_light::config_t light_config; + + light_config.on_off.on_off = initialState; + light_config.on_off.lighting.start_up_on_off = nullptr; + onOffState = initialState; + + light_config.level_control.current_level = brightness; + light_config.level_control.lighting.start_up_current_level = nullptr; + brightnessLevel = brightness; + + light_config.color_control.color_mode = (uint8_t)ColorControl::ColorMode::kColorTemperature; + light_config.color_control.enhanced_color_mode = (uint8_t)ColorControl::ColorMode::kColorTemperature; + light_config.color_control.color_temperature.color_temperature_mireds = ColorTemperature; + light_config.color_control.color_temperature.startup_color_temperature_mireds = nullptr; + colorTemperatureLevel = ColorTemperature; + + // endpoint handles can be used to add/modify clusters. + endpoint_t *endpoint = color_temperature_light::create(node::get(), &light_config, ENDPOINT_FLAG_NONE, (void *)this); + if (endpoint == nullptr) { + log_e("Failed to create CW_WW light endpoint"); + return false; + } + + setEndPointId(endpoint::get_id(endpoint)); + log_i("CW_WW Light created with endpoint_id %d", getEndPointId()); + + /* Mark deferred persistence for some attributes that might be changed rapidly */ + cluster_t *level_control_cluster = cluster::get(endpoint, LevelControl::Id); + attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id); + attribute::set_deferred_persistence(current_level_attribute); + + cluster_t *color_control_cluster = cluster::get(endpoint, ColorControl::Id); + attribute_t *color_temp_attribute = attribute::get(color_control_cluster, ColorControl::Attributes::ColorTemperatureMireds::Id); + attribute::set_deferred_persistence(color_temp_attribute); + + started = true; + return true; +} + +void MatterColorTemperatureLight::end() { + started = false; +} + +bool MatterColorTemperatureLight::setOnOff(bool newState) { + if (!started) { + log_e("Matter CW_WW Light device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (onOffState == newState) { + return true; + } + + onOffState = newState; + + endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); + cluster_t *cluster = cluster::get(endpoint, OnOff::Id); + attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id); + + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + + if (val.val.b != onOffState) { + val.val.b = onOffState; + attribute::update(endpoint_id, OnOff::Id, OnOff::Attributes::OnOff::Id, &val); + } + return true; +} + +void MatterColorTemperatureLight::updateAccessory() { + if (_onChangeCB != NULL) { + _onChangeCB(onOffState, brightnessLevel, colorTemperatureLevel); + } +} + +bool MatterColorTemperatureLight::getOnOff() { + return onOffState; +} + +bool MatterColorTemperatureLight::toggle() { + return setOnOff(!onOffState); +} + +bool MatterColorTemperatureLight::setBrightness(uint8_t newBrightness) { + if (!started) { + log_w("Matter CW_WW Light device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (brightnessLevel == newBrightness) { + return true; + } + + brightnessLevel = newBrightness; + + endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); + cluster_t *cluster = cluster::get(endpoint, LevelControl::Id); + attribute_t *attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id); + + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + + if (val.val.u8 != brightnessLevel) { + val.val.u8 = brightnessLevel; + attribute::update(endpoint_id, LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, &val); + } + return true; +} + +uint8_t MatterColorTemperatureLight::getBrightness() { + return brightnessLevel; +} + +bool MatterColorTemperatureLight::setColorTemperature(uint16_t newTemperature) { + if (!started) { + log_w("Matter CW_WW Light device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (colorTemperatureLevel == newTemperature) { + return true; + } + + colorTemperatureLevel = newTemperature; + + endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); + cluster_t *cluster = cluster::get(endpoint, ColorControl::Id); + attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::ColorTemperatureMireds::Id); + + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + + if (val.val.u16 != colorTemperatureLevel) { + val.val.u16 = colorTemperatureLevel; + attribute::update(endpoint_id, ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id, &val); + } + return true; +} + +uint16_t MatterColorTemperatureLight::getColorTemperature() { + return colorTemperatureLevel; +} + +MatterColorTemperatureLight::operator bool() { + return getOnOff(); +} + +void MatterColorTemperatureLight::operator=(bool newState) { + setOnOff(newState); +} +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h new file mode 100644 index 00000000000..a37f362f475 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h @@ -0,0 +1,94 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +class MatterColorTemperatureLight : public MatterEndPoint { +public: + static const uint8_t MAX_BRIGHTNESS = 255; + static const uint16_t MAX_COLOR_TEMPERATURE = 500; + static const uint16_t MIN_COLOR_TEMPERATURE = 100; + // main color temperature values + static const uint16_t COOL_WHITE_COLOR_TEMPERATURE = 142; + static const uint16_t DAYLIGHT_WHITE_COLOR_TEMPERATURE = 181; + static const uint16_t WHITE_COLOR_TEMPERATURE = 250; + static const uint16_t SOFT_WHITE_COLOR_TEMPERATURE = 370; + static const uint16_t WARM_WHITE_COLOR_TEMPERATURE = 454; + + MatterColorTemperatureLight(); + ~MatterColorTemperatureLight(); + // default initial state is off, brightness is 64 (25%) and temperature is 370 (Soft White) + virtual bool begin(bool initialState = false, uint8_t brightness = 64, uint16_t colorTemperature = 370); + // this will just stop processing Light Matter events + void end(); + + bool setOnOff(bool newState); // returns true if successful + bool getOnOff(); // returns current light state + bool toggle(); // returns true if successful + + bool setBrightness(uint8_t newBrightness); // returns true if successful + uint8_t getBrightness(); // returns current brightness + + bool setColorTemperature(uint16_t newTemperature); // returns true if successful + uint16_t getColorTemperature(); // returns current temperature + + // used to update the state of the light using the current Matter Light internal state + // It is necessary to set a user callback function using onChange() to handle the physical light state + void updateAccessory(); + + operator bool(); // returns current on/off light state + void operator=(bool state); // turns light on or off + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + + // User Callback for whenever the Light On/Off state is changed by the Matter Controller + using EndPointOnOffCB = std::function; + void onChangeOnOff(EndPointOnOffCB onChangeCB) { + _onChangeOnOffCB = onChangeCB; + } + // User Callback for whenever the Light brightness value [0..255] is changed by the Matter Controller + using EndPointBrightnessCB = std::function; + void onChangeBrightness(EndPointBrightnessCB onChangeCB) { + _onChangeBrightnessCB = onChangeCB; + } + + // User Callbqck for whenever the Light temperature value is changed by the Matter Controller + using EndPointTemperatureCB = std::function; + void onChangeColorTemperature(EndPointTemperatureCB onChangeCB) { + _onChangeTemperatureCB = onChangeCB; + } + + // User Callback for whenever any parameter is changed by the Matter Controller + using EndPointCB = std::function; + void onChange(EndPointCB onChangeCB) { + _onChangeCB = onChangeCB; + } + +protected: + bool started = false; + bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) + uint8_t brightnessLevel = 0; // default initial brightness is 0, but it can be changed by begin(bool, uint8_t) + uint16_t colorTemperatureLevel = 0; // default initial color temperature is 0, but it can be changed by begin(bool, uint8_t, uint16_t) + EndPointOnOffCB _onChangeOnOffCB = NULL; + EndPointBrightnessCB _onChangeBrightnessCB = NULL; + EndPointTemperatureCB _onChangeTemperatureCB = NULL; + EndPointCB _onChangeCB = NULL; +}; +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp index 7907ae3a90a..c3991e0c0f3 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp @@ -94,6 +94,12 @@ bool MatterDimmableLight::begin(bool initialState, uint8_t brightness) { setEndPointId(endpoint::get_id(endpoint)); log_i("Dimmable Light created with endpoint_id %d", getEndPointId()); + + /* Mark deferred persistence for some attributes that might be changed rapidly */ + cluster_t *level_control_cluster = cluster::get(endpoint, LevelControl::Id); + attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id); + attribute::set_deferred_persistence(current_level_attribute); + started = true; return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h index fbfccde6105..aacce883277 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h @@ -25,8 +25,8 @@ class MatterDimmableLight : public MatterEndPoint { MatterDimmableLight(); ~MatterDimmableLight(); - // default initial state is off and brightness is 0 - virtual bool begin(bool initialState = false, uint8_t brightness = 0); + // default initial state is off and brightness is 64 (25%) + virtual bool begin(bool initialState = false, uint8_t brightness = 64); // this will just stop processing Light Matter events void end(); diff --git a/libraries/Matter/src/MatterUtil/ColorFormat.cpp b/libraries/Matter/src/MatterUtil/ColorFormat.cpp new file mode 100644 index 00000000000..41d845dcdb9 --- /dev/null +++ b/libraries/Matter/src/MatterUtil/ColorFormat.cpp @@ -0,0 +1,203 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ColorFormat.h" + +#include + +// define a clamp macro to substitute the std::clamp macro which is available from C++17 onwards +#define clamp(a, min, max) ((a) < (min) ? (min) : ((a) > (max) ? (max) : (a))) + +RgbColor_t HsvToRgb(HsvColor_t hsv) { + RgbColor_t rgb; + + uint16_t i = hsv.h / 60; + uint16_t rgb_max = hsv.v; + uint16_t rgb_min = (uint16_t)(rgb_max * (100 - hsv.s)) / 100; + uint16_t diff = hsv.h % 60; + uint16_t rgb_adj = (uint16_t)((rgb_max - rgb_min) * diff) / 60; + + switch (i) { + case 0: + rgb.r = (uint8_t)rgb_max; + rgb.g = (uint8_t)(rgb_min + rgb_adj); + rgb.b = (uint8_t)rgb_min; + break; + case 1: + rgb.r = (uint8_t)(rgb_max - rgb_adj); + rgb.g = (uint8_t)rgb_max; + rgb.b = (uint8_t)rgb_min; + break; + case 2: + rgb.r = (uint8_t)rgb_min; + rgb.g = (uint8_t)rgb_max; + rgb.b = (uint8_t)(rgb_min + rgb_adj); + break; + case 3: + rgb.r = (uint8_t)rgb_min; + rgb.g = (uint8_t)(rgb_max - rgb_adj); + rgb.b = (uint8_t)rgb_max; + break; + case 4: + rgb.r = (uint8_t)(rgb_min + rgb_adj); + rgb.g = (uint8_t)rgb_min; + rgb.b = (uint8_t)rgb_max; + break; + default: + rgb.r = (uint8_t)rgb_max; + rgb.g = (uint8_t)rgb_min; + rgb.b = (uint8_t)(rgb_max - rgb_adj); + break; + } + + return rgb; +} + +HsvColor_t RgbToHsv(RgbColor_t rgb) { + HsvColor_t hsv; + + uint16_t rgb_max = rgb.r > rgb.g ? (rgb.r > rgb.b ? rgb.r : rgb.b) : (rgb.g > rgb.b ? rgb.g : rgb.b); + uint16_t rgb_min = rgb.r < rgb.g ? (rgb.r < rgb.b ? rgb.r : rgb.b) : (rgb.g < rgb.b ? rgb.g : rgb.b); + uint16_t diff = rgb_max - rgb_min; + + if (diff == 0) { + hsv.h = 0; + } else if (rgb_max == rgb.r) { + hsv.h = (uint8_t)(60 * ((rgb.g - rgb.b) * 100) / diff); + } else if (rgb_max == rgb.g) { + hsv.h = (uint8_t)(60 * (((rgb.b - rgb.r) * 100) / diff + 2 * 100)); + } else { + hsv.h = (uint8_t)(60 * (((rgb.r - rgb.g) * 100) / diff + 4 * 100)); + } + + if (rgb_max == 0) { + hsv.s = 0; + } else { + hsv.s = (uint8_t)((diff * 100) / rgb_max); + } + + hsv.v = (uint8_t)rgb_max; + if (hsv.h < 0) { + hsv.h += 360; + } + + return hsv; +} + +RgbColor_t XYToRgb(uint8_t Level, uint16_t current_X, uint16_t current_Y) { + // convert xyY color space to RGB + + // https://www.easyrgb.com/en/math.php + // https://en.wikipedia.org/wiki/SRGB + // refer https://en.wikipedia.org/wiki/CIE_1931_color_space#CIE_xy_chromaticity_diagram_and_the_CIE_xyY_color_space + + // The current_X/current_Y attribute contains the current value of the normalized chromaticity value of x/y. + // The value of x/y shall be related to the current_X/current_Y attribute by the relationship + // x = current_X/65536 + // y = current_Y/65536 + // z = 1-x-y + + RgbColor_t rgb; + + float x, y, z; + float X, Y, Z; + float r, g, b; + + x = ((float)current_X) / 65535.0f; + y = ((float)current_Y) / 65535.0f; + + z = 1.0f - x - y; + + // Calculate XYZ values + + // Y - given brightness in 0 - 1 range + Y = ((float)Level) / 254.0f; + X = (Y / y) * x; + Z = (Y / y) * z; + + // X, Y and Z input refer to a D65/2° standard illuminant. + // sR, sG and sB (standard RGB) output range = 0 ÷ 255 + // convert XYZ to RGB - CIE XYZ to sRGB + X = X / 100.0f; + Y = Y / 100.0f; + Z = Z / 100.0f; + + r = (X * 3.2406f) - (Y * 1.5372f) - (Z * 0.4986f); + g = -(X * 0.9689f) + (Y * 1.8758f) + (Z * 0.0415f); + b = (X * 0.0557f) - (Y * 0.2040f) + (Z * 1.0570f); + + // apply gamma 2.2 correction + r = (r <= 0.0031308f ? 12.92f * r : (1.055f) * pow(r, (1.0f / 2.4f)) - 0.055f); + g = (g <= 0.0031308f ? 12.92f * g : (1.055f) * pow(g, (1.0f / 2.4f)) - 0.055f); + b = (b <= 0.0031308f ? 12.92f * b : (1.055f) * pow(b, (1.0f / 2.4f)) - 0.055f); + + // Round off + r = clamp(r, 0, 1); + g = clamp(g, 0, 1); + b = clamp(b, 0, 1); + + // these rgb values are in the range of 0 to 1, convert to limit of HW specific LED + rgb.r = (uint8_t)(r * 255); + rgb.g = (uint8_t)(g * 255); + rgb.b = (uint8_t)(b * 255); + + return rgb; +} + +RgbColor_t CTToRgb(CtColor_t ct) { + RgbColor_t rgb = {0, 0, 0}; + float r, g, b; + + if (ct.ctMireds == 0) { + return rgb; + } + // Algorithm credits to Tanner Helland: https://tannerhelland.com/2012/09/18/convert-temperature-rgb-algorithm-code.html + + // Convert Mireds to centiKelvins. k = 1,000,000/mired + float ctCentiKelvin = 10000 / ct.ctMireds; + + // Red + if (ctCentiKelvin <= 66) { + r = 255; + } else { + r = 329.698727446f * pow(ctCentiKelvin - 60, -0.1332047592f); + } + + // Green + if (ctCentiKelvin <= 66) { + g = 99.4708025861f * log(ctCentiKelvin) - 161.1195681661f; + } else { + g = 288.1221695283f * pow(ctCentiKelvin - 60, -0.0755148492f); + } + + // Blue + if (ctCentiKelvin >= 66) { + b = 255; + } else { + if (ctCentiKelvin <= 19) { + b = 0; + } else { + b = 138.5177312231 * log(ctCentiKelvin - 10) - 305.0447927307; + } + } + rgb.r = (uint8_t)clamp(r, 0, 255); + rgb.g = (uint8_t)clamp(g, 0, 255); + rgb.b = (uint8_t)clamp(b, 0, 255); + + return rgb; +} diff --git a/libraries/Matter/src/MatterUtil/ColorFormat.h b/libraries/Matter/src/MatterUtil/ColorFormat.h new file mode 100644 index 00000000000..254a51c7144 --- /dev/null +++ b/libraries/Matter/src/MatterUtil/ColorFormat.h @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +struct RgbColor_t { + uint8_t r; + uint8_t g; + uint8_t b; +}; + +struct HsvColor_t { + int16_t h; + uint8_t s; + uint8_t v; +}; + +struct XyColor_t { + uint16_t x; + uint16_t y; +}; + +struct CtColor_t { + uint16_t ctMireds; +}; + +RgbColor_t XYToRgb(uint8_t Level, uint16_t current_X, uint16_t current_Y); +RgbColor_t HsvToRgb(HsvColor_t hsv); +RgbColor_t CTToRgb(CtColor_t ct); +HsvColor_t RgbToHsv(RgbColor_t rgb); From 3dd4b0d112c16311c39efc10e8eda9f63e513775 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Fri, 22 Nov 2024 11:57:08 -0300 Subject: [PATCH 014/183] feat(openthread): add license declaration to all soure code and examples (#10631) --- .../examples/COAP/coap_lamp/coap_lamp.ino | 14 ++++++++++++++ .../examples/COAP/coap_switch/coap_switch.ino | 14 ++++++++++++++ .../OpenThread/examples/SimpleCLI/SimpleCLI.ino | 14 ++++++++++++++ .../OpenThread/examples/SimpleNode/SimpleNode.ino | 14 ++++++++++++++ .../ExtendedRouterNode/ExtendedRouterNode.ino | 14 ++++++++++++++ .../SimpleThreadNetwork/LeaderNode/LeaderNode.ino | 14 ++++++++++++++ .../SimpleThreadNetwork/RouterNode/RouterNode.ino | 14 ++++++++++++++ .../OpenThread/examples/ThreadScan/ThreadScan.ino | 14 ++++++++++++++ .../OpenThread/examples/onReceive/onReceive.ino | 14 ++++++++++++++ libraries/OpenThread/src/OThreadCLI.cpp | 14 ++++++++++++++ libraries/OpenThread/src/OThreadCLI.h | 14 ++++++++++++++ libraries/OpenThread/src/OThreadCLI_Util.cpp | 14 ++++++++++++++ libraries/OpenThread/src/OThreadCLI_Util.h | 14 ++++++++++++++ 13 files changed, 182 insertions(+) diff --git a/libraries/OpenThread/examples/COAP/coap_lamp/coap_lamp.ino b/libraries/OpenThread/examples/COAP/coap_lamp/coap_lamp.ino index 9b53373f702..51483bb4c7c 100644 --- a/libraries/OpenThread/examples/COAP/coap_lamp/coap_lamp.ino +++ b/libraries/OpenThread/examples/COAP/coap_lamp/coap_lamp.ino @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #include "OThreadCLI.h" #include "OThreadCLI_Util.h" diff --git a/libraries/OpenThread/examples/COAP/coap_switch/coap_switch.ino b/libraries/OpenThread/examples/COAP/coap_switch/coap_switch.ino index 1d42930389b..aac5db0bc82 100644 --- a/libraries/OpenThread/examples/COAP/coap_switch/coap_switch.ino +++ b/libraries/OpenThread/examples/COAP/coap_switch/coap_switch.ino @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #include "OThreadCLI.h" #include "OThreadCLI_Util.h" diff --git a/libraries/OpenThread/examples/SimpleCLI/SimpleCLI.ino b/libraries/OpenThread/examples/SimpleCLI/SimpleCLI.ino index db9dc910e94..feef800c0fa 100644 --- a/libraries/OpenThread/examples/SimpleCLI/SimpleCLI.ino +++ b/libraries/OpenThread/examples/SimpleCLI/SimpleCLI.ino @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + /* * OpenThread.begin(false) will not automatically start a node in a Thread Network * The user will need to start it manually using the OpenThread CLI commands diff --git a/libraries/OpenThread/examples/SimpleNode/SimpleNode.ino b/libraries/OpenThread/examples/SimpleNode/SimpleNode.ino index b7f48c82b5d..95bf7a2401a 100644 --- a/libraries/OpenThread/examples/SimpleNode/SimpleNode.ino +++ b/libraries/OpenThread/examples/SimpleNode/SimpleNode.ino @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + /* * OpenThread.begin() will automatically start a node in a Thread Network * If NVS is empty, default configuration will be as follow: diff --git a/libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino b/libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino index 249ba2a3fe0..4fc8a921584 100644 --- a/libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino +++ b/libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #include "OThreadCLI.h" #include "OThreadCLI_Util.h" diff --git a/libraries/OpenThread/examples/SimpleThreadNetwork/LeaderNode/LeaderNode.ino b/libraries/OpenThread/examples/SimpleThreadNetwork/LeaderNode/LeaderNode.ino index e2342426a7a..7b709717692 100644 --- a/libraries/OpenThread/examples/SimpleThreadNetwork/LeaderNode/LeaderNode.ino +++ b/libraries/OpenThread/examples/SimpleThreadNetwork/LeaderNode/LeaderNode.ino @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + /* OpenThread.begin(false) will not automatically start a node in a Thread Network A Leader node is the first device, that has a complete dataset, to start Thread diff --git a/libraries/OpenThread/examples/SimpleThreadNetwork/RouterNode/RouterNode.ino b/libraries/OpenThread/examples/SimpleThreadNetwork/RouterNode/RouterNode.ino index 8ec01344d7a..45475fa0c6a 100644 --- a/libraries/OpenThread/examples/SimpleThreadNetwork/RouterNode/RouterNode.ino +++ b/libraries/OpenThread/examples/SimpleThreadNetwork/RouterNode/RouterNode.ino @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + /* OpenThread.begin(false) will not automatically start a node in a Thread Network A Router/Child node is the device that will join an existing Thread Network diff --git a/libraries/OpenThread/examples/ThreadScan/ThreadScan.ino b/libraries/OpenThread/examples/ThreadScan/ThreadScan.ino index f2a5711a4ea..9d0074bb180 100644 --- a/libraries/OpenThread/examples/ThreadScan/ThreadScan.ino +++ b/libraries/OpenThread/examples/ThreadScan/ThreadScan.ino @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + /* OpenThread.begin(true) will automatically start a node in a Thread Network Full scanning requires the thread node to be at least in Child state. diff --git a/libraries/OpenThread/examples/onReceive/onReceive.ino b/libraries/OpenThread/examples/onReceive/onReceive.ino index 24a9e0ccc23..b37c2fc7931 100644 --- a/libraries/OpenThread/examples/onReceive/onReceive.ino +++ b/libraries/OpenThread/examples/onReceive/onReceive.ino @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + /* OpenThread.begin() will automatically start a node in a Thread Network This will demonstrate how to capture the CLI response in a callback function diff --git a/libraries/OpenThread/src/OThreadCLI.cpp b/libraries/OpenThread/src/OThreadCLI.cpp index 9190f09bc6b..85ba03563e8 100644 --- a/libraries/OpenThread/src/OThreadCLI.cpp +++ b/libraries/OpenThread/src/OThreadCLI.cpp @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #include "OThreadCLI.h" #if SOC_IEEE802154_SUPPORTED #if CONFIG_OPENTHREAD_ENABLED diff --git a/libraries/OpenThread/src/OThreadCLI.h b/libraries/OpenThread/src/OThreadCLI.h index 689b4a5672b..bc8dc5d2b19 100644 --- a/libraries/OpenThread/src/OThreadCLI.h +++ b/libraries/OpenThread/src/OThreadCLI.h @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #pragma once #include "soc/soc_caps.h" #include "sdkconfig.h" diff --git a/libraries/OpenThread/src/OThreadCLI_Util.cpp b/libraries/OpenThread/src/OThreadCLI_Util.cpp index d1b7f27a36f..d21daa1effc 100644 --- a/libraries/OpenThread/src/OThreadCLI_Util.cpp +++ b/libraries/OpenThread/src/OThreadCLI_Util.cpp @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #include "OThreadCLI.h" #if SOC_IEEE802154_SUPPORTED #if CONFIG_OPENTHREAD_ENABLED diff --git a/libraries/OpenThread/src/OThreadCLI_Util.h b/libraries/OpenThread/src/OThreadCLI_Util.h index 5484776889d..1ab2e061dfc 100644 --- a/libraries/OpenThread/src/OThreadCLI_Util.h +++ b/libraries/OpenThread/src/OThreadCLI_Util.h @@ -1,3 +1,17 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #pragma once #include "soc/soc_caps.h" #include "sdkconfig.h" From 962ab3aceaca593586031bf28bbe0e7467ecbe0f Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Sun, 24 Nov 2024 19:09:46 -0300 Subject: [PATCH 015/183] Adds a Minimum Code Matter Example (#10639) * feat(matter): add a new example for a minimum matter device --------- --- .../examples/MatterMinimum/MatterMinimum.ino | 81 +++++++++++++++++++ .../Matter/examples/MatterMinimum/ci.json | 7 ++ 2 files changed, 88 insertions(+) create mode 100644 libraries/Matter/examples/MatterMinimum/MatterMinimum.ino create mode 100644 libraries/Matter/examples/MatterMinimum/ci.json diff --git a/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino b/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino new file mode 100644 index 00000000000..719c91db23b --- /dev/null +++ b/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino @@ -0,0 +1,81 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + * This example is the smallest code that will create a Matter Device which can be + * commissioned and controlled from a Matter Environment APP. + * It controls a GPIO that could be attached to a LED for visualization. + * Additionally the ESP32 will send debug messages indicating the Matter activity. + * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. + */ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Single On/Off Light Endpoint - at least one per node +MatterOnOffLight OnOffLight; + +// Light GPIO that can be controlled by Matter APP +#ifdef LED_BUILTIN +const uint8_t ledPin = LED_BUILTIN; +#else +const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN +#endif + +// Matter Protocol Endpoint (On/OFF Light) Callback +bool matterCB(bool state) { + digitalWrite(ledPin, state ? HIGH : LOW); + // This callback must return the success state to Matter core + return true; +} + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +void setup() { + // Initialize the LED GPIO + pinMode(ledPin, OUTPUT); + + WiFi.enableIPv6(true); + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + } + + // Initialize at least one Matter EndPoint + OnOffLight.begin(); + + // Associate a callback to the Matter Controller + OnOffLight.onChange(matterCB); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + if (!Matter.isDeviceCommissioned()) { + log_i("Matter Node is not commissioned yet."); + log_i("Initiate the device discovery in your Matter environment."); + log_i("Commission it to your Matter hub with the manual pairing code or QR code"); + log_i("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + log_i("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + } +} + +void loop() { + delay(500); +} diff --git a/libraries/Matter/examples/MatterMinimum/ci.json b/libraries/Matter/examples/MatterMinimum/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterMinimum/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} From 6e57662599366fd8104ffaf040edb9816078e703 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 25 Nov 2024 10:49:24 +0100 Subject: [PATCH 016/183] fix compile of P4 caused from missing ")" in debug macro (#10638) --- cores/esp32/esp32-hal-cpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-cpu.c b/cores/esp32/esp32-hal-cpu.c index 40e2cf0fdf0..e9baf3613c2 100644 --- a/cores/esp32/esp32-hal-cpu.c +++ b/cores/esp32/esp32-hal-cpu.c @@ -267,7 +267,7 @@ bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) { : ((conf.source == SOC_CPU_CLK_SRC_APLL) ? "APLL" : ((conf.source == SOC_CPU_CLK_SRC_XTAL) ? "XTAL" #ifdef CONFIG_IDF_TARGET_ESP32P4 - : "17.5M"), + : "17.5M")), #else : "8M")), #endif From 1712fb5eeee9069ad4e016c5fd6659b28ca397b0 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 25 Nov 2024 07:17:38 -0300 Subject: [PATCH 017/183] fix(network): Avoid returning zero if connection is not dropped (#10640) Co-authored-by: NPaolini <75562717+NPaolini@users.noreply.github.com> --- libraries/Network/src/NetworkClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Network/src/NetworkClient.cpp b/libraries/Network/src/NetworkClient.cpp index 0782b74f2a9..067d288bf93 100644 --- a/libraries/Network/src/NetworkClient.cpp +++ b/libraries/Network/src/NetworkClient.cpp @@ -549,7 +549,7 @@ uint8_t NetworkClient::connected() { } if (_connected) { uint8_t dummy; - int res = recv(fd(), &dummy, 0, MSG_DONTWAIT); + int res = recv(fd(), &dummy, 1, MSG_DONTWAIT | MSG_PEEK); // avoid unused var warning by gcc (void)res; // recv only sets errno if res is <= 0 From 9417a84918ff096eb9da41e993f27a905b574876 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 25 Nov 2024 08:13:01 -0300 Subject: [PATCH 018/183] feat(uart): [IDF 5.3] fixes HardwareSerial::updateBaudRate() using a baud rate higher 230400 - checks UART Clock Source (#10643) * fix(uart): fixes issue with update baudrate higher than 250000 * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- cores/esp32/esp32-hal-uart.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index 706124c7451..34a2660e3a3 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -33,7 +33,8 @@ #include "hal/gpio_hal.h" #include "esp_rom_gpio.h" -static int s_uart_debug_nr = 0; // UART number for debug output +static int s_uart_debug_nr = 0; // UART number for debug output +#define REF_TICK_BAUDRATE_LIMIT 250000 // this is maximum UART badrate using REF_TICK as clock struct uart_struct_t { @@ -522,7 +523,7 @@ uart_t *uartBegin( #if SOC_UART_SUPPORT_XTAL_CLK uart_config.source_clk = UART_SCLK_XTAL; // valid for C2, S3, C3, C6, H2 and P4 #elif SOC_UART_SUPPORT_REF_TICK - if (baudrate <= 250000) { + if (baudrate <= REF_TICK_BAUDRATE_LIMIT) { uart_config.source_clk = UART_SCLK_REF_TICK; // valid for ESP32, S2 - MAX supported baud rate is 250 Kbps } else { uart_config.source_clk = UART_SCLK_APB; // baudrate may change with the APB Frequency! @@ -804,6 +805,10 @@ void uartSetBaudRate(uart_t *uart, uint32_t baud_rate) { return; } UART_MUTEX_LOCK(); +#if !SOC_UART_SUPPORT_XTAL_CLK + soc_module_clk_t newClkSrc = baud_rate <= REF_TICK_BAUDRATE_LIMIT ? SOC_MOD_CLK_REF_TICK : SOC_MOD_CLK_APB; + uart_ll_set_sclk(UART_LL_GET_HW(uart->num), newClkSrc); +#endif if (uart_set_baudrate(uart->num, baud_rate) == ESP_OK) { uart->_baudrate = baud_rate; } else { From 1730e4e57e73a35abd11bd3b79b36c0b1fb91579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Mon, 25 Nov 2024 12:13:28 +0100 Subject: [PATCH 019/183] fix(zigbee): Add connected(), minor fixes, example update (#10636) * fix(zigbee): Add connected and minor fixes, example update * fix(example): Use correct API call for connected * fix(zigbee): Increase timeout and add semaphore to begin * feat(zigbee): Add option to select debug libs for zigbee * fix(example): fix warning by double percentage symbol * fix(example): Fix serial prints for Windows os Co-authored-by: Rodrigo Garcia * ci(pre-commit): Apply automatic fixes * fix(example): Fix precommit spelling --------- Co-authored-by: Rodrigo Garcia Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- boards.txt | 19 ++++++- .../Zigbee_Color_Dimmable_Light.ino | 25 +++++++-- .../Zigbee_Color_Dimmer_Switch.ino | 9 ++- .../Zigbee_On_Off_Light.ino | 22 ++++++-- .../Zigbee_On_Off_Switch.ino | 17 +++--- .../Zigbee_Scan_Networks.ino | 15 +++-- .../Zigbee_Temp_Hum_Sensor_Sleepy.ino | 28 +++++++--- .../Zigbee_Temperature_Sensor.ino | 24 ++++++-- .../Zigbee_Thermostat/Zigbee_Thermostat.ino | 15 +++-- libraries/Zigbee/keywords.txt | 55 ++++++++++++------- libraries/Zigbee/src/ZigbeeCore.cpp | 38 ++++++++++--- libraries/Zigbee/src/ZigbeeCore.h | 7 ++- libraries/Zigbee/src/ZigbeeEP.cpp | 2 - libraries/Zigbee/src/ZigbeeEP.h | 2 +- .../Zigbee/src/ep/ZigbeeColorDimmerSwitch.h | 8 --- 15 files changed, 198 insertions(+), 88 deletions(-) diff --git a/boards.txt b/boards.txt index e0523a326fe..92d6ae599c2 100644 --- a/boards.txt +++ b/boards.txt @@ -531,7 +531,15 @@ esp32h2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_co esp32h2.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) esp32h2.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP esp32h2.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port - +esp32h2.menu.ZigbeeMode.ed_debug=Zigbee ED (end device) - Debug +esp32h2.menu.ZigbeeMode.ed_debug.build.zigbee_mode=-DZIGBEE_MODE_ED +esp32h2.menu.ZigbeeMode.ed_debug.build.zigbee_libs=-lesp_zb_api_ed.debug -lesp_zb_cli_command -lzboss_stack.ed.debug -lzboss_port.debug +esp32h2.menu.ZigbeeMode.zczr_debug=Zigbee ZCZR (coordinator/router) - Debug +esp32h2.menu.ZigbeeMode.zczr_debug.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +esp32h2.menu.ZigbeeMode.zczr_debug.build.zigbee_libs=-lesp_zb_api_zczr.debug -lesp_zb_cli_command -lzboss_stack.zczr.debug -lzboss_port.debug +esp32h2.menu.ZigbeeMode.rcp_debug=Zigbee RCP (radio co-processor) - Debug +esp32h2.menu.ZigbeeMode.rcp_debug.build.zigbee_mode=-DZIGBEE_MODE_RCP +esp32h2.menu.ZigbeeMode.rcp_debug.build.zigbee_libs=-lesp_zb_api_rcp.debug -lesp_zb_cli_command -lzboss_stack.rcp.debug -lzboss_port.debug ############################################################## @@ -723,6 +731,15 @@ esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_co esp32c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) esp32c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +esp32c6.menu.ZigbeeMode.ed_debug=Zigbee ED (end device) - Debug +esp32c6.menu.ZigbeeMode.ed_debug.build.zigbee_mode=-DZIGBEE_MODE_ED +esp32c6.menu.ZigbeeMode.ed_debug.build.zigbee_libs=-lesp_zb_api_ed.debug -lesp_zb_cli_command -lzboss_stack.ed.debug -lzboss_port.debug +esp32c6.menu.ZigbeeMode.zczr_debug=Zigbee ZCZR (coordinator/router) - Debug +esp32c6.menu.ZigbeeMode.zczr_debug.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +esp32c6.menu.ZigbeeMode.zczr_debug.build.zigbee_libs=-lesp_zb_api_zczr.debug -lesp_zb_cli_command -lzboss_stack.zczr.debug -lzboss_port.debug +esp32c6.menu.ZigbeeMode.rcp_debug=Zigbee RCP (radio co-processor) - Debug +esp32c6.menu.ZigbeeMode.rcp_debug.build.zigbee_mode=-DZIGBEE_MODE_RCP +esp32c6.menu.ZigbeeMode.rcp_debug.build.zigbee_libs=-lesp_zb_api_rcp.debug -lesp_zb_cli_command -lzboss_stack.rcp.debug -lzboss_port.debug ############################################################## diff --git a/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino b/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino index 7acf6e362df..7ff7a020632 100644 --- a/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino +++ b/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino @@ -64,6 +64,11 @@ void identify(uint16_t time) { /********************* Arduino functions **************************/ void setup() { + Serial.begin(115200); + while (!Serial) { + delay(10); + } + // Init RMT and leave light OFF rgbLedWrite(LED_PIN, 0, 0, 0); @@ -80,12 +85,21 @@ void setup() { zbColorLight.setManufacturerAndModel("Espressif", "ZBColorLightBulb"); // Add endpoint to Zigbee Core - log_d("Adding ZigbeeLight endpoint to Zigbee Core"); + Serial.println("Adding ZigbeeLight endpoint to Zigbee Core"); Zigbee.addEndpoint(&zbColorLight); - // When all EPs are registered, start Zigbee. By default acts as ZIGBEE_END_DEVICE - log_d("Calling Zigbee.begin()"); - Zigbee.begin(); + // When all EPs are registered, start Zigbee in End Device mode + if (!Zigbee.begin()) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) { + Serial.print("."); + delay(100); + } + Serial.println(); } void loop() { @@ -98,7 +112,8 @@ void loop() { delay(50); if ((millis() - startTime) > 3000) { // If key pressed for more than 3secs, factory reset Zigbee and reboot - Serial.printf("Resetting Zigbee to factory settings, reboot.\n"); + Serial.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); Zigbee.factoryReset(); } } diff --git a/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino b/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino index 6d6c7b163dd..00e3cd170ef 100644 --- a/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino +++ b/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino @@ -46,7 +46,6 @@ ZigbeeColorDimmerSwitch zbSwitch = ZigbeeColorDimmerSwitch(SWITCH_ENDPOINT_NUMBE /********************* Arduino functions **************************/ void setup() { - Serial.begin(115200); while (!Serial) { delay(10); @@ -68,11 +67,15 @@ void setup() { Zigbee.setRebootOpenNetwork(180); //When all EPs are registered, start Zigbee with ZIGBEE_COORDINATOR mode - Zigbee.begin(ZIGBEE_COORDINATOR); + if (!Zigbee.begin(ZIGBEE_COORDINATOR)) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } Serial.println("Waiting for Light to bound to the switch"); //Wait for switch to bound to a light: - while (!zbSwitch.isBound()) { + while (!zbSwitch.bound()) { Serial.printf("."); delay(500); } diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino b/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino index 53d43895365..92c59044cae 100644 --- a/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino +++ b/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino @@ -45,6 +45,10 @@ void setLED(bool value) { /********************* Arduino functions **************************/ void setup() { + Serial.begin(115200); + while (!Serial) { + delay(10); + } // Init LED and turn it OFF (if LED_PIN == RGB_BUILTIN, the rgbLedWrite() will be used under the hood) pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, LOW); @@ -59,12 +63,21 @@ void setup() { zbLight.onLightChange(setLED); //Add endpoint to Zigbee Core - log_d("Adding ZigbeeLight endpoint to Zigbee Core"); + Serial.println("Adding ZigbeeLight endpoint to Zigbee Core"); Zigbee.addEndpoint(&zbLight); // When all EPs are registered, start Zigbee. By default acts as ZIGBEE_END_DEVICE - log_d("Calling Zigbee.begin()"); - Zigbee.begin(); + if (!Zigbee.begin()) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) { + Serial.print("."); + delay(100); + } + Serial.println(); } void loop() { @@ -77,7 +90,8 @@ void loop() { delay(50); if ((millis() - startTime) > 3000) { // If key pressed for more than 3secs, factory reset Zigbee and reboot - Serial.printf("Resetting Zigbee to factory settings, reboot.\n"); + Serial.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); Zigbee.factoryReset(); } } diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino b/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino index 69cf6654a41..e38734a052a 100644 --- a/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino +++ b/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino @@ -70,6 +70,7 @@ ZigbeeSwitch zbSwitch = ZigbeeSwitch(SWITCH_ENDPOINT_NUMBER); static void onZbButton(SwitchData *button_func_pair) { if (button_func_pair->func == SWITCH_ONOFF_TOGGLE_CONTROL) { // Send toggle command to the light + Serial.println("Toggling light"); zbSwitch.lightToggle(); } } @@ -93,7 +94,6 @@ static void enableGpioInterrupt(bool enabled) { /********************* Arduino functions **************************/ void setup() { - Serial.begin(115200); while (!Serial) { delay(10); @@ -106,7 +106,7 @@ void setup() { zbSwitch.allowMultipleBinding(true); //Add endpoint to Zigbee Core - log_d("Adding ZigbeeSwitch endpoint to Zigbee Core"); + Serial.println("Adding ZigbeeSwitch endpoint to Zigbee Core"); Zigbee.addEndpoint(&zbSwitch); //Open network for 180 seconds after boot @@ -118,19 +118,22 @@ void setup() { /* create a queue to handle gpio event from isr */ gpio_evt_queue = xQueueCreate(10, sizeof(SwitchData)); if (gpio_evt_queue == 0) { - log_e("Queue was not created and must not be used"); - while (1); + Serial.println("Queue creating failed, rebooting..."); + ESP.restart(); } attachInterruptArg(buttonFunctionPair[i].pin, onGpioInterrupt, (void *)(buttonFunctionPair + i), FALLING); } // When all EPs are registered, start Zigbee with ZIGBEE_COORDINATOR mode - log_d("Calling Zigbee.begin()"); - Zigbee.begin(ZIGBEE_COORDINATOR); + if (!Zigbee.begin(ZIGBEE_COORDINATOR)) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } Serial.println("Waiting for Light to bound to the switch"); //Wait for switch to bound to a light: - while (!zbSwitch.isBound()) { + while (!zbSwitch.bound()) { Serial.printf("."); delay(500); } diff --git a/libraries/Zigbee/examples/Zigbee_Scan_Networks/Zigbee_Scan_Networks.ino b/libraries/Zigbee/examples/Zigbee_Scan_Networks/Zigbee_Scan_Networks.ino index 7d59fb2907d..c3a74e0aee5 100644 --- a/libraries/Zigbee/examples/Zigbee_Scan_Networks/Zigbee_Scan_Networks.ino +++ b/libraries/Zigbee/examples/Zigbee_Scan_Networks/Zigbee_Scan_Networks.ino @@ -32,7 +32,7 @@ #include "Zigbee.h" #ifdef ZIGBEE_MODE_ZCZR -zigbee_role_t role = ZIGBEE_ROUTER; // or can be ZIGBEE_COORDINATOR, but it wont scan itself +zigbee_role_t role = ZIGBEE_ROUTER; // or can be ZIGBEE_COORDINATOR, but it won't scan itself #else zigbee_role_t role = ZIGBEE_END_DEVICE; #endif @@ -81,14 +81,13 @@ void setup() { } // Initialize Zigbee stack without any EPs just for scanning - Zigbee.begin(role); - - // Waint until Zigbee stack is ready - while (!Zigbee.isStarted()) { - delay(100); + if (!Zigbee.begin(role)) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); } - Serial.println("Setup done"); + Serial.println("Setup done, starting Zigbee network scan..."); // Start Zigbee Network Scan with default parameters (all channels, scan time 5) Zigbee.scanNetworks(); } @@ -98,7 +97,7 @@ void loop() { int16_t ZigbeeScanStatus = Zigbee.scanComplete(); if (ZigbeeScanStatus < 0) { // it is busy scanning or got an error if (ZigbeeScanStatus == ZB_SCAN_FAILED) { - Serial.println("WiFi Scan has failed. Starting again."); + Serial.println("Zigbee scan has failed. Starting again."); Zigbee.scanNetworks(); } // other option is status ZB_SCAN_RUNNING - just wait. diff --git a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino index 530995a8427..e13e6a877a6 100644 --- a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino +++ b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino @@ -27,7 +27,7 @@ */ #ifndef ZIGBEE_MODE_ED -#error "Zigbee coordinator mode is not selected in Tools->Zigbee mode" +#error "Zigbee end device mode is not selected in Tools->Zigbee mode" #endif #include "Zigbee.h" @@ -56,14 +56,19 @@ void meausureAndSleep() { zbTempSensor.reportTemperature(); zbTempSensor.reportHumidity(); - log_d("Temperature: %.2f°C, Humidity: %.2f%", temperature, humidity); + Serial.printf("Reported temperature: %.2f°C, Humidity: %.2f%%\r\n", temperature, humidity); // Put device to deep sleep + Serial.println("Going to sleep now"); esp_deep_sleep_start(); } /********************* Arduino functions **************************/ void setup() { + Serial.begin(115200); + while (!Serial) { + delay(10); + } // Init button switch pinMode(BUTTON_PIN, INPUT_PULLUP); @@ -94,14 +99,20 @@ void setup() { zigbeeConfig.nwk_cfg.zed_cfg.keep_alive = 10000; // When all EPs are registered, start Zigbee in End Device mode - Zigbee.begin(&zigbeeConfig, false); - - // Wait for Zigbee to start - while (!Zigbee.isStarted()) { + if (!Zigbee.begin(&zigbeeConfig, false)) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) { + Serial.print("."); delay(100); } + Serial.println(); + Serial.println("Successfully connected to Zigbee network"); - // Delay 5s to allow establishing connection with coordinator, needed for sleepy devices + // Delay 5s (may be adjusted) to allow establishing proper connection with coordinator, needed for sleepy devices delay(5000); } @@ -115,7 +126,8 @@ void loop() { delay(50); if ((millis() - startTime) > 3000) { // If key pressed for more than 3secs, factory reset Zigbee and reboot - Zigbee.factoryReset(); + Serial.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); } } } diff --git a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino index c5ca00decd6..255b074265e 100644 --- a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino @@ -27,7 +27,7 @@ */ #ifndef ZIGBEE_MODE_ED -#error "Zigbee coordinator mode is not selected in Tools->Zigbee mode" +#error "Zigbee end device mode is not selected in Tools->Zigbee mode" #endif #include "Zigbee.h" @@ -42,7 +42,7 @@ static void temp_sensor_value_update(void *arg) { for (;;) { // Read temperature sensor value float tsens_value = temperatureRead(); - log_v("Temperature sensor value: %.2f°C", tsens_value); + Serial.printf("Updated temperature sensor value to %.2f°C\r\n", tsens_value); // Update temperature value in Temperature sensor EP zbTempSensor.setTemperature(tsens_value); delay(1000); @@ -51,12 +51,10 @@ static void temp_sensor_value_update(void *arg) { /********************* Arduino functions **************************/ void setup() { - Serial.begin(115200); while (!Serial) { delay(10); } - // Init button switch pinMode(BUTTON_PIN, INPUT_PULLUP); @@ -72,8 +70,21 @@ void setup() { // Add endpoint to Zigbee Core Zigbee.addEndpoint(&zbTempSensor); + Serial.println("Starting Zigbee..."); // When all EPs are registered, start Zigbee in End Device mode - Zigbee.begin(); + if (!Zigbee.begin()) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } else { + Serial.println("Zigbee started successfully!"); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) { + Serial.print("."); + delay(100); + } + Serial.println(); // Start Temperature sensor reading task xTaskCreate(temp_sensor_value_update, "temp_sensor_update", 2048, NULL, 10, NULL); @@ -96,7 +107,8 @@ void loop() { delay(50); if ((millis() - startTime) > 3000) { // If key pressed for more than 3secs, factory reset Zigbee and reboot - Serial.printf("Resetting Zigbee to factory settings, reboot.\n"); + Serial.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); Zigbee.factoryReset(); } } diff --git a/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino b/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino index 565d9e64919..df02f891794 100644 --- a/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino +++ b/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino @@ -80,19 +80,22 @@ void setup() { Zigbee.setRebootOpenNetwork(180); // When all EPs are registered, start Zigbee with ZIGBEE_COORDINATOR mode - Zigbee.begin(ZIGBEE_COORDINATOR); - - Serial.println("Waiting for Temperature sensor to bound to the switch"); + if (!Zigbee.begin(ZIGBEE_COORDINATOR)) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } - //Wait for switch to bound to a light: - while (!zbThermostat.isBound()) { + Serial.println("Waiting for Temperature sensor to bound to the thermostat"); + while (!zbThermostat.bound()) { Serial.printf("."); delay(500); } + Serial.println(); + // Get temperature sensor configuration zbThermostat.getSensorSettings(); - Serial.println(); } void loop() { diff --git a/libraries/Zigbee/keywords.txt b/libraries/Zigbee/keywords.txt index 53ce5fffe2a..1a8b7ae85ba 100644 --- a/libraries/Zigbee/keywords.txt +++ b/libraries/Zigbee/keywords.txt @@ -30,14 +30,18 @@ zigbee_scan_result_t KEYWORD1 ####################################### # ZigbeeCore -isStarted KEYWORD2 +begin KEYWORD2 +started KEYWORD2 +connected KEYWORD2 +getRole KEYWORD2 addEndpoint KEYWORD2 setRadioConfig KEYWORD2 -setHostConfig KEYWORD2 getRadioConfig KEYWORD2 +setHostConfig KEYWORD2 getHostConfig KEYWORD2 setPrimaryChannelMask KEYWORD2 setRebootOpenNetwork KEYWORD2 +openNetwork KEYWORD2 scanNetworks KEYWORD2 scanComplete KEYWORD2 getScanResult KEYWORD2 @@ -45,21 +49,33 @@ scanDelete KEYWORD2 factoryReset KEYWORD2 # Common ZigbeeEP +setEpConfig KEYWORD2 setVersion KEYWORD2 -setManufacturerAndModel KEYWORD2 -is_bound KEYWORD2 +getEndpoint KEYWORD2 printBoundDevices KEYWORD2 +getBoundDevices KEYWORD2 +bound KEYWORD2 allowMultipleBinding KEYWORD2 +setManufacturerAndModel KEYWORD2 +setPowerSource KEYWORD2 +setBatteryPercentage KEYWORD2 +reportBatteryPercentage KEYWORD2 +readManufacturer KEYWORD2 +readModel KEYWORD2 +onIdentify KEYWORD2 # ZigbeeLight + ZigbeeColorDimmableLight -setOnOff KEYWORD2 -sceneControl KEYWORD2 -setOnOffTime KEYWORD2 -setOffWaitTime KEYWORD2 -setLevel KEYWORD2 -setColor KEYWORD2 -setColorSaturation KEYWORD2 -setColorHue KEYWORD2 +onLightChange KEYWORD2 +restoreLight KEYWORD2 +setLight KEYWORD2 +setLightState KEYWORD2 +setLightLevel KEYWORD2 +setLightColor KEYWORD2 +getLightState KEYWORD2 +getLightLevel KEYWORD2 +getLightRed KEYWORD2 +getLightGreen KEYWORD2 +getLightBlue KEYWORD2 # ZigbeeSwitch + ZigbeeColorDimmerSwitch lightToggle KEYWORD2 @@ -70,22 +86,23 @@ lightOnWithTimedOff KEYWORD2 lightOnWithSceneRecall KEYWORD2 setLightLevel KEYWORD2 setLightColor KEYWORD2 -setLightColorSaturation KEYWORD2 -setLightColorHue KEYWORD2 -# ZigbeeTempSensor +# ZigbeeTempSensor + humidity setTemperature KEYWORD2 setMinMaxValue KEYWORD2 setTolerance KEYWORD2 setReporting KEYWORD2 reportTemperature KEYWORD2 +addHumiditySensor KEYWORD2 +setHumidity KEYWORD2 +setHumidityReporting KEYWORD2 +reportHumidity KEYWORD2 # ZigbeeThermostat -temperatureRead KEYWORD2 -temperatureMin KEYWORD2 -temperatureMax KEYWORD2 -temperatureTolerance KEYWORD2 +onTempRecieve KEYWORD2 +onConfigRecieve KEYWORD2 getTemperature KEYWORD2 +getSensorSettings KEYWORD2 setTemperatureReporting KEYWORD2 ####################################### diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index dd84e2a63e4..38ef9b169d5 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -6,6 +6,8 @@ #include "ZigbeeHandlers.cpp" #include "Arduino.h" +#define ZB_INIT_TIMEOUT 10000 // 10 seconds + extern "C" void zb_set_ed_node_descriptor(bool power_src, bool rx_on_when_idle, bool alloc_addr); static bool edBatteryPowered = false; @@ -17,6 +19,13 @@ ZigbeeCore::ZigbeeCore() { _open_network = 0; _scan_status = ZB_SCAN_FAILED; _started = false; + _connected = false; + if (!lock) { + lock = xSemaphoreCreateBinary(); + if (lock == NULL) { + log_e("Semaphore creation failed"); + } + } } ZigbeeCore::~ZigbeeCore() {} @@ -25,10 +34,14 @@ static esp_err_t zb_action_handler(esp_zb_core_action_callback_id_t callback_id, bool ZigbeeCore::begin(esp_zb_cfg_t *role_cfg, bool erase_nvs) { if (!zigbeeInit(role_cfg, erase_nvs)) { + log_e("ZigbeeCore begin failed"); return false; } _role = (zigbee_role_t)role_cfg->esp_zb_role; - return true; + if (xSemaphoreTake(lock, ZB_INIT_TIMEOUT) != pdTRUE) { + log_e("ZigbeeCore begin timeout"); + } + return started(); } bool ZigbeeCore::begin(zigbee_role_t role, bool erase_nvs) { @@ -57,7 +70,10 @@ bool ZigbeeCore::begin(zigbee_role_t role, bool erase_nvs) { } default: log_e("Invalid Zigbee Role"); return false; } - return status; + if (!status || xSemaphoreTake(lock, ZB_INIT_TIMEOUT) != pdTRUE) { + log_e("ZigbeeCore begin failed or timeout"); + } + return started(); } void ZigbeeCore::addEndpoint(ZigbeeEP *ep) { @@ -167,7 +183,7 @@ void ZigbeeCore::setRebootOpenNetwork(uint8_t time) { } void ZigbeeCore::openNetwork(uint8_t time) { - if (isStarted()) { + if (started()) { log_v("Opening network for joining for %d seconds", time); esp_zb_bdb_open_network(time); } @@ -203,21 +219,24 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { } else { log_i("Start network steering"); esp_zb_bdb_start_top_level_commissioning(ESP_ZB_BDB_MODE_NETWORK_STEERING); + Zigbee._started = true; + xSemaphoreGive(Zigbee.lock); } - //----------------- - } else { log_i("Device rebooted"); Zigbee._started = true; + xSemaphoreGive(Zigbee.lock); if ((zigbee_role_t)Zigbee.getRole() == ZIGBEE_COORDINATOR && Zigbee._open_network > 0) { log_i("Opening network for joining for %d seconds", Zigbee._open_network); esp_zb_bdb_open_network(Zigbee._open_network); + } else { + Zigbee._connected = true; } } } else { /* commissioning failed */ log_e("Failed to initialize Zigbee stack (status: %s)", esp_err_to_name(err_status)); - esp_restart(); + xSemaphoreGive(Zigbee.lock); } break; case ESP_ZB_BDB_SIGNAL_FORMATION: // Coordinator @@ -243,6 +262,7 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { log_i("Network steering started"); } Zigbee._started = true; + xSemaphoreGive(Zigbee.lock); } else { if (err_status == ESP_OK) { esp_zb_ieee_addr_t extended_pan_id; @@ -252,7 +272,7 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { extended_pan_id[7], extended_pan_id[6], extended_pan_id[5], extended_pan_id[4], extended_pan_id[3], extended_pan_id[2], extended_pan_id[1], extended_pan_id[0], esp_zb_get_pan_id(), esp_zb_get_current_channel(), esp_zb_get_short_address() ); - Zigbee._started = true; + Zigbee._connected = true; } else { log_i("Network steering was not successful (status: %s)", esp_err_to_name(err_status)); esp_zb_scheduler_alarm((esp_zb_callback_t)bdb_start_top_level_commissioning_cb, ESP_ZB_BDB_MODE_NETWORK_STEERING, 1000); @@ -281,7 +301,7 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { // for each endpoint in the list call the findEndpoint function if not bounded or allowed to bind multiple devices for (std::list::iterator it = Zigbee.ep_objects.begin(); it != Zigbee.ep_objects.end(); ++it) { - if (!(*it)->isBound() || (*it)->epAllowMultipleBinding()) { + if (!(*it)->bound() || (*it)->epAllowMultipleBinding()) { (*it)->findEndpoint(&cmd_req); } } @@ -335,7 +355,7 @@ void ZigbeeCore::scanCompleteCallback(esp_zb_zdp_status_t zdo_status, uint8_t co } void ZigbeeCore::scanNetworks(u_int32_t channel_mask, u_int8_t scan_duration) { - if (!isStarted()) { + if (!started()) { log_e("Zigbee stack is not started, cannot scan networks"); return; } diff --git a/libraries/Zigbee/src/ZigbeeCore.h b/libraries/Zigbee/src/ZigbeeCore.h index 08ff059dd51..e068d74430e 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -70,9 +70,11 @@ class ZigbeeCore { esp_zb_ep_list_t *_zb_ep_list; zigbee_role_t _role; bool _started; + bool _connected; uint8_t _open_network; zigbee_scan_result_t *_scan_result; + SemaphoreHandle_t lock; bool zigbeeInit(esp_zb_cfg_t *zb_cfg, bool erase_nvs); static void scanCompleteCallback(esp_zb_zdp_status_t zdo_status, uint8_t count, esp_zb_network_descriptor_t *nwk_descriptor); @@ -88,9 +90,12 @@ class ZigbeeCore { bool begin(esp_zb_cfg_t *role_cfg, bool erase_nvs = false); // bool end(); - bool isStarted() { + bool started() { return _started; } + bool connected() { + return _connected; + } zigbee_role_t getRole() { return _role; } diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index cd77b99996b..0a947d3ab9e 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -19,14 +19,12 @@ ZigbeeEP::ZigbeeEP(uint8_t endpoint) { _ep_config.endpoint = 0; _cluster_list = nullptr; _on_identify = nullptr; -#if !CONFIG_DISABLE_HAL_LOCKS if (!lock) { lock = xSemaphoreCreateBinary(); if (lock == NULL) { log_e("Semaphore creation failed"); } } -#endif } ZigbeeEP::~ZigbeeEP() {} diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index 1c0c2d983ab..21ed7706d31 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -73,7 +73,7 @@ class ZigbeeEP { return _bound_devices; } - static bool isBound() { + static bool bound() { return _is_bound; } static void allowMultipleBinding(bool bind) { diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h index eb854b6c919..9b623d2f8ef 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h @@ -39,14 +39,6 @@ class ZigbeeColorDimmerSwitch : public ZigbeeEP { void setLightColor(uint8_t red, uint8_t green, uint8_t blue, uint16_t group_addr); void setLightColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t endpoint, uint16_t short_addr); - void setLightColorSaturation(uint8_t value); - void setLightColorSaturation(uint8_t value, uint16_t group_addr); - void setLightColorSaturation(uint8_t value, uint8_t endpoint, uint16_t short_addr); - - void setLightColorHue(uint8_t value); - void setLightColorHue(uint8_t value, uint16_t group_addr); - void setLightColorHue(uint8_t value, uint8_t endpoint, uint16_t short_addr); - private: // save instance of the class in order to use it in static functions static ZigbeeColorDimmerSwitch *_instance; From eb1933fde97a8d0c10ff812ad3e9188a5f0d3bad Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 25 Nov 2024 12:15:51 +0100 Subject: [PATCH 020/183] Guard crypto parts in "Update" to save resources (#10630) * guard crypt update * guard update crypt * Update Updater.cpp * revert logic to disable * change disable logic * formatting * formatting * remove trailing space --- libraries/Update/src/Update.h | 20 ++++++++++++++- libraries/Update/src/Updater.cpp | 43 +++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/libraries/Update/src/Update.h b/libraries/Update/src/Update.h index 5832846fd28..9a4d3e02489 100644 --- a/libraries/Update/src/Update.h +++ b/libraries/Update/src/Update.h @@ -63,6 +63,7 @@ class UpdateClass { */ bool begin(size_t size = UPDATE_SIZE_UNKNOWN, int command = U_FLASH, int ledPin = -1, uint8_t ledOn = LOW, const char *label = NULL); +#ifndef UPDATE_NOCRYPT /* Setup decryption configuration Crypt Key is 32bytes(256bits) block of data, use the same key as used to encrypt image file @@ -71,6 +72,7 @@ class UpdateClass { Crypt Mode, used to select if image files should be decrypted or not */ bool setupCrypt(const uint8_t *cryptKey = 0, size_t cryptAddress = 0, uint8_t cryptConfig = 0xf, int cryptMode = U_AES_DECRYPT_AUTO); +#endif /* UPDATE_NOCRYPT */ /* Writes a buffer to the flash and increments the address @@ -99,6 +101,7 @@ class UpdateClass { */ bool end(bool evenIfRemaining = false); +#ifndef UPDATE_NOCRYPT /* sets AES256 key(32 bytes) used for decrypting image file */ @@ -122,6 +125,7 @@ class UpdateClass { void setCryptConfig(const uint8_t cryptConfig) { _cryptCfg = cryptConfig & 0x0f; } +#endif /* UPDATE_NOCRYPT */ /* Aborts the running update @@ -139,7 +143,13 @@ class UpdateClass { sets the expected MD5 for the firmware (hexString) If calc_post_decryption is true, the update library will calculate the MD5 after the decryption, if false the calculation occurs before the decryption */ - bool setMD5(const char *expected_md5, bool calc_post_decryption = true); + bool setMD5( + const char *expected_md5 +#ifndef UPDATE_NOCRYPT + , + bool calc_post_decryption = true +#endif /* #ifdef UPDATE_NOCRYPT */ + ); /* returns the MD5 String of the successfully ended firmware @@ -236,8 +246,10 @@ class UpdateClass { private: void _reset(); void _abort(uint8_t err); +#ifndef UPDATE_NOCRYPT void _cryptKeyTweak(size_t cryptAddress, uint8_t *tweaked_key); bool _decryptBuffer(); +#endif /* UPDATE_NOCRYPT */ bool _writeBuffer(); bool _verifyHeader(uint8_t data); bool _verifyEnd(); @@ -245,8 +257,10 @@ class UpdateClass { bool _chkDataInBlock(const uint8_t *data, size_t len) const; // check if block contains any data or is empty uint8_t _error; +#ifndef UPDATE_NOCRYPT uint8_t *_cryptKey; uint8_t *_cryptBuffer; +#endif /* UPDATE_NOCRYPT */ uint8_t *_buffer; uint8_t *_skipBuffer; size_t _bufferLen; @@ -258,15 +272,19 @@ class UpdateClass { const esp_partition_t *_partition; String _target_md5; +#ifndef UPDATE_NOCRYPT bool _target_md5_decrypted = true; +#endif /* UPDATE_NOCRYPT */ MD5Builder _md5; int _ledPin; uint8_t _ledOn; +#ifndef UPDATE_NOCRYPT uint8_t _cryptMode; size_t _cryptAddress; uint8_t _cryptCfg; +#endif /* UPDATE_NOCRYPT */ }; #if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_UPDATE) diff --git a/libraries/Update/src/Updater.cpp b/libraries/Update/src/Updater.cpp index e92f84d4599..3b0c517431d 100644 --- a/libraries/Update/src/Updater.cpp +++ b/libraries/Update/src/Updater.cpp @@ -9,7 +9,9 @@ #include "spi_flash_mmap.h" #include "esp_ota_ops.h" #include "esp_image_format.h" +#ifndef UPDATE_NOCRYPT #include "mbedtls/aes.h" +#endif /* UPDATE_NOCRYPT */ static const char *_err2str(uint8_t _error) { if (_error == UPDATE_ERROR_OK) { @@ -38,8 +40,10 @@ static const char *_err2str(uint8_t _error) { return ("Bad Argument"); } else if (_error == UPDATE_ERROR_ABORT) { return ("Aborted"); +#ifndef UPDATE_NOCRYPT } else if (_error == UPDATE_ERROR_DECRYPT) { return ("Decryption error"); +#endif /* UPDATE_NOCRYPT */ } return ("UNKNOWN"); } @@ -67,8 +71,17 @@ bool UpdateClass::_enablePartition(const esp_partition_t *partition) { } UpdateClass::UpdateClass() - : _error(0), _cryptKey(0), _cryptBuffer(0), _buffer(0), _skipBuffer(0), _bufferLen(0), _size(0), _progress_callback(NULL), _progress(0), _paroffset(0), - _command(U_FLASH), _partition(NULL), _cryptMode(U_AES_DECRYPT_AUTO), _cryptAddress(0), _cryptCfg(0xf) {} + : _error(0), +#ifndef UPDATE_NOCRYPT + _cryptKey(0), _cryptBuffer(0), +#endif /* UPDATE_NOCRYPT */ + _buffer(0), _skipBuffer(0), _bufferLen(0), _size(0), _progress_callback(NULL), _progress(0), _paroffset(0), _command(U_FLASH), _partition(NULL) +#ifndef UPDATE_NOCRYPT + , + _cryptMode(U_AES_DECRYPT_AUTO), _cryptAddress(0), _cryptCfg(0xf) +#endif /* UPDATE_NOCRYPT */ +{ +} UpdateClass &UpdateClass::onProgress(THandlerFunction_Progress fn) { _progress_callback = fn; @@ -83,7 +96,9 @@ void UpdateClass::_reset() { delete[] _skipBuffer; } +#ifndef UPDATE_NOCRYPT _cryptBuffer = nullptr; +#endif /* UPDATE_NOCRYPT */ _buffer = nullptr; _skipBuffer = nullptr; _bufferLen = 0; @@ -175,6 +190,7 @@ bool UpdateClass::begin(size_t size, int command, int ledPin, uint8_t ledOn, con return true; } +#ifndef UPDATE_NOCRYPT bool UpdateClass::setupCrypt(const uint8_t *cryptKey, size_t cryptAddress, uint8_t cryptConfig, int cryptMode) { if (setCryptKey(cryptKey)) { if (setCryptMode(cryptMode)) { @@ -216,6 +232,7 @@ bool UpdateClass::setCryptMode(const int cryptMode) { } return true; } +#endif /* UPDATE_NOCRYPT */ void UpdateClass::_abort(uint8_t err) { _reset(); @@ -226,6 +243,7 @@ void UpdateClass::abort() { _abort(UPDATE_ERROR_ABORT); } +#ifndef UPDATE_NOCRYPT void UpdateClass::_cryptKeyTweak(size_t cryptAddress, uint8_t *tweaked_key) { memcpy(tweaked_key, _cryptKey, ENCRYPTED_KEY_SIZE); if (_cryptCfg == 0) { @@ -338,8 +356,10 @@ bool UpdateClass::_decryptBuffer() { } return true; } +#endif /* UPDATE_NOCRYPT */ bool UpdateClass::_writeBuffer() { +#ifndef UPDATE_NOCRYPT //first bytes of loading image, check to see if loading image needs decrypting if (!_progress) { _cryptMode &= U_AES_DECRYPT_MODE_MASK; @@ -360,6 +380,7 @@ bool UpdateClass::_writeBuffer() { return false; } } +#endif /* UPDATE_NOCRYPT */ //first bytes of new firmware uint8_t skip = 0; if (!_progress && _command == U_FLASH) { @@ -409,9 +430,13 @@ bool UpdateClass::_writeBuffer() { if (!_progress && _command == U_FLASH) { _buffer[0] = ESP_IMAGE_HEADER_MAGIC; } +#ifndef UPDATE_NOCRYPT if (_target_md5_decrypted) { +#endif /* UPDATE_NOCRYPT */ _md5.add(_buffer, _bufferLen); +#ifndef UPDATE_NOCRYPT } +#endif /* UPDATE_NOCRYPT */ _progress += _bufferLen; _bufferLen = 0; if (_progress_callback) { @@ -453,13 +478,21 @@ bool UpdateClass::_verifyEnd() { return false; } -bool UpdateClass::setMD5(const char *expected_md5, bool calc_post_decryption) { +bool UpdateClass::setMD5( + const char *expected_md5 +#ifndef UPDATE_NOCRYPT + , + bool calc_post_decryption +#endif /* UPDATE_NOCRYPT */ +) { if (strlen(expected_md5) != 32) { return false; } _target_md5 = expected_md5; _target_md5.toLowerCase(); +#ifndef UPDATE_NOCRYPT _target_md5_decrypted = calc_post_decryption; +#endif /* UPDATE_NOCRYPT */ return true; } @@ -532,12 +565,16 @@ size_t UpdateClass::writeStream(Stream &data) { return 0; } +#ifndef UPDATE_NOCRYPT if (_command == U_FLASH && !_cryptMode) { +#endif /* UPDATE_NOCRYPT */ if (!_verifyHeader(data.peek())) { _reset(); return 0; } +#ifndef UPDATE_NOCRYPT } +#endif /* UPDATE_NOCRYPT */ if (_ledPin != -1) { pinMode(_ledPin, OUTPUT); From 4fc8abfafe3b960535449311d3392e68c92a8d51 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 25 Nov 2024 09:04:20 -0300 Subject: [PATCH 021/183] AsyncUdp license and keyword update (#10637) * feat(asyncudp): add all current keywords to the list * feat(asyncudp): add license information to the source code * feat(asyncudp): add license information to the source code * feat(asyncudp): add license information to the source code * feat(asyncudp): add license information to the source code * feat(asyncudp): add license information to the source code * feat(asyncudp): revert license information to the source code * feat(asyncudp): revert license information to the source code * feat(asyncudp): revert license information to the source code * feat(asyncudp): revert license information to the source code * feat(asyncudp): revert license information to the source code * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- libraries/AsyncUDP/keywords.txt | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/libraries/AsyncUDP/keywords.txt b/libraries/AsyncUDP/keywords.txt index 67c0b97a715..1401ea66c72 100644 --- a/libraries/AsyncUDP/keywords.txt +++ b/libraries/AsyncUDP/keywords.txt @@ -8,6 +8,7 @@ AsyncUDP KEYWORD1 AsyncUDPPacket KEYWORD1 +AsyncUDPMessage KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -19,6 +20,21 @@ listen KEYWORD2 listenMulticast KEYWORD2 close KEYWORD2 write KEYWORD2 +space KEYWORD2 +flush KEYWORD2 +isBroadcast KEYWORD2 +isMulticast KEYWORD2 +isIPv6 KEYWORD2 +interface KEYWORD2 +localIPv6 KEYWORD2 +remoteIPv6 KEYWORD2 +remoteMac KEYWORD2 +send KEYWORD2 +peek KEYWORD2 +available KEYWORD2 +writeTo KEYWORD2 +broadcastTo KEYWORD2 +sendTo KEYWORD2 broadcast KEYWORD2 onPacket KEYWORD2 data KEYWORD2 @@ -27,7 +43,17 @@ localIP KEYWORD2 localPort KEYWORD2 remoteIP KEYWORD2 remotePort KEYWORD2 +listenIP KEYWORD2 +listenIPv6 KEYWORD2 +lastErr KEYWORD2 +_s_recv KEYWORD2 ####################################### # Constants (LITERAL1) ####################################### + +TCPIP_ADAPTER_IF_STA LITERAL1 +TCPIP_ADAPTER_IF_STA LITERAL1 +TCPIP_ADAPTER_IF_AP LITERAL1 +TCPIP_ADAPTER_IF_ETH LITERAL1 +TCPIP_ADAPTER_IF_PPP LITERAL1 From 0f3191e34f9cd0a496b3add66006a21326103559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Mon, 25 Nov 2024 21:39:59 +0100 Subject: [PATCH 022/183] fix(zigbee): Increase timeout, commision again on failure + setScanDuration (#10651) * fix(zigbee): Increase timeout, commision again on failure * fix(zigbee): Update library keywords --- libraries/Zigbee/keywords.txt | 2 ++ libraries/Zigbee/src/ZigbeeCore.cpp | 17 ++++++++++++++--- libraries/Zigbee/src/ZigbeeCore.h | 8 +++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/libraries/Zigbee/keywords.txt b/libraries/Zigbee/keywords.txt index 1a8b7ae85ba..40e5dcec004 100644 --- a/libraries/Zigbee/keywords.txt +++ b/libraries/Zigbee/keywords.txt @@ -40,6 +40,8 @@ getRadioConfig KEYWORD2 setHostConfig KEYWORD2 getHostConfig KEYWORD2 setPrimaryChannelMask KEYWORD2 +setScanDuration KEYWORD2 +getScanDuration KEYWORD2 setRebootOpenNetwork KEYWORD2 openNetwork KEYWORD2 scanNetworks KEYWORD2 diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index 38ef9b169d5..442dc4b7ee0 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -6,7 +6,7 @@ #include "ZigbeeHandlers.cpp" #include "Arduino.h" -#define ZB_INIT_TIMEOUT 10000 // 10 seconds +#define ZB_INIT_TIMEOUT 30000 // 30 seconds extern "C" void zb_set_ed_node_descriptor(bool power_src, bool rx_on_when_idle, bool alloc_addr); static bool edBatteryPowered = false; @@ -20,6 +20,7 @@ ZigbeeCore::ZigbeeCore() { _scan_status = ZB_SCAN_FAILED; _started = false; _connected = false; + _scan_duration = 4; // maximum scan duration if (!lock) { lock = xSemaphoreCreateBinary(); if (lock == NULL) { @@ -90,6 +91,8 @@ void ZigbeeCore::addEndpoint(ZigbeeEP *ep) { } static void esp_zb_task(void *pvParameters) { + esp_zb_bdb_set_scan_duration(Zigbee.getScanDuration()); + /* initialize Zigbee stack */ ESP_ERROR_CHECK(esp_zb_start(false)); @@ -178,6 +181,14 @@ void ZigbeeCore::setPrimaryChannelMask(uint32_t mask) { _primary_channel_mask = mask; } +void ZigbeeCore::setScanDuration(uint8_t duration) { + if (duration < 1 || duration > 4) { + log_e("Invalid scan duration, must be between 1 and 4"); + return; + } + _scan_duration = duration; +} + void ZigbeeCore::setRebootOpenNetwork(uint8_t time) { _open_network = time; } @@ -235,8 +246,8 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { } } else { /* commissioning failed */ - log_e("Failed to initialize Zigbee stack (status: %s)", esp_err_to_name(err_status)); - xSemaphoreGive(Zigbee.lock); + log_w("Commissioning failed, trying again...", esp_err_to_name(err_status)); + esp_zb_scheduler_alarm((esp_zb_callback_t)bdb_start_top_level_commissioning_cb, ESP_ZB_BDB_MODE_INITIALIZATION, 500); } break; case ESP_ZB_BDB_SIGNAL_FORMATION: // Coordinator diff --git a/libraries/Zigbee/src/ZigbeeCore.h b/libraries/Zigbee/src/ZigbeeCore.h index e068d74430e..75fecd59198 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -66,6 +66,7 @@ class ZigbeeCore { esp_zb_host_config_t _host_config; uint32_t _primary_channel_mask; int16_t _scan_status; + uint8_t _scan_duration; esp_zb_ep_list_t *_zb_ep_list; zigbee_role_t _role; @@ -109,7 +110,12 @@ class ZigbeeCore { void setHostConfig(esp_zb_host_config_t config); esp_zb_host_config_t getHostConfig(); - void setPrimaryChannelMask(uint32_t mask); + void setPrimaryChannelMask(uint32_t mask); // By default all channels are scanned (11-26) -> mask 0x07FFF800 + void setScanDuration(uint8_t duration); // Can be set from 1 - 4. 1 is fastest, 4 is slowest + uint8_t getScanDuration() { + return _scan_duration; + } + void setRebootOpenNetwork(uint8_t time); void openNetwork(uint8_t time); From 98da424de638836e400d4a110b9cb9a101e8cc22 Mon Sep 17 00:00:00 2001 From: Dogus Cendek Date: Tue, 26 Nov 2024 15:46:22 +0300 Subject: [PATCH 023/183] Add our new development board "cezerio mini dev ESP32C6" (#10648) --- boards.txt | 173 ++++++++++++++++++ .../cezerio_mini_dev_esp32c6/pins_arduino.h | 47 +++++ 2 files changed, 220 insertions(+) create mode 100644 variants/cezerio_mini_dev_esp32c6/pins_arduino.h diff --git a/boards.txt b/boards.txt index 069a0340cf0..817c7b7441c 100644 --- a/boards.txt +++ b/boards.txt @@ -44374,6 +44374,179 @@ cezerio_dev_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp ############################################################## +cezerio_mini_dev_esp32c6.name=cezerio mini dev ESP32C6 + +cezerio_mini_dev_esp32c6.bootloader.tool=esptool_py +cezerio_mini_dev_esp32c6.bootloader.tool.default=esptool_py + +cezerio_mini_dev_esp32c6.upload.tool=esptool_py +cezerio_mini_dev_esp32c6.upload.tool.default=esptool_py +cezerio_mini_dev_esp32c6.upload.tool.network=esp_ota + +cezerio_mini_dev_esp32c6.upload.maximum_size=1310720 +cezerio_mini_dev_esp32c6.upload.maximum_data_size=327680 +cezerio_mini_dev_esp32c6.upload.flags= +cezerio_mini_dev_esp32c6.upload.extra_flags= +cezerio_mini_dev_esp32c6.upload.use_1200bps_touch=false +cezerio_mini_dev_esp32c6.upload.wait_for_upload_port=false + +cezerio_mini_dev_esp32c6.serial.disableDTR=false +cezerio_mini_dev_esp32c6.serial.disableRTS=false + +cezerio_mini_dev_esp32c6.build.tarch=riscv32 +cezerio_mini_dev_esp32c6.build.target=esp +cezerio_mini_dev_esp32c6.build.mcu=esp32c6 +cezerio_mini_dev_esp32c6.build.core=esp32 +cezerio_mini_dev_esp32c6.build.variant=cezerio_mini_dev_esp32c6 +cezerio_mini_dev_esp32c6.build.board=CEZERIO_MINI_DEV_ESP32C6 +cezerio_mini_dev_esp32c6.build.bootloader_addr=0x0 + +cezerio_mini_dev_esp32c6.build.cdc_on_boot=0 +cezerio_mini_dev_esp32c6.build.f_cpu=160000000L +cezerio_mini_dev_esp32c6.build.flash_size=4MB +cezerio_mini_dev_esp32c6.build.flash_freq=80m +cezerio_mini_dev_esp32c6.build.flash_mode=qio +cezerio_mini_dev_esp32c6.build.boot=qio +cezerio_mini_dev_esp32c6.build.partitions=default +cezerio_mini_dev_esp32c6.build.defines= + +## IDE 2.0 Seems to not update the value +cezerio_mini_dev_esp32c6.menu.JTAGAdapter.default=Disabled +cezerio_mini_dev_esp32c6.menu.JTAGAdapter.default.build.copy_jtag_files=0 +cezerio_mini_dev_esp32c6.menu.JTAGAdapter.builtin=Integrated USB JTAG +cezerio_mini_dev_esp32c6.menu.JTAGAdapter.builtin.build.openocdscript=esp32c6-builtin.cfg +cezerio_mini_dev_esp32c6.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 +cezerio_mini_dev_esp32c6.menu.JTAGAdapter.external=FTDI Adapter +cezerio_mini_dev_esp32c6.menu.JTAGAdapter.external.build.openocdscript=esp32c6-ftdi.cfg +cezerio_mini_dev_esp32c6.menu.JTAGAdapter.external.build.copy_jtag_files=1 +cezerio_mini_dev_esp32c6.menu.JTAGAdapter.bridge=ESP USB Bridge +cezerio_mini_dev_esp32c6.menu.JTAGAdapter.bridge.build.openocdscript=esp32c6-bridge.cfg +cezerio_mini_dev_esp32c6.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +cezerio_mini_dev_esp32c6.menu.CDCOnBoot.default=Enabled +cezerio_mini_dev_esp32c6.menu.CDCOnBoot.default.build.cdc_on_boot=1 +cezerio_mini_dev_esp32c6.menu.CDCOnBoot.cdc=Disabled +cezerio_mini_dev_esp32c6.menu.CDCOnBoot.cdc.build.cdc_on_boot=0 + +cezerio_mini_dev_esp32c6.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +cezerio_mini_dev_esp32c6.menu.PartitionScheme.default.build.partitions=default +cezerio_mini_dev_esp32c6.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +cezerio_mini_dev_esp32c6.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +cezerio_mini_dev_esp32c6.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +cezerio_mini_dev_esp32c6.menu.PartitionScheme.minimal.build.partitions=minimal +cezerio_mini_dev_esp32c6.menu.PartitionScheme.no_fs=No FS 4MB (2MB APP x2) +cezerio_mini_dev_esp32c6.menu.PartitionScheme.no_fs.build.partitions=no_fs +cezerio_mini_dev_esp32c6.menu.PartitionScheme.no_fs.upload.maximum_size=2031616 +cezerio_mini_dev_esp32c6.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +cezerio_mini_dev_esp32c6.menu.PartitionScheme.no_ota.build.partitions=no_ota +cezerio_mini_dev_esp32c6.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +cezerio_mini_dev_esp32c6.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +cezerio_mini_dev_esp32c6.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +cezerio_mini_dev_esp32c6.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +cezerio_mini_dev_esp32c6.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +cezerio_mini_dev_esp32c6.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +cezerio_mini_dev_esp32c6.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +cezerio_mini_dev_esp32c6.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +cezerio_mini_dev_esp32c6.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +cezerio_mini_dev_esp32c6.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +cezerio_mini_dev_esp32c6.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +cezerio_mini_dev_esp32c6.menu.PartitionScheme.huge_app.build.partitions=huge_app +cezerio_mini_dev_esp32c6.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +cezerio_mini_dev_esp32c6.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +cezerio_mini_dev_esp32c6.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +cezerio_mini_dev_esp32c6.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 +cezerio_mini_dev_esp32c6.menu.PartitionScheme.rainmaker=RainMaker 4MB +cezerio_mini_dev_esp32c6.menu.PartitionScheme.rainmaker.build.partitions=rainmaker +cezerio_mini_dev_esp32c6.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 +cezerio_mini_dev_esp32c6.menu.PartitionScheme.rainmaker_4MB=RainMaker 4MB No OTA +cezerio_mini_dev_esp32c6.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota +cezerio_mini_dev_esp32c6.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 +cezerio_mini_dev_esp32c6.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs +cezerio_mini_dev_esp32c6.menu.PartitionScheme.zigbee.build.partitions=zigbee +cezerio_mini_dev_esp32c6.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 +cezerio_mini_dev_esp32c6.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs +cezerio_mini_dev_esp32c6.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr +cezerio_mini_dev_esp32c6.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 +cezerio_mini_dev_esp32c6.menu.PartitionScheme.custom=Custom +cezerio_mini_dev_esp32c6.menu.PartitionScheme.custom.build.partitions= +cezerio_mini_dev_esp32c6.menu.PartitionScheme.custom.upload.maximum_size=16777216 + +cezerio_mini_dev_esp32c6.menu.CPUFreq.160=160MHz (WiFi) +cezerio_mini_dev_esp32c6.menu.CPUFreq.160.build.f_cpu=160000000L +cezerio_mini_dev_esp32c6.menu.CPUFreq.120=120MHz (WiFi) +cezerio_mini_dev_esp32c6.menu.CPUFreq.120.build.f_cpu=120000000L +cezerio_mini_dev_esp32c6.menu.CPUFreq.80=80MHz (WiFi) +cezerio_mini_dev_esp32c6.menu.CPUFreq.80.build.f_cpu=80000000L +cezerio_mini_dev_esp32c6.menu.CPUFreq.40=40MHz +cezerio_mini_dev_esp32c6.menu.CPUFreq.40.build.f_cpu=40000000L +cezerio_mini_dev_esp32c6.menu.CPUFreq.20=20MHz +cezerio_mini_dev_esp32c6.menu.CPUFreq.20.build.f_cpu=20000000L +cezerio_mini_dev_esp32c6.menu.CPUFreq.10=10MHz +cezerio_mini_dev_esp32c6.menu.CPUFreq.10.build.f_cpu=10000000L + +cezerio_mini_dev_esp32c6.menu.FlashMode.qio=QIO +cezerio_mini_dev_esp32c6.menu.FlashMode.qio.build.flash_mode=dio +cezerio_mini_dev_esp32c6.menu.FlashMode.qio.build.boot=qio +cezerio_mini_dev_esp32c6.menu.FlashMode.dio=DIO +cezerio_mini_dev_esp32c6.menu.FlashMode.dio.build.flash_mode=dio +cezerio_mini_dev_esp32c6.menu.FlashMode.dio.build.boot=dio + +cezerio_mini_dev_esp32c6.menu.FlashFreq.80=80MHz +cezerio_mini_dev_esp32c6.menu.FlashFreq.80.build.flash_freq=80m +cezerio_mini_dev_esp32c6.menu.FlashFreq.40=40MHz +cezerio_mini_dev_esp32c6.menu.FlashFreq.40.build.flash_freq=40m + +cezerio_mini_dev_esp32c6.menu.FlashSize.4M=4MB (32Mb) +cezerio_mini_dev_esp32c6.menu.FlashSize.4M.build.flash_size=4MB + +cezerio_mini_dev_esp32c6.menu.UploadSpeed.921600=921600 +cezerio_mini_dev_esp32c6.menu.UploadSpeed.921600.upload.speed=921600 +cezerio_mini_dev_esp32c6.menu.UploadSpeed.115200=115200 +cezerio_mini_dev_esp32c6.menu.UploadSpeed.115200.upload.speed=115200 +cezerio_mini_dev_esp32c6.menu.UploadSpeed.256000.windows=256000 +cezerio_mini_dev_esp32c6.menu.UploadSpeed.256000.upload.speed=256000 +cezerio_mini_dev_esp32c6.menu.UploadSpeed.230400.windows.upload.speed=256000 +cezerio_mini_dev_esp32c6.menu.UploadSpeed.230400=230400 +cezerio_mini_dev_esp32c6.menu.UploadSpeed.230400.upload.speed=230400 +cezerio_mini_dev_esp32c6.menu.UploadSpeed.460800.linux=460800 +cezerio_mini_dev_esp32c6.menu.UploadSpeed.460800.macosx=460800 +cezerio_mini_dev_esp32c6.menu.UploadSpeed.460800.upload.speed=460800 +cezerio_mini_dev_esp32c6.menu.UploadSpeed.512000.windows=512000 +cezerio_mini_dev_esp32c6.menu.UploadSpeed.512000.upload.speed=512000 + +cezerio_mini_dev_esp32c6.menu.DebugLevel.none=None +cezerio_mini_dev_esp32c6.menu.DebugLevel.none.build.code_debug=0 +cezerio_mini_dev_esp32c6.menu.DebugLevel.error=Error +cezerio_mini_dev_esp32c6.menu.DebugLevel.error.build.code_debug=1 +cezerio_mini_dev_esp32c6.menu.DebugLevel.warn=Warn +cezerio_mini_dev_esp32c6.menu.DebugLevel.warn.build.code_debug=2 +cezerio_mini_dev_esp32c6.menu.DebugLevel.info=Info +cezerio_mini_dev_esp32c6.menu.DebugLevel.info.build.code_debug=3 +cezerio_mini_dev_esp32c6.menu.DebugLevel.debug=Debug +cezerio_mini_dev_esp32c6.menu.DebugLevel.debug.build.code_debug=4 +cezerio_mini_dev_esp32c6.menu.DebugLevel.verbose=Verbose +cezerio_mini_dev_esp32c6.menu.DebugLevel.verbose.build.code_debug=5 + +cezerio_mini_dev_esp32c6.menu.EraseFlash.none=Disabled +cezerio_mini_dev_esp32c6.menu.EraseFlash.none.upload.erase_cmd= +cezerio_mini_dev_esp32c6.menu.EraseFlash.all=Enabled +cezerio_mini_dev_esp32c6.menu.EraseFlash.all.upload.erase_cmd=-e + +cezerio_mini_dev_esp32c6.menu.ZigbeeMode.default=Disabled +cezerio_mini_dev_esp32c6.menu.ZigbeeMode.default.build.zigbee_mode= +cezerio_mini_dev_esp32c6.menu.ZigbeeMode.default.build.zigbee_libs= +cezerio_mini_dev_esp32c6.menu.ZigbeeMode.ed=Zigbee ED (end device) +cezerio_mini_dev_esp32c6.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED +cezerio_mini_dev_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +cezerio_mini_dev_esp32c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator) +cezerio_mini_dev_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +cezerio_mini_dev_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +cezerio_mini_dev_esp32c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) +cezerio_mini_dev_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP +cezerio_mini_dev_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port + +############################################################## + waveshare_esp32_s3_lcd_185.name=Waveshare ESP32-S3-LCD-1.85 waveshare_esp32_s3_lcd_185.vid.0=0x303a waveshare_esp32_s3_lcd_185.pid.0=0x8242 diff --git a/variants/cezerio_mini_dev_esp32c6/pins_arduino.h b/variants/cezerio_mini_dev_esp32c6/pins_arduino.h new file mode 100644 index 00000000000..e7ef94e5a64 --- /dev/null +++ b/variants/cezerio_mini_dev_esp32c6/pins_arduino.h @@ -0,0 +1,47 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include +#include "soc/soc_caps.h" + +#define USB_VID 0x303A +#define USB_PID 0x1001 +#define USB_MANUFACTURER "RFtek Electronics" +#define USB_PRODUCT "cezerio mini dev ESP32C6" +#define USB_SERIAL "" + +#define PIN_RGB_LED 20 +// BUILTIN_LED can be used in new Arduino API digitalWrite() like in Blink.ino +static const uint8_t LED_BUILTIN = SOC_GPIO_PIN_COUNT + PIN_RGB_LED; +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN +// RGB_BUILTIN and RGB_BRIGHTNESS can be used in new Arduino API rgbLedWrite() +#define RGB_BUILTIN LED_BUILTIN +#define RGBLED LED_BUILTIN +#define RGB_BRIGHTNESS 64 + +static const uint8_t BUT_BUILTIN = 9; +#define BUILTIN_BUT BUT_BUILTIN // backward compatibility +#define BUT_BUILTIN BUT_BUILTIN // allow testing #ifdef BUT_BUILTIN +#define BOOT BUT_BUILTIN + +static const uint8_t TX = 7; +static const uint8_t RX = 14; + +static const uint8_t SDA = 23; +static const uint8_t SCL = 22; + +static const uint8_t MOSI = 19; +static const uint8_t MISO = 21; +static const uint8_t SCK = 18; +static const uint8_t SS = 17; + +static const uint8_t A0 = 0; +static const uint8_t A1 = 1; +static const uint8_t A2 = 2; +static const uint8_t A3 = 3; +static const uint8_t A6 = 6; + +static const uint8_t MATRIX = 4; + +#endif /* Pins_Arduino_h */ From 414e4f3233ff015003048e1004275b853f7cf556 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 26 Nov 2024 17:14:38 -0300 Subject: [PATCH 024/183] feat(Matter): add new MatterColorLight endpoint (#10654) * feat(matter): adds Matter Color Light endpoint --- CMakeLists.txt | 3 +- cores/esp32/ColorFormat.c | 279 ++++++++++++++++ cores/esp32/ColorFormat.h | 70 ++++ libraries/ESP32/keywords.txt | 38 ++- .../Matter_CW_WW_Light/Matter_CW_WW_Light.ino | 5 +- .../Matter_ColorLight/Matter_ColorLight.ino | 183 +++++++++++ .../Matter/examples/Matter_ColorLight/ci.json | 7 + libraries/Matter/keywords.txt | 32 +- libraries/Matter/src/Matter.cpp | 1 - libraries/Matter/src/Matter.h | 4 +- .../src/MatterEndpoints/MatterColorLight.cpp | 307 ++++++++++++++++++ .../src/MatterEndpoints/MatterColorLight.h | 75 +++++ .../MatterColorTemperatureLight.h | 6 - .../Matter/src/MatterUtil/ColorFormat.cpp | 203 ------------ libraries/Matter/src/MatterUtil/ColorFormat.h | 47 --- 15 files changed, 978 insertions(+), 282 deletions(-) create mode 100644 cores/esp32/ColorFormat.c create mode 100644 cores/esp32/ColorFormat.h create mode 100644 libraries/Matter/examples/Matter_ColorLight/Matter_ColorLight.ino create mode 100644 libraries/Matter/examples/Matter_ColorLight/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterColorLight.h delete mode 100644 libraries/Matter/src/MatterUtil/ColorFormat.cpp delete mode 100644 libraries/Matter/src/MatterUtil/ColorFormat.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ccfecc2dac..8ab001c2d09 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,7 @@ endif() set(CORE_SRCS cores/esp32/base64.cpp cores/esp32/cbuf.cpp + cores/esp32/ColorFormat.c cores/esp32/chip-debug-report.cpp cores/esp32/esp32-hal-adc.c cores/esp32/esp32-hal-bt.c @@ -170,7 +171,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp - libraries/Matter/src/MatterUtil/ColorFormat.cpp + libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS diff --git a/cores/esp32/ColorFormat.c b/cores/esp32/ColorFormat.c new file mode 100644 index 00000000000..a01123545b3 --- /dev/null +++ b/cores/esp32/ColorFormat.c @@ -0,0 +1,279 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ColorFormat.h" + +#include + +// define a clamp macro to substitute the std::clamp macro which is available from C++17 onwards +#define clamp(a, min, max) ((a) < (min) ? (min) : ((a) > (max) ? (max) : (a))) + +const espHsvColor_t HSV_BLACK = {0, 0, 0}; +const espHsvColor_t HSV_WHITE = {0, 0, 254}; +const espHsvColor_t HSV_RED = {0, 254, 254}; +const espHsvColor_t HSV_YELLOW = {42, 254, 254}; +const espHsvColor_t HSV_GREEN = {84, 254, 254}; +const espHsvColor_t HSV_CYAN = {127, 254, 254}; +const espHsvColor_t HSV_BLUE = {169, 254, 254}; +const espHsvColor_t HSV_MAGENTA = {211, 254, 254}; + +const espRgbColor_t RGB_BLACK = {0, 0, 0}; +const espRgbColor_t RGB_WHITE = {255, 255, 255}; +const espRgbColor_t RGB_RED = {255, 0, 0}; +const espRgbColor_t RGB_YELLOW = {255, 255, 0}; +const espRgbColor_t RGB_GREEN = {0, 255, 0}; +const espRgbColor_t RGB_CYAN = {0, 255, 255}; +const espRgbColor_t RGB_BLUE = {0, 0, 255}; +const espRgbColor_t RGB_MAGENTA = {255, 0, 255}; + +// main color temperature values +const espCtColor_t COOL_WHITE_COLOR_TEMPERATURE = {142}; +const espCtColor_t DAYLIGHT_WHITE_COLOR_TEMPERATURE = {181}; +const espCtColor_t WHITE_COLOR_TEMPERATURE = {250}; +const espCtColor_t SOFT_WHITE_COLOR_TEMPERATURE = {370}; +const espCtColor_t WARM_WHITE_COLOR_TEMPERATURE = {454}; + +espRgbColor_t espHsvToRgbColor(uint16_t h, uint8_t s, uint8_t v) { + espHsvColor_t hsv = {h, s, v}; + return espHsvColorToRgbColor(hsv); +} + +espRgbColor_t espHsvColorToRgbColor(espHsvColor_t hsv) { + espRgbColor_t rgb; + + uint8_t region, p, q, t; + uint32_t h, s, v, remainder; + + if (hsv.s == 0) { + rgb.r = rgb.g = rgb.b = hsv.v; + } else { + h = hsv.h; + s = hsv.s; + v = hsv.v; + + region = h / 43; + remainder = (h - (region * 43)) * 6; + p = (v * (255 - s)) >> 8; + q = (v * (255 - ((s * remainder) >> 8))) >> 8; + t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8; + switch (region) { + case 0: rgb.r = v, rgb.g = t, rgb.b = p; break; + case 1: rgb.r = q, rgb.g = v, rgb.b = p; break; + case 2: rgb.r = p, rgb.g = v, rgb.b = t; break; + case 3: rgb.r = p, rgb.g = q, rgb.b = v; break; + case 4: rgb.r = t, rgb.g = p, rgb.b = v; break; + case 5: + default: rgb.r = v, rgb.g = p, rgb.b = q; break; + } + } + return rgb; +} + +espHsvColor_t espRgbToHsvColor(uint8_t r, uint8_t g, uint8_t b) { + espRgbColor_t rgb = {r, g, b}; + return espRgbColorToHsvColor(rgb); +} + +espHsvColor_t espRgbColorToHsvColor(espRgbColor_t rgb) { + espHsvColor_t hsv; + uint8_t rgbMin, rgbMax; + + rgbMin = rgb.r < rgb.g ? (rgb.r < rgb.b ? rgb.r : rgb.b) : (rgb.g < rgb.b ? rgb.g : rgb.b); + rgbMax = rgb.r > rgb.g ? (rgb.r > rgb.b ? rgb.r : rgb.b) : (rgb.g > rgb.b ? rgb.g : rgb.b); + + hsv.v = rgbMax; + if (hsv.v == 0) { + hsv.h = 0; + hsv.s = 0; + return hsv; + } + + hsv.s = 255 * (rgbMax - rgbMin) / hsv.v; + if (hsv.s == 0) { + hsv.h = 0; + return hsv; + } + if (rgbMax == rgb.r) { + hsv.h = 0 + 43 * (rgb.g - rgb.b) / (rgbMax - rgbMin); + } else if (rgbMax == rgb.g) { + hsv.h = 85 + 43 * (rgb.b - rgb.r) / (rgbMax - rgbMin); + } else { + hsv.h = 171 + 43 * (rgb.r - rgb.g) / (rgbMax - rgbMin); + } + return hsv; +} + +espRgbColor_t espXYColorToRgbColor(uint8_t Level, espXyColor_t xy) { + return espXYToRgbColor(Level, xy.x, xy.y); +} + +espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t current_Y) { + // convert xyY color space to RGB + + // https://www.easyrgb.com/en/math.php + // https://en.wikipedia.org/wiki/SRGB + // refer https://en.wikipedia.org/wiki/CIE_1931_color_space#CIE_xy_chromaticity_diagram_and_the_CIE_xyY_color_space + + // The current_X/current_Y attribute contains the current value of the normalized chromaticity value of x/y. + // The value of x/y shall be related to the current_X/current_Y attribute by the relationship + // x = current_X/65536 + // y = current_Y/65536 + // z = 1-x-y + + espRgbColor_t rgb; + + float x, y, z; + float X, Y, Z; + float r, g, b; + + x = ((float)current_X) / 65535.0f; + y = ((float)current_Y) / 65535.0f; + + z = 1.0f - x - y; + + // Calculate XYZ values + + // Y - given brightness in 0 - 1 range + Y = ((float)Level) / 254.0f; + X = (Y / y) * x; + Z = (Y / y) * z; + + // X, Y and Z input refer to a D65/2° standard illuminant. + // sR, sG and sB (standard RGB) output range = 0 ÷ 255 + // convert XYZ to RGB - CIE XYZ to sRGB + X = X / 100.0f; + Y = Y / 100.0f; + Z = Z / 100.0f; + + r = (X * 3.2406f) - (Y * 1.5372f) - (Z * 0.4986f); + g = -(X * 0.9689f) + (Y * 1.8758f) + (Z * 0.0415f); + b = (X * 0.0557f) - (Y * 0.2040f) + (Z * 1.0570f); + + // apply gamma 2.2 correction + r = (r <= 0.0031308f ? 12.92f * r : (1.055f) * pow(r, (1.0f / 2.4f)) - 0.055f); + g = (g <= 0.0031308f ? 12.92f * g : (1.055f) * pow(g, (1.0f / 2.4f)) - 0.055f); + b = (b <= 0.0031308f ? 12.92f * b : (1.055f) * pow(b, (1.0f / 2.4f)) - 0.055f); + + // Round off + r = clamp(r, 0, 1); + g = clamp(g, 0, 1); + b = clamp(b, 0, 1); + + // these rgb values are in the range of 0 to 1, convert to limit of HW specific LED + rgb.r = (uint8_t)(r * 255); + rgb.g = (uint8_t)(g * 255); + rgb.b = (uint8_t)(b * 255); + + return rgb; +} + +espXyColor_t espRgbToXYColor(uint8_t r, uint8_t g, uint8_t b) { + espRgbColor_t rgb = {r, g, b}; + return espRgbColorToXYColor(rgb); +} + +espXyColor_t espRgbColorToXYColor(espRgbColor_t rgb) { + // convert RGB to xy color space + + // https://www.easyrgb.com/en/math.php + // https://en.wikipedia.org/wiki/SRGB + // refer https://en.wikipedia.org/wiki/CIE_1931_color_space#CIE_xy_chromaticity_diagram_and_the_CIE_xyY_color_space + + espXyColor_t xy; + + float r, g, b; + float X, Y, Z; + float x, y; + + r = ((float)rgb.r) / 255.0f; + g = ((float)rgb.g) / 255.0f; + b = ((float)rgb.b) / 255.0f; + + // convert RGB to XYZ - sRGB to CIE XYZ + r = (r <= 0.04045f ? r / 12.92f : pow((r + 0.055f) / 1.055f, 2.4f)); + g = (g <= 0.04045f ? g / 12.92f : pow((g + 0.055f) / 1.055f, 2.4f)); + b = (b <= 0.04045f ? b / 12.92f : pow((b + 0.055f) / 1.055f, 2.4f)); + + // https://gist.github.com/popcorn245/30afa0f98eea1c2fd34d + X = r * 0.649926f + g * 0.103455f + b * 0.197109f; + Y = r * 0.234327f + g * 0.743075f + b * 0.022598f; + Z = r * 0.0000000f + g * 0.053077f + b * 1.035763f; + + // sR, sG and sB (standard RGB) input range = 0 ÷ 255 + // X, Y and Z output refer to a D65/2° standard illuminant. + X = r * 0.4124564f + g * 0.3575761f + b * 0.1804375f; + Y = r * 0.2126729f + g * 0.7151522f + b * 0.0721750f; + Z = r * 0.0193339f + g * 0.1191920f + b * 0.9503041f; + + // Calculate xy values + x = X / (X + Y + Z); + y = Y / (X + Y + Z); + + // convert to 0-65535 range + xy.x = (uint16_t)(x * 65535); + xy.y = (uint16_t)(y * 65535); + return xy; +} + +espRgbColor_t espCTToRgbColor(uint16_t ct) { + espCtColor_t ctColor = {ct}; + return espCTColorToRgbColor(ctColor); +} + +espRgbColor_t espCTColorToRgbColor(espCtColor_t ct) { + espRgbColor_t rgb = {0, 0, 0}; + float r, g, b; + + if (ct.ctMireds == 0) { + return rgb; + } + // Algorithm credits to Tanner Helland: https://tannerhelland.com/2012/09/18/convert-temperature-rgb-algorithm-code.html + + // Convert Mireds to centiKelvins. k = 1,000,000/mired + float ctCentiKelvin = 10000 / ct.ctMireds; + + // Red + if (ctCentiKelvin <= 66) { + r = 255; + } else { + r = 329.698727446f * pow(ctCentiKelvin - 60, -0.1332047592f); + } + + // Green + if (ctCentiKelvin <= 66) { + g = 99.4708025861f * log(ctCentiKelvin) - 161.1195681661f; + } else { + g = 288.1221695283f * pow(ctCentiKelvin - 60, -0.0755148492f); + } + + // Blue + if (ctCentiKelvin >= 66) { + b = 255; + } else { + if (ctCentiKelvin <= 19) { + b = 0; + } else { + b = 138.5177312231 * log(ctCentiKelvin - 10) - 305.0447927307; + } + } + rgb.r = (uint8_t)clamp(r, 0, 255); + rgb.g = (uint8_t)clamp(g, 0, 255); + rgb.b = (uint8_t)clamp(b, 0, 255); + + return rgb; +} diff --git a/cores/esp32/ColorFormat.h b/cores/esp32/ColorFormat.h new file mode 100644 index 00000000000..0bb87145d16 --- /dev/null +++ b/cores/esp32/ColorFormat.h @@ -0,0 +1,70 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#ifdef __cplusplus +extern "C" { +#endif + +struct RgbColor_t { + uint8_t r; + uint8_t g; + uint8_t b; +}; + +struct HsvColor_t { + uint16_t h; + uint8_t s; + uint8_t v; +}; + +struct XyColor_t { + uint16_t x; + uint16_t y; +}; + +struct CtColor_t { + uint16_t ctMireds; +}; + +typedef struct RgbColor_t espRgbColor_t; +typedef struct HsvColor_t espHsvColor_t; +typedef struct XyColor_t espXyColor_t; +typedef struct CtColor_t espCtColor_t; + +espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t current_Y); +espRgbColor_t espXYColorToRgb(uint8_t Level, espXyColor_t xy); +espXyColor_t espRgbColorToXYColor(espRgbColor_t rgb); +espXyColor_t espRgbToXYColor(uint8_t r, uint8_t g, uint8_t b); +espRgbColor_t espHsvColorToRgbColor(espHsvColor_t hsv); +espRgbColor_t espHsvToRgbColor(uint16_t h, uint8_t s, uint8_t v); +espRgbColor_t espCTColorToRgbColor(espCtColor_t ct); +espRgbColor_t espCTToRgbColor(uint16_t ct); +espHsvColor_t espRgbColorToHsvColor(espRgbColor_t rgb); +espHsvColor_t espRgbToHsvColor(uint8_t r, uint8_t g, uint8_t b); + +extern const espHsvColor_t HSV_BLACK, HSV_WHITE, HSV_RED, HSV_YELLOW, HSV_GREEN, HSV_CYAN, HSV_BLUE, HSV_MAGENTA; +extern const espCtColor_t COOL_WHITE_COLOR_TEMPERATURE, DAYLIGHT_WHITE_COLOR_TEMPERATURE, WHITE_COLOR_TEMPERATURE, SOFT_WHITE_COLOR_TEMPERATURE, + WARM_WHITE_COLOR_TEMPERATURE; +extern const espRgbColor_t RGB_BLACK, RGB_WHITE, RGB_RED, RGB_YELLOW, RGB_GREEN, RGB_CYAN, RGB_BLUE, RGB_MAGENTA; + +#ifdef __cplusplus +} +#endif diff --git a/libraries/ESP32/keywords.txt b/libraries/ESP32/keywords.txt index 7e36360c840..866e76babd8 100644 --- a/libraries/ESP32/keywords.txt +++ b/libraries/ESP32/keywords.txt @@ -6,14 +6,50 @@ # Datatypes (KEYWORD1) ####################################### -Serial4 KEYWORD1 +Serial4 KEYWORD1 +espCtColor_t KEYWORD1 +espXyColor_t KEYWORD1 +espHsvColor_t KEYWORD1 +espRgbColor_t KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) ####################################### +espXYToRgbColor KEYWORD2 +espXYColorToRgb KEYWORD2 +espRgbColorToXYColor KEYWORD2 +espRgbToXYColor KEYWORD2 +espHsvColorToRgbColor KEYWORD2 +espHsvToRgbColor KEYWORD2 +espCTColorToRgbColor KEYWORD2 +espCTToRgbColor KEYWORD2 +espRgbColorToHsvColor KEYWORD2 +espRgbToHsvColor KEYWORD2 + ####################################### # Constants (LITERAL1) ####################################### RGB_BUILTIN LITERAL1 +HSV_BLACK LITERAL1 +HSV_WHITE LITERAL1 +HSV_RED LITERAL1 +HSV_YELLOW LITERAL1 +HSV_GREEN LITERAL1 +HSV_CYAN LITERAL1 +HSV_BLUE LITERAL1 +HSV_MAGENTA LITERAL1 +COOL_WHITE_COLOR_TEMPERATURE LITERAL1 +DAYLIGHT_WHITE_COLOR_TEMPERATURE LITERAL1 +WHITE_COLOR_TEMPERATURE LITERAL1 +SOFT_WHITE_COLOR_TEMPERATURE LITERAL1 +WARM_WHITE_COLOR_TEMPERATURE LITERAL1 +RGB_BLACK LITERAL1 +RGB_WHITE LITERAL1 +RGB_RED LITERAL1 +RGB_YELLOW LITERAL1 +RGB_GREEN LITERAL1 +RGB_CYAN LITERAL1 +RGB_BLUE LITERAL1 +RGB_MAGENTA LITERAL1 diff --git a/libraries/Matter/examples/Matter_CW_WW_Light/Matter_CW_WW_Light.ino b/libraries/Matter/examples/Matter_CW_WW_Light/Matter_CW_WW_Light.ino index 39392d90225..0ff30f53ec0 100644 --- a/libraries/Matter/examples/Matter_CW_WW_Light/Matter_CW_WW_Light.ino +++ b/libraries/Matter/examples/Matter_CW_WW_Light/Matter_CW_WW_Light.ino @@ -47,8 +47,7 @@ bool setLightState(bool state, uint8_t brightness, uint16_t temperature_Mireds) if (state) { #ifdef RGB_BUILTIN - CtColor_t ct = {temperature_Mireds}; - RgbColor_t rgb_ct = CTToRgb(ct); + espRgbColor_t rgb_ct = espCTToRgbColor(temperature_Mireds); // simple intensity correction float brightnessPercent = (float)brightness / MatterColorTemperatureLight::MAX_BRIGHTNESS; rgb_ct.r = brightnessPercent * rgb_ct.r; @@ -106,7 +105,7 @@ void setup() { // default brightness ~= 6% (15/255) uint8_t lastBrightness = matterPref.getUChar(brightnessPrefKey, 15); // default temperature ~= 454 Mireds (Warm White) - uint16_t lastTemperature = matterPref.getUShort(temperaturePrefKey, MatterColorTemperatureLight::WARM_WHITE_COLOR_TEMPERATURE); + uint16_t lastTemperature = matterPref.getUShort(temperaturePrefKey, WARM_WHITE_COLOR_TEMPERATURE.ctMireds); CW_WW_Light.begin(lastOnOffState, lastBrightness, lastTemperature); // set the callback function to handle the Light state change CW_WW_Light.onChange(setLightState); diff --git a/libraries/Matter/examples/Matter_ColorLight/Matter_ColorLight.ino b/libraries/Matter/examples/Matter_ColorLight/Matter_ColorLight.ino new file mode 100644 index 00000000000..2b9c4e4033a --- /dev/null +++ b/libraries/Matter/examples/Matter_ColorLight/Matter_ColorLight.ino @@ -0,0 +1,183 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Matter Manager +#include +#include +#include + +// List of Matter Endpoints for this Node +// Color Light Endpoint +MatterColorLight ColorLight; + +// it will keep last OnOff & HSV Color state stored, using Preferences +Preferences matterPref; +const char *onOffPrefKey = "OnOff"; +const char *hsvColorPrefKey = "HSV"; + +// set your board RGB LED pin here +#ifdef RGB_BUILTIN +const uint8_t ledPin = RGB_BUILTIN; +#else +const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN +#warning "Do not forget to set the RGB LED pin" +#endif + +// set your board USER BUTTON pin here +const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9. + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Set the RGB LED Light based on the current state of the Color Light +bool setLightState(bool state, espHsvColor_t colorHSV) { + + if (state) { +#ifdef RGB_BUILTIN + espRgbColor_t rgbColor = espHsvColorToRgbColor(colorHSV); + // set the RGB LED + rgbLedWrite(ledPin, rgbColor.r, rgbColor.g, rgbColor.b); +#else + // No Color RGB LED, just use the HSV value (brightness) to control the LED + analogWrite(ledPin, colorHSV.v); +#endif + } else { + digitalWrite(ledPin, LOW); + } + // store last HSV Color and OnOff state for when the Light is restarted / power goes off + matterPref.putBool(onOffPrefKey, state); + matterPref.putUInt(hsvColorPrefKey, colorHSV.h << 16 | colorHSV.s << 8 | colorHSV.v); + // This callback must return the success state to Matter core + return true; +} + +void setup() { + // Initialize the USER BUTTON (Boot button) GPIO that will act as a toggle switch + pinMode(buttonPin, INPUT_PULLUP); + // Initialize the LED (light) GPIO and Matter End Point + pinMode(ledPin, OUTPUT); + + Serial.begin(115200); + while (!Serial) { + delay(100); + } + + // We start by connecting to a WiFi network + Serial.print("Connecting to "); + Serial.println(ssid); + // enable IPv6 + WiFi.enableIPv6(true); + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println("\r\nWiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + delay(500); + + // Initialize Matter EndPoint + matterPref.begin("MatterPrefs", false); + // default OnOff state is ON if not stored before + bool lastOnOffState = matterPref.getBool(onOffPrefKey, true); + // default HSV color is blue HSV(169, 254, 254) + uint32_t prefHsvColor = matterPref.getUInt(hsvColorPrefKey, 169 << 16 | 254 << 8 | 254); + espHsvColor_t lastHsvColor = {uint8_t(prefHsvColor >> 16), uint8_t(prefHsvColor >> 8), uint8_t(prefHsvColor)}; + ColorLight.begin(lastOnOffState, lastHsvColor); + // set the callback function to handle the Light state change + ColorLight.onChange(setLightState); + + // lambda functions are used to set the attribute change callbacks + ColorLight.onChangeOnOff([](bool state) { + Serial.printf("Light OnOff changed to %s\r\n", state ? "ON" : "OFF"); + return true; + }); + ColorLight.onChangeColorHSV([](HsvColor_t hsvColor) { + Serial.printf("Light HSV Color changed to (%d,%d,%d)\r\n", hsvColor.h, hsvColor.s, hsvColor.v); + return true; + }); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + // This may be a restart of a already commissioned Matter accessory + if (Matter.isDeviceCommissioned()) { + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.printf( + "Initial state: %s | RGB Color: (%d,%d,%d) \r\n", ColorLight ? "ON" : "OFF", ColorLight.getColorRGB().r, ColorLight.getColorRGB().g, + ColorLight.getColorRGB().b + ); + // configure the Light based on initial on-off state and its color + ColorLight.updateAccessory(); + } +} +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the light + +void loop() { + // Check Matter Light Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Light Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.printf( + "Initial state: %s | RGB Color: (%d,%d,%d) \r\n", ColorLight ? "ON" : "OFF", ColorLight.getColorRGB().r, ColorLight.getColorRGB().g, + ColorLight.getColorRGB().b + ); + // configure the Light based on initial on-off state and its color + ColorLight.updateAccessory(); + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } + + // A button is also used to control the light + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + // Onboard User Button is used as a Light toggle switch or to decommission it + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > debouceTime && digitalRead(buttonPin) == HIGH) { + button_state = false; // released + // Toggle button is released - toggle the light + Serial.println("User button released. Toggling Light!"); + ColorLight.toggle(); // Matter Controller also can see the change + + // Factory reset is triggered if the button is pressed longer than 10 seconds + if (time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + ColorLight = false; // turn the light off + Matter.decommission(); + } + } +} diff --git a/libraries/Matter/examples/Matter_ColorLight/ci.json b/libraries/Matter/examples/Matter_ColorLight/ci.json new file mode 100644 index 00000000000..d5f63487506 --- /dev/null +++ b/libraries/Matter/examples/Matter_ColorLight/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] + } diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index bcc99253e72..39a74e76583 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -1,5 +1,5 @@ ####################################### -# Syntax Coloring Map For OpenThread +# Syntax Coloring Map For Matter ####################################### ####################################### @@ -10,12 +10,9 @@ Matter KEYWORD1 ArduinoMatter KEYWORD1 MatterOnOffLight KEYWORD1 MatterDimmableLight KEYWORD1 -MatterColorTemperatureLight KEYWORD1 +MatterColorTemperatureLight KEYWORD1 +MatterColorLight KEYWORD1 MatterEndPoint KEYWORD1 -CtColor_t KEYWORD1 -XyColor_t KEYWORD1 -HsvColor_t KEYWORD1 -RgbColor_t KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -37,26 +34,23 @@ setBrightness KEYWORD2 getBrightness KEYWORD2 setColorTemperature KEYWORD2 getColorTemperature KEYWORD2 +setColorRGB KEYWORD2 +getColorRGB KEYWORD2 +setColorHSV KEYWORD2 +getColorHSV KEYWORD2 toggle KEYWORD2 updateAccessory KEYWORD2 onChange KEYWORD2 onChangeOnOff KEYWORD2 onChangeBrightness KEYWORD2 -onChangeColorTemperature KEYWORD2 -XYToRgb KEYWORD2 -HsvToRgb KEYWORD2 -CTToRgb KEYWORD2 -RgbToHsv KEYWORD2 +onChangeColorTemperature KEYWORD2 +onChangeColorHSV KEYWORD2 + ####################################### # Constants (LITERAL1) ####################################### -MAX_BRIGHTNESS LITERAL1 -MAX_COLOR_TEMPERATURE LITERAL1 -MIN_COLOR_TEMPERATURE LITERAL1 -COOL_WHITE_COLOR_TEMPERATURE LITERAL1 -DAYLIGHT_WHITE_COLOR_TEMPERATURE LITERAL1 -WHITE_COLOR_TEMPERATURE LITERAL1 -SOFT_WHITE_COLOR_TEMPERATURE LITERAL1 -WARM_WHITE_COLOR_TEMPERATURE LITERAL1 +MAX_BRIGHTNESS LITERAL1 +MAX_COLOR_TEMPERATURE LITERAL1 +MIN_COLOR_TEMPERATURE LITERAL1 diff --git a/libraries/Matter/src/Matter.cpp b/libraries/Matter/src/Matter.cpp index 857438cce03..89ef87b4db3 100644 --- a/libraries/Matter/src/Matter.cpp +++ b/libraries/Matter/src/Matter.cpp @@ -17,7 +17,6 @@ #include #include -#include "MatterEndPoint.h" using namespace esp_matter; using namespace esp_matter::attribute; diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index e9d8b715388..4d269474187 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -18,10 +18,11 @@ #include #include -#include +#include #include #include #include +#include using namespace esp_matter; @@ -50,6 +51,7 @@ class ArduinoMatter { friend class MatterOnOffLight; friend class MatterDimmableLight; friend class MatterColorTemperatureLight; + friend class MatterColorLight; protected: static void _init(); diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp new file mode 100644 index 00000000000..b67cf6a23b1 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp @@ -0,0 +1,307 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +// endpoint for color light device +namespace esp_matter { +using namespace cluster; +namespace endpoint { +namespace rgb_color_light { +typedef struct config { + cluster::descriptor::config_t descriptor; + cluster::identify::config_t identify; + cluster::groups::config_t groups; + cluster::scenes_management::config_t scenes_management; + cluster::on_off::config_t on_off; + cluster::level_control::config_t level_control; + cluster::color_control::config_t color_control; +} config_t; + +uint32_t get_device_type_id() { + return ESP_MATTER_EXTENDED_COLOR_LIGHT_DEVICE_TYPE_ID; +} + +uint8_t get_device_type_version() { + return ESP_MATTER_EXTENDED_COLOR_LIGHT_DEVICE_TYPE_VERSION; +} + +esp_err_t add(endpoint_t *endpoint, config_t *config) { + if (!endpoint) { + log_e("Endpoint cannot be NULL"); + return ESP_ERR_INVALID_ARG; + } + esp_err_t err = add_device_type(endpoint, get_device_type_id(), get_device_type_version()); + if (err != ESP_OK) { + log_e("Failed to add device type id:%" PRIu32 ",err: %d", get_device_type_id(), err); + return err; + } + + descriptor::create(endpoint, &(config->descriptor), CLUSTER_FLAG_SERVER); + cluster_t *identify_cluster = identify::create(endpoint, &(config->identify), CLUSTER_FLAG_SERVER); + identify::command::create_trigger_effect(identify_cluster); + groups::create(endpoint, &(config->groups), CLUSTER_FLAG_SERVER); + cluster_t *scenes_cluster = scenes_management::create(endpoint, &(config->scenes_management), CLUSTER_FLAG_SERVER); + scenes_management::command::create_copy_scene(scenes_cluster); + scenes_management::command::create_copy_scene_response(scenes_cluster); + + on_off::create(endpoint, &(config->on_off), CLUSTER_FLAG_SERVER, on_off::feature::lighting::get_id()); + level_control::create( + endpoint, &(config->level_control), CLUSTER_FLAG_SERVER, level_control::feature::on_off::get_id() | level_control::feature::lighting::get_id() + ); + color_control::create(endpoint, &(config->color_control), CLUSTER_FLAG_SERVER, color_control::feature::hue_saturation::get_id()); + return ESP_OK; +} + +endpoint_t *create(node_t *node, config_t *config, uint8_t flags, void *priv_data) { + endpoint_t *endpoint = endpoint::create(node, flags, priv_data); + add(endpoint, config); + return endpoint; +} +} // namespace rgb_color_light +} // namespace endpoint +} // namespace esp_matter + +bool MatterColorLight::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { + bool ret = true; + if (!started) { + log_e("Matter RGB Color Light device has not begun."); + return false; + } + + log_d( + "RGB Color Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u, type: %u", endpoint_id, cluster_id, attribute_id, val->val.u32, + val->type + ); + + if (endpoint_id == getEndPointId()) { + switch (cluster_id) { + case OnOff::Id: + if (attribute_id == OnOff::Attributes::OnOff::Id) { + log_d("RGB Color Light On/Off State changed to %d", val->val.b); + if (_onChangeOnOffCB != NULL) { + ret &= _onChangeOnOffCB(val->val.b); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(val->val.b, colorHSV); + } + if (ret == true) { + onOffState = val->val.b; + } + } + break; + case LevelControl::Id: + if (attribute_id == LevelControl::Attributes::CurrentLevel::Id) { + log_d("RGB Color Light Brightness changed to %d", val->val.u8); + if (_onChangeColorCB != NULL) { + ret &= _onChangeColorCB({colorHSV.h, colorHSV.s, val->val.u8}); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(onOffState, {colorHSV.h, colorHSV.s, val->val.u8}); + } + if (ret == true) { + colorHSV.v = val->val.u8; + } + } + break; + case ColorControl::Id: + { + if (attribute_id != ColorControl::Attributes::CurrentHue::Id && attribute_id != ColorControl::Attributes::CurrentSaturation::Id) { + log_i("Color Control Attribute ID [%x] not processed.", attribute_id); + break; + } + espHsvColor_t hsvColor = {colorHSV.h, colorHSV.s, colorHSV.v}; + if (attribute_id == ColorControl::Attributes::CurrentHue::Id) { + log_d("RGB Light Hue changed to %d", val->val.u8); + hsvColor.h = val->val.u8; + } else { // attribute_id == ColorControl::Attributes::CurrentSaturation::Id) + log_d("RGB Light Saturation changed to %d", val->val.u8); + hsvColor.s = val->val.u8; + } + if (_onChangeColorCB != NULL) { + ret &= _onChangeColorCB(hsvColor); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(onOffState, hsvColor); + } + if (ret == true) { + colorHSV = {hsvColor.h, hsvColor.s, hsvColor.v}; + } + break; + } + } + } + return ret; +} + +MatterColorLight::MatterColorLight() {} + +MatterColorLight::~MatterColorLight() { + end(); +} + +bool MatterColorLight::begin(bool initialState, espHsvColor_t _colorHSV) { + ArduinoMatter::_init(); + rgb_color_light::config_t light_config; + + light_config.on_off.on_off = initialState; + light_config.on_off.lighting.start_up_on_off = nullptr; + onOffState = initialState; + + light_config.level_control.current_level = _colorHSV.v; + light_config.level_control.lighting.start_up_current_level = nullptr; + + light_config.color_control.color_mode = (uint8_t)ColorControl::ColorMode::kCurrentHueAndCurrentSaturation; + light_config.color_control.enhanced_color_mode = (uint8_t)ColorControl::ColorMode::kCurrentHueAndCurrentSaturation; + light_config.color_control.hue_saturation.current_hue = _colorHSV.h; + light_config.color_control.hue_saturation.current_saturation = _colorHSV.s; + colorHSV = {_colorHSV.h, _colorHSV.s, _colorHSV.v}; + + // endpoint handles can be used to add/modify clusters. + endpoint_t *endpoint = rgb_color_light::create(node::get(), &light_config, ENDPOINT_FLAG_NONE, (void *)this); + if (endpoint == nullptr) { + log_e("Failed to create RGB Color light endpoint"); + return false; + } + + setEndPointId(endpoint::get_id(endpoint)); + log_i("RGB Color Light created with endpoint_id %d", getEndPointId()); + + /* Mark deferred persistence for some attributes that might be changed rapidly */ + cluster_t *level_control_cluster = cluster::get(endpoint, LevelControl::Id); + attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id); + attribute::set_deferred_persistence(current_level_attribute); + + started = true; + return true; +} + +void MatterColorLight::end() { + started = false; +} + +bool MatterColorLight::setOnOff(bool newState) { + if (!started) { + log_e("Matter RGB Color Light device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (onOffState == newState) { + return true; + } + + onOffState = newState; + + endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); + cluster_t *cluster = cluster::get(endpoint, OnOff::Id); + attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id); + + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + + if (val.val.b != onOffState) { + val.val.b = onOffState; + attribute::update(endpoint_id, OnOff::Id, OnOff::Attributes::OnOff::Id, &val); + } + return true; +} + +void MatterColorLight::updateAccessory() { + if (_onChangeCB != NULL) { + _onChangeCB(onOffState, colorHSV); + } +} + +bool MatterColorLight::getOnOff() { + return onOffState; +} + +bool MatterColorLight::toggle() { + return setOnOff(!onOffState); +} + +bool MatterColorLight::setColorRGB(espRgbColor_t _rgbColor) { + return setColorHSV(espRgbColorToHsvColor(_rgbColor)); +} + +espRgbColor_t MatterColorLight::getColorRGB() { + return espHsvColorToRgbColor(colorHSV); +} + +bool MatterColorLight::setColorHSV(espHsvColor_t _hsvColor) { + + if (!started) { + log_w("Matter RGB Color Light device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (colorHSV.h == _hsvColor.h && colorHSV.s == _hsvColor.s && colorHSV.v == _hsvColor.v) { + return true; + } + + colorHSV = {_hsvColor.h, _hsvColor.s, _hsvColor.v}; + + endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); + cluster_t *cluster = cluster::get(endpoint, ColorControl::Id); + // update hue + attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::CurrentHue::Id); + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + if (val.val.u8 != colorHSV.h) { + val.val.u8 = colorHSV.h; + attribute::update(endpoint_id, ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, &val); + } + // update saturation + attribute = attribute::get(cluster, ColorControl::Attributes::CurrentSaturation::Id); + val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + if (val.val.u8 != colorHSV.s) { + val.val.u8 = colorHSV.s; + attribute::update(endpoint_id, ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id, &val); + } + // update value (brightness) + cluster = cluster::get(endpoint, LevelControl::Id); + attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id); + val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + if (val.val.u8 != colorHSV.v) { + val.val.u8 = colorHSV.v; + attribute::update(endpoint_id, LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, &val); + } + return true; +} + +espHsvColor_t MatterColorLight::getColorHSV() { + return colorHSV; +} + +MatterColorLight::operator bool() { + return getOnOff(); +} + +void MatterColorLight::operator=(bool newState) { + setOnOff(newState); +} +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorLight.h new file mode 100644 index 00000000000..13ff0decbc2 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterColorLight.h @@ -0,0 +1,75 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +class MatterColorLight : public MatterEndPoint { +public: + MatterColorLight(); + ~MatterColorLight(); + // default initial state is off, color is red 12% intensity HSV(0, 254, 31) + virtual bool begin(bool initialState = false, espHsvColor_t colorHSV = {0, 254, 31}); + // this will just stop processing Light Matter events + void end(); + + bool setOnOff(bool newState); // returns true if successful + bool getOnOff(); // returns current light state + bool toggle(); // returns true if successful + + bool setColorRGB(espRgbColor_t rgbColor); // returns true if successful + espRgbColor_t getColorRGB(); // returns current RGB Color + bool setColorHSV(espHsvColor_t hsvColor); // returns true if successful + espHsvColor_t getColorHSV(); // returns current HSV Color + + // used to update the state of the light using the current Matter Light internal state + // It is necessary to set a user callback function using onChange() to handle the physical light state + void updateAccessory(); + + operator bool(); // returns current on/off light state + void operator=(bool state); // turns light on or off + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + + // User Callback for whenever the Light On/Off state is changed by the Matter Controller + using EndPointOnOffCB = std::function; + void onChangeOnOff(EndPointOnOffCB onChangeCB) { + _onChangeOnOffCB = onChangeCB; + } + // User Callback for whenever the HSV Color value is changed by the Matter Controller + using EndPointRGBColorCB = std::function; + void onChangeColorHSV(EndPointRGBColorCB onChangeCB) { + _onChangeColorCB = onChangeCB; + } + + // User Callback for whenever any parameter is changed by the Matter Controller + using EndPointCB = std::function; + void onChange(EndPointCB onChangeCB) { + _onChangeCB = onChangeCB; + } + +protected: + bool started = false; + bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) + espHsvColor_t colorHSV = {0}; // default initial color HSV is black, but it can be changed by begin(bool, espHsvColor_t) + EndPointOnOffCB _onChangeOnOffCB = NULL; + EndPointRGBColorCB _onChangeColorCB = NULL; + EndPointCB _onChangeCB = NULL; +}; +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h index a37f362f475..723849e354a 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h @@ -24,12 +24,6 @@ class MatterColorTemperatureLight : public MatterEndPoint { static const uint8_t MAX_BRIGHTNESS = 255; static const uint16_t MAX_COLOR_TEMPERATURE = 500; static const uint16_t MIN_COLOR_TEMPERATURE = 100; - // main color temperature values - static const uint16_t COOL_WHITE_COLOR_TEMPERATURE = 142; - static const uint16_t DAYLIGHT_WHITE_COLOR_TEMPERATURE = 181; - static const uint16_t WHITE_COLOR_TEMPERATURE = 250; - static const uint16_t SOFT_WHITE_COLOR_TEMPERATURE = 370; - static const uint16_t WARM_WHITE_COLOR_TEMPERATURE = 454; MatterColorTemperatureLight(); ~MatterColorTemperatureLight(); diff --git a/libraries/Matter/src/MatterUtil/ColorFormat.cpp b/libraries/Matter/src/MatterUtil/ColorFormat.cpp deleted file mode 100644 index 41d845dcdb9..00000000000 --- a/libraries/Matter/src/MatterUtil/ColorFormat.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/* - * - * Copyright (c) 2021 Project CHIP Authors - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "ColorFormat.h" - -#include - -// define a clamp macro to substitute the std::clamp macro which is available from C++17 onwards -#define clamp(a, min, max) ((a) < (min) ? (min) : ((a) > (max) ? (max) : (a))) - -RgbColor_t HsvToRgb(HsvColor_t hsv) { - RgbColor_t rgb; - - uint16_t i = hsv.h / 60; - uint16_t rgb_max = hsv.v; - uint16_t rgb_min = (uint16_t)(rgb_max * (100 - hsv.s)) / 100; - uint16_t diff = hsv.h % 60; - uint16_t rgb_adj = (uint16_t)((rgb_max - rgb_min) * diff) / 60; - - switch (i) { - case 0: - rgb.r = (uint8_t)rgb_max; - rgb.g = (uint8_t)(rgb_min + rgb_adj); - rgb.b = (uint8_t)rgb_min; - break; - case 1: - rgb.r = (uint8_t)(rgb_max - rgb_adj); - rgb.g = (uint8_t)rgb_max; - rgb.b = (uint8_t)rgb_min; - break; - case 2: - rgb.r = (uint8_t)rgb_min; - rgb.g = (uint8_t)rgb_max; - rgb.b = (uint8_t)(rgb_min + rgb_adj); - break; - case 3: - rgb.r = (uint8_t)rgb_min; - rgb.g = (uint8_t)(rgb_max - rgb_adj); - rgb.b = (uint8_t)rgb_max; - break; - case 4: - rgb.r = (uint8_t)(rgb_min + rgb_adj); - rgb.g = (uint8_t)rgb_min; - rgb.b = (uint8_t)rgb_max; - break; - default: - rgb.r = (uint8_t)rgb_max; - rgb.g = (uint8_t)rgb_min; - rgb.b = (uint8_t)(rgb_max - rgb_adj); - break; - } - - return rgb; -} - -HsvColor_t RgbToHsv(RgbColor_t rgb) { - HsvColor_t hsv; - - uint16_t rgb_max = rgb.r > rgb.g ? (rgb.r > rgb.b ? rgb.r : rgb.b) : (rgb.g > rgb.b ? rgb.g : rgb.b); - uint16_t rgb_min = rgb.r < rgb.g ? (rgb.r < rgb.b ? rgb.r : rgb.b) : (rgb.g < rgb.b ? rgb.g : rgb.b); - uint16_t diff = rgb_max - rgb_min; - - if (diff == 0) { - hsv.h = 0; - } else if (rgb_max == rgb.r) { - hsv.h = (uint8_t)(60 * ((rgb.g - rgb.b) * 100) / diff); - } else if (rgb_max == rgb.g) { - hsv.h = (uint8_t)(60 * (((rgb.b - rgb.r) * 100) / diff + 2 * 100)); - } else { - hsv.h = (uint8_t)(60 * (((rgb.r - rgb.g) * 100) / diff + 4 * 100)); - } - - if (rgb_max == 0) { - hsv.s = 0; - } else { - hsv.s = (uint8_t)((diff * 100) / rgb_max); - } - - hsv.v = (uint8_t)rgb_max; - if (hsv.h < 0) { - hsv.h += 360; - } - - return hsv; -} - -RgbColor_t XYToRgb(uint8_t Level, uint16_t current_X, uint16_t current_Y) { - // convert xyY color space to RGB - - // https://www.easyrgb.com/en/math.php - // https://en.wikipedia.org/wiki/SRGB - // refer https://en.wikipedia.org/wiki/CIE_1931_color_space#CIE_xy_chromaticity_diagram_and_the_CIE_xyY_color_space - - // The current_X/current_Y attribute contains the current value of the normalized chromaticity value of x/y. - // The value of x/y shall be related to the current_X/current_Y attribute by the relationship - // x = current_X/65536 - // y = current_Y/65536 - // z = 1-x-y - - RgbColor_t rgb; - - float x, y, z; - float X, Y, Z; - float r, g, b; - - x = ((float)current_X) / 65535.0f; - y = ((float)current_Y) / 65535.0f; - - z = 1.0f - x - y; - - // Calculate XYZ values - - // Y - given brightness in 0 - 1 range - Y = ((float)Level) / 254.0f; - X = (Y / y) * x; - Z = (Y / y) * z; - - // X, Y and Z input refer to a D65/2° standard illuminant. - // sR, sG and sB (standard RGB) output range = 0 ÷ 255 - // convert XYZ to RGB - CIE XYZ to sRGB - X = X / 100.0f; - Y = Y / 100.0f; - Z = Z / 100.0f; - - r = (X * 3.2406f) - (Y * 1.5372f) - (Z * 0.4986f); - g = -(X * 0.9689f) + (Y * 1.8758f) + (Z * 0.0415f); - b = (X * 0.0557f) - (Y * 0.2040f) + (Z * 1.0570f); - - // apply gamma 2.2 correction - r = (r <= 0.0031308f ? 12.92f * r : (1.055f) * pow(r, (1.0f / 2.4f)) - 0.055f); - g = (g <= 0.0031308f ? 12.92f * g : (1.055f) * pow(g, (1.0f / 2.4f)) - 0.055f); - b = (b <= 0.0031308f ? 12.92f * b : (1.055f) * pow(b, (1.0f / 2.4f)) - 0.055f); - - // Round off - r = clamp(r, 0, 1); - g = clamp(g, 0, 1); - b = clamp(b, 0, 1); - - // these rgb values are in the range of 0 to 1, convert to limit of HW specific LED - rgb.r = (uint8_t)(r * 255); - rgb.g = (uint8_t)(g * 255); - rgb.b = (uint8_t)(b * 255); - - return rgb; -} - -RgbColor_t CTToRgb(CtColor_t ct) { - RgbColor_t rgb = {0, 0, 0}; - float r, g, b; - - if (ct.ctMireds == 0) { - return rgb; - } - // Algorithm credits to Tanner Helland: https://tannerhelland.com/2012/09/18/convert-temperature-rgb-algorithm-code.html - - // Convert Mireds to centiKelvins. k = 1,000,000/mired - float ctCentiKelvin = 10000 / ct.ctMireds; - - // Red - if (ctCentiKelvin <= 66) { - r = 255; - } else { - r = 329.698727446f * pow(ctCentiKelvin - 60, -0.1332047592f); - } - - // Green - if (ctCentiKelvin <= 66) { - g = 99.4708025861f * log(ctCentiKelvin) - 161.1195681661f; - } else { - g = 288.1221695283f * pow(ctCentiKelvin - 60, -0.0755148492f); - } - - // Blue - if (ctCentiKelvin >= 66) { - b = 255; - } else { - if (ctCentiKelvin <= 19) { - b = 0; - } else { - b = 138.5177312231 * log(ctCentiKelvin - 10) - 305.0447927307; - } - } - rgb.r = (uint8_t)clamp(r, 0, 255); - rgb.g = (uint8_t)clamp(g, 0, 255); - rgb.b = (uint8_t)clamp(b, 0, 255); - - return rgb; -} diff --git a/libraries/Matter/src/MatterUtil/ColorFormat.h b/libraries/Matter/src/MatterUtil/ColorFormat.h deleted file mode 100644 index 254a51c7144..00000000000 --- a/libraries/Matter/src/MatterUtil/ColorFormat.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * - * Copyright (c) 2021 Project CHIP Authors - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include - -struct RgbColor_t { - uint8_t r; - uint8_t g; - uint8_t b; -}; - -struct HsvColor_t { - int16_t h; - uint8_t s; - uint8_t v; -}; - -struct XyColor_t { - uint16_t x; - uint16_t y; -}; - -struct CtColor_t { - uint16_t ctMireds; -}; - -RgbColor_t XYToRgb(uint8_t Level, uint16_t current_X, uint16_t current_Y); -RgbColor_t HsvToRgb(HsvColor_t hsv); -RgbColor_t CTToRgb(CtColor_t ct); -HsvColor_t RgbToHsv(RgbColor_t rgb); From c2ce738caeeb63fa7fc66c2012254e9454c24f96 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 2 Dec 2024 19:13:17 -0300 Subject: [PATCH 025/183] feat(matter): New example => Wifi Prov within Matter as alternative for wireless network provisioning (#10658) * feat(matter): Arduino WiFi Prov example for Matter --- .../WiFiProvWithinMatter.ino | 122 ++++++++++++++++++ .../examples/WiFiProvWithinMatter/ci.json | 7 + 2 files changed, 129 insertions(+) create mode 100644 libraries/Matter/examples/WiFiProvWithinMatter/WiFiProvWithinMatter.ino create mode 100644 libraries/Matter/examples/WiFiProvWithinMatter/ci.json diff --git a/libraries/Matter/examples/WiFiProvWithinMatter/WiFiProvWithinMatter.ino b/libraries/Matter/examples/WiFiProvWithinMatter/WiFiProvWithinMatter.ino new file mode 100644 index 00000000000..eaf1f5096e5 --- /dev/null +++ b/libraries/Matter/examples/WiFiProvWithinMatter/WiFiProvWithinMatter.ino @@ -0,0 +1,122 @@ +/* + Please read README.md file in this folder, or on the web: + https://github.com/espressif/arduino-esp32/tree/master/libraries/WiFiProv/examples/WiFiProv + + Note: This sketch takes up a lot of space for the app and may not be able to flash with default setting on some chips. + If you see Error like this: "Sketch too big" + In Arduino IDE go to: Tools > Partition scheme > chose anything that has more than 1.4MB APP + - for example "No OTA (2MB APP/2MB SPIFFS)" + + This example demonstrates that it is possible to provision WiFi using BLE or Software AP using + the ESP BLE Prov APP or ESP SoftAP Provisioning APP from Android Play or/and iOS APP Store + + Once the WiFi is provisioned, Matter will start its process as usual. + + This same Example could be used for any other WiFi Provisioning method. +*/ + +// Matter Manager +#include +#include +#include + +#if !CONFIG_BLUEDROID_ENABLED +#define USE_SOFT_AP // ESP32-S2 has no BLE, therefore, it shall use SoftAP Provisioning +#endif +//#define USE_SOFT_AP // Uncomment if you want to enforce using the Soft AP method instead of BLE + +const char *pop = "abcd1234"; // Proof of possession - otherwise called a PIN - string provided by the device, entered by the user in the phone app +const char *service_name = "PROV_123"; // Name of your device (the Espressif apps expects by default device name starting with "Prov_") +const char *service_key = NULL; // Password used for SofAP method (NULL = no password needed) +bool reset_provisioned = true; // When true the library will automatically delete previously provisioned data. + +// List of Matter Endpoints for this Node +// Single On/Off Light Endpoint - at least one per node +MatterOnOffLight OnOffLight; + +// Light GPIO that can be controlled by Matter APP +#ifdef LED_BUILTIN +const uint8_t ledPin = LED_BUILTIN; +#else +const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN +#endif + +// Matter Protocol Endpoint (On/OFF Light) Callback +bool matterCB(bool state) { + digitalWrite(ledPin, state ? HIGH : LOW); + // This callback must return the success state to Matter core + return true; +} + +void setup() { + Serial.begin(115200); + // Initialize the LED GPIO + pinMode(ledPin, OUTPUT); + + WiFi.begin(); // no SSID/PWD - get it from the Provisioning APP or from NVS (last successful connection) + + // BLE Provisioning using the ESP SoftAP Prov works fine for any BLE SoC, including ESP32, ESP32S3 and ESP32C3. +#if CONFIG_BLUEDROID_ENABLED && !defined(USE_SOFT_AP) + Serial.println("Begin Provisioning using BLE"); + // Sample uuid that user can pass during provisioning using BLE + uint8_t uuid[16] = {0xb4, 0xdf, 0x5a, 0x1c, 0x3f, 0x6b, 0xf4, 0xbf, 0xea, 0x4a, 0x82, 0x03, 0x04, 0x90, 0x1a, 0x02}; + WiFiProv.beginProvision( + NETWORK_PROV_SCHEME_BLE, NETWORK_PROV_SCHEME_HANDLER_FREE_BLE, NETWORK_PROV_SECURITY_1, pop, service_name, service_key, uuid, reset_provisioned + ); + Serial.println("You may use this BLE QRCode:"); + WiFiProv.printQR(service_name, pop, "ble"); +#else + Serial.println("Begin Provisioning using Soft AP"); + WiFiProv.beginProvision(NETWORK_PROV_SCHEME_SOFTAP, NETWORK_PROV_SCHEME_HANDLER_NONE, NETWORK_PROV_SECURITY_1, pop, service_name, service_key); + Serial.println("You may use this WiFi QRCode:"); + WiFiProv.printQR(service_name, pop, "softap"); +#endif + + // Wait for WiFi connection + uint32_t counter = 0; + while (WiFi.status() != WL_CONNECTED) { + // resets the device after 10 minutes + if (counter > 2 * 60 * 10) { + Serial.println("\r\n================================================"); + Serial.println("Already 10 minutes past. The device will reboot."); + Serial.println("================================================\r\n"); + Serial.flush(); // wait until the Serial has sent the whole message. + ESP.restart(); + } + // WiFi searching feedback + Serial.print("."); + delay(500); + // adds a new line every 30 seconds + counter++; + if (!(counter % 60)) { + Serial.println(); + } + } + + // WiFi shall be connected by now + Serial.println(); + + // Initialize at least one Matter EndPoint + OnOffLight.begin(); + + // Associate a callback to the Matter Controller + OnOffLight.onChange(matterCB); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + while (!Matter.isDeviceCommissioned()) { + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + Serial.println(); + // waits 30 seconds for Matter Commissioning, keeping it blocked until done + delay(30000); + } +} + +void loop() { + delay(500); +} diff --git a/libraries/Matter/examples/WiFiProvWithinMatter/ci.json b/libraries/Matter/examples/WiFiProvWithinMatter/ci.json new file mode 100644 index 00000000000..0665800b12b --- /dev/null +++ b/libraries/Matter/examples/WiFiProvWithinMatter/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} From 9d8df8b3152b8a469cb1fe8ca095f8cc4bc08cd1 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 2 Dec 2024 19:26:13 -0300 Subject: [PATCH 026/183] feat(matter): Adds Matter Enhanced Color Light Endpoint (CW/WW/RGB) (#10657) * feat(matter): created enhanced color light new matter endpoint and example --- CMakeLists.txt | 1 + .../MatterEnhancedColorLight.ino | 205 +++++++++ .../examples/MatterEnhancedColorLight/ci.json | 7 + libraries/Matter/keywords.txt | 1 + libraries/Matter/src/Matter.h | 2 + .../MatterColorTemperatureLight.h | 1 + .../MatterEnhancedColorLight.cpp | 389 ++++++++++++++++++ .../MatterEnhancedColorLight.h | 102 +++++ 8 files changed, 708 insertions(+) create mode 100644 libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino create mode 100644 libraries/Matter/examples/MatterEnhancedColorLight/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ab001c2d09..9bbef502143 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,6 +172,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp + libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS diff --git a/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino new file mode 100644 index 00000000000..afba203b708 --- /dev/null +++ b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino @@ -0,0 +1,205 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Matter Manager +#include +#include +#include + +// List of Matter Endpoints for this Node +// Color Light Endpoint +MatterEnhancedColorLight EnhancedColorLight; + +// It will use HSV color to control all Matter Attribute Changes +HsvColor_t currentHSVColor = {0, 0, 0}; + +// it will keep last OnOff & HSV Color state stored, using Preferences +Preferences matterPref; +const char *onOffPrefKey = "OnOff"; +const char *hsvColorPrefKey = "HSV"; + +// set your board RGB LED pin here +#ifdef RGB_BUILTIN +const uint8_t ledPin = RGB_BUILTIN; +#else +const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN +#warning "Do not forget to set the RGB LED pin" +#endif + +// set your board USER BUTTON pin here +const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9. + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Set the RGB LED Light based on the current state of the Enhanced Color Light +bool setLightState(bool state, espHsvColor_t colorHSV, uint8_t brighteness, uint16_t temperature_Mireds) { + + if (state) { +#ifdef RGB_BUILTIN + // currentHSVColor keeps final color result + espRgbColor_t rgbColor = espHsvColorToRgbColor(currentHSVColor); + // set the RGB LED + rgbLedWrite(ledPin, rgbColor.r, rgbColor.g, rgbColor.b); +#else + // No Color RGB LED, just use the HSV value (brightness) to control the LED + analogWrite(ledPin, colorHSV.v); +#endif + } else { + digitalWrite(ledPin, LOW); + } + // store last HSV Color and OnOff state for when the Light is restarted / power goes off + matterPref.putBool(onOffPrefKey, state); + matterPref.putUInt(hsvColorPrefKey, currentHSVColor.h << 16 | currentHSVColor.s << 8 | currentHSVColor.v); + // This callback must return the success state to Matter core + return true; +} + +void setup() { + // Initialize the USER BUTTON (Boot button) GPIO that will act as a toggle switch + pinMode(buttonPin, INPUT_PULLUP); + // Initialize the LED (light) GPIO and Matter End Point + pinMode(ledPin, OUTPUT); + + Serial.begin(115200); + while (!Serial) { + delay(100); + } + + // We start by connecting to a WiFi network + Serial.print("Connecting to "); + Serial.println(ssid); + // enable IPv6 + WiFi.enableIPv6(true); + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println("\r\nWiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + delay(500); + + // Initialize Matter EndPoint + matterPref.begin("MatterPrefs", false); + // default OnOff state is ON if not stored before + bool lastOnOffState = matterPref.getBool(onOffPrefKey, true); + // default HSV color is (21, 216, 25) - Warm White Color at 10% intensity + uint32_t prefHsvColor = matterPref.getUInt(hsvColorPrefKey, 21 << 16 | 216 << 8 | 25); + currentHSVColor = {uint8_t(prefHsvColor >> 16), uint8_t(prefHsvColor >> 8), uint8_t(prefHsvColor)}; + EnhancedColorLight.begin(lastOnOffState, currentHSVColor); + // set the callback function to handle the Light state change + EnhancedColorLight.onChange(setLightState); + + // lambda functions are used to set the attribute change callbacks + EnhancedColorLight.onChangeOnOff([](bool state) { + Serial.printf("Light OnOff changed to %s\r\n", state ? "ON" : "OFF"); + return true; + }); + EnhancedColorLight.onChangeColorTemperature([](uint16_t colorTemperature) { + Serial.printf("Light Color Temperature changed to %d\r\n", colorTemperature); + // get correspondent Hue and Saturation of the color temperature + HsvColor_t hsvTemperature = espRgbColorToHsvColor(espCTToRgbColor(colorTemperature)); + // keep previous the brightness and just change the Hue and Saturation + currentHSVColor.h = hsvTemperature.h; + currentHSVColor.s = hsvTemperature.s; + return true; + }); + EnhancedColorLight.onChangeBrightness([](uint8_t brightness) { + Serial.printf("Light brightness changed to %d\r\n", brightness); + // change current brightness (HSV value) + currentHSVColor.v = brightness; + return true; + }); + EnhancedColorLight.onChangeColorHSV([](HsvColor_t hsvColor) { + Serial.printf("Light HSV Color changed to (%d,%d,%d)\r\n", hsvColor.h, hsvColor.s, hsvColor.v); + // keep the current brightness and just change Hue and Saturation + currentHSVColor.h = hsvColor.h; + currentHSVColor.s = hsvColor.s; + return true; + }); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + // This may be a restart of a already commissioned Matter accessory + if (Matter.isDeviceCommissioned()) { + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.printf( + "Initial state: %s | RGB Color: (%d,%d,%d) \r\n", EnhancedColorLight ? "ON" : "OFF", EnhancedColorLight.getColorRGB().r, + EnhancedColorLight.getColorRGB().g, EnhancedColorLight.getColorRGB().b + ); + // configure the Light based on initial on-off state and its color + EnhancedColorLight.updateAccessory(); + } +} +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the light + +void loop() { + // Check Matter Light Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Light Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.printf( + "Initial state: %s | RGB Color: (%d,%d,%d) \r\n", EnhancedColorLight ? "ON" : "OFF", EnhancedColorLight.getColorRGB().r, + EnhancedColorLight.getColorRGB().g, EnhancedColorLight.getColorRGB().b + ); + // configure the Light based on initial on-off state and its color + EnhancedColorLight.updateAccessory(); + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } + + // A button is also used to control the light + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + // Onboard User Button is used as a Light toggle switch or to decommission it + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > debouceTime && digitalRead(buttonPin) == HIGH) { + button_state = false; // released + // Toggle button is released - toggle the light + Serial.println("User button released. Toggling Light!"); + EnhancedColorLight.toggle(); // Matter Controller also can see the change + + // Factory reset is triggered if the button is pressed longer than 10 seconds + if (time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + EnhancedColorLight = false; // turn the light off + Matter.decommission(); + } + } +} diff --git a/libraries/Matter/examples/MatterEnhancedColorLight/ci.json b/libraries/Matter/examples/MatterEnhancedColorLight/ci.json new file mode 100644 index 00000000000..0665800b12b --- /dev/null +++ b/libraries/Matter/examples/MatterEnhancedColorLight/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index 39a74e76583..663cc2e8327 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -12,6 +12,7 @@ MatterOnOffLight KEYWORD1 MatterDimmableLight KEYWORD1 MatterColorTemperatureLight KEYWORD1 MatterColorLight KEYWORD1 +MatterEnhancedColorLight KEYWORD1 MatterEndPoint KEYWORD1 ####################################### diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index 4d269474187..5c68572640a 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -23,6 +23,7 @@ #include #include #include +#include using namespace esp_matter; @@ -52,6 +53,7 @@ class ArduinoMatter { friend class MatterDimmableLight; friend class MatterColorTemperatureLight; friend class MatterColorLight; + friend class MatterEnhancedColorLight; protected: static void _init(); diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h index 723849e354a..e886a184182 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h @@ -57,6 +57,7 @@ class MatterColorTemperatureLight : public MatterEndPoint { void onChangeOnOff(EndPointOnOffCB onChangeCB) { _onChangeOnOffCB = onChangeCB; } + // User Callback for whenever the Light brightness value [0..255] is changed by the Matter Controller using EndPointBrightnessCB = std::function; void onChangeBrightness(EndPointBrightnessCB onChangeCB) { diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp new file mode 100644 index 00000000000..423a6a7d2ef --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp @@ -0,0 +1,389 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +// endpoint for enhanced color light device +namespace esp_matter { +using namespace cluster; +namespace endpoint { +namespace enhanced_color_light { +typedef struct config { + cluster::descriptor::config_t descriptor; + cluster::identify::config_t identify; + cluster::groups::config_t groups; + cluster::scenes_management::config_t scenes_management; + cluster::on_off::config_t on_off; + cluster::level_control::config_t level_control; + cluster::color_control::config_t color_control; +} config_t; + +uint32_t get_device_type_id() { + return ESP_MATTER_EXTENDED_COLOR_LIGHT_DEVICE_TYPE_ID; +} + +uint8_t get_device_type_version() { + return ESP_MATTER_EXTENDED_COLOR_LIGHT_DEVICE_TYPE_VERSION; +} + +esp_err_t add(endpoint_t *endpoint, config_t *config) { + if (!endpoint) { + log_e("Endpoint cannot be NULL"); + return ESP_ERR_INVALID_ARG; + } + esp_err_t err = add_device_type(endpoint, get_device_type_id(), get_device_type_version()); + if (err != ESP_OK) { + log_e("Failed to add device type id:%" PRIu32 ",err: %d", get_device_type_id(), err); + return err; + } + + descriptor::create(endpoint, &(config->descriptor), CLUSTER_FLAG_SERVER); + cluster_t *identify_cluster = identify::create(endpoint, &(config->identify), CLUSTER_FLAG_SERVER); + identify::command::create_trigger_effect(identify_cluster); + groups::create(endpoint, &(config->groups), CLUSTER_FLAG_SERVER); + cluster_t *scenes_cluster = scenes_management::create(endpoint, &(config->scenes_management), CLUSTER_FLAG_SERVER); + scenes_management::command::create_copy_scene(scenes_cluster); + scenes_management::command::create_copy_scene_response(scenes_cluster); + + on_off::create(endpoint, &(config->on_off), CLUSTER_FLAG_SERVER, on_off::feature::lighting::get_id()); + level_control::create( + endpoint, &(config->level_control), CLUSTER_FLAG_SERVER, level_control::feature::on_off::get_id() | level_control::feature::lighting::get_id() + ); + color_control::create( + endpoint, &(config->color_control), CLUSTER_FLAG_SERVER, + color_control::feature::hue_saturation::get_id() | color_control::feature::color_temperature::get_id() + ); + return ESP_OK; +} + +endpoint_t *create(node_t *node, config_t *config, uint8_t flags, void *priv_data) { + endpoint_t *endpoint = endpoint::create(node, flags, priv_data); + add(endpoint, config); + return endpoint; +} +} // namespace enhanced_color_light +} // namespace endpoint +} // namespace esp_matter + +bool MatterEnhancedColorLight::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { + bool ret = true; + if (!started) { + log_e("Matter Enhanced ColorLight device has not begun."); + return false; + } + + log_d( + "Enhanced ColorAttr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u, type: %u", endpoint_id, cluster_id, attribute_id, val->val.u32, + val->type + ); + + if (endpoint_id == getEndPointId()) { + switch (cluster_id) { + case OnOff::Id: + if (attribute_id == OnOff::Attributes::OnOff::Id) { + log_d("Enhanced ColorLight On/Off State changed to %d", val->val.b); + if (_onChangeOnOffCB != NULL) { + ret &= _onChangeOnOffCB(val->val.b); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(val->val.b, colorHSV, brightnessLevel, colorTemperatureLevel); + } + if (ret == true) { + onOffState = val->val.b; + } + } + break; + case LevelControl::Id: + if (attribute_id == LevelControl::Attributes::CurrentLevel::Id) { + log_d("Enhanced ColorLight Brightness changed to %d", val->val.u8); + if (_onChangeBrightnessCB != NULL) { + ret &= _onChangeBrightnessCB(val->val.u8); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(onOffState, colorHSV, val->val.u8, colorTemperatureLevel); + } + if (ret == true) { + colorHSV.v = val->val.u8; + } + } + break; + case ColorControl::Id: + { + if (attribute_id == ColorControl::Attributes::ColorTemperatureMireds::Id) { + log_d("Enhanced ColorLight Temperature changed to %d", val->val.u16); + if (_onChangeTemperatureCB != NULL) { + ret &= _onChangeTemperatureCB(val->val.u16); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(onOffState, colorHSV, brightnessLevel, val->val.u16); + } + if (ret == true) { + colorTemperatureLevel = val->val.u16; + } + break; + } + if (attribute_id != ColorControl::Attributes::CurrentHue::Id && attribute_id != ColorControl::Attributes::CurrentSaturation::Id) { + log_i("Color Control Attribute ID [%x] not processed.", attribute_id); + break; + } + espHsvColor_t hsvColor = {colorHSV.h, colorHSV.s, colorHSV.v}; + if (attribute_id == ColorControl::Attributes::CurrentHue::Id) { + log_d("Enhanced ColorLight Hue changed to %d", val->val.u8); + hsvColor.h = val->val.u8; + } else { // attribute_id == ColorControl::Attributes::CurrentSaturation::Id) + log_d("Enhanced ColorLight Saturation changed to %d", val->val.u8); + hsvColor.s = val->val.u8; + } + if (_onChangeColorCB != NULL) { + ret &= _onChangeColorCB(hsvColor); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(onOffState, hsvColor, brightnessLevel, colorTemperatureLevel); + } + if (ret == true) { + colorHSV = {hsvColor.h, hsvColor.s, hsvColor.v}; + } + break; + } + } + } + return ret; +} + +MatterEnhancedColorLight::MatterEnhancedColorLight() {} + +MatterEnhancedColorLight::~MatterEnhancedColorLight() { + end(); +} + +bool MatterEnhancedColorLight::begin(bool initialState, espHsvColor_t _colorHSV, uint8_t brightness, uint16_t ColorTemperature) { + ArduinoMatter::_init(); + enhanced_color_light::config_t light_config; + + light_config.on_off.on_off = initialState; + light_config.on_off.lighting.start_up_on_off = nullptr; + onOffState = initialState; + + light_config.level_control.current_level = brightness; + light_config.level_control.lighting.start_up_current_level = nullptr; + + light_config.color_control.enhanced_color_mode = (uint8_t)ColorControl::ColorMode::kColorTemperature; + light_config.color_control.color_temperature.color_temperature_mireds = ColorTemperature; + light_config.color_control.color_temperature.startup_color_temperature_mireds = nullptr; + colorTemperatureLevel = ColorTemperature; + + light_config.color_control.color_mode = (uint8_t)ColorControl::ColorMode::kCurrentHueAndCurrentSaturation; + light_config.color_control.hue_saturation.current_hue = _colorHSV.h; + light_config.color_control.hue_saturation.current_saturation = _colorHSV.s; + colorHSV = {_colorHSV.h, _colorHSV.s, _colorHSV.v}; + + // endpoint handles can be used to add/modify clusters. + endpoint_t *endpoint = enhanced_color_light::create(node::get(), &light_config, ENDPOINT_FLAG_NONE, (void *)this); + if (endpoint == nullptr) { + log_e("Failed to create Enhanced ColorLight endpoint"); + return false; + } + + setEndPointId(endpoint::get_id(endpoint)); + log_i("Enhanced ColorLight created with endpoint_id %d", getEndPointId()); + + /* Mark deferred persistence for some attributes that might be changed rapidly */ + cluster_t *level_control_cluster = cluster::get(endpoint, LevelControl::Id); + attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id); + attribute::set_deferred_persistence(current_level_attribute); + + started = true; + return true; +} + +void MatterEnhancedColorLight::end() { + started = false; +} + +bool MatterEnhancedColorLight::setOnOff(bool newState) { + if (!started) { + log_e("Matter Enhanced ColorLight device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (onOffState == newState) { + return true; + } + + onOffState = newState; + + endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); + cluster_t *cluster = cluster::get(endpoint, OnOff::Id); + attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id); + + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + + if (val.val.b != onOffState) { + val.val.b = onOffState; + attribute::update(endpoint_id, OnOff::Id, OnOff::Attributes::OnOff::Id, &val); + } + return true; +} + +void MatterEnhancedColorLight::updateAccessory() { + if (_onChangeCB != NULL) { + _onChangeCB(onOffState, colorHSV, brightnessLevel, colorTemperatureLevel); + } +} + +bool MatterEnhancedColorLight::getOnOff() { + return onOffState; +} + +bool MatterEnhancedColorLight::toggle() { + return setOnOff(!onOffState); +} + +bool MatterEnhancedColorLight::setBrightness(uint8_t newBrightness) { + if (!started) { + log_w("Matter Enhanced ColorLight device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (brightnessLevel == newBrightness) { + return true; + } + + brightnessLevel = newBrightness; + + endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); + cluster_t *cluster = cluster::get(endpoint, LevelControl::Id); + attribute_t *attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id); + + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + + if (val.val.u8 != brightnessLevel) { + val.val.u8 = brightnessLevel; + attribute::update(endpoint_id, LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, &val); + } + return true; +} + +uint8_t MatterEnhancedColorLight::getBrightness() { + return brightnessLevel; +} + +bool MatterEnhancedColorLight::setColorTemperature(uint16_t newTemperature) { + if (!started) { + log_w("Matter Enhanced ColorLight device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (colorTemperatureLevel == newTemperature) { + return true; + } + + colorTemperatureLevel = newTemperature; + + endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); + cluster_t *cluster = cluster::get(endpoint, ColorControl::Id); + attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::ColorTemperatureMireds::Id); + + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + + if (val.val.u16 != colorTemperatureLevel) { + val.val.u16 = colorTemperatureLevel; + attribute::update(endpoint_id, ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id, &val); + } + return true; +} + +uint16_t MatterEnhancedColorLight::getColorTemperature() { + return colorTemperatureLevel; +} + +bool MatterEnhancedColorLight::setColorRGB(espRgbColor_t _rgbColor) { + return setColorHSV(espRgbColorToHsvColor(_rgbColor)); +} + +espRgbColor_t MatterEnhancedColorLight::getColorRGB() { + return espHsvColorToRgbColor(colorHSV); +} + +bool MatterEnhancedColorLight::setColorHSV(espHsvColor_t _hsvColor) { + + if (!started) { + log_w("Matter Enhanced ColorLight device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (colorHSV.h == _hsvColor.h && colorHSV.s == _hsvColor.s && colorHSV.v == _hsvColor.v) { + return true; + } + + colorHSV = {_hsvColor.h, _hsvColor.s, _hsvColor.v}; + + endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); + cluster_t *cluster = cluster::get(endpoint, ColorControl::Id); + // update hue + attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::CurrentHue::Id); + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + if (val.val.u8 != colorHSV.h) { + val.val.u8 = colorHSV.h; + attribute::update(endpoint_id, ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, &val); + } + // update saturation + attribute = attribute::get(cluster, ColorControl::Attributes::CurrentSaturation::Id); + val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + if (val.val.u8 != colorHSV.s) { + val.val.u8 = colorHSV.s; + attribute::update(endpoint_id, ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id, &val); + } + // update value (brightness) + cluster = cluster::get(endpoint, LevelControl::Id); + attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id); + val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + if (val.val.u8 != colorHSV.v) { + val.val.u8 = colorHSV.v; + attribute::update(endpoint_id, LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, &val); + } + return true; +} + +espHsvColor_t MatterEnhancedColorLight::getColorHSV() { + return colorHSV; +} + +MatterEnhancedColorLight::operator bool() { + return getOnOff(); +} + +void MatterEnhancedColorLight::operator=(bool newState) { + setOnOff(newState); +} +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h new file mode 100644 index 00000000000..66ed1943b8d --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h @@ -0,0 +1,102 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +class MatterEnhancedColorLight : public MatterEndPoint { +public: + static const uint8_t MAX_BRIGHTNESS = 255; + static const uint16_t MAX_COLOR_TEMPERATURE = 500; + static const uint16_t MIN_COLOR_TEMPERATURE = 100; + + MatterEnhancedColorLight(); + ~MatterEnhancedColorLight(); + // default initial state is off, brightness = 25 (10%), HSV(21, 216, 25), color temperature is 454 (Warm White) + virtual bool begin(bool initialState = false, espHsvColor_t colorHSV = {21, 216, 25}, uint8_t newBrightness = 25, uint16_t colorTemperature = 454); + // this will just stop processing Light Matter events + void end(); + + bool setOnOff(bool newState); // returns true if successful + bool getOnOff(); // returns current light state + bool toggle(); // returns true if successful + + bool setColorTemperature(uint16_t newTemperature); // returns true if successful + uint16_t getColorTemperature(); // returns current temperature + + bool setBrightness(uint8_t newBrightness); // returns true if successful + uint8_t getBrightness(); // returns current brightness + + bool setColorRGB(espRgbColor_t rgbColor); // returns true if successful + espRgbColor_t getColorRGB(); // returns current RGB Color + bool setColorHSV(espHsvColor_t hsvColor); // returns true if successful + espHsvColor_t getColorHSV(); // returns current HSV Color + + // used to update the state of the light using the current Matter Light internal state + // It is necessary to set a user callback function using onChange() to handle the physical light state + void updateAccessory(); + + operator bool(); // returns current on/off light state + void operator=(bool state); // turns light on or off + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + + // User Callback for whenever the Light On/Off state is changed by the Matter Controller + using EndPointOnOffCB = std::function; + void onChangeOnOff(EndPointOnOffCB onChangeCB) { + _onChangeOnOffCB = onChangeCB; + } + + // User Callback for whenever the Light brightness value [0..255] is changed by the Matter Controller + using EndPointBrightnessCB = std::function; + void onChangeBrightness(EndPointBrightnessCB onChangeCB) { + _onChangeBrightnessCB = onChangeCB; + } + + // User Callback for whenever the HSV Color value is changed by the Matter Controller + using EndPointRGBColorCB = std::function; + void onChangeColorHSV(EndPointRGBColorCB onChangeCB) { + _onChangeColorCB = onChangeCB; + } + + // User Callbqck for whenever the Light temperature value is changed by the Matter Controller + using EndPointTemperatureCB = std::function; + void onChangeColorTemperature(EndPointTemperatureCB onChangeCB) { + _onChangeTemperatureCB = onChangeCB; + } + + // User Callback for whenever any parameter is changed by the Matter Controller + using EndPointCB = std::function; + void onChange(EndPointCB onChangeCB) { + _onChangeCB = onChangeCB; + } + +protected: + bool started = false; + bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) + uint8_t brightnessLevel = 0; // default initial brightness is 0, but it can be changed by begin(bool, uint8_t) + espHsvColor_t colorHSV = {0}; // default initial color HSV is black, but it can be changed by begin(bool, uint8_t, espHsvColor_t) + uint16_t colorTemperatureLevel = 0; // default initial color temperature is 0, but it can be changed by begin(bool, uint8_t, espHsvColor_t, uint16_t) + EndPointOnOffCB _onChangeOnOffCB = NULL; + EndPointBrightnessCB _onChangeBrightnessCB = NULL; + EndPointRGBColorCB _onChangeColorCB = NULL; + EndPointTemperatureCB _onChangeTemperatureCB = NULL; + EndPointCB _onChangeCB = NULL; +}; +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From af84da6f6aa9db3ea6a74a3e734aa43574e72508 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 3 Dec 2024 03:08:51 -0300 Subject: [PATCH 027/183] feat(matter): Adds a new Matter Endpoint: Generic Switch (smart button) (#10662) * feat(matter): adds new matter generic switch endpoint * fix(matter): no need of arduino preferences here * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- CMakeLists.txt | 1 + .../MatterSmartButon/MatterSmartButon.ino | 115 ++++++++++++++++++ .../Matter/examples/MatterSmartButon/ci.json | 7 ++ libraries/Matter/keywords.txt | 3 +- libraries/Matter/src/Matter.h | 2 + .../MatterEndpoints/MatterGenericSwitch.cpp | 100 +++++++++++++++ .../src/MatterEndpoints/MatterGenericSwitch.h | 39 ++++++ 7 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino create mode 100644 libraries/Matter/examples/MatterSmartButon/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9bbef502143..59035e50774 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -168,6 +168,7 @@ set(ARDUINO_LIBRARY_OpenThread_SRCS libraries/OpenThread/src/OThreadCLI_Util.cpp) set(ARDUINO_LIBRARY_Matter_SRCS + libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp diff --git a/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino b/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino new file mode 100644 index 00000000000..1d71f2123a6 --- /dev/null +++ b/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino @@ -0,0 +1,115 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Generic Switch Endpoint - works as a smart button with a single click +MatterGenericSwitch SmartButton; + +// set your board USER BUTTON pin here +const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9. + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +void setup() { + // Initialize the USER BUTTON (Boot button) GPIO that will act as a toggle switch + pinMode(buttonPin, INPUT_PULLUP); + + Serial.begin(115200); + while (!Serial) { + delay(100); + } + + // We start by connecting to a WiFi network + Serial.print("Connecting to "); + Serial.println(ssid); + // enable IPv6 + WiFi.enableIPv6(true); + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println("\r\nWiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + delay(500); + + // Initialize the Matter EndPoint + SmartButton.begin(); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + // This may be a restart of a already commissioned Matter accessory + if (Matter.isDeviceCommissioned()) { + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } +} +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the Matter Fabric + +void loop() { + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Generic Switch Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } + + // A builtin button is used to trigger a command to the Matter Controller + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + // Onboard User Button is used as a smart button or to decommission it + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > debouceTime && digitalRead(buttonPin) == HIGH) { + button_state = false; // released + // builtin button is released - send a click event to the Matter Controller + Serial.println("User button released. Sending Click to the Matter Controller!"); + // Matter Controller will receive an event and, if programmed, it will trigger an action + SmartButton.click(); + + // Factory reset is triggered if the button is pressed longer than 10 seconds + if (time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Generic Switch Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + } + } +} diff --git a/libraries/Matter/examples/MatterSmartButon/ci.json b/libraries/Matter/examples/MatterSmartButon/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterSmartButon/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index 663cc2e8327..597bbac657b 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -8,6 +8,7 @@ Matter KEYWORD1 ArduinoMatter KEYWORD1 +MatterGenericSwitch KEYWORD1 MatterOnOffLight KEYWORD1 MatterDimmableLight KEYWORD1 MatterColorTemperatureLight KEYWORD1 @@ -46,7 +47,7 @@ onChangeOnOff KEYWORD2 onChangeBrightness KEYWORD2 onChangeColorTemperature KEYWORD2 onChangeColorHSV KEYWORD2 - +click KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index 5c68572640a..9136eead048 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,7 @@ class ArduinoMatter { static void decommission(); // list of Matter EndPoints Friend Classes + friend class MatterGenericSwitch; friend class MatterOnOffLight; friend class MatterDimmableLight; friend class MatterColorTemperatureLight; diff --git a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp new file mode 100644 index 00000000000..f5c6c9d750f --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp @@ -0,0 +1,100 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace esp_matter::cluster; +using namespace chip::app::Clusters; + +MatterGenericSwitch::MatterGenericSwitch() {} + +MatterGenericSwitch::~MatterGenericSwitch() { + end(); +} + +bool MatterGenericSwitch::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { + if (!started) { + log_e("Matter Generic Switch device has not begun."); + return false; + } + + log_d("Generic Switch Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); + return true; +} + +bool MatterGenericSwitch::begin() { + ArduinoMatter::_init(); + generic_switch::config_t switch_config; + + // endpoint handles can be used to add/modify clusters. + endpoint_t *endpoint = generic_switch::create(node::get(), &switch_config, ENDPOINT_FLAG_NONE, (void *)this); + if (endpoint == nullptr) { + log_e("Failed to create Generic swtich endpoint"); + return false; + } + // Add group cluster to the switch endpoint + cluster::groups::config_t groups_config; + cluster::groups::create(endpoint, &groups_config, CLUSTER_FLAG_SERVER | CLUSTER_FLAG_CLIENT); + + cluster_t *aCluster = cluster::get(endpoint, Descriptor::Id); + esp_matter::cluster::descriptor::feature::taglist::add(aCluster); + + cluster::fixed_label::config_t fl_config; + cluster::fixed_label::create(endpoint, &fl_config, CLUSTER_FLAG_SERVER); + + cluster::user_label::config_t ul_config; + cluster::user_label::create(endpoint, &ul_config, CLUSTER_FLAG_SERVER); + + aCluster = cluster::get(endpoint, Switch::Id); + switch_cluster::feature::momentary_switch::add(aCluster); + switch_cluster::event::create_initial_press(aCluster); + + switch_cluster::feature::momentary_switch::add(aCluster); + + switch_cluster::attribute::create_current_position(aCluster, 0); + switch_cluster::attribute::create_number_of_positions(aCluster, 2); + + setEndPointId(endpoint::get_id(endpoint)); + log_i("Generic Switch created with endpoint_id %d", getEndPointId()); + started = true; + return true; +} + +void MatterGenericSwitch::end() { + started = false; +} + +void MatterGenericSwitch::click() { + if (!started) { + log_e("Matter Generic Switch device has not begun."); + return; + } + + int switch_endpoint_id = getEndPointId(); + uint8_t newPosition = 1; + // Press moves Position from 0 (off) to 1 (on) + chip::DeviceLayer::SystemLayer().ScheduleLambda([switch_endpoint_id, newPosition]() { + // InitialPress event takes newPosition as event data + switch_cluster::event::send_initial_press(switch_endpoint_id, newPosition); + }); +} + +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h new file mode 100644 index 00000000000..14118462932 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h @@ -0,0 +1,39 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +// Matter Generic Switch Endpoint that works as a single click smart button +class MatterGenericSwitch : public MatterEndPoint { +public: + MatterGenericSwitch(); + ~MatterGenericSwitch(); + virtual bool begin(); + void end(); // this will just stop processing Matter events + + // send a simple click event to the Matter Controller + void click(); + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + +protected: + bool started = false; +}; +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From 6ce43695d2591e600dc906eeb9e30a9ca3c71921 Mon Sep 17 00:00:00 2001 From: Sylvain Quendez Date: Tue, 3 Dec 2024 15:10:51 +0100 Subject: [PATCH 028/183] BLECharacteristic optimization (#10665) * BLECharacteristic::notify() optimization GeneralUtils::hexDump() doesn't output anything if the log level is not "VERBOSE". Additionally, it is very CPU intensive, even when it doesn't output anything. So it is much better to *not* call it at all if not needed. In a simple program which calls BLECharacteristic::notify() every 50 ms, the performance gain of this little optimization is 37% in release mode (-O3) and 57% in debug mode. Of course, the "#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE" guard could also be put inside the GeneralUtils::hexDump() function itself. But it's better to put it here also, as it is clearer (indicating a verbose log thing) and it allows to remove the "m_value.getValue().c_str()" call, which is in itself quite CPU intensive. * BLECharacteristic optimization Calls to BLEUtils::buildHexData() don't output anything when the log level is not "VERBOSE" or "DEBUG". As this function is quite CPU intensive, it is better to not call it when not needed. --- libraries/BLE/src/BLECharacteristic.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/libraries/BLE/src/BLECharacteristic.cpp b/libraries/BLE/src/BLECharacteristic.cpp index 1d1bafdda1c..b03d524a6a5 100644 --- a/libraries/BLE/src/BLECharacteristic.cpp +++ b/libraries/BLE/src/BLECharacteristic.cpp @@ -279,9 +279,13 @@ void BLECharacteristic::handleGATTServerEvent(esp_gatts_cb_event_t event, esp_ga log_d(" - Response to write event: New value: handle: %.2x, uuid: %s", getHandle(), getUUID().toString().c_str()); +// The call to BLEUtils::buildHexData() doesn't output anything if the log level is not +// "DEBUG". As it is quite CPU intensive, it is much better to not call it if not needed. +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG char *pHexData = BLEUtils::buildHexData(nullptr, param->write.value, param->write.len); log_d(" - Data: length: %d, data: %s", param->write.len, pHexData); free(pHexData); +#endif if (param->write.need_rsp) { esp_gatt_rsp_t rsp; @@ -390,9 +394,13 @@ void BLECharacteristic::handleGATTServerEvent(esp_gatts_cb_event_t event, esp_ga rsp.attr_value.handle = param->read.handle; rsp.attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE; +// The call to BLEUtils::buildHexData() doesn't output anything if the log level is not +// "DEBUG". As it is quite CPU intensive, it is much better to not call it if not needed. +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG char *pHexData = BLEUtils::buildHexData(nullptr, rsp.attr_value.value, rsp.attr_value.len); log_d(" - Data: length=%d, data=%s, offset=%d", rsp.attr_value.len, pHexData, rsp.attr_value.offset); free(pHexData); +#endif esp_err_t errRc = ::esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, ESP_GATT_OK, &rsp); if (errRc != ESP_OK) { @@ -471,7 +479,20 @@ void BLECharacteristic::notify(bool is_notification) { m_pCallbacks->onNotify(this); // Invoke the notify callback. + // GeneralUtils::hexDump() doesn't output anything if the log level is not + // "VERBOSE". Additionally, it is very CPU intensive, even when it doesn't + // output anything! So it is much better to *not* call it at all if not needed. + // In a simple program which calls BLECharacteristic::notify() every 50 ms, + // the performance gain of this little optimization is 37% in release mode + // (-O3) and 57% in debug mode. + // Of course, the "#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE" guard + // could also be put inside the GeneralUtils::hexDump() function itself. But + // it's better to put it here also, as it is clearer (indicating a verbose log + // thing) and it allows to remove the "m_value.getValue().c_str()" call, which + // is, in itself, quite CPU intensive. +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE GeneralUtils::hexDump((uint8_t *)m_value.getValue().c_str(), m_value.getValue().length()); +#endif if (getService()->getServer()->getConnectedCount() == 0) { log_v("<< notify: No connected clients."); @@ -624,9 +645,13 @@ void BLECharacteristic::setReadProperty(bool value) { * @param [in] length The length of the data in bytes. */ void BLECharacteristic::setValue(uint8_t *data, size_t length) { +// The call to BLEUtils::buildHexData() doesn't output anything if the log level is not +// "VERBOSE". As it is quite CPU intensive, it is much better to not call it if not needed. +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE char *pHex = BLEUtils::buildHexData(nullptr, data, length); log_v(">> setValue: length=%d, data=%s, characteristic UUID=%s", length, pHex, getUUID().toString().c_str()); free(pHex); +#endif if (length > ESP_GATT_MAX_ATTR_LEN) { log_e("Size %d too large, must be no bigger than %d", length, ESP_GATT_MAX_ATTR_LEN); return; From c7022caeda46c216bb2a00081deb9810d66f33ed Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 3 Dec 2024 14:35:13 -0300 Subject: [PATCH 029/183] Remove 3rd party references in code and documentation (#10666) * feat(support): documentation adjustment * feat(support): readme files, commentaries and examples * fix(template): Fix Issue Report Template ----------------------------- Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/Issue-report.yml | 2 +- docs/_static/logo_pio.png | Bin 25979 -> 0 bytes docs/en/getting_started.rst | 11 +- docs/en/installing.rst | 87 ------ docs/en/tutorials/blink.rst | 3 +- .../FreeRTOS/BasicMultiThreading/README.md | 4 - .../ESP32/examples/FreeRTOS/Mutex/README.md | 4 - .../ESP32/examples/FreeRTOS/Queue/README.md | 4 - .../examples/FreeRTOS/Semaphore/README.md | 4 - .../Legacy_RMT_Driver_Compatible.ino | 1 - .../Template/ExampleTemplate/README.md | 4 - .../examples/LITTLEFS_PlatformIO/.gitignore | 4 - .../examples/LITTLEFS_PlatformIO/README.md | 68 ----- .../LITTLEFS_PlatformIO/data/file1.txt | 1 - .../data/testfolder/test2.txt | 1 - .../include/.placeholder.txt | 0 .../LITTLEFS_PlatformIO/lib/.placeholder.txt | 0 .../LITTLEFS_PlatformIO/partitions_custom.csv | 6 - .../LITTLEFS_PlatformIO/platformio.ini | 22 -- .../examples/LITTLEFS_PlatformIO/src/main.cpp | 286 ------------------ libraries/NetworkClientSecure/README.md | 20 +- .../examples/MultiHomedServers/README.md | 4 - .../WiFi/examples/FTM/FTM_Initiator/README.md | 4 - .../WiFi/examples/FTM/FTM_Responder/README.md | 4 - libraries/WiFi/examples/WiFiClient/README.md | 4 - .../WiFi/examples/WiFiClientConnect/README.md | 4 - libraries/WiFi/examples/WiFiScan/README.md | 4 - .../WiFi/examples/WiFiScanAsync/README.md | 4 - .../examples/WiFiScanDualAntenna/README.md | 4 - .../WiFi/examples/WiFiScanTime/README.md | 4 - 30 files changed, 10 insertions(+), 558 deletions(-) delete mode 100644 docs/_static/logo_pio.png delete mode 100644 libraries/LittleFS/examples/LITTLEFS_PlatformIO/.gitignore delete mode 100644 libraries/LittleFS/examples/LITTLEFS_PlatformIO/README.md delete mode 100644 libraries/LittleFS/examples/LITTLEFS_PlatformIO/data/file1.txt delete mode 100644 libraries/LittleFS/examples/LITTLEFS_PlatformIO/data/testfolder/test2.txt delete mode 100644 libraries/LittleFS/examples/LITTLEFS_PlatformIO/include/.placeholder.txt delete mode 100644 libraries/LittleFS/examples/LITTLEFS_PlatformIO/lib/.placeholder.txt delete mode 100644 libraries/LittleFS/examples/LITTLEFS_PlatformIO/partitions_custom.csv delete mode 100644 libraries/LittleFS/examples/LITTLEFS_PlatformIO/platformio.ini delete mode 100644 libraries/LittleFS/examples/LITTLEFS_PlatformIO/src/main.cpp diff --git a/.github/ISSUE_TEMPLATE/Issue-report.yml b/.github/ISSUE_TEMPLATE/Issue-report.yml index d5b756085c7..acbd9a3c29a 100644 --- a/.github/ISSUE_TEMPLATE/Issue-report.yml +++ b/.github/ISSUE_TEMPLATE/Issue-report.yml @@ -75,7 +75,7 @@ body: attributes: label: IDE Name description: What IDE are you using? - placeholder: eg. Arduino IDE, PlatformIO, Sloeber... + placeholder: eg. Arduino IDE, VSCode, Sloeber... validations: required: true - type: input diff --git a/docs/_static/logo_pio.png b/docs/_static/logo_pio.png deleted file mode 100644 index a64c156396481be375fd126891d10c7e9d395488..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25979 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 z 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 u-4oHfQ(EkSuz*$f~g|xf?0000`_ for more details on how to install the Arduino ESP32 support. diff --git a/docs/en/installing.rst b/docs/en/installing.rst index ec405b3552c..d5392d4b5ec 100644 --- a/docs/en/installing.rst +++ b/docs/en/installing.rst @@ -63,92 +63,6 @@ To start the installation process using the Boards Manager, follow these steps: - Restart Arduino IDE. -Installing using PlatformIO ---------------------------- - -.. figure:: ../_static/logo_pio.png - :align: center - :width: 200 - :figclass: align-center - -PlatformIO is a professional collaborative platform for embedded development. It has out-of-the-box support for ESP32 SoCs and allows working with Arduino ESP32 as well as ESP-IDF from Espressif without changing your development environment. PlatformIO includes lots of instruments for the most common development tasks such as debugging, unit testing, and static code analysis. - -.. warning:: Integration of the Arduino Core ESP32 project in PlatformIO is maintained by PlatformIO developers. Arduino Core ESP32 Project Team cannot support PlatformIO-specific issues. Please report these issues in official `PlatformIO repositories `_. - -A detailed overview of the PlatformIO ecosystem and its philosophy can be found in `the official documentation `_. - -PlatformIO can be used in two flavors: - -- `PlatformIO IDE `_ is a toolset for embedded C/C++ development available on Windows, macOS and Linux platforms - -- `PlatformIO Core (CLI) `_ is a command-line tool that consists of a multi-platform build system, platform and library managers and other integration components. It can be used with a variety of code development environments and allows integration with cloud platforms and web services - -To install PlatformIO, you can follow this Getting Started, provided at `docs.platformio.org`_. - -Using the stable code -********************* - -.. note:: - A detailed overview of supported development boards, examples and frameworks can be found on `the official Espressif32 dev-platform page `_ in the PlatformIO Registry. - -The most reliable and easiest way to get started is to use the latest stable version of the ESP32 development platform that passed all tests/verifications and can be used in production. - -Create a new project and select one of the available boards. You can change after by changing the `platformio.ini `_ file. - -- For ESP32 - -.. code-block:: bash - - [env:esp32dev] - platform = espressif32 - board = esp32dev - framework = arduino - -- For ESP32-S2 (ESP32-S2-Saola-1 board) - -.. code-block:: bash - - [env:esp32-s2-saola-1] - platform = espressif32 - board = esp32-s2-saola-1 - framework = arduino - -- For ESP32-C3 (ESP32-C3-DevKitM-1 board) - -.. code-block:: bash - - [env:esp32-c3-devkitm-1] - platform = espressif32 - board = esp32-c3-devkitm-1 - framework = arduino - -How to update to the latest code -******************************** - -To test the latest Arduino ESP32, you need to change your project *platformio.ini* accordingly. -The following configuration uses the upstream version of the Espressif development platform and the latest Arduino core directly from the Espressif GitHub repository: - -.. code-block:: bash - - [env:esp32-c3-devkitm-1] - platform = https://github.com/platformio/platform-espressif32.git - board = esp32-c3-devkitm-1 - framework = arduino - platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32#master - - -To get more information about PlatformIO, see the following links: - -- `PlatformIO Core (CLI) `_ - -- `PlatformIO Home `_ - -- `Tutorials and Examples `_ - -- `Library Management `_ - - Windows (manual installation) ----------------------------- @@ -360,4 +274,3 @@ Where ``~/Documents/Arduino`` represents your sketch book location as per "Ardui - Restart Arduino IDE. .. _Arduino.cc: https://www.arduino.cc/en/Main/Software -.. _docs.platformio.org: https://docs.platformio.org/en/latest/integration/ide/pioide.html diff --git a/docs/en/tutorials/blink.rst b/docs/en/tutorials/blink.rst index b5f6a767f8d..f4a53ec945d 100644 --- a/docs/en/tutorials/blink.rst +++ b/docs/en/tutorials/blink.rst @@ -7,7 +7,7 @@ Introduction This is the interactive blink tutorial using `Wokwi`_. For this tutorial, you don't need the ESP32 board or the Arduino toolchain. -.. note:: If you don't want to use this tutorial with the simulation, you can copy and paste the :ref:`blink_example_code` from `Wokwi`_ editor and use it on the `Arduino IDE`_ or `PlatformIO`_. +.. note:: If you don't want to use this tutorial with the simulation, you can copy and paste the :ref:`blink_example_code` from `Wokwi`_ editor and use it on the `Arduino IDE`. About this Tutorial ------------------- @@ -109,5 +109,4 @@ Resources .. _ESP32 Datasheet: https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf .. _Wokwi: https://wokwi.com/ -.. _PlatformIO: https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html#platformio .. _Arduino IDE: https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html#installing-using-boards-manager diff --git a/libraries/ESP32/examples/FreeRTOS/BasicMultiThreading/README.md b/libraries/ESP32/examples/FreeRTOS/BasicMultiThreading/README.md index 7bd44855adc..f48e352dd45 100644 --- a/libraries/ESP32/examples/FreeRTOS/BasicMultiThreading/README.md +++ b/libraries/ESP32/examples/FreeRTOS/BasicMultiThreading/README.md @@ -62,10 +62,6 @@ To get more information about the Espressif boards see [Espressif Development Ki * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or set the `upload_port` option on the `platformio.ini` file. - ## Troubleshooting ***Important: Make sure you are using a good quality USB cable and that you have a reliable power source*** diff --git a/libraries/ESP32/examples/FreeRTOS/Mutex/README.md b/libraries/ESP32/examples/FreeRTOS/Mutex/README.md index d1c8c19e3be..435528bd771 100644 --- a/libraries/ESP32/examples/FreeRTOS/Mutex/README.md +++ b/libraries/ESP32/examples/FreeRTOS/Mutex/README.md @@ -51,10 +51,6 @@ To get more information about the Espressif boards see [Espressif Development Ki * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or set the `upload_port` option on the `platformio.ini` file. - ## Example Log Output The expected output of shared variables protected by mutex demonstrates mutually exclusive access from tasks - they do not interrupt each other and do not rewrite the value before the other task has read it back. diff --git a/libraries/ESP32/examples/FreeRTOS/Queue/README.md b/libraries/ESP32/examples/FreeRTOS/Queue/README.md index 745ce9e8db6..e81d6741e2a 100644 --- a/libraries/ESP32/examples/FreeRTOS/Queue/README.md +++ b/libraries/ESP32/examples/FreeRTOS/Queue/README.md @@ -29,10 +29,6 @@ To get more information about the Espressif boards see [Espressif Development Ki * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or set the `upload_port` option on the `platformio.ini` file. - ## Example Log Output ``` diff --git a/libraries/ESP32/examples/FreeRTOS/Semaphore/README.md b/libraries/ESP32/examples/FreeRTOS/Semaphore/README.md index 8f860a52db5..fcb38eed1d6 100644 --- a/libraries/ESP32/examples/FreeRTOS/Semaphore/README.md +++ b/libraries/ESP32/examples/FreeRTOS/Semaphore/README.md @@ -35,10 +35,6 @@ To get more information about the Espressif boards see [Espressif Development Ki * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or set the `upload_port` option on the `platformio.ini` file. - ## Example Log Output ``` diff --git a/libraries/ESP32/examples/RMT/Legacy_RMT_Driver_Compatible/Legacy_RMT_Driver_Compatible.ino b/libraries/ESP32/examples/RMT/Legacy_RMT_Driver_Compatible/Legacy_RMT_Driver_Compatible.ino index 5744cf884a7..b42fe15f0cd 100644 --- a/libraries/ESP32/examples/RMT/Legacy_RMT_Driver_Compatible/Legacy_RMT_Driver_Compatible.ino +++ b/libraries/ESP32/examples/RMT/Legacy_RMT_Driver_Compatible/Legacy_RMT_Driver_Compatible.ino @@ -12,7 +12,6 @@ // add the file "build_opt.h" to your Arduino project folder with "-DESP32_ARDUINO_NO_RGB_BUILTIN" to use the RMT Legacy driver #error "ESP32_ARDUINO_NO_RGB_BUILTIN is not defined, this example is intended to demonstrate the RMT Legacy driver." #error "Please add the file 'build_opt.h' with '-DESP32_ARDUINO_NO_RGB_BUILTIN' to your Arduino project folder." -#error "Another way to disable the RGB_BUILTIN is to define it in the platformio.ini file, for instance: '-D ESP32_ARDUINO_NO_RGB_BUILTIN'" #else diff --git a/libraries/ESP32/examples/Template/ExampleTemplate/README.md b/libraries/ESP32/examples/Template/ExampleTemplate/README.md index f5aa7b35e86..91b50967e9e 100644 --- a/libraries/ESP32/examples/Template/ExampleTemplate/README.md +++ b/libraries/ESP32/examples/Template/ExampleTemplate/README.md @@ -64,10 +64,6 @@ To get more information about the Espressif boards see [Espressif Development Ki * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or set the `upload_port` option on the `platformio.ini` file. - ## Example/Log Output ==(OPTIONAL)== ==*Add the log/serial output here!*== diff --git a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/.gitignore b/libraries/LittleFS/examples/LITTLEFS_PlatformIO/.gitignore deleted file mode 100644 index 653e92272d5..00000000000 --- a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.pio -.vscode -mklittlefs.exe -mklittlefs diff --git a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/README.md b/libraries/LittleFS/examples/LITTLEFS_PlatformIO/README.md deleted file mode 100644 index beed34e92f1..00000000000 --- a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/README.md +++ /dev/null @@ -1,68 +0,0 @@ -# How to run on PlatformIO IDE - -- Download and extract to this project root a **mklittlefs** executable for your OS [from a zipped binary here](https://github.com/earlephilhower/mklittlefs/releases) -- Open **LITTLEFS_PlatformIO** folder -- Run PlatformIO project task: **Upload Filesystem Image** -- Run PlatformIO project task: **Upload and Monitor** -- You will see a Serial output like: -``` ---- Miniterm on COM5 115200,8,N,1 --- ---- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- -ets Jun 8 2016 00:22:57 - -rst:0x1 (POWERON_RESET),boot:0x13 (Snfigsip: 0, SPIWP:0xee -clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 -mode:DIO, clock div:2 -load:0x3fff0018,len:4 -load:0x3fff001c,len:1044 -load:0x40078000,len:10044 -load:0x40080400,len:5872 -entry 0x400806ac -Listing directory: / - FILE: /file1.txt SIZE: 3 LAST WRITE: 2020-10-06 15:10:33 - DIR : /testfolder LAST WRITE: 2020-10-06 15:10:33 -Creating Dir: /mydir -Dir created -Writing file: /mydir/hello2.txt -- file written -Listing directory: / - FILE: /file1.txt SIZE: 3 LAST WRITE: 2020-10-06 15:10:33 - DIR : /mydir LAST WRITE: 1970-01-01 00:00:00 -Listing directory: /mydir - FILE: /mydir/hello2.txt SIZE: 6 LAST WRITE: 1970-01-01 00:00:00 - DIR : /testfolder LAST WRITE: 2020-10-06 15:10:33 -Listing directory: /testfolder - FILE: /testfolder/test2.txt SIZE: 3 LAST WRITE: 2020-10-06 15:10:33 -Deleting file: /mydir/hello2.txt -- file deleted -Removing Dir: /mydir -Dir removed -Listing directory: / - FILE: /file1.txt SIZE: 3 LAST WRITE: 2020-10-06 15:10:33 - DIR : /testfolder LAST WRITE: 2020-10-06 15:10:33 -Listing directory: /testfolder - FILE: /testfolder/test2.txt SIZE: 3 LAST WRITE: 2020-10-06 15:10:33 -Writing file: /hello.txt -- file written -Appending to file: /hello.txt -- message appended -Reading file: /hello.txt -- read from file: -Hello World! -Renaming file /hello.txt to /foo.txt -- file renamed -Reading file: /foo.txt -- read from file: -Hello World! -Deleting file: /foo.txt -- file deleted -Testing file I/O with /test.txt -- writing................................................................ - - 1048576 bytes written in 12006 ms -- reading................................................................ -- 1048576 bytes read in 547 ms -Deleting file: /test.txt -- file deleted -Test complete -``` -- If you have a module with more than 4 MB flash, you can uncomment **partitions_custom.csv** in **platformio.ini** and modify the csv file accordingly diff --git a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/data/file1.txt b/libraries/LittleFS/examples/LITTLEFS_PlatformIO/data/file1.txt deleted file mode 100644 index 72943a16fb2..00000000000 --- a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/data/file1.txt +++ /dev/null @@ -1 +0,0 @@ -aaa diff --git a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/data/testfolder/test2.txt b/libraries/LittleFS/examples/LITTLEFS_PlatformIO/data/testfolder/test2.txt deleted file mode 100644 index f761ec192d9..00000000000 --- a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/data/testfolder/test2.txt +++ /dev/null @@ -1 +0,0 @@ -bbb diff --git a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/include/.placeholder.txt b/libraries/LittleFS/examples/LITTLEFS_PlatformIO/include/.placeholder.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/lib/.placeholder.txt b/libraries/LittleFS/examples/LITTLEFS_PlatformIO/lib/.placeholder.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/partitions_custom.csv b/libraries/LittleFS/examples/LITTLEFS_PlatformIO/partitions_custom.csv deleted file mode 100644 index 97846fa59bb..00000000000 --- a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/partitions_custom.csv +++ /dev/null @@ -1,6 +0,0 @@ -# Name, Type, SubType, Offset, Size, Flags -ota_0, app, ota_0, 0x10000, 0x1A0000, -ota_1, app, ota_1, , 0x1A0000, -otadata, data, ota, 0x350000, 0x2000, -nvs, data, nvs, , 0x6000, -data, data, spiffs, , 0xA8000, diff --git a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/platformio.ini b/libraries/LittleFS/examples/LITTLEFS_PlatformIO/platformio.ini deleted file mode 100644 index dce1ac84456..00000000000 --- a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/platformio.ini +++ /dev/null @@ -1,22 +0,0 @@ -; PlatformIO Project Configuration File -; -; Build options: build flags, source filter -; Upload options: custom upload port, speed and extra flags -; Library options: dependencies, extra library storages -; Advanced options: extra scripting -; -; Please visit documentation for the other options and examples -; https://docs.platformio.org/page/projectconf.html - -[platformio] -default_envs = esp32 - -[env] -framework = arduino - -[env:esp32] -platform = espressif32 -board = esp32dev -board_build.partitions = partitions_custom.csv -monitor_filters = esp32_exception_decoder -monitor_speed = 115200 diff --git a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/src/main.cpp b/libraries/LittleFS/examples/LITTLEFS_PlatformIO/src/main.cpp deleted file mode 100644 index 5ae9e8d7dfc..00000000000 --- a/libraries/LittleFS/examples/LITTLEFS_PlatformIO/src/main.cpp +++ /dev/null @@ -1,286 +0,0 @@ -#include -#include "FS.h" -#include -#include - -/* You only need to format LittleFS the first time you run a - test or else use the LITTLEFS plugin to create a partition - https://github.com/lorol/arduino-esp32littlefs-plugin */ - -#define FORMAT_LITTLEFS_IF_FAILED true - -void listDir(fs::FS &fs, const char *dirname, uint8_t levels) { - Serial.printf("Listing directory: %s\r\n", dirname); - - File root = fs.open(dirname); - if (!root) { - Serial.println("- failed to open directory"); - return; - } - if (!root.isDirectory()) { - Serial.println(" - not a directory"); - return; - } - - File file = root.openNextFile(); - while (file) { - if (file.isDirectory()) { - Serial.print(" DIR : "); - - Serial.print(file.name()); - time_t t = file.getLastWrite(); - struct tm *tmstruct = localtime(&t); - Serial.printf( - " LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, - tmstruct->tm_min, tmstruct->tm_sec - ); - - if (levels) { - listDir(fs, file.name(), levels - 1); - } - } else { - Serial.print(" FILE: "); - Serial.print(file.name()); - Serial.print(" SIZE: "); - - Serial.print(file.size()); - time_t t = file.getLastWrite(); - struct tm *tmstruct = localtime(&t); - Serial.printf( - " LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, - tmstruct->tm_min, tmstruct->tm_sec - ); - } - file = root.openNextFile(); - } -} - -void createDir(fs::FS &fs, const char *path) { - Serial.printf("Creating Dir: %s\n", path); - if (fs.mkdir(path)) { - Serial.println("Dir created"); - } else { - Serial.println("mkdir failed"); - } -} - -void removeDir(fs::FS &fs, const char *path) { - Serial.printf("Removing Dir: %s\n", path); - if (fs.rmdir(path)) { - Serial.println("Dir removed"); - } else { - Serial.println("rmdir failed"); - } -} - -void readFile(fs::FS &fs, const char *path) { - Serial.printf("Reading file: %s\r\n", path); - - File file = fs.open(path); - if (!file || file.isDirectory()) { - Serial.println("- failed to open file for reading"); - return; - } - - Serial.println("- read from file:"); - while (file.available()) { - Serial.write(file.read()); - } - file.close(); -} - -void writeFile(fs::FS &fs, const char *path, const char *message) { - Serial.printf("Writing file: %s\r\n", path); - - File file = fs.open(path, FILE_WRITE); - if (!file) { - Serial.println("- failed to open file for writing"); - return; - } - if (file.print(message)) { - Serial.println("- file written"); - } else { - Serial.println("- write failed"); - } - file.close(); -} - -void appendFile(fs::FS &fs, const char *path, const char *message) { - Serial.printf("Appending to file: %s\r\n", path); - - File file = fs.open(path, FILE_APPEND); - if (!file) { - Serial.println("- failed to open file for appending"); - return; - } - if (file.print(message)) { - Serial.println("- message appended"); - } else { - Serial.println("- append failed"); - } - file.close(); -} - -void renameFile(fs::FS &fs, const char *path1, const char *path2) { - Serial.printf("Renaming file %s to %s\r\n", path1, path2); - if (fs.rename(path1, path2)) { - Serial.println("- file renamed"); - } else { - Serial.println("- rename failed"); - } -} - -void deleteFile(fs::FS &fs, const char *path) { - Serial.printf("Deleting file: %s\r\n", path); - if (fs.remove(path)) { - Serial.println("- file deleted"); - } else { - Serial.println("- delete failed"); - } -} - -// SPIFFS-like write and delete file - -// See: https://github.com/esp8266/Arduino/blob/master/libraries/LittleFS/src/LittleFS.cpp#L60 -void writeFile2(fs::FS &fs, const char *path, const char *message) { - if (!fs.exists(path)) { - if (strchr(path, '/')) { - Serial.printf("Create missing folders of: %s\r\n", path); - char *pathStr = strdup(path); - if (pathStr) { - char *ptr = strchr(pathStr, '/'); - while (ptr) { - *ptr = 0; - fs.mkdir(pathStr); - *ptr = '/'; - ptr = strchr(ptr + 1, '/'); - } - } - free(pathStr); - } - } - - Serial.printf("Writing file to: %s\r\n", path); - File file = fs.open(path, FILE_WRITE); - if (!file) { - Serial.println("- failed to open file for writing"); - return; - } - if (file.print(message)) { - Serial.println("- file written"); - } else { - Serial.println("- write failed"); - } - file.close(); -} - -// See: https://github.com/esp8266/Arduino/blob/master/libraries/LittleFS/src/LittleFS.h#L149 -void deleteFile2(fs::FS &fs, const char *path) { - Serial.printf("Deleting file and empty folders on path: %s\r\n", path); - - if (fs.remove(path)) { - Serial.println("- file deleted"); - } else { - Serial.println("- delete failed"); - } - - char *pathStr = strdup(path); - if (pathStr) { - char *ptr = strrchr(pathStr, '/'); - if (ptr) { - Serial.printf("Removing all empty folders on path: %s\r\n", path); - } - while (ptr) { - *ptr = 0; - fs.rmdir(pathStr); - ptr = strrchr(pathStr, '/'); - } - free(pathStr); - } -} - -void testFileIO(fs::FS &fs, const char *path) { - Serial.printf("Testing file I/O with %s\r\n", path); - - static uint8_t buf[512]; - size_t len = 0; - File file = fs.open(path, FILE_WRITE); - if (!file) { - Serial.println("- failed to open file for writing"); - return; - } - - size_t i; - Serial.print("- writing"); - uint32_t start = millis(); - for (i = 0; i < 2048; i++) { - if ((i & 0x001F) == 0x001F) { - Serial.print("."); - } - file.write(buf, 512); - } - Serial.println(""); - uint32_t end = millis() - start; - Serial.printf(" - %u bytes written in %u ms\r\n", 2048 * 512, end); - file.close(); - - file = fs.open(path); - start = millis(); - end = start; - i = 0; - if (file && !file.isDirectory()) { - len = file.size(); - size_t flen = len; - start = millis(); - Serial.print("- reading"); - while (len) { - size_t toRead = len; - if (toRead > 512) { - toRead = 512; - } - file.read(buf, toRead); - if ((i++ & 0x001F) == 0x001F) { - Serial.print("."); - } - len -= toRead; - } - Serial.println(""); - end = millis() - start; - Serial.printf("- %u bytes read in %u ms\r\n", flen, end); - file.close(); - } else { - Serial.println("- failed to open file for reading"); - } -} - -void setup() { - Serial.begin(115200); - if (!LittleFS.begin(FORMAT_LITTLEFS_IF_FAILED)) { - Serial.println("LittleFS Mount Failed"); - return; - } - - listDir(LittleFS, "/", 0); - createDir(LittleFS, "/mydir"); - writeFile(LittleFS, "/mydir/hello2.txt", "Hello2"); - //writeFile(LittleFS, "/mydir/newdir2/newdir3/hello3.txt", "Hello3"); - writeFile2(LittleFS, "/mydir/newdir2/newdir3/hello3.txt", "Hello3"); - listDir(LittleFS, "/", 3); - deleteFile(LittleFS, "/mydir/hello2.txt"); - //deleteFile(LittleFS, "/mydir/newdir2/newdir3/hello3.txt"); - deleteFile2(LittleFS, "/mydir/newdir2/newdir3/hello3.txt"); - removeDir(LittleFS, "/mydir"); - listDir(LittleFS, "/", 3); - writeFile(LittleFS, "/hello.txt", "Hello "); - appendFile(LittleFS, "/hello.txt", "World!\r\n"); - readFile(LittleFS, "/hello.txt"); - renameFile(LittleFS, "/hello.txt", "/foo.txt"); - readFile(LittleFS, "/foo.txt"); - deleteFile(LittleFS, "/foo.txt"); - testFileIO(LittleFS, "/test.txt"); - deleteFile(LittleFS, "/test.txt"); - - Serial.println("Test complete"); -} - -void loop() {} diff --git a/libraries/NetworkClientSecure/README.md b/libraries/NetworkClientSecure/README.md index d028158730d..f83cf246287 100644 --- a/libraries/NetworkClientSecure/README.md +++ b/libraries/NetworkClientSecure/README.md @@ -32,25 +32,11 @@ This method is similar to the single root certificate verification above, but it root certificates from Mozilla to authenticate against, while the previous method only accepts a single certificate for a given server. This allows the client to connect to all public SSL servers. -To use this feature in PlatformIO: -1. create a certificate bundle as described in the document below, or obtain a pre-built one you trust: -https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/protocols/esp_crt_bundle.html -(gen_crt_bundle.py can be found in the /tools folder) - a. note: the full bundle will take up around 64k of flash space, but has minimal RAM usage, as only - the index of the certificates is kept in RAM -2. Place the bundle under the file name "data/cert/x509_crt_bundle.bin" in your platformio project -3. add "board_build.embed_files = data/cert/x509_crt_bundle.bin" in your platformio.ini -4. add the following global declaration in your project: - extern const uint8_t rootca_crt_bundle_start[] asm("_binary_data_cert_x509_crt_bundle_bin_start"); -5. before initiating the first SSL connection, call - my_client.setCACertBundle(rootca_crt_bundle_start); - To use this feature in Arduino IDE: If the Arduino IDE added support for embedding files in the meantime, then follow the instructions above. -If not, you have three choices: -1. convert your project to PlatformIO -2. create a makefile where you can add the idf_component_register() declaration to include the certificate bundle -3. Store the bundle as a SPIFFS file, but then you have to load it into RAM in runtime and waste 64k of precious memory +If not, you have two choices: +1. create a makefile where you can add the idf_component_register() declaration to include the certificate bundle +2. Store the bundle as a SPIFFS file, but then you have to load it into RAM in runtime and waste 64k of precious memory Using a root CA cert and client cert/keys ----------------------------------------- diff --git a/libraries/WebServer/examples/MultiHomedServers/README.md b/libraries/WebServer/examples/MultiHomedServers/README.md index 83ec6223850..04b96dfbd53 100644 --- a/libraries/WebServer/examples/MultiHomedServers/README.md +++ b/libraries/WebServer/examples/MultiHomedServers/README.md @@ -67,10 +67,6 @@ To get more information about the Espressif boards see [Espressif Development Ki * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or set the `upload_port` option on the `platformio.ini` file. - ## Example Log Output ``` diff --git a/libraries/WiFi/examples/FTM/FTM_Initiator/README.md b/libraries/WiFi/examples/FTM/FTM_Initiator/README.md index 3558f75d372..b9c7f8d438d 100644 --- a/libraries/WiFi/examples/FTM/FTM_Initiator/README.md +++ b/libraries/WiFi/examples/FTM/FTM_Initiator/README.md @@ -55,10 +55,6 @@ To get more information about the Espressif boards see [Espressif Development Ki * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or setting the `upload_port` option on the `platformio.ini` file. - ## Log Output Expected log output: diff --git a/libraries/WiFi/examples/FTM/FTM_Responder/README.md b/libraries/WiFi/examples/FTM/FTM_Responder/README.md index feede0867f3..fdcf1ab921b 100644 --- a/libraries/WiFi/examples/FTM/FTM_Responder/README.md +++ b/libraries/WiFi/examples/FTM/FTM_Responder/README.md @@ -48,10 +48,6 @@ To get more information about the Espressif boards see [Espressif Development Ki * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or setting the `upload_port` option on the `platformio.ini` file. - ## Log Output Expected log output: diff --git a/libraries/WiFi/examples/WiFiClient/README.md b/libraries/WiFi/examples/WiFiClient/README.md index 8b6a5d9caeb..9d3698a543a 100644 --- a/libraries/WiFi/examples/WiFiClient/README.md +++ b/libraries/WiFi/examples/WiFiClient/README.md @@ -61,10 +61,6 @@ To get more information about the Espressif boards see [Espressif Development Ki * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or set the `upload_port` option on the `platformio.ini` file. - ## Example Log Output The initial output which is common for all examples can be ignored: diff --git a/libraries/WiFi/examples/WiFiClientConnect/README.md b/libraries/WiFi/examples/WiFiClientConnect/README.md index eab02b674ff..939d44c5b76 100644 --- a/libraries/WiFi/examples/WiFiClientConnect/README.md +++ b/libraries/WiFi/examples/WiFiClientConnect/README.md @@ -18,10 +18,6 @@ Currently, this example supports the following targets. * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or set the `upload_port`` option on the `platformio.ini` file. - ## Example/Log Output ``` diff --git a/libraries/WiFi/examples/WiFiScan/README.md b/libraries/WiFi/examples/WiFiScan/README.md index ec39cc6c639..f1268f21b5c 100644 --- a/libraries/WiFi/examples/WiFiScan/README.md +++ b/libraries/WiFi/examples/WiFiScan/README.md @@ -18,10 +18,6 @@ Currently, this example supports the following targets. * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or setting the `upload_port` option on the `platformio.ini` file. - ## Example/Log Output ``` diff --git a/libraries/WiFi/examples/WiFiScanAsync/README.md b/libraries/WiFi/examples/WiFiScanAsync/README.md index a557173c10f..26120aaa31c 100644 --- a/libraries/WiFi/examples/WiFiScanAsync/README.md +++ b/libraries/WiFi/examples/WiFiScanAsync/README.md @@ -18,10 +18,6 @@ Currently, this example supports the following targets. * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or setting the `upload_port` option on the `platformio.ini` file. - ## Example/Log Output ``` diff --git a/libraries/WiFi/examples/WiFiScanDualAntenna/README.md b/libraries/WiFi/examples/WiFiScanDualAntenna/README.md index f7ec7cc3ef9..9a6611149d0 100644 --- a/libraries/WiFi/examples/WiFiScanDualAntenna/README.md +++ b/libraries/WiFi/examples/WiFiScanDualAntenna/README.md @@ -17,10 +17,6 @@ This example is compatible with the ESP32-WROOM-DA. * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or set the `upload_port` option on the `platformio.ini` file. - ## Example/Log Output ``` diff --git a/libraries/WiFi/examples/WiFiScanTime/README.md b/libraries/WiFi/examples/WiFiScanTime/README.md index f56ba893925..7be0e05d4fe 100644 --- a/libraries/WiFi/examples/WiFiScanTime/README.md +++ b/libraries/WiFi/examples/WiFiScanTime/README.md @@ -18,10 +18,6 @@ Currently, this example supports the following targets. * Before Compile/Verify, select the correct board: `Tools -> Board`. * Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. -#### Using Platform IO - -* Select the COM port: `Devices` or setting the `upload_port` option on the `platformio.ini` file. - ## Example/Log Output ``` From 4eeff9bc57489f7c6b62c6152051426c015d3938 Mon Sep 17 00:00:00 2001 From: "kshitij.patil" Date: Tue, 3 Dec 2024 19:41:34 +0530 Subject: [PATCH 030/183] fix: Split provisioning into two parts for better synchronization --- .../examples/RMakerSwitch/RMakerSwitch.ino | 6 +++++ libraries/WiFiProv/src/WiFiProv.cpp | 27 ++++++++++++------- libraries/WiFiProv/src/WiFiProv.h | 7 +++++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/libraries/RainMaker/examples/RMakerSwitch/RMakerSwitch.ino b/libraries/RainMaker/examples/RMakerSwitch/RMakerSwitch.ino index 9c65881889d..21fe9cb064b 100644 --- a/libraries/RainMaker/examples/RMakerSwitch/RMakerSwitch.ino +++ b/libraries/RainMaker/examples/RMakerSwitch/RMakerSwitch.ino @@ -94,6 +94,12 @@ void setup() { RMaker.enableSystemService(SYSTEM_SERV_FLAGS_ALL, 2, 2, 2); +#if CONFIG_IDF_TARGET_ESP32S2 + WiFiProv.initProvision(NETWORK_PROV_SCHEME_SOFTAP, NETWORK_PROV_SCHEME_HANDLER_NONE); +#else + WiFiProv.initProvision(NETWORK_PROV_SCHEME_BLE, NETWORK_PROV_SCHEME_HANDLER_FREE_BTDM); +#endif + RMaker.start(); WiFi.onEvent(sysProvEvent); // Will call sysProvEvent() from another thread. diff --git a/libraries/WiFiProv/src/WiFiProv.cpp b/libraries/WiFiProv/src/WiFiProv.cpp index 55fbd473f88..fb67377a2ee 100644 --- a/libraries/WiFiProv/src/WiFiProv.cpp +++ b/libraries/WiFiProv/src/WiFiProv.cpp @@ -1,4 +1,4 @@ -/* + /* WiFiProv.cpp - WiFiProv class for provisioning All rights reserved. @@ -72,13 +72,11 @@ static void get_device_service_name(prov_scheme_t prov_scheme, char *service_nam #endif } -void WiFiProvClass ::beginProvision( - prov_scheme_t prov_scheme, scheme_handler_t scheme_handler, network_prov_security_t security, const char *pop, const char *service_name, - const char *service_key, uint8_t *uuid, bool reset_provisioned -) { - bool provisioned = false; - static char service_name_temp[32]; - +void WiFiProvClass ::initProvision(prov_scheme_t prov_scheme, scheme_handler_t scheme_handler, bool reset_provisioned) { + if (this->provInitDone) { + log_i("provInit was already done!"); + return; + } network_prov_mgr_config_t config; #if CONFIG_BLUEDROID_ENABLED if (prov_scheme == NETWORK_PROV_SCHEME_BLE) { @@ -118,11 +116,22 @@ void WiFiProvClass ::beginProvision( if (reset_provisioned) { log_i("Resetting provisioned data."); network_prov_mgr_reset_wifi_provisioning(); - } else if (network_prov_mgr_is_wifi_provisioned(&provisioned) != ESP_OK) { + } else if (network_prov_mgr_is_wifi_provisioned(&(this->provisioned)) != ESP_OK) { log_e("network_prov_mgr_is_wifi_provisioned failed!"); network_prov_mgr_deinit(); return; } + this->provInitDone = true; +} + +void WiFiProvClass ::beginProvision( + prov_scheme_t prov_scheme, scheme_handler_t scheme_handler, network_prov_security_t security, const char *pop, const char *service_name, + const char *service_key, uint8_t *uuid, bool reset_provisioned +) { + if (!this->provInitDone) { + WiFiProvClass ::initProvision( prov_scheme, scheme_handler, reset_provisioned); + } + static char service_name_temp[32]; if (provisioned == false) { #if CONFIG_BLUEDROID_ENABLED if (prov_scheme == NETWORK_PROV_SCHEME_BLE) { diff --git a/libraries/WiFiProv/src/WiFiProv.h b/libraries/WiFiProv/src/WiFiProv.h index a4a3397ed06..53af27f7c80 100644 --- a/libraries/WiFiProv/src/WiFiProv.h +++ b/libraries/WiFiProv/src/WiFiProv.h @@ -47,7 +47,14 @@ typedef enum { //Provisioning class class WiFiProvClass { +private: + bool provInitDone = false; + bool provisioned = false; public: + void initProvision( + prov_scheme_t prov_scheme = NETWORK_PROV_SCHEME_SOFTAP, scheme_handler_t scheme_handler = NETWORK_PROV_SCHEME_HANDLER_NONE, + bool reset_provisioned = false + ); void beginProvision( prov_scheme_t prov_scheme = NETWORK_PROV_SCHEME_SOFTAP, scheme_handler_t scheme_handler = NETWORK_PROV_SCHEME_HANDLER_NONE, network_prov_security_t security = NETWORK_PROV_SECURITY_1, const char *pop = "abcd1234", const char *service_name = NULL, const char *service_key = NULL, From e159bf6e4632a10ce56cbcc02a1e375456dac5bf Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 9 Dec 2024 06:27:56 -0300 Subject: [PATCH 031/183] refactor(uart): Refactor UART test to work with any number of UARTs (#10593) * refactor(uart): Refactor UART test to work with any number of UARTs Co-authored-by: Rodrigo Garcia * fix(uart): Set CPU freq on ESP32 * ci(pre-commit): Apply automatic fixes * fix(spelling): Fix codespell error --------- Co-authored-by: Rodrigo Garcia Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- tests/validation/uart/diagram.esp32.json | 24 ++ tests/validation/uart/uart.ino | 501 ++++++++++------------- 2 files changed, 240 insertions(+), 285 deletions(-) create mode 100644 tests/validation/uart/diagram.esp32.json diff --git a/tests/validation/uart/diagram.esp32.json b/tests/validation/uart/diagram.esp32.json new file mode 100644 index 00000000000..a31c06d8313 --- /dev/null +++ b/tests/validation/uart/diagram.esp32.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "author": "lucasssvaz", + "editor": "wokwi", + "parts": [ + { + "type": "board-esp32-devkit-c-v4", + "id": "esp", + "attrs": { "cpuFrequency": "40" } + } + ], + "connections": [ + [ + "esp:TX", + "$serialMonitor:RX", + "" + ], + [ + "esp:RX", + "$serialMonitor:TX", + "" + ] + ] +} diff --git a/tests/validation/uart/uart.ino b/tests/validation/uart/uart.ino index 01c449867db..27bd95da7f8 100644 --- a/tests/validation/uart/uart.ino +++ b/tests/validation/uart/uart.ino @@ -2,25 +2,20 @@ * * This test is using UART0 (Serial) only for reporting test status and helping with the auto * baudrate detection test. - * UART1 (Serial1) and UART2 (Serial2), where available, are used for testing. + * The other serials are used for testing. */ -#include -#include "HardwareSerial.h" -#include "esp_rom_gpio.h" -#include "Wire.h" - // Default pins: -// | Name | ESP32 | S2 | S3 | C3 | C6 | H2 | -// UART0 RX | SOC_RX0 | 3 | 44 | 44 | 20 | 17 | 23 | -// UART0 TX | SOC_TX0 | 1 | 43 | 43 | 21 | 16 | 24 | -// UART1 RX | RX1 | 26 | 4 | 15 | 18 | 4 | 0 | -// UART1 TX | TX1 | 27 | 5 | 16 | 19 | 5 | 1 | -// UART2 RX | RX2 | 4 | -- | 19 | -- | -- | -- | -// UART2 TX | TX2 | 25 | -- | 20 | -- | -- | -- | +// | Name | ESP32 | S2 | S3 | C3 | C6 | H2 | P4 | +// UART0 RX | SOC_RX0 | 3 | 44 | 44 | 20 | 17 | 23 | 38 | +// UART0 TX | SOC_TX0 | 1 | 43 | 43 | 21 | 16 | 24 | 37 | +// UART1 RX | RX1 | 26 | 4 | 15 | 18 | 4 | 0 | 11 | +// UART1 TX | TX1 | 27 | 5 | 16 | 19 | 5 | 1 | 10 | +// UART2 RX | RX2 | 4 | -- | 19 | -- | -- | -- | -- | +// UART2 TX | TX2 | 25 | -- | 20 | -- | -- | -- | -- | /* - * For 2 UARTS: + * For each UART: * * terminal * | ^ @@ -30,119 +25,95 @@ * report status * | * TX <---> RX - * UART1 - * - * For 3 UARTS: - * - * =====terminal====== - * ^ | ^ ^ - * | v UART0 | | - * | RX TX | - * | | - * ^ report status ^ - * | | - * | TX ---> RX | - * UART2 RX <--- TX UART1 - * + * UARTx */ -#if SOC_UART_HP_NUM == 2 -// Used for the pin swap test -#define NEW_RX1 9 -#define NEW_TX1 10 -#endif +#include +#include +#include "HardwareSerial.h" +#include "esp_rom_gpio.h" +#include "Wire.h" -// ESP32-P4 has no UART pin definition for RX2, TX2, RX3, TX3, RX4, TX4 -#ifndef RX2 -#define RX2 RX1 -#endif -#ifndef TX2 -#define TX2 RX1 -#endif +/* Utility defines */ -/* Utility global variables */ +#define TEST_UART_NUM (uart_test_configs.size()) -static String recv_msg = ""; -static int peeked_char = -1; +/* Utility classes */ -/* Utility functions */ +class UARTTestConfig { +public: + int uart_num; + HardwareSerial &serial; + int peeked_char; + int8_t default_rx_pin; + int8_t default_tx_pin; + String recv_msg; -extern int8_t uart_get_RxPin(uint8_t uart_num); -extern int8_t uart_get_TxPin(uint8_t uart_num); + UARTTestConfig(int num, HardwareSerial &serial_ref, int8_t rx_pin, int8_t tx_pin) + : uart_num(num), serial(serial_ref), peeked_char(-1), default_rx_pin(rx_pin), default_tx_pin(tx_pin), recv_msg("") {} -// This function starts all the available test UARTs -void start_serial(unsigned long baudrate = 115200) { -#if SOC_UART_HP_NUM >= 2 - Serial1.begin(baudrate); - while (!Serial1) { - delay(10); + void begin(unsigned long baudrate) { + serial.begin(baudrate, SERIAL_8N1, default_rx_pin, default_tx_pin); + while (!serial) { + delay(10); + } } -#endif -#if SOC_UART_HP_NUM >= 3 - Serial2.begin(baudrate); - while (!Serial2) { - delay(10); + void end() { + serial.end(); } -#endif -} - -// This function stops all the available test UARTs -void stop_serial(bool hard_stop = false) { -#if SOC_UART_HP_NUM >= 2 - Serial1.end(/*hard_stop*/); -#endif - -#if SOC_UART_HP_NUM >= 3 - Serial2.end(/*hard_stop*/); -#endif -} -// This function transmits a message and checks if it was received correctly -void transmit_and_check_msg(const String msg_append, bool perform_assert = true) { - delay(100); // Wait for some settings changes to take effect -#if SOC_UART_HP_NUM == 2 - Serial1.print("Hello from Serial1 (UART1) >>> via loopback >>> Serial1 (UART1) " + msg_append); - Serial1.flush(); - delay(100); - if (perform_assert) { - TEST_ASSERT_EQUAL_STRING(("Hello from Serial1 (UART1) >>> via loopback >>> Serial1 (UART1) " + msg_append).c_str(), recv_msg.c_str()); + void reset_buffers() { + recv_msg = ""; + peeked_char = -1; } -#elif SOC_UART_HP_NUM >= 3 - Serial1.print("Hello from Serial1 (UART1) >>> to >>> Serial2 (UART2) " + msg_append); - Serial1.flush(); - delay(100); - if (perform_assert) { - TEST_ASSERT_EQUAL_STRING(("Hello from Serial1 (UART1) >>> to >>> Serial2 (UART2) " + msg_append).c_str(), recv_msg.c_str()); + + void transmit_and_check_msg(const String &msg_append, bool perform_assert = true) { + reset_buffers(); + delay(100); + serial.print("Hello from Serial" + String(uart_num) + " " + msg_append); + serial.flush(); + delay(100); + if (perform_assert) { + TEST_ASSERT_EQUAL_STRING(("Hello from Serial" + String(uart_num) + " " + msg_append).c_str(), recv_msg.c_str()); + log_d("UART%d received message: %s\n", uart_num, recv_msg.c_str()); + } } - Serial2.print("Hello from Serial2 (UART2) >>> to >>> Serial1 (UART1) " + msg_append); - Serial2.flush(); - delay(100); - if (perform_assert) { - TEST_ASSERT_EQUAL_STRING(("Hello from Serial2 (UART2) >>> to >>> Serial1 (UART1) " + msg_append).c_str(), recv_msg.c_str()); + void onReceive() { + char c; + size_t available = serial.available(); + if (peeked_char == -1) { + peeked_char = serial.peek(); + } + while (available--) { + c = (char)serial.read(); + recv_msg += c; + } } -#else - log_d("No UARTs available for transmission"); - TEST_FAIL(); -#endif -} +}; + +/* Utility global variables */ + +[[maybe_unused]] +static const int NEW_RX1 = 9; +[[maybe_unused]] +static const int NEW_TX1 = 10; +std::vector uart_test_configs; + +/* Utility functions */ + +extern "C" int8_t uart_get_RxPin(uint8_t uart_num); +extern "C" int8_t uart_get_TxPin(uint8_t uart_num); /* Tasks */ // This task is used to send a message after a delay to test the auto baudrate detection void task_delayed_msg(void *pvParameters) { - HardwareSerial *selected_serial; - -#if SOC_UART_HP_NUM == 2 - selected_serial = &Serial; -#elif SOC_UART_HP_NUM >= 3 - selected_serial = &Serial1; -#endif - + HardwareSerial &selected_serial = uart_test_configs.size() == 1 ? Serial : Serial1; delay(2000); - selected_serial->println("Hello from Serial1 to detect baudrate"); - selected_serial->flush(); + selected_serial.println("Hello to detect baudrate"); + selected_serial.flush(); vTaskDelete(NULL); } @@ -150,67 +121,23 @@ void task_delayed_msg(void *pvParameters) { // This function is automatically called by unity before each test is run void setUp(void) { - start_serial(115200); -#if SOC_UART_HP_NUM == 2 - log_d("Setup internal loop-back from and back to Serial1 (UART1) TX >> Serial1 (UART1) RX"); - - Serial1.onReceive([]() { - onReceive_cb(Serial1); - }); - uart_internal_loopback(1, RX1); -#elif SOC_UART_HP_NUM >= 3 - log_d("Setup internal loop-back between Serial1 (UART1) <<--->> Serial2 (UART2)"); - - Serial1.onReceive([]() { - onReceive_cb(Serial1); - }); - Serial2.onReceive([]() { - onReceive_cb(Serial2); - }); - uart_internal_loopback(1, RX2); - uart_internal_loopback(2, RX1); -#endif + for (auto *ref : uart_test_configs) { + UARTTestConfig &config = *ref; + //log_d("Setup internal loop-back from and back to UART%d TX >> UART%d RX", config.uart_num, config.uart_num); + config.begin(115200); + config.serial.onReceive([&config]() { + config.onReceive(); + }); + uart_internal_loopback(config.uart_num, uart_get_RxPin(config.uart_num)); + } } // This function is automatically called by unity after each test is run void tearDown(void) { - stop_serial(); -} - -/* Callback functions */ - -// This is a callback function that will be activated on UART RX events -void onReceive_cb(HardwareSerial &selected_serial) { - int uart_num = -1; - char c; - - (void)uart_num; // Avoid compiler warning when debug level is set to none - - if (&selected_serial == &Serial) { - uart_num = 0; -#if SOC_UART_HP_NUM >= 2 - } else if (&selected_serial == &Serial1) { - uart_num = 1; -#endif -#if SOC_UART_HP_NUM >= 3 - } else if (&selected_serial == &Serial2) { - uart_num = 2; -#endif - } - - recv_msg = ""; - size_t available = selected_serial.available(); - - if (available != 0) { - peeked_char = selected_serial.peek(); + for (auto *ref : uart_test_configs) { + UARTTestConfig &config = *ref; + config.end(); } - - while (available--) { - c = (char)selected_serial.read(); - recv_msg += c; - } - - log_d("UART %d received message: %s\n", uart_num, recv_msg.c_str()); } /* Test functions */ @@ -219,40 +146,33 @@ void onReceive_cb(HardwareSerial &selected_serial) { void basic_transmission_test(void) { log_d("Performing basic transmission test"); - transmit_and_check_msg(""); + for (auto *ref : uart_test_configs) { + UARTTestConfig &config = *ref; + config.transmit_and_check_msg(""); + } Serial.println("Basic transmission test successful"); } // This test checks if the baudrate can be changed and if the message can be transmitted and received correctly after the change void change_baudrate_test(void) { - //Test first using the updateBaudRate method and then using the begin method - log_d("Changing baudrate to 9600"); - - //Baudrate error should be within 2% of the target baudrate - Serial1.updateBaudRate(9600); - TEST_ASSERT_UINT_WITHIN(192, 9600, Serial1.baudRate()); + for (auto *ref : uart_test_configs) { + UARTTestConfig &config = *ref; + log_d("Changing baudrate of UART%d to 9600", config.uart_num); -#if SOC_UART_HP_NUM >= 3 - Serial2.updateBaudRate(9600); - TEST_ASSERT_UINT_WITHIN(192, 9600, Serial2.baudRate()); -#endif - - log_d("Sending string using 9600 baudrate"); - transmit_and_check_msg("using 9600 baudrate"); + //Baudrate error should be within 2% of the target baudrate + config.serial.updateBaudRate(9600); + TEST_ASSERT_UINT_WITHIN(192, 9600, config.serial.baudRate()); - log_d("Changing baudrate back to 115200"); - start_serial(115200); + log_d("Sending string on UART%d using 9600 baudrate", config.uart_num); + config.transmit_and_check_msg("using 9600 baudrate"); - //Baudrate error should be within 2% of the target baudrate - TEST_ASSERT_UINT_WITHIN(2304, 115200, Serial1.baudRate()); + config.serial.begin(115200); + TEST_ASSERT_UINT_WITHIN(2304, 115200, config.serial.baudRate()); -#if SOC_UART_HP_NUM >= 3 - TEST_ASSERT_UINT_WITHIN(2304, 115200, Serial2.baudRate()); -#endif - - log_d("Sending string using 115200 baudrate"); - transmit_and_check_msg("using 115200 baudrate"); + log_d("Sending string on UART%d using 115200 baudrate", config.uart_num); + config.transmit_and_check_msg("using 115200 baudrate"); + } Serial.println("Change baudrate test successful"); } @@ -269,7 +189,7 @@ void resize_buffers_test(void) { ret = Serial1.setTxBufferSize(256); TEST_ASSERT_EQUAL(0, ret); - stop_serial(); + Serial1.end(); log_d("Trying to resize RX buffer while stopped."); ret = Serial1.setRxBufferSize(256); @@ -285,7 +205,12 @@ void resize_buffers_test(void) { // This test checks if the begin function can be called when the UART is already running void begin_when_running_test(void) { log_d("Trying to set up serial twice"); - start_serial(115200); + for (auto *ref : uart_test_configs) { + UARTTestConfig &config = *ref; + // Calling twice should not crash + config.begin(115200); + config.begin(115200); + } Serial.println("Begin when running test successful"); } @@ -293,9 +218,12 @@ void begin_when_running_test(void) { void end_when_stopped_test(void) { log_d("Trying to end serial twice"); - // Calling end(true) twice should not crash - stop_serial(true); - stop_serial(true); + for (auto *ref : uart_test_configs) { + UARTTestConfig &config = *ref; + // Calling twice should not crash + config.end(); + config.end(); + } Serial.println("End when stopped test successful"); } @@ -319,7 +247,7 @@ void enabled_uart_calls_test(void) { TEST_ASSERT_EQUAL(true, boolean_ret); log_d("Checking if Serial 1 is peekable while running"); - TEST_ASSERT_GREATER_OR_EQUAL(0, peeked_char); + TEST_ASSERT_GREATER_OR_EQUAL(0, uart_test_configs[0]->peeked_char); log_d("Checking if Serial 1 can read bytes while running"); integer_ret = Serial1.readBytes(test_buf, 1); @@ -355,7 +283,10 @@ void disabled_uart_calls_test(void) { int integer_ret; uint8_t test_buf[1]; - stop_serial(); + for (auto *ref : uart_test_configs) { + UARTTestConfig &config = *ref; + config.end(); + } log_d("Checking if Serial 1 can set the RX timeout when stopped"); boolean_ret = Serial1.setRxTimeout(1); @@ -423,44 +354,35 @@ void disabled_uart_calls_test(void) { // This test checks if the pins can be changed and if the message can be transmitted and received correctly after the change void change_pins_test(void) { - //stop_serial(); - log_d("Disabling UART loopback"); -#if SOC_UART_HP_NUM == 2 - esp_rom_gpio_connect_out_signal(SOC_RX0, SIG_GPIO_OUT_IDX, false, false); -#elif SOC_UART_HP_NUM >= 3 - esp_rom_gpio_connect_out_signal(RX1, SIG_GPIO_OUT_IDX, false, false); - esp_rom_gpio_connect_out_signal(RX2, SIG_GPIO_OUT_IDX, false, false); -#endif - - log_d("Swapping UART pins"); - -#if SOC_UART_HP_NUM == 2 - Serial1.setPins(NEW_RX1, NEW_TX1); - TEST_ASSERT_EQUAL(NEW_RX1, uart_get_RxPin(1)); - TEST_ASSERT_EQUAL(NEW_TX1, uart_get_TxPin(1)); -#elif SOC_UART_HP_NUM >= 3 - Serial1.setPins(RX2, TX2); - Serial2.setPins(RX1, TX1); - TEST_ASSERT_EQUAL(RX2, uart_get_RxPin(1)); - TEST_ASSERT_EQUAL(TX2, uart_get_TxPin(1)); - TEST_ASSERT_EQUAL(RX1, uart_get_RxPin(2)); - TEST_ASSERT_EQUAL(TX1, uart_get_TxPin(2)); -#endif - - start_serial(115200); - - log_d("Re-enabling UART loopback"); - -#if SOC_UART_HP_NUM == 2 - uart_internal_loopback(1, NEW_RX1); -#elif SOC_UART_HP_NUM >= 3 - uart_internal_loopback(1, RX1); - uart_internal_loopback(2, RX2); -#endif + for (auto *ref : uart_test_configs) { + UARTTestConfig &config = *ref; + esp_rom_gpio_connect_out_signal(config.default_rx_pin, SIG_GPIO_OUT_IDX, false, false); + } - transmit_and_check_msg("using new pins"); + log_d("Swapping UART pins and testing transmission"); + + if (TEST_UART_NUM == 1) { + UARTTestConfig &config = *uart_test_configs[0]; + config.serial.setPins(NEW_RX1, NEW_TX1); + TEST_ASSERT_EQUAL(NEW_RX1, uart_get_RxPin(config.uart_num)); + TEST_ASSERT_EQUAL(NEW_TX1, uart_get_TxPin(config.uart_num)); + + uart_internal_loopback(config.uart_num, NEW_RX1); + config.transmit_and_check_msg("using new pins"); + } else { + for (int i = 0; i < TEST_UART_NUM; i++) { + UARTTestConfig &config = *uart_test_configs[i]; + UARTTestConfig &next_uart = *uart_test_configs[(i + 1) % TEST_UART_NUM]; + config.serial.setPins(next_uart.default_rx_pin, next_uart.default_tx_pin); + TEST_ASSERT_EQUAL(uart_get_RxPin(config.uart_num), next_uart.default_rx_pin); + TEST_ASSERT_EQUAL(uart_get_TxPin(config.uart_num), next_uart.default_tx_pin); + + uart_internal_loopback(config.uart_num, next_uart.default_rx_pin); + config.transmit_and_check_msg("using new pins"); + } + } Serial.println("Change pins test successful"); } @@ -475,12 +397,15 @@ void auto_baudrate_test(void) { log_d("Stopping test serial. Using Serial2 for ESP32 and Serial1 for ESP32-S2."); -#if SOC_UART_HP_NUM == 2 - selected_serial = &Serial1; - uart_internal_loopback(0, RX1); -#elif SOC_UART_HP_NUM >= 3 - selected_serial = &Serial2; + if (TEST_UART_NUM == 1) { + selected_serial = &Serial1; + uart_internal_loopback(0, RX1); + } else { +#ifdef RX2 + selected_serial = &Serial2; + uart_internal_loopback(1, RX2); #endif + } //selected_serial->end(false); @@ -493,10 +418,10 @@ void auto_baudrate_test(void) { selected_serial->begin(0); baudrate = selected_serial->baudRate(); -#if SOC_UART_HP_NUM == 2 - Serial.end(); - Serial.begin(115200); -#endif + if (TEST_UART_NUM == 1) { + Serial.end(); + Serial.begin(115200); + } TEST_ASSERT_UINT_WITHIN(2304, 115200, baudrate); @@ -510,32 +435,23 @@ void periman_test(void) { log_d("Setting up I2C on the same pins as UART"); - Wire.begin(RX1, TX1); - -#if SOC_UART_HP_NUM >= 3 - Wire1.begin(RX2, TX2); -#endif - - recv_msg = ""; - - log_d("Trying to send message using UART with I2C enabled"); - transmit_and_check_msg("while used by I2C", false); - TEST_ASSERT_EQUAL_STRING("", recv_msg.c_str()); + for (auto *ref : uart_test_configs) { + UARTTestConfig &config = *ref; + Wire.begin(config.default_rx_pin, config.default_tx_pin); + config.recv_msg = ""; - log_d("Disabling I2C and re-enabling UART"); + log_d("Trying to send message using UART%d with I2C enabled", config.uart_num); + config.transmit_and_check_msg("while used by I2C", false); + TEST_ASSERT_EQUAL_STRING("", config.recv_msg.c_str()); - Serial1.setPins(RX1, TX1); + log_d("Disabling I2C and re-enabling UART%d", config.uart_num); -#if SOC_UART_HP_NUM >= 3 - Serial2.setPins(RX2, TX2); - uart_internal_loopback(1, RX2); - uart_internal_loopback(2, RX1); -#elif SOC_UART_HP_NUM == 2 - uart_internal_loopback(1, RX1); -#endif + config.serial.setPins(config.default_rx_pin, config.default_tx_pin); + uart_internal_loopback(config.uart_num, config.default_rx_pin); - log_d("Trying to send message using UART with I2C disabled"); - transmit_and_check_msg("while I2C is disabled"); + log_d("Trying to send message using UART%d with I2C disabled", config.uart_num); + config.transmit_and_check_msg("while I2C is disabled"); + } Serial.println("Peripheral manager test successful"); } @@ -551,8 +467,11 @@ void change_cpu_frequency_test(void) { Serial.updateBaudRate(115200); - log_d("Trying to send message with the new CPU frequency"); - transmit_and_check_msg("with new CPU frequency"); + for (auto *ref : uart_test_configs) { + UARTTestConfig &config = *ref; + log_d("Trying to send message with the new CPU frequency on UART%d", config.uart_num); + config.transmit_and_check_msg("with new CPU frequency"); + } log_d("Changing CPU frequency back to %dMHz", old_freq); Serial.flush(); @@ -560,8 +479,11 @@ void change_cpu_frequency_test(void) { Serial.updateBaudRate(115200); - log_d("Trying to send message with the original CPU frequency"); - transmit_and_check_msg("with the original CPU frequency"); + for (auto *ref : uart_test_configs) { + UARTTestConfig &config = *ref; + log_d("Trying to send message with the original CPU frequency on UART%d", config.uart_num); + config.transmit_and_check_msg("with the original CPU frequency"); + } Serial.println("Change CPU frequency test successful"); } @@ -573,30 +495,39 @@ void setup() { while (!Serial) { delay(10); } - log_d("SOC_UART_HP_NUM = %d", SOC_UART_HP_NUM); - - // Begin needs to be called before setting up the loopback because it creates the serial object - start_serial(115200); - -#if SOC_UART_HP_NUM == 2 - log_d("Setup internal loop-back from and back to Serial1 (UART1) TX >> Serial1 (UART1) RX"); - - Serial1.onReceive([]() { - onReceive_cb(Serial1); - }); - uart_internal_loopback(1, RX1); -#elif SOC_UART_HP_NUM >= 3 - log_d("Setup internal loop-back between Serial1 (UART1) <<--->> Serial2 (UART2)"); - - Serial1.onReceive([]() { - onReceive_cb(Serial1); - }); - Serial2.onReceive([]() { - onReceive_cb(Serial2); - }); - uart_internal_loopback(1, RX2); - uart_internal_loopback(2, RX1); + + uart_test_configs = { +#if SOC_UART_HP_NUM >= 2 && defined(RX1) && defined(TX1) + // inverting RX1<->TX1 because ESP32-P4 has a problem with loopback on RX1 :: GPIO11 <-- UART_TX SGINAL + new UARTTestConfig(1, Serial1, TX1, RX1), +#endif +#if SOC_UART_HP_NUM >= 3 && defined(RX2) && defined(TX2) + new UARTTestConfig(2, Serial2, RX2, TX2), +#endif +#if SOC_UART_HP_NUM >= 4 && defined(RX3) && defined(TX3) + new UARTTestConfig(3, Serial3, RX3, TX3), #endif +#if SOC_UART_HP_NUM >= 5 && defined(RX4) && defined(TX4) + new UARTTestConfig(4, Serial4, RX4, TX4) +#endif + }; + + if (TEST_UART_NUM == 0) { + log_e("This test requires at least one UART besides UART0 configured"); + abort(); + } + + log_d("TEST_UART_NUM = %d", TEST_UART_NUM); + + for (auto *ref : uart_test_configs) { + UARTTestConfig &config = *ref; + config.begin(115200); + log_d("Setup internal loop-back from and back to UART%d TX >> UART%d RX", config.uart_num, config.uart_num); + config.serial.onReceive([&config]() { + config.onReceive(); + }); + uart_internal_loopback(config.uart_num, uart_get_RxPin(config.uart_num)); + } log_d("Setup done. Starting tests"); From 77c69c38d6b36700e546441a2615a21747c548d9 Mon Sep 17 00:00:00 2001 From: PCB CUPID <123002577+pcbcupid@users.noreply.github.com> Date: Mon, 9 Dec 2024 15:11:30 +0530 Subject: [PATCH 032/183] feat (Variants) Added custom boards variants GLYPH C3, GLYPHC6 & GLYPHH2 (#10671) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added custom boards GLYPH C3, GLYPHC6 & GLYPHH2 based on ESP32C3, ESP32C6 & ESP32H2 * feat(Variants) : Added custom boards GLYPH C3, GLYPHC6 & GLYPHH2 Added custom boards variants from PCBCUPID - GLYPH C3, GLYPHC6 & GLYPHH2 based on ESP32C3, ESP32C6 & ESP32H2 * added required fix : moved the variants to end and fixed build.board * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: srini Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- boards.txt | 454 ++++++++++++++++++++++ variants/Pcbcupid_GLYPH_C3/pins_arduino.h | 43 ++ variants/Pcbcupid_GLYPH_C6/pins_arduino.h | 52 +++ variants/Pcbcupid_GLYPH_H2/pins_arduino.h | 44 +++ 4 files changed, 593 insertions(+) create mode 100644 variants/Pcbcupid_GLYPH_C3/pins_arduino.h create mode 100644 variants/Pcbcupid_GLYPH_C6/pins_arduino.h create mode 100644 variants/Pcbcupid_GLYPH_H2/pins_arduino.h diff --git a/boards.txt b/boards.txt index 817c7b7441c..d7fc48820d1 100644 --- a/boards.txt +++ b/boards.txt @@ -47051,3 +47051,457 @@ waveshare_esp32_s3_touch_amoled_191.menu.EraseFlash.all=Enabled waveshare_esp32_s3_touch_amoled_191.menu.EraseFlash.all.upload.erase_cmd=-e ############################################################## + + +Pcbcupid_GLYPH_C3.name=Pcbcupid GLYPH C3 +Pcbcupid_GLYPH_C3.vid.0=0x2886 +Pcbcupid_GLYPH_C3.pid.0=0x0046 + +Pcbcupid_GLYPH_C3.bootloader.tool=esptool_py +Pcbcupid_GLYPH_C3.bootloader.tool.default=esptool_py + +Pcbcupid_GLYPH_C3.upload.tool=esptool_py +Pcbcupid_GLYPH_C3.upload.tool.default=esptool_py +Pcbcupid_GLYPH_C3.upload.tool.network=esp_ota + +Pcbcupid_GLYPH_C3.upload.maximum_size=1310720 +Pcbcupid_GLYPH_C3.upload.maximum_data_size=327680 +Pcbcupid_GLYPH_C3.upload.flags= +Pcbcupid_GLYPH_C3.upload.extra_flags= +Pcbcupid_GLYPH_C3.upload.use_1200bps_touch=false +Pcbcupid_GLYPH_C3.upload.wait_for_upload_port=false + +Pcbcupid_GLYPH_C3.serial.disableDTR=false +Pcbcupid_GLYPH_C3.serial.disableRTS=false + +Pcbcupid_GLYPH_C3.build.tarch=riscv32 +Pcbcupid_GLYPH_C3.build.target=esp +Pcbcupid_GLYPH_C3.build.mcu=esp32c3 +Pcbcupid_GLYPH_C3.build.core=esp32 +Pcbcupid_GLYPH_C3.build.variant=Pcbcupid_GLYPH_C3 +Pcbcupid_GLYPH_C3.build.board=PCBCUPID_GLYPHC3 +Pcbcupid_GLYPH_C3.build.bootloader_addr=0x0 + +Pcbcupid_GLYPH_C3.build.cdc_on_boot=1 +Pcbcupid_GLYPH_C3.build.f_cpu=160000000L +Pcbcupid_GLYPH_C3.build.flash_size=4MB +Pcbcupid_GLYPH_C3.build.flash_freq=80m +Pcbcupid_GLYPH_C3.build.flash_mode=qio +Pcbcupid_GLYPH_C3.build.boot=qio +Pcbcupid_GLYPH_C3.build.partitions=default +Pcbcupid_GLYPH_C3.build.defines= + +Pcbcupid_GLYPH_C3.menu.CDCOnBoot.default=Enabled +Pcbcupid_GLYPH_C3.menu.CDCOnBoot.default.build.cdc_on_boot=1 +Pcbcupid_GLYPH_C3.menu.CDCOnBoot.cdc=Disabled +Pcbcupid_GLYPH_C3.menu.CDCOnBoot.cdc.build.cdc_on_boot=0 + +Pcbcupid_GLYPH_C3.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +Pcbcupid_GLYPH_C3.menu.PartitionScheme.default.build.partitions=default +Pcbcupid_GLYPH_C3.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +Pcbcupid_GLYPH_C3.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +Pcbcupid_GLYPH_C3.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +Pcbcupid_GLYPH_C3.menu.PartitionScheme.minimal.build.partitions=minimal +Pcbcupid_GLYPH_C3.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +Pcbcupid_GLYPH_C3.menu.PartitionScheme.no_ota.build.partitions=no_ota +Pcbcupid_GLYPH_C3.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +Pcbcupid_GLYPH_C3.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +Pcbcupid_GLYPH_C3.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +Pcbcupid_GLYPH_C3.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +Pcbcupid_GLYPH_C3.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +Pcbcupid_GLYPH_C3.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +Pcbcupid_GLYPH_C3.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +Pcbcupid_GLYPH_C3.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +Pcbcupid_GLYPH_C3.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +Pcbcupid_GLYPH_C3.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +Pcbcupid_GLYPH_C3.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +Pcbcupid_GLYPH_C3.menu.PartitionScheme.huge_app.build.partitions=huge_app +Pcbcupid_GLYPH_C3.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +Pcbcupid_GLYPH_C3.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +Pcbcupid_GLYPH_C3.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +Pcbcupid_GLYPH_C3.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 +Pcbcupid_GLYPH_C3.menu.PartitionScheme.rainmaker=RainMaker 4MB +Pcbcupid_GLYPH_C3.menu.PartitionScheme.rainmaker.build.partitions=rainmaker +Pcbcupid_GLYPH_C3.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 +Pcbcupid_GLYPH_C3.menu.PartitionScheme.rainmaker_4MB=RainMaker 4MB No OTA +Pcbcupid_GLYPH_C3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota +Pcbcupid_GLYPH_C3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 + +Pcbcupid_GLYPH_C3.menu.CPUFreq.160=160MHz (WiFi) +Pcbcupid_GLYPH_C3.menu.CPUFreq.160.build.f_cpu=160000000L +Pcbcupid_GLYPH_C3.menu.CPUFreq.80=80MHz (WiFi) +Pcbcupid_GLYPH_C3.menu.CPUFreq.80.build.f_cpu=80000000L +Pcbcupid_GLYPH_C3.menu.CPUFreq.40=40MHz +Pcbcupid_GLYPH_C3.menu.CPUFreq.40.build.f_cpu=40000000L +Pcbcupid_GLYPH_C3.menu.CPUFreq.20=20MHz +Pcbcupid_GLYPH_C3.menu.CPUFreq.20.build.f_cpu=20000000L +Pcbcupid_GLYPH_C3.menu.CPUFreq.10=10MHz +Pcbcupid_GLYPH_C3.menu.CPUFreq.10.build.f_cpu=10000000L + +Pcbcupid_GLYPH_C3.menu.FlashMode.qio=QIO +Pcbcupid_GLYPH_C3.menu.FlashMode.qio.build.flash_mode=dio +Pcbcupid_GLYPH_C3.menu.FlashMode.qio.build.boot=qio +Pcbcupid_GLYPH_C3.menu.FlashMode.dio=DIO +Pcbcupid_GLYPH_C3.menu.FlashMode.dio.build.flash_mode=dio +Pcbcupid_GLYPH_C3.menu.FlashMode.dio.build.boot=dio + +Pcbcupid_GLYPH_C3.menu.FlashFreq.80=80MHz +Pcbcupid_GLYPH_C3.menu.FlashFreq.80.build.flash_freq=80m +Pcbcupid_GLYPH_C3.menu.FlashFreq.40=40MHz +Pcbcupid_GLYPH_C3.menu.FlashFreq.40.build.flash_freq=40m + +Pcbcupid_GLYPH_C3.menu.FlashSize.4M=4MB (32Mb) +Pcbcupid_GLYPH_C3.menu.FlashSize.4M.build.flash_size=4MB + +Pcbcupid_GLYPH_C3.menu.UploadSpeed.921600=921600 +Pcbcupid_GLYPH_C3.menu.UploadSpeed.921600.upload.speed=921600 +Pcbcupid_GLYPH_C3.menu.UploadSpeed.115200=115200 +Pcbcupid_GLYPH_C3.menu.UploadSpeed.115200.upload.speed=115200 +Pcbcupid_GLYPH_C3.menu.UploadSpeed.256000.windows=256000 +Pcbcupid_GLYPH_C3.menu.UploadSpeed.256000.upload.speed=256000 +Pcbcupid_GLYPH_C3.menu.UploadSpeed.230400.windows.upload.speed=256000 +Pcbcupid_GLYPH_C3.menu.UploadSpeed.230400=230400 +Pcbcupid_GLYPH_C3.menu.UploadSpeed.230400.upload.speed=230400 +Pcbcupid_GLYPH_C3.menu.UploadSpeed.460800.linux=460800 +Pcbcupid_GLYPH_C3.menu.UploadSpeed.460800.macosx=460800 +Pcbcupid_GLYPH_C3.menu.UploadSpeed.460800.upload.speed=460800 +Pcbcupid_GLYPH_C3.menu.UploadSpeed.512000.windows=512000 +Pcbcupid_GLYPH_C3.menu.UploadSpeed.512000.upload.speed=512000 + +Pcbcupid_GLYPH_C3.menu.DebugLevel.none=None +Pcbcupid_GLYPH_C3.menu.DebugLevel.none.build.code_debug=0 +Pcbcupid_GLYPH_C3.menu.DebugLevel.error=Error +Pcbcupid_GLYPH_C3.menu.DebugLevel.error.build.code_debug=1 +Pcbcupid_GLYPH_C3.menu.DebugLevel.warn=Warn +Pcbcupid_GLYPH_C3.menu.DebugLevel.warn.build.code_debug=2 +Pcbcupid_GLYPH_C3.menu.DebugLevel.info=Info +Pcbcupid_GLYPH_C3.menu.DebugLevel.info.build.code_debug=3 +Pcbcupid_GLYPH_C3.menu.DebugLevel.debug=Debug +Pcbcupid_GLYPH_C3.menu.DebugLevel.debug.build.code_debug=4 +Pcbcupid_GLYPH_C3.menu.DebugLevel.verbose=Verbose +Pcbcupid_GLYPH_C3.menu.DebugLevel.verbose.build.code_debug=5 + +Pcbcupid_GLYPH_C3.menu.EraseFlash.none=Disabled +Pcbcupid_GLYPH_C3.menu.EraseFlash.none.upload.erase_cmd= +Pcbcupid_GLYPH_C3.menu.EraseFlash.all=Enabled +Pcbcupid_GLYPH_C3.menu.EraseFlash.all.upload.erase_cmd=-e + +############################################################## + + +Pcbcupid_GLYPH_H2.name=Pcbcupid GLYPH H2 + +Pcbcupid_GLYPH_H2.bootloader.tool=esptool_py +Pcbcupid_GLYPH_H2.bootloader.tool.default=esptool_py + +Pcbcupid_GLYPH_H2.upload.tool=esptool_py +Pcbcupid_GLYPH_H2.upload.tool.default=esptool_py +Pcbcupid_GLYPH_H2.upload.tool.network=esp_ota + +Pcbcupid_GLYPH_H2.upload.maximum_size=1310720 +Pcbcupid_GLYPH_H2.upload.maximum_data_size=327680 +Pcbcupid_GLYPH_H2.upload.flags= +Pcbcupid_GLYPH_H2.upload.extra_flags= +Pcbcupid_GLYPH_H2.upload.use_1200bps_touch=false +Pcbcupid_GLYPH_H2.upload.wait_for_upload_port=false + +Pcbcupid_GLYPH_H2.serial.disableDTR=false +Pcbcupid_GLYPH_H2.serial.disableRTS=false + +Pcbcupid_GLYPH_H2.build.tarch=riscv32 +Pcbcupid_GLYPH_H2.build.target=esp +Pcbcupid_GLYPH_H2.build.mcu=esp32h2 +Pcbcupid_GLYPH_H2.build.core=esp32 +Pcbcupid_GLYPH_H2.build.variant=Pcbcupid_GLYPH_H2 +Pcbcupid_GLYPH_H2.build.board=PCBCUPID_GLYPHH2 +Pcbcupid_GLYPH_H2.build.bootloader_addr=0x0 + +Pcbcupid_GLYPH_H2.build.cdc_on_boot=1 +Pcbcupid_GLYPH_H2.build.f_cpu=96000000L +Pcbcupid_GLYPH_H2.build.flash_size=4MB +Pcbcupid_GLYPH_H2.build.flash_freq=64m +Pcbcupid_GLYPH_H2.build.img_freq=48m +Pcbcupid_GLYPH_H2.build.flash_mode=qio +Pcbcupid_GLYPH_H2.build.boot=qio +Pcbcupid_GLYPH_H2.build.partitions=default +Pcbcupid_GLYPH_H2.build.defines= + +## IDE 2.0 Seems to not update the value +Pcbcupid_GLYPH_H2.menu.JTAGAdapter.default=Disabled +Pcbcupid_GLYPH_H2.menu.JTAGAdapter.default.build.copy_jtag_files=0 +Pcbcupid_GLYPH_H2.menu.JTAGAdapter.builtin=Integrated USB JTAG +Pcbcupid_GLYPH_H2.menu.JTAGAdapter.builtin.build.openocdscript=esp32h2-builtin.cfg +Pcbcupid_GLYPH_H2.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 +Pcbcupid_GLYPH_H2.menu.JTAGAdapter.external=FTDI Adapter +Pcbcupid_GLYPH_H2.menu.JTAGAdapter.external.build.openocdscript=esp32h2-ftdi.cfg +Pcbcupid_GLYPH_H2.menu.JTAGAdapter.external.build.copy_jtag_files=1 +Pcbcupid_GLYPH_H2.menu.JTAGAdapter.bridge=ESP USB Bridge +Pcbcupid_GLYPH_H2.menu.JTAGAdapter.bridge.build.openocdscript=esp32h2-bridge.cfg +Pcbcupid_GLYPH_H2.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +Pcbcupid_GLYPH_H2.menu.CDCOnBoot.default=Enabled +Pcbcupid_GLYPH_H2.menu.CDCOnBoot.default.build.cdc_on_boot=1 +Pcbcupid_GLYPH_H2.menu.CDCOnBoot.cdc=Disabled +Pcbcupid_GLYPH_H2.menu.CDCOnBoot.cdc.build.cdc_on_boot=0 + +Pcbcupid_GLYPH_H2.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +Pcbcupid_GLYPH_H2.menu.PartitionScheme.default.build.partitions=default +Pcbcupid_GLYPH_H2.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +Pcbcupid_GLYPH_H2.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +Pcbcupid_GLYPH_H2.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +Pcbcupid_GLYPH_H2.menu.PartitionScheme.minimal.build.partitions=minimal +Pcbcupid_GLYPH_H2.menu.PartitionScheme.no_fs=No FS 4MB (2MB APP x2) +Pcbcupid_GLYPH_H2.menu.PartitionScheme.no_fs.build.partitions=no_fs +Pcbcupid_GLYPH_H2.menu.PartitionScheme.no_fs.upload.maximum_size=2031616 +Pcbcupid_GLYPH_H2.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +Pcbcupid_GLYPH_H2.menu.PartitionScheme.no_ota.build.partitions=no_ota +Pcbcupid_GLYPH_H2.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +Pcbcupid_GLYPH_H2.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +Pcbcupid_GLYPH_H2.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +Pcbcupid_GLYPH_H2.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +Pcbcupid_GLYPH_H2.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +Pcbcupid_GLYPH_H2.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +Pcbcupid_GLYPH_H2.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +Pcbcupid_GLYPH_H2.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +Pcbcupid_GLYPH_H2.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +Pcbcupid_GLYPH_H2.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +Pcbcupid_GLYPH_H2.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +Pcbcupid_GLYPH_H2.menu.PartitionScheme.huge_app.build.partitions=huge_app +Pcbcupid_GLYPH_H2.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +Pcbcupid_GLYPH_H2.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +Pcbcupid_GLYPH_H2.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +Pcbcupid_GLYPH_H2.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 +Pcbcupid_GLYPH_H2.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs +Pcbcupid_GLYPH_H2.menu.PartitionScheme.zigbee.build.partitions=zigbee +Pcbcupid_GLYPH_H2.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 +Pcbcupid_GLYPH_H2.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs +Pcbcupid_GLYPH_H2.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr +Pcbcupid_GLYPH_H2.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 +Pcbcupid_GLYPH_H2.menu.PartitionScheme.custom=Custom +Pcbcupid_GLYPH_H2.menu.PartitionScheme.custom.build.partitions= +Pcbcupid_GLYPH_H2.menu.PartitionScheme.custom.upload.maximum_size=16777216 + +Pcbcupid_GLYPH_H2.menu.FlashMode.qio=QIO +Pcbcupid_GLYPH_H2.menu.FlashMode.qio.build.flash_mode=dio +Pcbcupid_GLYPH_H2.menu.FlashMode.qio.build.boot=qio +Pcbcupid_GLYPH_H2.menu.FlashMode.dio=DIO +Pcbcupid_GLYPH_H2.menu.FlashMode.dio.build.flash_mode=dio +Pcbcupid_GLYPH_H2.menu.FlashMode.dio.build.boot=dio + +Pcbcupid_GLYPH_H2.menu.FlashFreq.64=64MHz +Pcbcupid_GLYPH_H2.menu.FlashFreq.64.build.flash_freq=64m +Pcbcupid_GLYPH_H2.menu.FlashFreq.64.build.img_freq=48m +#Pcbcupid_GLYPH_H2.menu.FlashFreq.32=32MHz +#Pcbcupid_GLYPH_H2.menu.FlashFreq.32.build.flash_freq=32m +#Pcbcupid_GLYPH_H2.menu.FlashFreq.32.build.img_freq=24m +Pcbcupid_GLYPH_H2.menu.FlashFreq.16=16MHz +Pcbcupid_GLYPH_H2.menu.FlashFreq.16.build.flash_freq=16m +Pcbcupid_GLYPH_H2.menu.FlashFreq.16.build.img_freq=12m + +Pcbcupid_GLYPH_H2.menu.FlashSize.2M=2MB (16Mb) +Pcbcupid_GLYPH_H2.menu.FlashSize.2M.build.flash_size=2MB +Pcbcupid_GLYPH_H2.menu.FlashSize.4M=4MB (32Mb) +Pcbcupid_GLYPH_H2.menu.FlashSize.4M.build.flash_size=4MB + +Pcbcupid_GLYPH_H2.menu.UploadSpeed.921600=921600 +Pcbcupid_GLYPH_H2.menu.UploadSpeed.921600.upload.speed=921600 +Pcbcupid_GLYPH_H2.menu.UploadSpeed.115200=115200 +Pcbcupid_GLYPH_H2.menu.UploadSpeed.115200.upload.speed=115200 +Pcbcupid_GLYPH_H2.menu.UploadSpeed.256000.windows=256000 +Pcbcupid_GLYPH_H2.menu.UploadSpeed.256000.upload.speed=256000 +Pcbcupid_GLYPH_H2.menu.UploadSpeed.230400.windows.upload.speed=256000 +Pcbcupid_GLYPH_H2.menu.UploadSpeed.230400=230400 +Pcbcupid_GLYPH_H2.menu.UploadSpeed.230400.upload.speed=230400 +Pcbcupid_GLYPH_H2.menu.UploadSpeed.460800.linux=460800 +Pcbcupid_GLYPH_H2.menu.UploadSpeed.460800.macosx=460800 +Pcbcupid_GLYPH_H2.menu.UploadSpeed.460800.upload.speed=460800 +Pcbcupid_GLYPH_H2.menu.UploadSpeed.512000.windows=512000 +Pcbcupid_GLYPH_H2.menu.UploadSpeed.512000.upload.speed=512000 + +Pcbcupid_GLYPH_H2.menu.DebugLevel.none=None +Pcbcupid_GLYPH_H2.menu.DebugLevel.none.build.code_debug=0 +Pcbcupid_GLYPH_H2.menu.DebugLevel.error=Error +Pcbcupid_GLYPH_H2.menu.DebugLevel.error.build.code_debug=1 +Pcbcupid_GLYPH_H2.menu.DebugLevel.warn=Warn +Pcbcupid_GLYPH_H2.menu.DebugLevel.warn.build.code_debug=2 +Pcbcupid_GLYPH_H2.menu.DebugLevel.info=Info +Pcbcupid_GLYPH_H2.menu.DebugLevel.info.build.code_debug=3 +Pcbcupid_GLYPH_H2.menu.DebugLevel.debug=Debug +Pcbcupid_GLYPH_H2.menu.DebugLevel.debug.build.code_debug=4 +Pcbcupid_GLYPH_H2.menu.DebugLevel.verbose=Verbose +Pcbcupid_GLYPH_H2.menu.DebugLevel.verbose.build.code_debug=5 + +Pcbcupid_GLYPH_H2.menu.EraseFlash.none=Disabled +Pcbcupid_GLYPH_H2.menu.EraseFlash.none.upload.erase_cmd= +Pcbcupid_GLYPH_H2.menu.EraseFlash.all=Enabled +Pcbcupid_GLYPH_H2.menu.EraseFlash.all.upload.erase_cmd=-e + +Pcbcupid_GLYPH_H2.menu.ZigbeeMode.default=Disabled +Pcbcupid_GLYPH_H2.menu.ZigbeeMode.default.build.zigbee_mode= +Pcbcupid_GLYPH_H2.menu.ZigbeeMode.default.build.zigbee_libs= +Pcbcupid_GLYPH_H2.menu.ZigbeeMode.ed=Zigbee ED (end device) +Pcbcupid_GLYPH_H2.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED +Pcbcupid_GLYPH_H2.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +Pcbcupid_GLYPH_H2.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) +Pcbcupid_GLYPH_H2.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +Pcbcupid_GLYPH_H2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +Pcbcupid_GLYPH_H2.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) +Pcbcupid_GLYPH_H2.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP +Pcbcupid_GLYPH_H2.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port + +############################################################## + + +Pcbcupid_GLYPH_C6.name=Pcbcupid GLYPH C6 + +Pcbcupid_GLYPH_C6.bootloader.tool=esptool_py +Pcbcupid_GLYPH_C6.bootloader.tool.default=esptool_py + +Pcbcupid_GLYPH_C6.upload.tool=esptool_py +Pcbcupid_GLYPH_C6.upload.tool.default=esptool_py +Pcbcupid_GLYPH_C6.upload.tool.network=esp_ota + +Pcbcupid_GLYPH_C6.upload.maximum_size=1310720 +Pcbcupid_GLYPH_C6.upload.maximum_data_size=327680 +Pcbcupid_GLYPH_C6.upload.flags= +Pcbcupid_GLYPH_C6.upload.extra_flags= +Pcbcupid_GLYPH_C6.upload.use_1200bps_touch=false +Pcbcupid_GLYPH_C6.upload.wait_for_upload_port=false + +Pcbcupid_GLYPH_C6.serial.disableDTR=false +Pcbcupid_GLYPH_C6.serial.disableRTS=false + +Pcbcupid_GLYPH_C6.build.tarch=riscv32 +Pcbcupid_GLYPH_C6.build.target=esp +Pcbcupid_GLYPH_C6.build.mcu=esp32c6 +Pcbcupid_GLYPH_C6.build.core=esp32 +Pcbcupid_GLYPH_C6.build.variant=Pcbcupid_GLYPH_C6 +Pcbcupid_GLYPH_C6.build.board=PCBCUPID_GLYPHC6 +Pcbcupid_GLYPH_C6.build.bootloader_addr=0x0 + +Pcbcupid_GLYPH_C6.build.cdc_on_boot=1 +Pcbcupid_GLYPH_C6.build.f_cpu=160000000L +Pcbcupid_GLYPH_C6.build.flash_size=4MB +Pcbcupid_GLYPH_C6.build.flash_freq=80m +Pcbcupid_GLYPH_C6.build.flash_mode=qio +Pcbcupid_GLYPH_C6.build.boot=qio +Pcbcupid_GLYPH_C6.build.partitions=default +Pcbcupid_GLYPH_C6.build.defines= + +## IDE 2.0 Seems to not update the value +Pcbcupid_GLYPH_C6.menu.JTAGAdapter.default=Disabled +Pcbcupid_GLYPH_C6.menu.JTAGAdapter.default.build.copy_jtag_files=0 +Pcbcupid_GLYPH_C6.menu.JTAGAdapter.builtin=Integrated USB JTAG +Pcbcupid_GLYPH_C6.menu.JTAGAdapter.builtin.build.openocdscript=esp32c6-builtin.cfg +Pcbcupid_GLYPH_C6.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 +Pcbcupid_GLYPH_C6.menu.JTAGAdapter.external=FTDI Adapter +Pcbcupid_GLYPH_C6.menu.JTAGAdapter.external.build.openocdscript=esp32c6-ftdi.cfg +Pcbcupid_GLYPH_C6.menu.JTAGAdapter.external.build.copy_jtag_files=1 +Pcbcupid_GLYPH_C6.menu.JTAGAdapter.bridge=ESP USB Bridge +Pcbcupid_GLYPH_C6.menu.JTAGAdapter.bridge.build.openocdscript=esp32c6-bridge.cfg +Pcbcupid_GLYPH_C6.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +Pcbcupid_GLYPH_C6.menu.CDCOnBoot.cdc=Enabled +Pcbcupid_GLYPH_C6.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 +Pcbcupid_GLYPH_C6.menu.CDCOnBoot.default=Disabled +Pcbcupid_GLYPH_C6.menu.CDCOnBoot.default.build.cdc_on_boot=0 + +Pcbcupid_GLYPH_C6.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +Pcbcupid_GLYPH_C6.menu.PartitionScheme.default.build.partitions=default +Pcbcupid_GLYPH_C6.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +Pcbcupid_GLYPH_C6.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +Pcbcupid_GLYPH_C6.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +Pcbcupid_GLYPH_C6.menu.PartitionScheme.no_ota.build.partitions=no_ota +Pcbcupid_GLYPH_C6.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +Pcbcupid_GLYPH_C6.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +Pcbcupid_GLYPH_C6.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +Pcbcupid_GLYPH_C6.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +Pcbcupid_GLYPH_C6.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +Pcbcupid_GLYPH_C6.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +Pcbcupid_GLYPH_C6.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +Pcbcupid_GLYPH_C6.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +Pcbcupid_GLYPH_C6.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +Pcbcupid_GLYPH_C6.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +Pcbcupid_GLYPH_C6.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +Pcbcupid_GLYPH_C6.menu.PartitionScheme.huge_app.build.partitions=huge_app +Pcbcupid_GLYPH_C6.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +Pcbcupid_GLYPH_C6.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs +Pcbcupid_GLYPH_C6.menu.PartitionScheme.zigbee.build.partitions=zigbee +Pcbcupid_GLYPH_C6.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 +Pcbcupid_GLYPH_C6.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs +Pcbcupid_GLYPH_C6.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr +Pcbcupid_GLYPH_C6.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 + +Pcbcupid_GLYPH_C6.menu.CPUFreq.160=160MHz (WiFi) +Pcbcupid_GLYPH_C6.menu.CPUFreq.160.build.f_cpu=160000000L +Pcbcupid_GLYPH_C6.menu.CPUFreq.80=80MHz (WiFi) +Pcbcupid_GLYPH_C6.menu.CPUFreq.80.build.f_cpu=80000000L +Pcbcupid_GLYPH_C6.menu.CPUFreq.40=40MHz +Pcbcupid_GLYPH_C6.menu.CPUFreq.40.build.f_cpu=40000000L +Pcbcupid_GLYPH_C6.menu.CPUFreq.20=20MHz +Pcbcupid_GLYPH_C6.menu.CPUFreq.20.build.f_cpu=20000000L +Pcbcupid_GLYPH_C6.menu.CPUFreq.10=10MHz +Pcbcupid_GLYPH_C6.menu.CPUFreq.10.build.f_cpu=10000000L + +Pcbcupid_GLYPH_C6.menu.FlashMode.qio=QIO +Pcbcupid_GLYPH_C6.menu.FlashMode.qio.build.flash_mode=dio +Pcbcupid_GLYPH_C6.menu.FlashMode.qio.build.boot=qio +Pcbcupid_GLYPH_C6.menu.FlashMode.dio=DIO +Pcbcupid_GLYPH_C6.menu.FlashMode.dio.build.flash_mode=dio +Pcbcupid_GLYPH_C6.menu.FlashMode.dio.build.boot=dio + +Pcbcupid_GLYPH_C6.menu.FlashFreq.80=80MHz +Pcbcupid_GLYPH_C6.menu.FlashFreq.80.build.flash_freq=80m +Pcbcupid_GLYPH_C6.menu.FlashFreq.40=40MHz +Pcbcupid_GLYPH_C6.menu.FlashFreq.40.build.flash_freq=40m + +Pcbcupid_GLYPH_C6.menu.FlashSize.4M=4MB (32Mb) +Pcbcupid_GLYPH_C6.menu.FlashSize.4M.build.flash_size=4MB + +Pcbcupid_GLYPH_C6.menu.UploadSpeed.921600=921600 +Pcbcupid_GLYPH_C6.menu.UploadSpeed.921600.upload.speed=921600 +Pcbcupid_GLYPH_C6.menu.UploadSpeed.115200=115200 +Pcbcupid_GLYPH_C6.menu.UploadSpeed.115200.upload.speed=115200 +Pcbcupid_GLYPH_C6.menu.UploadSpeed.256000.windows=256000 +Pcbcupid_GLYPH_C6.menu.UploadSpeed.256000.upload.speed=256000 +Pcbcupid_GLYPH_C6.menu.UploadSpeed.230400.windows.upload.speed=256000 +Pcbcupid_GLYPH_C6.menu.UploadSpeed.230400=230400 +Pcbcupid_GLYPH_C6.menu.UploadSpeed.230400.upload.speed=230400 +Pcbcupid_GLYPH_C6.menu.UploadSpeed.460800.linux=460800 +Pcbcupid_GLYPH_C6.menu.UploadSpeed.460800.macosx=460800 +Pcbcupid_GLYPH_C6.menu.UploadSpeed.460800.upload.speed=460800 +Pcbcupid_GLYPH_C6.menu.UploadSpeed.512000.windows=512000 +Pcbcupid_GLYPH_C6.menu.UploadSpeed.512000.upload.speed=512000 + +Pcbcupid_GLYPH_C6.menu.DebugLevel.none=None +Pcbcupid_GLYPH_C6.menu.DebugLevel.none.build.code_debug=0 +Pcbcupid_GLYPH_C6.menu.DebugLevel.error=Error +Pcbcupid_GLYPH_C6.menu.DebugLevel.error.build.code_debug=1 +Pcbcupid_GLYPH_C6.menu.DebugLevel.warn=Warn +Pcbcupid_GLYPH_C6.menu.DebugLevel.warn.build.code_debug=2 +Pcbcupid_GLYPH_C6.menu.DebugLevel.info=Info +Pcbcupid_GLYPH_C6.menu.DebugLevel.info.build.code_debug=3 +Pcbcupid_GLYPH_C6.menu.DebugLevel.debug=Debug +Pcbcupid_GLYPH_C6.menu.DebugLevel.debug.build.code_debug=4 +Pcbcupid_GLYPH_C6.menu.DebugLevel.verbose=Verbose +Pcbcupid_GLYPH_C6.menu.DebugLevel.verbose.build.code_debug=5 + +Pcbcupid_GLYPH_C6.menu.EraseFlash.none=Disabled +Pcbcupid_GLYPH_C6.menu.EraseFlash.none.upload.erase_cmd= +Pcbcupid_GLYPH_C6.menu.EraseFlash.all=Enabled +Pcbcupid_GLYPH_C6.menu.EraseFlash.all.upload.erase_cmd=-e + +Pcbcupid_GLYPH_C6.menu.ZigbeeMode.default=Disabled +Pcbcupid_GLYPH_C6.menu.ZigbeeMode.default.build.zigbee_mode= +Pcbcupid_GLYPH_C6.menu.ZigbeeMode.default.build.zigbee_libs= +Pcbcupid_GLYPH_C6.menu.ZigbeeMode.ed=Zigbee ED (end device) +Pcbcupid_GLYPH_C6.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED +Pcbcupid_GLYPH_C6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +Pcbcupid_GLYPH_C6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) +Pcbcupid_GLYPH_C6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +Pcbcupid_GLYPH_C6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +Pcbcupid_GLYPH_C6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) +Pcbcupid_GLYPH_C6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP +Pcbcupid_GLYPH_C6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port + +############################################################## diff --git a/variants/Pcbcupid_GLYPH_C3/pins_arduino.h b/variants/Pcbcupid_GLYPH_C3/pins_arduino.h new file mode 100644 index 00000000000..653c2c48828 --- /dev/null +++ b/variants/Pcbcupid_GLYPH_C3/pins_arduino.h @@ -0,0 +1,43 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +// BUILTIN_LED can be used in new Arduino API digitalWrite() like in Blink.ino +static const uint8_t LED_BUILTIN = 1; +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN + +//MSR Used in on-board battery measurement +static const uint8_t BAT_MEASURE = 0; +#define MSR BAT_MEASURE + +static const uint8_t TX = 21; +static const uint8_t RX = 20; + +static const uint8_t SDA = 4; +static const uint8_t SCL = 5; + +static const uint8_t SS = 3; +static const uint8_t MOSI = 6; +static const uint8_t MISO = 7; +static const uint8_t SCK = 10; + +static const uint8_t A0 = 0; +static const uint8_t A1 = 1; +static const uint8_t A2 = 2; +static const uint8_t A3 = 3; + +static const uint8_t D0 = 0; +static const uint8_t D1 = 1; +static const uint8_t D2 = 2; +static const uint8_t D3 = 3; +static const uint8_t D4 = 4; +static const uint8_t D5 = 5; +static const uint8_t D6 = 6; +static const uint8_t D7 = 7; +static const uint8_t D8 = 8; +static const uint8_t D9 = 9; +static const uint8_t D10 = 10; + +#endif /* Pins_Arduino_h */ diff --git a/variants/Pcbcupid_GLYPH_C6/pins_arduino.h b/variants/Pcbcupid_GLYPH_C6/pins_arduino.h new file mode 100644 index 00000000000..f06fb151244 --- /dev/null +++ b/variants/Pcbcupid_GLYPH_C6/pins_arduino.h @@ -0,0 +1,52 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +// BUILTIN_LED can be used in new Arduino API digitalWrite() like in Blink.ino +static const uint8_t LED_BUILTIN = 14; +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN + +//MSR Used in on-board battery measurement +static const uint8_t BAT_MEASURE = 0; +#define MSR BAT_MEASURE + +static const uint8_t TX = 16; +static const uint8_t RX = 17; + +static const uint8_t SDA = 4; +static const uint8_t SCL = 5; + +static const uint8_t SS = 20; +static const uint8_t MOSI = 22; +static const uint8_t MISO = 23; +static const uint8_t SCK = 21; + +static const uint8_t A0 = 0; +static const uint8_t A1 = 1; +static const uint8_t A2 = 2; +static const uint8_t A3 = 3; + +static const uint8_t D0 = 0; +static const uint8_t D1 = 1; +static const uint8_t D2 = 2; +static const uint8_t D3 = 3; +static const uint8_t D4 = 4; +static const uint8_t D5 = 5; +static const uint8_t D6 = 6; +static const uint8_t D7 = 7; +static const uint8_t D8 = 8; +static const uint8_t D9 = 9; +static const uint8_t D14 = 14; +static const uint8_t D15 = 15; +static const uint8_t D16 = 16; +static const uint8_t D17 = 17; +static const uint8_t D18 = 18; +static const uint8_t D19 = 19; +static const uint8_t D20 = 20; +static const uint8_t D21 = 21; +static const uint8_t D22 = 22; +static const uint8_t D23 = 23; + +#endif /* Pins_Arduino_h */ diff --git a/variants/Pcbcupid_GLYPH_H2/pins_arduino.h b/variants/Pcbcupid_GLYPH_H2/pins_arduino.h new file mode 100644 index 00000000000..20a385a9817 --- /dev/null +++ b/variants/Pcbcupid_GLYPH_H2/pins_arduino.h @@ -0,0 +1,44 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +// BUILTIN_LED can be used in new Arduino API digitalWrite() like in Blink.ino +static const uint8_t LED_BUILTIN = 0; +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN + +//MSR Used in on-board battery measurement +static const uint8_t BAT_MEASURE = 1; +#define MSR BAT_MEASURE + +static const uint8_t TX = 24; +static const uint8_t RX = 23; + +static const uint8_t SDA = 4; +static const uint8_t SCL = 5; + +static const uint8_t SS = 3; +static const uint8_t MOSI = 22; +static const uint8_t MISO = 25; +static const uint8_t SCK = 11; + +static const uint8_t A1 = 1; +static const uint8_t A2 = 2; +static const uint8_t A3 = 3; + +static const uint8_t D0 = 0; +static const uint8_t D1 = 1; +static const uint8_t D2 = 2; +static const uint8_t D3 = 3; +static const uint8_t D4 = 4; +static const uint8_t D5 = 5; +static const uint8_t D8 = 8; +static const uint8_t D9 = 9; +static const uint8_t D10 = 10; +static const uint8_t D11 = 11; +static const uint8_t D12 = 12; +static const uint8_t D13 = 13; +static const uint8_t D14 = 14; + +#endif /* Pins_Arduino_h */ From 92dd841ffc161d88ca492f4dee3bb1b5f76548c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Mon, 9 Dec 2024 13:30:15 +0100 Subject: [PATCH 033/183] feat(Zigbee): Recall bounded devices after reboot + IEEE address option for commands (#10676) * feat(zigbee): Recall bound devices after reboot * fix(zigbee): Add missing locks + allow printBoundDevices to Serial * fix(Zigbee): Add locks to temp sensor setReporting * fix(Zigbee): remove unnecessary space in formatting * fix(Zigbee): proper parameter in printBoundDevices * feat(Zigbee): factory reset when removed from network * fix(zigbee): Update comment * fix(zigbee): fix serial and add missing factoryReset to example * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../Zigbee_Color_Dimmer_Switch.ino | 2 +- .../Zigbee_On_Off_Switch.ino | 15 +- .../Zigbee_Temp_Hum_Sensor_Sleepy.ino | 1 + libraries/Zigbee/src/ZigbeeCore.cpp | 77 ++++++++- libraries/Zigbee/src/ZigbeeCore.h | 2 + libraries/Zigbee/src/ZigbeeEP.cpp | 56 +++++-- libraries/Zigbee/src/ZigbeeEP.h | 14 +- .../Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp | 147 +++++++++++++++--- .../Zigbee/src/ep/ZigbeeColorDimmerSwitch.h | 5 + libraries/Zigbee/src/ep/ZigbeeSwitch.cpp | 109 +++++++++++-- libraries/Zigbee/src/ep/ZigbeeSwitch.h | 3 + libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp | 4 + 12 files changed, 376 insertions(+), 59 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino b/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino index 00e3cd170ef..15e120a1dbd 100644 --- a/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino +++ b/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino @@ -145,6 +145,6 @@ void loop() { static uint32_t last_print = 0; if (millis() - last_print > 30000) { last_print = millis(); - zbSwitch.printBoundDevices(); + zbSwitch.printBoundDevices(Serial); } } diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino b/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino index e38734a052a..e12b8aaf9ea 100644 --- a/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino +++ b/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino @@ -138,17 +138,16 @@ void setup() { delay(500); } - // Optional: read manufacturer and model name from the bound light + // Optional: List all bound devices and read manufacturer and model name std::list boundLights = zbSwitch.getBoundDevices(); - //List all bound lights for (const auto &device : boundLights) { - Serial.printf("Device on endpoint %d, short address: 0x%x\n", device->endpoint, device->short_addr); + Serial.printf("Device on endpoint %d, short address: 0x%x\r\n", device->endpoint, device->short_addr); Serial.printf( - "IEEE Address: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", device->ieee_addr[0], device->ieee_addr[1], device->ieee_addr[2], device->ieee_addr[3], - device->ieee_addr[4], device->ieee_addr[5], device->ieee_addr[6], device->ieee_addr[7] + "IEEE Address: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\r\n", device->ieee_addr[7], device->ieee_addr[6], device->ieee_addr[5], device->ieee_addr[4], + device->ieee_addr[3], device->ieee_addr[2], device->ieee_addr[1], device->ieee_addr[0] ); - Serial.printf("Light manufacturer: %s", zbSwitch.readManufacturer(device->endpoint, device->short_addr)); - Serial.printf("Light model: %s", zbSwitch.readModel(device->endpoint, device->short_addr)); + Serial.printf("Light manufacturer: %s\r\n", zbSwitch.readManufacturer(device->endpoint, device->short_addr, device->ieee_addr)); + Serial.printf("Light model: %s\r\n", zbSwitch.readModel(device->endpoint, device->short_addr, device->ieee_addr)); } Serial.println(); @@ -191,6 +190,6 @@ void loop() { static uint32_t lastPrint = 0; if (millis() - lastPrint > 10000) { lastPrint = millis(); - zbSwitch.printBoundDevices(); + zbSwitch.printBoundDevices(Serial); } } diff --git a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino index e13e6a877a6..0c2f9b56690 100644 --- a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino +++ b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino @@ -128,6 +128,7 @@ void loop() { // If key pressed for more than 3secs, factory reset Zigbee and reboot Serial.println("Resetting Zigbee to factory and rebooting in 1s."); delay(1000); + Zigbee.factoryReset(); } } } diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index 442dc4b7ee0..b1dc6211362 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -243,6 +243,7 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { } else { Zigbee._connected = true; } + Zigbee.searchBindings(); } } else { /* commissioning failed */ @@ -309,7 +310,6 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { Bit 6 – Security capability Bit 7 – Reserved */ - // for each endpoint in the list call the findEndpoint function if not bounded or allowed to bind multiple devices for (std::list::iterator it = Zigbee.ep_objects.begin(); it != Zigbee.ep_objects.end(); ++it) { if (!(*it)->bound() || (*it)->epAllowMultipleBinding()) { @@ -329,6 +329,12 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { } } break; + case ESP_ZB_ZDO_SIGNAL_LEAVE: // End Device + Router + // Device was removed from the network, factory reset the device + if ((zigbee_role_t)Zigbee.getRole() != ZIGBEE_COORDINATOR) { + Zigbee.factoryReset(); + } + break; default: log_v("ZDO signal: %s (0x%x), status: %s", esp_zb_zdo_signal_to_string(sig_type), sig_type, esp_err_to_name(err_status)); break; } } @@ -391,6 +397,75 @@ void ZigbeeCore::scanDelete() { _scan_status = ZB_SCAN_FAILED; } +// Recall bounded devices from the binding table after reboot +void ZigbeeCore::bindingTableCb(const esp_zb_zdo_binding_table_info_t *table_info, void *user_ctx) { + bool done = true; + esp_zb_zdo_mgmt_bind_param_t *req = (esp_zb_zdo_mgmt_bind_param_t *)user_ctx; + esp_zb_zdp_status_t zdo_status = (esp_zb_zdp_status_t)table_info->status; + log_d("Binding table callback for address 0x%04x with status %d", req->dst_addr, zdo_status); + if (zdo_status == ESP_ZB_ZDP_STATUS_SUCCESS) { + // Print binding table log simple + log_d("Binding table info: total %d, index %d, count %d", table_info->total, table_info->index, table_info->count); + + if (table_info->total == 0) { + log_d("No binding table entries found"); + free(req); + return; + } + + esp_zb_zdo_binding_table_record_t *record = table_info->record; + for (int i = 0; i < table_info->count; i++) { + log_d( + "Binding table record: src_endp %d, dst_endp %d, cluster_id 0x%04x, dst_addr_mode %d", record->src_endp, record->dst_endp, record->cluster_id, + record->dst_addr_mode + ); + + zb_device_params_t *device = (zb_device_params_t *)calloc(1, sizeof(zb_device_params_t)); + device->endpoint = record->dst_endp; + if (record->dst_addr_mode == ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT || record->dst_addr_mode == ESP_ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT) { + device->short_addr = record->dst_address.addr_short; + } else { //ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT + memcpy(device->ieee_addr, record->dst_address.addr_long, sizeof(esp_zb_ieee_addr_t)); + } + + // Add to list of bound devices of proper endpoint + for (std::list::iterator it = Zigbee.ep_objects.begin(); it != Zigbee.ep_objects.end(); ++it) { + if ((*it)->getEndpoint() == record->src_endp) { + (*it)->addBoundDevice(device); + log_d( + "Device bound to EP %d -> device endpoint: %d, short addr: 0x%04x, ieee addr: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", record->src_endp, + device->endpoint, device->short_addr, device->ieee_addr[7], device->ieee_addr[6], device->ieee_addr[5], device->ieee_addr[4], device->ieee_addr[3], + device->ieee_addr[2], device->ieee_addr[1], device->ieee_addr[0] + ); + } + } + record = record->next; + } + + // Continue reading the binding table + if (table_info->index + table_info->count < table_info->total) { + /* There are unreported binding table entries, request for them. */ + req->start_index = table_info->index + table_info->count; + esp_zb_zdo_binding_table_req(req, bindingTableCb, req); + done = false; + } + } + + if (done) { + // Print bound devices + log_d("Filling bounded devices finished"); + free(req); + } +} + +void ZigbeeCore::searchBindings() { + esp_zb_zdo_mgmt_bind_param_t *mb_req = (esp_zb_zdo_mgmt_bind_param_t *)malloc(sizeof(esp_zb_zdo_mgmt_bind_param_t)); + mb_req->dst_addr = esp_zb_get_short_address(); + mb_req->start_index = 0; + log_d("Requesting binding table for address 0x%04x", mb_req->dst_addr); + esp_zb_zdo_binding_table_req(mb_req, bindingTableCb, (void *)mb_req); +} + // Function to convert enum value to string const char *ZigbeeCore::getDeviceTypeString(esp_zb_ha_standard_devices_t deviceId) { switch (deviceId) { diff --git a/libraries/Zigbee/src/ZigbeeCore.h b/libraries/Zigbee/src/ZigbeeCore.h index 75fecd59198..6729b7cc9f4 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -80,6 +80,8 @@ class ZigbeeCore { bool zigbeeInit(esp_zb_cfg_t *zb_cfg, bool erase_nvs); static void scanCompleteCallback(esp_zb_zdp_status_t zdo_status, uint8_t count, esp_zb_network_descriptor_t *nwk_descriptor); const char *getDeviceTypeString(esp_zb_ha_standard_devices_t deviceId); + void searchBindings(); + static void bindingTableCb(const esp_zb_zdo_binding_table_info_t *table_info, void *user_ctx); public: ZigbeeCore(); diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index 0a947d3ab9e..dbfe8596268 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -7,6 +7,8 @@ #include "esp_zigbee_cluster.h" #include "zcl/esp_zigbee_zcl_power_config.h" +#define ZB_CMD_TIMEOUT 10000 // 10 seconds + bool ZigbeeEP::_is_bound = false; bool ZigbeeEP::_allow_multiple_binding = false; @@ -112,13 +114,20 @@ void ZigbeeEP::reportBatteryPercentage() { log_v("Battery percentage reported"); } -char *ZigbeeEP::readManufacturer(uint8_t endpoint, uint16_t short_addr) { +char *ZigbeeEP::readManufacturer(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr) { /* Read peer Manufacture Name & Model Identifier */ esp_zb_zcl_read_attr_cmd_t read_req; - read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; + + if (short_addr != 0) { + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; + read_req.zcl_basic_cmd.dst_addr_u.addr_short = short_addr; + } else { + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + memcpy(read_req.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); + } + read_req.zcl_basic_cmd.src_endpoint = _endpoint; read_req.zcl_basic_cmd.dst_endpoint = endpoint; - read_req.zcl_basic_cmd.dst_addr_u.addr_short = short_addr; read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_BASIC; uint16_t attributes[] = { @@ -130,22 +139,31 @@ char *ZigbeeEP::readManufacturer(uint8_t endpoint, uint16_t short_addr) { // clear read manufacturer _read_manufacturer = nullptr; + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_read_attr_cmd_req(&read_req); + esp_zb_lock_release(); //Wait for response or timeout - if (xSemaphoreTake(lock, portMAX_DELAY) != pdTRUE) { + if (xSemaphoreTake(lock, ZB_CMD_TIMEOUT) != pdTRUE) { log_e("Error while reading manufacturer"); } return _read_manufacturer; } -char *ZigbeeEP::readModel(uint8_t endpoint, uint16_t short_addr) { +char *ZigbeeEP::readModel(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr) { /* Read peer Manufacture Name & Model Identifier */ esp_zb_zcl_read_attr_cmd_t read_req; - read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; + + if (short_addr != 0) { + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; + read_req.zcl_basic_cmd.dst_addr_u.addr_short = short_addr; + } else { + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + memcpy(read_req.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); + } + read_req.zcl_basic_cmd.src_endpoint = _endpoint; read_req.zcl_basic_cmd.dst_endpoint = endpoint; - read_req.zcl_basic_cmd.dst_addr_u.addr_short = short_addr; read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_BASIC; uint16_t attributes[] = { @@ -157,11 +175,12 @@ char *ZigbeeEP::readModel(uint8_t endpoint, uint16_t short_addr) { // clear read model _read_model = nullptr; + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_read_attr_cmd_req(&read_req); + esp_zb_lock_release(); //Wait for response or timeout - //Semaphore take - if (xSemaphoreTake(lock, portMAX_DELAY) != pdTRUE) { + if (xSemaphoreTake(lock, ZB_CMD_TIMEOUT) != pdTRUE) { log_e("Error while reading model"); } return _read_model; @@ -171,8 +190,23 @@ void ZigbeeEP::printBoundDevices() { log_i("Bound devices:"); for ([[maybe_unused]] const auto &device : _bound_devices) { - log_i("Device on endpoint %d, short address: 0x%x", device->endpoint, device->short_addr); - print_ieee_addr(device->ieee_addr); + log_i( + "Device on endpoint %d, short address: 0x%x, ieee address: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", device->endpoint, device->short_addr, + device->ieee_addr[7], device->ieee_addr[6], device->ieee_addr[5], device->ieee_addr[4], device->ieee_addr[3], device->ieee_addr[2], device->ieee_addr[1], + device->ieee_addr[0] + ); + } +} + +void ZigbeeEP::printBoundDevices(Print &print) { + print.println("Bound devices:"); + for ([[maybe_unused]] + const auto &device : _bound_devices) { + print.printf( + "Device on endpoint %d, short address: 0x%x, ieee address: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\r\n", device->endpoint, device->short_addr, + device->ieee_addr[7], device->ieee_addr[6], device->ieee_addr[5], device->ieee_addr[4], device->ieee_addr[3], device->ieee_addr[2], device->ieee_addr[1], + device->ieee_addr[0] + ); } } diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index 21ed7706d31..522c84620ff 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -9,8 +9,6 @@ /* Useful defines */ #define ZB_ARRAY_LENTH(arr) (sizeof(arr) / sizeof(arr[0])) -#define print_ieee_addr(addr) \ - log_i("IEEE Address: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7]) #define XYZ_TO_RGB(X, Y, Z, r, g, b) \ { \ r = (float)(3.240479 * (X) - 1.537150 * (Y) - 0.498535 * (Z)); \ @@ -69,6 +67,8 @@ class ZigbeeEP { } void printBoundDevices(); + void printBoundDevices(Print &print); + std::list getBoundDevices() const { return _bound_devices; } @@ -87,8 +87,8 @@ class ZigbeeEP { void reportBatteryPercentage(); // Methods to read manufacturer and model name from selected endpoint and short address - char *readManufacturer(uint8_t endpoint, uint16_t short_addr); - char *readModel(uint8_t endpoint, uint16_t short_addr); + char *readManufacturer(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr); + char *readModel(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr); bool epAllowMultipleBinding() { return _allow_multiple_binding; @@ -108,7 +108,6 @@ class ZigbeeEP { } private: - static bool _allow_multiple_binding; char *_read_manufacturer; char *_read_model; void (*_on_identify)(uint16_t time); @@ -119,10 +118,15 @@ class ZigbeeEP { esp_zb_endpoint_config_t _ep_config; esp_zb_cluster_list_t *_cluster_list; static bool _is_bound; + static bool _allow_multiple_binding; std::list _bound_devices; SemaphoreHandle_t lock; zb_power_source_t _power_source; + void addBoundDevice(zb_device_params_t *device) { + _bound_devices.push_back(device); + _is_bound = true; + } friend class ZigbeeCore; }; diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp index 8e72728f6a2..4fd492a5477 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp @@ -98,10 +98,10 @@ void ZigbeeColorDimmerSwitch::lightToggle() { cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_TOGGLE_ID; - log_i("Sending 'light toggle' command"); - //esp_zb_lock_acquire(portMAX_DELAY); + log_v("Sending 'light toggle' command"); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); - //esp_zb_lock_release(); + esp_zb_lock_release(); } else { log_e("Light not bound"); } @@ -114,7 +114,7 @@ void ZigbeeColorDimmerSwitch::lightToggle(uint16_t group_addr) { cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = group_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_TOGGLE_ID; - log_i("Sending 'light toggle' command to group address 0x%x", group_addr); + log_v("Sending 'light toggle' command to group address 0x%x", group_addr); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -131,7 +131,27 @@ void ZigbeeColorDimmerSwitch::lightToggle(uint8_t endpoint, uint16_t short_addr) cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = short_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_TOGGLE_ID; - log_i("Sending 'light toggle' command to endpoint %d, address 0x%x", endpoint, short_addr); + log_v("Sending 'light toggle' command to endpoint %d, address 0x%x", endpoint, short_addr); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); + } else { + log_e("Light not bound"); + } +} + +void ZigbeeColorDimmerSwitch::lightToggle(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { + if (_is_bound) { + esp_zb_zcl_on_off_cmd_t cmd_req; + cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; + cmd_req.zcl_basic_cmd.dst_endpoint = endpoint; + cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_TOGGLE_ID; + memcpy(cmd_req.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); + log_v( + "Sending 'light toggle' command to endpoint %d, ieee address %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", endpoint, ieee_addr[7], ieee_addr[6], ieee_addr[5], + ieee_addr[4], ieee_addr[3], ieee_addr[2], ieee_addr[1], ieee_addr[0] + ); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -146,7 +166,7 @@ void ZigbeeColorDimmerSwitch::lightOn() { cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_ON_ID; - log_i("Sending 'light on' command"); + log_v("Sending 'light on' command"); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -162,7 +182,7 @@ void ZigbeeColorDimmerSwitch::lightOn(uint16_t group_addr) { cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = group_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_ON_ID; - log_i("Sending 'light on' command to group address 0x%x", group_addr); + log_v("Sending 'light on' command to group address 0x%x", group_addr); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -179,7 +199,27 @@ void ZigbeeColorDimmerSwitch::lightOn(uint8_t endpoint, uint16_t short_addr) { cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = short_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_ON_ID; - log_i("Sending 'light on' command to endpoint %d, address 0x%x", endpoint, short_addr); + log_v("Sending 'light on' command to endpoint %d, address 0x%x", endpoint, short_addr); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); + } else { + log_e("Light not bound"); + } +} + +void ZigbeeColorDimmerSwitch::lightOn(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { + if (_is_bound) { + esp_zb_zcl_on_off_cmd_t cmd_req; + cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; + cmd_req.zcl_basic_cmd.dst_endpoint = endpoint; + cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_ON_ID; + memcpy(cmd_req.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); + log_v( + "Sending 'light on' command to endpoint %d, ieee address %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", endpoint, ieee_addr[7], ieee_addr[6], ieee_addr[5], + ieee_addr[4], ieee_addr[3], ieee_addr[2], ieee_addr[1], ieee_addr[0] + ); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -194,7 +234,7 @@ void ZigbeeColorDimmerSwitch::lightOff() { cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_OFF_ID; - log_i("Sending 'light off' command"); + log_v("Sending 'light off' command"); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -210,7 +250,7 @@ void ZigbeeColorDimmerSwitch::lightOff(uint16_t group_addr) { cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = group_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_OFF_ID; - log_i("Sending 'light off' command to group address 0x%x", group_addr); + log_v("Sending 'light off' command to group address 0x%x", group_addr); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -227,7 +267,27 @@ void ZigbeeColorDimmerSwitch::lightOff(uint8_t endpoint, uint16_t short_addr) { cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = short_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_OFF_ID; - log_i("Sending 'light off' command to endpoint %d, address 0x%x", endpoint, short_addr); + log_v("Sending 'light off' command to endpoint %d, address 0x%x", endpoint, short_addr); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); + } else { + log_e("Light not bound"); + } +} + +void ZigbeeColorDimmerSwitch::lightOff(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { + if (_is_bound) { + esp_zb_zcl_on_off_cmd_t cmd_req; + cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; + cmd_req.zcl_basic_cmd.dst_endpoint = endpoint; + cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_OFF_ID; + memcpy(cmd_req.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); + log_v( + "Sending 'light off' command to endpoint %d, ieee address %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", endpoint, ieee_addr[7], ieee_addr[6], ieee_addr[5], + ieee_addr[4], ieee_addr[3], ieee_addr[2], ieee_addr[1], ieee_addr[0] + ); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -243,7 +303,7 @@ void ZigbeeColorDimmerSwitch::lightOffWithEffect(uint8_t effect_id, uint8_t effe cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; cmd_req.effect_id = effect_id; cmd_req.effect_variant = effect_variant; - log_i("Sending 'light off with effect' command"); + log_v("Sending 'light off with effect' command"); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_off_with_effect_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -257,7 +317,7 @@ void ZigbeeColorDimmerSwitch::lightOnWithSceneRecall() { esp_zb_zcl_on_off_on_with_recall_global_scene_cmd_t cmd_req; cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; - log_i("Sending 'light on with scene recall' command"); + log_v("Sending 'light on with scene recall' command"); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_on_with_recall_global_scene_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -274,7 +334,7 @@ void ZigbeeColorDimmerSwitch::lightOnWithTimedOff(uint8_t on_off_control, uint16 cmd_req.on_off_control = on_off_control; //TODO: Test how it works, then maybe change API cmd_req.on_time = time_on; cmd_req.off_wait_time = time_off; - log_i("Sending 'light on with time off' command"); + log_v("Sending 'light on with time off' command"); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_on_with_timed_off_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -290,7 +350,7 @@ void ZigbeeColorDimmerSwitch::setLightLevel(uint8_t level) { cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; cmd_req.level = level; cmd_req.transition_time = 0xffff; - log_i("Sending 'set light level' command"); + log_v("Sending 'set light level' command"); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_level_move_to_level_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -307,7 +367,7 @@ void ZigbeeColorDimmerSwitch::setLightLevel(uint8_t level, uint16_t group_addr) cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT; cmd_req.level = level; cmd_req.transition_time = 0xffff; - log_i("Sending 'set light level' command to group address 0x%x", group_addr); + log_v("Sending 'set light level' command to group address 0x%x", group_addr); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_level_move_to_level_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -325,7 +385,28 @@ void ZigbeeColorDimmerSwitch::setLightLevel(uint8_t level, uint8_t endpoint, uin cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; cmd_req.level = level; cmd_req.transition_time = 0xffff; - log_i("Sending 'set light level' command to endpoint %d, address 0x%x", endpoint, short_addr); + log_v("Sending 'set light level' command to endpoint %d, address 0x%x", endpoint, short_addr); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_level_move_to_level_cmd_req(&cmd_req); + esp_zb_lock_release(); + } else { + log_e("Light not bound"); + } +} + +void ZigbeeColorDimmerSwitch::setLightLevel(uint8_t level, uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { + if (_is_bound) { + esp_zb_zcl_move_to_level_cmd_t cmd_req; + cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; + cmd_req.zcl_basic_cmd.dst_endpoint = endpoint; + cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + memcpy(cmd_req.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); + cmd_req.level = level; + cmd_req.transition_time = 0xffff; + log_v( + "Sending 'set light level' command to endpoint %d, ieee address %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", endpoint, ieee_addr[7], ieee_addr[6], + ieee_addr[5], ieee_addr[4], ieee_addr[3], ieee_addr[2], ieee_addr[1], ieee_addr[0] + ); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_level_move_to_level_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -346,7 +427,7 @@ void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t cmd_req.color_x = color_x; cmd_req.color_y = color_y; cmd_req.transition_time = 0; - log_i("Sending 'set light color' command"); + log_v("Sending 'set light color' command"); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_color_move_to_color_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -368,7 +449,7 @@ void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t cmd_req.color_x = color_x; cmd_req.color_y = color_y; cmd_req.transition_time = 0; - log_i("Sending 'set light color' command to group address 0x%x", group_addr); + log_v("Sending 'set light color' command to group address 0x%x", group_addr); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_color_move_to_color_cmd_req(&cmd_req); esp_zb_lock_release(); @@ -391,7 +472,33 @@ void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t cmd_req.color_x = color_x; cmd_req.color_y = color_y; cmd_req.transition_time = 0; - log_i("Sending 'set light color' command to endpoint %d, address 0x%x", endpoint, short_addr); + log_v("Sending 'set light color' command to endpoint %d, address 0x%x", endpoint, short_addr); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_color_move_to_color_cmd_req(&cmd_req); + esp_zb_lock_release(); + } else { + log_e("Light not bound"); + } +} + +void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { + if (_is_bound) { + //Convert RGB to XY + uint16_t color_x, color_y; + calculateXY(red, green, blue, color_x, color_y); + + esp_zb_zcl_color_move_to_color_cmd_t cmd_req; + cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; + cmd_req.zcl_basic_cmd.dst_endpoint = endpoint; + cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + memcpy(cmd_req.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); + cmd_req.color_x = color_x; + cmd_req.color_y = color_y; + cmd_req.transition_time = 0; + log_v( + "Sending 'set light color' command to endpoint %d, ieee address %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", endpoint, ieee_addr[7], ieee_addr[6], + ieee_addr[5], ieee_addr[4], ieee_addr[3], ieee_addr[2], ieee_addr[1], ieee_addr[0] + ); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_color_move_to_color_cmd_req(&cmd_req); esp_zb_lock_release(); diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h index 9b623d2f8ef..8e2a4d9e1a3 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h @@ -18,14 +18,17 @@ class ZigbeeColorDimmerSwitch : public ZigbeeEP { void lightToggle(); void lightToggle(uint16_t group_addr); void lightToggle(uint8_t endpoint, uint16_t short_addr); + void lightToggle(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr); void lightOn(); void lightOn(uint16_t group_addr); void lightOn(uint8_t endpoint, uint16_t short_addr); + void lightOn(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr); void lightOff(); void lightOff(uint16_t group_addr); void lightOff(uint8_t endpoint, uint16_t short_addr); + void lightOff(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr); void lightOffWithEffect(uint8_t effect_id, uint8_t effect_variant); void lightOnWithTimedOff(uint8_t on_off_control, uint16_t time_on, uint16_t time_off); @@ -34,10 +37,12 @@ class ZigbeeColorDimmerSwitch : public ZigbeeEP { void setLightLevel(uint8_t level); void setLightLevel(uint8_t level, uint16_t group_addr); void setLightLevel(uint8_t level, uint8_t endpoint, uint16_t short_addr); + void setLightLevel(uint8_t level, uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr); void setLightColor(uint8_t red, uint8_t green, uint8_t blue); void setLightColor(uint8_t red, uint8_t green, uint8_t blue, uint16_t group_addr); void setLightColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t endpoint, uint16_t short_addr); + void setLightColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr); private: // save instance of the class in order to use it in static functions diff --git a/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp b/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp index 16af8008a8a..f6b36d7f0d4 100644 --- a/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp @@ -59,7 +59,6 @@ void ZigbeeSwitch::findEndpoint(esp_zb_zdo_match_desc_req_param_t *cmd_req) { .num_out_clusters = 1, .cluster_list = cluster_list, }; - esp_zb_zdo_match_cluster(&on_off_req, findCb, &_endpoint); } @@ -70,8 +69,10 @@ void ZigbeeSwitch::lightToggle() { cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_TOGGLE_ID; - log_i("Sending 'light toggle' command"); + log_v("Sending 'light toggle' command"); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); } else { log_e("Light not bound"); } @@ -84,8 +85,10 @@ void ZigbeeSwitch::lightToggle(uint16_t group_addr) { cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = group_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_TOGGLE_ID; - log_i("Sending 'light toggle' command to group address 0x%x", group_addr); + log_v("Sending 'light toggle' command to group address 0x%x", group_addr); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); } else { log_e("Light not bound"); } @@ -99,8 +102,30 @@ void ZigbeeSwitch::lightToggle(uint8_t endpoint, uint16_t short_addr) { cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = short_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_TOGGLE_ID; - log_i("Sending 'light toggle' command to endpoint %d, address 0x%x", endpoint, short_addr); + log_v("Sending 'light toggle' command to endpoint %d, address 0x%x", endpoint, short_addr); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); + } else { + log_e("Light not bound"); + } +} + +void ZigbeeSwitch::lightToggle(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { + if (_is_bound) { + esp_zb_zcl_on_off_cmd_t cmd_req; + cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; + cmd_req.zcl_basic_cmd.dst_endpoint = endpoint; + cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_TOGGLE_ID; + memcpy(cmd_req.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); + log_v( + "Sending 'light toggle' command to endpoint %d, ieee address %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", endpoint, ieee_addr[7], ieee_addr[6], ieee_addr[5], + ieee_addr[4], ieee_addr[3], ieee_addr[2], ieee_addr[1], ieee_addr[0] + ); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); } else { log_e("Light not bound"); } @@ -112,8 +137,10 @@ void ZigbeeSwitch::lightOn() { cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_ON_ID; - log_i("Sending 'light on' command"); + log_v("Sending 'light on' command"); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); } else { log_e("Light not bound"); } @@ -126,8 +153,10 @@ void ZigbeeSwitch::lightOn(uint16_t group_addr) { cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = group_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_ON_ID; - log_i("Sending 'light on' command to group address 0x%x", group_addr); + log_v("Sending 'light on' command to group address 0x%x", group_addr); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); } else { log_e("Light not bound"); } @@ -141,8 +170,30 @@ void ZigbeeSwitch::lightOn(uint8_t endpoint, uint16_t short_addr) { cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = short_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_ON_ID; - log_i("Sending 'light on' command to endpoint %d, address 0x%x", endpoint, short_addr); + log_v("Sending 'light on' command to endpoint %d, address 0x%x", endpoint, short_addr); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); + } else { + log_e("Light not bound"); + } +} + +void ZigbeeSwitch::lightOn(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { + if (_is_bound) { + esp_zb_zcl_on_off_cmd_t cmd_req; + cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; + cmd_req.zcl_basic_cmd.dst_endpoint = endpoint; + cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_ON_ID; + memcpy(cmd_req.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); + log_v( + "Sending 'light on' command to endpoint %d, ieee address %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", endpoint, ieee_addr[7], ieee_addr[6], ieee_addr[5], + ieee_addr[4], ieee_addr[3], ieee_addr[2], ieee_addr[1], ieee_addr[0] + ); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); } else { log_e("Light not bound"); } @@ -154,8 +205,10 @@ void ZigbeeSwitch::lightOff() { cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_OFF_ID; - log_i("Sending 'light off' command"); + log_v("Sending 'light off' command"); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); } else { log_e("Light not bound"); } @@ -168,8 +221,10 @@ void ZigbeeSwitch::lightOff(uint16_t group_addr) { cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = group_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_OFF_ID; - log_i("Sending 'light off' command to group address 0x%x", group_addr); + log_v("Sending 'light off' command to group address 0x%x", group_addr); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); } else { log_e("Light not bound"); } @@ -183,8 +238,30 @@ void ZigbeeSwitch::lightOff(uint8_t endpoint, uint16_t short_addr) { cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = short_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_OFF_ID; - log_i("Sending 'light off' command to endpoint %d, address 0x%x", endpoint, short_addr); + log_v("Sending 'light off' command to endpoint %d, address 0x%x", endpoint, short_addr); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); + } else { + log_e("Light not bound"); + } +} + +void ZigbeeSwitch::lightOff(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { + if (_is_bound) { + esp_zb_zcl_on_off_cmd_t cmd_req; + cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; + cmd_req.zcl_basic_cmd.dst_endpoint = endpoint; + cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + cmd_req.on_off_cmd_id = ESP_ZB_ZCL_CMD_ON_OFF_OFF_ID; + memcpy(cmd_req.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); + log_v( + "Sending 'light off' command to endpoint %d, ieee address %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", endpoint, ieee_addr[7], ieee_addr[6], ieee_addr[5], + ieee_addr[4], ieee_addr[3], ieee_addr[2], ieee_addr[1], ieee_addr[0] + ); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_cmd_req(&cmd_req); + esp_zb_lock_release(); } else { log_e("Light not bound"); } @@ -197,8 +274,10 @@ void ZigbeeSwitch::lightOffWithEffect(uint8_t effect_id, uint8_t effect_variant) cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; cmd_req.effect_id = effect_id; cmd_req.effect_variant = effect_variant; - log_i("Sending 'light off with effect' command"); + log_v("Sending 'light off with effect' command"); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_off_with_effect_cmd_req(&cmd_req); + esp_zb_lock_release(); } else { log_e("Light not bound"); } @@ -209,8 +288,10 @@ void ZigbeeSwitch::lightOnWithSceneRecall() { esp_zb_zcl_on_off_on_with_recall_global_scene_cmd_t cmd_req; cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; - log_i("Sending 'light on with scene recall' command"); + log_v("Sending 'light on with scene recall' command"); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_on_with_recall_global_scene_cmd_req(&cmd_req); + esp_zb_lock_release(); } else { log_e("Light not bound"); } @@ -223,8 +304,10 @@ void ZigbeeSwitch::lightOnWithTimedOff(uint8_t on_off_control, uint16_t time_on, cmd_req.on_off_control = on_off_control; //TODO: Test how it works, then maybe change API cmd_req.on_time = time_on; cmd_req.off_wait_time = time_off; - log_i("Sending 'light on with time off' command"); + log_v("Sending 'light on with time off' command"); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_on_off_on_with_timed_off_cmd_req(&cmd_req); + esp_zb_lock_release(); } else { log_e("Light not bound"); } diff --git a/libraries/Zigbee/src/ep/ZigbeeSwitch.h b/libraries/Zigbee/src/ep/ZigbeeSwitch.h index a8d892f37e9..62264641378 100644 --- a/libraries/Zigbee/src/ep/ZigbeeSwitch.h +++ b/libraries/Zigbee/src/ep/ZigbeeSwitch.h @@ -18,14 +18,17 @@ class ZigbeeSwitch : public ZigbeeEP { void lightToggle(); void lightToggle(uint16_t group_addr); void lightToggle(uint8_t endpoint, uint16_t short_addr); + void lightToggle(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr); void lightOn(); void lightOn(uint16_t group_addr); void lightOn(uint8_t endpoint, uint16_t short_addr); + void lightOn(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr); void lightOff(); void lightOff(uint16_t group_addr); void lightOff(uint8_t endpoint, uint16_t short_addr); + void lightOff(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr); void lightOffWithEffect(uint8_t effect_id, uint8_t effect_variant); void lightOnWithTimedOff(uint8_t on_off_control, uint16_t time_on, uint16_t time_off); diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp index 718c892f638..3dfac0489dd 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp @@ -60,7 +60,9 @@ void ZigbeeTempSensor::setReporting(uint16_t min_interval, uint16_t max_interval }, .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, }; + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_update_reporting_info(&reporting_info); + esp_zb_lock_release(); } void ZigbeeTempSensor::setTemperature(float temperature) { @@ -158,7 +160,9 @@ void ZigbeeTempSensor::setHumidityReporting(uint16_t min_interval, uint16_t max_ }, .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, }; + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_update_reporting_info(&reporting_info); + esp_zb_lock_release(); } #endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED From 76d1f9e64385d61df2b444ed23d8b47881193988 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 9 Dec 2024 10:00:41 -0300 Subject: [PATCH 034/183] ci(pre-commit): Bump hooks versions and fix leftover files (#10680) * update(hooks): Bump pre-commit hooks versions * fix(formatting): Fix python script formatting * fix(formatting): Fix leftover files on protected folders --- .github/ISSUE_TEMPLATE/Issue-report.yml | 24 +- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/scripts/merge_packages.py | 78 +++--- .github/workflows/allboards.yml | 18 +- .github/workflows/boards.yml | 14 +- .github/workflows/build_py_tools.yml | 42 ++-- .github/workflows/dangerjs.yml | 20 +- .github/workflows/docs_build.yml | 57 +++-- .github/workflows/docs_deploy.yml | 80 +++--- .github/workflows/gh-pages.yml | 21 +- .github/workflows/lib.yml | 14 +- .github/workflows/pre-commit.yml | 2 +- .github/workflows/publishlib.yml | 2 +- .github/workflows/publishsizes-2.x.yml | 7 +- .github/workflows/publishsizes.yml | 4 +- .github/workflows/push.yml | 227 +++++++++--------- .github/workflows/release.yml | 24 +- .github/workflows/tests.yml | 32 +-- .github/workflows/tests_build.yml | 4 +- .github/workflows/tests_hw.yml | 4 +- .github/workflows/tests_qemu.yml | 4 +- .github/workflows/tests_results.yml | 16 +- .github/workflows/tests_wokwi.yml | 4 +- .pre-commit-config.yaml | 8 +- .../MatterEndpoints/MatterGenericSwitch.cpp | 2 +- .../performance/psramspeed/test_psramspeed.py | 2 +- tests/performance/ramspeed/test_ramspeed.py | 2 +- tools/gen_esp32part.py | 2 +- 28 files changed, 363 insertions(+), 353 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/Issue-report.yml b/.github/ISSUE_TEMPLATE/Issue-report.yml index d5b756085c7..d1b8c166b9a 100644 --- a/.github/ISSUE_TEMPLATE/Issue-report.yml +++ b/.github/ISSUE_TEMPLATE/Issue-report.yml @@ -5,7 +5,7 @@ body: - type: markdown attributes: value: | - * Before reporting a new issue please check and search in [List of existing issues](https://github.com/espressif/arduino-esp32/issues?q=is%3Aissue) + * Before reporting a new issue please check and search in [List of existing issues](https://github.com/espressif/arduino-esp32/issues?q=is%3Aissue) * Please check [Online Documentation](https://docs.espressif.com/projects/arduino-esp32/en/latest/index.html) * Take a look on [Troubleshooting guide](https://docs.espressif.com/projects/arduino-esp32/en/latest/troubleshooting.html) * If still experiencing the issue, please provide as many details as possible below about your hardware, computer setup and code. @@ -24,7 +24,7 @@ body: description: What development board or other hardware is the chip attached to? placeholder: ex. DevKitC, plain module on breadboard, etc. If your hardware is custom or unusual, please attach a photo. validations: - required: true + required: true - type: textarea id: other-hw attributes: @@ -60,7 +60,7 @@ body: - v2.0.8 - v2.0.7 - v2.0.6 - - v2.0.5 + - v2.0.5 - v2.0.4 - v2.0.3 - v2.0.2 @@ -77,7 +77,7 @@ body: description: What IDE are you using? placeholder: eg. Arduino IDE, PlatformIO, Sloeber... validations: - required: true + required: true - type: input id: os attributes: @@ -95,13 +95,13 @@ body: validations: required: true - type: dropdown - id: PSRAM + id: PSRAM attributes: label: PSRAM enabled description: Is PSRAM enabled? options: - - 'yes' - - 'no' + - "yes" + - "no" validations: required: true - type: input @@ -116,8 +116,8 @@ body: id: Description attributes: label: Description - description: Please describe your problem here and expected behaviour - placeholder: ex. Can't connect/weird behaviour/wrong function/missing parameter.. + description: Please describe your problem here and expected behavior + placeholder: ex. Can't connect/weird behavior/wrong function/missing parameter.. validations: required: true - type: textarea @@ -128,7 +128,7 @@ body: placeholder: ex. Related part of the code to replicate the issue render: cpp validations: - required: true + required: true - type: textarea id: Debug attributes: @@ -137,11 +137,11 @@ body: placeholder: Enable Core debug level - Debug on tools menu of Arduino IDE, then put the serial output here. render: plain validations: - required: true + required: true - type: textarea id: other-remarks attributes: - label: Other Steps to Reproduce + label: Other Steps to Reproduce description: Is there any other information you can think of which will help us reproduce this problem? Any additional info can be added as well. placeholder: ex. I also tried on other OS, HW...it works correctly on that setup. - type: checkboxes diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 2a9b0ef82e0..03b3a76df1e 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -5,4 +5,4 @@ contact_links: about: Community channel for questions and help - name: ESP32 Forum - Arduino url: https://esp32.com/viewforum.php?f=19 - about: Official Forum for questions \ No newline at end of file + about: Official Forum for questions diff --git a/.github/scripts/merge_packages.py b/.github/scripts/merge_packages.py index 96999c17fd7..7e4f47ca8b3 100755 --- a/.github/scripts/merge_packages.py +++ b/.github/scripts/merge_packages.py @@ -1,50 +1,58 @@ #!/usr/bin/env python + # This script merges two Arduino Board Manager package json files. # Usage: # python merge_packages.py package_esp8266com_index.json version/new/package_esp8266com_index.json # Written by Ivan Grokhotkov, 2015 # + from __future__ import print_function -#from distutils.version import LooseVersion + +# from distutils.version import LooseVersion from packaging.version import Version import re import json import sys + def load_package(filename): - pkg = json.load(open(filename))['packages'][0] - print("Loaded package {0} from {1}".format(pkg['name'], filename), file=sys.stderr) - print("{0} platform(s), {1} tools".format(len(pkg['platforms']), len(pkg['tools'])), file=sys.stderr) + pkg = json.load(open(filename))["packages"][0] + print("Loaded package {0} from {1}".format(pkg["name"], filename), file=sys.stderr) + print("{0} platform(s), {1} tools".format(len(pkg["platforms"]), len(pkg["tools"])), file=sys.stderr) return pkg + def merge_objects(versions, obj): for o in obj: - name = o['name'].encode('ascii') - ver = o['version'].encode('ascii') - if not name in versions: + name = o["name"].encode("ascii") + ver = o["version"].encode("ascii") + if name not in versions: print("found new object, {0}".format(name), file=sys.stderr) versions[name] = {} - if not ver in versions[name]: + if ver not in versions[name]: print("found new version {0} for object {1}".format(ver, name), file=sys.stderr) versions[name][ver] = o return versions -# Normalize ESP release version string (x.x.x) by adding '-rc' (x.x.x-rc9223372036854775807) to ensure having REL above any RC -# Dummy approach, functional anyway for current ESP package versioning (unlike NormalizedVersion/LooseVersion/StrictVersion & similar crap) + +# Normalize ESP release version string (x.x.x) by adding '-rc' (x.x.x-rc9223372036854775807) +# to ensure having REL above any RC +# Dummy approach, functional anyway for current ESP package versioning +# (unlike NormalizedVersion/LooseVersion/StrictVersion & similar crap) def pkgVersionNormalized(versionString): verStr = str(versionString) - verParts = re.split('\.|-rc|-alpha', verStr, flags=re.IGNORECASE) - + verParts = re.split(r"\.|-rc|-alpha", verStr, flags=re.IGNORECASE) + if len(verParts) == 3: - if (sys.version_info > (3, 0)): # Python 3 - verStr = str(versionString) + '-rc' + str(sys.maxsize) - else: # Python 2 - verStr = str(versionString) + '-rc' + str(sys.maxint) - + if sys.version_info > (3, 0): # Python 3 + verStr = str(versionString) + "-rc" + str(sys.maxsize) + else: # Python 2 + verStr = str(versionString) + "-rc" + str(sys.maxint) + elif len(verParts) != 4: print("pkgVersionNormalized WARNING: unexpected version format: {0})".format(verStr), file=sys.stderr) - + return verStr @@ -54,31 +62,37 @@ def main(args): return 1 tools = {} - platforms = {} + platforms = {} pkg1 = load_package(args[1]) - tools = merge_objects(tools, pkg1['tools']); - platforms = merge_objects(platforms, pkg1['platforms']); + tools = merge_objects(tools, pkg1["tools"]) + platforms = merge_objects(platforms, pkg1["platforms"]) pkg2 = load_package(args[2]) - tools = merge_objects(tools, pkg2['tools']); - platforms = merge_objects(platforms, pkg2['platforms']); + tools = merge_objects(tools, pkg2["tools"]) + platforms = merge_objects(platforms, pkg2["platforms"]) - pkg1['tools'] = [] - pkg1['platforms'] = [] + pkg1["tools"] = [] + pkg1["platforms"] = [] for name in tools: for version in tools[name]: print("Adding tool {0}-{1}".format(name, version), file=sys.stderr) - pkg1['tools'].append(tools[name][version]) + pkg1["tools"].append(tools[name][version]) for name in platforms: for version in platforms[name]: print("Adding platform {0}-{1}".format(name, version), file=sys.stderr) - pkg1['platforms'].append(platforms[name][version]) - - #pkg1['platforms'] = sorted(pkg1['platforms'], key=lambda k: LooseVersion(pkgVersionNormalized(k['version'])), reverse=True) - pkg1['platforms'] = sorted(pkg1['platforms'], key=lambda k: Version(pkgVersionNormalized(k['version'])), reverse=True) + pkg1["platforms"].append(platforms[name][version]) + + # pkg1["platforms"] = sorted( + # pkg1["platforms"], key=lambda k: LooseVersion(pkgVersionNormalized(k["version"])), reverse=True + # ) + + pkg1["platforms"] = sorted( + pkg1["platforms"], key=lambda k: Version(pkgVersionNormalized(k["version"])), reverse=True + ) + + json.dump({"packages": [pkg1]}, sys.stdout, indent=2) - json.dump({'packages':[pkg1]}, sys.stdout, indent=2) -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main(sys.argv)) diff --git a/.github/workflows/allboards.yml b/.github/workflows/allboards.yml index 4a2d4349ac3..8c4dadcd03e 100644 --- a/.github/workflows/allboards.yml +++ b/.github/workflows/allboards.yml @@ -1,6 +1,6 @@ name: Boards Test - Remote trigger -# The workflow will run on remote dispath with event-type set to "test-boards" +# The workflow will run on remote dispatch with event-type set to "test-boards" on: repository_dispatch: types: [test-boards] @@ -20,8 +20,7 @@ jobs: ref: ${{ github.event.client_payload.branch }} - name: Get boards fqbns - run: - bash .github/scripts/find_all_boards.sh + run: bash .github/scripts/find_all_boards.sh setup-chunks: needs: find-boards @@ -43,8 +42,7 @@ jobs: - id: set-test-chunks name: Set Chunks - run: - echo "test-chunks<> $GITHUB_OUTPUT + run: echo "test-chunks<> $GITHUB_OUTPUT echo "$( jq -nc '${{ needs.find-boards.outputs.fqbns }} | [_nwise( ${{ needs.find-boards.outputs.board-count }}/15 | ceil)]')" >> $GITHUB_OUTPUT @@ -61,7 +59,7 @@ jobs: strategy: fail-fast: false - matrix: + matrix: chunk: ${{ fromJSON(needs.setup-chunks.outputs['test-chunks']) }} steps: @@ -71,9 +69,8 @@ jobs: ref: ${{ github.event.client_payload.branch }} - name: Echo FQBNS to file - run: - echo "$FQBN" > fqbns.json - env: + run: echo "$FQBN" > fqbns.json + env: FQBN: ${{ toJSON(matrix.chunk) }} - name: Compile sketch @@ -88,5 +85,4 @@ jobs: enable-warnings-report: false cli-compile-flags: | - --warnings="all" - sketch-paths: - "- ./libraries/ESP32/examples/CI/CIBoardsTest/CIBoardsTest.ino" + sketch-paths: "- ./libraries/ESP32/examples/CI/CIBoardsTest/CIBoardsTest.ino" diff --git a/.github/workflows/boards.yml b/.github/workflows/boards.yml index a309e4ed2ce..a51c794cfb4 100644 --- a/.github/workflows/boards.yml +++ b/.github/workflows/boards.yml @@ -4,9 +4,9 @@ name: Boards Test on: pull_request: paths: - - 'boards.txt' - - 'libraries/ESP32/examples/CI/CIBoardsTest/CIBoardsTest.ino' - - '.github/workflows/boards.yml' + - "boards.txt" + - "libraries/ESP32/examples/CI/CIBoardsTest/CIBoardsTest.ino" + - ".github/workflows/boards.yml" env: # It's convenient to set variables for values used multiple times in the workflow @@ -28,8 +28,7 @@ jobs: uses: dcarbone/install-jq-action@v1.0.1 - name: Get board name - run: - bash .github/scripts/find_new_boards.sh ${{ github.repository }} ${{github.base_ref}} + run: bash .github/scripts/find_new_boards.sh ${{ github.repository }} ${{github.base_ref}} test-boards: needs: find-boards @@ -72,7 +71,7 @@ jobs: ./tools/openocd-esp32 ./tools/riscv32-* ./tools/xtensa-* - + - name: Compile sketch uses: P-R-O-C-H-Y/compile-sketches@main with: @@ -85,6 +84,5 @@ jobs: cli-compile-flags: | - --warnings="all" exit-on-fail: true - sketch-paths: - "- ./libraries/ESP32/examples/CI/CIBoardsTest/CIBoardsTest.ino" + sketch-paths: "- ./libraries/ESP32/examples/CI/CIBoardsTest/CIBoardsTest.ino" verbose: true diff --git a/.github/workflows/build_py_tools.yml b/.github/workflows/build_py_tools.yml index 37742d15224..48e7f2c82d3 100644 --- a/.github/workflows/build_py_tools.yml +++ b/.github/workflows/build_py_tools.yml @@ -3,11 +3,11 @@ name: Build Python Tools on: pull_request: paths: - - '.github/workflows/build_py_tools.yml' - - 'tools/get.py' - - 'tools/espota.py' - - 'tools/gen_esp32part.py' - - 'tools/gen_insights_package.py' + - ".github/workflows/build_py_tools.yml" + - "tools/get.py" + - "tools/espota.py" + - "tools/gen_esp32part.py" + - "tools/gen_insights_package.py" jobs: find-changed-tools: @@ -33,8 +33,8 @@ jobs: uses: tj-actions/changed-files@v41 id: verify-changed-files with: - fetch_depth: '2' - since_last_remote_commit: 'true' + fetch_depth: "2" + since_last_remote_commit: "true" files: | tools/get.py tools/espota.py @@ -57,20 +57,20 @@ jobs: matrix: os: [windows-latest, macos-latest, ubuntu-20.04, ARM] include: - - os: windows-latest - TARGET: win64 - EXTEN: .exe - SEPARATOR: ';' - - os: macos-latest - TARGET: macos - SEPARATOR: ':' - - os: ubuntu-20.04 - TARGET: linux-amd64 - SEPARATOR: ':' - - os: ARM - CONTAINER: python:3.8-bullseye - TARGET: arm - SEPARATOR: ':' + - os: windows-latest + TARGET: win64 + EXTEN: .exe + SEPARATOR: ";" + - os: macos-latest + TARGET: macos + SEPARATOR: ":" + - os: ubuntu-20.04 + TARGET: linux-amd64 + SEPARATOR: ":" + - os: ARM + CONTAINER: python:3.8-bullseye + TARGET: arm + SEPARATOR: ":" container: ${{ matrix.CONTAINER }} # use python container on ARM env: DISTPATH: pytools-${{ matrix.TARGET }} diff --git a/.github/workflows/dangerjs.yml b/.github/workflows/dangerjs.yml index 75c046731f3..f4bdad3c16e 100644 --- a/.github/workflows/dangerjs.yml +++ b/.github/workflows/dangerjs.yml @@ -11,14 +11,14 @@ jobs: pull-request-style-linter: runs-on: ubuntu-latest steps: - - name: Check out PR head - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.sha }} + - name: Check out PR head + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} - - name: DangerJS pull request linter - uses: espressif/shared-github-dangerjs@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - rule-max-commits: 'false' - commit-messages-min-summary-length: '10' + - name: DangerJS pull request linter + uses: espressif/shared-github-dangerjs@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + rule-max-commits: "false" + commit-messages-min-summary-length: "10" diff --git a/.github/workflows/docs_build.yml b/.github/workflows/docs_build.yml index ffa5a0b4580..d2f12e1f7b5 100644 --- a/.github/workflows/docs_build.yml +++ b/.github/workflows/docs_build.yml @@ -3,18 +3,17 @@ name: Documentation Build and Deploy CI on: push: branches: - - master - - release/v2.x + - master + - release/v2.x paths: - - 'docs/**' - - '.github/workflows/docs_build.yml' + - "docs/**" + - ".github/workflows/docs_build.yml" pull_request: paths: - - 'docs/**' - - '.github/workflows/docs_build.yml' + - "docs/**" + - ".github/workflows/docs_build.yml" jobs: - build-docs: name: Build ESP-Docs runs-on: ubuntu-22.04 @@ -22,25 +21,25 @@ jobs: run: shell: bash steps: - - uses: actions/checkout@v4 - with: - submodules: true - - uses: actions/setup-python@v5 - with: - cache-dependency-path: docs/requirements.txt - cache: 'pip' - python-version: '3.10' - - name: Build - run: | - sudo apt update - sudo apt install python3-pip python3-setuptools - # GitHub CI installs pip3 and setuptools outside the path. - # Update the path to include them and run. - cd ./docs - PATH=/home/runner/.local/bin:$PATH pip3 install -r requirements.txt --prefer-binary - PATH=/home/runner/.local/bin:$PATH SPHINXOPTS="-W" build-docs -l en - - name: Archive Docs - uses: actions/upload-artifact@v4 - with: - name: docs - path: docs + - uses: actions/checkout@v4 + with: + submodules: true + - uses: actions/setup-python@v5 + with: + cache-dependency-path: docs/requirements.txt + cache: "pip" + python-version: "3.10" + - name: Build + run: | + sudo apt update + sudo apt install python3-pip python3-setuptools + # GitHub CI installs pip3 and setuptools outside the path. + # Update the path to include them and run. + cd ./docs + PATH=/home/runner/.local/bin:$PATH pip3 install -r requirements.txt --prefer-binary + PATH=/home/runner/.local/bin:$PATH SPHINXOPTS="-W" build-docs -l en + - name: Archive Docs + uses: actions/upload-artifact@v4 + with: + name: docs + path: docs diff --git a/.github/workflows/docs_deploy.yml b/.github/workflows/docs_deploy.yml index 5393f7e8a20..b558fd21aa5 100644 --- a/.github/workflows/docs_deploy.yml +++ b/.github/workflows/docs_deploy.yml @@ -7,11 +7,11 @@ on: - completed push: branches: - - release/v2.x - - master + - release/v2.x + - master paths: - - 'docs/**' - - '.github/workflows/docs_deploy.yml' + - "docs/**" + - ".github/workflows/docs_deploy.yml" jobs: deploy-prod-docs: @@ -21,39 +21,39 @@ jobs: run: shell: bash steps: - - name: Check if release workflow is successful - if: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.conclusion != 'success' }} - run: | - echo "Release workflow failed. Exiting..." - exit 1 - - uses: actions/checkout@v4 - with: - submodules: true - - uses: actions/setup-python@v5 - with: - cache-dependency-path: docs/requirements.txt - cache: 'pip' - python-version: '3.10' - - name: Deploy Documentation - env: - # Deploy to production server - # DOCS_BUILD_DIR: "./docs/_build/" - DOCS_DEPLOY_PRIVATEKEY: ${{ secrets.DOCS_KEY }} - DOCS_DEPLOY_PATH: ${{ secrets.DOCS_PATH }} - DOCS_DEPLOY_SERVER: ${{ secrets.DOCS_SERVER }} - DOCS_DEPLOY_SERVER_USER: ${{ secrets.DOCS_USER }} - DOCS_DEPLOY_URL_BASE: ${{ secrets.DOCS_URL }} - run: | - sudo apt update - sudo apt install python3-pip python3-setuptools - source ./docs/utils.sh - add_doc_server_ssh_keys $DOCS_DEPLOY_PRIVATEKEY $DOCS_DEPLOY_SERVER $DOCS_DEPLOY_SERVER_USER - export GIT_VER=$(git describe --always) - echo "PIP install requirements..." - pip3 install --user -r ./docs/requirements.txt - echo "Building the Docs..." - cd ./docs && build-docs -l en - echo "Deploy the Docs..." - export DOCS_BUILD_DIR=$GITHUB_WORKSPACE/docs/ - cd $GITHUB_WORKSPACE/docs - deploy-docs + - name: Check if release workflow is successful + if: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.conclusion != 'success' }} + run: | + echo "Release workflow failed. Exiting..." + exit 1 + - uses: actions/checkout@v4 + with: + submodules: true + - uses: actions/setup-python@v5 + with: + cache-dependency-path: docs/requirements.txt + cache: "pip" + python-version: "3.10" + - name: Deploy Documentation + env: + # Deploy to production server + # DOCS_BUILD_DIR: "./docs/_build/" + DOCS_DEPLOY_PRIVATEKEY: ${{ secrets.DOCS_KEY }} + DOCS_DEPLOY_PATH: ${{ secrets.DOCS_PATH }} + DOCS_DEPLOY_SERVER: ${{ secrets.DOCS_SERVER }} + DOCS_DEPLOY_SERVER_USER: ${{ secrets.DOCS_USER }} + DOCS_DEPLOY_URL_BASE: ${{ secrets.DOCS_URL }} + run: | + sudo apt update + sudo apt install python3-pip python3-setuptools + source ./docs/utils.sh + add_doc_server_ssh_keys $DOCS_DEPLOY_PRIVATEKEY $DOCS_DEPLOY_SERVER $DOCS_DEPLOY_SERVER_USER + export GIT_VER=$(git describe --always) + echo "PIP install requirements..." + pip3 install --user -r ./docs/requirements.txt + echo "Building the Docs..." + cd ./docs && build-docs -l en + echo "Deploy the Docs..." + export DOCS_BUILD_DIR=$GITHUB_WORKSPACE/docs/ + cd $GITHUB_WORKSPACE/docs + deploy-docs diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 5d8e1794a8a..47480e8239a 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -3,21 +3,20 @@ name: GitHub Pages CI on: push: branches: - - master - - pages + - master + - pages paths: - - 'README.md' - - '.github/scripts/on-pages.sh' - - '.github/workflows/gh-pages.yml' + - "README.md" + - ".github/scripts/on-pages.sh" + - ".github/workflows/gh-pages.yml" jobs: - build-pages: name: Build GitHub Pages runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Copy Files - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: bash ./.github/scripts/on-pages.sh + - uses: actions/checkout@v4 + - name: Copy Files + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: bash ./.github/scripts/on-pages.sh diff --git a/.github/workflows/lib.yml b/.github/workflows/lib.yml index 7a7b863095d..1197308c921 100644 --- a/.github/workflows/lib.yml +++ b/.github/workflows/lib.yml @@ -7,7 +7,7 @@ on: # Schedule weekly builds on every Sunday at 4 am schedule: - - cron: '0 4 * * SUN' + - cron: "0 4 * * SUN" concurrency: group: libs-${{ github.event.pull_request.number || github.ref }} @@ -27,7 +27,6 @@ jobs: contains(github.event.pull_request.labels.*.name, 'lib_test') || (github.event_name == 'schedule' && github.repository == 'espressif/arduino-esp32') runs-on: ubuntu-latest - env: REPOSITORY: | - source-path: '.' @@ -60,7 +59,6 @@ jobs: - target: esp32p4 fqbn: espressif:esp32:esp32p4 - steps: # This step makes the contents of the repository available to the workflow - name: Checkout repository @@ -88,7 +86,7 @@ jobs: path: ${{ env.SKETCHES_REPORTS_PATH }} report-to-file: - needs: compile-sketch # Wait for the compile job to finish to get the data for the report + needs: compile-sketch # Wait for the compile job to finish to get the data for the report if: github.event_name == 'schedule' # Only run the job when the workflow is triggered by a schedule runs-on: ubuntu-latest steps: @@ -97,11 +95,10 @@ jobs: uses: actions/checkout@v4 with: token: ${{ env.GITHUB_TOKEN }} - fetch-depth: '0' + fetch-depth: "0" - name: Switch branch - run: - git checkout remotes/origin/gh-pages + run: git checkout remotes/origin/gh-pages # This step is needed to get the size data produced by the compile jobs - name: Download sketches reports artifact @@ -118,8 +115,7 @@ jobs: destination-file: ${{ env.RESULT_LIBRARY_TEST_FILE }} - name: Append file with action URL - run: - echo "/ [GitHub Action Link](https://github.com/${{github.repository}}/actions/runs/${{github.run_id}})" >> ${{ env.RESULT_LIBRARY_TEST_FILE }} + run: echo "/ [GitHub Action Link](https://github.com/${{github.repository}}/actions/runs/${{github.run_id}})" >> ${{ env.RESULT_LIBRARY_TEST_FILE }} - name: Push to github repo run: | diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 8257e78c822..dc009e445da 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -37,7 +37,7 @@ jobs: uses: actions/setup-python@v5 with: cache-dependency-path: tools/pre-commit/requirements.txt - cache: 'pip' + cache: "pip" python-version: "3.x" - name: Get Python version hash diff --git a/.github/workflows/publishlib.yml b/.github/workflows/publishlib.yml index 7fd932f5309..62393b80915 100644 --- a/.github/workflows/publishlib.yml +++ b/.github/workflows/publishlib.yml @@ -47,7 +47,7 @@ jobs: uses: juliangruber/read-file-action@v1 with: path: ./artifacts/workflows/pr_num.txt - + - name: Report results uses: P-R-O-C-H-Y/report-size-deltas@libs with: diff --git a/.github/workflows/publishsizes-2.x.yml b/.github/workflows/publishsizes-2.x.yml index bdd2fc311e4..ffbd751838c 100644 --- a/.github/workflows/publishsizes-2.x.yml +++ b/.github/workflows/publishsizes-2.x.yml @@ -11,11 +11,11 @@ env: jobs: sizes-test-results: - name: Sizes Comparsion Results + name: Sizes Comparison Results runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v4 # This step checks out the repository's code at gh-pages branch + uses: actions/checkout@v4 # This step checks out the repository's code at gh-pages branch with: ref: gh-pages @@ -41,8 +41,7 @@ jobs: destination-file: ${{ env.RESULT_SIZES_TEST_FILE }} - name: Append file with action URL - run: - echo "/ [GitHub Action Link](https://github.com/${{github.repository}}/actions/runs/${{github.run_id}})" >> ${{ env.RESULT_SIZES_TEST_FILE }} + run: echo "/ [GitHub Action Link](https://github.com/${{github.repository}}/actions/runs/${{github.run_id}})" >> ${{ env.RESULT_SIZES_TEST_FILE }} - name: Push to github repo run: | diff --git a/.github/workflows/publishsizes.yml b/.github/workflows/publishsizes.yml index ce4e94cd5e5..6c6d75eccce 100644 --- a/.github/workflows/publishsizes.yml +++ b/.github/workflows/publishsizes.yml @@ -14,7 +14,7 @@ env: jobs: sizes-test-results: - name: Sizes Comparsion Results + name: Sizes Comparison Results runs-on: ubuntu-latest if: | github.event.workflow_run.event == 'pull_request' && @@ -22,7 +22,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 # This step checks out the repository's code at gh-pages branch + uses: actions/checkout@v4 # This step checks out the repository's code at gh-pages branch with: ref: gh-pages diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index beee735c368..0859551d589 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -4,30 +4,30 @@ on: workflow_dispatch: push: branches: - - master - - release/* + - master + - release/* pull_request: paths: - - 'cores/**' - - 'libraries/**' - - '!libraries/**.md' - - '!libraries/**.txt' - - '!libraries/**.properties' - - '!libraries/**.py' - - 'package/**' - - 'tools/**.py' - - 'platform.txt' - - 'programmers.txt' - - 'idf_component.yml' - - 'Kconfig.projbuild' - - 'package.json' - - 'CMakeLists.txt' - - '.github/workflows/push.yml' - - '.github/scripts/**' - - '!.github/scripts/find_*' - - '!.github/scripts/on-release.sh' - - '!.github/scripts/tests_*' - - '!.github/scripts/upload_*' + - "cores/**" + - "libraries/**" + - "!libraries/**.md" + - "!libraries/**.txt" + - "!libraries/**.properties" + - "!libraries/**.py" + - "package/**" + - "tools/**.py" + - "platform.txt" + - "programmers.txt" + - "idf_component.yml" + - "Kconfig.projbuild" + - "package.json" + - "CMakeLists.txt" + - ".github/workflows/push.yml" + - ".github/scripts/**" + - "!.github/scripts/find_*" + - "!.github/scripts/on-release.sh" + - "!.github/scripts/tests_*" + - "!.github/scripts/upload_*" - "variants/esp32/**/*" - "variants/esp32s2/**/*" - "variants/esp32s3/**/*" @@ -49,8 +49,8 @@ jobs: runs-on: ubuntu-latest if: ${{ !(github.event_name == 'pull_request' && startsWith(github.head_ref, 'release/')) }} steps: - - uses: actions/checkout@v4 - - run: bash ./.github/scripts/check-cmakelists.sh + - uses: actions/checkout@v4 + - run: bash ./.github/scripts/check-cmakelists.sh gen-chunks: name: Generate chunks @@ -65,16 +65,16 @@ jobs: chunk_count: ${{ steps.set-chunks.outputs.chunk_count }} chunks: ${{ steps.set-chunks.outputs.chunks }} steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 2 + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 2 - - name: Get changed files - id: changed-files - uses: tj-actions/changed-files@v44 - with: - files_yaml: | + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v44 + with: + files_yaml: | core: - '.github/**' - '!.github/scripts/install-platformio-esp32.sh' @@ -115,31 +115,31 @@ jobs: - '.github/scripts/install-platformio-esp32.sh' - 'tools/platformio-build.py' - - name: Set chunks - id: set-chunks - env: - LIB_FILES: ${{ steps.changed-files.outputs.libraries_all_changed_files }} - IS_PR: ${{ github.event_name == 'pull_request' }} - MAX_CHUNKS: ${{ env.MAX_CHUNKS }} - BUILD_PLATFORMIO: ${{ steps.changed-files.outputs.platformio_any_changed == 'true' }} - BUILD_IDF: ${{ steps.changed-files.outputs.idf_any_changed == 'true' }} - BUILD_LIBRARIES: ${{ steps.changed-files.outputs.libraries_any_changed == 'true' }} - BUILD_STATIC_SKETCHES: ${{ steps.changed-files.outputs.static_sketeches_any_changed == 'true' }} - FS_CHANGED: ${{ steps.changed-files.outputs.fs_any_changed == 'true' }} - NETWORKING_CHANGED: ${{ steps.changed-files.outputs.networking_any_changed == 'true' }} - CORE_CHANGED: ${{ steps.changed-files.outputs.core_any_changed == 'true' }} - LIB_CHANGED: ${{ steps.changed-files.outputs.libraries_any_changed == 'true' }} - run: | - bash ./.github/scripts/set_push_chunks.sh + - name: Set chunks + id: set-chunks + env: + LIB_FILES: ${{ steps.changed-files.outputs.libraries_all_changed_files }} + IS_PR: ${{ github.event_name == 'pull_request' }} + MAX_CHUNKS: ${{ env.MAX_CHUNKS }} + BUILD_PLATFORMIO: ${{ steps.changed-files.outputs.platformio_any_changed == 'true' }} + BUILD_IDF: ${{ steps.changed-files.outputs.idf_any_changed == 'true' }} + BUILD_LIBRARIES: ${{ steps.changed-files.outputs.libraries_any_changed == 'true' }} + BUILD_STATIC_SKETCHES: ${{ steps.changed-files.outputs.static_sketeches_any_changed == 'true' }} + FS_CHANGED: ${{ steps.changed-files.outputs.fs_any_changed == 'true' }} + NETWORKING_CHANGED: ${{ steps.changed-files.outputs.networking_any_changed == 'true' }} + CORE_CHANGED: ${{ steps.changed-files.outputs.core_any_changed == 'true' }} + LIB_CHANGED: ${{ steps.changed-files.outputs.libraries_any_changed == 'true' }} + run: | + bash ./.github/scripts/set_push_chunks.sh - - name: Upload sketches found - if: ${{ steps.set-chunks.outputs.build_all == 'false' && steps.set-chunks.outputs.build_libraries == 'true' }} - uses: actions/upload-artifact@v4 - with: - name: sketches_found - path: sketches_found.txt - overwrite: true - if-no-files-found: error + - name: Upload sketches found + if: ${{ steps.set-chunks.outputs.build_all == 'false' && steps.set-chunks.outputs.build_libraries == 'true' }} + uses: actions/upload-artifact@v4 + with: + name: sketches_found + path: sketches_found.txt + overwrite: true + if-no-files-found: error # Ubuntu build-arduino-linux: @@ -153,45 +153,45 @@ jobs: chunk: ${{ fromJson(needs.gen-chunks.outputs.chunks) }} steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: '3.x' + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.x" - - name: Get libs cache - uses: actions/cache@v4 - with: - key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }} - path: | - ./tools/dist - ./tools/esp32-arduino-libs - ./tools/esptool - ./tools/mk* - ./tools/openocd-esp32 - ./tools/riscv32-* - ./tools/xtensa-* + - name: Get libs cache + uses: actions/cache@v4 + with: + key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }} + path: | + ./tools/dist + ./tools/esp32-arduino-libs + ./tools/esptool + ./tools/mk* + ./tools/openocd-esp32 + ./tools/riscv32-* + ./tools/xtensa-* - - name: Build all sketches - if: ${{ needs.gen-chunks.outputs.build_all == 'true' }} - run: bash ./.github/scripts/on-push.sh ${{ matrix.chunk }} ${{ env.MAX_CHUNKS }} 1 + - name: Build all sketches + if: ${{ needs.gen-chunks.outputs.build_all == 'true' }} + run: bash ./.github/scripts/on-push.sh ${{ matrix.chunk }} ${{ env.MAX_CHUNKS }} 1 - - name: Download sketches found - if: ${{ needs.gen-chunks.outputs.build_all == 'false' && needs.gen-chunks.outputs.build_libraries == 'true' }} - uses: actions/download-artifact@v4 - with: - name: sketches_found + - name: Download sketches found + if: ${{ needs.gen-chunks.outputs.build_all == 'false' && needs.gen-chunks.outputs.build_libraries == 'true' }} + uses: actions/download-artifact@v4 + with: + name: sketches_found - - name: Build selected sketches - if: ${{ needs.gen-chunks.outputs.build_all == 'false' && needs.gen-chunks.outputs.build_libraries == 'true' }} - run: bash ./.github/scripts/on-push.sh ${{ matrix.chunk }} ${{ needs.gen-chunks.outputs.chunk_count }} 1 sketches_found.txt + - name: Build selected sketches + if: ${{ needs.gen-chunks.outputs.build_all == 'false' && needs.gen-chunks.outputs.build_libraries == 'true' }} + run: bash ./.github/scripts/on-push.sh ${{ matrix.chunk }} ${{ needs.gen-chunks.outputs.chunk_count }} 1 sketches_found.txt - #Upload cli compile json as artifact - - name: Upload cli compile json - uses: actions/upload-artifact@v4 - with: - name: pr_cli_compile_${{ matrix.chunk }} - path: cli_compile_${{ matrix.chunk }}.json - overwrite: true + #Upload cli compile json as artifact + - name: Upload cli compile json + uses: actions/upload-artifact@v4 + with: + name: pr_cli_compile_${{ matrix.chunk }} + path: cli_compile_${{ matrix.chunk }}.json + overwrite: true # Windows and MacOS build-arduino-win-mac: @@ -205,12 +205,12 @@ jobs: os: [windows-latest, macOS-latest] steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - name: Build Sketches - run: bash ./.github/scripts/on-push.sh + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.x" + - name: Build Sketches + run: bash ./.github/scripts/on-push.sh # # PlatformIO on Windows, Ubuntu and Mac # build-platformio: @@ -226,13 +226,13 @@ jobs: # matrix: # os: [ubuntu-latest, windows-latest, macOS-latest] - # steps: - # - uses: actions/checkout@v4 - # - uses: actions/setup-python@v5 - # with: - # python-version: '3.x' - # - name: Build Sketches - # run: bash ./.github/scripts/on-push.sh 1 1 #equal and non-zero to trigger PIO + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.x" + - name: Build Sketches + run: bash ./.github/scripts/on-push.sh 1 1 #equal and non-zero to trigger PIO # ESP-IDF component build build-esp-idf-component: @@ -251,7 +251,17 @@ jobs: # https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-docker-image.html # for details. idf_ver: ["release-v5.3"] - idf_target: ["esp32", "esp32s2", "esp32s3", "esp32c2", "esp32c3", "esp32c6", "esp32h2", "esp32p4"] + idf_target: + [ + "esp32", + "esp32s2", + "esp32s3", + "esp32c2", + "esp32c3", + "esp32c6", + "esp32h2", + "esp32p4" + ] container: espressif/idf:${{ matrix.idf_ver }} steps: - name: Check out arduino-esp32 as a component @@ -276,16 +286,15 @@ jobs: if: github.event_name == 'push' && github.ref == 'refs/heads/master' runs-on: ubuntu-latest steps: - # Check out repository + # Check out repository - name: Checkout repository uses: actions/checkout@v4 with: token: ${{secrets.GITHUB_TOKEN}} - fetch-depth: '0' + fetch-depth: "0" - name: Switch branch - run: - git checkout remotes/origin/gh-pages + run: git checkout remotes/origin/gh-pages - name: Download sketches reports artifact uses: actions/download-artifact@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f8aa779d994..53a512dd54f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,15 +10,15 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - run: pip install packaging - - run: pip install pyserial - - name: Build Release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: bash ./.github/scripts/on-release.sh + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-python@v5 + with: + python-version: "3.x" + - run: pip install packaging + - run: pip install pyserial + - name: Build Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: bash ./.github/scripts/on-release.sh diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f57a1925c1c..0db3b98782b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,22 +16,22 @@ on: pull_request: types: [opened, reopened, closed, synchronize, labeled, unlabeled] paths: - - '.github/workflows/tests*' - - '.github/scripts/*.sh' - - '!.github/scripts/check-cmakelists.sh' - - '!.github/scripts/find_*' - - '!.github/scripts/on-*.sh' - - '!.github/scripts/set_push_chunks.sh' - - '!.github/scripts/update-version.sh' - - '!.github/scripts/upload_py_tools.sh' - - 'tests/**' - - 'cores/**' - - 'libraries/*/src/**.cpp' - - 'libraries/*/src/**.h' - - 'libraries/*/src/**.c' - - 'package/**' + - ".github/workflows/tests*" + - ".github/scripts/*.sh" + - "!.github/scripts/check-cmakelists.sh" + - "!.github/scripts/find_*" + - "!.github/scripts/on-*.sh" + - "!.github/scripts/set_push_chunks.sh" + - "!.github/scripts/update-version.sh" + - "!.github/scripts/upload_py_tools.sh" + - "tests/**" + - "cores/**" + - "libraries/*/src/**.cpp" + - "libraries/*/src/**.h" + - "libraries/*/src/**.c" + - "package/**" schedule: - - cron: '0 2 * * *' + - cron: "0 2 * * *" concurrency: group: tests-${{ github.event.pull_request.number || github.ref }} @@ -115,7 +115,7 @@ jobs: fail-fast: false matrix: type: ${{ fromJson(needs.gen-matrix.outputs.qemu-types) }} - chip: ['esp32', 'esp32c3'] + chip: ["esp32", "esp32c3"] with: type: ${{ matrix.type }} chip: ${{ matrix.chip }} diff --git a/.github/workflows/tests_build.yml b/.github/workflows/tests_build.yml index 090dfa8136b..7a5a2959657 100644 --- a/.github/workflows/tests_build.yml +++ b/.github/workflows/tests_build.yml @@ -5,11 +5,11 @@ on: inputs: type: type: string - description: 'Type of tests to build' + description: "Type of tests to build" required: true chip: type: string - description: 'Chip to build tests for' + description: "Chip to build tests for" required: true jobs: diff --git a/.github/workflows/tests_hw.yml b/.github/workflows/tests_hw.yml index d7922500f10..76480ed7c0e 100644 --- a/.github/workflows/tests_hw.yml +++ b/.github/workflows/tests_hw.yml @@ -5,11 +5,11 @@ on: inputs: type: type: string - description: 'Type of tests to run' + description: "Type of tests to run" required: true chip: type: string - description: 'Chip to run tests for' + description: "Chip to run tests for" required: true env: diff --git a/.github/workflows/tests_qemu.yml b/.github/workflows/tests_qemu.yml index 0b4ec18e7ac..6675909c9df 100644 --- a/.github/workflows/tests_qemu.yml +++ b/.github/workflows/tests_qemu.yml @@ -64,8 +64,8 @@ jobs: if: ${{ steps.check-tests.outputs.enabled == 'true' }} with: cache-dependency-path: tests/requirements.txt - cache: 'pip' - python-version: '3.x' + cache: "pip" + python-version: "3.x" - name: Install Python dependencies if: ${{ steps.check-tests.outputs.enabled == 'true' }} diff --git a/.github/workflows/tests_results.yml b/.github/workflows/tests_results.yml index f9c572bf546..4ef338a9e16 100644 --- a/.github/workflows/tests_results.yml +++ b/.github/workflows/tests_results.yml @@ -18,11 +18,11 @@ jobs: github.event.workflow_run.conclusion == 'timed_out' runs-on: ubuntu-latest permissions: - actions: write - statuses: write - checks: write - pull-requests: write - contents: write + actions: write + statuses: write + checks: write + pull-requests: write + contents: write steps: - uses: actions/checkout@v4 with: @@ -139,13 +139,13 @@ jobs: core.info(`${name} is ${state}`); - name: Create output folder - if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} + if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled run: | rm -rf artifacts mkdir -p runtime-tests-results - name: Generate badge - if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} + if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled uses: jaywcjlove/generated-badges@v1.0.13 with: label: Runtime Tests @@ -154,7 +154,7 @@ jobs: color: ${{ job.status == 'success' && 'green' || 'red' }} - name: Push badge - if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} + if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled run: | git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" diff --git a/.github/workflows/tests_wokwi.yml b/.github/workflows/tests_wokwi.yml index a891ca89dfd..f5eb2efcad2 100644 --- a/.github/workflows/tests_wokwi.yml +++ b/.github/workflows/tests_wokwi.yml @@ -247,8 +247,8 @@ jobs: if: ${{ steps.check-tests.outputs.enabled == 'true' }} with: cache-dependency-path: tests/requirements.txt - cache: 'pip' - python-version: '3.x' + cache: "pip" + python-version: "3.x" - name: Install dependencies if: ${{ steps.check-tests.outputs.enabled == 'true' }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6a949631bd9..0ebb6f6ac4b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ default_language_version: repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: "v4.5.0" + rev: "v5.0.0" hooks: - id: check-case-conflict - id: check-symlinks @@ -47,13 +47,13 @@ repos: types_or: [c, c++] exclude: ^.*\/build_opt\.h$ - repo: https://github.com/psf/black-pre-commit-mirror - rev: "22.10.0" + rev: "24.10.0" hooks: - id: black types_or: [python] args: [--line-length=120] #From the arduino code style. Add as argument rather than creating a new config file. - repo: https://github.com/PyCQA/flake8 - rev: "7.0.0" + rev: "7.1.1" hooks: - id: flake8 types_or: [python] @@ -67,7 +67,7 @@ repos: - id: prettier types_or: [yaml] - repo: https://github.com/errata-ai/vale - rev: "v3.0.7" + rev: "v3.9.1" hooks: - id: vale name: vale-sync diff --git a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp index f5c6c9d750f..bbf72af0a95 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp @@ -47,7 +47,7 @@ bool MatterGenericSwitch::begin() { // endpoint handles can be used to add/modify clusters. endpoint_t *endpoint = generic_switch::create(node::get(), &switch_config, ENDPOINT_FLAG_NONE, (void *)this); if (endpoint == nullptr) { - log_e("Failed to create Generic swtich endpoint"); + log_e("Failed to create Generic switch endpoint"); return false; } // Add group cluster to the switch endpoint diff --git a/tests/performance/psramspeed/test_psramspeed.py b/tests/performance/psramspeed/test_psramspeed.py index 8d051580799..9e96e158504 100644 --- a/tests/performance/psramspeed/test_psramspeed.py +++ b/tests/performance/psramspeed/test_psramspeed.py @@ -74,7 +74,7 @@ def test_psramspeed(dut, request): sums[(test, size, impl)]["time_sum"] += time avg_results = {} - for (test, size, impl) in sums: + for test, size, impl in sums: rate_avg = round(sums[(test, size, impl)]["rate_sum"] / runs, 2) time_avg = round(sums[(test, size, impl)]["time_sum"] / runs, 2) LOGGER.info( diff --git a/tests/performance/ramspeed/test_ramspeed.py b/tests/performance/ramspeed/test_ramspeed.py index b4c3cee7f9b..dbe1670d329 100644 --- a/tests/performance/ramspeed/test_ramspeed.py +++ b/tests/performance/ramspeed/test_ramspeed.py @@ -74,7 +74,7 @@ def test_ramspeed(dut, request): sums[(test, size, impl)]["time_sum"] += time avg_results = {} - for (test, size, impl) in sums: + for test, size, impl in sums: rate_avg = round(sums[(test, size, impl)]["rate_sum"] / runs, 2) time_avg = round(sums[(test, size, impl)]["time_sum"] / runs, 2) LOGGER.info( diff --git a/tools/gen_esp32part.py b/tools/gen_esp32part.py index 4ba0ee59517..ffa740a36e0 100755 --- a/tools/gen_esp32part.py +++ b/tools/gen_esp32part.py @@ -529,7 +529,7 @@ def to_binary(self): def to_csv(self, simple_formatting=False): def addr_format(a, include_sizes): if not simple_formatting and include_sizes: - for (val, suffix) in [(0x100000, "M"), (0x400, "K")]: + for val, suffix in [(0x100000, "M"), (0x400, "K")]: if a % val == 0: return "%d%s" % (a // val, suffix) return "0x%x" % a From 7a82b8be83f068152883c161da87fc434743df85 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 9 Dec 2024 10:01:24 -0300 Subject: [PATCH 035/183] feat(Matter): Creates New Matter Fan Controller Endpoint (#10691) * feat(matter): creates new matter fan controller endpoint --- CMakeLists.txt | 1 + .../Matter/examples/MatterFan/MatterFan.ino | 202 +++++++++++++++ libraries/Matter/examples/MatterFan/ci.json | 7 + libraries/Matter/keywords.txt | 34 ++- libraries/Matter/src/Matter.h | 2 + libraries/Matter/src/MatterEndPoint.h | 71 ++++++ .../Matter/src/MatterEndpoints/MatterFan.cpp | 230 ++++++++++++++++++ .../Matter/src/MatterEndpoints/MatterFan.h | 163 +++++++++++++ 8 files changed, 709 insertions(+), 1 deletion(-) create mode 100644 libraries/Matter/examples/MatterFan/MatterFan.ino create mode 100644 libraries/Matter/examples/MatterFan/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterFan.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterFan.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 59035e50774..e4991d558d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,6 +174,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp + libraries/Matter/src/MatterEndpoints/MatterFan.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS diff --git a/libraries/Matter/examples/MatterFan/MatterFan.ino b/libraries/Matter/examples/MatterFan/MatterFan.ino new file mode 100644 index 00000000000..ac26550f2b6 --- /dev/null +++ b/libraries/Matter/examples/MatterFan/MatterFan.ino @@ -0,0 +1,202 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Fan Endpoint - On/Off control + Speed Percent Control + Fan Modes +MatterFan Fan; + +// set your board USER BUTTON pin here - used for toggling On/Off +const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9. + +// set your board Analog Pin here - used for changing the Fan speed +const uint8_t analogPin = A0; // Analog Pin depends on each board + +// set your board PWM Pin here - used for controlling the Fan speed (DC motor example) +// for this example, it will use the builtin board RGB LED to simulate the Fan DC motor using its brightness +#ifdef RGB_BUILTIN +const uint8_t dcMotorPin = RGB_BUILTIN; +#else +const uint8_t dcMotorPin = 2; // Set your pin here if your board has not defined LED_BUILTIN +#warning "Do not forget to set the RGB LED pin" +#endif + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +void fanDCMotorDrive(bool fanState, uint8_t speedPercent) { + // drive the Fan DC motor + if (fanState == false) { + // turn off the Fan + digitalWrite(dcMotorPin, LOW); + } else { + // set the Fan speed + uint8_t fanDCMotorPWM = map(speedPercent, 0, 100, 0, 255); +#ifdef RGB_BUILTIN + rgbLedWrite(dcMotorPin, fanDCMotorPWM, fanDCMotorPWM, fanDCMotorPWM); +#else + analogWrite(dcMotorPin, fanDCMotorPWM); +#endif + } +} + +void setup() { + // Initialize the USER BUTTON (Boot button) GPIO that will toggle the Fan (On/Off) + pinMode(buttonPin, INPUT_PULLUP); + // Initialize the Analog Pin A0 used to read input voltage and to set the Fan speed accordingly + pinMode(analogPin, INPUT); + analogReadResolution(10); // 10 bits resolution reading 0..1023 + // Initialize the PWM output pin for a Fan DC motor + pinMode(dcMotorPin, OUTPUT); + + Serial.begin(115200); + while (!Serial) { + delay(100); + } + + // We start by connecting to a WiFi network + Serial.print("Connecting to "); + Serial.println(ssid); + // enable IPv6 + WiFi.enableIPv6(true); + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println("\r\nWiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + delay(500); + + // On Boot or Reset, Fan is set at 0% speed, OFF, changing between OFF, ON, SMART and HIGH + Fan.begin(0, MatterFan::FAN_MODE_OFF, MatterFan::FAN_MODE_SEQ_OFF_HIGH); + + // callback functions would control Fan motor + // the Matter Controller will send new data whenever the User APP or Automation request + + // single feature callbacks take place before the generic (all features) callback + // This callback will be executed whenever the speed percent matter attribute is updated + Fan.onChangeSpeedPercent([](uint8_t speedPercent) { + // setting speed to Zero, while the Fan is ON, shall turn the Fan OFF + if (speedPercent == MatterFan::OFF_SPEED && Fan.getMode() != MatterFan::FAN_MODE_OFF) { + // ATTR_SET do not update the attribute, just SET it to avoid infinite loop + return Fan.setOnOff(false, Fan.ATTR_SET); + } + // changing the speed to higher than Zero, while the Fan is OFF, shall turn the Fan ON + if (speedPercent > MatterFan::OFF_SPEED && Fan.getMode() == MatterFan::FAN_MODE_OFF) { + // ATTR_SET do not update the attribute, just SET it to avoid infinite loop + return Fan.setOnOff(true, Fan.ATTR_SET); + } + // for other case, just return true + return true; + }); + + // This callback will be executed whenever the fan mode matter attribute is updated + // This will take action when user APP starts the Fan by changing the mode + Fan.onChangeMode([](MatterFan::FanMode_t fanMode) { + // when the Fan is turned ON using Mode Selection, while it is OFF, shall start it by setting the speed to 50% + if (Fan.getSpeedPercent() == MatterFan::OFF_SPEED && fanMode != MatterFan::FAN_MODE_OFF) { + Serial.printf("Fan set to %s mode -- speed percentage will go to 50%%\r\n", Fan.getFanModeString(fanMode)); + // ATTR_SET do not update the attribute, just SET it to avoid infinite loop + return Fan.setSpeedPercent(50, Fan.ATTR_SET); + } + return true; + }); + + // Generic callback will be executed as soon as a single feature callback is done + // In this example, it will just print status messages + Fan.onChange([](MatterFan::FanMode_t fanMode, uint8_t speedPercent) { + // just report state + Serial.printf("Fan State: Mode %s | %d%% speed.\r\n", Fan.getFanModeString(fanMode), speedPercent); + // drive the Fan DC motor + fanDCMotorDrive(fanMode != MatterFan::FAN_MODE_OFF, speedPercent); + // returns success + return true; + }); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + // This may be a restart of a already commissioned Matter accessory + if (Matter.isDeviceCommissioned()) { + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } +} + +// Builtin Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the Matter Fabric + +void loop() { + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Generic Switch Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } + + // A builtin button is used to trigger and send a command to the Matter Controller + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + // Onboard User Button is used as a smart button or to decommission it + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > debouceTime && digitalRead(buttonPin) == HIGH) { + button_state = false; // released + // button is released - toggle Fan On/Off + Fan.toggle(); + Serial.printf("User button released. Setting the Fan %s.\r\n", Fan > 0 ? "ON" : "OFF"); + + // Factory reset is triggered if the button is pressed longer than 10 seconds + if (time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Generic Switch Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + } + } + + // checks Analog pin and adjust the speed only if it has changed + static int lastRead = 0; + // analog values (0..1023) / 103 => mapped into 10 steps (0..9) + int anaVal = analogRead(analogPin) / 103; + if (lastRead != anaVal) { + // speed percent moves in steps of 10. Range is 10..100 + if (Fan.setSpeedPercent((anaVal + 1) * 10)) { + lastRead = anaVal; + } + } +} diff --git a/libraries/Matter/examples/MatterFan/ci.json b/libraries/Matter/examples/MatterFan/ci.json new file mode 100644 index 00000000000..0665800b12b --- /dev/null +++ b/libraries/Matter/examples/MatterFan/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index 597bbac657b..4668054d12e 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -15,6 +15,9 @@ MatterColorTemperatureLight KEYWORD1 MatterColorLight KEYWORD1 MatterEnhancedColorLight KEYWORD1 MatterEndPoint KEYWORD1 +MatterFan KEYWORD1 +FanMode_t KEYWORD1 +FanModeSequence_t KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -32,6 +35,7 @@ decommission KEYWORD2 attributeChangeCB KEYWORD2 setOnOff KEYWORD2 getOnOff KEYWORD2 +toggle KEYWORD2 setBrightness KEYWORD2 getBrightness KEYWORD2 setColorTemperature KEYWORD2 @@ -40,7 +44,6 @@ setColorRGB KEYWORD2 getColorRGB KEYWORD2 setColorHSV KEYWORD2 getColorHSV KEYWORD2 -toggle KEYWORD2 updateAccessory KEYWORD2 onChange KEYWORD2 onChangeOnOff KEYWORD2 @@ -48,6 +51,17 @@ onChangeBrightness KEYWORD2 onChangeColorTemperature KEYWORD2 onChangeColorHSV KEYWORD2 click KEYWORD2 +getAttribute KEYWORD2 +getAttributeVal KEYWORD2 +setAttributeVal KEYWORD2 +updateAttributeVal KEYWORD2 +getFanModeString KEYWORD2 +setSpeedPercent KEYWORD2 +getSpeedPercent KEYWORD2 +setMode KEYWORD2 +getMode KEYWORD2 +onChangeMode KEYWORD2 +onChangeSpeedPercent KEYWORD2 ####################################### # Constants (LITERAL1) @@ -56,3 +70,21 @@ click KEYWORD2 MAX_BRIGHTNESS LITERAL1 MAX_COLOR_TEMPERATURE LITERAL1 MIN_COLOR_TEMPERATURE LITERAL1 +ATTR_SET LITERAL1 +ATTR_UPDATE LITERAL1 +MAX_SPEED LITERAL1 +MIN_SPEED LITERAL1 +OFF_SPEED LITERAL1 +FAN_MODE_OFF LITERAL1 +FAN_MODE_LOW LITERAL1 +FAN_MODE_MEDIUM LITERAL1 +FAN_MODE_HIGH LITERAL1 +FAN_MODE_ON LITERAL1 +FAN_MODE_AUTO LITERAL1 +FAN_MODE_SMART LITERAL1 +FAN_MODE_SEQ_OFF_LOW_MED_HIGH LITERAL1 +FAN_MODE_SEQ_OFF_LOW_HIGH LITERAL1 +FAN_MODE_SEQ_OFF_LOW_MED_HIGH_AUTO LITERAL1 +FAN_MODE_SEQ_OFF_LOW_HIGH_AUTO LITERAL1 +FAN_MODE_SEQ_OFF_HIGH_AUTO LITERAL1 +FAN_MODE_SEQ_OFF_HIGH LITERAL1 diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index 9136eead048..06edf32288f 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -25,6 +25,7 @@ #include #include #include +#include using namespace esp_matter; @@ -56,6 +57,7 @@ class ArduinoMatter { friend class MatterColorTemperatureLight; friend class MatterColorLight; friend class MatterEnhancedColorLight; + friend class MatterFan; protected: static void _init(); diff --git a/libraries/Matter/src/MatterEndPoint.h b/libraries/Matter/src/MatterEndPoint.h index 02577957e8e..99bff8470d3 100644 --- a/libraries/Matter/src/MatterEndPoint.h +++ b/libraries/Matter/src/MatterEndPoint.h @@ -19,15 +19,86 @@ #include #include +using namespace esp_matter; + // Matter Endpoint Base Class. Controls the endpoint ID and allows the child class to overwrite attribute change call class MatterEndPoint { public: + enum attrOperation_t { + ATTR_SET = false, + ATTR_UPDATE = true + }; + uint16_t getEndPointId() { return endpoint_id; } + void setEndPointId(uint16_t ep) { endpoint_id = ep; } + + // helper functions for attribute manipulation + attribute_t *getAttribute(uint32_t cluster_id, uint32_t attribute_id) { + if (endpoint_id == 0) { + log_e("Endpoint ID is not set"); + return NULL; + } + endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); + if (endpoint == NULL) { + log_e("Endpoint [%d] not found", endpoint_id); + return NULL; + } + cluster_t *cluster = cluster::get(endpoint, cluster_id); + if (cluster == NULL) { + log_e("Cluster [%d] not found", cluster_id); + return NULL; + } + attribute_t *attribute = attribute::get(cluster, attribute_id); + if (attribute == NULL) { + log_e("Attribute [%d] not found", attribute_id); + return NULL; + } + return attribute; + } + + // get the value of an attribute from its cluster id and attribute it + bool getAttributeVal(uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *attrVal) { + attribute_t *attribute = getAttribute(cluster_id, attribute_id); + if (attribute == NULL) { + return false; + } + if (attribute::get_val(attribute, attrVal) == ESP_OK) { + log_v("GET_VAL Success for cluster %d, attribute %d with value %d", cluster_id, attribute_id, attrVal->val.u32); + return true; + } + log_e("GET_VAL FAILED! for cluster %d, attribute %d with value %d", cluster_id, attribute_id, attrVal->val.u32); + return false; + } + + // set the value of an attribute from its cluster id and attribute it + bool setAttributeVal(uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *attrVal) { + attribute_t *attribute = getAttribute(cluster_id, attribute_id); + if (attribute == NULL) { + return false; + } + if (attribute::set_val(attribute, attrVal) == ESP_OK) { + log_v("SET_VAL Success for cluster %d, attribute %d with value %d", cluster_id, attribute_id, attrVal->val.u32); + return true; + } + log_e("SET_VAL FAILED! for cluster %d, attribute %d with value %d", cluster_id, attribute_id, attrVal->val.u32); + return false; + } + + // update the value of an attribute from its cluster id and attribute it + bool updateAttributeVal(uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *attrVal) { + if (attribute::update(endpoint_id, cluster_id, attribute_id, attrVal) == ESP_OK) { + log_v("Update Success for cluster %d, attribute %d with value %d", cluster_id, attribute_id, attrVal->val.u32); + return true; + } + log_e("Update FAILED! for cluster %d, attribute %d with value %d", cluster_id, attribute_id, attrVal->val.u32); + return false; + } + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. virtual bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) = 0; diff --git a/libraries/Matter/src/MatterEndpoints/MatterFan.cpp b/libraries/Matter/src/MatterEndpoints/MatterFan.cpp new file mode 100644 index 00000000000..8db6a317ead --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterFan.cpp @@ -0,0 +1,230 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace esp_matter::cluster; +using namespace chip::app::Clusters; + +// string helper for the FAN MODE +const char *MatterFan::fanModeString[7] = {"OFF", "LOW", "MEDIUM", "HIGH", "ON", "AUTO", "SMART"}; +// bitmap for valid Fan Modes based on order defined in Zap Generated Cluster Enums +const uint8_t MatterFan::fanModeSequence[6] = {fanSeqModeOffLowMedHigh, fanSeqModeOffLowHigh, fanSeqModeOffLowMedHighAuto, + fanSeqModeOffLowHighAuto, fanSeqModeOffHighAuto, fanSeqModeOffHigh}; + +// Constructor and Method Definitions +MatterFan::MatterFan() {} + +MatterFan::~MatterFan() { + end(); +} + +bool MatterFan::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { + bool ret = true; + + if (!started) { + log_e("Matter Fan device has not begun."); + return false; + } + + log_d("Fan Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); + + if (endpoint_id == getEndPointId() && cluster_id == FanControl::Id) { + switch (attribute_id) { + case FanControl::Attributes::FanMode::Id: + log_v("FanControl Fan Mode changed to %s (%x)", val->val.u8 < 7 ? fanModeString[val->val.u8] : "Unknown", val->val.u8); + if (_onChangeModeCB != NULL) { + ret &= _onChangeModeCB((FanMode_t)val->val.u8); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB((FanMode_t)val->val.u8, currentPercent); + } + if (ret == true) { + currentFanMode = (FanMode_t)val->val.u8; + } + break; + case FanControl::Attributes::PercentSetting::Id: + case FanControl::Attributes::PercentCurrent::Id: + log_v("FanControl Percent %s changed to %d", attribute_id == FanControl::Attributes::PercentSetting::Id ? "SETTING" : "CURRENT", val->val.u8); + if (_onChangeSpeedCB != NULL) { + ret &= _onChangeSpeedCB(val->val.u8); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(currentFanMode, val->val.u8); + } + if (ret == true) { + // change setting speed percent + currentPercent = val->val.u8; + setAttributeVal(FanControl::Id, FanControl::Attributes::PercentSetting::Id, val); + setAttributeVal(FanControl::Id, FanControl::Attributes::PercentCurrent::Id, val); + } + break; + } + } + + return ret; +} + +bool MatterFan::begin(uint8_t percent, FanMode_t fanMode, FanModeSequence_t fanModeSeq) { + ArduinoMatter::_init(); + + // endpoint handles can be used to add/modify clusters. + fan::config_t fan_config; + fan_config.fan_control.fan_mode = fanMode; + fan_config.fan_control.percent_current = percent; + fan_config.fan_control.percent_setting = percent; + fan_config.fan_control.fan_mode_sequence = fanModeSeq; + validFanModes = fanModeSequence[fanModeSeq]; + + endpoint_t *endpoint = fan::create(node::get(), &fan_config, ENDPOINT_FLAG_NONE, (void *)this); + + if (endpoint == nullptr) { + log_e("Failed to create Fan endpoint"); + return false; + } + + currentFanMode = fanMode; + currentPercent = percent; + + setEndPointId(endpoint::get_id(endpoint)); + log_i("Fan created with endpoint_id %d", getEndPointId()); + started = true; + return true; +} + +void MatterFan::end() { + started = false; +} + +bool MatterFan::setMode(FanMode_t newMode, bool performUpdate) { + if (!started) { + log_w("Matter Fan device has not begun."); + return false; + } + // avoid processing the a "no-change" + if (currentFanMode == newMode) { + return true; + } + + // check if the mode is valid based on the sequence used in its creation + if (!(validFanModes & (1 << newMode))) { + log_e("Invalid Fan Mode %s for the current Fan Mode Sequence.", fanModeString[newMode]); + return false; + } + + esp_matter_attr_val_t modeVal = esp_matter_invalid(NULL); + if (!getAttributeVal(FanControl::Id, FanControl::Attributes::FanMode::Id, &modeVal)) { + log_e("Failed to get Fan Mode Attribute."); + return false; + } + if (modeVal.val.u8 != (uint8_t)newMode) { + modeVal.val.u8 = (uint8_t)newMode; + bool ret; + if (performUpdate) { + ret = updateAttributeVal(FanControl::Id, FanControl::Attributes::FanMode::Id, &modeVal); + } else { + ret = setAttributeVal(FanControl::Id, FanControl::Attributes::FanMode::Id, &modeVal); + } + if (!ret) { + log_e("Failed to %s Fan Mode Attribute.", performUpdate ? "update" : "set"); + return false; + } + } + currentFanMode = newMode; + log_v("Fan Mode %s to %s ==> onOffState[%s]", performUpdate ? "updated" : "set", fanModeString[currentFanMode], getOnOff() ? "ON" : "OFF"); + return true; +} + +// this function will change the Fan Speed by calling the user application callback +// it is up to the application to decide to turn on, off or change the speed of the fan +bool MatterFan::setSpeedPercent(uint8_t newPercent, bool performUpdate) { + if (!started) { + log_w("Matter Fan device has not begun."); + return false; + } + // avoid processing the a "no-change" + if (currentPercent == newPercent) { + return true; + } + + esp_matter_attr_val_t speedVal = esp_matter_invalid(NULL); + if (!getAttributeVal(FanControl::Id, FanControl::Attributes::PercentSetting::Id, &speedVal)) { + log_e("Failed to get Fan Speed Percent Attribute."); + return false; + } + if (speedVal.val.u8 != newPercent) { + speedVal.val.u8 = newPercent; + bool ret; + if (performUpdate) { + ret = updateAttributeVal(FanControl::Id, FanControl::Attributes::PercentSetting::Id, &speedVal); + } else { + ret = setAttributeVal(FanControl::Id, FanControl::Attributes::PercentSetting::Id, &speedVal); + ret = setAttributeVal(FanControl::Id, FanControl::Attributes::PercentCurrent::Id, &speedVal); + } + if (!ret) { + log_e("Failed to %s Fan Speed Percent Attribute.", performUpdate ? "update" : "set"); + return false; + } + } + currentPercent = newPercent; + log_v("Fan Speed %s to %d ==> onOffState[%s]", performUpdate ? "updated" : "set", currentPercent, getOnOff() ? "ON" : "OFF"); + return true; +} + +bool MatterFan::setOnOff(bool newState, bool performUpdate) { + if (!started) { + log_w("Matter Fan device has not begun."); + return false; + } + // avoid processing the a "no-change" + if (getOnOff() == newState) { + return true; + } + + esp_matter_attr_val_t modeVal = esp_matter_invalid(NULL); + if (!getAttributeVal(FanControl::Id, FanControl::Attributes::FanMode::Id, &modeVal)) { + log_e("Failed to get Fan Mode Attribute."); + return false; + } + if (modeVal.val.u8 != (uint8_t)newState) { + FanMode_t newMode = newState ? FAN_MODE_ON : FAN_MODE_OFF; + if (!setMode(newMode, performUpdate)) { + return false; + } + } + log_v( + "Fan State %s to %s :: Mode[%s]|Speed[%d]", performUpdate ? "updated" : "set", getOnOff() ? "ON" : "OFF", fanModeString[currentFanMode], currentPercent + ); + return true; +} + +bool MatterFan::getOnOff() { + return currentFanMode == FAN_MODE_OFF ? false : true; +} + +bool MatterFan::toggle(bool performUpdate) { + if (getOnOff() == true) { + return setOnOff(false, performUpdate); + } else { + return setOnOff(true, performUpdate); + } +} + +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterFan.h b/libraries/Matter/src/MatterEndpoints/MatterFan.h new file mode 100644 index 00000000000..232577b7bef --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterFan.h @@ -0,0 +1,163 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace chip::app::Clusters::FanControl; + +// Matter Fan endpoint with On/Off, Mode and Speed control + +class MatterFan : public MatterEndPoint { +public: + // Fan feature constants + static const uint8_t MAX_SPEED = 100; // maximum High speed + static const uint8_t MIN_SPEED = 1; // minimum Low speed + static const uint8_t OFF_SPEED = 0; // speed set by Matter when FAN_MODE_OFF + + // Default Fan Modes: ON, SMART, HIGH and OFF + + // Other mode will depend on what is the configured Fan Mode Sequence + enum FanMode_t { + FAN_MODE_OFF = (uint8_t)FanModeEnum::kOff, + FAN_MODE_LOW = (uint8_t)FanModeEnum::kLow, + FAN_MODE_MEDIUM = (uint8_t)FanModeEnum::kMedium, + FAN_MODE_HIGH = (uint8_t)FanModeEnum::kHigh, + FAN_MODE_ON = (uint8_t)FanModeEnum::kOn, + FAN_MODE_AUTO = (uint8_t)FanModeEnum::kAuto, + FAN_MODE_SMART = (uint8_t)FanModeEnum::kSmart + }; + + // Menu will always have ON, OFF, HIGH and SMART. + // AUTO will show up only when a AUTO SEQ is CONFIGURED + // LOW and MEDIUM depend on the SEQ MODE configuration + enum FanModeSequence_t { + FAN_MODE_SEQ_OFF_LOW_MED_HIGH = (uint8_t)FanModeSequenceEnum::kOffLowMedHigh, + FAN_MODE_SEQ_OFF_LOW_HIGH = (uint8_t)FanModeSequenceEnum::kOffLowHigh, + FAN_MODE_SEQ_OFF_LOW_MED_HIGH_AUTO = (uint8_t)FanModeSequenceEnum::kOffLowMedHighAuto, + FAN_MODE_SEQ_OFF_LOW_HIGH_AUTO = (uint8_t)FanModeSequenceEnum::kOffLowHighAuto, + FAN_MODE_SEQ_OFF_HIGH_AUTO = (uint8_t)FanModeSequenceEnum::kOffHighAuto, + FAN_MODE_SEQ_OFF_HIGH = (uint8_t)FanModeSequenceEnum::kOffHigh + }; + + MatterFan(); + ~MatterFan(); + virtual bool begin(uint8_t percent = 0, FanMode_t fanMode = FAN_MODE_OFF, FanModeSequence_t fanModeSeq = FAN_MODE_SEQ_OFF_HIGH); + void end(); // this will just stop processing Matter events + + // returns a friendly string for the Fan Mode + static const char *getFanModeString(uint8_t mode) { + return fanModeString[mode]; + } + + // Fan Control of current On/Off state + + bool setOnOff(bool newState, bool performUpdate = true); // sets Fan On/Off state + bool getOnOff(); // returns current Fan state + bool toggle(bool performUpdate = true); // toggle Fun On/Off state + + // Fan Control of current speed percent + + bool setSpeedPercent(uint8_t newPercent, bool performUpdate = true); // returns true if successful + uint8_t getSpeedPercent() { // returns current Fan Speed Percent + return currentPercent; + } + + // Fan Control of current Fan Mode + + bool setMode(FanMode_t newMode, bool performUpdate = true); // returns true if successful + FanMode_t getMode() { // returns current Fan Mode + return currentFanMode; + } + // used to update the state of the Fan using the current Matter Fan internal state + // It is necessary to set a user callback function using onChange() to handle the physical Fan motor state + + void updateAccessory() { + if (_onChangeCB != NULL) { + _onChangeCB(currentFanMode, currentPercent); + } + } + + // returns current Fan speed percent + operator uint8_t() { + return getSpeedPercent(); + } + // sets Fan speed percent + void operator=(uint8_t speedPercent) { + setSpeedPercent(speedPercent); + } + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + + // User Callback for whenever the Fan Mode (state) is changed by the Matter Controller + using EndPointModeCB = std::function; + void onChangeMode(EndPointModeCB onChangeCB) { + _onChangeModeCB = onChangeCB; + } + + // User Callback for whenever the Fan Speed Percentage value [0..100] is changed by the Matter Controller + using EndPointSpeedCB = std::function; + void onChangeSpeedPercent(EndPointSpeedCB onChangeCB) { + _onChangeSpeedCB = onChangeCB; + } + + // User Callback for whenever any parameter is changed by the Matter Controller + using EndPointCB = std::function; + void onChange(EndPointCB onChangeCB) { + _onChangeCB = onChangeCB; + } + +protected: + bool started = false; + uint8_t validFanModes = 0; // bitmap for valid Fan Modes - index of fanModeSequence[] + + uint8_t currentPercent = 0; // current speed percent + FanMode_t currentFanMode = FAN_MODE_OFF; // current Fan Mode + EndPointModeCB _onChangeModeCB = NULL; + EndPointSpeedCB _onChangeSpeedCB = NULL; + EndPointCB _onChangeCB = NULL; + + // bitmap for Fan Sequence Modes (OFF, LOW, MEDIUM, HIGH, AUTO) + static const uint8_t fanSeqModeOff = 0x01; + static const uint8_t fanSeqModeLow = 0x02; + static const uint8_t fanSeqModeMedium = 0x04; + static const uint8_t fanSeqModeHigh = 0x08; + static const uint8_t fanSeqModeOn = 0x10; + static const uint8_t fanSeqModeAuto = 0x20; + static const uint8_t fanSeqModeSmart = 0x40; + + // bitmap for common modes: ON, OFF, HIGH and SMART + static const uint8_t fanSeqCommonModes = fanSeqModeOff | fanSeqModeOn | fanSeqModeHigh | fanSeqModeSmart; + + static const uint8_t fanSeqModeOffLowMedHigh = fanSeqCommonModes | fanSeqModeLow | fanSeqModeMedium; + static const uint8_t fanSeqModeOffLowHigh = fanSeqCommonModes | fanSeqModeLow; + static const uint8_t fanSeqModeOffLowMedHighAuto = fanSeqCommonModes | fanSeqModeLow | fanSeqModeMedium | fanSeqModeAuto; + static const uint8_t fanSeqModeOffLowHighAuto = fanSeqCommonModes | fanSeqModeLow | fanSeqModeAuto; + static const uint8_t fanSeqModeOffHighAuto = fanSeqCommonModes | fanSeqModeAuto; + static const uint8_t fanSeqModeOffHigh = fanSeqCommonModes; + + // bitmap for valid Fan Modes based on order defined in Zap Generated Cluster Enums + static const uint8_t fanModeSequence[6]; + + // string helper for the FAN MODE + static const char *fanModeString[7]; +}; + +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From 7a0775d697219c131d3da6c467e149d358ae29b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 13:02:28 +0000 Subject: [PATCH 036/183] change(tools): Push generated binaries to PR --- tools/gen_esp32part.exe | Bin 5931744 -> 6389808 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tools/gen_esp32part.exe b/tools/gen_esp32part.exe index 51c1959ac74e7eae725b9bd37b1fb56c8ef4a3ac..5bd12c6360d5a2ff487005fe8afc3e594b445d88 100644 GIT binary patch delta 1484351 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%0Ak2(H(nxQ3GswIR3)(zjG{Fy(r7~%l3+b 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
AhMP9hgx5?ZbZt&I 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%0DVitgSc~}NSok$j8sbFP`?O`_%%fq-MUJ?<( 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

61h3I{Sk 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

T|~J@U6{oEDDUlM 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≪gwIuJsk+_ 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%0Dmd|4NA1 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

nqhvj;<#x8%x`5Tv%!{w7YZjUPFsWEzf(ZWZeZZ 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 z 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%0DsE?AM#1sGAb`wz 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 PtM{#VV$sfj&u0G*S9QN6 delta 1023761 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�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 lyM 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

!lz_1*DyTzc`{bg5SQ74Y*PV-sl6lGsL&Se~uY| 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

~J{MMl7 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%0DX_G+2l-V{UX@lZj% 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%0An8 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

fC$6^yo&rbbpV zxo0d>^lTMdPP={#r`aNxyQhomsf#{F6;QP6VmLgFu7Kw{&1s#sYH5T{dwPFaC$`Wr zO3fbAmM)E;wMUj|^qP|f%?;8w!?;n$f3pqAQpId27`sxag z3ffx7RB5(emAVaK7Kf;kfspCXmT5B z_Z2e;L~k>l{3m$Ay7+EpecXBcaI=|?D>0G;Fdg?7K1o6|nr%16->P?X)|mC$^OWtA zFjPlv31xc=KJB~yHGI`+E2+&};p^V7hm)_zR)Eh+LqN3Kskf`$Pa=N^w@%z)-LO$EI5F1tx>Q|!Pirgu)6McetQT&Q z2{e06pZn9g$~bXekJ>Ak2?(0wcTzdg0RlnrzAgeCaN(h=6N z6`k*dmDGT-w%_b&XTN_Lo`u5$2)120PD_MYrydn<0Jp_p`#p?Ktk31we{N)r@iFvQ zNLI&!7$;sr=S{CUM}#`}C+f*XFhH=jNqfSa*k&5$(KQt`SvnYZ<+`D{XI2gXIlhx- zkHh+D&geB~*rTw1Fw|4gr*)v)36AjL@Fyv{5N7{Q#9CiY{#}2AZNOh&wG0MSNPmfZ zm}{$axSB9gx}16O32YG(2Pdzf62ju|=(ulO)xGGr!^i#`U4omI4tp*-#_8D8y6CE7 z9@3#H@qbnqc4=b&2Oe{0vp)I<=%UC>uKwUCJP{~FAQReyD`Myk7kOT-qBk_Evehc< zIMCOAwlZGpveJL>@op5Fe(9k zN5LGQ1$F5euXA*c5-jbjg3Ucj+0e*>ZXBmJ=L?@st!Rsu)@xEVCY2wiHJWxJleVsuQ4??$sfhz74Q_sqJ7 zz|syf&gG1bIj}Otam6N$TgSpix;s1`{xPY*%+jpJF%;}1SG(cung9v>kp%H7&;y-;Eg6p2Vn9`jc_RU{d3bG+ET1 zEi7s`V`7c<8|;agQ(g2quQ}~TI2X)mHwc?W!Iw0w_k;A@Y^&p~Y4G7zvOD9qK8V{J zzuxL+S79&b3q3Jr-br?L57-B6fir(5e!dxvNdnOeBIWd#7{wDKdmFAFj9S9b63y^r zV4pXOHnu0)Sc0Jgi{rJko)c!e_KXAt(k+-;(7oJuuYt87qMwpG2}ID++Du0u1iEw^ zbDYbpbrGjgN9mm42QaJy{Z~A)NxLW<+3XRHY|zgQ$d-EJ&4|roMb{VHU08p^$!+%F zcrksbr**ByfR>$nYIma1{f+tl*ww$FS_oI}vW5WiN*~4KocdjzgwN6wEiw=x2 zv<=r5g4`A@3(G&0TnWKfPd0q3gHhYtZUr|mN_%K&_<%AG0GY(&tE$=X_g}kJRRMZ&WS=_nhj!pj{01$(y|X`(s}(& zj{C!41{s(8-VGOUi4BQZ1GY-T)ShN?EB7PN%L5HA&2# zqqXBMzVp&Iu_h2>rq<248d{+padE>LaDyQ5r}NazgN5Dj*c0=FE^8!XtDm=~KeH$L z)LVZ`hP65M7NTj60cK=#Ow1xOiwa-%!)&wWPG-*nv+$qLVVDeB4WQ9s<#b+@K5wBK zL|&J&IDVmE=QBk+kIv*0wgl{Yl7U^6Vqll0fo=C~;zcd>3@d2ZFXQuwa9=?=$AeOn z0}obOgQn>mSz!jg(2=D!YAXy>dZEFdQObXvyM`9DoM*IGEjNR;Vo%!E#HZawZFMC( zAq05M$s|@ViN}(iM%b^?2u$Y~siw9%lgkk9g0V1~L)=%54OpBJQLIsUhGFNg6DPPt z2kNqgh~!B|P{Bi(he|8f#V4sqB^R`P9vToG>?WR*%))b$g?LV~L?{pv_wOhMv>AUk zad0xxu8=Y7lYcVIg{a2K7U}cr8TMD28uJZo-!^A!=6Ob2vEnXn_GL62)8c#EyK%WW zpyow5y_qn%uwgDrfXPh~CKo0at7_RmyIwz?B|3-UCP^JRF)pOXY}l06Z;Jf zfMceA;t?99+SFUF)UCX%|BG^I*el-=UabbTTzB-K) zD-oap3NC37=4+q0&UeZAnAZaP)fSSAl=U*zgVFPA`IRp}m23L8H42d^ugL#sKxtJ0tNh=VvIFK@jx z)_^W)kAaIoZFA}!;Tof+(7;xX!8TmgM`VF>C_Jzur#di&-r4K1kvOx&k44Fk<-4fD zB2;XlL5nXnqiM}j~T&jF5|+tL37M3tiXu0-9UhIpXI`{2TQRxMpKX6-3Q!}R+GtD z<;W$t-{y{iFMFq}@ttwYkQiehxrE#GYy)ZGPU8I!R2UXSXcB)|h=pJvmULt6D`V-2 zc-Tzcv4k_Qe^3cm3@pbsaQlg5)-d3h!(IQ!QVAzP*(g(;jy(#y z3-?S%ToiC4&oQvH0jIcNr`E(Tq!KJJJ6Mr2qbPu%ad_-75hT3=x&SsxLE5|Md}Vx} z!Bdj>0PEuho6UbV0FPYH0QP1P=O2x4CfZ=MAa?Pev^_I`00b$-batt2;KiXVj!#I` z#SevX;D{{ovHNfeePiO%(YtIK(Bp&=)UDPh@G{Bg@lG`f8Uw9KAmrra9K zB~<0y%a(Htd^wGCkmffBNrF7$LMsUHrW|M_Ub8UMknQE?TEOv^J6^nRK$q z1mA$W(P9iHj&eycc;weK3E|%f2B!JoZNom94e_KEJgta|`=V4-K^X+~;BXdUq}kpt z()7lg7TkZY*2Kpcale{?^^p*73O0{Q_u9NGI`*mA6>HGtRS$!JL$#s{!|E$^ zR6z;DMx{evw0k4!axLSSP~o}}l|~gD;V#_)3acgyYU!AkXLafv26bBAT34~YQ00k+ zPfi_MR;+h{?n4ZfWY=>>hu&$n>wiP)EYp^8=sACYBtZY-G=9~GD0Al&eYGVTT9x{& zx~ChpThGyP#o24CRR}Yc`r=a46`Z}|N--!UZpgA22uiz|*k%5KsX}~C&V|#O>XAEh z@BZB2Egn6z2I48FX8@Q9%P(SZ9?R(;Lu-Hm@+vT{!;_s5G^dC`bF5#bai&mkk*!r( z&QN~^ni^eH_i#%)@X{IWc?*S)zY)GH|G~2lqru(HLo%izG0pq;kF|^HKq^P8FBG8d(Q+H>_{#z7C?*6J>mskv$0B z5?Ia#;N5lzHw320GleQ>Ptv8_pM6!T{o;R;GdlMEC=l^=Da?lJDB}>|Y29o3vG=!i zjEmx`&tK@FEwl97hqZj%2NGyHw9+bq zY1IH%61fS%Ixa-(xCE`^N}um0=+8qlP=8v(-dsHdHVF+%K*0^P;mv(JA(AhHNPd3? z;2gl5CBt3?iv^~j-kiE9(s~D$GeeNB*@pp@Ij(T8>Ie86?K0b2k>H*wapHt{RvOXc zG{!UBGeq@D(W10m3EVHg%K7ZU<07XuOkL$wE2P$+I1FI7(;ES^~ui4S{3 zVB}5ucX4fig?*|jWT6lmV>pT@G&p}3DL5Bt!k+6dPp!oG-+MkS#K<815q}KxW#y9e z$!Cm?E;FY`smO#3n;DP3V4;z1Fj4wrAXBtsk(#0O4LbHOcya~8M5ad#6ZZ$0QEOY6 z1(;yoJzh~|ESM*C7z%PisC9fx9jsq zh0|ZU10jD=VhN)yT6%)fo?UhecCYJ)dBJpK#fcvxX?sVv21f0l z5=r0Cpi*^EEgOOuC1B;yK*8U5RTTM~fH@xR_?&J_$()4QK_Z}OY3=t0dl(*s38|1U zuFHjhR0xVc+Px#+UMGbkE4`JeVpXc&dUqnCemHxG${I=1JVn{7)%brI{jH+>^spLO zIVY~4&8ZP{v`J_PiJd!v`AS<|_==m^@$s>HuY*cpN(cOkk;m{*9>lT}7OhMzYRYvk zj_*e59t6pP-EIg3OD5cHuE18zux?_biilpEHi1ca41Kw&Fm*=ONfMMM*dV83&u9ti zc*~>clg!09bwfP>S3s!0cD_7+m9gDWFVEQELS3Nupa!rm*iJG*B^dsQnU03NMzcpy z(o)7&6t+iD)KarOn$a}i6UO$t+M3HGo;BF-V~#a~Q{w4iV6T~V_Bf9lo^fxS51jL9 z=zT3Fmq%hrNIY%k3=rKPko#9|5bl9-u%NGBBa_BkzC^y?#rd;hW`@y!)WN@=qY^Qt zH&+F5Y2 zzV|V*Lc9mDBL>7Uxm|%>SUxJ}J;1kX+^@qQ!`w%rOsU)Pa*uT&TAE0zAQFuVEOTUu zhNS-3gP1g6sGMBVZ<7&!c3afwXnjul(Wl;RnVcU<=Z#R?uB)jhE)mrG+X7KN`zbJZ!Wlx*sEjUE+>3`!*G6gSQNf z+Mkzo$1Wquu*N~V5)H9I43^kkSFf8wdOraj7n0@Vow}4eBdxW6f|F*@x|X#wK-2_r z-H4Ps+rx8USlE|35H`mno3JAh9{Dbd>j;CnSaPaMd00*5PJ&Ossz)m|)NiZ&hN|`s zmF$bXMM_(NUGA>4KAD3Rz?JV$)XWyma~%N2s@$uEwXLW+?s zAyGRzgxvS2L38yLxz3esEYk(m@su;*0C?_4M}1@q0;URo9|86x_hJ)%H%muR^=!ph zCZe_$d7_eePdHLD*oSAYy(0LORX(?ka+wHxcT1-()BHAeew zX!7%aM3W!O?RgkfG4*p2{eVe<2@tZdh7EP7A?fW&r#`NLV_EkhV>@$&wR?Mu=bZ|RAR@L4C$TqVvJ zkk1G5SkYU&Ka-qf+vknELB?UQM`98$rFqnUWQkuW`1B;tvBY=jW?GTr{aisDNhtZ; z4cQB``s6ZqX*$H--h5W3_tIb`u4x;TjV|1~r<&rwhlQ)43w;N(hKFEk(3ryGKZV<$ zM8Q$a7`xW*oR(Y)ZBq;zkn@JEPQ4-fwMTFWG_@xQ}g@!r4VfAGJ=&pN1tpI~Imgf!S|m0k_N!*{pyL6T0g{6e$NTJWt_ zoufeu*TvJIj`T5(=ACptt)}x^n;eF)ys*4cFyaTm=i=1XOWxCavdaTsF%vLi=?u;$$FOXMu!QA_lDq;WSd8{HL%+-b|QIlhdvhC zCXw2D^iPF45);R{J2#M{mJEza>eN($KGxEjDlpyVs*Z|wd52@F_HBkjLc266A9VV+^GD>na348;ZMy#yq4um( zkWMcQS>%!fVSeumaj*2VpANdZsM-5S+}+Ui!~#SA`yWD%&C#zZ$HuS&h?45id*+Pn zRUp|gWBEI=m5XQV7ne}WSvGT1drN3cJyv%6MdR|Ee&wmncNIZ{e z5b%Lp;a~q8(|`608`Tzx3((1DfJ5AtVcwkFmG8y8$JgkXx5{1<-dAO5&uFTAeS0bx zzLe1vdERJtZU$~4Lz3A`#JqTUQO=3E7;OsY`^lG)e3(6dLAbV(`aVfn+(zvd zj`a8PVtLe(Jd(SZFXS#f(@9AV#$_zi*0G^mm>@yhoH;PB`h(oYvg##xBC_8uo;zvoBI#@NEOX4@KV|la{hra7Z9F3MjHD zg!nQBg7$6(;hX}0HvhB<F^TuDxM zUYJ87^$Ne({M)A3eB5;*Hot-H-~2tQ`EN zGCJmSLNBI0M(q`WK6VL$eu;Do@=W^U4g;IUxex8p=U!fSKfVRvCLD$Kucaf54n2n_ zYcQ7GXRhHlkiWSF8_N!5KyP_CbpDeT_iYWNU3r;c{vY&Og)^mtvZ5>5wBjQ z`R&EtchW@6?c=i)Y2LCLAt7kJ8Iz`6IQ5~X81D8tB!Erzz9$DWbMQYeWETLZwa$?q zfeygE+=gpBj|UQGEKwM!Cov$sE^^q3BYkW)8EK|}bb0Gxca~)QZV`(ENZ@|O8v+Cd z?lofIUL2+p19yv5;9herAaF0%sJNTTN#L$W8eej)%bUi1*K9KGL@{vhj^QVTC_j~X zWA@Xn6;%At-&_80wgD+noO_3 zF%AWPxD1P$@Ni9#V3GrY5Td?cWO<;zk(vpcXktyT_^9GO%h4Hp~NNz-!S1}o|;!bh8$qNO>q%`=?wJtB2`>2%6 z^)#HY&$w4go95azlgxFxIM@9#Npd>_W6b1#Eu8_C(blbK%PlJPPW)kpEup`{pkG`8 zA!|aj#ePcw5k5(q1Qam@i|>DtkMEn_FGcMRD5rjAI$A;ETo~h50%7q)i*kw7WV~dNx&FYh5RoowUOO#QYZ4DrC$(8QoV6ouOHBjfnE#+wq$P*i} zes?(7dn0>V2bK=xXBc~&aSVG9o|@R>#>5J$AZi3v&^CrnEVJV4CiD;$ctES;(A8(1 zjK+yqG}-VHEYdkl?Iu~9C|uK+B1ThxN$u91it>04%l6-2vj6V?Kl>N*wP*#t$09Uq zD=eH1`%JB8OY`t9KPV}8FXo4Uqh_gB-~1XlCE8kyp{K%H* zXM4z_`|}&=$L`*nWlHcv=+8j>iNDw1s*mcG`UCRC&`f0@Hu8IJXPVrQq}$Jb>GSv6 ze|WQ8d*q)q<+e%QQjn%MXm*2A|FKlTX|T3ihBoraWgw~%*^M);5yYn?s_s{(FSKV* zbH^WO0R6?rHf&6S60keXi~4OB*0ZjnX8omkk8fX{)Ig3R685#if~7;;bl5wkN>#wG zm)`IL>5cKx(+Kq1{X2R$vKn}QTVrc$gd=0Hr-MK_jZ_YDyUIeM97yleEH8ht0+ol# z{uO^SeDuNvdbj*LdhLDmZW8A2+tPnU@2iPkdSL>8YyTa+hkf+21pe;&cl2)c(TfrI zJ6rOv=pC8hr57d8bNoAc>wNUo0=;4Xj^5oqdP4mxce(g)(z6XakP2gev)~q90iLj} z9<_rW?CApg<Qd^IZkxmY%8PG z)=mt20?(+nY(*=6#ZBganh{Uy=k9G$MOLC?zva8^t0Glo9k{Xs=!_i^&)GfTOedeg zWJzlFaFwM$RX_>l1z~EE;ff*kd1sgPVE7Vj&>r6`$d?FDmmbD{Gz|Nf?3+f>+r+CgQlWmuuU^T!)fzn26k?$R57GQStzyuMMq=hdC7 z{L+^ts2%5brHa9V9taH1ksR-mW^|j`{|AJ1NT3RiGi($r;n>^pmS*T8P7JfV&llbx zN7(Pk_C)PI&9(bN-1Q>OirZeZ{grG-i2v>9e-ob=V)wSsz5Ecv;@;%@4q{vHKP6^V z$Vj4nMP#dTPx;(`KVTz<*gc|&9vVLPAm4Xid;p;`zI+JRrYkpSzi(}(J|LC>-oe-| zK!9hc%o$wqmsP3^k&jNi1O!!R6pu3E`APFso3X9*cP%Qe*_dqXqLc zOm3ld5k`>_My+evZ1O%uhW#C)I_RyAsXc4^xfR17H9D++QASOz!4ck`(UvZ6$F1In zyyImF&rm#ED9=C{DMf$&&QXq@Nlfi2MstpdJI^GN%J0O3jGd|T#BlUJ-=NK7u`hCr zUgQf7)6kJ;ngxd~-m3%Bi9`7VqG6%BOvidKi%M=Fm@rrT7Zx`;(s%<_*>GxnT4rf& z)Rt4W@8O$&{6N>jKq16$dy`T72etVWGI}}PJ2)!m6F`OmrbrLa{RHW$#@dmw{S519 zs^cC5WYC*D5KWNI7USo zsS!?tV#iVHXO2l7xNRu^N~C7W+pq8eU!e5|d*g&yAl!1mEOX5QWl{ zSd6AndlbyzQIqCpw1g{7+G`*>`*-<7=Phy_To3C7;#Rygj(cqv5k%-h$EI+%k%|!_ zF0ot=fOK}0WA5}&-{rS?!W(Bi;1O~L=(ZN*Z%zCxYa7rIv~1@*=_nq5OANS)l3zX0 z)G~2b7|jVhzW6K;?O6@Ju;E)SZYEa6tgG{saou+LmU`GI(ToW-EwPd|?66dQT}ylR z|2X^dz$S|C@uW%G6j~CXfg&IUiXa846ttxr4WzJvRH}&L30kSBs3-}b92U|FVO_zG z_kDgmK3;fH%9*s#gK`vqP!18q3pWI$f|j;G_xIkL-ObSy{eAy{W@mP1-n@D5&6}Bb zu>yV2FMEk`d=g{i;n2o0+{@EzICM&XQyfDs)!b-?9 z5~oYMINdHLp*XeGK)U#9HqnXm3Jy8t+=-i}kh-yuBMN(MP}e~=THJ^K{U z&%!TM6m6y3tMNvZ1lbjjUMWuh0vq`bx*>_PKs-u>Ov`0o(fS2RoCO{b06WEJM<5l^ zGWmpciy~&~S?msf-bbVaAOjVZRG@6Q5g-+AAu7rw_2ZyjhaQCD{ZAqlNhnr!iAQcn zDw<0IB@KC*9xfJDh6;A?>8XX?C)13@M{`yz zKH~7?)}a~PWiS#Wj0C;^B+KPA8rQYL_@=-O?uBN5t?P2A7cVnv5PzAhHjWKwXrae- zl&rZ$3^&u*;!4RWb{%z|1YNj}(7}1y^LYn3&m?2jII}kBgpYBGWy{a}NU_H8hR2}0 zi1ShytT>dkCo*)Y1v;sb@lKo+Lm_XYZ2{%)g~TcSaJseu39J^E$DEfq!IFO&x*_*G zWHf4j_*(Z*W4MeS<=nnn%$GzjzeTiI!CDSZnvfXR4?Ub=t~jaRLU^g|`%=6n6%r4m zVsm!tyFK+i{M&9w@`gL0Z!2Ht{&@^;7c+WP^4kG|GTeBk!LQx+j7IU07R^~lRzgEh zQ$t1>u851yPzYzH1|d9D6#^mBuecmr6cX2e^n!uwmxdX@F#1kBl48_|Z%spymH2jl zY^z@l6luh#SlLWgR?;8K7O=9rQmD*MW%pp2yPpF;qTs@E7m@f8dY-u4sM$i^A;R#Z z2{}}o5Nsx)&drP zpojCw?Wei4vz%ZMvB>v_j>|sCnI@dWA6>_B=2{)Z;Q6Z_S-FPC0JvO+;Y446 z6@Zpq*dF0_fUFbX@`l--Zpf|55#4)pv?B1Zcd{s8BH=kIGm71Grn zC|u8FA9V#_ngmPMHUo}WvWQ;223-r`l`QBb9-1c!O6W?frjyWp)m%n7x7?5bAgt>b zqiJO(0w31JgnwvfkE48s;@~a5 zt~gwDb>UAq_&*(d&-q#`sm;syo)A!Lcb_K&95$7F#}JU)3_}t|jc+CdU>*?_0e0X$ zh5&Q3o+04eW<&r+vT)6TaU^Rmfq)Ev1~uib@laoF<9ExEfmrZ=t^s({P|R!}@ytN7 zEcEJ0PoWe21!!O@XNJiq|69b{hnh&dRjA!{u$}KS14N_d&$USN? zQULJ$DqHF_z3gH%jq+rWTL%=+(#y#dW{Hi>%&cenZHUFYBO12zaD`{I?3_{kUzyyh~PP5x!Wzoat3I;4VHVGA*FABJ+WMBJt5`PuBa?`bc@V# zB^y^kJ_+fYIhOf>BHFj$$hSK(_R`2h$zc~8xu*enZTQLt8u{6sVZ5e{d{Ki;4*Uj{ z9PWeeKDl^*iIGd4Q7PFeevILqs~x~=uql=q4Hh3I`6F;yUYTAKE$EFL?*=*=cd>2q zc(F4hk7rr?yE!x_*94hb=?gZCjIGLnuVFRg%hdHMy$poG%)4-Z39Rku1k3lZ$&^dO;<(T@b$r-~ zQO8~^R87<*k~i!nEdpPnlFQOI7BuLoc^9U1Gd?Ga`PsI1TMp zs_D8{vP>?GDp}1V3Hs}6JHu&|YneKX; z2LE1F)VW`LS|0q!Z`8TZgI?}9cZtELbf7~(=j})UbNiyX#)AA&zrx#d?c7VS19?+` zR&`!p?+c8;`9Ih8{C}Is=Kph)FN^|z&<>VPjv@`l+mxdq2@;=8L^;|>SJ6NmuQkZT zv8NSr$g<$FG6Ray?qwtkiYudvQOi167WDX9B@UDYqZ%%OA0vPwp68e>=-kjY4g8qE zXkf2{uR>1>6nT--Ab1xKGU2+lAu=IS#|QqfJfEQG_?)8T|L5Ds6JjZUVq%oP zlrZu5wx~*e-%=S9oxW0)e8fb?-n#lyh1M@bI40 z?%Td;z0v@GF{S^KxOk?0D_lJJ*FWLnhqZ)@BWnp44{eQ#i~eh6T*Q7EhKv4xT>=*| z0FL}QIV)EC2|BMSohkCUg$%*IAUP_00fel*vhIFV4-_W2RtB9&Y zjr~R*bjL4LQE@d4W$4*U$w`1BBSa}esi-~MwmA4Lo{586GSVe+a4XPTV3U0Qxig+d zwfRicQJIRrpe-BrMj>r*j654-cQ(dkHpb`6qmJ>RujMfgUZalj3IO?kx-*v;V-~;^ zKuioc)AqoUNE({;{H4X4^W0zVj??dXanE# z1<)ec)osaP*9{x+v>9-JkTa9x_5Ehh!5No=k^UC7BL^<=sy`&Wy34Vq?Q(X<|2kW< zcRAxW;9fS+ZUY6=*ID_ae8qCZ2y8q1sHx-?x`|ADJdP0Qu5W{M=E~7DIXcKg`pFMD z3K~`MC8>^E;SX;Tr+QWNRsni1%IIzRLPqbYPs5IaIzXprv(9gShuKRzWLjG*9}+G% z{1R)_!#)_*e`8S}F}x42J2Jd{ zbqJBXL!&5Rqqz75jRN6>QLNe$brhU3ivGb-^ao(L)AA^2whxAmq963{A5OtsExi$D z_6mRtZw2?E27(xWhif(ER{Alq3O@MbDL9_Y<244FsPF%XI#Dhonp(ao8<~~7tTMdN zli+44>POkWAU61Pb5uSby+$5k?kDO9`vB;Lf3(F0&}pCtykYyJZIU+|j3Hc|7v{w* z-^(gn7Z~QuYj)j+GrfUUk4%#33cYFw(0E)9iz97#Lg9;>Xj??IG7N+F(&t2-td-=h_TzL z*2FlA2J<=_%$(1O7$5nZ1{1R>Dlw)hgL&nD>R?c*+;CE*G8{@MnWa$w#8K%i0&?(D z2fkc-vMu_5{5^(^u$(q#Fvz2y;E`7N+@X``XlNqnB$~J-hAu1zV8az$#vwM7cx8$D z#q7;Filv#rMD_B|Xf0at8PRC`#;7zp@l$!=Z-0cCCM5&d!%`lAUUo&B#Y_NWjn==B z1gGT{e6KP%m0XC5(E$Ml6=RQV$}_4bjlfVCz;QKy(v)%gc5`k?a^8nllO-RsDckue zP1&wbY04&Vh&p8-ej-Eu`-ghPa%TcSWDF>XuSd8so`DL{Yg&Yz#racQVrMO4Q5Hi( z!$UK^6TxQqs<2jW(z2b&Hyo-g55$165G2qZ8u)4Zi zq(y((_)VBCBez6y#o75-8^0hyUV|m45%UnCOa)=mZXL6!#yA_<4NEYkl|PFfT9&k< zfbjl-n4CtKiV2J)OScc`>i;=}&b@d*%%g`h@3@K+a<6jk&77un?zFB+0on8?YDU1kTK5`zVX-9%nwcv{?g6!~8T(7;ECP%jfG* z(z%b-i+vXZ(WM>3oOk(XRyn|06}w}92MeXOU37I(jcQF*nj=R*M|D@4(PHSV!{bUJ zFZ*^{OrJDc0n>1sH^ z3L~iIy4P@htDRH0rA;(~tDzi5;G5r$3yv2Da_b@*2qyK+N1jNnilcFK7S~vRRKq!W z5Wv4?G@d)pc@`(*%Q-S^HqSk>lMVrgNpm-M#}PO$=cj6N(ds7;ZENX0R{!{Klm$u1 zOBQSK!c53Z5zFBRIrRfy?-W-r0LX-y(;}Vv!}Z@87y}q1QtYt;tfc-;=-n*w#cI$^ zy1jA0il*kDVBtOXbMi%wl5t{xwUTk-@e2~V1x=HECUQbNM${O_GnlIXlbn3McZ(+q0B?t#y#ROJS?b7IC9Eaw z@I>pck`(BYcF+|^if|y_cfObVmlk)0P7TYZrpW*WgW@f#7WyD^HvFi6*HlF0zoIp3 z>B$rpvwit*aZ1oFGnE_?_4Q3CCd3P;@oz21uX_tHB0i5d1y6rXH%EZDbBC;D3sC8) z<_~t?yYy!RP}5-fhx* zrW-xe^?aO9j5$~5KBh%~qjj?!k^RwmET%ZZ%o1HGaXLcxw}-@u2(f!RhJQt?t0L-C zDlg0$neRHsxtn#Ikl4@yv{*&-YkJOW^%Q+g=akFe(Q6uXdRL4mJJfU_y!{h@DD9VL z06;5VB2LuWC2!%_tdTjc2EGbZ8XdK31t_h?u-^G9R@1|?P;bqDdMw!)N8&VKwDa*I zW@~@v;k>n$%P-?6}_{Ev0!pO1(vo>AV z;~#1Ag}3yY+>8bwyhNMlT9#$&NoxK&BcsdP=b@MJPD-$Xaew&n$u=SHv2zEhZN3&; zjG-2_)S~SzTHLyefkdiHHnAO#gJwD0R7g`8hZsSeX2A|et0frf%qls!~b=PQZ z9us`T$CYWIu&*!M$71vX*bEs5Wn{DhoPU!=^!*ECHz>g0=^|)`^Kqv2V!S5~08Vxq z;kVHf7sw-j@Xru{+YrF}0KkWmT*ub4B;5G2>uP!_O>HrOwRl;^UI6^r7y>-ew0?-u zmNj4R(zVI$#gB$@`v5!t0A=U7b9#7Sim39e^jIt685UsjY)~MKa4^w1|MZ%+L@p*BPU z>S;cs;bhJuZAri#JAm$KQ|WfA+goRa&uuziVaZq^@dz*C3L?RmtJMS;dy4pDt^m$E{K_hmbL(BeD zcy6qJG?0y(k&0ZsF)4v?T?`rZu5Yi=q(~Oa>%=ZLjItBR#~6I5*swf)l$e9ClTjo7 zdULZB7y>QO*DM_Mdc7Ij*z+1q1m;QXfbF1nA?WF^v7@uls}|;e36K>6WL6 z*}(={pSwH;!zn!aM@5FWB4Q8DpTYId51L7TEo~2${)BPM83?BJ{&q<2z`Ko-Wx{JH zPWH;cq-TRHboK+?u(yL>#g>H{@pm$!sF66ySD2fXWCxz{Irpqn%xlB;pooib-w)gZ z_>TlPm39nF_OpZciv?m65Ccg=jA#sSqShli#3q)OC*v^ZS%EZe7ntjv2h`}q2klLN zlHD`jh&tZP!mMQHj4f!1%%3&&%Fzh=(J!Z!?}1IjK?i@{?)zPD=btmJNo@}Uxy~qB zAEBA<`j|mjCPAp@+Ogk%!cp z2I?T93AF%IX{}_DUS=}-BOJIRb(nmes(FPK|A$)o)v337dZc2#U3dZW!-@xfmMGlZ zgILH3&!fN)%YUXb(qUFQrgHGx)-$=bj5=|m-ka%Qw6Y#oOZJ{*xtrAwC^-x*QE)GB&lJXSs&Sd0r@ebH-HYL z52o2goeAUl){ zWBfQ!jwV}~a+EGN8eB7f#UGz&Lf-on&qSz^mf7cVBA^?NX-8<}G0AKP)Q-&>be*dK zesKanjXX6g?fiG*C-d08m?aFYp?pnBDm1f2quBw9m8k^1Rk9vPa^C1D7?;FYif=E@ znNRD`822P|40LpfUdB@|&cetZK1;$L#+kLQN$3z(%M>qcP6x*B)euBov~$Mu&o}Q2E@FCc?v=q^`;6{QLoy32-1aVJ4kzoH^@(WTyjlHW?%+ zD$KglRDu$Tld1}{1}$-&a|n~QGOTtNL-DUsQ2c3UfEO@pDqcolbw)Q~WQ0M$2-%a8 zTn`~$z9PNOmEz!k+vAd#LUASNJ!{q=TJcQ9Ptxl7fLVbGKytaFfwSI8sJkT+ls*Vb zt6{mWj@HIJXLR%*?ZnU@s$CJgfUxQ`i)mLZFKkfbydzBG4A(c)nZ7w;zsh_}18oww z9z*6^(2Dtzk@W> z&li)R_l(2P|7F&7@k*qB3>bI*VH)#u6?hnfXUKr)s+kw%{4|tpENs7m$h$WI58AYR zjmQ%NDti)N^L=Z9q0R5Z%a#R=e#_(WUs(UR+GI3 zqp$6?@ijJ+-D}JCEh%?bOBK=2rzocZYw8DbbxzO!P!Ntl{sw*^2fO4z5 zJOwL%v9Qo)n$X#<`+;+x(mLB0VvP1eYxZ{Mde~-^n@Vfas-3VgvI^sHAU+#k4L`Lw zj$9BFPd|vEgsUZ3P<4B)yzPJyF`0sATmx{P=@KndO+XNSHVBp9pYus)CCO!6+Jruf z=%0C*)brcK)h!qXa=}@&MH=4yKC(q3=Hd8%VU;Myrsvb4xw~=d;$0v~tWmN9Vi6J7;f+`u`Egsve@i^LGfpFcqM`cceUGli6L2dx*1>mlWbb9ZmDh5A zo^CkWD;t|6v_1;hL8IAt5#*TrakIwt1L(^~p(#gpowE+Bd^+H#$`DV!wtQwlj5Y-w zW*$EkCp*lDtI=Ub=s8P_!^_L1&^YlfbTku-vJX1Dp*vXzI=ZbDN0N`C4sTKd`@_6p z-e0ZPgv^0_Tb>@_3o|X~3-dQ#)P?we!pvMP`yAn2^E$;cKAj>Dse7v)ibH55KVv3d z#qSXsp8+G3EbVA?a*~2RK+*LkpVr-|b#-A%mErC0aE#T?Sn>CiW(g3H*q=T;vVFUV=yb7pdoID($G~gtf95^)oN@A@U|jf-r3XbPjs5yOJ2ACKersPI$d96sJ`GBCDShy`Do?S&V*^AJ3v6rMnjxHBJMc zqsQGx^w>vSMP$4mSfq!rev+|&AEAd&G#$eIqt}71SD?SB3cJ70#-`}`3Dd1)MF#UO zS*$DBwhTSHazLl2fWCnKXCAmH@rDYRTUg$1Mb8VA^KIC&OcU>}rG45ow_oe*h5vO% zOve#X20GLIS|EY#wG6cN;H#G>;{80(mNS7~^P>pKkod$Ku+tjXXiRl~r;XZa7lz7< zHMG@E(UN_Y%RoyJ?^|v#W5Z1`uA$A({{u3U zPew(i;pD$W=9=m@kXaFbP>`8;SVrc$AEP64BtzzrBmV}Ot^HA%vw1u5^*Hn}?-FP) zR@~Sm@x~0Vr+t`HX)qrdV~Rf|%NNT5#fdN0#>wfVM~HC=>cwDxmQH$woK9MRcjd&~ zYLqBBt@KT`aV)KLw{lY4>O#^=U(prQN)N*~SX${!C9U*HA3MK)$`lJrVR?BKRjh-) zCONHi41B@TN~i8^!nD$#c9+viKTK(*k8Y3Ch_|$lOe_8SlX@28>3VoeESu6KdD1hy zl!`8Lyiu@U~LM z+f;ZrGF=s?V6Ml1b{TU&dI@v8LNIsIf|zTrQ8AaJVD3vV!(5IyXf0swWyIVYUIla2 zH45fV)Dh<9UM6GiLBia7P%rjs7m2w~OJvMVCL1mjM!pc9p)&_i=n}Kioj^`rGnZZN zI-B98L%x2LI5NjbVPlf<%H7>)aCP9^GmLl!d%+*e%Cs(jBL>EAqz&zS!0E$A_X54q zRI-6ii+r&7KC_zcJ304V=q>GoZnnG5EX@=&8ZSTH?0kG_=F{-g`M}c5RrvSzrJ1Yo zZ{E_(XYlXnrJ4W1zeAR0K8t@-mS%n(1AjX%&HM)b^7~vl>(TNiaLxLs@z0R;Xbl$_ zupVbA(0e_93ZKAb>z9(OSpOu+iuG=i73*<3?77)YG2qA~s1^j1XSzAikp{|hdMf<} zN;%JbqramRJw70;uN{}8A1>)ms?I)@6FxLzOsb_P>kYKW{H03XpOhQ}sf5|0#roSY zq%_X?9P2u|7TY|UmE@VN>+0Y&@zc?Gr7rvDa9F{A3Atu`$d@eU<)|OLZj_H9L9Wz- zVk=oR%b9)5HK^}q(pG00MNvYh7qpeZ2p^cEn3FR`ldoe6I$(c;oW_?l>T&N?!dhle zZm-dUimHb>VJPq97J)c*%IBJHV2T?4pk(Rd*0Y;@$)a=9X@7gr;^TmNFWib-D*5YDdN0}w?W>OBs2;li zC$5()E0!U{KUAqO{7~^|tjh4c7{eFI41douh2b+5HXmLovw7o2V)KI`Y;Nd;Y~Hz2 zW%G1}&1*Nx2mE60m%!%lBAb_PRM`BdZ3>%z>vj^GKh;HM^ZCT)o1k9IjE!XT%B3=! z-$HD@92Z7EvOJS_^h(}tOj#k9LLOb}xgl#gSc5fg=y%&P0AIylT6I)e( zMCEhrT1|Xs14C54*yD?4$v>M$c0lAeD7g9tJ_=C!)dRJJs~HvgTt#ZdvTqD%ZS1-(_8iowRNi za-|G&And$yeOJB4%aFDT1Kn62Sw=p8K2(kb529%8vdDlA!FVob(D4*aR*GoEo>%CP zy7zN8r9EoIbCjD<_ZJL(r()~+>bBzXGc)$YLAVKW`->#Y_sejPQzAJtF|2C_CIJCC zW0$;Ri$=z2Tn#XJ6m|sWtMjrZ39khNi^pfcf*2@Zc|(MSI&s0hFlPluaTZR0h*VKD zGFjs~hcb(=gLn5Yg&i%se-kWu?E7*kgZ)+F8{aC>+_+4!#E*#80<B*Cut zY5GP;*dtk7OaCDxO<3fJYgwPL^n0iYdEn_wTZR7!-CyBW*l-j#qEZop=vxmU`i`Of z&GA7X=(_1h5Jfi&^3{D|-edWbvZ$2xpW6gSC_ zI99apNdr9SlnpK?Ec23o!jm;o4;xr_IVe1Jt~0d9#w#F#r3p7OO*-dg?xsYi#oc6D zVsJNgT+&`#c26)lT(#8J3P$T+e{^s~wJl0K7OanB^~PxRm`AI1=sG;bY_RoqrY^`? ztIb&f3q3G^bBMc1&rbf`O|j12?k1yik-MqAb3TCW?Bs4rGCeJSP-Pd>Dpa<_rzvgs zvD}PPImHcl{hGM-Fr9xa0Rpn~BU7=s6Z$`Fme*`9qnQ~bYfZ(cSejGlaqf^j{vji#MM}533yn}=blJp;YS?e(m@&*89ol^b z&s8~QOpc8&^u;@Iw-=P$6-qdX0bI7vIh52#oSZ-a#(8R!Y}4F|-u0=0SOy4=HW5(u z^7n|UR~O^yk)$Q^zYe?VCSHrMlefeMfhp+MS;1FEF~ZOijK zWW-N5iWjPySWrC99Qcev(1DuOI`*8(MMaC}(7kzLdx9o$F$(q8VbU&{PX{E@8H~d< z_9BNF!JhQWG(sVN*V&3@XiV=`o7`wkF!V6c9rX74A?)qNMbMjDig6m;AmT<8jk@Ir z*#Ek&UeBa|ed2Ul_p%nyx)@(+7y;GVKqv8oTogy3cdmshkM1ii>Q5JlAeZmc9Cz(whIkU+;F2&R_Ck39<;W-_ibKp4#p7Y^3AD(Bx^NcbIl%n&&^Bj1t=X8fm z=JuwJMks)Wa-g9}&=3a=je~}A()0LOJ1wD8&Pyzo=oPra3i(C{-;OZR+rHFG_h;E& zrzPuu@e3}P)uANFgo%yz>}prQ&inj-1FwaO-D3xWV)uu~*_sl5E|Ja^zy>>cKB}HA z>w_EYht4;(vBCap9_}Cvi^~kbgJJo&giqYCUREfVe9>xy&Bvlb`SN;Iq2v_J`}!}K zLdl7>?<*VZQC}$98w!wr?uCDbFD?YWG=y)c3g541 zi8|>3RY0o0`WguH)2q(^Utqf8Z1mF;vTrZrLhaiH!(ERVG!^0deL7T3EQ&|nXhE`u ze>3HB$sF&CqTdAfJ25`C-w_NPefKzhHx`tiTa(+)UqJm;;ZYo)lT2~xfS-WJ0~%2a z&8&`|4*Hdu(dPa%-->T>th*?6o>`GIKN0vSv9#KwJ@|A=h>0~0zCm#43e`OE6 z&+ivs{FubgP7*)Dbvp5V4GN#HzgC6M3`O|N{+J1$8RGG`U~I3T@R|0pB7By8tq7m@ zHjwZcY>zuW$n7Z{k(sp4J*0y?EfK4E5)7p^{#WZRL zzUb9fr{hm6%Tjs^%hekit2o3K_Q;o^4wimVxLGEg3lAaT{0!B(84{zNf9u7`XI0u6 ztD0WCT4o-bS9 zXY}|;xzBjv4WOqdk)DhnDfBe-ONE|pEF*e45+l>otwc{9pkDNxiKM5l56Sd2k{v;X zEM{KU03kmHNUGvuQ^-7yZaNAE;9hf(*lucY@w@6I4rzAk47Qq0W3iLfP#k!Tx!aCLlq;^q z*t7F&nb$ZUv6HEsEpu20*EvoY*TiL4&%NEjS0V@H6L;HS>v;oG$z}`LNL`7;19sSl zW!pQ`&<4`bLX5c1e*|D?k%dPBg#0Q_@=cI2Ok|mQYLAac#DIs$;D*!!0!~h zpQMF6506qv$Nc$<;8NZhSDp^Elv_=Ei( z&BMfZrv%YlbwZLt%&n&7Ff-%OL?UQnjOeaHbOZSkz8?n)f4j!%WC%wOmg|t(7{>1e zj3e~~Dc+enjPA>Ff;dl?asI;S=r~_;A_~s$JE7tn`g~io4Efa3hs~l+tQ!>tD3{A{I`Ycqy9;a;m?P|^+Dcnd1;)+ z#+O^q)%D$Of9vbDwfEUPhIlB9t{;KEgK6DCk*UftQbKtl-&~brrc;`h6KvDnu8huK zRsl;l7&fkr)5JLY$*0NC`fK2|e>Q-4g!5=KBGT1|e7`q8nE&hd z(C@#viTpD#Q`gO2 z2kg^%?OD?kK;%d|Ie}X^;W=WdLOIpSz%d+OZCmkmD(?Nnj6vs_C6d?Gk!+=i*2F>W!xj#6G#1!?dn*c6ifWZgl8GyX19b`&>V=<9$2Eirpz5 zeOJ|e@8JZ!h*r8QXkn?xyycS|{4b8Q;|@NSf8$R>r`Dp81L(G)4j$}j`yKpFyN>*D z|LjeIAfJckf2lKW$;nLTPHBOQ5W z_3x-NJDU>{M7)KD?aiOitaFNkZ*-)!uxSNek+v0Dv-Go|O@IZOP4i(Rdm1r8MOqzB z@7VEjHrQ#D6&z;wTAbQEVc0`#dcVr>f7;Q}rV*xSc#|^2FCrqUDDEw;MLV+CTC|3( zMKeNOUTB}>kfpMC!>_a+wq>u&l#V|Yhp#3=l2lbRG7D63cA&{`<8;lGh@^2|A7O0! zHUe*^%f_;K!W=DTii5GfPm1wD)c(={19|*bJDONli;2D3(9qxe1p^$X{f&98e=rXV zhA^lSk6zA<&hb>_jGj@1vmNdXlNy_(KnD(eq&%=)9&a=fXIwl7igK0zhA3C1qV*T$ zzBx2*TafnC5e0yf+>BE}tVmU`h7NiR8Fm}S?U%8k+9ZYB$fgIm4zWSUJ~B$4J)@#z zU>HgU+Co&vkX`P7epWH^KoBDrf5tHnTExgPT_{FkVCVr8V#LZ{RFP66o@gMH;JH*} z7ejtl&*)U0Y3a!#=5(<4zpB&09L&;$DcnHN`?(ETG)hT96P-QI0W0GM4H-Fjeml;z z*~^*Ut$4HxB?~%$476ppjy5dW+gt}%nu?l6xVm#ft`;!p>;#G)fr0Pce+-IoU_p_8 zNJc|Z)8P4?pe-M^HP^_cT?DLSh=>+uiIQ$zmxJDB!+KoA;gH@UC|P`1YrmmQ3Sb(8 zHcbrerXD@u>M1r3Gxj@u7YlO#6paws>%nUndsXA}(yfRJMcd2c=Nt3VuC@DGbVZ9& zZ@e{ngP&eS`dT~U1nC~qgj>hHuQ7jQ4(S}D5>)ryH@E@HuE zJ0EA~Z-(L3alU4qBm0c0_#QM{O4~nCNT_!RiB3?9tdzV+^sj7|{Np9IcL-L&w5#|m45QfVis#&?V<=osp?eIQiboL0>uB z;~eafT1`VfI!%0fSzFT}S?-&`;s>>whXs-IaPJId9&iLW55Em#^KdYR<^hKqWgZIM zG!b12vk>`L;NzVz7x*}%)m+4|xp-2U3(0bDI+^~IMVXB0VUzKDgE|?vdtfrGQt)hB zwl(O6$7c zgzrq@ku8jq%^*&S&ah}Jt-}gesJaHq7e=>_z8#b=IK7x2^$ZLv zV=u6H4D*1270NH#lkuu*7o8`uisPwsGQbe`ncZ_!RYp6y_c(FQkmZ5GbTBwlSFZlcMU6v}iP;x)ORs>IwcY-wJv} z>LcJU(uctB>DmVTJ&Ymnzq?$4-@30g{QXq;*T|M>6<0I(>-7Xb0u_XR?J))ZMM**U z!}9(Kvs2%K!OUR7{WaX zX0|x0uYHH=QNX>XV=jXhR+IRaTC+^9IUWn6-fYk^4CUnVm7uK5>~fKkbEVTYH)wTM zAum?4#NMITzzbwOcn&?V6WaqBVk9DTp2)7Yn`}GDVo)s3Cc)YR`m_=>`Y; zL^guEe?4uagMWca+eCz85ja;)zuBl-)sc)(^F1h9v1Iu)X=OcsgxP+`C z8goofzNf`4M2lUj8lO36jO*Okm9{Ywie|BdNPM9p&b-PCnadynhJ~uaklWOcz zKvCROO}ZT2IUcF#Kd@FmO78t_7w_t@}>P z>bjzXKW1O8%@g!v7(u{%ir>ifKf|-%gmVeKp|7Caz}#Eyd;Va(LYLw^xvL(mt7k*I zf4X08Di9OBtBG>`TI}jQIza4;l-);e^J>=Sn9w%6$lqwl1-Qy4aIj>+0#j?EghQc{HbQ%jI7% zfNpqIo$cjv%`#S#8KjU0<(etF5IWGgf6nFMnzi4N1{;fVDCz7v$Cr>*v~C|Scr}WX zyie@40?#bJf1#P0IY)AHR5l|tTKHPcP2Z(#2;Z>Y6w6t;q$1cpLRDS6pf4MZk zK7Tj}+KqC}Ms4W(qvg_P*!!!3h)k7h?k0JbM|-8W2Fc+8m@+p*R^~#sOJUk@?*q!= zT1a6+w8C@yqZIxet#D_w!gbLK-;GxIbhN_9q7~i~t#ER*!V%F5`$a1>M=L!4U6jJ( z(F*rOE8G~Z@PlZD|A|((I9lPXe`tkMq7{ygR(NH!!lY=0(zj6xPed#HE?S{CTH(jh z3SanEIm-@PvthYry3;i;sk%pg42$|!9TUE0KkyQ*ym^@M^^jOHP+han#8Q3Q6Y9!5 zU;ty{3RZL9OKMFAx#l@svxSGZXY94XHkcOHuR4UU*az5(edAQUW{W|wfA~Llkj!We zH|e4;+mgjGm2~hy(C=MK3>xT`TL13K=$qoj`*07BM-^-x->t0UxJ&2oq+4FdZJeOb zdjXB<%3@KLVMb;ALI?W1q5l%JCZQa>3))f0g;pIUVMh*ijW_gXh?vJ#^8GKXf+uhV ztC_%R951Rhd*qsATI1zof2Tp?0Z4U`zlSF89NtYq)jU^&)l_Pm*FtGd3*C*kJNw#& z>smm?egvL|z}_PJkGW>f?T_K4ZKhH!zT)}~v;;@mMY~(N!t~@TbS!kSlga%QEfTZ< z^OcUYodD4$Bn{XJtw^UcglPb7&&7cA?-1I)1g-0;$%1|fmDu=;e_{tVgyOwg3f&Nf zp)-4;5blv^h1FPy@KG}KT9cc?(e63Lz>_I9Z6_}Fr-l#|w*qL(7O7;oydRYg;nMzQ zC7>b96CdfvfEykKxT(?L$ca{%hJ}O~rdI%dW(|=Sa=Pd$DLde<-R-6*ABwc-A$B=ql2@ z8-lvZGlSV&K+9J=uC|;;EjzD`#9QaxQIOfP3kt=?J`9*oG;%x^YUpRVbSa~n&OzX- zsm66v@ZGhnWC*<1{(1Giw^$3sGoui6@vbP~JRGg?)@X&f(F)U}6?TtS7#pqd&z(^U ze~4CC6|L~ge`tlTM=M+rt#EF%!aJiC+M^W?+esJmPqFnAl*PGyWMz?^2h4~GR~94U zK=6hSo{3|7eoO-O5pKU-6b?p6d<<$b_T~y!y?FF23qb^1ek5_hlDHao`H45dE8;gg zG8&$Uzo$-WlEj=}g7-2ZeW|^OQ&2t`2Ezwo9U6lje?A!5;f__*;cu&)6Sjz)76D>EirHDC+jh4!y?R z7~?9SgAT!PJ#Jv3Inl`xpVXndbBT9BHa(Lw0mb98qIm#D%3hS3ZsWajM1AHr zC|Lp%f9YN}R=n(IdFH(GNk~}=n>nL_X0A>?38A~yBcDaw6GuN!BTKbEY1hxNEk3sc zZQisllZ~%n8MDNui_kG}ZL)jRsW;;^VRc6?lDe={Es1st=0A6m@SQVt%FQfq_YCOD z;mHFLddT6)9l&{}W^$gq6mcvW>uR7Z9X(Aff1)8nz04iBoy9L1kG@RDIUzTN^W0I* zd2$arguH5ahGy=lgXd!oAs6Ndn(*X`n9m!2L-V=y@E5R~+b9kxVV6kLSsY|?!wZ4U zJu^katR)CW23)%M-xdWpGM%u9vxcg`2{kHkhY2|7d~qmn0PNyW;0Ck_+^y~~;Ql}7 zfA8Dvt>*8)7u5M1{6@t5c`p2``3o?9!8^5lv%`}^F-T;4gJcjbV(%6?ghw0ih%dDS zV|+y9U9t0r$ULPP@9!;Qr>lboDc4lvT`QX9HaL^G?DLPB$lYwe_+acsDZ?A+2V3Nf zy<#sNa00wi0k6zW5bM&Rg+6%ZyOD1Heoq&X%b$mRkLM*XUeqP- zd7I)p4DSsxu8n{a>EdiZT54h_N3H2OpX9@^4lljU!a5|1|9L^8U{Kx_<5DQf3y=9v zC!$-kconp^ny(gD0)?%P49CK2e*tiqwb!@Em3LG`jm=;|@DtB_6#LkL;se`N8^^A6 zm9q$?@!z@d-Y&_qnA4*N?RJlBh%Xe8<>C(^hWM|1hqj9!dRp5q&L~oB7r%EkOMws2 zcF|F!*e=fVD7K3)ttQ*W-rqMd+r@=syLbcCi#ux~Z5MCLm2DUApw;S4e=oVu9(Khe zxVt6*xJ3(7G){xq=LM{vWQHvxaAf1f`LKKKG9DMUNy%ziJilMEEEtc2gwIz^Xq}H- z@z+jgeA`XDb+9T8pV*4bUM>0EWK>WmzOY8MD6j%QIgO zvp8^2v&1Zh@+(NnJ&eH_B+EbmY<0c+-lX4=2Ao`zgkWal!@cy-f8x9fA8y4Ms|5!+ z-}zXFFnr|8ag-m@hOZnO!}*TI+WDlToUSeq2kOuf(0z*T&b-J8lc9^<88&g2Tt zb9_Q0jz1v^qbAGB2qyt-v@J*`rEdjnkOiETZFXf22EKBg~EAEdUQ)Dt$l2 zqEmi@&6ufmPG@p2=ci`rjLEDyW9o=;&~uE)6UAOW*5C4v7ygnyB2f0!iRFhG@q^Qpf;JW#q%)M3=fw&P!@-**are{JaZdi8rb zc0`C9yB(Fkc8o_(jAb#+IDQJOlkwuC8Zu`X&hg{Se?^%ZS0Wme@kVI#!x(2T_8{h^ zF}5>eNMK0=GJ_wN>^4$p8fx{mv2FS7=W@_MDDEB^i!>yUM?cgXNapRp=|3gTJu7}O zx(UNF>7|&!@in37_(JRdZ9<6Z!E%%BVJe|?g^H5Y%}mkm>AugbeJmbZ@GrOui9>5z zYlICIf9Hvb=78k?SZd{O#Zt*L6DZF;sfsp}EUpUn_w^>~&+ns)(Z@iI+$~v_TLH!V zI22zAre)8_(F|+GHc0{(!xhvygv3vtMcqX^FPY=FbH1in2VZVQXM2##c{+VfAP)F} z1Le(Hv>;34y3*~90j+%=5OFy&i~DEblAmMkf4U?eiSNtd&4#g~w9WzI*?uZ)$(zti z)RG{3B&CQ4iZ4j3S0j2X2++C~$_#@LAIZ^cn27=xDG4!23{7!a&Lw<`{k0MF4*TgM zPzJwlX(RrQY9o?ySXJ$>4Z?o=MmCRKX*VYxNu;Y(P#WV*&sPZJq{uuWEG!fYm=bEc ze+HCq%Hcpp24%ERGY*e@Kn3mgo5 z-5BDST9Id#KXyC+mje^*ShwJTw2d4avRg3IK&@B+asVBhP$i5*L)Y$s&MRU$sgh!% zj%?>NSf#2!ZO)3(cK!mBMKi|eHL?~me@n@FlODy#8>V7TC?gFR6ZF~rm*Y={@h6G9 z`v%9qo4d`e=BI1 zcHT=o(-<4ZH^-NQ+VeOt*g)lF;4mMpLHH)DL%IZdGjSul*yqhfDunIwS# zi&@i3a{KR%SPyP)?Qe>%csI&AAB@8x^m}0yMdX|eozbWkiqDN^f|pz(mXBuoU4MLd zd^FSVUz92mPcXY1V-{K5-WJaUGpt;4 z0C>)0!YJ~)#jnq^vw&%&>fRn6e_BY4Uj*_jHEQ%9nBTOPOROKt($Q7CF-0Yw$4VuM zji{fxa^z*pqUHx6A5$q4f6h5jXezA;31Zcz5^l-XYohy`JP^LVS=ZrtfdAB>CTYh% z$!9x;=G-oCOgf6s^inn^rE4WAkYZiOyuIo$2Kj3kVaCJk>co5DO+HyMeN#g4hxR}C zyXODz{yVDuU)#F>AHHo4_W%3kZT1h$|IFjKKGj7B!2jx=unIpPfBvF>1H-3#thwbe zqp7sUe?L)AOrZy!K*5NKsklVGCFWJR{IQ@{B|jEKPqV4?PsViTX-M0}=SJXJz~E7C zjN&zX9v`PsrNLt(LZrd$5n(KN#|V-JN5iGTcPqzcwN#JPnx1@F=IP-hLU?+>h!CFc z9^POAH8?2PpqOzufAfya#Zzpi(p@CXY{EDLa^ou=wq(m^Ez6F=! z&uISsa@zVE)dbJq1OA!A&L=%oKHc+`!lwf`;c>>N|Gk#@e{>(hiD#P%t3H3N%BrDJ zIYaq1Gn8LvUfUMG-WJZU{_YX_sT%WHK0nAet1(W4aXLYfzLKFvOa@{!OV^u({GY8 z9@9N|9(=`@@Z5-a8-*>oJ$dff4>3&#GIl9Mvc3`tf_Ywe3?7_<$(tu_Tr!$D0uyFb*%xksH&1d@X5WSDkL$)wc zFqE6|D?`$eZb2kzzaS*hEv=_F!_lU0K^#3R<7hkL2osL=0VKWFEd)uJT{52`>9t{z zNGk6Ke|ngwuftPdw0R25^|syxNf9WTBcmvze^YA|4echQD4(Hd>@Y%6esEnU zq&6!QL8f7?&m)1}@Tfjt!w3!!6IsTOJuFz^=Ok@xGyzcp0^;}h4S99DTgMIj$M(}M z{`>Z&3$5EP*z2F29$c*b?_L$Qa{DKzH$^*de@GU8?y5?FxX(iZ-oZ}b7mn|g%Um7( zQ&@Y^^%jfxTCf%0XH1UtRkfBEhss(DhRl$6l>AU-NBK`W%Uwg|Go{x3b`ev9{n|fc zr^X@b(&b9WcMz&s&mD)VG4}qc>*H6`xgMU?cE=V*p|Ssx4&rBBlwMoM2MmR;n^>&A ze<^4mjsSugk<0j5Bj- zz_eBV&*_A_J8b_wZal@@g+cgz&9U;qm?P~rqn+2+<*alXv+!%3GdHKGMe9n&(gvGx zRE#r`V|Ei?qlxL=SYEWq2nu*7j_+(+e_4qaBw`Yp-0BV@_xG^#6@hGQOYb@@eq~Wl z@`m7j0u*bV<~;d+t5)oVDs>`tsk841*adxdThUeZR)q`E9iOqUa#J-e+AoTc4FvbWv+HJy&IysV>I^cO4nsLXxqwdoRE|yCgYvEt`Ucp z5||7OVCVP42Vw%eOjkJuuDv&KPniba%Wit26TX?_Y!83_l*LOfOX8f3{!Of?M2|?dK#)ZH+O3=^@Q$*HyBuuOigKZ7N#% z6|c+3q&1!NERQg6;2u`35pv8(|AgJUK@emBe(SRq0-`uTR0A=G&LIpw{(U2SJI+Wq zP~6LTu%Mr7vhzo+?%&6tnuoaX{T|ElqMd*0NdEgBG!yw7v(l~nF7fp5e}GB3(7_*@ zm~G2SN5uf>{RL=jBJao=;9wq58U#kQQjjdG)5t_&A34D7$Hv})#*qHKm_>lg7N00( z1`WD8X8TZb%9)8C*BM1wiLNA07%O3@fXj*=)3$?0$rmu0)@mo3HWv@b-<$w*S&c4; zk`H~js@c_1S~XB+0-8e*e`-L3{2xeF3|WjwY||%rhqVQyca62EQ9FMO!Moj_R+EcP z$v$q6-;urDZkkYyw@5t-t?sOLb|FWL86WMYT(4a!#~>})dtARx67-r1`n=qp=F8*v zun#d%x3j0UXas!6Y2lk{`o?FcUSNo>U+k?iwJPTa=fm~E+Q|3;e-ZT=&5{(RN70PP zTMt;jb8=VKt9gY$;oZNEi-e~uvC0l>gJnfToh{B9t^*qM_k9d^2PMXX(_L{IBXv?sz=_W0#i zcA&Hyn6n~V+-1hWq6vU__JgoP(j4*2hw+d!!y8DlR>tCRtg~_88`AXT3!t1;h2?w> zy*KJauRoO*JS>fjwRoc%SO@39s?0+!JEH3k=d9e@X0z zZOwqT0^b+fJlPEA12~5Bboy{Geb^ttNs_TXAmpeIgE0PhKeTcgwz3mZo`y|{x0+O( zKk^=_#;)K0Iq`2tyc z%?aA+O|OU+Kb9$3s&BWV;B80@^8b5G!Mh8?F458d+5v!6j5G@kOmhf}Qg6pJ_S2Y< zCxcRFNAbSnlC&ZYB(V+HV_M*6(fAvAmUbZfTKa7@*&3KuKYIXkZ6#0fuwXr*%36M? zvX(VKf4O^X^KPrd09ha0=3t7bd^^?BUr|Q?#r@Qt{{Ps|`~Bs9Jd?uudEx)3pZk=4 zQjmUf$kWN-yjP{4bo4R9o!s|%fW@9-w*+;DM!(DAz^%8mNWuhdz{&*2x%TQCJ>U(N zAG$l`QxnhX$zh0+vhmg8O9s&G>adM@&<1S4e}R;+LnNi5Mn+0x7rAsRLZ;?74~4b5 zuuWJW3_|jscNnZ4!eN~hd}Gc#5wK1Oht)fxS%!6cQY5V3p8I#O_GlYcUpp0&<8L!q z?@kJX_08ZLTi=d=wXZP@)*QWp*UMYMI^bWzI%j5^uv&tUjF4en+c^x@v+=?Ezerf; zf5(NvIx9=T>!Y0`VO`Yl?_k|}Pn)pb7lh>Lw-~JVcWw@abwcos*>6SSwR0G(VvK^< zE1->VSnK}&cd#b64eKVO3dzrJGFUfv3WN34;2YjIBk|fP3|4cdg4f48MZ%i;FJYZs z&?c-MgOFS!!}?{%Fd8@=r@oOC3G0|He_^n$)+%^?sAD7zEcol+!Ro!cO;~3JAzAqb zgEclB)^Wi%X1x&s>$8?HSl3;n;I-Tw3G0rtZNtj;qO|UXZb-?RHy`8HpmphXw2mDO z?SewvZXE`>@~4xDH(nL(MoV4s!wIO~=E1VJSmZo;_3-;3{B1O?tNKt~%?=Z4C!= zyGyVkjJ3L};)StwBje{AO`FTzVtSyrF!s%n-Q>rc1D%AiThzyE13J(dtl3rbFaJu5 zH^2tE^|rze7&>}TfhF*%&Eu+b@U9#T#Llm1BppyY!fYyeM!u7=pw2Nt*AyRi^@e#C#Z_bR?%!1W z(?w9U8;*4Mx{sZAd*l4=V;I!uuMa1dg-RPky+zHr&ZMH|d}q6&=9&2499IG$IuMsz ze9D(y8?n!oWG$uH zG%8ef`abQ9)st-X z%+Xs-YqtfiWVy!se?Z3vNdoW(#KPWCVh$~t(-UX#wbYlQq+S0fIRskpb_{Y4La3~L zs1S-tK#4lRY?tY3`Zy9oUPpuwBJoq`$@Q8_tHoW-WNzFJJ`%5j4+1}#N~e15!djF; z7+Qq`CM>%MyG68_js-bXSmJY;@O5b{nsd})ODKvq{zzNOf07-h;#uuU9I*#`dy+@% zkOXZj9-LN~UFRBQ2f>7GY#2*|3EzZAX9s9cG)=~Kr+NcjK{nwR;`70tP(s;-@gScZ z{4w-`$nbh{tEq8pxYt)&z8)LCd#p0Xy29*A=Sg`){NiewPD&q~+r7c+J|1h+{b>{K z>u=pq2!+=5fA#38TQ&p#UuT9Ptveo1TjlRe%h1Ula57?UdsAt-HEo;!J1te!ncVBy zuRW$^l@wFu{#aHczv}b~VA@UYFlNY3hy8N;EYOe&-IY8q2E2W7VUx z)#5a24v*}pVv1VPi7JkDl`BT56-{*eS`M?CjCE<=!ffCC?*5;lc->`^jN5NpXh(}@ zQCEUwf5K$R^E!aUq8|p_>voc#psD#fx0vGg)>yME=U@4i){%YO8HcO2UD_&DAr<~G zMkQRLIRA^VCfHU!I1OET_{BN6!eeY9b#*gsHbT4EK2yo{7|a8jcsbYvu5w$_H7r$| zBm0=Ee_{3kS0CP04a*Y0TiPYg9uq?KRn8M0e;0HEYxSmh;*SHSW$!2?+z$FltMUu* zTxO=x?=iU_!Y3qsd|EaSo&+n=554X4PsjRtrT!+h{?TJ)h4FG}POx;lz|EtwLBX=M zN?CHS>>Z^{A1r%XDXZ5gWdIS(Z5dG`*6a_dxgBbhFE)pi+d|6U4=EpnEfFzd%~K&Y zf1T7X9$lc6wX|T_cr3d|DLVmWWki2adYw{=^ixK}2c?-x>1IZHWkh*tJ|N6(KzSdA zQQj;6SIX-XPI*W)_l#1B#&2k0B!{%7>L?G7U<+q?Q@D<@*}$ldw}-DKomqoJYYIJ6 zG1(L9DegwlQ{0U+@jud2b}D*G4d^K~f2QIcde+$fkwL0-Hx72iTi1eIcWnzK;z1Go z0D??oYs$wXRlswGHjvtqv%ZneY~L%Pk7 z{*oabnVU&k{PKk1%OJhP;#FE2F*iRA(-vxJ$lOf0Lh4K{6`7k!R!F@{OGW0kdHIWg zEm5kjXR@Y#*(g9OpV{IcxPG`QU)DTyehcpS=M0`RymO{{N4e`WJBZ`3BF zzc-HuVy{+6|4Mey*`^??cY<`?gc>L0*@%?hM3Xs5KYk-J0{;#pB{0itA(F7s_eVDW ze#nU{X`=m*Tk|M##NCV|Shgmg+pJ2``|;xmmqfIX0z{RUk-}T zFEv4#)kD1EY`mT(aQvQRe-N*l2>VGFRExK3X>u@aT~IjgG4&L$LBSXlum1`cuewlt ztXJ{6c!icGD7sKwpruVx3_|fbEfoXd=t411ON~={3dQq%-x`GCk~l(Kle#K68^MTc z2;z?$EkXW>!ei|7X!X~5pkn0~6Us%-Hm|K>e7)8TcdvsHyt`V?0c-(Ye{=&IuG9;=GkVXKOkuvLXE^D|gh*gf-mT~+`n zdu1-wu&khztSOux87&L0MZtR!;sB{??7Aa)iC`dvVjG%GL z`3jyiEEYf)*A^Cse^l!RIxu6_4M84rvP;oit8!2Tts8>F`)0ao-q02l%&@Ud_IGzF zxOfwAHSzjEzH%#9S)&;?;Q1ahY;=%e!-*I6&<{vA-jsL&zQY?CHq6ixwBsKLlZ^a3 ztxBh-7-QBIdsn2#*(bIZO9!!+}FMbxoiw!@+u+gwA z4Jvl#e&UMZt0NssBd=`1X8LK+_+JcB`lckgSK;@=CsisGWd99hrIJ- z5X7&44oK&Pf(XWKWSYW?~b;vHTz?;J5=k%Hu;mE)M~906@CNi0sNFb z?i7qP4`1uFqWqKw*Eja;)|v+Xk_Ltom~*zCg$cuBMH5DUo?qRinJ~7=^R?Fff9KaT z6NX+tF4oT6h_Ovh*6Z3}mv-}=`>mB7cFwljs#`Jsf0D&e{^(E4?)lk|Y6*O~42lCk zxbAj%i!?d2&yl;!eH2q?@T*T41WF2 zd*(sACpp~?;sIq%lTp?jqG2w*CyyPZ${Ic8Pl@QHg+&`wBe9fQ4JRb#orz7A*)k5H zLG{Rqf0G80b9sNGjjT<+bbA0r4lMsyqNtJKxeY~6h%F=HaF=dQ?cNqpm@T8&`((Oi z%+L%Oe079o$-vCJA+y1f@wRHo*v3`z9ZNc2&FcIP;z=!f3`cMPTp(JLQ}>V7_c@pV(*eKgEE@N z3uD>k*ZKs+ZMJVm4W*;K+1`TM$lIjsyo1V)eZ&Et)F58`JjNDzz~(I<%ablkHVw9r z<58EX4K-{u`<~Mj8F7uK7OnX;X+ATztC^a7E6l2Xt8Z;uP20f=KEwRBgua@?mL0xf&tP}SczRWSK2kQ;#1%~v08qzaE zRH9!Qz6=biMCDrA$>2KiPA$!6TqjP~Qr|PK6LYoHcf;0+xs9L^z0gx5+Wa##A|5JB z2cB}|eydyDw;*@D*P?Tz?_)Z9I?oC!e^QC9#y#8Sxwi!`c6!|H#HPJjD(+M5+ER3N?WY(;93yq4pX1SYAJf^AQLJw8^vJh20qZd^?+1yhVHwDwyX=z^vmF~awe`dP~ zs^Se{s(5cI`ptc+=(b)|^sHV~^pU-)=rO&j=*N24Et-KL_n$k4938@t$VK+1AUDF4 zpy-?^0Vir~sHrQ5CHu=jfRQ;(989OzVr4?0{ zR<1Het?h*^LH0#UM(i8r>UmrIe+k(K;D=c;Fx%=adLQf)4>0w`Ry}Vs+JD`{a2<=e z=4=U*>Y&HiJjL6YmH1xL!j z?+#tI&hKgF*y5X}?_}`C30~XB7^`oUTtKD!89&$i;xy|^6cz3lVtw(OP;4it6!^>( zF1EMPcTLC!1!_=izub!j<@ZJliY{C$dst8wyVUnzhZ=(yujwgJ@99;b-k|g*P_4>2 z5vXMIKo&CB2U+Ml+;Na*e{M%P3X2c4dI*xc-NxBwZb!2R$x}_hk`3gL{F`(pR2O~E zwpCxN)9b_6Pv8|J_}p#WP^Bdark;Z(37^@COA_AW>bWFoqh)}!SAHi>U6SZ2Cn8Q^ z{s07g#TTFg9?dZ(_ML!2aPxTl`$vWa{ICx`IHc>4_SnjN`4LFKTvQ`qGe^Y(J`x^yELMia#Coa^ zIG~@qO|8!ZAAkkAdayuTS{Ms-o=+GcSA`q!gN?KAf99nI|7IgEI6O7OpByVaBN)X$ZJ=N|U?Q9}hoV6)qjtp}RHTZ3_8- z{0Q-WeNVif_xRs|_<(e$wAG${z$xwKYa&2Ae~hTm1jPu#y%VqJe=MV*0ErXfK#46mr6v4SYAg85j1w;;m*4*$l*{%pYgjqVnIJp6D~u{!eaCXc75mW3T83%_Bqa6iaG=)!C25rGF%fF-eX4wrB#$Jt>&Y{wz%}Pp&{B zU5LeUsJbRrU3Z*bod>I%*6n`S{Zt{=4ww(r#N+t{QEo&5f{6g{QdBktMYei zl)6#TViWWsuMep5`hY60w}QN$`B#+JyFt1}pp+&`^}{D3)Ldkbezm%+jv!gRe}`mi zt319IW%YC%HB43?T1&Dzf=G24qsFttiBwTN#Ohr3y<)gVts<=RPihqo>3{|kk&9p= zYF&!imaYwfshmM#`aFm_vQ0Y1i#sE%70P%Z+%az@+XhYiO~TVP^DgVY3|h%Hg}$}eCMbj*k6(yTS)!}!*VfcHC^;@so# z_HBlcJ1xl-BS_Oyt5Yp=(*>^bDN+q#Y>Lmm0Q$#CABA+6KERu*fBiqlJyX|>@*mo} z)az?dm)Q;a-VViI1kVw!QCN+uzp)Ad56R(w75=>5zG{Kx{G+IbNTKuNUb0CaBm5tH zihjHsjlpa!4rz%sG?;BjJkvBAt`7|HQ79Myt^~R?mOd;`hkCO+7)$Sv@B5TkIzF}s zOFy?)XX&P2FqVE#fABt%POb`U_o8n-J8<<5JpcbJ-CpmI*QcT(BaXbPy${2dt8JHa z+O& z1TP!DWG|Dx>`%XzW9&DtERlY#i`cIXZ3!5^_a^r1Y-7JA``Pb|G>(2}U&4Opq7?yt z=U>f!Z%6w9{4O}me(yoE0sJmPTY);BxvJs_vZu6jYu1vv=SMR4G~!Onv&_`8j}t4| z(|&Hv<78i%f1B=7b2a!>OZowBja&V;T>aMQyO~n?OyB*W6z_bP2ntd$o9_SRBd0--1Hqy5l z67l;YwDABQ>UA5>SZ~25@Ab^OlTap}P;ER(T(KK{c5 z#BIl_f31+@O2l2q9iwqHZ3bC9CxwOu$zsOPjN#cJU;`s4qhVO$X-nx%`T$ixs=vwJ zQ(XELli1%orNd4sz_{#h1}=M#&usHOs&m<5oy%4Qjf(AR#yy(d@PKMJJQ4EwJ+d3B z*6DV3e3`7W#8mG=J9uz_oyNxR=jq=UA0jI-q{Ro*wts7BKd4krTfAPvVUB5^>Rk1_ zgaaJYc4%C+_;E;^L}}}T9Q6QF9)~!lKNsYvTUok|(mg?ragvf+qYy2-{eyI#0xa$Zp4zI2ClvQ3z*DN-ut2jL zZdLq)fq$pe1n+cUtKH(^DE8jaK zk0Z~;4WE$aI(;**WZ&B;zMbd{PF>sU4QSCr|#BfSEvyNFj!y1NKVPj?ZxE@o?D zu~aq*UOo=jV#QuuKk*iamlnx~@RGIUSOg2UIBr%Qq#XMW-5Aeqf=R3M&_fYvC+jY%%dntN)_2CA8huQ2(qeWbYRh<_^@ z);z8v!CMq3uT4bfrgfk@QxLT_`A8yp9v+Rnnz0I35LH(gunTSzxhG@-G8}F$KNBj5&rNjv=M*v`@-M*{Tcq!w;AzwE8wqF z@VuE`ZDKBl7U5cjqt3@8CeiWBB1GpGh|aHF%Ly3|_eZ-&Z5<1e2T!v6b$>!=5i+g& zGDPTQXscONW@AyB9#NaH;d&Nh&dQfu9DyY+a+32G!1?d7S*{Y5Qr~pEo`1yEen8Ew zNL6v4K)6>B_g|~H4|F5$q0J+U<=s5O{Q|`Of*|hw ztvc?LZYA7L55xU}zHtAf^@M`Bf1x#mcddeSGz|A&Xt)==_fbTgMfU6tli2c%&s9~SFC#x2Q;&1A7KN=F8yG$++~zGPJf_VG0`o%MW@^B zTZnEW%%_q$=Of(`iEb6BMB6_CjXxp`ti7)?>a=kDy=R_ z!N`6`1SCMe;Gp?lC4WFC9^b$g2O{MCH39(XGy0-Hh`-$#K?;0fBQI&Z^u5h;>lC+5 z5Lcu62SixSya;RK=fx(S4sG*@4p*ymNMdxL{C$z)>9#Hfz`IDky-6pb+C>I{D(@8vsj3>EWYSDLHPW+|QGzN8qIo#SoQPIR{g z?V|6tAAq<=B8EntkH(GGojhS{;oLJe8W^CC#T>{jWxrHE#o0-SXU471Mh%{t|V z%q7Yl##uX3A3+77vrZa7>KZ^@xf#|v*>z=}82NuT>vY@b1l7OSd0UWt`ouktDmX8O z%`|05N;ZAVtFh8nz~&_gaSF~gDO~N0^!a7HXQ)GLj(NA^GZeXz7~OJ;}U=(CDm zVBl(#^)_kGl3!$2CU(_KhoA#oE-+E4S#o|1|k@Oluvbl7|BnyRh#^g{HtcZ zrYk7 zQ$oN~S!xpc>+;&K5^eZR~%FxQ8o|T=}>XkpjqvBZ^3y%q& zm4BSzv7hhs*vCTZrShN2Nlx)lsa;-n4?4$RIn-)dc`fP@#aD>Wk=X$a4G5~#=#b_B zuF6v#(&tQ%(EWUaJY1d%9b51m^y?T4pfzoT>UqarsQ2Lr)(TBuiLNJ;k-~Zx_@M37Ph0?|;F*Zt}Pf%7-3Dk9GEEJnqloE9A0|E%Ug) zvR1o&Q2SAj8&Kf>(c{LxT?#2z$e+MOWVN_op-w)fb`l;7(N)jr|6z_ek1@*%bax4K zw>*uy9Q6B7vH7~tH}r+x67za=A1#-aby3J6z-8t_41Ong&X-3o#KhQ8C;vKMCVyog zpr}7Qu+EKfAiZ<>xTP3%XfOspDn`=}OsZ>JINP?GdNn*?A7x{(?6N^v4g+*+?$Ol&-}xTc7Q&8~Fu zM6CNL%TU0F+&WEN`DaFMrmx4 z=*OKdmX9;LM&ahzBWOUyZ9b?bx0$o;l}>=By1yTr@CQqCGO7-^`pX}`)1`P)3!997BP8V-rL~j6mbAPrj{2+uwoXH@baeZ$PYkVe67XVW6MD(heE=P79Q1l9< zXeR!-0RJS4C(Q0*Z%Lf*Ej+A&n+%M1d@s;mfd4pixD|oBxWIb8^e8o(57kWZaE$9g ztS1NmjEBlxab#HmCe5z1@Dp7LR2xeXr0GelmIkPS_Ot!}BpMQqrhj_Sdww9wH3I&| zx#F_xv|`&>sfw@ZpapyR>tRLNK%32KK3^AxcKH9R-xZN()9*=r^n0?Q-}@uge%q^0 z)9*#bem~Kp-?;r?@Z(G8O8A;~7W#T5%`Vr#!g*R8It$G*k+(EbarCU(+ewYi9opIQUP) z;FuH&$ESV4VHmUA+HWy1@8t7f*(K&JGOe5-cyFO_1Pf2VqGj!@%W@lB!43#f4bg#Wdg-B?*VDD-{; zJl||Gh0bZc!E-ypbD0Lu%~)_>5T0a$XMm*uRtSt?%>@epqRG_mqAtVqQ(u-_kVV%U z>D#(!faxVF!+*d@2n8ny3t2R9xJApqGN~+oT@|vt408+pMbL&Y_wiqR1O4mAp64G{ zdc<+-QRfp{o!ymv)!A}9Smz9XFLfII_TLXfP#73C$>z4Z22yog?SD4e`U=&!pEl5T$@2_V8t0$T z*xlX-CS@NX@4SlpLZO*Y>Q8rK?@F~+-!)wD+?D3JD+3ciilVCkIW3sZ4#YU5 zHoPo=K7Vxb#=CEDe^A#uNxeB?pS1bIKt)PoE*ra`SZtYeZH?5uTZiGa5 zYW0tTPrFe)LAwN~DBN1-@JZZ@_0{mhch}peY;%9?9|o!n=Hb@Xg=InARqzS`9R_pW zU1J8Ys_^oK)pD_WjL=+=G=$Kx5YVv@(6KPhvwslKv2dJcVV3V}&B=jd$X#Y1UAZeUq*#~?vzK(`2)yBxVK?qd`*TB(0kZLnvI^Tt!37fW+`?}yy` z93Zc9et=~<241Oik3~rPQ^>s1)QNSr>e7);PiY#wWx(?|_{}2MBUmf~ilKk_r0hNX zI)Bu5fgJK3zeKl|2ZDtCLNT{YY8v zH|`Jo7hvXembr;#-Wise$Su}IAmq?(t~QIntioGmWwx9&ccMme-|KkXf>3Y;*1P>X z9Pc2rstIMeEh?c`A7bzI%aS?EhH} zc$?lP>Di2HOYJ@hOr$W;I;7*(vwvX(bTwHoGs&N((4;!sv@%ifUK=M51B6uD(riLHBP>3BnI^!z-?p>vCBMW!OH`QV^|m*lBPU{i@EXonCexe-Z{;=3H&_BQqf8xvVZ=}6?AZR-E2HO#9Yksh;3xaJGhPCBi z`Lo)>|Ex20Uk&ywSkY%VJ;hm0j~xvJAl`~oF$`LY{QN6=<6Eb()z36E9DgZzvDnNy z^yA>fn_6Bw6r0(Ce#M+#ynnrAPer#ff)~=fSgl=#-wgOYCSUOvif=UE;G+Kw;YkU? zGv(aD!v*0vwcq!bTO*m@_Z_Jre&7EL>1XWs{eH-Nns%mX?L0p$q@BrU(@y;9+xetL zZRdkQA?@sJIg56lYdLK@OSN`p4hd}=Y}Iej|=w05eJL;e3ZpMOO=yPHqj&flBW zc0LZp+i%aNoxAjQC@#ZHrccZgy#JFv|65?l)n7k5fUJD;V^u3()nkdYPv$^H1COOU zrB90~$k)ji^>J}Q0gFg2sNq|pG2GuLg7lkXiA*Xkmw&}~DJ&>O7U_%1%Ab^C=_eMx z1EYpGLCLZ5;#U#wet)*=d(s8mSc!(!8YpC5ykO|T+ZcE|1b2;K$W{f&Z;UN{0j8Fq z6o#q6UV#VQDGAnv#n0*sKUxCLrnRB`;@{~2@jA>PdaI!xMf5&`KhWPa30LOEIW$9DQdWp1A zo#d!z!ccFR*N8wxi`x|c-*kw6`*t^aJFULwO2z-EW}D0s*RO!q%x+lD@M$nTJJOuo zMn2&5MEJ-Pc7N&WuM^QYS-Lb?9`!GsyahaM1uPNQFUR77H_GasX_NRo!TWf16zx7a z@&#{lL-v83;qH{?2s7I$y*kR~$xnL2T+`^k!iJb<_7M5}RI*lmDR20v-o`;IET~|8 zTv<=cA8sRXXg``5v*s}U!lFSxScl%mttIGT5o!dzG=ErawUt1(8bKdpt8wru=m@oH z+2r$xIrdzKw}CZ4Fo3%Xho$ipc+?>AJr<6~4`0xM`SB_OX7PW3$H_)K?j54yadEJX zr>-*M(Exsyw)fHt9-Z7KhR0h%KpzpT*2+NV&m506(*chIg9P0ag2=x4aZ?}s_~<`^ z`p=c;mVY0Am7?PDl3*LxUKz@doBHO*K|wC4;RCkn2>;v=$lw3FUTfD>g8a%eM`J+= zpmBf(M@?LH5Qlw@iQ3-A#I->nTvN|>Ol-V1WK7hCj)~L25z14|&+Bk}o!676(pB2^ z0f_rlfb=~!Yx@|RQ-Z+Ul6P*$X6|5>r#}2!aDV*ghK$YHQ;f|ZPdQ6_BWFdh*5`B2 zmYhe6jaU>)4Ok4tVM;g@JyF>CR~?X%x#t#zfq^Otp9r?GZc50oEH$FAk1;7R{LKpi z+ZwF$jwuB8RcDUBSDb)9P6I+RGGSl%Q=#zvDja{cf6)Q?D2D*K|3ARrGh`NoF(le`=mX7k$>V;*q;iv@s1^g_94KZHSAXf z>%HA_Zeh1-upf92z2wOkEsJ4k~8 z>NmY={+1gU(YtOlI201!qv04l`Aks%XMe!B&KQGHJuqldF&IT>WfD~kJ{@dh<76WS zL!j?-?5ordlbyC;rFTs}6WJMIK;j!hi0qWkM0WPYgKz&?2jtM@XUT&Reez%gjg|f? z24@A^SaJE8@nCZ3%!#LA!Y~*StaR+kXEezn|1#5tJ6Ew?B`tIHY=B zDza3y5-hpdd%V1&15+j z_Nuyv?hHM2nJRdevp}&JOP-gGS!)hErQ_L(wdMmfxmOj^+0YmzQi}A)h<^!cd;>^m z&h1{YKYaH@T9HmT;BQ8`cG~v1jfZ)Rg9Ghxwbb6s|D-+El-|rt!TW;zBNl+3nbnASn^j4U))B&dEJZ0Qy!1uT{dlFY;yLGm8L z7&q;*Wg41$pT{>-#ftPrCT6CXt(qyUl^w2&q{3uw!=d;k=V1rFdo`dOTYYEpDm-;^ zXPQY6?~H>#W64HEh7Yu8JpM~&(MX~w5pz-<(h?v=f?`p63<01p9;^5 zRLh%BWO%L^@N@Wd#DBMa^6BPRdgA$>asLH8zw)>`&TmdI;;$tCEb*7{(wXq-KiB*x zq?%lt3k?+Lp)&Kr`A_)Fr?5`WuXJQMugwfa99=YKfb=Qy{$)DwSS zU;JOd-}SZ=XE)BTNiyR3g{#gI&!zu5lW}gYIMp~eo`Dji6Mx*sc)0}NKu5ovpfqx8 z6XdKeI&X8F+n69vqHoLHQ55A|ime$Obaq`6SDgSwY9ed4Ru9I9w#rub@xIPn)m$C* z>Y^zv_L|*JX)7ZLM4z{>AN2AsRW|V6{FkiUlg*V4UjAL4d$N&| z@Tsn{0sds~!G9nDrS{4LTopR2u!B~66a0HfUb50`;%m0rYU<<#@Q5Gc;olv6&M^NR z+mt%@9A0uHNeyCGJk%quNH2lkhTH~sft>2?LPr9?3~h3McouTo{2Ba|AKe*PZj4>x zlWKO$dm>LLHr(yzYxdY`TI2?NpV9)A`TOJj0_@6f>VGCS^nwH98LH!D>lT5weRY(b ztKCOJ+aA#q;OvDaXyIYV3 z$g+tJ34cIC?-8PGHEr_yCd5)3Vkr@@6i@vNqN&H3L3ZzqHudy4>!8pAw}Qr>Bzy53 ztaOadM_S)9XSdpFcGx6~2;%`a$cm+DsSdHOo5rt`?la<^8c!ZVWZUgsio<(Nk|$QS zLp`G90@pw~zu?H7mby5`;hC1|kF-uaf`^ym@PD>kq|I|Bou0JfiI;nNgj)}RSsz%d z>lfg*Sht1NTyeOc_z~_Wish*$_aOPvUj^;|7r_$jAYP^Nj^Dd8%A|;kP;k7BeSe{|x9=Q$PYKnN9R4~rVAIiIFSqk^E%x$a}8MUx1nXQ{k`Ke+B$a^IrykBm9|S=_F_+3;yMqnhLBYPr0S3Uwsn^&ja4}a-+ zyxbot6=WcjSdc@k#xst+@UoFXKAvncWgpR4tk6p%`K7XV#`m1UMzoAQ{G0+bW9e76;ZRb5P{s(&J(gnn& z#LE7;#HBY7mzEHhUJbOcRxh-A7G`;_^eoJS=NbOXH4>ZM35>E4Zq9!`QaUb&sOcgm zo}Snz6JKs%;%O{|SJk^GiGPU`B%Q&sE(l>_0hyT2bIsPy^fCKO?=o)qq@ax3M`(uj zKz$e_zfhw$v12qe`Z1Go)3^4Ja(^~RIh_v|7^EFmx?(FZqI7-l!Y=A!@em5TI&V~i zgzp*ka+F8qxJ;GfzS9_OxAyRa%5it&pSfWi7o{>y|73%tThhN*Nq=Wu_J6jd8%NeZ zS2{7tgb*hAoz5f$slHNpk&jmEgiB8ATfp^@Z^moJ-hU!@;5lAtpEKtUlRH)ZU9j4B z&u52h4uGI?=G>a<`i$h;_z#+Uk#BGGkZ;fRly5fAU&95Q-E)!6a}i27o2Rq{{sm>+ zMcA&lJOle}&l$@-GJh=MbaIYn(@0)=KPc!f2@1N+|6qb9G9oDGzEaul3Qf=r)gGEu zwp)pR7KO20oyv9&z!ZfyrgQ(uc5}i7-BuTHogGr;1<$kgMKyoi6#H#QGMP0j5)cLmJ^?wZFR10uwCUEK~;M9S6 zSzOgyEMuJSf7BAbzp@82d9OmYrBe~exjytofV8SEwc?3x&z0~u58h_@@9#wfCi&+e zGsN3+h~TbbJp9b91=>Lg0WY9}0-cjCtQ=jlyBM#2?T}ZkqT8In@`6$aT#qbK+3K32 zXSf+M(8wqZ8Gjj{oD7Q3Kd^9QRX3yfOp~`)>AZY=Bn+8%g72S>3>h-BL$pStQzup{WvU!({4im8$%!*C)zI#a%El7=^ z86Lw_akWMHAX&NE`Z7MVsZ0#qv}_>qe{DUmxzln;{C^au_#NJ;t&unu`sWzb$g5Q~ z@&`?OY}X#1G^&yF!qmtyDwjQz0*t*^6|RdxN)cO?iRJkQ>H6h&isE~{59x}I$UF-z zzTX_2Wb8F0V+E42`L_5aS^hkd zv6BUup?_(jF1KjY^aWh)_4z<3khNyncPWY4Xr&;-AL%L2Ag0PirlQT2qWm&|x@r|l zTqFSYZNT4|a_MBshFf1&Ai;F3?@F>A^&+Ciep7%q*qDumLnsXf=ymHTxX>5 zjs|3;J4g4B$BTQ&_qwN?T4ju;o|b zY`Hm{Ei;HMK_c(c`SRkRK)&y?6%O!quU*ITaieQYw+ zMSmjsb@?xUW_A3ej*p3I9j^sN^0Of#`PX!13fX&euk2k;?CmD@zK_`ZE?azQmcNwP zdmd7#x*Vi%IZ5Gikiz9N{L^}s!da>mrUaKd3U<&a_gD%0^v2I-m{)4O!7{^tJ@=_*~)3tvq< zg>(glRzQVz)I-7ZzbU5|s$q9U`8dJ5egU08oz4RnHSse{PRZl|MMKOhF|E7`ZGW?` zTpWZgN-W9XJycKC;4@kQaqwHvjXEkXP`qlV}6rn!f8nB%xA zjH%tskBe3BH2D_5Q{FZ1vGg&QeWdG{V}k7o)SeFmmx&MLncSb}Ik-xsd!7?iYW$tS zRpOC^yaldbs2MXT&2>95KOz(WEKQC`GeVU|yO3*%y9ydELZGYJaf!kOo zY%nLSNu!%-++Q1(#6mU<&Sdl}b1IzM;`+e(E9E-Q-yih9I6s#-pA_E*&T}8saXx?G z|Kj{?ab6}qkgwr8W@g43}m}g%ftsG7)7Ft6v>CLliAlv z`d6JO>1Cok8*-#A8_w1Kr*z3k=$kI%mg#hvKHz`pa&GC;bIpaPuYa<*jXeKu5{ne! zUAe&Kz2mqTxP8@3=EYkK@URM}hXPl&7_f1VGPD9T~ ztE{H^allucJP~6^GAh4(a=v>v?bf3ojgWLvorc8h_yON7^UWdGj~DaFBbl z4!0*AVy{&au|reo+f;4#6wBm?+N<)zG% z$ZkOAoqsx=qwmHbSUZVtY|<7?I=rAu31yv~I_rFRR~NC)hLOIg8D=~S9wBZ zs|CPTOD7;p{qifuQd}k8&){>LxXPy~##*k+C)VLXDGQ!<8axM2JIzHm z6>}^OX(5GmQvDdCi!izSL9@yC8`T7|do{c;4!vXXdf>;UOOYSvB0m-*KTbq`9I5l; zG~mZy1K$fE4QdTS)lSHZMr3(pgS*qiO!aocz1uz zC4bbDtC)3f0{N4-np|-(QTQ;dp~{CC?+$r!67u22$cO#B_VJjKbgv9>XMSr`l3 z6+;o)qj;{iyUerVo{1{6qCh;^yFk2QcYmlrT%rra0lGkpGEdOtA#mdsT^;QeBjS0k8hZ9$GkD!-i%*R#YO>rZ4?|`hnzoS9O$ite29C^5)`4l|- z(0_-Aubtfs50hb2<>7xVH}LRVtNsHXjzYN@!o$s{=HbtgUBh|!x1b6#9)9-0Ab$^Q z(siIJUERRX&AuTjce}qmGp^p%J69h)HCH$P7r44&=YPo6<-<c@PQ5RT?C3U7)Wpk1E}Y-+t;_ zQ;~*SQ@Oa1Neo`zvY;WCtD32hJ#?7hjZSHff`wUuunt$3c#6SOP{J&tc=#Yo_rsmW zoF4OOPN^hNT(!qFzF4{mx^%#mUNfD?+fwo<=uWZcM(7TZx*zsu7~jNGhksH8Z{mwh zQ6_4|;c*D~!Nhy`65Ua&>Tg!OJ>5bc8PQ3Z{LB{g#p=45?O!5ZT_sKlJ|YB{Y7kt+ zOxFp7)V96omDTB)BVa&Jsl}B_NcH)Xp|@iJhV?PD7A+8{w?zyB)yH&*&&U$dk(DG! zU5wNb?rT)MyX_(5$-Gl1Pk%`_kY~KD=31age>*uNh-^`>Qx@hi4o%)AKc9pSJ&_co zFO{2F!0(O8jB)Nl9lX#|RrkPWrp0^oJgm*TY_?EJJ}Fa55gqO%e7^U#E@eD^hgt;b(KuombbsGo1(aH|-o$|QbP$~K?6_na-+{RmY`7ugsk(21RPGEjk3V|?tuo95` zu@27uEs1?W`VcyX^2Y|4&Omgh$>JhVs|vHyT!Y0`7Lyyebry`LYXy139z{U}6oRrh z7;_lDE&Ukvt!srEbAR4=ccOT0mQ_&d1rH{SbL3sPELGSr8n7{1vn<4kcV=}q74l0k zpq!x8RpgmX?oLl(iSFOuMgILudR-?Pm_dFlNmq0qQwbM6m=W$FM!0uTbOQB8aJ7Z` zWunZNjoDJx8A8HQ?vZ8Us{A`$@!56wa2g_(+!`d}3-iyCh<|f7D+FDUO2j+ohZ8Yh z-Zq~Rv1tC!B;v+j^g+ZQ+R)h~;i0gsYD*77zI5Q!ggh^dkcmjhbxX*nVqt!t)Wm2F zl8eG^loJ; zR(h`h*&&;J;BAt3UW!MZMDlJ}b3q9i$kfb~Gaz`%1x-vtKTA|ut`SqRA2-Hdlk>kxDmWR%2dCVvEc3Ilu`0e+D)2sEp#C=Ci? zi5f?sx}Og1uP_&Y2yDsOyAWQ(q!QvoFSX25lBCAD!udk*mL!#-8+icy0+o3sl>ooz z2q`N`;u8uJoYGU&4;23I?M80e1yswfK~}|i#3>aaAHyosVy$+i=iuE{&C}j}+p%j8 zq)^vj3V*iI%z`=4>7I^pty3Y0&kFOo+1FK3ie@WIjy#+6tvq}#J5rBZ&JW|E25F~$ zaL0;na#O{wD6T5OY}g}4#lpW36qF>4!J;LWLgEd<&0%;GC`(c>3%3bUC+hE9ExeBD zk!d5OCI&ODT^;}(^@SwY08m~Yh!;8!iY->qRDZ>Ci)m$ia{);y|6rl?dJD!t5)XC4 zNBJV`SC!(95=*lV;)H9f*!_$qVZ&kR)h~*_FisXo) z5{iVf95Z!M=%zQ1SwUsQKS*xACFuX9qZ?fdp877WaShUw2*0@ruLIqlZZ+woxKby@ zoqzae8j|8dB1O8HRLLadB`cm7iIp97isHXf&c~nY!oD5f0EtuOOWuK>$zk87)fk^0 zUALn7lMnN=0C2m1VW3(G$VT*bzkf~sAwGEa-zHseS%*PQVbQ~jCqTO>5>QmzI9r?i z^^Pvei2iNRJz#>~qjZl$YGr5rCY?}NsB@#<{l**}%Jy$T?{=K|vM4<| z#LJizNA8qy9afdcmPTnBI6tg6f+O#|?1aKrNSgm8jh=*ueTWL1G~I$-Re#q-=pdCa zfL(UN+DHCjJI%(UwKi6-@6qLs>=TNAgqC4ZC=d<<5XM*@Au!wsF#M<>09@_#d|b5= z5Kf>G0Md?rdY^}h-A)0Y0F*u0QcA}04BM zeSL$Doq^vFzV-)Glp}rO%My++^3feHkSpe=f>pe8q&w(}d2@zuQ8v!sXw%6txs&C4 zgE@cA8jA>t6J`;om@u@Sd!Wq|VXMA63c95F-62t0)kyvLT7OOtR^(t6?GGtG2+9*u z!YU9ps}+1cQ?DRStw4`KBwx3jw!|@(LaAo`oUKyQeXUT+=;3{$nhr)=uf7H*0r=O5 z(EzeYLGCAb^5amqMJ(jwVX7_?|xsCP;yBSB=^@qo7IMRO#stY zT9yBoVR~mq@PGb;-w2aBFGp}yYl8Zc`+*RzN2`K`|K=wg&tZ;^7#B0WDzYv60Ho~h z%js5z(dm|_fynozoF1&&fpC2o>Z1^N6O_)ag0$NvS(ABg!=e652B32RX3Rw`Uyugz z+{RXUYs?9Bo5MWTXBf+KwOjitJyehe@?34JoOgLJR)2_AMVMU=)Ty;E>zfhQiU(%k zJ_J|!45Pm)x*UjTVf$L`ES;{#B}Oj2XUIPu6RE|CTA(g>amn{v|Ibf14l z4hSIEHBRpn%z_<(25!xQJs92@*zqtfvUs!EKLRgsXQ3^d8X!|P%)W98%r#1LZh47& zjo*$(Re$|g0kuk;-pBQN9e|hVf?*R}tvlLorcl!bNl+2o8|r)?lRVoTd*HI zM$If@jxB)O@sP6gp=Kp;yaQ@>sSJ6?W4O!ND$w#BC&^l4IEftjgVHQWTd)hS`fb#O zD^E?b0hpGvD6Th(y=7wYSIDe&4+Vb6qGeQ%_#Rqp52?#h+K!l+?~u9#Sn6(dph54L zlz)Mj_9H*>UtTlBA?=bE{zQ;RDY5=E$}T_Wz&rYvxJSHx6=t}aGPnOZ92I0B-+`;qJGd~xe-xTZcZ201w!SnE+e=a=HL3l1X zcktZuv*B?&gZ>XcKX?4xlU}~YXK?#e|4)z-bN&%y!kBTbW+5jrsyW8QJz3Wn{C}P@ zO#QwUzNdWAMBh922_ssCF(4Te_dv>N<6o4iaSx`NLgQbQolX3UvS8eU(3n@~6zRAi z(S6lRZx4V78$fY)oYJ%;YmF>O*TfY|@x^#YHeNn_GkQ(BCJ8U)=c1!bX^8jQ1oWMB z=wz3Y+w6+SR;-mrTo*}2I46(`qJM4jpfz>2GZVY26Hoz^dZ+O6QGi4Xk&Nzp}rhw0s$n1w&U8mLz-zFTfBgC2PkU$2GK z(l)OU0Xpf@RHuY-sCeYF;-ru*9AKg}V7d&I$z)(SnK7Up z=7^bxRE7%xvG6-G-68qglf-mZ1Ji}@8`|YlF-EuGDM|7Oar%)wK{{arGSYas!=dA- z<`5eXPH`u!4zC8TnSVQQlYi5@B7KJ7#ZXMR<>kmd=t|-?CZOpw^(Rmelt%xTxDoVY zngWUr&)GTz@3l}k6AGiLb#9LnUk2VQo^52jKq)Yuro;5f<6BF6=kX1tXTjs%(q4Ex z=s(5m)cL&dRt$A~Lmcq;Ce*L(XuqB4A0ThNSW(J=jni=wc1S}|8Gn=pl>zI0v7T1l z|5P(X@)9w6y2j`u=)Ala_Dm|P1}skd!M+C{EiDvw(|W`p-#t!Pr4Nf za_7Gic-;Bd7;;-AFxO(_u86D!Ufkb=v=a1JmZmx*LoE-|X3G!I9XICcc>DH{GXm7I z?xX`+Pm#|Lwr+#g>3{H${9q}J|I&cqEdt`C+@=!EL{b4%PEUeZnq)dAmL`AYEu_IS zigxIlY4CVcGT)3biJ!ty`ZPv}?B9UHC~@zLF{X-JEhnXdj9CSw@z4@K(lsYJXwvC4Y;<)te9lFvMpV{*7yf zELH7K{9$8^Nl6(CRXvt{0J5a#o)_`27?W#;P`VA)6~BEQs3GOGU=SB8{>i}Yi3r>m z#W8bqK9pk~*%Frw7Q|H<@0JGT$2^r zS1TJOPhu0)<$uQQ!Oz~ryp1s?4HJvzN1A%dlLny^23te%h*o~}rzX6R-Pvv*QO8r% zz9`>|k%Xe4FS3vUER;qF-u@MW_wpy+L5A$VQ%NyXZ_oSe1(dfOEWJID{-Kg`{FdNA z4*Kp29nGb%W{HCQi8fYUy$1W6w-{tdPdHGJ=%B>upnojAMP<+FOr{vYx$SJgdF$;^ za4x*X7(*z@5IEae8ZG|=d!EGSwz;FE2LEEv5!|oFm{wW@@1)&Vdq>s_xu3W)1+g)J zo(8L0T>~VZcw_M_dHYcqN4cN4Kc&dpiBqARlq8hy;n&gioRhx~VDxRNUH&U(#Pdp! zQHt{$D>w4Lv-2~a?HL4Qg*w)(c@^8+}|7bJCw(+M8NFGm!jMT`7WCaIbe%<-U_0H@u;chHN8cgk0&!u2;P!3*@RwCQB#ou7(|K_q;CXe3ty3U zsma~pkH|jalx|O7jz@!(I!KLzRI#ovpH=)~u z4>7RkBMRDWxT?o#(Y;;X98347$AQ`xeM=O}wM{OgTo~~d<-a|O{DdESwM%}Heo6akLTy4QeFRbM^ejk|pN{Gc-DUQi zarXhbLBlcP8e=&jgkMg% zTq)3ZjDeP>A>h0ZReX;P;yb>Nynn|(VCXKh<&0b6?hqn70N(;T7O*?u%sf^M&)(!w z^70_o9n#1C)bNU4z=|Bw57^kq!wl_{4ja*qmbnnzlP3v798DO(fcyDrLBxYZE0zLI z=`(b(egLMF{92si-=B?>W%LK@Kx|+B;mh*CMnN0NR>HHGnHw z6<4IsM-DMyg2~`4rhd#@OMmJ|7Ruk_vrzt?6^=$xtFO)?9KBYHIC}V*FdQv?266Nx ze3b9YV>l{(hT&+=GpEK;>6ie+(d4`!j`nw{I2xU&;b>@HA2@pGJ-|^{u8N~YZy~h( zW}PLDa^4E!XvYmk94*l8ydWb}VFHaFc2ksz;tw9jID$f|oHRcIp?^JJ3=DDilt7>C zLHTjOKTEx#^RXbE6snH63NdE&4*8aMv8(P_z_n+Be-S3JL!bc+h&&uKwa8OgrvA9~ zc%?k$+nJhT@@gwuXn*ouPPe|IUDi_y2tgJQ#e6bY&lq-jlXDrCqj~SUX6u z`Fus-0>PVa7C3u@L#fB}rc#@|#*B9tK1cYk6f#>_7-gjZTR^10UjBb0PL5S1{M!79 z6Vy`2@ z&ealF3?|IrK8TIm5uykcqJAnw=?KxlG7&(EE%Sil*ARiRwz*mk*WO>1c~rpu^+j)h zX=g@^)|W_7v|DIH6Bd71vy}~Vp+(DJcOu^N`(BPP3Aye5$co%c^Onk6=uB!uoutcM-KU?JUJHuAhA^NpNzB8bI?;-ydr7`0~v2>iL z*rKS9dK1%MLs_!+I*@$w@2==lY?1}xjML*hJ3HIam z=^^V$qdgP@Uh{uaJ1@0BF}a-F@E=1zPyN=BpMo~L`e`w_^Pva-hOaofLH@0yX=6M_ zJ-r*&Wm5!kD{xXnMcxqP#oP}TXQ0H1Y>G9ly8x^4kc8POuZ^S=`0L3_fp3W!&92a+ z59kg>2WhL7xXOR0$X>G>M@fK`GCFgI(Bw97 zRsY5n)HWrh5sHE6@fHd~=Rsk_0bxu#S2=>Lm4O1_0-nbp$loBUD7DG_TUB3)a=B3csh8F1kdWzN*0gXtB zNtg@Zrr3YAfb${Qd*l`O`^ z=6D}HyV-KG+=GETUIgvhKZFtXZI#^jMUe7&m~ns2y~l}bzC^B>iFbcgu7N5h-2n0j z*k&-YO%!OQSZkWI>f6B%EareH3d4)@A)eg&+uwzX^?zY7~A+vD7J<`D$;F-`||s9f3-1XlHGrb7G$K+Nd9I{;eulJ_;B?~fp$F?cnutnk2E zW+SBR4)ER^(}m1{O=^@Ej!~iii%r_5g3jcBi~QcNb(<^bztOWC-d8;dNw$))B$#SQD(Hu#Y;z<_W1wo=2>9 zj7HJl2(4|bwz;Df#VaVQyYR{{_iz=nTSa~%NPZaV$>LEwAf=ey$xV@Ne_T_f%OBYk zxkSK)jr6gSas)U}$ozruCABcR3(|jkPVX|NSz?`z*AOFAyEhe2S^rn3#$Rdns}E^~9;ChbsCrWHn-486tU zMpB)_I}#M+A3-%9B7TG2?KZndc&9D%_g}Y+Ir3S`?j1#xc_IbrpppVAn~8t*)mFVC zJq^X|d!P?HGMkX~GG(WiYSbqGrp~c^)f&F&bn=HJ|_q0*aZ`A1MM*)D|JxsB!`RchYfwXa-h9Go)SG&aca_!pc4rypMm-H+k~EVc~tu zQ<=`Lmk)Fgz@|PrL5E%<{EhMlp~Gwx=8zvmCIJD@DKmY>Y{4i8>Zvkj!?FE2)&HAl2cSXOcPrYJ#Oa zRdHVkC9oir7mHG%rSgA~@Gs-xa`T6luXcBwc^d;sbmOS~Z7 z8fOx3O)`m&R7JdXBs}8|_pKSG?7D~fWW$aWE%N1QJ!s6XiwWNI?s*0`8lqR?Pi~_y zLJ>OmieJI-NRVFx0Yy9J3JBXdaYAmVTSg7;yxFYGU0RtAq4R%3@k=VRQZLiY%5=Ns z-VMiw{QxH4$#4(DhbAkz|Mw{9Y*fa$A)w{YGO-QIuP+JOe;c|L;yr&7Z7!%$IUBy~ zxvS7?eOP9L6^s0T#JvevQ&;*w9!R25h&NVow_?RH)&(qLRf;8=*w8{ts}xW~TU%-u zmr8<);ug^26>WcKrt5UEyH01OPNywu7ZR{+whB5G)TwA~^~SUnp~I#nzxRF5xmj4$ znfd;ozt1DN_uO;OJm!oie(se{RE#)qlLV{`Wh& ztpD_eYt|pfl=f(eGhyIQikHa?VZB+blwxO-Bf{7hZ`6Mgp=gKfh%oj#jtI~1V2%iu z5b24ro)+x1v*nm9Tf5uRB+lwD-qYW9w#V)OtJ>Du!}lWXX$X|wiy>{17d|wOFir^ zy~MwN_K0+e}?xz3pLa`rUv10}Mi;y~KB29mEi0;CwAcRQIrP zKU7nTP)^6{ih~3t_ZRWJdib!{U!cX}*(lZJ5AQ)~n z359=$sdmPKyVT}_q@TZGGBv*Vv^+2k+H`3jP(B9slf{+s zN=N)OWu|u8TAj5jdQRwuL-F~_f|>64#r8b=>V9T-(9CT{^-pm&3ACD^X9Cvz95BZR zBSN9+3=B^Ty1nN1W1&nEAOsx4JwjGkHiieUxA4Zo8 zxwyklyt}^sqr|AC7sG#H#4>fLSi%S@W4Gz)3@)>{7GunS)R(@AZ2?tg z7O9do(ud<)-1)O~1?B)-Yv8JZEQo=|X4jw^fo?0#c{m-M)qi&nD+TG;5z7#82i|Oo zWe5nz8%r#w!Kiu9d1){`77-BKE+e3zzlI>t^h^)MwwY7IHs7(CIkJRqS{r|gz82Pj z__bJz4t}7;nw34vW`!!~v_B;_Yk=^n#(j@2!*Nyv9QCV=pmMWY=?W4GHMUv0cC$?x z2t3TWr`_X|$n2nh50JuvV@SU=x4R=xnMLitcVZ=jgQTzs30it?-K}!gb_Uz#WRU$M1wunA2Y@Zz}F#9U@)41;-rY zUXsTSjk!~#-M%!anOdogvY<7?bqd=bU>S(LkCz%t1qq>iCGv@OEFzFN2G78Tek`av zcdtivrxs<9`UQ4v?ImrW!RGupMyn@aTLJ4wq`?YyM#uCfvQ9% zTmZ#^(2QSP-sIq%LySh7&m7G-09nDzKoX9jHYpH*mFHeR90T)+71AH0;l+CNB8YCr zjrb86`2nuS3?MbgB`Qv=09cIJNxo2VqJs%^AD5_uTR@;2riNNRk30(H8R1LP5C0B; zfoO4CcT>;8G-oi=NoarWjbFVv8X+1e{L$XgJ<99v<1oK$jx08hEAEoP#KUv3dcVSr z3cejctTT_Q22N%;0NT0&bPgRP$BimB;6_F_JfK?#K43Ryhom=Cg2t>YjswDTI5lyj zD$Gg;yBQQWsxr6Rzso6V)!|uaa@1Y7)DjW%gSP=lR{Bm4#i#b0aPWaFsKMr_-BR)S)(^UtEj+Y~gefmap z7{%h34b3g+QUM%y7%Gv2O0F%B4CrNe5`7JU3+koX5gso1+o$brKi3T(evkgj$B>Jw z4bybi3R7N%<)D8Vk5g1wJ~xO{g%8`!$~JR!jpa)^co2{cb0>Gm%xEQ=5PPF>A-c|b z&h-Yaj=XxU`o;OzZ>qO`3vRrAW|-Lf*3ay%;1_fpDVeD7ghcVUJLJ{reziR9dKqi^ z!q;8-qw&E)sOI0VDe2BXPj>5s-cCSLg9f!?gZfL4-Rys9(DqNTL9VB8h3*3SOMQ?1 z`W@DLk;3vV)*BCarMh2{9!_p?v;E|YsCz*&o|{G$A0~HiyjU8Cv;8B|rp7C7gS&@W ztlJ2kq_C)^5f!vF<>#)~!O638EC(2jI8pMBM}KMeaPRqNA5-<0qYao!xgvNr0{9Mf^y#$bcl7p=)v~=h;5a} zJnLVWaObv4^D%pu{6x-Q-YI{1cmB-{Lf=^QF*6HeS4idpvql)Zx>nG)NPE||x`m>0 z+*hc@eT72>eVKC`S;hcn`xP7E${|H$ml>0LeV~HJ>FU(i=(Vz}TLgV`gOJkNAf#Px5K`OWbJ9~s z+uV>=Dk=Yg6GKdjn@mY+!=F_OL2n6*5cHr^L&up*x@=!#ckNR^{e0Uu7~4mdL%Del zNr!)}`>_#PH!~VO=WUz-FGI5W53fSw=J>SjE=(N_b!&vSEqxVVVohs=rZqy-8hO(m zf~GZM(=?u@O`JtZ>IdKNu4!_6XzM#Pgc@WN#>Unf1-)IG@NWz?-V(T~mjP}m`UBL- zAcWhq1f!6wUiuf6f~;Atz{pcr(RF)RMGt@eNu{7{li|gdMuU*r0u{o#+&x{TkUptq z6^ofp*)c;3W{~1P!dM9SG3n`hfhA7DGyg+)N+jMNaeo4qssx@*sx zR<}=kHna9*cpJ3+1D^&Vs{XN?p-Kr2%J8!m+564-E=#)gKn)`;a`Va3wj%vt(7z_36v&DZ6-PQl?Rm2Ri{@Ymn zSsW|54HZ6-7%B?v zKz-sp8Yzd=@;A(!svh)Sx6Sb4Ytv89uv!ZGDyT?#7K~!ZgL|+jo%Z;9RJ(u5m5)Pt zM?tY2zFLKr=F(L-%EkDR#`iI63Mhh-2JVZ^(T)w5;N9Wd-p8!!b8F~%iJ-597r$V4 z8lJn7=T13<6?bBUH|*6F@ZQ^5@QJY?R^Y8wa1EHpW0-}p(BJTPE+TAfT3Bd<5xzA8 zn{E`+PXa7U5XvP0zj8=P)y{u;mmcv?LP|M)^JlE#>i4LIy|P%2L+}cG?4;GNishav zLXlNiK*&_qvZt-o7k69Pw=1v=o&1$5_7zA9*+k3=idHXYy=PwC6-{IWm1EZ^%UKmwnUI#|aZ+8o$JKpXV zMse>D9Nx0{!6?&mJs7Qdlir(dp=S28Tn9#Py)DD2g#oYH+6|1V-txfc$F~@a^4?}J z`r<8L7=>4I7$sLU2)7t7yO2;V!Hp&Zz z0aHH@{H;uwt4@n2j^@Zp$5-3i+`OSuzu)k(ioz~n&xvnhC)Pq|)j-RR!^A!e3ImFR zZaQhR2g-=U(PV#ls-sJ+{{pV)+)m_jq+nJUWH{m)fbYSCoV}3-Z&bq@Rna9I&Lec8 zm&$ASS{TT2EtZ zMnl7JY#>8A4M?oNP)?j*;@!W;MF41hr2T<1fEtHXy@G$~7S>=ukQ;TsS%FNwK#gq( zR`7-2V<#QikERo;Lak6Zak~Lx@YP*RX(c*jL?>*1nRN_6cBl-B7kRC_;Ch@hck?MlhG3K$04oq7(EXO~@vLkxOT<`6wr(i?S8cf%q6_B!=B_DD?e>x@Or zV@*p_52l3lGR7la+tR=<7(vNAM$Me1;d50n?+dK^nHy z2c&<^Px*l~;A4vbQ^m-uu=oNY|b1C&f{L<@y^wg^|NGGvg z>%F`ikoJ1j3)11QGLU}pDhKJWfAR%sMu``s2l{mdQq^PsHz4I}49QGtt&qeMG+Rz? zLM0yOWuPUsW(~v+T~nY^kn@Q2A+8By9Q}VH)Rpp1tUO)%OLO3{tn$@B65{3pbUmqG2%PBJ^|!$L^=>;8 zA*q)+i%Y9#@0CWEtUC=k%4ESo`$xJG4hu_s+C*o#Al0|(#F`J9HW5h%yB5B~Nw?S)Bd&OS&r z?~|_nfadIkeL`WaRR04S53U4S!!m!OON88NIy4uwkYLbLCIc{?IJ`KSc7Dnp1zN{u z;2`!jlC3}&^MVMuUdD$o>bbcT_XzmdR>}?;mmoI-HDVY|%!9B_>ghNg45iBrFTiDp z&$A4CrZT}>qG=ylWbi8yqKf9cyMRU@pTp;@AG^$u)ATv$Xvnoz z^)U*`+T*X_d*KyX1M%6%@cn;u2fTsy7gT>-A&{K#G4w+Pq+(f6yOhiL<)3~=vYDv; zfi#tt>_E$KXqZF#Ap-e9xcX~IU)ck4x42Y|LRt$VcM&f9u80%o4>Ae*d+ZDoa5<}r zwOPc*twTfdxdkQN#Y0#fnq)3m@+Jr~I|;KDl38qJGA&`bjJV~2gff5lleiliwY&wc zmb{c9gaCQ>&3UW=zl@nzJR{9|tkn&#K88TN{V|k;0K`cM7Bv0TJEsS7H1-8@h>FTr zF(i%(BuIh)X?G3`aj7q`rIFwn6dP8zdHiGbG zysCd5uKN2tT7{34Lb87wy67=q`=|2{GOdiml3(N{quj%sldcaBwTn|ks`~peh}3$HRJ)XYa~sHo@Tkf$h*T6-E)~wTgu(?&sgE;8ov^4N>u=Z<*jLz6 zYC82uwt)};mDGQM5_NSOne6Pyfb=bBvWs~fdLX{w)iA=Tz7%jDY8K1jmCSkqJrM!? znS(U&~qP5_9V~Z}uUH!5)8-K%O>a3nz&{AChPa@Fxk( zcsUR7_Z=sRZ)K9W7atvmM_B%F*=XDw`Rz-80N4-3tJ9!=y7~eEz{8d-4JMVqL(x>{ zV=gD4Q@w7*GB@WDF%T`_3+Mj`pHB~9to+C4;O2gI6Ln^kN&&quK_8_30_eK{h#UPG z5FvKTqtt&jOD_N;z9799t-wUayiY+_USRzO4{N0SXey36RNMcLXhd~D7V71MnykTy zYlJA~Ifbki#6YUa<+=wFl3YS~HDo9z;6s-5O4mRH{^aM0LnEP7Wa;p&a(D~=rzM<1 z_MBRdU}r_bthte+K0zY(tTq+MpdUt{H;n_`B0PU;VgcvQ^~9YK^Jo1qf0Z>Fo9UvK z|7AL!K4Q8cH^3!5v6FN|06diACd6<3BMQjAR{1>>_Sz+M`zg3|#f`MEi*^UkA4F6@ zK=&hs#f%iX0DTwyf7f;SKe2ws>^;1nWP+6NkeBNl9^zb|sUJW3svqwH%ACh!^`o*2 z^#gx7>j)d<`m3ydJR_?gf08l&6leFt8BY(w*@SuC<=I%8tBcW3sQg19gO*L<_?TwdA-z<$EIDO&(Wm9jtsk+ zxOoUNY?wI^v$x_r$6Du#LymumbNq711GjY~70CL96?5H!T1x2exhPrnFP!uw)tSh! zmRgEaxMJcsrP8?bjL&P^M#>t=&7_h1eoz}e2v?sS$r*hMG5Qu6kJuB}V9qzjlA(VC zdO-sWpik#^sW1EK=b@yZhmn4M%l7W{YkI{jL0X>mx8tEc*Iwl8*+C(m{vPZCj{r0fP!5776hI8zf2(CsZ zxSNoUERrl0~of)+kwU5UW480|5Ug&g$RV1~)r!C#C6vkF>B*&K%77G*OM) z`M6B^zoYM<>?mag{u#5~%?sRvlZ_ZIJKh!60F3L+yVI)rKw)l$^sQUVo_@`PjhLPO3#AZG4HR-l| zk{c)|E>X7uhr`AhYdzH$O51uJB#oP$(3e{V-3yfOIzR63pDjC>ItgF#53 zR9H?zg3E?U^S!cR^n5NGy2fl9$83WSX3uwn*~2ns=Wxu1c~+E3SATzEJHToW*VTW< z>BFnE@y1`{w@}{02*Df@8vCJe{|3^YF%liK?CI(2g1u1~g^@@Sl zr*H#a5)yZ_%;m}K18f-!5Vs?g55qeS_RbSia9LntOg5AZFJKQR)ZyPGQkXBuAbv~1 zCJ1fYkV!4CA}K+|XZ3$K(DF(;RwuO@cyv;oYZh^Sc+k447l0Pp)|%Cyi3&7RF-ehD z0*WkJ zG_AnWNQ)9S5QJp`BIplaTYemo<%iI%{P3}V#Wo-|&EiSuo!)=ug2Y+`aI$)ch$Ci} zc#p@{N*Y{Rp`lUIUMI+}quB`5L`V*CZbQ>-|6-I|a=7(t$(M?4H!5G=*!I85m#*h4 zAWTr{s6%1GCMT!RhCyVBvgak7&^$wv6sC7epByFmQiHU*=O~viV}ZIXbBH7c$a99( zXt+5C^J8Zs8n=HzJ2T6(_S=vuvw9%$x`z8tDJ(P(NqL4(zsVOw7s%=OHa@$cJd@=- zqN&EG0P8dO-BmdAsU;D_9%9=I6x>w zp2DZXizP;MDVU1Mw+y8DS2@lNDwq#VIxzNBP}5Ujo{)duY7)ZFWKE&=LkZ5AWbO{H z&5CF=!E6F43oanL0sU)Wa-*#ppi)pNu7mj2{#&56?C+2@?-y z54R3w?i4GlnTYJMn%TLW-*Wv59edE~rM?41g;e*~Hn(*0uVha~Te@`kuV}|gCq?e9 zo0&~(ULJqxarC@>bDJBRfhF9Ut0HHT*`Nz&tu{dCxK`3UbO3!5SV?LK&L>eCU&fZ5 zBKe$JioQc7@RcfL2f;hoOip_)gywmv>WjJbJ;)hz=O&hRn5u3P(hebWkydZUnx(40 z-bBtKfSBYqmkMhja{_|qHRd-o)t`@3{l(9s5^#SG*n8bI_`#rLA6?8N$ILp99AncQ z(9z2{kr1_{yp&-QLhLBiVl^P&R_lmxq~y6M*|syL1r&4FTpxRv(Zfw;UmFm7AI7@4%^+lLVtrHWV`58vKr>N7QIH_cM%x>lmFKir?b z>p;h(hE3Ftw95^QwvI#Mah!=ALk9@ySUxipYG3J3WvRDqq@|@)^>drp#bLgp)Zl+1 ztfEy|<#PP;=NmiFR;8>C0?+o9vVKZoC*tBl66R~?7G5L1?zQCYpKTrG?UJk4l(%ba z*OIsSX?%+q^VH)DC!wHX=|F%DlE!_*Jt$F}m~>7&cwQ)4FeuW!@4=*`B%@f?>=KI| z(g+JXzI7e(Va#~~ z)3eu-w;ys>HgQOY4o#_rUwA#`dq_JAO@DMyMxNcG5t4tT8>lu_zuAeMz$m zX@mF%cD{3HK}nbKk!cm1_h$t5C-b+3KE3^r+@}rHr?<#`+Qj>`v~!={`ychG`YYFkc%l|DLcW0(3U8BM;xXtm6T*R1n(j134fMw*=+~1DF=j=z~R~@hnW;)qmEDWeSM%Wf-Rq5`#v@+=MZU_XMpPF=E;xTVAOmyCbtcI#g1&!x<|S;Zce zJKs}qMPmRKRD*f8vu9;aJkSx}oP(9TSym-9XfvCnOEYJa@L>)Shn-90{I`12r455n{M1wOKcE<%ypCMk%Aq=kpsB1&|#`tQa9nzW-}| zAWMivey$7x#2$`e-r5;i#G{S)LJIu_#Lh>={)Od0#NOjYY%C%6b`N4FAYuozc@LI% z^HUtK1?vc~E5BmjX?pT{faUW+j49?h`5_;VZAd8h^&x+-dwmEF(v%PFYdPi87YAwH zXU7iu`$0bM8;PG@`y};=$)17HNKY$B&F^bE=oA9DpGZb@nKeZ`B7Jp`4EAU{tYG-W z{(3T-E%HaQauNrI$Eo|1Li{@6mCsH%JO4<2;xmf<=Oi~SlO{`>?z%sEIq zBe9eR5wCxteCkMWy?-tHV)YX$URT#c1hw*ix8h7FYTpwc#Nr+fNfAf$5HdQFz44$c zie9*2_CWTa4`es~+XLAgfGk?x4pJAv?88og#VJdixHgo4OE{KcyP)Lj8{@NA?(*TY zzueV5pM4+1Y|F3PW<-0C0+1aJd5cX{IEl2c-8XoURAK+{Z$^`XZi5b=*H5>$b(yoV&lzBAjeYXd?Ky8Bo9a<4e#eO$x47X zmz{5VM)vPtuw|{NNBGEYkw82O#y6 z^vf@NTod-<@P$XQN{*Syhc#gzCJ%~YZf|?B$M=!*7CTQ zz5l>}ORvKXKJ=p01uUe`ugS_92R~}e`N7N&R)rg-HMqRk z!8Hi`3|o7k zb-c%)Q2pZ~E?&2>wZ6UR;fa6FpU71B${uJ2!!s~Q2)*$S_C~2Qg}qVk`WiGL?Bq3% zkSlgM<`r_svv=W&tR8?W+(e9CI@K#wY}X{*L>*)|%~`!j?P-VcrVZ1f)|;8>@s0gV zH;P__>wW4!uE3=XW))T^FXhhvn}5&tszrSQ69Qo~I^Y%!p-g>q^kRPvc1tMsg!DXg zgNSQ9q0+V)q#rB@74+xfH%Z?hq@5#k(-F4Dn0g9Q&|%~ZSvXS4m;p8|BvwI|MYLER zga2pY|M!Capp;@|`!iQVC7j7*FvjgWsZH2B(N@wa_;!^f$Re$7!Wz&f0GEc^vyiD> z4zIT=0uWUT&Sf?zQOAGitX^>aLeK?LIOMr(18W3VCqDd*jMwTSnkp>UQF)aBn4_#2 zsi1Q^xam;YwZ=)t5mEigR1d!OQVMeiQ2#`VAzPrE>-7Lntzw>HeJQOkq?y?vL-ApH zB!k;MBh(Z#6<*0w%_A8{d27>WmnhGKM zh1_)kY`Mhl+z`OU<6xSZFwibwkF9p+B4U$-@a82l!ZFKazMwAT-pUXz16;98rI7Lc zE6(=);Em}1oi&W_|NWG8VbTIZcj;0#1%p}N54>~VSVBALh0SD~50856F&W{X1@RRh zyLgNmkDVjU`lNr^Egr+xOH<(z?W>@?o=3M0=pq^6%mF<06r`Zf#u+l2rofy!^(Z8T z+mcQqf;+T<8$S%CW7~Lo(TH;I|0;jZ|dD3)wDTJvDtqG063ten|ObNI75yPQ^6ba zpQ2f>Dh%GrFbnJL{(PCmH!=tZ>idbshEaAS#&9obLT6i z^ph=~;GLVFrr@1J4Puo+tiV_ry`*%?=2A;Za1rT^0^d0v08MnwBK}9aeznBFr&VW|v>@=752Xk2Id%YXEF^yc57#AX1pSZ9CXMSw=it8+&D6lT z&j7c*2snn~zsg``ecT|gsr2N*IBD{Y@kkaeEa_+;1_+t!&H4Sq$VLo*hJ^v=1h~ik z%GN9r>)}tzukZ)W#%aI-Q(&^!7hmX`hKhhHtZVu2gU|k4Yk)#hm{X>;2i z2@6xu2SbTtlQn{ZaUh|bkQTLJD7h-Uxh$Q-qqW3xPafyYMt4{Hd0=?;04NxwAvpLn zN{o81J5*g^?tjA@VhtZkp9J0j-c~gI-{F7l*Tx&eo6MC;I-F0NNC##WBvjEBE);`R zw2KSn;6G6q)FPLyl7{VNPFWVzduk=EeA|~EW5$2tVoQ}vFPdsQdYov_Kgt%vE6D%i zL6A61CyAvxc{YIg@MPRDDatxTK*`tL`V-iGieS8@6&(o(0cPA5QyOoc2T;D~Hplht}zWnHa=1;Ze(XRce9IB4~RQEl4 zU4JV7^-gY!P431PyZknfEw)8^7;b+en=+!Cg&i0}EhD;K*wL(zH~5xj-2__FmoVKg zNDp9USs2U0(>Ruib4k4~6}G<175?8n#8R>r2>Qbfw3J`X+yX*M(n%=?y*(vl>q5H5 z70Qq~i|D$Fdk=g~*;0-Jb*lF+#EE1BBit1A-JUO;`?_$ zz|82^B~ShD*2`qvd)Ljn!~Oez_N<$=NUy*R$NgCa$9;b-!@UgqnuiGX zjb7LzzkTR_)c67Q&+sWg{d`KunhBt9^nf1q@SEq655#d$HPp-4b;xG+3(r%Iqo2g) zOG-pJy0^KeVR1PNJFL@xm%My6WRh&R`10}v^Sa{Y3vcPj%eCn@2>CPb zvDVH_`0si7|H#kJ-s3_sq)?%d3dZUig`x_wZy7|# z%gwDydwx%=+L+(dr8J6m(>MaGL9CW8>_UGyG*;=y4U|soV#_U1wX__lO-?A*Bah5p zIr^*#IN5)JXX#eG>`)Da{*DARENmo~?HoNbYo)ii65uc1>a>4Irqu$B8^Fa3TsowG zZD2tguO^XwQqMrK6R-dZ7ojf`j|p?tQ-EtWpA_cVrJrUi6k-V-fCVGg07+u)xH@!M zN4I&q^q2M6UyyoCa?EDd&g7#)IOeQcc@vor`=Ws{rI-|rKklR5ym_Wd3ys3hDHK=` zp9_D<)#PfQd|8%vNe5YIt%;YjHP#-sN9_uilV_&FYN%R#DU1A8g5_6p4!Y*zMlZYT zey9?C6s@p`ZgqfJ#cF`@E1!Z2V989phEh8D+gy2&``O?thwt(+NP7862XQJ(Qa`_x zYt#0GH~ndQ_?teoEqZ8sQwQ2^AllCK&~|?V(e`4thl*&M2k0BVE}0W|0}?l_XJp9K z-GJ1cf#f|11QVz4n|);HT!W%e+H~fbb{^%>d6rTJFRXhjk2Na$m zllT_4c!MZ&`#4B7TAV=|Z$KJHL0&kAXdIqg=5n3#b2=tVwM-oYAXqJnL64}G{1`my+Q2WMo9UAwM$1GwHN)32(r3TF!IPADW zM~k<(0fLEU>A_L0?k^Zk*Jnh3#a7fFGVv8PQvjPjtdJ%`K6ozVe#OtTU%`nxABj7S zVi_TI_rOpI3L+cdh+zbN<8q zZ*#h~*PIRLwEu0+f4TpS?@#q;kP_1%ktYrE?CFtLln2Qx$~sz2ekGLDNFAz?J3>i~ z46x1uMyd0d*LJyx=Rhq1}a3>EQ2kqidb9*xDH0Bk)waEaTDI0a=K|x{H zCy@_|yl+r_2d0o(Gp|m`9ZoCdK@nsz3u?mw1)n8@f*7?7R3JVYY;t>w27)|Pvtwm{ z)Xm)YXV)aphIH*>+Xm}d1Sy;pvmhs2o+FK}_D+T=EE<}z7tx&9_LH84uNyLw zt?utvV?^|7;*#3oBsPH7A`lee(0sGaPLYmn7XvWL-5LsQmvMg&#mo~%dY%{CocLUU z&(q6Ik#=?>UV@f8jz)BI#21T4jV!`H9CiQUo^aGNFj%S+w1yD8XyrZ^SdE?Ww3S1c z8)9lkLJKbzwtPr~L7Sz3IkQL@>eFVn->S*X_JT}|W8wI=&@Wr{!}L;~-qazz&)qEj z-n;$NU*PFqc1V9e&(mk$vA2iw^$ye}zV zS~+nO?Op^Ew?LqnSaB}}aCD9Gh_BhilhiwL5{?_w)j9AAdfIwIXm@0qp8ii^VQX;! z7Ex&S-w*YSKztw{fm;Ik2YFs2(|lW8SlJUSUfKw~d_s zPN~?}lhi;gBbDM(I^vm>8*HZdit|DdWDX6vN!cVsS-_fK@FR)wl)*VdrP!yTv!__D za+a$X=1O-scPiLUIrTLN3Z_>!_3f{mnY#e#bf?d;apIIV8J?7ntKs>ezS4XHR ztMqO=o&|qoYw5A_;(k0+Px|tCvLE3tt3*$z!W25#Yy~ZHq375)|5DQC#d`Bg=7M3d zX5}fPXsjD#7U$OKX#ER1)l#QHZnIgbP~bx#=N5b(iit}h@jzeJ;J$dGFP`FyTBKwf zLT*50fjQ3n&(d&PBkr?IEtU=*!pEsC^a7ACbLW3KA|yxkj^}>lOQa3GI5jUJ{etuk zTHSO0j(Zn7Z}HWpGAN3IS^?DL?1lD@WV5rWgOdP@X9O#(LWfk>6+>Vt*)Fv3-1N^U{-Hy z(X4ba%=Z4nbuf!Qti5WLw2hr%b|Yd^hk$?7@C91{tO~I?5(XO|hH}6T!o*-mJfPvb zM`XaFX+wJWIr8cuz?NdTXo~uRfW>W(QonC-(}owYjUK>09>;gRW06u+1F-OWSD?uM{xXRt${#nt1J=-`+Cd2KayN z&qjZKyHv&YjXz)8ncqHb>cnrC)po&e@4t(&#XU0#I~Rv^#}?1brVML_+#tWz@q+gm z=sm~K?g|#zmvzH#nBPVnye_}J_t_iZw+m`+nBU&S;p@k5e}j2y*Zj6$2=Uvw2)$w! zN-@n&o|ORMa+o%KG@JP9T+E;9kY<0C5(6%i@eII{j`aSo`0cZ^y5P5&$36TObwEIL zNbL;1BSX;F65mZdgda}Uj+spqL{BhT{VD0XsoM23*q-Dq2K-G!x1AEUH#tRpGM4RI z{_~yke&v)9_8#t4u9QCN!D-P?6>RKA|1<9JaPLbBP7S3BP7U922K<;o*8hK!(2fya zob?#Rm6ugNtopGSR`p9Utm-3J6STL}FYcdCt;F2&g{nMXh&C-rKrldnw&>-u2 z7NfWBTAE05Rn zu50S+6JwaZK0Ai#>+9LC_IQlHK0ROt*RyB%r>FDu*E^)2=jna!^iQ91Crf{!LwXZW zpK`3DzW!9Kuf9HytG#`W`ReP6WB&TOeP%cMdYwVm*S|S>9ev$TD_o_>4n~tY8$XwT ze)%y~cs}h{SSa@ydy0jBQl~HkJ_powNADIb(K|2=B>7Kd7X6aUqF?74#}7w{&`UE@ zaofUSxXZjR@+i$G%vhLNx~N6Lmj?GBL&qD#%$RXFj30(pON;spUNN}sE(~a_eqjb* zOAkVm_AYvae*IA)cQ8?gLS6gJ5ha_k#7f_=Nb|<9Sl2Kgs#6Mo$xWW!2&qSuitfnG zm);t?r?(fj`Z&bo!;P2Tf@OMBvU$WP|d{$JL4O(Z7p9YQra!Cla;sZO2OK znXQc4-ePZ0*f*7^4JDdkIuE?-U?#4(7*1>`+y6O%#1@DvMr^|T3g%0rEuF&RI#o_3 z8O~{KGKs&mvq)-xK}2bdNNE_{P_6$OJLsQ{L^CJR_vSrT#_%@!P5G8RLV0-z3OUIl zVo^+zL+HrU$jM3Uik!;*$>|eLPLtrvO2F@^2}n(^5;eWxLru%KFdd+AJn1S**GC>| z8iu0RHJ+#`jl@2dFE`&@;q_}`AB6x2t?8!m|kW=|r5l%D1A6($uU@^bE5Dkica&d`Oq1o;#asR5*OXj;`SsE59{CkM zwS)Zn-E<%M_1vx9%CCu&nf%&vyRZDJntsFb>ql0=@TE~qetpM&hcBJtFTeg;`TxEA z+CR2y`SsgoKCc|xwfx#NmMHGzwCl*PX*t&*xtBJ7caUG>#&#vYaw`5u`So#+8b!*QqpGNIItxxbIA&_`FC2mr2jlh3uKk zFg*5uHX;LT=V=Dcl;H&|P5UGLdeetTGKG6VWLN2F+Hd{S5%_p|!3j(g^d+tcoRqhG zN+Y7)SO&`U&7HmJvDc!WoI(}u*m2$Q=Z`md=A-Y+{go&8*Yj-4+SfSf4f_L(*y`b=+1C9AGOhMT1aw#1c}sA=H{BBE@IECxdRZ0?(|}sdrrhA zh8#faSDL!uAT)89r-giP1G3_%yQ8{nV26LgTy?M0N=1qP{w(h6(fLqaa+O@IWCvLR z)YRYlre5mL+NEpCH&!f|epA?QT&u~D_rC6@ERsCHRle9w)5tMkA@ zBP*gygy$Wi!*5p`&drTtWxQBT1*(lBd%5~a?@@^rjATzyrQc77 z68$YLEJDPC?MIbMU&8zQ6-tF-l*1B#7K1LRmH{yesDwo`&e2>u)b8p>-ZQRXvOl}j z#EHB5Lf7S|L;0hz{7$d1{;@q0HdO(F7=G^{zBE;`eb(a6vs-%7mt40XRnb}5Q*H2n zggIX+jl{E|?AFs#?X%r%{_~U%MT@)sRF#iu ze}g~L0EK4WlZ8PQdWLm?;AREl*toq4Rm__#tR#>!x$q)6pm7zFWf@ z3{CkG+nF)yuyhzcEFKb%1(iF0z8_#ad*`O_A)_5?HQIgEeP>W*PyUyD}Ew>mBzWAjOKlBcUl8k7>4|(@aU8;6dJ(Y=>)Oe zl-DHez(e@r3m$91P}W9&L8oel>ZL&S63MMNMVgn5Lk?PwuzdnAC$|q)t0*Z^C^DJF z%5mkk*7F)qswztZilM} zC}D!J(!99Z6%6!L(_+q7)tKFt=IG;if?VIp%^1h~MF7n{+~gmBUB2!n{*B&7@uItg z;ug?hK?W91pqXCEzTFxHHGuEq*ZXU+FdkDD?kWW@p z3i`pM(BM402HTimHWZl78^zXWhfwemd2|6V5>he@Sp%eck9%>R746vIM8x?zDKZDIO+?>+^b69MN~LB2~gDGH5*o^{5F z^+vG)IHoDDVm*4Np=)Evx-ZF3D8#^Y>c>G(beEZJrJCs9)}2Ca80fqN={wet9T7vOA zKsiV;;6fMO29$Vx1U=lq?{tfOzz;C4cq|@|G{0HR&$PH;iu@sdaT}h-156_C==vnK zv0)N)HiE)hCiS_};zk!jWAvE~w;2l3!U9O{_kFc)A#aW2m#1(S`+scrf4enNe&s<++6&L6DRn{v8kq3CR~V5Zg$FQQ1gqSjuB&y6US6#uY1kd);AIAG7U|f0rq~ z#Dy$>qu4~Bm#GXDXMj@?wyp?|1Cy>=WoQ;86iKJspuI(O@K=%4cLf16sR+pnSYsX? z_IuobaX!+LiZE#GLCD6 zt}u^lOn^D{c3k2Fl;QzIxc$?-)$eeK#13(PfaAn-UI6>-vtd4>5inJUxjYI8089fR z7sgg^E=VMoQK`3;n5ZS#T(DLHGx?lb%=zIgxE#*!n7+!eyNLF%!Z&yi#fK$IpS5Ba z%?(Row?8eDBh%r_Y&%Qe+imTE>pw+zx}?v5Of=RW=KLphu6NAHr%;33V(~D9Bhur4 zo)Y2aRVpv-b|@uNXKPmqJDzmYfd)~%u_zeB`Pf z+}mO@;jcn4Ir7!Z=sDASuP;Lzi39n|(C>U@=zI&4p%0S`or7)AWKs{WpUq_G-@g^w5%s-XbT)cKXW2@R==_z7&KEj~&R}Wdie``KJh+U8K~)HSijI&_T3RXlu&OY7 zv~`qMa&}#*!mC_xs${_l)pBCIphiEz*+_zO^h#N9W_kqY7C*tc6$NMe(?BP|TyRz| zZ}tm{mMk_^AU6MX9kJ;rH}7asR{G;`&B448!_q? z+!<83*#mC_{P?CX2iWw}#xBHWSiLMZ?Oln@MkY4*Qe-@-=W^zG--XzJoVuJ5G!vWC zWU(267x|B=oMY%>3=W~ry4NcmxQ3eZ=Ng6q~q@DS%1MTbR&n^a#yH zS!k+AXjZwjwnskM>yer4+*L+hFEEk03tP4en)r_N_;MMP1qr*P=%vjlGT)(_^-r>c zn|5)L`GQAe0!EW|VUo>%D>CVHu)MvTlJfrIBQbxZDu|}tvcy!8#M~`Q%w8UeX-A1U zU?Y>58@a@!bC~G_=B^~B2e&Iilez6%0)`L5vJEN%KqiR^6q`7RBB#GbxSy4C2VWCJgy^QG)g43c$#8ME7XNVn*dLhdNK zD7Ku+0OaTPln)+km!taq8*5Nx`b;QVP$(286e(+kLet+f#vKAFTLJ%12nA?UH591& z6l5!L6Wi8edIjac`%={shE{Cf1+hl@fi^kor~x&=p`>GfJOS%mh6%+yp@zS4;0oPa zPl0|?JcL+Vgj`|`JpVoI96iqOwqHRHrX%qMrW%qu7o-C~3?}g~q?GZL-H^gBwUC`6 zZkgVv>W*a9HNEe`c-GD6idXM^s~xnXJhx>c?id~mon;+>eIV-^)C+h%PakrDhgVvh z_roh@`(=ke2qQcijVbw(hraO0d%7uKqF*;j`0I%kPOhk z01nVrLYpxxOejhV3l$2XWWwn445RPD|1X4sV;wMB;=$-vY5QU}33-uYNcSr(NMI`x z3K5d-MwS5ePIv>E2p|O7vGB(zG=~F0v3Ze9Va!4uVF>c?!jm=KXkNMiSLxu3>RfB|y?b(;D zmqg&(zLx&e*D-fr&z?`;-|cE)_WUXA`!Df-d-nY>3|qMhHz&1cU$Xve_EbS$PC0q4 zI^4+j^*-M#bxmfK=qFcdq|f*3tlxG1er3l%;vK$!-TtqA)Z5>st_b%15}s%o?&<%t z*1C@Uf4Hk}i;gBosHG=4>A7y(t$|B2{EpeJf=ja752KV^2i%hZKUnzGPESUaD=S2Q zM@dKi2Hb5Aa5sr_H(+Z0&dW?qFpD`G#D;hgC;muPNyxbt>_mm)goF#?d3Nihk?7A? zkhH<}XkELxz_gP>TO!TE&5K6yuo099+dTk`sc&V?p(WNG!V~7 zVvIuaDRjlv1J#PhX@xNqa*yr_4H*o77cGx8yAPmg8}%(=HSJA<4~hu_lF!AgD?sia zhgG45vgsf;$!iD0-Ngk<{tiv8XHBi8zz?AR{wO!MCsqzxvWhntW($piz73lCD_ek= zDVl1irH_O~ppN*W?aVncC)vuChW&#vdZDQXn_FO7#d`sm2eo~=($n_a+o|n;wGUC- z_0aY(Y{n`QDD5iM~M z=h~ev?DMA5KFc(E|}sSHI6!+fk6a&TcP7lQ&=1fikBz_ zBr6mmsL`7oiZ&E$=<~gQsr4{uN;$pIaTId9EXbmk7{#w}ccnpi(N2uYc1FlB1Rcx( zoGshbs)UJW&NR$-058W?L!nQ_=9XG|n(|H=1>@;z2{JB;%{^?<2nVDQcvI~(k2`KX znGZRcQ@9D&s}@b1__Z|9ievSgDfib{;rTLbYA`f^HTISkOYi-m=w;Dl zX>*H*Y-caU=DG#rA)Gy=1SP*P3Zq7G*kKYnc8pO+yM~k!yg+2d%6>g`^Pt>rVU_hnLqQ#q{o$%adRs}#( zAW!-OOA3Uf0G{-J97|F`l8PtoU`ZNC((t5bS&|M&PbVs26qLpVAsO~s*}n*dQc8fnKegHg^HMmf3|OteN&E{)QEHHI!i+u41fYaqM-jok;h zdb0bg__OJ}TL7VTUcD)FgrePzNxi5bvuK@aGlvG)a$*&hNK83!7P$V%L>Mwtgvdq+ zqqJhp76st%$izkXBlgKRC%VkoG{e4gC@Bn~hEaA~d0@VQUN*D0&3>;Z>BO0fc($2~ zSPcf4^Ai()rP8O{+>uA)3!t-)7z<_wxI-2p+r!Q`Xm(>)2?rv3;O>P}=)3 z2$!Q1#S@@v29jZ7dl;@?G4Vkq0F9?nF}UmvcngK!$@HasT!Ci^ci<_FXncU{Se|AC zsSqkXyQ0m_CL9+>l5|8PQ1XIi*{di-TDAgtfi#Pyv0^aj<@~PqZ{zuT%&CY+(jw)j z9thljoOjeZNQ&Ov;x1EQj9_We;C9-A@-apg!xrt|I0D#bjdW#sn;R!155|kN`|2q^ zZ#lY=&9DVgl>B24C=@tYEAY>g7$Y+S#O{6#@#&P|yWdtS4h+PI5!ggfLZstOZnrBD zCm4^wv+P@~dh(x2VR|BTR*I}F3bs*nT->jJFzbx0aP2c=Oo>uy?EMte*(}z?L0`c!#<#~B>s5ktXcoMbXFTF!@99^6qUB*YnEVlTLN-B0x?EQ$I^;1EA zBVHeBYf)M!q6PJc6tN7?bzWA|D4eGwtDO%~xO{rne;IY7^InR?Q!0<2T6$Bda8g_r zj6g840Vagska)!py>TCtuz9D}XsJQtN}|ixJ?Rptk$5BQ{07pMhc>k;dP5mIi{K8f zL2p@q2Mx!f0|FoRMKtWAiYYnqKp-xEK8&l(aGX_T1UXO?KgiaO$TJzFGQcP&2<7G#EJbmPE60?YugCZRo;8mo5DLMm$#J&G!^^v{*{>s7~n1Hm=-EVU+-)6Y7 zHxBONU>5u$O`Qr?Pgn5c&0m{H&qCD|{PJ zjh1Z#x)e;_fAu`tN|lCgFSA^K+G!g0ZU9TJ$4BrV-A|@CUkhZa8)FDmkI*7iS)|P= zIKhKi+k@DWoc?5jh!2Ye{xlB6nX`=BPFRR!n>5AIq9(Uh$M@>ylTzjb)GwSyBM#u? zO=|ew%{Ki-6wGp)7njEuM4kFYsX$xBusE~w6ny}fV@|`L_|rP<8@xAvo({zgT!{oX z=`Uw^DO0hVaD8D0y~9>7S9o7tA-|fiQRr)WR?0lXZ71-EWsa5Jr~|kZ4FA_fB@68r zi|%==`k;H~iePl_tWxk5R5B1#*dZLXRCV9pDmJ^(OSAvg!fHev7(sDp;bqq7-#}rA zUrZYpSHwBaC~@KFll!lKxV^mtm62+o9_U{K{0tA>#YK`>I%@z2XmJag@8i*+ehiC{ ztnfY_GL6ab@+)<+QD_(M1gY$F=eGU>(wqa_+-26xkGD{t>E(w|M=u$ng}pi=bit{P z2)z$0`9PPItV+b0EZU)VVUJt}42y*3F+EfY>HO&qb&i$#oo04_E4*HHn&uBZ(2sUu zFwxeLRlVVF%$`?aGK20h+PdCI4P{czAY`O14Z`>`8}@HP70x8ze2mQ`k-+1``T969 zGoq{Wu$fV+>u@Ywe$8Ra5IzpC;z{Yb6D_if@K||EU$DHTFM`K#ij}rpq5clpc15XB zqLcdY+8`c1Nrz>BC6{F2F+0O3#@2wQ5_ow(_aCnN69|I85Id>H*q89oazCf)5*73K zjZ_nLqpQ32eb058c5x4Hde5HT^iw^(=^LPY*L|F8%wq+r|E!Yt_@$_uJlARJx76PB z89hAv0ITs?pPrs)-ImPQzT;4L?yW)TWwiy_I%oK*pGw9~Sc1KAlKzcG%dez_G!Z7<)_ znbwOPO_K$G!n+Ji%<8$QzxGOB$k^CLY8d{#OK*9H0j6K_hqYs+_?Wf!qytJ z@(1{nIoZ6}VJ_$&YgQgL7pN!08&LYXDxFa@R_W<~61RC*VJtLhiX9locg*WOrWXu; z7EZC%NXOK;baO#W;CAnpbM`&H<2+!c%d>kN%dOM+>>-E3PZW7Jj@R>z<7LvpB04sw z-l@fvL>PYBI=)DHXB?9{ON?}mAF#1S&9%Z@^&@-Hn&HMyytPG|-It%$g27w0^#K%_ z)DAFzTfk&t%)bfP7$z>IS=voOcv488T|sN>{tN4gUFr_FnqpUU)*TX2cX+;9)*W#D z33UfNhpeb49Rh<(bsq{_?0n18Lp@lWXTH^!6bE#M9~sC3YOL&y{_b@FEI?D5`r7~m zi+9~A^*#y&k@G(1$PcrVSJVNJPnbuinKuQ0;6Tl*_HO&GSF>&37WyUC0h7OR)AsDk zESL6mx=jt)#**#xA3)lNHfgYlw!W)t5}87Ti;Q5>mImsb2AQqMmVmI zYa^kgRcax;H7f{t#-emm0~$SQfE(3-R~9lgz^=HK8Zf6DHK4J3`R|DLY%09~c&lhG zdUK?e@^i>=`O0FZCEzvW1C^Po!!0dy)D*De}K zyTE~;0AwY_GH(cNC?{QijE2Xwi!2Rk7YhSC+QoK?&%v~d*|h08CLdm7%EfYc=!}q+ zi-g=jc$|GTs~1M1@~Re~90jjD4}UTzfkH6~a+w!bn_)Hx<*o}vp&vMiE`veJ2a@QY z_z4tTL%YLbrbCx!J%)|ig(D4(ng?1%TAn8clUJ$Gqf+q`3#WvCCDy5Yf-2#B;A2lD zrFtGosZ1*Vn2sr{cMkT~D2gZeXcUcJjp7!CifI&$s8JYu${GdA#T_k5S)&-LAVC`Q zMjIjKG6s&8rcf-GYikrT##0zV5_Jd+`5;hpIhs81q|H-1arYul+O>M<7f4Glrxjxp z?yWUpXq;LzBY;wW>0TC^B;FHfCr$mQos0k$u_OKf{7a;onGF2XSzdl5vRczd(K*yp z+bHM{#kf?v_zi{AUv`DI*Otp<(c3J4k2li6qA9}Pcpgvaf6>1$ef^*4-#K?Nm3#0n zKKl2+ep7a>e}4c?k#25a`uFQslpXYMRZpUj3GGUmLhhx17$*Mu_u(rti9{fYc=YdI z*8iva_s8q6rGJ0=v5)?p4G*@i+u26ul|38G!uV2GFcX7%$QWtwp6Scy>vdJ1 zT}Ig~eK)JmG&=tvh#il}T&-DkijA~E7BRW9Kg|i+kOe|z8htDCr~k*^mw-o6Wo>t- z(^(1Cge?eSl%RpIM1qo-AYDl}RFg!bhy(>;M0-$w96uyo0R$vciKbJw%Z!RMI_fOn z$c&@nMiNj+2xMUmAjqN+ajT|912{85PA_D>o$ zUZk^s`fkAbUhhxcZoF8bc6;0p71ZsGtlRxHzMs=gjiLNsqG*nj50Z_ziw%C2%&(b9 z=77reo<5yV#fZrCr=Ypa)LTDRZ$=KAHr{cA)N?nQ1Fk_wacqJaqDEG^>C1T^)Mkw1 zX|^hym{wsRUDVqp=$K+R&ew?*GOOlW9Pfbi*|Z8NKJpDENf>shUBu#8Qd@-%DPbI(!RP#PQm zG#NESk@7waxSY0y%F~JRVL}VZiONTTmgVA&1Z<1;El2Ff?4r4+>e&VVabmRR2YPUS z3}j7vl4s-_fqeHcRXFN*#=ykERBmi7ehxAhM?!O&>}bcsWPI!?Y}KJxm^GGJ2e}z1 zVX0TRNAMv*a7H1wd{y^H5r(hIr_QN z6lyh>c&tP`+G}-_3Pn4~Nku{5%ph0hwgkGir zHlMpN$cW?VZus?p+0U=#o%zMgqq&!<{JL4=*UcKg_Do_!$qMAS?^4(5C1(tOOqxiw z2N-smF%09IiD7$QVb(lmHFGn*fz<~3=`fl&fX2egQb(VPX2uP9ofa7NmwYtGB?LY9 z3wkyMJ@*QFj#8gVK{^W!nH*#cM&l&IKR8XX#$W$LQqw{BzYiI_?TJZ9z`f*d3sV~B zQi_>Z3oOTQ(`lANRlJU1uiHs~$y?a$xgOJQIc?A^>_@Zgaerm$poPtl4%5r_(`(4XGbLr+QLOs{~+wyN3l4P&ASC z1;+@O-va?Xt=}zK8W}dWhNa^qcuRQa^*d}Lt>51RfEV?}rvLUdTfZaD1TEiRWL?6lesaW9;IV)6v`gMV@VEVEm2qFZ?)sYYx21XkbmwBLzi^2F<_)Mmy# zvr3gGu$lfE@9$Kj-_C+k@v+w@$o;?GVASQgjGyc@>f~+GSCedVc#V*@S=iSop#Lg1 zmIQe_JqW(xnajg;UEoQxpJ4nAln2H0a&xsAm+Iq_Qnm^Ew%gKw4k`&)qbu$Xs7i1S z2{n@tJRZ>4S0fQ-LI<)7Rj8LN*A?J^~ zYtIbG#6EhOkP7E+0KEMFo z&9vqN18(S&0mw+tQEo=tY3?5S0A>Q3X|v+*;!kh7ye{rAKL0BkZ7!hwx+cvpOI?@# z)X9~)2_Ml>$jm0R8r8{*vo)>89ThahI{5bLco}^@UPi}Dym%cwUv8yq=)hMT(vMZ+ zG@oC8fHwLbglB8o$^5c5hr#L`W4EBGzP>0PThLZtG(6$wGUhkZf*l{n&6xO}$Dp%t zmFGPMt9${2>x&0+Gj4hXg5^3ppV9!4U&DVdCiqrxO|L=(S3#w7mAdhC_Fk;w<$qud z-J*VXJi94r;Wn)(<+$i; zl-gR0BZ!l|f*E<{vKSfRz7j@mxsmOE7lebC$4EM3tDT%D<6U^aErEM?Hcl#Nzw7md z0sCOfnSHPVW*_Vtn2bzmduf7wejOcVvL?{&V0KVhjS|<9nI%UHy8~C2KUCaLNl^W-S5xMyDcAW^I^L#~WL%Q&BvQIzkd9?R4^90k*AY>mYlw?|J|Aq%DBbygkEuMa z^nP|u%bE}Yc&UJ8Pj%gr4}{Ai7m*$a4Sw4n+ zQ#W?#Ls}R~lty8au9ZvYPw@WNGiNY^U_RUu{)V z#{^`^A}sz&$xyLo)UkaYFE0%@488$kB52*B|BjkN7;F@G@ z)7cBvOnpf7&@7`qG1_mIpKc&@ZNZJ|JJWT2t)tjyF@JrxkL;no-lP5g8iML$@?T$o`Nj#@Y;rsK*!v4Bf8+@M6$;}u?WC_dI7T8t+)b~hSLi8 zBlpbX@U)4+VR_OR$5l}O(*C@>OZhy7t=hSJA!l7Ui5u<3QFe>-k)%Y=AXq%Ap?r3x zc$-i8VJ%<)FNhF1r0Kci7}I1F;|GMRH!L#fczGupiLE+@=N?omtC=mNd?$0njgmXj z&OLevkBXym?Y%F5S==Gi7(BiRt23tUB<169&rwYq_ha5XH(>XSt@c|Zgn04{3asfT zxlMJbljM^3bID(x=I%QHJ%(E2&2+yFm2(zuX8+fm^sTnA|Eug_W;4CL6!P|5$eT0d zO$vEi;eUe;Nd1alX6?tQJs7-~2Xe4Q)2UsDx#TlI+0Q_K=V@}X&1~wX9RY-#ajywu zx}o=>hZZfv0>3}1>V|%WLZgzK=}9ty*y;e$F`MF=8dB(BND?x)sE? zd~!&G#Ez;b*EIO&Ap9ALpO$x^x|SJZp7|Ntq;;QWUr=xQ25KmdOgrL^2dXxNvzhn} zymYc(+47Np&*xfp5sx*oQ^D!V`ycsFHK*e!&3{8V`aZi){|1_UD_aQI>?`)+X3&s; zG|Cf@#q$K}`*(w&MI$>M*j|KI?O|l4<7g6;!VmBg{YAkgzNMLv%UDQv@pB;S&Hk)~ zkTqS+TFCXue@+?t0g|*GNh(x}SEd3@R>MWKH)qLzJiq)Mo^CNyT)w;&h#K)e`KQ^h z5!v((y*E?iKUcPWh#tlrtc_IZay+gLjihTkAmBZx{6%f|TLJ5IBUqP!O!o$w3sI!^ zRnn|)s0Ar&*OJ>CQnMGL2|Joik|8rW3w~NHsjq6_p>Q*^=#5hln`M%fnePN2b}!^+ z^p8A$hTWrtze7jZM?qSxy7$+TYj#v$|N4kQmv)3rVK_BK!PFFfX|bO0vkc z^o!j@$|6gqkBOgi?3wMV3;Mg*q=W{Y%0AG4sne6#4}WeI@l^7}!#n9?muDmkn~yW+ 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 Date: Mon, 9 Dec 2024 10:25:11 -0300 Subject: [PATCH 037/183] ci(pre-commit): Add bash script formatter and linter (#10681) * ci(pre-commit): Add check for bash scripts * fix(formatting): Fix bash scripts * docs(pre-commit): Add info about the included hooks --- .github/scripts/check-cmakelists.sh | 5 +- .github/scripts/find_all_boards.sh | 25 +- .github/scripts/find_new_boards.sh | 37 ++- .github/scripts/install-arduino-cli.sh | 3 +- .github/scripts/install-arduino-core-esp32.sh | 14 +- .github/scripts/install-arduino-ide.sh | 3 +- .github/scripts/install-platformio-esp32.sh | 54 ++-- .github/scripts/on-pages.sh | 69 +++-- .github/scripts/on-push.sh | 82 +++--- .github/scripts/on-release.sh | 215 ++++++++++------ .github/scripts/set_push_chunks.sh | 48 ++-- .github/scripts/sketch_utils.sh | 215 +++++++++------- .github/scripts/tests_build.sh | 33 ++- .github/scripts/tests_matrix.sh | 20 +- .github/scripts/tests_run.sh | 243 +++++++++--------- .github/scripts/update-version.sh | 24 +- .github/scripts/upload_py_tools.sh | 3 +- .pre-commit-config.yaml | 30 +++ .shellcheckrc | 11 + docs/en/contributing.rst | 10 + docs/utils.sh | 27 +- tools/add_lib.sh | 166 ++++++------ 22 files changed, 752 insertions(+), 585 deletions(-) create mode 100644 .shellcheckrc diff --git a/.github/scripts/check-cmakelists.sh b/.github/scripts/check-cmakelists.sh index 98d9722ad83..7d4f6b4e2d9 100755 --- a/.github/scripts/check-cmakelists.sh +++ b/.github/scripts/check-cmakelists.sh @@ -1,4 +1,5 @@ #!/bin/bash + # # This script is used in the CI workflow. It checks all non-examples source files in libraries/ and cores/ are listed in # CMakeLists.txt for the cmake-based IDF component @@ -12,10 +13,10 @@ set -e git submodule update --init --recursive # find all source files in repo -REPO_SRCS=`find cores/esp32/ libraries/ -name 'examples' -prune -o -name '*.c' -print -o -name '*.cpp' -print | sort` +REPO_SRCS=$(find cores/esp32/ libraries/ -name 'examples' -prune -o -name '*.c' -print -o -name '*.cpp' -print | sort) # find all source files named in CMakeLists.txt COMPONENT_SRCS -CMAKE_SRCS=`cmake --trace-expand -P CMakeLists.txt 2>&1 | grep set\(srcs | cut -d'(' -f3 | sed 's/ )//' | sed 's/srcs //' | tr ' ;' '\n' | sort` +CMAKE_SRCS=$(cmake --trace-expand -P CMakeLists.txt 2>&1 | grep set\(srcs | cut -d'(' -f3 | sed 's/ )//' | sed 's/srcs //' | tr ' ;' '\n' | sort) if ! diff -u0 --label "Repo Files" --label "srcs" <(echo "$REPO_SRCS") <(echo "$CMAKE_SRCS"); then echo "Source files in repo (-) and source files in CMakeLists.txt (+) don't match" diff --git a/.github/scripts/find_all_boards.sh b/.github/scripts/find_all_boards.sh index b474a49bc2e..67b46661ca5 100755 --- a/.github/scripts/find_all_boards.sh +++ b/.github/scripts/find_all_boards.sh @@ -3,7 +3,9 @@ # Get all boards boards_array=() -for line in `grep '.tarch=' boards.txt`; do +boards_list=$(grep '.tarch=' boards.txt) + +while read -r line; do board_name=$(echo "$line" | cut -d '.' -f1 | cut -d '#' -f1) # skip esp32c2 as we dont build libs for it if [ "$board_name" == "esp32c2" ]; then @@ -12,29 +14,26 @@ for line in `grep '.tarch=' boards.txt`; do fi boards_array+=("espressif:esp32:$board_name") echo "Added 'espressif:esp32:$board_name' to array" -done +done <<< "$boards_list" # Create JSON like string with all boards found and pass it to env variable board_count=${#boards_array[@]} echo "Boards found: $board_count" -echo "BOARD-COUNT=$board_count" >> $GITHUB_ENV +echo "BOARD-COUNT=$board_count" >> "$GITHUB_ENV" -if [ $board_count -gt 0 ] -then +if [ "$board_count" -gt 0 ]; then json_matrix='[' - for board in ${boards_array[@]} - do + for board in "${boards_array[@]}"; do json_matrix+='"'$board'"' - if [ $board_count -gt 1 ] - then + if [ "$board_count" -gt 1 ]; then json_matrix+="," fi - board_count=$(($board_count - 1)) + board_count=$((board_count - 1)) done json_matrix+=']' - echo $json_matrix - echo "FQBNS=${json_matrix}" >> $GITHUB_ENV + echo "$json_matrix" + echo "FQBNS=${json_matrix}" >> "$GITHUB_ENV" else - echo "FQBNS=" >> $GITHUB_ENV + echo "FQBNS=" >> "$GITHUB_ENV" fi diff --git a/.github/scripts/find_new_boards.sh b/.github/scripts/find_new_boards.sh index 706676b4a4c..4482aa2b1da 100755 --- a/.github/scripts/find_new_boards.sh +++ b/.github/scripts/find_new_boards.sh @@ -5,14 +5,13 @@ owner_repository=$1 base_ref=$2 # Download the boards.txt file from the base branch -curl -L -o boards_base.txt https://raw.githubusercontent.com/$owner_repository/$base_ref/boards.txt +curl -L -o boards_base.txt https://raw.githubusercontent.com/"$owner_repository"/"$base_ref"/boards.txt # Compare boards.txt file in the repo with the modified file from PR diff=$(diff -u boards_base.txt boards.txt) # Check if the diff is empty -if [ -z "$diff" ] -then +if [ -z "$diff" ]; then echo "No changes in boards.txt file" echo "FQBNS=" exit 0 @@ -21,7 +20,7 @@ fi # Extract added or modified lines (lines starting with '+' or '-') modified_lines=$(echo "$diff" | grep -E '^[+-][^+-]') -# Print the modified lines for debugging +# Print the modified lines for debugging echo "Modified lines:" echo "$modified_lines" @@ -29,15 +28,12 @@ boards_array=() previous_board="" # Extract board names from the modified lines, and add them to the boards_array -while read -r line -do +while read -r line; do board_name=$(echo "$line" | cut -d '.' -f1 | cut -d '#' -f1) # remove + or - from the board name at the beginning - board_name=$(echo "$board_name" | sed 's/^[+-]//') - if [ "$board_name" != "" ] && [ "$board_name" != "+" ] && [ "$board_name" != "-" ] && [ "$board_name" != "esp32_family" ] - then - if [ "$board_name" != "$previous_board" ] - then + board_name=${board_name#[-+]} + if [ "$board_name" != "" ] && [ "$board_name" != "+" ] && [ "$board_name" != "-" ] && [ "$board_name" != "esp32_family" ]; then + if [ "$board_name" != "$previous_board" ]; then boards_array+=("espressif:esp32:$board_name") previous_board="$board_name" echo "Added 'espressif:esp32:$board_name' to array" @@ -48,22 +44,19 @@ done <<< "$modified_lines" # Create JSON like string with all boards found and pass it to env variable board_count=${#boards_array[@]} -if [ $board_count -gt 0 ] -then +if [ "$board_count" -gt 0 ]; then json_matrix='{"fqbn": [' - for board in ${boards_array[@]} - do + for board in "${boards_array[@]}"; do json_matrix+='"'$board'"' - if [ $board_count -gt 1 ] - then + if [ "$board_count" -gt 1 ]; then json_matrix+="," fi - board_count=$(($board_count - 1)) + board_count=$((board_count - 1)) done json_matrix+=']}' - echo $json_matrix - echo "FQBNS=${json_matrix}" >> $GITHUB_ENV + echo "$json_matrix" + echo "FQBNS=${json_matrix}" >> "$GITHUB_ENV" else - echo "FQBNS=" >> $GITHUB_ENV -fi \ No newline at end of file + echo "FQBNS=" >> "$GITHUB_ENV" +fi diff --git a/.github/scripts/install-arduino-cli.sh b/.github/scripts/install-arduino-cli.sh index 533b39c7ddd..bb7f544e752 100755 --- a/.github/scripts/install-arduino-cli.sh +++ b/.github/scripts/install-arduino-cli.sh @@ -1,6 +1,6 @@ #!/bin/bash -OSBITS=`uname -m` +OSBITS=$(uname -m) if [[ "$OSTYPE" == "linux"* ]]; then export OS_IS_LINUX="1" if [[ "$OSBITS" == "i686" ]]; then @@ -49,4 +49,3 @@ if [ ! -d "$ARDUINO_IDE_PATH" ] || [ ! -f "$ARDUINO_IDE_PATH/arduino-cli" ]; the curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | BINDIR="$ARDUINO_IDE_PATH" sh fi fi - diff --git a/.github/scripts/install-arduino-core-esp32.sh b/.github/scripts/install-arduino-core-esp32.sh index fe50c909198..e0071a0eb83 100755 --- a/.github/scripts/install-arduino-core-esp32.sh +++ b/.github/scripts/install-arduino-core-esp32.sh @@ -5,7 +5,7 @@ if [ ! -d "$ARDUINO_ESP32_PATH" ]; then echo "Installing ESP32 Arduino Core ..." script_init_path="$PWD" mkdir -p "$ARDUINO_USR_PATH/hardware/espressif" - cd "$ARDUINO_USR_PATH/hardware/espressif" + cd "$ARDUINO_USR_PATH/hardware/espressif" || exit echo "Installing Python Serial ..." pip install pyserial > /dev/null @@ -15,25 +15,25 @@ if [ ! -d "$ARDUINO_ESP32_PATH" ]; then pip install requests > /dev/null fi - if [ ! -z "$GITHUB_REPOSITORY" ]; then + if [ -n "$GITHUB_REPOSITORY" ]; then echo "Linking Core..." - ln -s $GITHUB_WORKSPACE esp32 + ln -s "$GITHUB_WORKSPACE" esp32 else echo "Cloning Core Repository..." git clone https://github.com/espressif/arduino-esp32.git esp32 > /dev/null 2>&1 fi #echo "Updating Submodules ..." - cd esp32 + cd esp32 || exit #git submodule update --init --recursive > /dev/null 2>&1 echo "Installing Platform Tools ..." if [ "$OS_IS_WINDOWS" == "1" ]; then - cd tools && ./get.exe + cd tools && ./get.exe else - cd tools && python get.py + cd tools && python get.py fi - cd $script_init_path + cd "$script_init_path" || exit echo "ESP32 Arduino has been installed in '$ARDUINO_ESP32_PATH'" echo "" diff --git a/.github/scripts/install-arduino-ide.sh b/.github/scripts/install-arduino-ide.sh index 7fd95797834..5b3bcb1791e 100755 --- a/.github/scripts/install-arduino-ide.sh +++ b/.github/scripts/install-arduino-ide.sh @@ -4,7 +4,7 @@ #OSTYPE: 'msys', ARCH: 'x86_64' => win32 #OSTYPE: 'darwin18', ARCH: 'i386' => macos -OSBITS=`uname -m` +OSBITS=$(uname -m) if [[ "$OSTYPE" == "linux"* ]]; then export OS_IS_LINUX="1" ARCHIVE_FORMAT="tar.xz" @@ -77,4 +77,3 @@ if [ ! -d "$ARDUINO_IDE_PATH" ]; then echo "Arduino IDE Installed in '$ARDUINO_IDE_PATH'" echo "" fi - diff --git a/.github/scripts/install-platformio-esp32.sh b/.github/scripts/install-platformio-esp32.sh index 80c668bdc0e..8cd6552eb80 100755 --- a/.github/scripts/install-platformio-esp32.sh +++ b/.github/scripts/install-platformio-esp32.sh @@ -52,7 +52,7 @@ python -c "$replace_script" if [ "$GITHUB_REPOSITORY" == "espressif/arduino-esp32" ]; then echo "Linking Core..." - ln -s $GITHUB_WORKSPACE "$PLATFORMIO_ESP32_PATH" + ln -s "$GITHUB_WORKSPACE" "$PLATFORMIO_ESP32_PATH" else echo "Cloning Core Repository ..." git clone --recursive https://github.com/espressif/arduino-esp32.git "$PLATFORMIO_ESP32_PATH" > /dev/null 2>&1 @@ -61,7 +61,7 @@ fi echo "PlatformIO for ESP32 has been installed" echo "" -function build_pio_sketch(){ # build_pio_sketch +function build_pio_sketch { # build_pio_sketch if [ "$#" -lt 3 ]; then echo "ERROR: Illegal number of parameters" echo "USAGE: build_pio_sketch " @@ -71,13 +71,15 @@ function build_pio_sketch(){ # build_pio_sketch local board="$1" local options="$2" local sketch="$3" - local sketch_dir=$(dirname "$sketch") + local sketch_dir + + sketch_dir=$(dirname "$sketch") echo "" - echo "Compiling '"$(basename "$sketch")"' ..." + echo "Compiling '$(basename "$sketch")' ..." python -m platformio ci --board "$board" "$sketch_dir" --project-option="$options" } -function build_pio_sketches(){ # build_pio_sketches +function build_pio_sketches { # build_pio_sketches if [ "$#" -lt 3 ]; then echo "ERROR: Illegal number of parameters" echo "USAGE: build_pio_sketches [ ]" @@ -108,27 +110,34 @@ function build_pio_sketches(){ # build_pio_sketches -function git_remove_from_pages(){ +function git_remove_from_pages { local path=$1 - local info=`curl -s -k -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3.object+json" -X GET "https://api.github.com/repos/$GITHUB_REPOSITORY/contents/$path?ref=gh-pages"` - local type=`echo "$info" | jq -r '.type'` - if [ ! $type == "file" ]; then - if [ ! $type == "null" ]; then + local info + local type + local sha + local message + + info=$(curl -s -k -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3.object+json" -X GET "https://api.github.com/repos/$GITHUB_REPOSITORY/contents/$path?ref=gh-pages") + type=$(echo "$info" | jq -r '.type') + + if [ ! "$type" == "file" ]; then + if [ ! "$type" == "null" ]; then echo "Wrong type '$type'" else echo "File is not on Pages" fi return 0 fi - local sha=`echo "$info" | jq -r '.sha'` - local message="Deleting "$(basename $path) + + sha=$(echo "$info" | jq -r '.sha') + message="Deleting "$(basename "$path") local json="{\"branch\":\"gh-pages\",\"message\":\"$message\",\"sha\":\"$sha\"}" echo "$json" | curl -s -k -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3.raw+json" -X DELETE --data @- "https://api.github.com/repos/$GITHUB_REPOSITORY/contents/$path" } -function git_upload_to_pages(){ +function git_upload_to_pages { local path=$1 local src=$2 @@ -42,41 +50,50 @@ function git_upload_to_pages(){ return 1 fi - local info=`curl -s -k -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3.object+json" -X GET "https://api.github.com/repos/$GITHUB_REPOSITORY/contents/$path?ref=gh-pages"` - local type=`echo "$info" | jq -r '.type'` - local message=$(basename $path) + local info + local type + local message local sha="" local content="" - if [ $type == "file" ]; then - sha=`echo "$info" | jq -r '.sha'` + info=$(curl -s -k -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3.object+json" -X GET "https://api.github.com/repos/$GITHUB_REPOSITORY/contents/$path?ref=gh-pages") + type=$(echo "$info" | jq -r '.type') + message=$(basename "$path") + + if [ "$type" == "file" ]; then + sha=$(echo "$info" | jq -r '.sha') sha=",\"sha\":\"$sha\"" message="Updating $message" - elif [ ! $type == "null" ]; then + elif [ ! "$type" == "null" ]; then >&2 echo "Wrong type '$type'" return 1 else message="Creating $message" fi - content=`base64 -i "$src"` + content=$(base64 -i "$src") data="{\"branch\":\"gh-pages\",\"message\":\"$message\",\"content\":\"$content\"$sha}" echo "$data" | curl -s -k -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3.raw+json" -X PUT --data @- "https://api.github.com/repos/$GITHUB_REPOSITORY/contents/$path" } -function git_safe_upload_to_pages(){ +function git_safe_upload_to_pages { local path=$1 local file="$2" - local name=$(basename "$file") - local size=`get_file_size "$file"` - local upload_res=`git_upload_to_pages "$path" "$file"` - if [ $? -ne 0 ]; then + local name + local size + local upload_res + + name=$(basename "$file") + size=$(get_file_size "$file") + + if ! upload_res=$(git_upload_to_pages "$path" "$file"); then >&2 echo "ERROR: Failed to upload '$name' ($?)" return 1 fi - up_size=`echo "$upload_res" | jq -r '.content.size'` - if [ $up_size -ne $size ]; then + + up_size=$(echo "$upload_res" | jq -r '.content.size') + if [ "$up_size" -ne "$size" ]; then >&2 echo "ERROR: Uploaded size does not match! $up_size != $size" #git_delete_asset return 1 diff --git a/.github/scripts/on-push.sh b/.github/scripts/on-push.sh index 73d9eeee398..5158df3cc9b 100755 --- a/.github/scripts/on-push.sh +++ b/.github/scripts/on-push.sh @@ -4,43 +4,44 @@ set -e export ARDUINO_BUILD_DIR="$HOME/.arduino/build.tmp" -function build(){ +function build { local target=$1 local chunk_index=$2 local chunks_cnt=$3 local build_log=$4 local sketches_file=$5 - shift; shift; shift; shift; shift; - local sketches=$* + shift 5 + local sketches=("$@") local BUILD_SKETCH="${SCRIPTS_DIR}/sketch_utils.sh build" local BUILD_SKETCHES="${SCRIPTS_DIR}/sketch_utils.sh chunk_build" - local args="-ai $ARDUINO_IDE_PATH -au $ARDUINO_USR_PATH" - - args+=" -t $target" + local args=("-ai" "$ARDUINO_IDE_PATH" "-au" "$ARDUINO_USR_PATH" "-t" "$target") if [ "$OS_IS_LINUX" == "1" ]; then - args+=" -p $ARDUINO_ESP32_PATH/libraries" - args+=" -i $chunk_index -m $chunks_cnt" + args+=("-p" "$ARDUINO_ESP32_PATH/libraries" "-i" "$chunk_index" "-m" "$chunks_cnt") if [ -n "$sketches_file" ]; then - args+=" -f $sketches_file" + args+=("-f" "$sketches_file") fi - if [ $build_log -eq 1 ]; then - args+=" -l $build_log" + if [ "$build_log" -eq 1 ]; then + args+=("-l" "$build_log") fi - ${BUILD_SKETCHES} ${args} + ${BUILD_SKETCHES} "${args[@]}" else - for sketch in ${sketches}; do - local sargs="$args -s $(dirname $sketch)" + for sketch in "${sketches[@]}"; do + local sargs=("${args[@]}") + local ctags_version + local preprocessor_version + sargs+=("-s" "$(dirname "$sketch")") if [ "$OS_IS_WINDOWS" == "1" ] && [ -d "$ARDUINO_IDE_PATH/tools-builder" ]; then - local ctags_version=`ls "$ARDUINO_IDE_PATH/tools-builder/ctags/"` - local preprocessor_version=`ls "$ARDUINO_IDE_PATH/tools-builder/arduino-preprocessor/"` - win_opts="-prefs=runtime.tools.ctags.path=$ARDUINO_IDE_PATH/tools-builder/ctags/$ctags_version - -prefs=runtime.tools.arduino-preprocessor.path=$ARDUINO_IDE_PATH/tools-builder/arduino-preprocessor/$preprocessor_version" - sargs+=" ${win_opts}" + ctags_version=$(ls "$ARDUINO_IDE_PATH/tools-builder/ctags/") + preprocessor_version=$(ls "$ARDUINO_IDE_PATH/tools-builder/arduino-preprocessor/") + sargs+=( + "-prefs=runtime.tools.ctags.path=$ARDUINO_IDE_PATH/tools-builder/ctags/$ctags_version" + "-prefs=runtime.tools.arduino-preprocessor.path=$ARDUINO_IDE_PATH/tools-builder/arduino-preprocessor/$preprocessor_version" + ) fi - ${BUILD_SKETCH} ${sargs} + ${BUILD_SKETCH} "${sargs[@]}" done fi } @@ -73,40 +74,40 @@ fi SCRIPTS_DIR="./.github/scripts" if [ "$BUILD_PIO" -eq 0 ]; then - source ${SCRIPTS_DIR}/install-arduino-cli.sh - source ${SCRIPTS_DIR}/install-arduino-core-esp32.sh - - SKETCHES_ESP32="\ - $ARDUINO_ESP32_PATH/libraries/NetworkClientSecure/examples/WiFiClientSecure/WiFiClientSecure.ino\ - $ARDUINO_ESP32_PATH/libraries/BLE/examples/Server/Server.ino\ - $ARDUINO_ESP32_PATH/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino\ - $ARDUINO_ESP32_PATH/libraries/Insights/examples/MinimalDiagnostics/MinimalDiagnostics.ino\ - " + source "${SCRIPTS_DIR}/install-arduino-cli.sh" + source "${SCRIPTS_DIR}/install-arduino-core-esp32.sh" + + SKETCHES_ESP32=( + "$ARDUINO_ESP32_PATH/libraries/NetworkClientSecure/examples/WiFiClientSecure/WiFiClientSecure.ino" + "$ARDUINO_ESP32_PATH/libraries/BLE/examples/Server/Server.ino" + "$ARDUINO_ESP32_PATH/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino" + "$ARDUINO_ESP32_PATH/libraries/Insights/examples/MinimalDiagnostics/MinimalDiagnostics.ino" + ) #create sizes_file sizes_file="$GITHUB_WORKSPACE/cli_compile_$CHUNK_INDEX.json" if [ "$BUILD_LOG" -eq 1 ]; then #create sizes_file and echo start of JSON array with "boards" key - echo "{\"boards\": [" > $sizes_file + echo "{\"boards\": [" > "$sizes_file" fi #build sketches for different targets - build "esp32p4" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "$SKETCHES_ESP32" - build "esp32s3" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "$SKETCHES_ESP32" - build "esp32s2" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "$SKETCHES_ESP32" - build "esp32c3" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "$SKETCHES_ESP32" - build "esp32c6" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "$SKETCHES_ESP32" - build "esp32h2" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "$SKETCHES_ESP32" - build "esp32" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "$SKETCHES_ESP32" + build "esp32p4" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" + build "esp32s3" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" + build "esp32s2" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" + build "esp32c3" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" + build "esp32c6" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" + build "esp32h2" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" + build "esp32" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" if [ "$BUILD_LOG" -eq 1 ]; then #remove last comma from the last JSON object sed -i '$ s/,$//' "$sizes_file" #echo end of JSON array - echo "]}" >> $sizes_file + echo "]}" >> "$sizes_file" fi else - source ${SCRIPTS_DIR}/install-platformio-esp32.sh + source "${SCRIPTS_DIR}/install-platformio-esp32.sh" # PlatformIO ESP32 Test BOARD="esp32dev" OPTIONS="board_build.partitions = huge_app.csv" @@ -117,8 +118,7 @@ else build_pio_sketch "$BOARD" "$OPTIONS" "$PLATFORMIO_ESP32_PATH/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino" # Basic sanity testing for other series - for board in "esp32-c3-devkitm-1" "esp32-s2-saola-1" "esp32-s3-devkitc-1" - do + for board in "esp32-c3-devkitm-1" "esp32-s2-saola-1" "esp32-s3-devkitc-1"; do python -m platformio ci --board "$board" "$PLATFORMIO_ESP32_PATH/libraries/WiFi/examples/WiFiClient" --project-option="board_build.partitions = huge_app.csv" done diff --git a/.github/scripts/on-release.sh b/.github/scripts/on-release.sh index bbb46fa5563..119c66e1eab 100755 --- a/.github/scripts/on-release.sh +++ b/.github/scripts/on-release.sh @@ -1,29 +1,34 @@ #!/bin/bash +# Disable shellcheck warning about using 'cat' to read a file. +# Disable shellcheck warning about using individual redirections for each command. +# Disable shellcheck warning about $? uses. +# shellcheck disable=SC2002,SC2129,SC2181,SC2319 -if [ ! $GITHUB_EVENT_NAME == "release" ]; then +if [ ! "$GITHUB_EVENT_NAME" == "release" ]; then echo "Wrong event '$GITHUB_EVENT_NAME'!" exit 1 fi -EVENT_JSON=`cat $GITHUB_EVENT_PATH` +EVENT_JSON=$(cat "$GITHUB_EVENT_PATH") -action=`echo $EVENT_JSON | jq -r '.action'` -if [ ! $action == "published" ]; then +action=$(echo "$EVENT_JSON" | jq -r '.action') +if [ ! "$action" == "published" ]; then echo "Wrong action '$action'. Exiting now..." exit 0 fi -draft=`echo $EVENT_JSON | jq -r '.release.draft'` -if [ $draft == "true" ]; then +draft=$(echo "$EVENT_JSON" | jq -r '.release.draft') +if [ "$draft" == "true" ]; then echo "It's a draft release. Exiting now..." exit 0 fi -RELEASE_PRE=`echo $EVENT_JSON | jq -r '.release.prerelease'` -RELEASE_TAG=`echo $EVENT_JSON | jq -r '.release.tag_name'` -RELEASE_BRANCH=`echo $EVENT_JSON | jq -r '.release.target_commitish'` -RELEASE_ID=`echo $EVENT_JSON | jq -r '.release.id'` +RELEASE_PRE=$(echo "$EVENT_JSON" | jq -r '.release.prerelease') +RELEASE_TAG=$(echo "$EVENT_JSON" | jq -r '.release.tag_name') +RELEASE_BRANCH=$(echo "$EVENT_JSON" | jq -r '.release.target_commitish') +RELEASE_ID=$(echo "$EVENT_JSON" | jq -r '.release.id') +SCRIPTS_DIR="./.github/scripts" OUTPUT_DIR="$GITHUB_WORKSPACE/build" PACKAGE_NAME="esp32-$RELEASE_TAG" PACKAGE_JSON_MERGE="$GITHUB_WORKSPACE/.github/scripts/merge_packages.py" @@ -36,17 +41,23 @@ echo "Action: $action, Branch: $RELEASE_BRANCH, ID: $RELEASE_ID" echo "Tag: $RELEASE_TAG, Draft: $draft, Pre-Release: $RELEASE_PRE" # Try extracting something like a JSON with a "boards" array/element and "vendor" fields -BOARDS=`echo $RELEASE_BODY | grep -Pzo '(?s){.*}' | jq -r '.boards[]? // .boards? // empty' | xargs echo -n 2>/dev/null` -VENDOR=`echo $RELEASE_BODY | grep -Pzo '(?s){.*}' | jq -r '.vendor? // empty' | xargs echo -n 2>/dev/null` -if ! [ -z "${BOARDS}" ]; then echo "Releasing board(s): $BOARDS" ; fi -if ! [ -z "${VENDOR}" ]; then echo "Setting packager: $VENDOR" ; fi +BOARDS=$(echo "$RELEASE_BODY" | grep -Pzo '(?s){.*}' | jq -r '.boards[]? // .boards? // empty' | xargs echo -n 2>/dev/null) +VENDOR=$(echo "$RELEASE_BODY" | grep -Pzo '(?s){.*}' | jq -r '.vendor? // empty' | xargs echo -n 2>/dev/null) -function get_file_size(){ +if [ -n "${BOARDS}" ]; then + echo "Releasing board(s): $BOARDS" +fi + +if [ -n "${VENDOR}" ]; then + echo "Setting packager: $VENDOR" +fi + +function get_file_size { local file="$1" if [[ "$OSTYPE" == "darwin"* ]]; then - eval `stat -s "$file"` + eval "$(stat -s "$file")" local res="$?" - echo "$st_size" + echo "${st_size:?}" return $res else stat --printf="%s" "$file" @@ -54,23 +65,29 @@ function get_file_size(){ fi } -function git_upload_asset(){ - local name=$(basename "$1") +function git_upload_asset { + local name + name=$(basename "$1") # local mime=$(file -b --mime-type "$1") curl -k -X POST -sH "Authorization: token $GITHUB_TOKEN" -H "Content-Type: application/octet-stream" --data-binary @"$1" "https://uploads.github.com/repos/$GITHUB_REPOSITORY/releases/$RELEASE_ID/assets?name=$name" } -function git_safe_upload_asset(){ +function git_safe_upload_asset { local file="$1" - local name=$(basename "$file") - local size=`get_file_size "$file"` - local upload_res=`git_upload_asset "$file"` - if [ $? -ne 0 ]; then + local name + local size + local upload_res + + name=$(basename "$file") + size=$(get_file_size "$file") + + if ! upload_res=$(git_upload_asset "$file"); then >&2 echo "ERROR: Failed to upload '$name' ($?)" return 1 fi - up_size=`echo "$upload_res" | jq -r '.size'` - if [ $up_size -ne $size ]; then + + up_size=$(echo "$upload_res" | jq -r '.size') + if [ "$up_size" -ne "$size" ]; then >&2 echo "ERROR: Uploaded size does not match! $up_size != $size" #git_delete_asset return 1 @@ -79,7 +96,7 @@ function git_safe_upload_asset(){ return $? } -function git_upload_to_pages(){ +function git_upload_to_pages { local path=$1 local src=$2 @@ -88,41 +105,50 @@ function git_upload_to_pages(){ return 1 fi - local info=`curl -s -k -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3.object+json" -X GET "https://api.github.com/repos/$GITHUB_REPOSITORY/contents/$path?ref=gh-pages"` - local type=`echo "$info" | jq -r '.type'` - local message=$(basename $path) + local info + local type + local message local sha="" local content="" - if [ $type == "file" ]; then - sha=`echo "$info" | jq -r '.sha'` + info=$(curl -s -k -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3.object+json" -X GET "https://api.github.com/repos/$GITHUB_REPOSITORY/contents/$path?ref=gh-pages") + type=$(echo "$info" | jq -r '.type') + message=$(basename "$path") + + if [ "$type" == "file" ]; then + sha=$(echo "$info" | jq -r '.sha') sha=",\"sha\":\"$sha\"" message="Updating $message" - elif [ ! $type == "null" ]; then + elif [ ! "$type" == "null" ]; then >&2 echo "Wrong type '$type'" return 1 else message="Creating $message" fi - content=`base64 -i "$src"` + content=$(base64 -i "$src") data="{\"branch\":\"gh-pages\",\"message\":\"$message\",\"content\":\"$content\"$sha}" echo "$data" | curl -s -k -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3.raw+json" -X PUT --data @- "https://api.github.com/repos/$GITHUB_REPOSITORY/contents/$path" } -function git_safe_upload_to_pages(){ +function git_safe_upload_to_pages { local path=$1 local file="$2" - local name=$(basename "$file") - local size=`get_file_size "$file"` - local upload_res=`git_upload_to_pages "$path" "$file"` - if [ $? -ne 0 ]; then + local name + local size + local upload_res + + name=$(basename "$file") + size=$(get_file_size "$file") + + if ! upload_res=$(git_upload_to_pages "$path" "$file"); then >&2 echo "ERROR: Failed to upload '$name' ($?)" return 1 fi - up_size=`echo "$upload_res" | jq -r '.content.size'` - if [ $up_size -ne $size ]; then + + up_size=$(echo "$upload_res" | jq -r '.content.size') + if [ "$up_size" -ne "$size" ]; then >&2 echo "ERROR: Uploaded size does not match! $up_size != $size" #git_delete_asset return 1 @@ -131,15 +157,20 @@ function git_safe_upload_to_pages(){ return $? } -function merge_package_json(){ +function merge_package_json { local jsonLink=$1 local jsonOut=$2 local old_json=$OUTPUT_DIR/oldJson.json local merged_json=$OUTPUT_DIR/mergedJson.json + local error_code=0 echo "Downloading previous JSON $jsonLink ..." curl -L -o "$old_json" "https://github.com/$GITHUB_REPOSITORY/releases/download/$jsonLink?access_token=$GITHUB_TOKEN" 2>/dev/null - if [ $? -ne 0 ]; then echo "ERROR: Download Failed! $?"; exit 1; fi + error_code=$? + if [ $error_code -ne 0 ]; then + echo "ERROR: Download Failed! $error_code" + exit 1 + fi echo "Creating new JSON ..." set +e @@ -147,7 +178,7 @@ function merge_package_json(){ set -e set -v - if [ ! -s $merged_json ]; then + if [ ! -s "$merged_json" ]; then rm -f "$merged_json" echo "Nothing to merge" else @@ -188,9 +219,10 @@ else done # Copy only relevant variant files mkdir "$PKG_DIR/variants/" - for variant in `cat ${PKG_DIR}/boards.txt | grep "\.variant=" | cut -d= -f2` ; do + board_list=$(cat "${PKG_DIR}"/boards.txt | grep "\.variant=" | cut -d= -f2) + while IFS= read -r variant; do cp -Rf "$GITHUB_WORKSPACE/variants/${variant}" "$PKG_DIR/variants/" - done + done <<< "$board_list" fi cp -f "$GITHUB_WORKSPACE/CMakeLists.txt" "$PKG_DIR/" cp -f "$GITHUB_WORKSPACE/idf_component.yml" "$PKG_DIR/" @@ -233,34 +265,36 @@ sed "s/{runtime\.platform\.path}.tools.xtensa-esp-elf/\\{runtime.tools.$X32TC_NE sed 's/{runtime\.platform\.path}.tools.riscv32-esp-elf-gdb/\{runtime.tools.riscv32-esp-elf-gdb.path\}/g' | \ sed "s/{runtime\.platform\.path}.tools.riscv32-esp-elf/\\{runtime.tools.$RVTC_NEW_NAME.path\\}/g" | \ sed 's/{runtime\.platform\.path}.tools.esptool/\{runtime.tools.esptool_py.path\}/g' | \ -sed 's/{runtime\.platform\.path}.tools.openocd-esp32/\{runtime.tools.openocd-esp32.path\}/g' \ - > "$PKG_DIR/platform.txt" +sed 's/{runtime\.platform\.path}.tools.openocd-esp32/\{runtime.tools.openocd-esp32.path\}/g' > "$PKG_DIR/platform.txt" -if ! [ -z ${VENDOR} ]; then +if [ -n "${VENDOR}" ]; then # Append vendor name to platform.txt to create a separate section sed -i "/^name=.*/s/$/ ($VENDOR)/" "$PKG_DIR/platform.txt" fi # Add header with version information echo "Generating core_version.h ..." -ver_define=`echo $RELEASE_TAG | tr "[:lower:].\055" "[:upper:]_"` -ver_hex=`git -C "$GITHUB_WORKSPACE" rev-parse --short=8 HEAD 2>/dev/null` -echo \#define ARDUINO_ESP32_GIT_VER 0x$ver_hex > "$PKG_DIR/cores/esp32/core_version.h" -echo \#define ARDUINO_ESP32_GIT_DESC `git -C "$GITHUB_WORKSPACE" describe --tags 2>/dev/null` >> "$PKG_DIR/cores/esp32/core_version.h" -echo \#define ARDUINO_ESP32_RELEASE_$ver_define >> "$PKG_DIR/cores/esp32/core_version.h" -echo \#define ARDUINO_ESP32_RELEASE \"$ver_define\" >> "$PKG_DIR/cores/esp32/core_version.h" +ver_define=$(echo "$RELEASE_TAG" | tr "[:lower:].\055" "[:upper:]_") +ver_hex=$(git -C "$GITHUB_WORKSPACE" rev-parse --short=8 HEAD 2>/dev/null) +echo \#define ARDUINO_ESP32_GIT_VER 0x"$ver_hex" > "$PKG_DIR/cores/esp32/core_version.h" +echo \#define ARDUINO_ESP32_GIT_DESC "$(git -C "$GITHUB_WORKSPACE" describe --tags 2>/dev/null)" >> "$PKG_DIR/cores/esp32/core_version.h" +echo \#define ARDUINO_ESP32_RELEASE_"$ver_define" >> "$PKG_DIR/cores/esp32/core_version.h" +echo \#define ARDUINO_ESP32_RELEASE \""$ver_define"\" >> "$PKG_DIR/cores/esp32/core_version.h" # Compress package folder echo "Creating ZIP ..." pushd "$OUTPUT_DIR" >/dev/null zip -qr "$PACKAGE_ZIP" "$PACKAGE_NAME" -if [ $? -ne 0 ]; then echo "ERROR: Failed to create $PACKAGE_ZIP ($?)"; exit 1; fi +if [ $? -ne 0 ]; then + echo "ERROR: Failed to create $PACKAGE_ZIP ($?)" + exit 1 +fi # Calculate SHA-256 echo "Calculating SHA sum ..." PACKAGE_PATH="$OUTPUT_DIR/$PACKAGE_ZIP" -PACKAGE_SHA=`shasum -a 256 "$PACKAGE_ZIP" | cut -f 1 -d ' '` -PACKAGE_SIZE=`get_file_size "$PACKAGE_ZIP"` +PACKAGE_SHA=$(shasum -a 256 "$PACKAGE_ZIP" | cut -f 1 -d ' ') +PACKAGE_SIZE=$(get_file_size "$PACKAGE_ZIP") popd >/dev/null rm -rf "$PKG_DIR" echo "'$PACKAGE_ZIP' Created! Size: $PACKAGE_SIZE, SHA-256: $PACKAGE_SHA" @@ -268,7 +302,7 @@ echo # Upload package to release page echo "Uploading package to release page ..." -PACKAGE_URL=`git_safe_upload_asset "$PACKAGE_PATH"` +PACKAGE_URL=$(git_safe_upload_asset "$PACKAGE_PATH") echo "Package Uploaded" echo "Download URL: $PACKAGE_URL" echo @@ -276,9 +310,9 @@ echo ## ## TEMP WORKAROUND FOR RV32 LONG PATH ON WINDOWS ## -RVTC_VERSION=`cat $PACKAGE_JSON_TEMPLATE | jq -r ".packages[0].platforms[0].toolsDependencies[] | select(.name == \"$RVTC_NAME\") | .version" | cut -d '_' -f 2` +RVTC_VERSION=$(cat "$PACKAGE_JSON_TEMPLATE" | jq -r ".packages[0].platforms[0].toolsDependencies[] | select(.name == \"$RVTC_NAME\") | .version" | cut -d '_' -f 2) # RVTC_VERSION=`date -j -f '%Y%m%d' "$RVTC_VERSION" '+%y%m'` # MacOS -RVTC_VERSION=`date -d "$RVTC_VERSION" '+%y%m'` +RVTC_VERSION=$(date -d "$RVTC_VERSION" '+%y%m') rvtc_jq_arg="\ (.packages[0].platforms[0].toolsDependencies[] | select(.name==\"$RVTC_NAME\")).version = \"$RVTC_VERSION\" |\ (.packages[0].platforms[0].toolsDependencies[] | select(.name==\"$RVTC_NAME\")).name = \"$RVTC_NEW_NAME\" |\ @@ -303,17 +337,20 @@ jq_arg=".packages[0].platforms[0].version = \"$RELEASE_TAG\" | \ .packages[0].platforms[0].checksum = \"SHA-256:$PACKAGE_SHA\"" # Generate package JSONs -echo "Genarating $PACKAGE_JSON_DEV ..." +echo "Generating $PACKAGE_JSON_DEV ..." cat "$PACKAGE_JSON_TEMPLATE" | jq "$jq_arg" > "$OUTPUT_DIR/$PACKAGE_JSON_DEV" if [ "$RELEASE_PRE" == "false" ]; then - echo "Genarating $PACKAGE_JSON_REL ..." + echo "Generating $PACKAGE_JSON_REL ..." cat "$PACKAGE_JSON_TEMPLATE" | jq "$jq_arg" > "$OUTPUT_DIR/$PACKAGE_JSON_REL" fi # Figure out the last release or pre-release echo "Getting previous releases ..." -releasesJson=`curl -sH "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/$GITHUB_REPOSITORY/releases" 2>/dev/null` -if [ $? -ne 0 ]; then echo "ERROR: Get Releases Failed! ($?)"; exit 1; fi +releasesJson=$(curl -sH "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/$GITHUB_REPOSITORY/releases" 2>/dev/null) +if [ $? -ne 0 ]; then + echo "ERROR: Get Releases Failed! ($?)" + exit 1 +fi set +e prev_release=$(echo "$releasesJson" | jq -e -r ". | map(select(.draft == false and .prerelease == false)) | sort_by(.published_at | - fromdateiso8601) | .[0].tag_name") @@ -333,13 +370,13 @@ echo "Previous (any)release: $prev_any_release" echo # Merge package JSONs with previous releases -if [ ! -z "$prev_any_release" ] && [ "$prev_any_release" != "null" ]; then +if [ -n "$prev_any_release" ] && [ "$prev_any_release" != "null" ]; then echo "Merging with JSON from $prev_any_release ..." merge_package_json "$prev_any_release/$PACKAGE_JSON_DEV" "$OUTPUT_DIR/$PACKAGE_JSON_DEV" fi if [ "$RELEASE_PRE" == "false" ]; then - if [ ! -z "$prev_release" ] && [ "$prev_release" != "null" ]; then + if [ -n "$prev_release" ] && [ "$prev_release" != "null" ]; then echo "Merging with JSON from $prev_release ..." merge_package_json "$prev_release/$PACKAGE_JSON_REL" "$OUTPUT_DIR/$PACKAGE_JSON_REL" fi @@ -349,21 +386,30 @@ fi echo "Installing arduino-cli ..." export PATH="/home/runner/bin:$PATH" -source ./.github/scripts/install-arduino-cli.sh +source "${SCRIPTS_DIR}/install-arduino-cli.sh" echo "Testing $PACKAGE_JSON_DEV install ..." echo "Installing esp32 ..." arduino-cli core install esp32:esp32 --additional-urls "file://$OUTPUT_DIR/$PACKAGE_JSON_DEV" -if [ $? -ne 0 ]; then echo "ERROR: Failed to install esp32 ($?)"; exit 1; fi +if [ $? -ne 0 ]; then + echo "ERROR: Failed to install esp32 ($?)" + exit 1 +fi echo "Compiling example ..." -arduino-cli compile --fqbn esp32:esp32:esp32 $GITHUB_WORKSPACE/libraries/ESP32/examples/CI/CIBoardsTest/CIBoardsTest.ino -if [ $? -ne 0 ]; then echo "ERROR: Failed to compile example ($?)"; exit 1; fi +arduino-cli compile --fqbn esp32:esp32:esp32 "$GITHUB_WORKSPACE"/libraries/ESP32/examples/CI/CIBoardsTest/CIBoardsTest.ino +if [ $? -ne 0 ]; then + echo "ERROR: Failed to compile example ($?)" + exit 1 +fi echo "Uninstalling esp32 ..." arduino-cli core uninstall esp32:esp32 -if [ $? -ne 0 ]; then echo "ERROR: Failed to uninstall esp32 ($?)"; exit 1; fi +if [ $? -ne 0 ]; then + echo "ERROR: Failed to uninstall esp32 ($?)" + exit 1 +fi echo "Test successful!" @@ -372,15 +418,24 @@ if [ "$RELEASE_PRE" == "false" ]; then echo "Installing esp32 ..." arduino-cli core install esp32:esp32 --additional-urls "file://$OUTPUT_DIR/$PACKAGE_JSON_REL" - if [ $? -ne 0 ]; then echo "ERROR: Failed to install esp32 ($?)"; exit 1; fi + if [ $? -ne 0 ]; then + echo "ERROR: Failed to install esp32 ($?)" + exit 1 + fi echo "Compiling example ..." - arduino-cli compile --fqbn esp32:esp32:esp32 $GITHUB_WORKSPACE/libraries/ESP32/examples/CI/CIBoardsTest/CIBoardsTest.ino - if [ $? -ne 0 ]; then echo "ERROR: Failed to compile example ($?)"; exit 1; fi + arduino-cli compile --fqbn esp32:esp32:esp32 "$GITHUB_WORKSPACE"/libraries/ESP32/examples/CI/CIBoardsTest/CIBoardsTest.ino + if [ $? -ne 0 ]; then + echo "ERROR: Failed to compile example ($?)" + exit 1 + fi echo "Uninstalling esp32 ..." arduino-cli core uninstall esp32:esp32 - if [ $? -ne 0 ]; then echo "ERROR: Failed to uninstall esp32 ($?)"; exit 1; fi + if [ $? -ne 0 ]; then + echo "ERROR: Failed to uninstall esp32 ($?)" + exit 1 + fi echo "Test successful!" fi @@ -388,13 +443,13 @@ fi # Upload package JSONs echo "Uploading $PACKAGE_JSON_DEV ..." -echo "Download URL: "`git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_DEV"` -echo "Pages URL: "`git_safe_upload_to_pages "$PACKAGE_JSON_DEV" "$OUTPUT_DIR/$PACKAGE_JSON_DEV"` +echo "Download URL: $(git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_DEV")" +echo "Pages URL: $(git_safe_upload_to_pages "$PACKAGE_JSON_DEV" "$OUTPUT_DIR/$PACKAGE_JSON_DEV")" echo if [ "$RELEASE_PRE" == "false" ]; then echo "Uploading $PACKAGE_JSON_REL ..." - echo "Download URL: "`git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_REL"` - echo "Pages URL: "`git_safe_upload_to_pages "$PACKAGE_JSON_REL" "$OUTPUT_DIR/$PACKAGE_JSON_REL"` + echo "Download URL: $(git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_REL")" + echo "Pages URL: $(git_safe_upload_to_pages "$PACKAGE_JSON_REL" "$OUTPUT_DIR/$PACKAGE_JSON_REL")" echo fi diff --git a/.github/scripts/set_push_chunks.sh b/.github/scripts/set_push_chunks.sh index 11a93a7159d..047cae6efd8 100644 --- a/.github/scripts/set_push_chunks.sh +++ b/.github/scripts/set_push_chunks.sh @@ -11,23 +11,23 @@ elif [[ $LIB_CHANGED == 'true' ]]; then echo "Libraries changed. Building only affected sketches." if [[ $NETWORKING_CHANGED == 'true' ]]; then echo "Networking libraries changed. Building networking related sketches." - networking_sketches="$(find libraries/WiFi -name *.ino) " - networking_sketches+="$(find libraries/Ethernet -name *.ino) " - networking_sketches+="$(find libraries/PPP -name *.ino) " - networking_sketches+="$(find libraries/NetworkClientSecure -name *.ino) " - networking_sketches+="$(find libraries/WebServer -name *.ino) " + networking_sketches="$(find libraries/WiFi -name '*.ino') " + networking_sketches+="$(find libraries/Ethernet -name '*.ino') " + networking_sketches+="$(find libraries/PPP -name '*.ino') " + networking_sketches+="$(find libraries/NetworkClientSecure -name '*.ino') " + networking_sketches+="$(find libraries/WebServer -name '*.ino') " fi if [[ $FS_CHANGED == 'true' ]]; then echo "FS libraries changed. Building FS related sketches." - fs_sketches="$(find libraries/SD -name *.ino) " - fs_sketches+="$(find libraries/SD_MMC -name *.ino) " - fs_sketches+="$(find libraries/SPIFFS -name *.ino) " - fs_sketches+="$(find libraries/LittleFS -name *.ino) " - fs_sketches+="$(find libraries/FFat -name *.ino) " + fs_sketches="$(find libraries/SD -name '*.ino') " + fs_sketches+="$(find libraries/SD_MMC -name '*.ino') " + fs_sketches+="$(find libraries/SPIFFS -name '*.ino') " + fs_sketches+="$(find libraries/LittleFS -name '*.ino') " + fs_sketches+="$(find libraries/FFat -name '*.ino') " fi sketches="$networking_sketches $fs_sketches" for file in $LIB_FILES; do - lib=$(echo $file | awk -F "/" '{print $1"/"$2}') + lib=$(echo "$file" | awk -F "/" '{print $1"/"$2}') if [[ "$file" == *.ino ]]; then # If file ends with .ino, add it to the list of sketches echo "Sketch found: $file" @@ -36,14 +36,14 @@ elif [[ $LIB_CHANGED == 'true' ]]; then # If file is inside the src directory, find all sketches in the lib/examples directory echo "Library src file found: $file" if [[ -d $lib/examples ]]; then - lib_sketches=$(find $lib/examples -name *.ino) + lib_sketches=$(find "$lib"/examples -name '*.ino') sketches+="$lib_sketches " echo "Library sketches: $lib_sketches" fi else # If file is in a example folder but it is not a sketch, find all sketches in the current directory echo "File in example folder found: $file" - sketch=$(find $(dirname $file) -name *.ino) + sketch=$(find "$(dirname "$file")" -name '*.ino') sketches+="$sketch " echo "Sketch in example folder: $sketch" fi @@ -53,9 +53,9 @@ fi if [[ -n $sketches ]]; then # Remove duplicates - sketches=$(echo $sketches | tr ' ' '\n' | sort | uniq) + sketches=$(echo "$sketches" | tr ' ' '\n' | sort | uniq) for sketch in $sketches; do - echo $sketch >> sketches_found.txt + echo "$sketch" >> sketches_found.txt chunks_count=$((chunks_count+1)) done echo "Number of sketches found: $chunks_count" @@ -69,15 +69,17 @@ if [[ -n $sketches ]]; then fi chunks='["0"' -for i in $(seq 1 $(( $chunks_count - 1 )) ); do +for i in $(seq 1 $(( chunks_count - 1 )) ); do chunks+=",\"$i\"" done chunks+="]" -echo "build_all=$build_all" >> $GITHUB_OUTPUT -echo "build_libraries=$BUILD_LIBRARIES" >> $GITHUB_OUTPUT -echo "build_static_sketches=$BUILD_STATIC_SKETCHES" >> $GITHUB_OUTPUT -echo "build_idf=$BUILD_IDF" >> $GITHUB_OUTPUT -echo "build_platformio=$BUILD_PLATFORMIO" >> $GITHUB_OUTPUT -echo "chunk_count=$chunks_count" >> $GITHUB_OUTPUT -echo "chunks=$chunks" >> $GITHUB_OUTPUT +{ + echo "build_all=$build_all" + echo "build_libraries=$BUILD_LIBRARIES" + echo "build_static_sketches=$BUILD_STATIC_SKETCHES" + echo "build_idf=$BUILD_IDF" + echo "build_platformio=$BUILD_PLATFORMIO" + echo "chunk_count=$chunks_count" + echo "chunks=$chunks" +} >> "$GITHUB_OUTPUT" diff --git a/.github/scripts/sketch_utils.sh b/.github/scripts/sketch_utils.sh index 385322f7dfc..3e6ceb675e9 100755 --- a/.github/scripts/sketch_utils.sh +++ b/.github/scripts/sketch_utils.sh @@ -8,10 +8,12 @@ else SDKCONFIG_DIR="tools/esp32-arduino-libs" fi -function check_requirements(){ # check_requirements +function check_requirements { # check_requirements local sketchdir=$1 local sdkconfig_path=$2 local has_requirements=1 + local requirements + local requirements_or if [ ! -f "$sdkconfig_path" ] || [ ! -f "$sketchdir/ci.json" ]; then echo "ERROR: sdkconfig or ci.json not found" 1>&2 @@ -19,10 +21,10 @@ function check_requirements(){ # check_requirements # CI will fail and the user will know that the sketch has a problem. else # Check if the sketch requires any configuration options (AND) - local requirements=$(jq -r '.requires[]? // empty' "$sketchdir/ci.json") + requirements=$(jq -r '.requires[]? // empty' "$sketchdir/ci.json") if [[ "$requirements" != "null" && "$requirements" != "" ]]; then for requirement in $requirements; do - requirement=$(echo $requirement | xargs) + requirement=$(echo "$requirement" | xargs) found_line=$(grep -E "^$requirement" "$sdkconfig_path") if [[ "$found_line" == "" ]]; then has_requirements=0 @@ -31,11 +33,11 @@ function check_requirements(){ # check_requirements fi # Check if the sketch requires any configuration options (OR) - local requirements_or=$(jq -r '.requires_any[]? // empty' "$sketchdir/ci.json") + requirements_or=$(jq -r '.requires_any[]? // empty' "$sketchdir/ci.json") if [[ "$requirements_or" != "null" && "$requirements_or" != "" ]]; then local found=false for requirement in $requirements_or; do - requirement=$(echo $requirement | xargs) + requirement=$(echo "$requirement" | xargs) found_line=$(grep -E "^$requirement" "$sdkconfig_path") if [[ "$found_line" != "" ]]; then found=true @@ -51,8 +53,8 @@ function check_requirements(){ # check_requirements echo $has_requirements } -function build_sketch(){ # build_sketch [extra-options] - while [ ! -z "$1" ]; do +function build_sketch { # build_sketch [extra-options] + while [ -n "$1" ]; do case "$1" in -ai ) shift @@ -97,10 +99,10 @@ function build_sketch(){ # build_sketch [ex shift done - xtra_opts=$* + xtra_opts=("$@") len=0 - if [ -z $sketchdir ]; then + if [ -z "$sketchdir" ]; then echo "ERROR: Sketch directory not provided" echo "$USAGE" exit 1 @@ -108,8 +110,8 @@ function build_sketch(){ # build_sketch [ex # No FQBN was passed, try to get it from other options - if [ -z $fqbn ]; then - if [ -z $target ]; then + if [ -z "$fqbn" ]; then + if [ -z "$target" ]; then echo "ERROR: Unspecified chip" echo "$USAGE" exit 1 @@ -120,25 +122,25 @@ function build_sketch(){ # build_sketch [ex # precedence. Note that the following logic also falls to the default # parameters if no arguments were passed and no file was found. - if [ -z $options ] && [ -f $sketchdir/ci.json ]; then + if [ -z "$options" ] && [ -f "$sketchdir"/ci.json ]; then # The config file could contain multiple FQBNs for one chip. If # that's the case we build one time for every FQBN. - len=`jq -r --arg target $target '.fqbn[$target] | length' $sketchdir/ci.json` - if [ $len -gt 0 ]; then - fqbn=`jq -r --arg target $target '.fqbn[$target] | sort' $sketchdir/ci.json` + len=$(jq -r --arg target "$target" '.fqbn[$target] | length' "$sketchdir"/ci.json) + if [ "$len" -gt 0 ]; then + fqbn=$(jq -r --arg target "$target" '.fqbn[$target] | sort' "$sketchdir"/ci.json) fi fi - if [ ! -z $options ] || [ $len -eq 0 ]; then + if [ -n "$options" ] || [ "$len" -eq 0 ]; then # Since we are passing options, we will end up with only one FQBN to # build. len=1 - if [ -f $sketchdir/ci.json ]; then - fqbn_append=`jq -r '.fqbn_append' $sketchdir/ci.json` - if [ $fqbn_append == "null" ]; then + if [ -f "$sketchdir"/ci.json ]; then + fqbn_append=$(jq -r '.fqbn_append' "$sketchdir"/ci.json) + if [ "$fqbn_append" == "null" ]; then fqbn_append="" fi fi @@ -189,6 +191,10 @@ function build_sketch(){ # build_sketch [ex [ -n "${options:-$esp32p4_opts}" ] && opt=":${options:-$esp32p4_opts}" fqbn="espressif:esp32:esp32p4$opt" ;; + *) + echo "ERROR: Invalid chip: $target" + exit 1 + ;; esac # Make it look like a JSON array. @@ -207,7 +213,7 @@ function build_sketch(){ # build_sketch [ex exit 1 fi - # The directory that will hold all the artifcats (the build directory) is + # The directory that will hold all the artifacts (the build directory) is # provided through: # 1. An env variable called ARDUINO_BUILD_DIR. # 2. Created at the sketch level as "build" in the case of a single @@ -215,17 +221,18 @@ function build_sketch(){ # build_sketch [ex # 3. Created at the sketch level as "buildX" where X is the number # of configuration built in case of a multiconfiguration test. - sketchname=$(basename $sketchdir) + sketchname=$(basename "$sketchdir") + local has_requirements - if [ -f $sketchdir/ci.json ]; then + if [ -f "$sketchdir"/ci.json ]; then # If the target is listed as false, skip the sketch. Otherwise, include it. - is_target=$(jq -r --arg target $target '.targets[$target]' $sketchdir/ci.json) + is_target=$(jq -r --arg target "$target" '.targets[$target]' "$sketchdir"/ci.json) if [[ "$is_target" == "false" ]]; then echo "Skipping $sketchname for target $target" exit 0 fi - local has_requirements=$(check_requirements "$sketchdir" "$SDKCONFIG_DIR/$target/sdkconfig") + has_requirements=$(check_requirements "$sketchdir" "$SDKCONFIG_DIR/$target/sdkconfig") if [ "$has_requirements" == "0" ]; then echo "Target $target does not meet the requirements for $sketchname. Skipping." exit 0 @@ -235,7 +242,7 @@ function build_sketch(){ # build_sketch [ex ARDUINO_CACHE_DIR="$HOME/.arduino/cache.tmp" if [ -n "$ARDUINO_BUILD_DIR" ]; then build_dir="$ARDUINO_BUILD_DIR" - elif [ $len -eq 1 ]; then + elif [ "$len" -eq 1 ]; then # build_dir="$sketchdir/build" build_dir="$HOME/.arduino/tests/$sketchname/build.tmp" fi @@ -244,51 +251,49 @@ function build_sketch(){ # build_sketch [ex sizes_file="$GITHUB_WORKSPACE/cli_compile_$chunk_index.json" mkdir -p "$ARDUINO_CACHE_DIR" - for i in `seq 0 $(($len - 1))` - do - if [ $len -ne 1 ]; then - # build_dir="$sketchdir/build$i" - build_dir="$HOME/.arduino/tests/$sketchname/build$i.tmp" + for i in $(seq 0 $((len - 1))); do + if [ "$len" -ne 1 ]; then + # build_dir="$sketchdir/build$i" + build_dir="$HOME/.arduino/tests/$sketchname/build$i.tmp" fi - rm -rf $build_dir - mkdir -p $build_dir + rm -rf "$build_dir" + mkdir -p "$build_dir" - currfqbn=`echo $fqbn | jq -r --argjson i $i '.[$i]'` + currfqbn=$(echo "$fqbn" | jq -r --argjson i "$i" '.[$i]') if [ -f "$ide_path/arduino-cli" ]; then echo "Building $sketchname with arduino-cli and FQBN=$currfqbn" - curroptions=`echo "$currfqbn" | cut -d':' -f4` - currfqbn=`echo "$currfqbn" | cut -d':' -f1-3` - $ide_path/arduino-cli compile \ + curroptions=$(echo "$currfqbn" | cut -d':' -f4) + currfqbn=$(echo "$currfqbn" | cut -d':' -f1-3) + "$ide_path"/arduino-cli compile \ --fqbn "$currfqbn" \ --board-options "$curroptions" \ --warnings "all" \ --build-property "compiler.warning_flags.all=-Wall -Werror=all -Wextra" \ - --build-cache-path "$ARDUINO_CACHE_DIR" \ --build-path "$build_dir" \ - $xtra_opts "${sketchdir}" \ - 2>&1 | tee $output_file + "${xtra_opts[@]}" "${sketchdir}" \ + 2>&1 | tee "$output_file" exit_status=${PIPESTATUS[0]} - if [ $exit_status -ne 0 ]; then + if [ "$exit_status" -ne 0 ]; then echo "ERROR: Compilation failed with error code $exit_status" - exit $exit_status + exit "$exit_status" fi - if [ $log_compilation ]; then + if [ -n "$log_compilation" ]; then #Extract the program storage space and dynamic memory usage in bytes and percentage in separate variables from the output, just the value without the string - flash_bytes=$(grep -oE 'Sketch uses ([0-9]+) bytes' $output_file | awk '{print $3}') - flash_percentage=$(grep -oE 'Sketch uses ([0-9]+) bytes \(([0-9]+)%\)' $output_file | awk '{print $5}' | tr -d '(%)') - ram_bytes=$(grep -oE 'Global variables use ([0-9]+) bytes' $output_file | awk '{print $4}') - ram_percentage=$(grep -oE 'Global variables use ([0-9]+) bytes \(([0-9]+)%\)' $output_file | awk '{print $6}' | tr -d '(%)') + flash_bytes=$(grep -oE 'Sketch uses ([0-9]+) bytes' "$output_file" | awk '{print $3}') + flash_percentage=$(grep -oE 'Sketch uses ([0-9]+) bytes \(([0-9]+)%\)' "$output_file" | awk '{print $5}' | tr -d '(%)') + ram_bytes=$(grep -oE 'Global variables use ([0-9]+) bytes' "$output_file" | awk '{print $4}') + ram_percentage=$(grep -oE 'Global variables use ([0-9]+) bytes \(([0-9]+)%\)' "$output_file" | awk '{print $6}' | tr -d '(%)') # Extract the directory path excluding the filename directory_path=$(dirname "$sketch") # Define the constant part constant_part="/home/runner/Arduino/hardware/espressif/esp32/libraries/" - # Extract the desired substring using sed - lib_sketch_name=$(echo "$directory_path" | sed "s|$constant_part||") + # Extract the desired substring + lib_sketch_name="${directory_path#"$constant_part"}" #append json file where key is fqbn, sketch name, sizes -> extracted values echo "{\"name\": \"$lib_sketch_name\", \"sizes\": [{ @@ -304,15 +309,15 @@ function build_sketch(){ # build_sketch [ex echo "Building $sketchname with arduino-builder and FQBN=$currfqbn" echo "Build path = $build_dir" - $ide_path/arduino-builder -compile -logger=human -core-api-version=10810 \ - -fqbn=\"$currfqbn\" \ + "$ide_path"/arduino-builder -compile -logger=human -core-api-version=10810 \ + -fqbn=\""$currfqbn"\" \ -warnings="all" \ -tools "$ide_path/tools-builder" \ -hardware "$user_path/hardware" \ -libraries "$user_path/libraries" \ -build-cache "$ARDUINO_CACHE_DIR" \ -build-path "$build_dir" \ - $xtra_opts "${sketchdir}/${sketchname}.ino" + "${xtra_opts[@]}" "${sketchdir}/${sketchname}.ino" exit_status=$? if [ $exit_status -ne 0 ]; then @@ -339,15 +344,16 @@ function build_sketch(){ # build_sketch [ex unset options } -function count_sketches(){ # count_sketches [target] [file] [ignore-requirements] +function count_sketches { # count_sketches [target] [file] [ignore-requirements] local path=$1 local target=$2 local ignore_requirements=$3 local file=$4 + local sketches if [ $# -lt 1 ]; then - echo "ERROR: Illegal number of parameters" - echo "USAGE: ${0} count [target]" + echo "ERROR: Illegal number of parameters" + echo "USAGE: ${0} count [target]" fi rm -rf sketches.txt @@ -357,42 +363,47 @@ function count_sketches(){ # count_sketches [target] [file] [ignore-requi fi if [ -f "$file" ]; then - local sketches=$(cat $file) + sketches=$(cat "$file") else - local sketches=$(find $path -name *.ino | sort) + sketches=$(find "$path" -name '*.ino' | sort) fi local sketchnum=0 for sketch in $sketches; do - local sketchdir=$(dirname $sketch) - local sketchdirname=$(basename $sketchdir) - local sketchname=$(basename $sketch) + local sketchdir + local sketchdirname + local sketchname + local has_requirements + + sketchdir=$(dirname "$sketch") + sketchdirname=$(basename "$sketchdir") + sketchname=$(basename "$sketch") + if [[ "$sketchdirname.ino" != "$sketchname" ]]; then continue elif [[ -n $target ]] && [[ -f $sketchdir/ci.json ]]; then # If the target is listed as false, skip the sketch. Otherwise, include it. - is_target=$(jq -r --arg target $target '.targets[$target]' $sketchdir/ci.json) + is_target=$(jq -r --arg target "$target" '.targets[$target]' "$sketchdir"/ci.json) if [[ "$is_target" == "false" ]]; then continue fi if [ "$ignore_requirements" != "1" ]; then - local has_requirements=$(check_requirements "$sketchdir" "$SDKCONFIG_DIR/$target/sdkconfig") + has_requirements=$(check_requirements "$sketchdir" "$SDKCONFIG_DIR/$target/sdkconfig") if [ "$has_requirements" == "0" ]; then continue fi fi fi - echo $sketch >> sketches.txt - sketchnum=$(($sketchnum + 1)) + echo "$sketch" >> sketches.txt + sketchnum=$((sketchnum + 1)) done return $sketchnum } -function build_sketches(){ # build_sketches [extra-options] - - local args="" - while [ ! -z "$1" ]; do +function build_sketches { # build_sketches [extra-options] + local args=() + while [ -n "$1" ]; do case $1 in -ai ) shift @@ -405,12 +416,12 @@ function build_sketches(){ # build_sketches info/wokwi_types.txt echo "[$targets]" > info/targets.txt -echo "build-types=[$build_types]" >> $GITHUB_OUTPUT -echo "hw-types=[$hw_types]" >> $GITHUB_OUTPUT -echo "wokwi-types=[$wokwi_types]" >> $GITHUB_OUTPUT -echo "qemu-types=[$qemu_types]" >> $GITHUB_OUTPUT -echo "targets=[$targets]" >> $GITHUB_OUTPUT +{ + echo "build-types=[$build_types]" + echo "hw-types=[$hw_types]" + echo "wokwi-types=[$wokwi_types]" + echo "qemu-types=[$qemu_types]" + echo "targets=[$targets]" +} >> "$GITHUB_OUTPUT" diff --git a/.github/scripts/tests_run.sh b/.github/scripts/tests_run.sh index 16b0f2fb500..513fd16b371 100755 --- a/.github/scripts/tests_run.sh +++ b/.github/scripts/tests_run.sh @@ -1,126 +1,130 @@ #!/bin/bash -function run_test() { +function run_test { local target=$1 local sketch=$2 local options=$3 local erase_flash=$4 - local sketchdir=$(dirname $sketch) - local sketchname=$(basename $sketchdir) + local sketchdir + local sketchname local result=0 local error=0 local sdkconfig_path + local extra_args - if [ $options -eq 0 ] && [ -f $sketchdir/ci.json ]; then - len=`jq -r --arg target $target '.fqbn[$target] | length' $sketchdir/ci.json` - if [ $len -eq 0 ]; then + sketchdir=$(dirname "$sketch") + sketchname=$(basename "$sketchdir") + + if [ "$options" -eq 0 ] && [ -f "$sketchdir"/ci.json ]; then + len=$(jq -r --arg target "$target" '.fqbn[$target] | length' "$sketchdir"/ci.json) + if [ "$len" -eq 0 ]; then len=1 fi else len=1 fi - if [ $len -eq 1 ]; then + if [ "$len" -eq 1 ]; then sdkconfig_path="$HOME/.arduino/tests/$sketchname/build.tmp/sdkconfig" else sdkconfig_path="$HOME/.arduino/tests/$sketchname/build0.tmp/sdkconfig" fi - if [ -f $sketchdir/ci.json ]; then + if [ -f "$sketchdir"/ci.json ]; then # If the target or platform is listed as false, skip the sketch. Otherwise, include it. - is_target=$(jq -r --arg target $target '.targets[$target]' $sketchdir/ci.json) - selected_platform=$(jq -r --arg platform $platform '.platforms[$platform]' $sketchdir/ci.json) + is_target=$(jq -r --arg target "$target" '.targets[$target]' "$sketchdir"/ci.json) + selected_platform=$(jq -r --arg platform "$platform" '.platforms[$platform]' "$sketchdir"/ci.json) if [[ $is_target == "false" ]] || [[ $selected_platform == "false" ]]; then - printf "\033[93mSkipping $sketchname test for $target, platform: $platform\033[0m\n" + printf "\033[93mSkipping %s test for %s, platform: %s\033[0m\n" "$sketchname" "$target" "$platform" printf "\n\n\n" return 0 fi fi - if [ ! -f $sdkconfig_path ]; then - printf "\033[93mSketch $sketchname not built\nMight be due to missing target requirements or build failure\033[0m\n" + if [ ! -f "$sdkconfig_path" ]; then + printf "\033[93mSketch %s not built\nMight be due to missing target requirements or build failure\033[0m\n" "$sketchname" printf "\n\n\n" return 0 fi - local right_target=$(grep -E "^CONFIG_IDF_TARGET=\"$target\"$" "$sdkconfig_path") + local right_target + right_target=$(grep -E "^CONFIG_IDF_TARGET=\"$target\"$" "$sdkconfig_path") if [ -z "$right_target" ]; then - printf "\033[91mError: Sketch $sketchname compiled for different target\n\033[0m\n" + printf "\033[91mError: Sketch %s compiled for different target\n\033[0m\n" "$sketchname" printf "\n\n\n" return 1 fi - if [ $len -eq 1 ]; then - # build_dir="$sketchdir/build" - build_dir="$HOME/.arduino/tests/$sketchname/build.tmp" - report_file="$sketchdir/$target/$sketchname.xml" + if [ "$len" -eq 1 ]; then + # build_dir="$sketchdir/build" + build_dir="$HOME/.arduino/tests/$sketchname/build.tmp" + report_file="$sketchdir/$target/$sketchname.xml" fi - for i in `seq 0 $(($len - 1))` - do + for i in $(seq 0 $((len - 1))); do fqbn="Default" - if [ $len -ne 1 ]; then - fqbn=`jq -r --arg target $target --argjson i $i '.fqbn[$target] | sort | .[$i]' $sketchdir/ci.json` - elif [ -f $sketchdir/ci.json ]; then - has_fqbn=`jq -r --arg target $target '.fqbn[$target]' $sketchdir/ci.json` + if [ "$len" -ne 1 ]; then + fqbn=$(jq -r --arg target "$target" --argjson i "$i" '.fqbn[$target] | sort | .[$i]' "$sketchdir"/ci.json) + elif [ -f "$sketchdir"/ci.json ]; then + has_fqbn=$(jq -r --arg target "$target" '.fqbn[$target]' "$sketchdir"/ci.json) if [ "$has_fqbn" != "null" ]; then - fqbn=`jq -r --arg target $target '.fqbn[$target] | .[0]' $sketchdir/ci.json` + fqbn=$(jq -r --arg target "$target" '.fqbn[$target] | .[0]' "$sketchdir"/ci.json) fi fi - printf "\033[95mRunning test: $sketchname -- Config: $fqbn\033[0m\n" - if [ $erase_flash -eq 1 ]; then - esptool.py -c $target erase_flash + printf "\033[95mRunning test: %s -- Config: %s\033[0m\n" "$sketchname" "$fqbn" + if [ "$erase_flash" -eq 1 ]; then + esptool.py -c "$target" erase_flash fi - if [ $len -ne 1 ]; then + if [ "$len" -ne 1 ]; then # build_dir="$sketchdir/build$i" build_dir="$HOME/.arduino/tests/$sketchname/build$i.tmp" report_file="$sketchdir/$target/$sketchname$i.xml" fi if [ $platform == "wokwi" ]; then - extra_args="--target $target --embedded-services arduino,wokwi --wokwi-timeout=$wokwi_timeout" + extra_args=("--target" "$target" "--embedded-services" "arduino,wokwi" "--wokwi-timeout=$wokwi_timeout") if [[ -f "$sketchdir/scenario.yaml" ]]; then - extra_args+=" --wokwi-scenario $sketchdir/scenario.yaml" + extra_args+=("--wokwi-scenario" "$sketchdir/scenario.yaml") fi if [[ -f "$sketchdir/diagram.$target.json" ]]; then - extra_args+=" --wokwi-diagram $sketchdir/diagram.$target.json" + extra_args+=("--wokwi-diagram" "$sketchdir/diagram.$target.json") fi elif [ $platform == "qemu" ]; then PATH=$HOME/qemu/bin:$PATH - extra_args="--embedded-services qemu --qemu-image-path $build_dir/$sketchname.ino.merged.bin" + extra_args=("--embedded-services" "qemu" "--qemu-image-path" "$build_dir/$sketchname.ino.merged.bin") - if [ $target == "esp32" ] || [ $target == "esp32s3" ]; then - extra_args+=" --qemu-prog-path qemu-system-xtensa --qemu-cli-args=\"-machine $target -m 4M -nographic\"" - elif [ $target == "esp32c3" ]; then - extra_args+=" --qemu-prog-path qemu-system-riscv32 --qemu-cli-args=\"-machine $target -icount 3 -nographic\"" + if [ "$target" == "esp32" ] || [ "$target" == "esp32s3" ]; then + extra_args+=("--qemu-prog-path" "qemu-system-xtensa" "--qemu-cli-args=\"-machine $target -m 4M -nographic\"") + elif [ "$target" == "esp32c3" ]; then + extra_args+=("--qemu-prog-path" "qemu-system-riscv32" "--qemu-cli-args=\"-machine $target -icount 3 -nographic\"") else - printf "\033[91mUnsupported QEMU target: $target\033[0m\n" + printf "\033[91mUnsupported QEMU target: %s\033[0m\n" "$target" exit 1 fi else - extra_args="--embedded-services esp,arduino" + extra_args=("--embedded-services" "esp,arduino") fi - rm $sketchdir/diagram.json 2>/dev/null || true + rm "$sketchdir"/diagram.json 2>/dev/null || true result=0 - printf "\033[95mpytest $sketchdir/test_$sketchname.py --build-dir $build_dir --junit-xml=$report_file $extra_args\033[0m\n" - bash -c "set +e; pytest $sketchdir/test_$sketchname.py --build-dir $build_dir --junit-xml=$report_file $extra_args; exit \$?" || result=$? + printf "\033[95mpytest \"%s/test_%s.py\" --build-dir \"%s\" --junit-xml=\"%s\" %s\033[0m\n" "$sketchdir" "$sketchname" "$build_dir" "$report_file" "${extra_args[*]@Q}" + bash -c "set +e; pytest \"$sketchdir/test_$sketchname.py\" --build-dir \"$build_dir\" --junit-xml=\"$report_file\" ${extra_args[*]@Q}; exit \$?" || result=$? printf "\n" if [ $result -ne 0 ]; then result=0 - printf "\033[95mRetrying test: $sketchname -- Config: $i\033[0m\n" - printf "\033[95mpytest $sketchdir/test_$sketchname.py --build-dir $build_dir --junit-xml=$report_file $extra_args\033[0m\n" - bash -c "set +e; pytest $sketchdir/test_$sketchname.py --build-dir $build_dir --junit-xml=$report_file $extra_args; exit \$?" || result=$? + printf "\033[95mRetrying test: %s -- Config: %s\033[0m\n" "$sketchname" "$i" + printf "\033[95mpytest \"%s/test_%s.py\" --build-dir \"%s\" --junit-xml=\"%s\" %s\033[0m\n" "$sketchdir" "$sketchname" "$build_dir" "$report_file" "${extra_args[*]@Q}" + bash -c "set +e; pytest \"$sketchdir/test_$sketchname.py\" --build-dir \"$build_dir\" --junit-xml=\"$report_file\" ${extra_args[*]@Q}; exit \$?" || result=$? printf "\n" if [ $result -ne 0 ]; then - printf "\033[91mFailed test: $sketchname -- Config: $i\033[0m\n\n" - error=$result + printf "\033[91mFailed test: %s -- Config: %s\033[0m\n\n" "$sketchname" "$i" + error=$result fi fi done @@ -136,13 +140,13 @@ chunk_run=0 options=0 erase=0 -while [ ! -z "$1" ]; do +while [ -n "$1" ]; do case $1 in -c ) chunk_run=1 ;; -Q ) - if [ ! -d $QEMU_PATH ]; then + if [ ! -d "$QEMU_PATH" ]; then echo "QEMU path $QEMU_PATH does not exist" exit 1 fi @@ -188,98 +192,97 @@ while [ ! -z "$1" ]; do test_type=$1 ;; * ) - break - ;; + break + ;; esac shift done if [ ! $platform == "qemu" ]; then - source ${SCRIPTS_DIR}/install-arduino-ide.sh + source "${SCRIPTS_DIR}/install-arduino-ide.sh" fi # If sketch is provided and test type is not, test type is inferred from the sketch path if [[ $test_type == "all" ]] || [[ -z $test_type ]]; then if [ -n "$sketch" ]; then - tmp_sketch_path=$(find tests -name $sketch.ino) - test_type=$(basename $(dirname $(dirname "$tmp_sketch_path"))) + tmp_sketch_path=$(find tests -name "$sketch".ino) + test_type=$(basename "$(dirname "$(dirname "$tmp_sketch_path")")") echo "Sketch $sketch test type: $test_type" test_folder="$PWD/tests/$test_type" else - test_folder="$PWD/tests" + test_folder="$PWD/tests" fi else test_folder="$PWD/tests/$test_type" fi if [ $chunk_run -eq 0 ]; then - if [ -z $sketch ]; then + if [ -z "$sketch" ]; then echo "ERROR: Sketch name is required for single test run" exit 1 fi - run_test $target $test_folder/$sketch/$sketch.ino $options $erase + run_test "$target" "$test_folder"/"$sketch"/"$sketch".ino $options $erase exit $? else - if [ "$chunk_max" -le 0 ]; then - echo "ERROR: Chunks count must be positive number" - exit 1 - fi - - if [ "$chunk_index" -ge "$chunk_max" ] && [ "$chunk_max" -ge 2 ]; then - echo "ERROR: Chunk index must be less than chunks count" - exit 1 - fi - - set +e - # Ignore requirements as we don't have the libs. The requirements will be checked in the run_test function - ${COUNT_SKETCHES} "$test_folder" "$target" "1" - sketchcount=$? - set -e - sketches=$(cat sketches.txt) - rm -rf sketches.txt - - chunk_size=$(( $sketchcount / $chunk_max )) - all_chunks=$(( $chunk_max * $chunk_size )) - if [ "$all_chunks" -lt "$sketchcount" ]; then - chunk_size=$(( $chunk_size + 1 )) - fi - - start_index=0 - end_index=0 - if [ "$chunk_index" -ge "$chunk_max" ]; then - start_index=$chunk_index - end_index=$sketchcount - else - start_index=$(( $chunk_index * $chunk_size )) - if [ "$sketchcount" -le "$start_index" ]; then - exit 0 - fi - - end_index=$(( $(( $chunk_index + 1 )) * $chunk_size )) - if [ "$end_index" -gt "$sketchcount" ]; then - end_index=$sketchcount - fi - fi - - start_num=$(( $start_index + 1 )) - sketchnum=0 - error=0 - - for sketch in $sketches; do - - sketchnum=$(($sketchnum + 1)) - if [ "$sketchnum" -le "$start_index" ] \ - || [ "$sketchnum" -gt "$end_index" ]; then - continue - fi - - printf "\033[95mSketch Index $(($sketchnum - 1))\033[0m\n" - - exit_code=0 - run_test $target $sketch $options $erase || exit_code=$? - if [ $exit_code -ne 0 ]; then - error=$exit_code - fi - done - exit $error + if [ "$chunk_max" -le 0 ]; then + echo "ERROR: Chunks count must be positive number" + exit 1 + fi + + if [ "$chunk_index" -ge "$chunk_max" ] && [ "$chunk_max" -ge 2 ]; then + echo "ERROR: Chunk index must be less than chunks count" + exit 1 + fi + + set +e + # Ignore requirements as we don't have the libs. The requirements will be checked in the run_test function + ${COUNT_SKETCHES} "$test_folder" "$target" "1" + sketchcount=$? + set -e + sketches=$(cat sketches.txt) + rm -rf sketches.txt + + chunk_size=$(( sketchcount / chunk_max )) + all_chunks=$(( chunk_max * chunk_size )) + if [ "$all_chunks" -lt "$sketchcount" ]; then + chunk_size=$(( chunk_size + 1 )) + fi + + start_index=0 + end_index=0 + if [ "$chunk_index" -ge "$chunk_max" ]; then + start_index=$chunk_index + end_index=$sketchcount + else + start_index=$(( chunk_index * chunk_size )) + if [ "$sketchcount" -le "$start_index" ]; then + exit 0 + fi + + end_index=$(( $(( chunk_index + 1 )) * chunk_size )) + if [ "$end_index" -gt "$sketchcount" ]; then + end_index=$sketchcount + fi + fi + + sketchnum=0 + error=0 + + for sketch in $sketches; do + + sketchnum=$((sketchnum + 1)) + if [ "$sketchnum" -le "$start_index" ] \ + || [ "$sketchnum" -gt "$end_index" ]; then + continue + fi + + printf "\033[95mSketch Index %s\033[0m\n" "$((sketchnum - 1))" + + exit_code=0 + run_test "$target" "$sketch" $options $erase || exit_code=$? + if [ $exit_code -ne 0 ]; then + error=$exit_code + fi + done + exit $error fi diff --git a/.github/scripts/update-version.sh b/.github/scripts/update-version.sh index cbc31378b15..9a38b27a57a 100755 --- a/.github/scripts/update-version.sh +++ b/.github/scripts/update-version.sh @@ -1,20 +1,21 @@ #!/bin/bash +# shellcheck disable=SC2002 # For reference: add tools for all boards by replacing one line in each board # "[board].upload.tool=esptool_py" to "[board].upload.tool=esptool_py\n[board].upload.tool.default=esptool_py\n[board].upload.tool.network=esp_ota" #cat boards.txt | sed "s/\([a-zA-Z0-9_\-]*\)\.upload\.tool\=esptool_py/\1\.upload\.tool\=esptool_py\\n\1\.upload\.tool\.default\=esptool_py\\n\1\.upload\.tool\.network\=esp_ota/" if [ ! $# -eq 3 ]; then - echo "Bad number of arguments: $#" >&2 - echo "usage: $0 " >&2 - exit 1 + echo "Bad number of arguments: $#" >&2 + echo "usage: $0 " >&2 + exit 1 fi re='^[0-9]+$' if [[ ! $1 =~ $re ]] || [[ ! $2 =~ $re ]] || [[ ! $3 =~ $re ]] ; then - echo "error: Not a valid version: $1.$2.$3" >&2 - echo "usage: $0 " >&2 - exit 1 + echo "error: Not a valid version: $1.$2.$3" >&2 + echo "usage: $0 " >&2 + exit 1 fi ESP_ARDUINO_VERSION_MAJOR="$1" @@ -36,11 +37,12 @@ sed "s/#define ESP_ARDUINO_VERSION_MAJOR.*/#define ESP_ARDUINO_VERSION_MAJOR $ES sed "s/#define ESP_ARDUINO_VERSION_MINOR.*/#define ESP_ARDUINO_VERSION_MINOR $ESP_ARDUINO_VERSION_MINOR/g" | \ sed "s/#define ESP_ARDUINO_VERSION_PATCH.*/#define ESP_ARDUINO_VERSION_PATCH $ESP_ARDUINO_VERSION_PATCH/g" > __esp_arduino_version.h && mv __esp_arduino_version.h cores/esp32/esp_arduino_version.h -for lib in `ls libraries`; do - if [ -f "libraries/$lib/library.properties" ]; then - echo "Updating Library $lib..." - cat "libraries/$lib/library.properties" | sed "s/version=.*/version=$ESP_ARDUINO_VERSION/g" > "libraries/$lib/__library.properties" && mv "libraries/$lib/__library.properties" "libraries/$lib/library.properties" - fi +libraries=$(find libraries -maxdepth 1 -mindepth 1 -type d -exec basename {} \;) +for lib in $libraries; do + if [ -f "libraries/$lib/library.properties" ]; then + echo "Updating Library $lib..." + cat "libraries/$lib/library.properties" | sed "s/version=.*/version=$ESP_ARDUINO_VERSION/g" > "libraries/$lib/__library.properties" && mv "libraries/$lib/__library.properties" "libraries/$lib/library.properties" + fi done exit 0 diff --git a/.github/scripts/upload_py_tools.sh b/.github/scripts/upload_py_tools.sh index 0544bccd710..abe18a50c6e 100755 --- a/.github/scripts/upload_py_tools.sh +++ b/.github/scripts/upload_py_tools.sh @@ -1,11 +1,12 @@ #!/bin/bash + CHANGED_FILES=$1 echo "Pushing '$CHANGED_FILES' as github-actions[bot]" git config --global github.user "github-actions[bot]" git config --global user.name "github-actions[bot]" git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" for tool in $CHANGED_FILES; do - git add tools/$tool.exe + git add tools/"$tool".exe done git commit -m "change(tools): Push generated binaries to PR" git push diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0ebb6f6ac4b..f80261422b0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,6 +14,7 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: "v5.0.0" hooks: + # Generic checks - id: check-case-conflict - id: check-symlinks - id: debug-statements @@ -25,6 +26,8 @@ repos: args: [--fix=lf] - id: trailing-whitespace args: [--markdown-linebreak-ext=md] + + # JSON formatting - id: pretty-format-json stages: [manual] args: [--autofix] @@ -35,40 +38,67 @@ repos: package\.json$| ^package\/.*$ ) + - repo: https://github.com/codespell-project/codespell rev: "v2.3.0" hooks: + # Spell checking - id: codespell exclude: ^.*\.(svd|SVD)$ + - repo: https://github.com/pre-commit/mirrors-clang-format rev: "v18.1.3" hooks: + # C/C++ formatting - id: clang-format types_or: [c, c++] exclude: ^.*\/build_opt\.h$ + - repo: https://github.com/psf/black-pre-commit-mirror rev: "24.10.0" hooks: + # Python formatting - id: black types_or: [python] args: [--line-length=120] #From the arduino code style. Add as argument rather than creating a new config file. + - repo: https://github.com/PyCQA/flake8 rev: "7.1.1" hooks: + # Python linting - id: flake8 types_or: [python] additional_dependencies: - flake8-bugbear - flake8-comprehensions - flake8-simplify + - repo: https://github.com/pre-commit/mirrors-prettier rev: "v3.1.0" hooks: + # YAML formatting - id: prettier types_or: [yaml] + + - repo: https://github.com/shellcheck-py/shellcheck-py + rev: "v0.10.0.1" + hooks: + # Bash linting + - id: shellcheck + types: [shell] + + - repo: https://github.com/openstack/bashate + rev: "2.1.1" + hooks: + # Bash formatting + - id: bashate + types: [shell] + args: ["-i", "E006"] # Ignore E006: Line too long + - repo: https://github.com/errata-ai/vale rev: "v3.9.1" hooks: + # Sync vale styles and lint markdown and reStructuredText - id: vale name: vale-sync language_version: "1.21.6" diff --git a/.shellcheckrc b/.shellcheckrc new file mode 100644 index 00000000000..a7612e611a2 --- /dev/null +++ b/.shellcheckrc @@ -0,0 +1,11 @@ +# Shellcheck configuration file for ESP32 Arduino core + +# Optional checks. https://github.com/koalaman/shellcheck/wiki/optional +enable=add-default-case,deprecate-which,avoid-nullary-conditions + +# Enable search for external sources +external-sources=true + +# Search folder for sourced files. +# Set to the folder where the original script is located. +source-path=SCRIPTDIR diff --git a/docs/en/contributing.rst b/docs/en/contributing.rst index 1e1529fb557..fb7843f1fb6 100644 --- a/docs/en/contributing.rst +++ b/docs/en/contributing.rst @@ -441,6 +441,16 @@ For checking the code style and other code quality checks, we use pre-commit hoo These hooks will be automatically run by the CI when a Pull Request is marked as ``Status: Pending Merge``. You can check which hooks are being run in the ``.pre-commit-config.yaml`` file. +Currently, we have hooks for the following tasks: + +* Formatters for C, C++, Python, Bash, JSON, Markdown and ReStructuredText files; +* Linters for Python, Bash and prose (spoken language); +* Checking for spelling errors in the code and documentation; +* Removing trailing whitespaces and tabs in the code; +* Checking for the presence of private keys and other sensitive information in the code; +* Fixing the line endings and end of files (EOF) in the code; +* And more. + You can read more about the pre-commit hooks in the `pre-commit documentation `_. If you want to run the pre-commit hooks locally, you first need to install the required dependencies by running: diff --git a/docs/utils.sh b/docs/utils.sh index 84f37489975..3a860ac8a2c 100644 --- a/docs/utils.sh +++ b/docs/utils.sh @@ -1,18 +1,19 @@ +#!/bin/bash # Bash helper functions for adding SSH keys -function add_ssh_keys() { - local key_string="${1}" - mkdir -p ~/.ssh - chmod 700 ~/.ssh - echo -n "${key_string}" >~/.ssh/id_rsa_base64 - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 >~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa +function add_ssh_keys { + local key_string="${1}" + mkdir -p ~/.ssh + chmod 700 ~/.ssh + echo -n "${key_string}" >~/.ssh/id_rsa_base64 + base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 >~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa } -function add_doc_server_ssh_keys() { - local key_string="${1}" - local server_url="${2}" - local server_user="${3}" - add_ssh_keys "${key_string}" - echo -e "Host ${server_url}\n\tStrictHostKeyChecking no\n\tUser ${server_user}\n" >>~/.ssh/config +function add_doc_server_ssh_keys { + local key_string="${1}" + local server_url="${2}" + local server_user="${3}" + add_ssh_keys "${key_string}" + echo -e "Host ${server_url}\n\tStrictHostKeyChecking no\n\tUser ${server_user}\n" >>~/.ssh/config } diff --git a/tools/add_lib.sh b/tools/add_lib.sh index 4ec73c4f7f7..9760f8114c6 100755 --- a/tools/add_lib.sh +++ b/tools/add_lib.sh @@ -1,4 +1,5 @@ #!/bin/bash + HELP="This script help to add library when using arduino-esp32 as an ESP-IDF component The script accepts up to three arguments: -n NEW: URL address to new library on GIThub (cannot be combined with -e) @@ -26,119 +27,126 @@ n_param="" # Parse the command-line arguments using getopts while getopts "he:l:n:" opt; do - case $opt in - h) - echo "$HELP" - exit 0 - ;; - e) - #e_param="$OPTARG" - e_param="${OPTARG/#~/$HOME}" - ;; - l) - #l_param="$OPTARG" - l_param="${OPTARG/#~/$HOME}" - ;; - n) - n_param=$OPTARG - ;; - \?) - echo "Invalid option: -$OPTARG" >&2 - echo $HELP - exit 1 - ;; - :) - echo "Option -$OPTARG requires an argument." >&2 - echo $HELP - exit 1 - ;; - esac + case $opt in + h) + echo "$HELP" + exit 0 + ;; + e) + #e_param="$OPTARG" + e_param="${OPTARG/#~/$HOME}" + ;; + l) + #l_param="$OPTARG" + l_param="${OPTARG/#~/$HOME}" + ;; + n) + n_param=$OPTARG + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + echo "$HELP" + exit 1 + ;; + :) + echo "Option -$OPTARG requires an argument." >&2 + echo "$HELP" + exit 1 + ;; + *) + echo "Invalid option: -$OPTARG" >&2 + echo "$HELP" + exit 1 + ;; + esac done # No parameter check if [[ -z "$e_param" ]] && [[ -z "$l_param" ]] && [[ -z "$n_param" ]]; then - echo "Error: No parameters" >&2 - echo "$HELP" - exit 1 + echo "Error: No parameters" >&2 + echo "$HELP" + exit 1 fi # Only local path check (not permitted) -if [[ -z "$e_param" ]] && [[ ! -z "$l_param" ]] && [[ -z "$n_param" ]]; then - echo "Error: -l parameter must be paired with -e or -n" >&2 - echo "$HELP" - exit 1 +if [[ -z "$e_param" ]] && [[ -n "$l_param" ]] && [[ -z "$n_param" ]]; then + echo "Error: -l parameter must be paired with -e or -n" >&2 + echo "$HELP" + exit 1 fi # Invalid combination check -if [[ ! -z $e_param ]] && [[ ! -z $n_param ]]; then - echo "ERROR: Cannot combine -n with -e" >&2 - echo "$HELP" - exit 1 +if [[ -n $e_param ]] && [[ -n $n_param ]]; then + echo "ERROR: Cannot combine -n with -e" >&2 + echo "$HELP" + exit 1 fi # Check existing lib -if [[ ! -z "$e_param" ]]; then - if [[ ! -d "${e_param/#~/$HOME}" ]]; then # this works! - echo "Error: existing library parameter - path does not exist" >&2 - exit 1 - fi +if [[ -n "$e_param" ]]; then + if [[ ! -d "${e_param/#~/$HOME}" ]]; then # this works! + echo "Error: existing library parameter - path does not exist" >&2 + exit 1 + fi fi LIBRARY="" # Only existing library was supplied -if [[ ! -z $e_param ]] && [[ -z $l_param ]] && [[ -z $n_param ]]; then - LIBRARY=$e_param +if [[ -n $e_param ]] && [[ -z $l_param ]] && [[ -z $n_param ]]; then + LIBRARY=$e_param fi # Install new lib -if [ ! -z $n_param ]; then - INSTALL_TARGET="" - if [ -z $l_param ]; then - # If local path for project is not supplied - use as INSTALL_TARGET Arduino libraries path - INSTALL_TARGET=$ARDUINO_LIBS_PATH/$(basename "$n_param") - else - INSTALL_TARGET=$l_param/components/$(basename "$n_param") - if [ ! -d "$l_param/components" ]; then - echo "Folder components does not exist yet: mkdir -p "$l_param/components"" - mkdir -p "$l_param/components" +if [ -n "$n_param" ]; then + INSTALL_TARGET="" + if [ -z "$l_param" ]; then + # If local path for project is not supplied - use as INSTALL_TARGET Arduino libraries path + INSTALL_TARGET=$ARDUINO_LIBS_PATH/$(basename "$n_param") + else + INSTALL_TARGET=$l_param/components/$(basename "$n_param") + if [ ! -d "$l_param/components" ]; then + echo "Folder components does not exist yet: mkdir -p \"$l_param/components\"" + mkdir -p "$l_param/components" + fi fi - fi - # clone the new lib - echo "Cloning: git clone --recursive $n_param $INSTALL_TARGET" - git clone --recursive $n_param $INSTALL_TARGET - LIBRARY=$INSTALL_TARGET + # clone the new lib + echo "Cloning: git clone --recursive $n_param $INSTALL_TARGET" + git clone --recursive "$n_param" "$INSTALL_TARGET" + LIBRARY=$INSTALL_TARGET fi # Copy existing lib to local project -if [[ ! -z $e_param ]] && [[ ! -z $l_param ]]; then - if [ ! -d "$l_param/components" ]; then - echo "Folder components does not exist yet: mkdir -p "$l_param/components"" - mkdir -p "$l_param/components" - fi - echo "Copy from $e_param to $l_param" - echo "cp -r $e_param $l_param/components/$(basename "$e_param")" - cp -r $e_param $l_param/components/$(basename "$e_param") - LIBRARY=$l_param/components/$(basename "$e_param") +if [[ -n $e_param ]] && [[ -n $l_param ]]; then + if [ ! -d "$l_param/components" ]; then + echo "Folder components does not exist yet: mkdir -p \"$l_param/components\"" + mkdir -p "$l_param/components" + fi + echo "Copy from $e_param to $l_param" + echo "cp -r $e_param $l_param/components/\"$(basename "$e_param")\"" + cp -r "$e_param" "$l_param"/components/"$(basename "$e_param")" + LIBRARY=$l_param/components/"$(basename "$e_param")" fi if [ -z "$LIBRARY" ]; then - echo "ERROR: No library path" >&2 - exit 1 + echo "ERROR: No library path" >&2 + exit 1 fi # 1. get the source list: -FILES=$(find $LIBRARY -name '*.c' -o -name '*.cpp' | xargs -I{} basename {}) +FILES=$(find "$LIBRARY" -print0 -name '*.c' -o -name '*.cpp' | xargs -0 -I{} basename {}) # Fresh start -if [ -f $LIBRARY/CMakeLists.txt ]; then - rm $LIBRARY/CMakeLists.txt - touch $LIBRARY/CMakeLists.txt +if [ -f "$LIBRARY"/CMakeLists.txt ]; then + rm "$LIBRARY"/CMakeLists.txt + touch "$LIBRARY"/CMakeLists.txt fi # Generate CMakeLists.txt -echo "idf_component_register(SRCS $(echo $FILES | sed -e 's/ /" "/g' | sed -e 's/^/"/' -e 's/$/"/')" >> $LIBRARY/CMakeLists.txt -echo " INCLUDE_DIRS \".\"" >> $LIBRARY/CMakeLists.txt -echo " REQUIRES \"arduino-esp32\"" >> $LIBRARY/CMakeLists.txt -echo " )" >> $LIBRARY/CMakeLists.txt +{ + echo "idf_component_register(SRCS $(echo "$FILES" | sed -e 's/ /" "/g' | sed -e 's/^/"/' -e 's/$/"/')" + echo " INCLUDE_DIRS \".\"" + echo " REQUIRES \"arduino-esp32\"" + echo " )" +} >> "$LIBRARY"/CMakeLists.txt From 19e4d0db4a5bc2f77c5222c0f12742ff9b98bf76 Mon Sep 17 00:00:00 2001 From: Michael Stegen Date: Mon, 9 Dec 2024 16:59:52 +0100 Subject: [PATCH 038/183] fix ESP32-U4WDH chip detection by ESP.getChipModel() (#10696) * fixes chip detection for ESP32-U4WDH --- cores/esp32/Esp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp32/Esp.cpp b/cores/esp32/Esp.cpp index 483e888f64f..f4d7c221bce 100644 --- a/cores/esp32/Esp.cpp +++ b/cores/esp32/Esp.cpp @@ -274,7 +274,7 @@ const char *EspClass::getChipModel(void) { return "ESP32-D0WD"; } case EFUSE_RD_CHIP_VER_PKG_ESP32D2WDQ5: return "ESP32-D2WD"; - case EFUSE_RD_CHIP_VER_PKG_ESP32PICOD2: return "ESP32-PICO-D2"; + case EFUSE_RD_CHIP_VER_PKG_ESP32U4WDH: return "ESP32-U4WDH"; case EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4: return "ESP32-PICO-D4"; case EFUSE_RD_CHIP_VER_PKG_ESP32PICOV302: return "ESP32-PICO-V3-02"; case EFUSE_RD_CHIP_VER_PKG_ESP32D0WDR2V3: return "ESP32-D0WDR2-V3"; From 2f21d6482b959349cd30f1c6ee7781e27971d8b1 Mon Sep 17 00:00:00 2001 From: Thomas Jentzsch <76921504+yellobyte@users.noreply.github.com> Date: Mon, 9 Dec 2024 18:26:43 +0100 Subject: [PATCH 039/183] add custom boards yb_esp32s3_amp v2 & v3 --- boards.txt | 419 ++++++++++++++++++++++ variants/yb_esp32s3_amp_v2/pins_arduino.h | 57 +++ variants/yb_esp32s3_amp_v3/pins_arduino.h | 60 ++++ 3 files changed, 536 insertions(+) create mode 100644 variants/yb_esp32s3_amp_v2/pins_arduino.h create mode 100644 variants/yb_esp32s3_amp_v3/pins_arduino.h diff --git a/boards.txt b/boards.txt index d7fc48820d1..8c1183377b1 100644 --- a/boards.txt +++ b/boards.txt @@ -47505,3 +47505,422 @@ Pcbcupid_GLYPH_C6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP Pcbcupid_GLYPH_C6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port ############################################################## +# YelloByte YB-ESP32-S3-AMP 2MB PSRAM (Rev.2) + +yb_esp32s3_amp_v2.name=YelloByte YB-ESP32-S3-AMP (Rev.2) + +yb_esp32s3_amp_v2.bootloader.tool=esptool_py +yb_esp32s3_amp_v2.bootloader.tool.default=esptool_py + +yb_esp32s3_amp_v2.upload.tool=esptool_py +yb_esp32s3_amp_v2.upload.tool.default=esptool_py +yb_esp32s3_amp_v2.upload.tool.network=esp_ota + +yb_esp32s3_amp_v2.upload.maximum_size=1310720 +yb_esp32s3_amp_v2.upload.maximum_data_size=327680 +yb_esp32s3_amp_v2.upload.flags= +yb_esp32s3_amp_v2.upload.extra_flags= +yb_esp32s3_amp_v2.upload.use_1200bps_touch=false +yb_esp32s3_amp_v2.upload.wait_for_upload_port=false + +yb_esp32s3_amp_v2.serial.disableDTR=false +yb_esp32s3_amp_v2.serial.disableRTS=false + +yb_esp32s3_amp_v2.build.tarch=xtensa +yb_esp32s3_amp_v2.build.bootloader_addr=0x0 +yb_esp32s3_amp_v2.build.target=esp32s3 +yb_esp32s3_amp_v2.build.mcu=esp32s3 +yb_esp32s3_amp_v2.build.core=esp32 +yb_esp32s3_amp_v2.build.variant=yb_esp32s3_amp_v2 +yb_esp32s3_amp_v2.build.board=YB_ESP32S3_AMP_V2 + +yb_esp32s3_amp_v2.build.usb_mode=1 +yb_esp32s3_amp_v2.build.cdc_on_boot=0 +yb_esp32s3_amp_v2.build.msc_on_boot=0 +yb_esp32s3_amp_v2.build.dfu_on_boot=0 +yb_esp32s3_amp_v2.build.f_cpu=240000000L +yb_esp32s3_amp_v2.build.flash_size=8MB +yb_esp32s3_amp_v2.build.flash_freq=80m +yb_esp32s3_amp_v2.build.flash_mode=dio +yb_esp32s3_amp_v2.build.boot=qio +yb_esp32s3_amp_v2.build.partitions=default +yb_esp32s3_amp_v2.build.defines= +yb_esp32s3_amp_v2.build.loop_core= +yb_esp32s3_amp_v2.build.event_core= +yb_esp32s3_amp_v2.build.flash_type=qio +yb_esp32s3_amp_v2.build.psram_type=qspi +yb_esp32s3_amp_v2.build.memory_type={build.flash_type}_{build.psram_type} + +yb_esp32s3_amp_v2.menu.JTAGAdapter.default=Disabled +yb_esp32s3_amp_v2.menu.JTAGAdapter.default.build.copy_jtag_files=0 +yb_esp32s3_amp_v2.menu.JTAGAdapter.external=FTDI Adapter +yb_esp32s3_amp_v2.menu.JTAGAdapter.external.build.openocdscript=esp32s3-ftdi.cfg +yb_esp32s3_amp_v2.menu.JTAGAdapter.external.build.copy_jtag_files=1 +yb_esp32s3_amp_v2.menu.JTAGAdapter.bridge=ESP USB Bridge +yb_esp32s3_amp_v2.menu.JTAGAdapter.bridge.build.openocdscript=esp32s3-bridge.cfg +yb_esp32s3_amp_v2.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +yb_esp32s3_amp_v2.menu.LoopCore.1=Core 1 +yb_esp32s3_amp_v2.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +yb_esp32s3_amp_v2.menu.LoopCore.0=Core 0 +yb_esp32s3_amp_v2.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +yb_esp32s3_amp_v2.menu.EventsCore.1=Core 1 +yb_esp32s3_amp_v2.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +yb_esp32s3_amp_v2.menu.EventsCore.0=Core 0 +yb_esp32s3_amp_v2.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +yb_esp32s3_amp_v2.menu.USBMode.hwcdc=Hardware CDC and JTAG +yb_esp32s3_amp_v2.menu.USBMode.hwcdc.build.usb_mode=1 +yb_esp32s3_amp_v2.menu.USBMode.default=USB-OTG (TinyUSB) +yb_esp32s3_amp_v2.menu.USBMode.default.build.usb_mode=0 + +yb_esp32s3_amp_v2.menu.CDCOnBoot.default=Disabled +yb_esp32s3_amp_v2.menu.CDCOnBoot.default.build.cdc_on_boot=0 +yb_esp32s3_amp_v2.menu.CDCOnBoot.cdc=Enabled +yb_esp32s3_amp_v2.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 + +yb_esp32s3_amp_v2.menu.MSCOnBoot.default=Disabled +yb_esp32s3_amp_v2.menu.MSCOnBoot.default.build.msc_on_boot=0 +yb_esp32s3_amp_v2.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +yb_esp32s3_amp_v2.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +yb_esp32s3_amp_v2.menu.DFUOnBoot.default=Disabled +yb_esp32s3_amp_v2.menu.DFUOnBoot.default.build.dfu_on_boot=0 +yb_esp32s3_amp_v2.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +yb_esp32s3_amp_v2.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +yb_esp32s3_amp_v2.menu.UploadMode.default=UART0 / Hardware CDC +yb_esp32s3_amp_v2.menu.UploadMode.default.upload.use_1200bps_touch=false +yb_esp32s3_amp_v2.menu.UploadMode.default.upload.wait_for_upload_port=false +yb_esp32s3_amp_v2.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +yb_esp32s3_amp_v2.menu.UploadMode.cdc.upload.use_1200bps_touch=true +yb_esp32s3_amp_v2.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +yb_esp32s3_amp_v2.menu.PSRAM.enabled=QSPI PSRAM +yb_esp32s3_amp_v2.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM +yb_esp32s3_amp_v2.menu.PSRAM.enabled.build.psram_type=qspi +yb_esp32s3_amp_v2.menu.PSRAM.disabled=Disabled +yb_esp32s3_amp_v2.menu.PSRAM.disabled.build.defines= +yb_esp32s3_amp_v2.menu.PSRAM.disabled.build.psram_type=qspi +yb_esp32s3_amp_v2.menu.PSRAM.opi=OPI PSRAM +yb_esp32s3_amp_v2.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM +yb_esp32s3_amp_v2.menu.PSRAM.opi.build.psram_type=opi + +yb_esp32s3_amp_v2.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +yb_esp32s3_amp_v2.menu.PartitionScheme.default.build.partitions=default +yb_esp32s3_amp_v2.menu.PartitionScheme.default_8MB=8M with spiffs (3MB APP/1.5MB SPIFFS) +yb_esp32s3_amp_v2.menu.PartitionScheme.default_8MB.build.partitions=default_8MB +yb_esp32s3_amp_v2.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 +yb_esp32s3_amp_v2.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +yb_esp32s3_amp_v2.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +yb_esp32s3_amp_v2.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +yb_esp32s3_amp_v2.menu.PartitionScheme.minimal.build.partitions=minimal +yb_esp32s3_amp_v2.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +yb_esp32s3_amp_v2.menu.PartitionScheme.no_ota.build.partitions=no_ota +yb_esp32s3_amp_v2.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +yb_esp32s3_amp_v2.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +yb_esp32s3_amp_v2.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +yb_esp32s3_amp_v2.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +yb_esp32s3_amp_v2.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +yb_esp32s3_amp_v2.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +yb_esp32s3_amp_v2.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +yb_esp32s3_amp_v2.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +yb_esp32s3_amp_v2.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +yb_esp32s3_amp_v2.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +yb_esp32s3_amp_v2.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +yb_esp32s3_amp_v2.menu.PartitionScheme.huge_app.build.partitions=huge_app +yb_esp32s3_amp_v2.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +yb_esp32s3_amp_v2.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +yb_esp32s3_amp_v2.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +yb_esp32s3_amp_v2.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 +yb_esp32s3_amp_v2.menu.PartitionScheme.max_app_8MB=Maximum APP (7.9MB APP No OTA/No FS) +yb_esp32s3_amp_v2.menu.PartitionScheme.max_app_8MB.build.partitions=max_app_8MB +yb_esp32s3_amp_v2.menu.PartitionScheme.max_app_8MB.upload.maximum_size=8257536 + +yb_esp32s3_amp_v2.menu.CPUFreq.240=240MHz (WiFi) +yb_esp32s3_amp_v2.menu.CPUFreq.240.build.f_cpu=240000000L +yb_esp32s3_amp_v2.menu.CPUFreq.160=160MHz (WiFi) +yb_esp32s3_amp_v2.menu.CPUFreq.160.build.f_cpu=160000000L +yb_esp32s3_amp_v2.menu.CPUFreq.80=80MHz (WiFi) +yb_esp32s3_amp_v2.menu.CPUFreq.80.build.f_cpu=80000000L +yb_esp32s3_amp_v2.menu.CPUFreq.40=40MHz +yb_esp32s3_amp_v2.menu.CPUFreq.40.build.f_cpu=40000000L +yb_esp32s3_amp_v2.menu.CPUFreq.20=20MHz +yb_esp32s3_amp_v2.menu.CPUFreq.20.build.f_cpu=20000000L +yb_esp32s3_amp_v2.menu.CPUFreq.10=10MHz +yb_esp32s3_amp_v2.menu.CPUFreq.10.build.f_cpu=10000000L + +yb_esp32s3_amp_v2.menu.FlashMode.qio=QIO 80MHz +yb_esp32s3_amp_v2.menu.FlashMode.qio.build.flash_mode=dio +yb_esp32s3_amp_v2.menu.FlashMode.qio.build.boot=qio +yb_esp32s3_amp_v2.menu.FlashMode.qio.build.boot_freq=80m +yb_esp32s3_amp_v2.menu.FlashMode.qio.build.flash_freq=80m +yb_esp32s3_amp_v2.menu.FlashMode.qio120=QIO 120MHz +yb_esp32s3_amp_v2.menu.FlashMode.qio120.build.flash_mode=dio +yb_esp32s3_amp_v2.menu.FlashMode.qio120.build.boot=qio +yb_esp32s3_amp_v2.menu.FlashMode.qio120.build.boot_freq=120m +yb_esp32s3_amp_v2.menu.FlashMode.qio120.build.flash_freq=80m +yb_esp32s3_amp_v2.menu.FlashMode.dio=DIO 80MHz +yb_esp32s3_amp_v2.menu.FlashMode.dio.build.flash_mode=dio +yb_esp32s3_amp_v2.menu.FlashMode.dio.build.boot=dio +yb_esp32s3_amp_v2.menu.FlashMode.dio.build.boot_freq=80m +yb_esp32s3_amp_v2.menu.FlashMode.dio.build.flash_freq=80m +yb_esp32s3_amp_v2.menu.FlashMode.opi=OPI 80MHz +yb_esp32s3_amp_v2.menu.FlashMode.opi.build.flash_mode=dout +yb_esp32s3_amp_v2.menu.FlashMode.opi.build.boot=opi +yb_esp32s3_amp_v2.menu.FlashMode.opi.build.boot_freq=80m +yb_esp32s3_amp_v2.menu.FlashMode.opi.build.flash_freq=80m + +yb_esp32s3_amp_v2.menu.FlashSize.4M=4MB (32Mb) +yb_esp32s3_amp_v2.menu.FlashSize.4M.build.flash_size=4MB +yb_esp32s3_amp_v2.menu.FlashSize.8M=8MB (64Mb) +yb_esp32s3_amp_v2.menu.FlashSize.8M.build.flash_size=8MB +yb_esp32s3_amp_v2.menu.FlashSize.16M=16MB (128Mb) +yb_esp32s3_amp_v2.menu.FlashSize.16M.build.flash_size=16MB + +yb_esp32s3_amp_v2.menu.UploadSpeed.921600=921600 +yb_esp32s3_amp_v2.menu.UploadSpeed.921600.upload.speed=921600 +yb_esp32s3_amp_v2.menu.UploadSpeed.115200=115200 +yb_esp32s3_amp_v2.menu.UploadSpeed.115200.upload.speed=115200 +yb_esp32s3_amp_v2.menu.UploadSpeed.256000.windows=256000 +yb_esp32s3_amp_v2.menu.UploadSpeed.256000.upload.speed=256000 +yb_esp32s3_amp_v2.menu.UploadSpeed.230400.windows.upload.speed=256000 +yb_esp32s3_amp_v2.menu.UploadSpeed.230400=230400 +yb_esp32s3_amp_v2.menu.UploadSpeed.230400.upload.speed=230400 +yb_esp32s3_amp_v2.menu.UploadSpeed.460800.linux=460800 +yb_esp32s3_amp_v2.menu.UploadSpeed.460800.macosx=460800 +yb_esp32s3_amp_v2.menu.UploadSpeed.460800.upload.speed=460800 +yb_esp32s3_amp_v2.menu.UploadSpeed.512000.windows=512000 +yb_esp32s3_amp_v2.menu.UploadSpeed.512000.upload.speed=512000 + +yb_esp32s3_amp_v2.menu.DebugLevel.none=None +yb_esp32s3_amp_v2.menu.DebugLevel.none.build.code_debug=0 +yb_esp32s3_amp_v2.menu.DebugLevel.error=Error +yb_esp32s3_amp_v2.menu.DebugLevel.error.build.code_debug=1 +yb_esp32s3_amp_v2.menu.DebugLevel.warn=Warn +yb_esp32s3_amp_v2.menu.DebugLevel.warn.build.code_debug=2 +yb_esp32s3_amp_v2.menu.DebugLevel.info=Info +yb_esp32s3_amp_v2.menu.DebugLevel.info.build.code_debug=3 +yb_esp32s3_amp_v2.menu.DebugLevel.debug=Debug +yb_esp32s3_amp_v2.menu.DebugLevel.debug.build.code_debug=4 +yb_esp32s3_amp_v2.menu.DebugLevel.verbose=Verbose +yb_esp32s3_amp_v2.menu.DebugLevel.verbose.build.code_debug=5 + +yb_esp32s3_amp_v2.menu.EraseFlash.none=Disabled +yb_esp32s3_amp_v2.menu.EraseFlash.none.upload.erase_cmd= +yb_esp32s3_amp_v2.menu.EraseFlash.all=Enabled +yb_esp32s3_amp_v2.menu.EraseFlash.all.upload.erase_cmd=-e + +############################################################## +# YelloByte YB-ESP32-S3-AMP 2MB PSRAM (Rev.3) + +yb_esp32s3_amp_v3.name=YelloByte YB-ESP32-S3-AMP (Rev.3) + +yb_esp32s3_amp_v3.bootloader.tool=esptool_py +yb_esp32s3_amp_v3.bootloader.tool.default=esptool_py + +yb_esp32s3_amp_v3.upload.tool=esptool_py +yb_esp32s3_amp_v3.upload.tool.default=esptool_py +yb_esp32s3_amp_v3.upload.tool.network=esp_ota + +yb_esp32s3_amp_v3.upload.maximum_size=1310720 +yb_esp32s3_amp_v3.upload.maximum_data_size=327680 +yb_esp32s3_amp_v3.upload.flags= +yb_esp32s3_amp_v3.upload.extra_flags= +yb_esp32s3_amp_v3.upload.use_1200bps_touch=false +yb_esp32s3_amp_v3.upload.wait_for_upload_port=false + +yb_esp32s3_amp_v3.serial.disableDTR=false +yb_esp32s3_amp_v3.serial.disableRTS=false + +yb_esp32s3_amp_v3.build.tarch=xtensa +yb_esp32s3_amp_v3.build.bootloader_addr=0x0 +yb_esp32s3_amp_v3.build.target=esp32s3 +yb_esp32s3_amp_v3.build.mcu=esp32s3 +yb_esp32s3_amp_v3.build.core=esp32 +yb_esp32s3_amp_v3.build.variant=yb_esp32s3_amp_v3 +yb_esp32s3_amp_v3.build.board=YB_ESP32S3_AMP_V3 + +yb_esp32s3_amp_v3.build.usb_mode=1 +yb_esp32s3_amp_v3.build.cdc_on_boot=1 +yb_esp32s3_amp_v3.build.msc_on_boot=0 +yb_esp32s3_amp_v3.build.dfu_on_boot=0 +yb_esp32s3_amp_v3.build.f_cpu=240000000L +yb_esp32s3_amp_v3.build.flash_size=8MB +yb_esp32s3_amp_v3.build.flash_freq=80m +yb_esp32s3_amp_v3.build.flash_mode=dio +yb_esp32s3_amp_v3.build.boot=qio +yb_esp32s3_amp_v3.build.partitions=default +yb_esp32s3_amp_v3.build.defines= +yb_esp32s3_amp_v3.build.loop_core= +yb_esp32s3_amp_v3.build.event_core= +yb_esp32s3_amp_v3.build.flash_type=qio +yb_esp32s3_amp_v3.build.psram_type=qspi +yb_esp32s3_amp_v3.build.memory_type={build.flash_type}_{build.psram_type} + +yb_esp32s3_amp_v3.menu.JTAGAdapter.default=Disabled +yb_esp32s3_amp_v3.menu.JTAGAdapter.default.build.copy_jtag_files=0 +yb_esp32s3_amp_v3.menu.JTAGAdapter.builtin=Integrated USB JTAG +yb_esp32s3_amp_v3.menu.JTAGAdapter.builtin.build.openocdscript=esp32s3-builtin.cfg +yb_esp32s3_amp_v3.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 +yb_esp32s3_amp_v3.menu.JTAGAdapter.external=FTDI Adapter +yb_esp32s3_amp_v3.menu.JTAGAdapter.external.build.openocdscript=esp32s3-ftdi.cfg +yb_esp32s3_amp_v3.menu.JTAGAdapter.external.build.copy_jtag_files=1 +yb_esp32s3_amp_v3.menu.JTAGAdapter.bridge=ESP USB Bridge +yb_esp32s3_amp_v3.menu.JTAGAdapter.bridge.build.openocdscript=esp32s3-bridge.cfg +yb_esp32s3_amp_v3.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +yb_esp32s3_amp_v3.menu.LoopCore.1=Core 1 +yb_esp32s3_amp_v3.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +yb_esp32s3_amp_v3.menu.LoopCore.0=Core 0 +yb_esp32s3_amp_v3.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +yb_esp32s3_amp_v3.menu.EventsCore.1=Core 1 +yb_esp32s3_amp_v3.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +yb_esp32s3_amp_v3.menu.EventsCore.0=Core 0 +yb_esp32s3_amp_v3.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +yb_esp32s3_amp_v3.menu.USBMode.hwcdc=Hardware CDC and JTAG +yb_esp32s3_amp_v3.menu.USBMode.hwcdc.build.usb_mode=1 +yb_esp32s3_amp_v3.menu.USBMode.default=USB-OTG (TinyUSB) +yb_esp32s3_amp_v3.menu.USBMode.default.build.usb_mode=0 + +yb_esp32s3_amp_v3.menu.CDCOnBoot.cdc=Enabled +yb_esp32s3_amp_v3.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 +yb_esp32s3_amp_v3.menu.CDCOnBoot.default=Disabled +yb_esp32s3_amp_v3.menu.CDCOnBoot.default.build.cdc_on_boot=0 + +yb_esp32s3_amp_v3.menu.MSCOnBoot.default=Disabled +yb_esp32s3_amp_v3.menu.MSCOnBoot.default.build.msc_on_boot=0 +yb_esp32s3_amp_v3.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +yb_esp32s3_amp_v3.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +yb_esp32s3_amp_v3.menu.DFUOnBoot.default=Disabled +yb_esp32s3_amp_v3.menu.DFUOnBoot.default.build.dfu_on_boot=0 +yb_esp32s3_amp_v3.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +yb_esp32s3_amp_v3.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +yb_esp32s3_amp_v3.menu.UploadMode.default=UART0 / Hardware CDC +yb_esp32s3_amp_v3.menu.UploadMode.default.upload.use_1200bps_touch=false +yb_esp32s3_amp_v3.menu.UploadMode.default.upload.wait_for_upload_port=false +yb_esp32s3_amp_v3.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +yb_esp32s3_amp_v3.menu.UploadMode.cdc.upload.use_1200bps_touch=true +yb_esp32s3_amp_v3.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +yb_esp32s3_amp_v3.menu.PSRAM.enabled=QSPI PSRAM +yb_esp32s3_amp_v3.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM +yb_esp32s3_amp_v3.menu.PSRAM.enabled.build.psram_type=qspi +yb_esp32s3_amp_v3.menu.PSRAM.disabled=Disabled +yb_esp32s3_amp_v3.menu.PSRAM.disabled.build.defines= +yb_esp32s3_amp_v3.menu.PSRAM.disabled.build.psram_type=qspi +yb_esp32s3_amp_v3.menu.PSRAM.opi=OPI PSRAM +yb_esp32s3_amp_v3.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM +yb_esp32s3_amp_v3.menu.PSRAM.opi.build.psram_type=opi + +yb_esp32s3_amp_v3.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +yb_esp32s3_amp_v3.menu.PartitionScheme.default.build.partitions=default +yb_esp32s3_amp_v3.menu.PartitionScheme.default_8MB=8M with spiffs (3MB APP/1.5MB SPIFFS) +yb_esp32s3_amp_v3.menu.PartitionScheme.default_8MB.build.partitions=default_8MB +yb_esp32s3_amp_v3.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 +yb_esp32s3_amp_v3.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +yb_esp32s3_amp_v3.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +yb_esp32s3_amp_v3.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +yb_esp32s3_amp_v3.menu.PartitionScheme.minimal.build.partitions=minimal +yb_esp32s3_amp_v3.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +yb_esp32s3_amp_v3.menu.PartitionScheme.no_ota.build.partitions=no_ota +yb_esp32s3_amp_v3.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +yb_esp32s3_amp_v3.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +yb_esp32s3_amp_v3.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +yb_esp32s3_amp_v3.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +yb_esp32s3_amp_v3.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +yb_esp32s3_amp_v3.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +yb_esp32s3_amp_v3.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +yb_esp32s3_amp_v3.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +yb_esp32s3_amp_v3.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +yb_esp32s3_amp_v3.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +yb_esp32s3_amp_v3.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +yb_esp32s3_amp_v3.menu.PartitionScheme.huge_app.build.partitions=huge_app +yb_esp32s3_amp_v3.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +yb_esp32s3_amp_v3.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +yb_esp32s3_amp_v3.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +yb_esp32s3_amp_v3.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 +yb_esp32s3_amp_v3.menu.PartitionScheme.max_app_8MB=Maximum APP (7.9MB APP No OTA/No FS) +yb_esp32s3_amp_v3.menu.PartitionScheme.max_app_8MB.build.partitions=max_app_8MB +yb_esp32s3_amp_v3.menu.PartitionScheme.max_app_8MB.upload.maximum_size=8257536 + +yb_esp32s3_amp_v3.menu.CPUFreq.240=240MHz (WiFi) +yb_esp32s3_amp_v3.menu.CPUFreq.240.build.f_cpu=240000000L +yb_esp32s3_amp_v3.menu.CPUFreq.160=160MHz (WiFi) +yb_esp32s3_amp_v3.menu.CPUFreq.160.build.f_cpu=160000000L +yb_esp32s3_amp_v3.menu.CPUFreq.80=80MHz (WiFi) +yb_esp32s3_amp_v3.menu.CPUFreq.80.build.f_cpu=80000000L +yb_esp32s3_amp_v3.menu.CPUFreq.40=40MHz +yb_esp32s3_amp_v3.menu.CPUFreq.40.build.f_cpu=40000000L +yb_esp32s3_amp_v3.menu.CPUFreq.20=20MHz +yb_esp32s3_amp_v3.menu.CPUFreq.20.build.f_cpu=20000000L +yb_esp32s3_amp_v3.menu.CPUFreq.10=10MHz +yb_esp32s3_amp_v3.menu.CPUFreq.10.build.f_cpu=10000000L + +yb_esp32s3_amp_v3.menu.FlashMode.qio=QIO 80MHz +yb_esp32s3_amp_v3.menu.FlashMode.qio.build.flash_mode=dio +yb_esp32s3_amp_v3.menu.FlashMode.qio.build.boot=qio +yb_esp32s3_amp_v3.menu.FlashMode.qio.build.boot_freq=80m +yb_esp32s3_amp_v3.menu.FlashMode.qio.build.flash_freq=80m +yb_esp32s3_amp_v3.menu.FlashMode.qio120=QIO 120MHz +yb_esp32s3_amp_v3.menu.FlashMode.qio120.build.flash_mode=dio +yb_esp32s3_amp_v3.menu.FlashMode.qio120.build.boot=qio +yb_esp32s3_amp_v3.menu.FlashMode.qio120.build.boot_freq=120m +yb_esp32s3_amp_v3.menu.FlashMode.qio120.build.flash_freq=80m +yb_esp32s3_amp_v3.menu.FlashMode.dio=DIO 80MHz +yb_esp32s3_amp_v3.menu.FlashMode.dio.build.flash_mode=dio +yb_esp32s3_amp_v3.menu.FlashMode.dio.build.boot=dio +yb_esp32s3_amp_v3.menu.FlashMode.dio.build.boot_freq=80m +yb_esp32s3_amp_v3.menu.FlashMode.dio.build.flash_freq=80m +yb_esp32s3_amp_v3.menu.FlashMode.opi=OPI 80MHz +yb_esp32s3_amp_v3.menu.FlashMode.opi.build.flash_mode=dout +yb_esp32s3_amp_v3.menu.FlashMode.opi.build.boot=opi +yb_esp32s3_amp_v3.menu.FlashMode.opi.build.boot_freq=80m +yb_esp32s3_amp_v3.menu.FlashMode.opi.build.flash_freq=80m + +yb_esp32s3_amp_v3.menu.FlashSize.4M=4MB (32Mb) +yb_esp32s3_amp_v3.menu.FlashSize.4M.build.flash_size=4MB +yb_esp32s3_amp_v3.menu.FlashSize.8M=8MB (64Mb) +yb_esp32s3_amp_v3.menu.FlashSize.8M.build.flash_size=8MB +yb_esp32s3_amp_v3.menu.FlashSize.16M=16MB (128Mb) +yb_esp32s3_amp_v3.menu.FlashSize.16M.build.flash_size=16MB + +yb_esp32s3_amp_v3.menu.UploadSpeed.921600=921600 +yb_esp32s3_amp_v3.menu.UploadSpeed.921600.upload.speed=921600 +yb_esp32s3_amp_v3.menu.UploadSpeed.115200=115200 +yb_esp32s3_amp_v3.menu.UploadSpeed.115200.upload.speed=115200 +yb_esp32s3_amp_v3.menu.UploadSpeed.256000.windows=256000 +yb_esp32s3_amp_v3.menu.UploadSpeed.256000.upload.speed=256000 +yb_esp32s3_amp_v3.menu.UploadSpeed.230400.windows.upload.speed=256000 +yb_esp32s3_amp_v3.menu.UploadSpeed.230400=230400 +yb_esp32s3_amp_v3.menu.UploadSpeed.230400.upload.speed=230400 +yb_esp32s3_amp_v3.menu.UploadSpeed.460800.linux=460800 +yb_esp32s3_amp_v3.menu.UploadSpeed.460800.macosx=460800 +yb_esp32s3_amp_v3.menu.UploadSpeed.460800.upload.speed=460800 +yb_esp32s3_amp_v3.menu.UploadSpeed.512000.windows=512000 +yb_esp32s3_amp_v3.menu.UploadSpeed.512000.upload.speed=512000 + +yb_esp32s3_amp_v3.menu.DebugLevel.none=None +yb_esp32s3_amp_v3.menu.DebugLevel.none.build.code_debug=0 +yb_esp32s3_amp_v3.menu.DebugLevel.error=Error +yb_esp32s3_amp_v3.menu.DebugLevel.error.build.code_debug=1 +yb_esp32s3_amp_v3.menu.DebugLevel.warn=Warn +yb_esp32s3_amp_v3.menu.DebugLevel.warn.build.code_debug=2 +yb_esp32s3_amp_v3.menu.DebugLevel.info=Info +yb_esp32s3_amp_v3.menu.DebugLevel.info.build.code_debug=3 +yb_esp32s3_amp_v3.menu.DebugLevel.debug=Debug +yb_esp32s3_amp_v3.menu.DebugLevel.debug.build.code_debug=4 +yb_esp32s3_amp_v3.menu.DebugLevel.verbose=Verbose +yb_esp32s3_amp_v3.menu.DebugLevel.verbose.build.code_debug=5 + +yb_esp32s3_amp_v3.menu.EraseFlash.none=Disabled +yb_esp32s3_amp_v3.menu.EraseFlash.none.upload.erase_cmd= +yb_esp32s3_amp_v3.menu.EraseFlash.all=Enabled +yb_esp32s3_amp_v3.menu.EraseFlash.all.upload.erase_cmd=-e + +############################################################## diff --git a/variants/yb_esp32s3_amp_v2/pins_arduino.h b/variants/yb_esp32s3_amp_v2/pins_arduino.h new file mode 100644 index 00000000000..9a626011606 --- /dev/null +++ b/variants/yb_esp32s3_amp_v2/pins_arduino.h @@ -0,0 +1,57 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +static const uint8_t LED_BUILTIN = 47; +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN + +static const uint8_t TX = 43; +static const uint8_t RX = 44; + +static const uint8_t SDA = 8; +static const uint8_t SCL = 9; + +//I2S for onboard MAX98357A only +static const uint8_t I2S_BCLK = 5; +static const uint8_t I2S_LRCLK = 6; +static const uint8_t I2S_DOUT = 7; + +// SPI for onboard microSD only +static const uint8_t SS = 10; +static const uint8_t MOSI = 11; +static const uint8_t MISO = 13; +static const uint8_t SCK = 12; + +// SPI2 for public usage +static const uint8_t SS2 = 38; +static const uint8_t MOSI2 = 39; +static const uint8_t MISO2 = 41; +static const uint8_t SCK2 = 40; + +static const uint8_t A0 = 1; +static const uint8_t A1 = 2; +static const uint8_t A2 = 3; +static const uint8_t A3 = 4; +static const uint8_t A4 = 8; +static const uint8_t A5 = 9; +static const uint8_t A6 = 10; +static const uint8_t A7 = 14; +static const uint8_t A8 = 15; +static const uint8_t A9 = 16; +static const uint8_t A10 = 17; +static const uint8_t A11 = 18; + +static const uint8_t T1 = 1; +static const uint8_t T2 = 2; +static const uint8_t T3 = 3; +static const uint8_t T4 = 4; +static const uint8_t T8 = 8; +static const uint8_t T9 = 9; +static const uint8_t T10 = 10; +static const uint8_t T14 = 14; + +#define PIN_DAC_MUTE 47 // only if solder bridge "DAC_MUTE" is closed + +#endif /* Pins_Arduino_h */ diff --git a/variants/yb_esp32s3_amp_v3/pins_arduino.h b/variants/yb_esp32s3_amp_v3/pins_arduino.h new file mode 100644 index 00000000000..8e59deda44b --- /dev/null +++ b/variants/yb_esp32s3_amp_v3/pins_arduino.h @@ -0,0 +1,60 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +#define USB_VID 0x303A +#define USB_PID 0x1001 + +static const uint8_t LED_BUILTIN = 47; +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN + +static const uint8_t TX = 43; +static const uint8_t RX = 44; + +static const uint8_t SDA = 8; +static const uint8_t SCL = 9; + +//I2S for onboard MAX98357A only +static const uint8_t I2S_BCLK = 5; +static const uint8_t I2S_LRCLK = 6; +static const uint8_t I2S_DOUT = 7; + +// SPI for onboard microSD only +static const uint8_t SS = 10; +static const uint8_t MOSI = 11; +static const uint8_t MISO = 13; +static const uint8_t SCK = 12; + +// SPI2 for public usage +static const uint8_t SS2 = 38; +static const uint8_t MOSI2 = 39; +static const uint8_t MISO2 = 41; +static const uint8_t SCK2 = 40; + +static const uint8_t A0 = 1; +static const uint8_t A1 = 2; +static const uint8_t A2 = 3; +static const uint8_t A3 = 4; +static const uint8_t A4 = 8; +static const uint8_t A5 = 9; +static const uint8_t A6 = 10; +static const uint8_t A7 = 14; +static const uint8_t A8 = 15; +static const uint8_t A9 = 16; +static const uint8_t A10 = 17; +static const uint8_t A11 = 18; + +static const uint8_t T1 = 1; +static const uint8_t T2 = 2; +static const uint8_t T3 = 3; +static const uint8_t T4 = 4; +static const uint8_t T8 = 8; +static const uint8_t T9 = 9; +static const uint8_t T10 = 10; +static const uint8_t T14 = 14; + +#define PIN_DAC_MUTE 47 // only if solder bridge "DAC_MUTE" is closed + +#endif /* Pins_Arduino_h */ From 2028ba43da3000e47e4bebd5a4d80ad695093db9 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 9 Dec 2024 19:03:54 -0300 Subject: [PATCH 040/183] fix(push): Re-comment unused code --- .github/workflows/push.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 0859551d589..4f30bdbb844 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -225,14 +225,13 @@ jobs: # fail-fast: false # matrix: # os: [ubuntu-latest, windows-latest, macOS-latest] - - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: "3.x" - - name: Build Sketches - run: bash ./.github/scripts/on-push.sh 1 1 #equal and non-zero to trigger PIO + # steps: + # - uses: actions/checkout@v4 + # - uses: actions/setup-python@v5 + # with: + # python-version: "3.x" + # - name: Build Sketches + # run: bash ./.github/scripts/on-push.sh 1 1 #equal and non-zero to trigger PIO # ESP-IDF component build build-esp-idf-component: From 538efe3b8c37ac8d0bdb1106911669f03a47f0c4 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 9 Dec 2024 19:30:05 -0300 Subject: [PATCH 041/183] feat(matter): adds new Temperature Sensor Matter Endpoint (#10698) * feat(matter): adds new temperature sensor matter endpoint * feat(matter): commentaries review and fixes * feat(matter): commentaries review and fixes * feat(matter): commentaries review and fixes * feat(matter): commentaries review and fixes * feat(matter): commentaries review and fixes * feat(matter): commentaries review and fixes * feat(matter): general commentaries and code review * feat(matter): keeping arduino style for local variables (lower case) * feat(matter): applies a generic temperature unit to the implementation and example * fix(matter): fixed problem with begin(float) implementation * fix(matter): fixed begin(float) initiallization * feat(matter): updated matter temperature keywords with new api * ci(pre-commit): Apply automatic fixes * fix(matter): fixed code spell ci errors in matter temperature sensor --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- CMakeLists.txt | 1 + .../MatterTemperatureSensor.ino | 94 ++++++++++++++++++ .../examples/MatterTemperatureSensor/ci.json | 7 ++ libraries/Matter/keywords.txt | 3 + libraries/Matter/src/Matter.h | 2 + .../MatterTemperatureSensor.cpp | 99 +++++++++++++++++++ .../MatterEndpoints/MatterTemperatureSensor.h | 63 ++++++++++++ 7 files changed, 269 insertions(+) create mode 100644 libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino create mode 100644 libraries/Matter/examples/MatterTemperatureSensor/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e4991d558d8..eba1a3fd824 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -175,6 +175,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp libraries/Matter/src/MatterEndpoints/MatterFan.cpp + libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS diff --git a/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino b/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino new file mode 100644 index 00000000000..216406d6082 --- /dev/null +++ b/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino @@ -0,0 +1,94 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + * This example is an example code that will create a Matter Device which can be + * commissioned and controlled from a Matter Environment APP. + * Additionally the ESP32 will send debug messages indicating the Matter activity. + * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. + */ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Matter Temperature Sensor Endpoint +MatterTemperatureSensor SimulatedTemperatureSensor; + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Simulate a temperature sensor - add your preferred temperature sensor library code here +float getSimulatedTemperature() { + // The Endpoint implementation keeps an int16_t as internal value information, + // which stores data in 1/100th of any temperature unit + static float simulatedTempHWSensor = -10.0; + + // it will increase from -10C to 10C in 0.5C steps to simulate a temperature sensor + simulatedTempHWSensor = simulatedTempHWSensor + 0.5; + if (simulatedTempHWSensor > 10) { + simulatedTempHWSensor = -10; + } + + return simulatedTempHWSensor; +} + +void setup() { + Serial.begin(115200); + + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + // set initial temperature sensor measurement + // Simulated Sensor - it shall initially print -25 degrees and then move to the -10 to 10 range + SimulatedTemperatureSensor.begin(-25.00); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Temperature Sensor Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } +} + +void loop() { + Serial.printf("Current Temperature is %.02f \r\n", SimulatedTemperatureSensor.getTemperature()); + // update the temperature sensor value every 5 seconds + // Matter APP shall display the updated temperature + delay(5000); + SimulatedTemperatureSensor.setTemperature(getSimulatedTemperature()); +} diff --git a/libraries/Matter/examples/MatterTemperatureSensor/ci.json b/libraries/Matter/examples/MatterTemperatureSensor/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterTemperatureSensor/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index 4668054d12e..60ffc546bd6 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -18,6 +18,7 @@ MatterEndPoint KEYWORD1 MatterFan KEYWORD1 FanMode_t KEYWORD1 FanModeSequence_t KEYWORD1 +MatterTemperatureSensor KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -62,6 +63,8 @@ setMode KEYWORD2 getMode KEYWORD2 onChangeMode KEYWORD2 onChangeSpeedPercent KEYWORD2 +setTemperature KEYWORD2 +getTemperature KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index 06edf32288f..1b35d876705 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -26,6 +26,7 @@ #include #include #include +#include using namespace esp_matter; @@ -58,6 +59,7 @@ class ArduinoMatter { friend class MatterColorLight; friend class MatterEnhancedColorLight; friend class MatterFan; + friend class MatterTemperatureSensor; protected: static void _init(); diff --git a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp new file mode 100644 index 00000000000..4a43650f924 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp @@ -0,0 +1,99 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +bool MatterTemperatureSensor::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { + bool ret = true; + if (!started) { + log_e("Matter Temperature Sensor device has not begun."); + return false; + } + + log_d("Temperature Sensor Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); + return ret; +} + +MatterTemperatureSensor::MatterTemperatureSensor() {} + +MatterTemperatureSensor::~MatterTemperatureSensor() { + end(); +} + +bool MatterTemperatureSensor::begin(int16_t _rawTemperature) { + ArduinoMatter::_init(); + + temperature_sensor::config_t temperature_sensor_config; + temperature_sensor_config.temperature_measurement.measured_value = _rawTemperature; + temperature_sensor_config.temperature_measurement.min_measured_value = nullptr; + temperature_sensor_config.temperature_measurement.max_measured_value = nullptr; + + // endpoint handles can be used to add/modify clusters + endpoint_t *endpoint = temperature_sensor::create(node::get(), &temperature_sensor_config, ENDPOINT_FLAG_NONE, (void *)this); + if (endpoint == nullptr) { + log_e("Failed to create Temperature Sensor endpoint"); + return false; + } + rawTemperature = _rawTemperature; + setEndPointId(endpoint::get_id(endpoint)); + log_i("Temperature Sensor created with endpoint_id %d", getEndPointId()); + started = true; + return true; +} + +void MatterTemperatureSensor::end() { + started = false; +} + +bool MatterTemperatureSensor::setRawTemperature(int16_t _rawTemperature) { + if (!started) { + log_e("Matter Temperature Sensor device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (rawTemperature == _rawTemperature) { + return true; + } + + esp_matter_attr_val_t temperatureVal = esp_matter_invalid(NULL); + + if (!getAttributeVal(TemperatureMeasurement::Id, TemperatureMeasurement::Attributes::MeasuredValue::Id, &temperatureVal)) { + log_e("Failed to get Temperature Sensor Attribute."); + return false; + } + if (temperatureVal.val.i16 != _rawTemperature) { + temperatureVal.val.i16 = _rawTemperature; + bool ret; + ret = updateAttributeVal(TemperatureMeasurement::Id, TemperatureMeasurement::Attributes::MeasuredValue::Id, &temperatureVal); + if (!ret) { + log_e("Failed to update Fan Speed Percent Attribute."); + return false; + } + rawTemperature = _rawTemperature; + } + log_v("Temperature Sensor set to %.02f Degrees", (float)_rawTemperature / 100.00); + + return true; +} + +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h new file mode 100644 index 00000000000..826abac9a2a --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h @@ -0,0 +1,63 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +class MatterTemperatureSensor : public MatterEndPoint { +public: + MatterTemperatureSensor(); + ~MatterTemperatureSensor(); + // begin Matter Temperature Sensor endpoint with initial float temperature + bool begin(double temperature = 0.00) { + return begin(static_cast(temperature * 100.0f)); + } + // this will stop processing Temperature Sensor Matter events + void end(); + + // set the reported raw temperature + bool setTemperature(double temperature) { + // stores up to 1/100th of a degree precision + int16_t rawValue = static_cast(temperature * 100.0f); + return setRawTemperature(rawValue); + } + // returns the reported float temperature with 1/100th of a degree precision + double getTemperature() { + return (double)rawTemperature / 100.0; + } + // double conversion operator + void operator=(double temperature) { + setTemperature(temperature); + } + // double conversion operator + operator double() { + return (double)getTemperature(); + } + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + +protected: + bool started = false; + // implementation keeps temperature in 1/100th of a degree, any temperature unit + int16_t rawTemperature = 0; + // internal function to set the raw temperature value (Matter Cluster) + bool setRawTemperature(int16_t _rawTemperature); + bool begin(int16_t _rawTemperature); +}; +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From 9660e66325afa1e54645b93ae46330ab8b63d8f6 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 10 Dec 2024 01:12:50 +0200 Subject: [PATCH 042/183] feat(chip): Add definition for BOOT_PIN for all chips (#10700) * feat(chip): Add definition for BOOT_PIN for all chips For use in sketches as default button * fix(core): Make BOOT_PIN static * fix(hal): BOOT_PIN should always be defined --- cores/esp32/esp32-hal.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cores/esp32/esp32-hal.h b/cores/esp32/esp32-hal.h index d80bf2f15de..d0bd4b8bc93 100644 --- a/cores/esp32/esp32-hal.h +++ b/cores/esp32/esp32-hal.h @@ -61,6 +61,19 @@ extern "C" { #define ARDUINO_EVENT_RUNNING_CORE CONFIG_ARDUINO_EVENT_RUNNING_CORE #endif +#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 +static const uint8_t BOOT_PIN = 0; +#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32C61 +static const uint8_t BOOT_PIN = 9; +#elif CONFIG_IDF_TARGET_ESP32P4 +static const uint8_t BOOT_PIN = 35; +#elif CONFIG_IDF_TARGET_ESP32C5 +static const uint8_t BOOT_PIN = 28; +#else +#error BOOT_PIN not defined for this chip! +#endif +#define BOOT_PIN BOOT_PIN + //forward declaration from freertos/portmacro.h void vPortYield(void); void yield(void); From 9b9e6afdc6534ba41798f7ebfa6405299c0c6498 Mon Sep 17 00:00:00 2001 From: Thomas Jentzsch <76921504+yellobyte@users.noreply.github.com> Date: Tue, 10 Dec 2024 01:29:19 +0100 Subject: [PATCH 043/183] Update boards.txt mixed line endings fixed, pre-commit succssful --- boards.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/boards.txt b/boards.txt index 8c1183377b1..791396da338 100644 --- a/boards.txt +++ b/boards.txt @@ -47505,7 +47505,6 @@ Pcbcupid_GLYPH_C6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP Pcbcupid_GLYPH_C6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port ############################################################## -# YelloByte YB-ESP32-S3-AMP 2MB PSRAM (Rev.2) yb_esp32s3_amp_v2.name=YelloByte YB-ESP32-S3-AMP (Rev.2) @@ -47713,7 +47712,6 @@ yb_esp32s3_amp_v2.menu.EraseFlash.all=Enabled yb_esp32s3_amp_v2.menu.EraseFlash.all.upload.erase_cmd=-e ############################################################## -# YelloByte YB-ESP32-S3-AMP 2MB PSRAM (Rev.3) yb_esp32s3_amp_v3.name=YelloByte YB-ESP32-S3-AMP (Rev.3) From 8c3efc26f6f8a0ec04d310cd864a522507142644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 10 Dec 2024 08:56:53 +0100 Subject: [PATCH 044/183] fix(zigbee): set rx on idle and alloc address --- libraries/Zigbee/src/ZigbeeCore.cpp | 3 ++- libraries/Zigbee/src/ZigbeeCore.h | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index b1dc6211362..1266d57aa34 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -21,6 +21,7 @@ ZigbeeCore::ZigbeeCore() { _started = false; _connected = false; _scan_duration = 4; // maximum scan duration + _rx_on_when_idle = true; if (!lock) { lock = xSemaphoreCreateBinary(); if (lock == NULL) { @@ -98,7 +99,7 @@ static void esp_zb_task(void *pvParameters) { //NOTE: This is a workaround to make battery powered devices to be discovered as battery powered if (((zigbee_role_t)Zigbee.getRole() == ZIGBEE_END_DEVICE) && edBatteryPowered) { - zb_set_ed_node_descriptor(0, 0, 0); + zb_set_ed_node_descriptor(0, _rx_on_when_idle, 1); } esp_zb_stack_main_loop(); diff --git a/libraries/Zigbee/src/ZigbeeCore.h b/libraries/Zigbee/src/ZigbeeCore.h index 6729b7cc9f4..5d8cbf2929c 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -67,6 +67,7 @@ class ZigbeeCore { uint32_t _primary_channel_mask; int16_t _scan_status; uint8_t _scan_duration; + bool _rx_on_when_idle; esp_zb_ep_list_t *_zb_ep_list; zigbee_role_t _role; @@ -112,12 +113,17 @@ class ZigbeeCore { void setHostConfig(esp_zb_host_config_t config); esp_zb_host_config_t getHostConfig(); + void setPrimaryChannelMask(uint32_t mask); void setPrimaryChannelMask(uint32_t mask); // By default all channels are scanned (11-26) -> mask 0x07FFF800 void setScanDuration(uint8_t duration); // Can be set from 1 - 4. 1 is fastest, 4 is slowest uint8_t getScanDuration() { return _scan_duration; } + void setRxOnWhenIdle(bool rx_on_when_idle) { + _rx_on_when_idle = rx_on_when_idle; + } + void setRebootOpenNetwork(uint8_t time); void openNetwork(uint8_t time); From be95fc576487e4322efa83b7b2d492fb6f0bd3ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 10 Dec 2024 12:46:44 +0100 Subject: [PATCH 045/183] fix(zigbee): Set scan to 3 and remove duplicate --- libraries/Zigbee/src/ZigbeeCore.cpp | 2 +- libraries/Zigbee/src/ZigbeeCore.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index 1266d57aa34..b60afdc0e8a 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -20,7 +20,7 @@ ZigbeeCore::ZigbeeCore() { _scan_status = ZB_SCAN_FAILED; _started = false; _connected = false; - _scan_duration = 4; // maximum scan duration + _scan_duration = 3; // default scan duration _rx_on_when_idle = true; if (!lock) { lock = xSemaphoreCreateBinary(); diff --git a/libraries/Zigbee/src/ZigbeeCore.h b/libraries/Zigbee/src/ZigbeeCore.h index 5d8cbf2929c..ba0be2eaa57 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -113,7 +113,6 @@ class ZigbeeCore { void setHostConfig(esp_zb_host_config_t config); esp_zb_host_config_t getHostConfig(); - void setPrimaryChannelMask(uint32_t mask); void setPrimaryChannelMask(uint32_t mask); // By default all channels are scanned (11-26) -> mask 0x07FFF800 void setScanDuration(uint8_t duration); // Can be set from 1 - 4. 1 is fastest, 4 is slowest uint8_t getScanDuration() { From 87d988fdb596a56e51b7059eb9ee8786d53ccdcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 10 Dec 2024 12:57:37 +0100 Subject: [PATCH 046/183] fix(zigbee): Add getter for RxOnWhenIdle --- libraries/Zigbee/src/ZigbeeCore.cpp | 2 +- libraries/Zigbee/src/ZigbeeCore.h | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index b60afdc0e8a..cc0111f2644 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -99,7 +99,7 @@ static void esp_zb_task(void *pvParameters) { //NOTE: This is a workaround to make battery powered devices to be discovered as battery powered if (((zigbee_role_t)Zigbee.getRole() == ZIGBEE_END_DEVICE) && edBatteryPowered) { - zb_set_ed_node_descriptor(0, _rx_on_when_idle, 1); + zb_set_ed_node_descriptor(0, Zigbee.getRxOnWhenIdle(), 1); } esp_zb_stack_main_loop(); diff --git a/libraries/Zigbee/src/ZigbeeCore.h b/libraries/Zigbee/src/ZigbeeCore.h index ba0be2eaa57..c72a60d81c4 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -122,6 +122,9 @@ class ZigbeeCore { void setRxOnWhenIdle(bool rx_on_when_idle) { _rx_on_when_idle = rx_on_when_idle; } + bool getRxOnWhenIdle() { + return _rx_on_when_idle; + } void setRebootOpenNetwork(uint8_t time); void openNetwork(uint8_t time); From a281b26baefb6d4aa644763c910dac886846e8e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 10 Dec 2024 13:37:23 +0100 Subject: [PATCH 047/183] fix(zigbee): Move button and led pins from defines --- .../Zigbee_Color_Dimmable_Light.ino | 23 ++++++++++--------- .../Zigbee_Color_Dimmer_Switch.ino | 12 +++++----- .../Zigbee_On_Off_Light.ino | 17 +++++++------- .../Zigbee_On_Off_Switch.ino | 4 ++-- .../Zigbee_Temp_Hum_Sensor_Sleepy.ino | 10 ++++---- .../Zigbee_Temperature_Sensor.ino | 9 ++++---- .../Zigbee_Thermostat/Zigbee_Thermostat.ino | 9 ++++---- 7 files changed, 45 insertions(+), 39 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino b/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino index 7ff7a020632..c43981459f0 100644 --- a/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino +++ b/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino @@ -33,20 +33,21 @@ #include "Zigbee.h" -#define LED_PIN RGB_BUILTIN -#define BUTTON_PIN 9 // C6/H2 Boot button -#define ZIGBEE_LIGHT_ENDPOINT 10 +/* Zigbee color dimmable light configuration */ +#define ZIGBEE_RGB_LIGHT_ENDPOINT 10 +uint8_t led = RGB_BUILTIN; +uint8_t button = BOOT_PIN; -ZigbeeColorDimmableLight zbColorLight = ZigbeeColorDimmableLight(ZIGBEE_LIGHT_ENDPOINT); +ZigbeeColorDimmableLight zbColorLight = ZigbeeColorDimmableLight(ZIGBEE_RGB_LIGHT_ENDPOINT); /********************* RGB LED functions **************************/ void setRGBLight(bool state, uint8_t red, uint8_t green, uint8_t blue, uint8_t level) { if (!state) { - rgbLedWrite(LED_PIN, 0, 0, 0); + rgbLedWrite(led, 0, 0, 0); return; } float brightness = (float)level / 255; - rgbLedWrite(LED_PIN, red * brightness, green * brightness, blue * brightness); + rgbLedWrite(led, red * brightness, green * brightness, blue * brightness); } // Create a task on identify call to handle the identify function @@ -58,7 +59,7 @@ void identify(uint16_t time) { zbColorLight.restoreLight(); return; } - rgbLedWrite(LED_PIN, 255 * blink, 255 * blink, 255 * blink); + rgbLedWrite(led, 255 * blink, 255 * blink, 255 * blink); blink = !blink; } @@ -70,10 +71,10 @@ void setup() { } // Init RMT and leave light OFF - rgbLedWrite(LED_PIN, 0, 0, 0); + rgbLedWrite(led, 0, 0, 0); // Init button for factory reset - pinMode(BUTTON_PIN, INPUT_PULLUP); + pinMode(button, INPUT_PULLUP); // Set callback function for light change zbColorLight.onLightChange(setRGBLight); @@ -104,11 +105,11 @@ void setup() { void loop() { // Checking button for factory reset - if (digitalRead(BUTTON_PIN) == LOW) { // Push button pressed + if (digitalRead(button) == LOW) { // Push button pressed // Key debounce handling delay(100); int startTime = millis(); - while (digitalRead(BUTTON_PIN) == LOW) { + while (digitalRead(button) == LOW) { delay(50); if ((millis() - startTime) > 3000) { // If key pressed for more than 3secs, factory reset Zigbee and reboot diff --git a/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino b/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino index 15e120a1dbd..0ae8fd86a75 100644 --- a/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino +++ b/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino @@ -37,9 +37,9 @@ #include "Zigbee.h" -/* Switch configuration */ -#define SWITCH_PIN 9 // ESP32-C6/H2 Boot button +/* Zigbee color dimmer switch configuration */ #define SWITCH_ENDPOINT_NUMBER 5 +uint8_t button = BOOT_PIN; /* Zigbee switch */ ZigbeeColorDimmerSwitch zbSwitch = ZigbeeColorDimmerSwitch(SWITCH_ENDPOINT_NUMBER); @@ -52,7 +52,7 @@ void setup() { } //Init button switch - pinMode(SWITCH_PIN, INPUT_PULLUP); + pinMode(button, INPUT_PULLUP); //Optional: set Zigbee device name and model zbSwitch.setManufacturerAndModel("Espressif", "ZigbeeSwitch"); @@ -84,9 +84,9 @@ void setup() { void loop() { // Handle button switch in loop() - if (digitalRead(SWITCH_PIN) == LOW) { // Push button pressed + if (digitalRead(button) == LOW) { // Push button pressed // Key debounce handling - while (digitalRead(SWITCH_PIN) == LOW) { + while (digitalRead(button) == LOW) { delay(50); } // Toggle light @@ -145,6 +145,6 @@ void loop() { static uint32_t last_print = 0; if (millis() - last_print > 30000) { last_print = millis(); - zbSwitch.printBoundDevices(Serial); + zbSwitch.printBoundDevices(); } } diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino b/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino index 92c59044cae..23c9b38f7c9 100644 --- a/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino +++ b/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino @@ -32,15 +32,16 @@ #include "Zigbee.h" -#define LED_PIN RGB_BUILTIN -#define BUTTON_PIN 9 // ESP32-C6/H2 Boot button +/* Zigbee light bulb configuration */ #define ZIGBEE_LIGHT_ENDPOINT 10 +uint8_t led = RGB_BUILTIN; +uint8_t button = BOOT_PIN; ZigbeeLight zbLight = ZigbeeLight(ZIGBEE_LIGHT_ENDPOINT); /********************* RGB LED functions **************************/ void setLED(bool value) { - digitalWrite(LED_PIN, value); + digitalWrite(led, value); } /********************* Arduino functions **************************/ @@ -50,11 +51,11 @@ void setup() { delay(10); } // Init LED and turn it OFF (if LED_PIN == RGB_BUILTIN, the rgbLedWrite() will be used under the hood) - pinMode(LED_PIN, OUTPUT); - digitalWrite(LED_PIN, LOW); + pinMode(led, OUTPUT); + digitalWrite(led, LOW); // Init button for factory reset - pinMode(BUTTON_PIN, INPUT_PULLUP); + pinMode(button, INPUT_PULLUP); //Optional: set Zigbee device name and model zbLight.setManufacturerAndModel("Espressif", "ZBLightBulb"); @@ -82,11 +83,11 @@ void setup() { void loop() { // Checking button for factory reset - if (digitalRead(BUTTON_PIN) == LOW) { // Push button pressed + if (digitalRead(button) == LOW) { // Push button pressed // Key debounce handling delay(100); int startTime = millis(); - while (digitalRead(BUTTON_PIN) == LOW) { + while (digitalRead(button) == LOW) { delay(50); if ((millis() - startTime) > 3000) { // If key pressed for more than 3secs, factory reset Zigbee and reboot diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino b/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino index e12b8aaf9ea..d40f54bc5d9 100644 --- a/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino +++ b/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino @@ -33,10 +33,10 @@ #include "Zigbee.h" +/* Zigbee switch configuration */ #define SWITCH_ENDPOINT_NUMBER 5 -/* Switch configuration */ -#define GPIO_INPUT_IO_TOGGLE_SWITCH 9 +#define GPIO_INPUT_IO_TOGGLE_SWITCH BOOT_PIN #define PAIR_SIZE(TYPE_STR_PAIR) (sizeof(TYPE_STR_PAIR) / sizeof(TYPE_STR_PAIR[0])) typedef enum { diff --git a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino index 0c2f9b56690..50abd1b774b 100644 --- a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino +++ b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino @@ -32,12 +32,14 @@ #include "Zigbee.h" -#define BUTTON_PIN 9 //Boot button for C6/H2 +/* Zigbee temperature + humidity sensor configuration */ #define TEMP_SENSOR_ENDPOINT_NUMBER 10 #define uS_TO_S_FACTOR 1000000ULL /* Conversion factor for micro seconds to seconds */ #define TIME_TO_SLEEP 55 /* Sleep for 55s will + 5s delay for establishing connection => data reported every 1 minute */ +uint8_t button = BOOT_PIN; + ZigbeeTempSensor zbTempSensor = ZigbeeTempSensor(TEMP_SENSOR_ENDPOINT_NUMBER); /************************ Temp sensor *****************************/ @@ -70,7 +72,7 @@ void setup() { delay(10); } // Init button switch - pinMode(BUTTON_PIN, INPUT_PULLUP); + pinMode(button, INPUT_PULLUP); // Configure the wake up source and set to wake up every 5 seconds esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); @@ -118,11 +120,11 @@ void setup() { void loop() { // Checking button for factory reset - if (digitalRead(BUTTON_PIN) == LOW) { // Push button pressed + if (digitalRead(button) == LOW) { // Push button pressed // Key debounce handling delay(100); int startTime = millis(); - while (digitalRead(BUTTON_PIN) == LOW) { + while (digitalRead(button) == LOW) { delay(50); if ((millis() - startTime) > 3000) { // If key pressed for more than 3secs, factory reset Zigbee and reboot diff --git a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino index 255b074265e..e3fb1273735 100644 --- a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino @@ -32,8 +32,9 @@ #include "Zigbee.h" -#define BUTTON_PIN 9 //Boot button for C6/H2 +/* Zigbee temperature sensor configuration */ #define TEMP_SENSOR_ENDPOINT_NUMBER 10 +uint8_t button = BOOT_PIN; ZigbeeTempSensor zbTempSensor = ZigbeeTempSensor(TEMP_SENSOR_ENDPOINT_NUMBER); @@ -56,7 +57,7 @@ void setup() { delay(10); } // Init button switch - pinMode(BUTTON_PIN, INPUT_PULLUP); + pinMode(button, INPUT_PULLUP); // Optional: set Zigbee device name and model zbTempSensor.setManufacturerAndModel("Espressif", "ZigbeeTempSensor"); @@ -99,11 +100,11 @@ void setup() { void loop() { // Checking button for factory reset - if (digitalRead(BUTTON_PIN) == LOW) { // Push button pressed + if (digitalRead(button) == LOW) { // Push button pressed // Key debounce handling delay(100); int startTime = millis(); - while (digitalRead(BUTTON_PIN) == LOW) { + while (digitalRead(button) == LOW) { delay(50); if ((millis() - startTime) > 3000) { // If key pressed for more than 3secs, factory reset Zigbee and reboot diff --git a/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino b/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino index df02f891794..3de30dff6be 100644 --- a/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino +++ b/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino @@ -33,8 +33,9 @@ #include "Zigbee.h" -#define BUTTON_PIN 9 // Boot button for C6/H2 +/* Zigbee thermostat configuration */ #define THERMOSTAT_ENDPOINT_NUMBER 5 +uint8_t button = BOOT_PIN; ZigbeeThermostat zbThermostat = ZigbeeThermostat(THERMOSTAT_ENDPOINT_NUMBER); @@ -64,7 +65,7 @@ void setup() { } // Init button switch - pinMode(BUTTON_PIN, INPUT_PULLUP); + pinMode(button, INPUT_PULLUP); // Set callback functions for temperature and configuration receive zbThermostat.onTempRecieve(recieveSensorTemp); @@ -100,10 +101,10 @@ void setup() { void loop() { // Handle button switch in loop() - if (digitalRead(BUTTON_PIN) == LOW) { // Push button pressed + if (digitalRead(button) == LOW) { // Push button pressed // Key debounce handling - while (digitalRead(BUTTON_PIN) == LOW) { + while (digitalRead(button) == LOW) { delay(50); } From d7492b167c6e9f4a34ed0419d414e47f16c88a12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 10 Dec 2024 14:06:17 +0100 Subject: [PATCH 048/183] fix(example): Lower the delay for sleepy device --- .../Zigbee_Temp_Hum_Sensor_Sleepy.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino index 50abd1b774b..67d36fce6cf 100644 --- a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino +++ b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino @@ -114,8 +114,8 @@ void setup() { Serial.println(); Serial.println("Successfully connected to Zigbee network"); - // Delay 5s (may be adjusted) to allow establishing proper connection with coordinator, needed for sleepy devices - delay(5000); + // Delay approx 1s (may be adjusted) to allow establishing proper connection with coordinator, needed for sleepy devices + delay(1000); } void loop() { From 45d863049a88be37c395ad1429a404118b2e9695 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 10 Dec 2024 10:37:51 -0300 Subject: [PATCH 049/183] ci(tests): Remove 3rd party tests Co-authored-by: Rodrigo Garcia --- .github/scripts/install-platformio-esp32.sh | 186 ------------------ .github/scripts/on-push.sh | 82 +++----- .github/scripts/on-release.sh | 2 +- .github/scripts/set_push_chunks.sh | 1 - .github/workflows/push.yml | 30 --- platform.txt | 2 +- ...latformio-build.py => pioarduino-build.py} | 4 +- 7 files changed, 34 insertions(+), 273 deletions(-) delete mode 100755 .github/scripts/install-platformio-esp32.sh rename tools/{platformio-build.py => pioarduino-build.py} (98%) diff --git a/.github/scripts/install-platformio-esp32.sh b/.github/scripts/install-platformio-esp32.sh deleted file mode 100755 index 8cd6552eb80..00000000000 --- a/.github/scripts/install-platformio-esp32.sh +++ /dev/null @@ -1,186 +0,0 @@ -#!/bin/bash - -export PLATFORMIO_ESP32_PATH="$HOME/.platformio/packages/framework-arduinoespressif32" -PLATFORMIO_ESP32_URL="https://github.com/platformio/platform-espressif32.git" - -TOOLCHAIN_VERSION="12.2.0+20230208" -ESPTOOLPY_VERSION="~1.40501.0" -ESPRESSIF_ORGANIZATION_NAME="espressif" -SDKCONFIG_DIR="$PLATFORMIO_ESP32_PATH/tools/esp32-arduino-libs" -SCRIPTS_DIR="./.github/scripts" -COUNT_SKETCHES="${SCRIPTS_DIR}/sketch_utils.sh count" -CHECK_REQUIREMENTS="${SCRIPTS_DIR}/sketch_utils.sh check_requirements" - -echo "Installing Python Wheel ..." -pip install wheel > /dev/null 2>&1 - -echo "Installing PlatformIO ..." -pip install -U https://github.com/platformio/platformio/archive/master.zip > /dev/null 2>&1 - -echo "Installing Platform ESP32 ..." -python -m platformio platform install $PLATFORMIO_ESP32_URL > /dev/null 2>&1 - -echo "Replacing the package versions ..." -replace_script="import json; import os;" -replace_script+="fp=open(os.path.expanduser('~/.platformio/platforms/espressif32/platform.json'), 'r+');" -replace_script+="data=json.load(fp);" -# Use framework sources from the repository -replace_script+="data['packages']['framework-arduinoespressif32']['version'] = '*';" -replace_script+="del data['packages']['framework-arduinoespressif32']['owner'];" -# Use toolchain packages from the "espressif" organization -replace_script+="data['packages']['toolchain-xtensa-esp32']['owner']='$ESPRESSIF_ORGANIZATION_NAME';" -replace_script+="data['packages']['toolchain-xtensa-esp32s2']['owner']='$ESPRESSIF_ORGANIZATION_NAME';" -replace_script+="data['packages']['toolchain-riscv32-esp']['owner']='$ESPRESSIF_ORGANIZATION_NAME';" -# Update versions to use the upstream -replace_script+="data['packages']['toolchain-xtensa-esp32']['version']='$TOOLCHAIN_VERSION';" -replace_script+="data['packages']['toolchain-xtensa-esp32s2']['version']='$TOOLCHAIN_VERSION';" -replace_script+="data['packages']['toolchain-xtensa-esp32s3']['version']='$TOOLCHAIN_VERSION';" -replace_script+="data['packages']['toolchain-riscv32-esp']['version']='$TOOLCHAIN_VERSION';" -# Add new "framework-arduinoespressif32-libs" package -# Read "package_esp32_index.template.json" to extract a url to a zip package for "esp32-arduino-libs" -replace_script+="fpackage=open(os.path.join('package', 'package_esp32_index.template.json'), 'r+');" -replace_script+="package_data=json.load(fpackage);" -replace_script+="fpackage.close();" -replace_script+="libs_package_archive_url=next(next(system['url'] for system in tool['systems'] if system['host'] == 'x86_64-pc-linux-gnu') for tool in package_data['packages'][0]['tools'] if tool['name'] == 'esp32-arduino-libs');" -replace_script+="data['packages'].update({'framework-arduinoespressif32-libs':{'type':'framework','optional':False,'version':libs_package_archive_url}});" -replace_script+="data['packages']['toolchain-xtensa-esp32'].update({'optional':False});" -# esptool.py may require an upstream version (for now platformio is the owner) -replace_script+="data['packages']['tool-esptoolpy']['version']='$ESPTOOLPY_VERSION';" -# Save results -replace_script+="fp.seek(0);fp.truncate();json.dump(data, fp, indent=2);fp.close()" -python -c "$replace_script" - -if [ "$GITHUB_REPOSITORY" == "espressif/arduino-esp32" ]; then - echo "Linking Core..." - ln -s "$GITHUB_WORKSPACE" "$PLATFORMIO_ESP32_PATH" -else - echo "Cloning Core Repository ..." - git clone --recursive https://github.com/espressif/arduino-esp32.git "$PLATFORMIO_ESP32_PATH" > /dev/null 2>&1 -fi - -echo "PlatformIO for ESP32 has been installed" -echo "" - -function build_pio_sketch { # build_pio_sketch - if [ "$#" -lt 3 ]; then - echo "ERROR: Illegal number of parameters" - echo "USAGE: build_pio_sketch " - return 1 - fi - - local board="$1" - local options="$2" - local sketch="$3" - local sketch_dir - - sketch_dir=$(dirname "$sketch") - echo "" - echo "Compiling '$(basename "$sketch")' ..." - python -m platformio ci --board "$board" "$sketch_dir" --project-option="$options" -} - -function build_pio_sketches { # build_pio_sketches - if [ "$#" -lt 3 ]; then - echo "ERROR: Illegal number of parameters" - echo "USAGE: build_pio_sketches [ ]" - return 1 - fi - - local board=$1 - local options="$2" - local examples=$3 - local chunk_idex=$4 - local chunks_num=$5 - - if [ "$#" -lt 5 ]; then - chunk_idex="0" - chunks_num="1" - fi - - if [ "$chunks_num" -le 0 ]; then - echo "ERROR: Chunks count must be positive number" - return 1 - fi - if [ "$chunk_idex" -ge "$chunks_num" ]; then - echo "ERROR: Chunk index must be less than chunks count" - return 1 - fi - - set +e - ${COUNT_SKETCHES} "$examples" "esp32" - local sketchcount=$? - set -e - local sketches - sketches=$(cat sketches.txt) - rm -rf sketches.txt - - local chunk_size - local all_chunks - local start_index - local end_index - local start_num - - chunk_size=$(( sketchcount / chunks_num )) - all_chunks=$(( chunks_num * chunk_size )) - if [ "$all_chunks" -lt "$sketchcount" ]; then - chunk_size=$(( chunk_size + 1 )) - fi - - start_index=$(( chunk_idex * chunk_size )) - if [ "$sketchcount" -le "$start_index" ]; then - echo "Skipping job" - return 0 - fi - - end_index=$(( $(( chunk_idex + 1 )) * chunk_size )) - if [ "$end_index" -gt "$sketchcount" ]; then - end_index=$sketchcount - fi - - start_num=$(( start_index + 1 )) - echo "Found $sketchcount Sketches"; - echo "Chunk Count : $chunks_num" - echo "Chunk Size : $chunk_size" - echo "Start Sketch: $start_num" - echo "End Sketch : $end_index" - - local sketchnum=0 - for sketch in $sketches; do - local sketchdir - local sketchdirname - local sketchname - local is_target - local has_requirements - - sketchdir=$(dirname "$sketch") - sketchdirname=$(basename "$sketchdir") - sketchname=$(basename "$sketch") - - if [[ "$sketchdirname.ino" != "$sketchname" ]]; then - continue - elif [ -f "$sketchdir"/ci.json ]; then - # If the target is listed as false, skip the sketch. Otherwise, include it. - is_target=$(jq -r '.targets[esp32]' "$sketchdir"/ci.json) - if [[ "$is_target" == "false" ]]; then - continue - fi - - has_requirements=$(${CHECK_REQUIREMENTS} "$sketchdir" "$SDKCONFIG_DIR/esp32/sdkconfig") - if [ "$has_requirements" == "0" ]; then - continue - fi - fi - - sketchnum=$((sketchnum + 1)) - if [ "$sketchnum" -le "$start_index" ] \ - || [ "$sketchnum" -gt "$end_index" ]; then - continue - fi - build_pio_sketch "$board" "$options" "$sketch" - local result=$? - if [ $result -ne 0 ]; then - return $result - fi - done - return 0 -} diff --git a/.github/scripts/on-push.sh b/.github/scripts/on-push.sh index 5158df3cc9b..aafc9de0596 100755 --- a/.github/scripts/on-push.sh +++ b/.github/scripts/on-push.sh @@ -55,14 +55,11 @@ CHUNK_INDEX=$1 CHUNKS_CNT=$2 BUILD_LOG=$3 SKETCHES_FILE=$4 -BUILD_PIO=0 if [ "$#" -lt 2 ] || [ "$CHUNKS_CNT" -le 0 ]; then CHUNK_INDEX=0 CHUNKS_CNT=1 elif [ "$CHUNK_INDEX" -gt "$CHUNKS_CNT" ] && [ "$CHUNKS_CNT" -ge 2 ]; then CHUNK_INDEX=$CHUNKS_CNT -elif [ "$CHUNK_INDEX" -eq "$CHUNKS_CNT" ]; then - BUILD_PIO=1 fi if [ -z "$BUILD_LOG" ] || [ "$BUILD_LOG" -le 0 ]; then @@ -73,54 +70,35 @@ fi #git -C "$GITHUB_WORKSPACE" submodule update --init --recursive > /dev/null 2>&1 SCRIPTS_DIR="./.github/scripts" -if [ "$BUILD_PIO" -eq 0 ]; then - source "${SCRIPTS_DIR}/install-arduino-cli.sh" - source "${SCRIPTS_DIR}/install-arduino-core-esp32.sh" - - SKETCHES_ESP32=( - "$ARDUINO_ESP32_PATH/libraries/NetworkClientSecure/examples/WiFiClientSecure/WiFiClientSecure.ino" - "$ARDUINO_ESP32_PATH/libraries/BLE/examples/Server/Server.ino" - "$ARDUINO_ESP32_PATH/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino" - "$ARDUINO_ESP32_PATH/libraries/Insights/examples/MinimalDiagnostics/MinimalDiagnostics.ino" - ) - #create sizes_file - sizes_file="$GITHUB_WORKSPACE/cli_compile_$CHUNK_INDEX.json" - - if [ "$BUILD_LOG" -eq 1 ]; then - #create sizes_file and echo start of JSON array with "boards" key - echo "{\"boards\": [" > "$sizes_file" - fi - - #build sketches for different targets - build "esp32p4" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" - build "esp32s3" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" - build "esp32s2" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" - build "esp32c3" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" - build "esp32c6" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" - build "esp32h2" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" - build "esp32" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" - - if [ "$BUILD_LOG" -eq 1 ]; then - #remove last comma from the last JSON object - sed -i '$ s/,$//' "$sizes_file" - #echo end of JSON array - echo "]}" >> "$sizes_file" - fi -else - source "${SCRIPTS_DIR}/install-platformio-esp32.sh" - # PlatformIO ESP32 Test - BOARD="esp32dev" - OPTIONS="board_build.partitions = huge_app.csv" - build_pio_sketch "$BOARD" "$OPTIONS" "$PLATFORMIO_ESP32_PATH/libraries/WiFi/examples/WiFiClient/WiFiClient.ino" && \ - build_pio_sketch "$BOARD" "$OPTIONS" "$PLATFORMIO_ESP32_PATH/libraries/NetworkClientSecure/examples/WiFiClientSecure/WiFiClientSecure.ino" && \ - build_pio_sketch "$BOARD" "$OPTIONS" "$PLATFORMIO_ESP32_PATH/libraries/BluetoothSerial/examples/SerialToSerialBT/SerialToSerialBT.ino" && \ - build_pio_sketch "$BOARD" "$OPTIONS" "$PLATFORMIO_ESP32_PATH/libraries/BLE/examples/Server/Server.ino" && \ - build_pio_sketch "$BOARD" "$OPTIONS" "$PLATFORMIO_ESP32_PATH/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino" - - # Basic sanity testing for other series - for board in "esp32-c3-devkitm-1" "esp32-s2-saola-1" "esp32-s3-devkitc-1"; do - python -m platformio ci --board "$board" "$PLATFORMIO_ESP32_PATH/libraries/WiFi/examples/WiFiClient" --project-option="board_build.partitions = huge_app.csv" - done +source "${SCRIPTS_DIR}/install-arduino-cli.sh" +source "${SCRIPTS_DIR}/install-arduino-core-esp32.sh" + +SKETCHES_ESP32=( + "$ARDUINO_ESP32_PATH/libraries/NetworkClientSecure/examples/WiFiClientSecure/WiFiClientSecure.ino" + "$ARDUINO_ESP32_PATH/libraries/BLE/examples/Server/Server.ino" + "$ARDUINO_ESP32_PATH/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino" + "$ARDUINO_ESP32_PATH/libraries/Insights/examples/MinimalDiagnostics/MinimalDiagnostics.ino" +) +#create sizes_file +sizes_file="$GITHUB_WORKSPACE/cli_compile_$CHUNK_INDEX.json" + +if [ "$BUILD_LOG" -eq 1 ]; then + #create sizes_file and echo start of JSON array with "boards" key + echo "{\"boards\": [" > "$sizes_file" +fi - #build_pio_sketches "$BOARD" "$OPTIONS" "$PLATFORMIO_ESP32_PATH/libraries" +#build sketches for different targets +build "esp32p4" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" +build "esp32s3" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" +build "esp32s2" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" +build "esp32c3" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" +build "esp32c6" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" +build "esp32h2" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" +build "esp32" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" + +if [ "$BUILD_LOG" -eq 1 ]; then + #remove last comma from the last JSON object + sed -i '$ s/,$//' "$sizes_file" + #echo end of JSON array + echo "]}" >> "$sizes_file" fi diff --git a/.github/scripts/on-release.sh b/.github/scripts/on-release.sh index 119c66e1eab..242cee93d0b 100755 --- a/.github/scripts/on-release.sh +++ b/.github/scripts/on-release.sh @@ -239,7 +239,7 @@ cp -f "$GITHUB_WORKSPACE/tools/gen_insights_package.py" "$PKG_DIR/tools/" cp -f "$GITHUB_WORKSPACE/tools/gen_insights_package.exe" "$PKG_DIR/tools/" cp -Rf "$GITHUB_WORKSPACE/tools/partitions" "$PKG_DIR/tools/" cp -Rf "$GITHUB_WORKSPACE/tools/ide-debug" "$PKG_DIR/tools/" -cp -f "$GITHUB_WORKSPACE/tools/platformio-build.py" "$PKG_DIR/tools/" +cp -f "$GITHUB_WORKSPACE/tools/pioarduino-build.py" "$PKG_DIR/tools/" # Remove unnecessary files in the package folder echo "Cleaning up folders ..." diff --git a/.github/scripts/set_push_chunks.sh b/.github/scripts/set_push_chunks.sh index 047cae6efd8..ff0af7da6e8 100644 --- a/.github/scripts/set_push_chunks.sh +++ b/.github/scripts/set_push_chunks.sh @@ -79,7 +79,6 @@ chunks+="]" echo "build_libraries=$BUILD_LIBRARIES" echo "build_static_sketches=$BUILD_STATIC_SKETCHES" echo "build_idf=$BUILD_IDF" - echo "build_platformio=$BUILD_PLATFORMIO" echo "chunk_count=$chunks_count" echo "chunks=$chunks" } >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 4f30bdbb844..e6f497998b0 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -61,7 +61,6 @@ jobs: build_libraries: ${{ steps.set-chunks.outputs.build_libraries }} build_static_sketches: ${{ steps.set-chunks.outputs.build_static_sketches }} build_idf: ${{ steps.set-chunks.outputs.build_idf }} - build_platformio: ${{ steps.set-chunks.outputs.build_platformio }} chunk_count: ${{ steps.set-chunks.outputs.chunk_count }} chunks: ${{ steps.set-chunks.outputs.chunks }} steps: @@ -77,11 +76,9 @@ jobs: files_yaml: | core: - '.github/**' - - '!.github/scripts/install-platformio-esp32.sh' - 'cores/**' - 'package/**' - 'tools/**' - - '!tools/platformio-build.py' - 'platform.txt' - 'programmers.txt' - "variants/esp32/**/*" @@ -110,10 +107,6 @@ jobs: - 'Kconfig.projbuild' - 'CMakeLists.txt' - "variants/esp32c2/**/*" - platformio: - - 'package.json' - - '.github/scripts/install-platformio-esp32.sh' - - 'tools/platformio-build.py' - name: Set chunks id: set-chunks @@ -121,7 +114,6 @@ jobs: LIB_FILES: ${{ steps.changed-files.outputs.libraries_all_changed_files }} IS_PR: ${{ github.event_name == 'pull_request' }} MAX_CHUNKS: ${{ env.MAX_CHUNKS }} - BUILD_PLATFORMIO: ${{ steps.changed-files.outputs.platformio_any_changed == 'true' }} BUILD_IDF: ${{ steps.changed-files.outputs.idf_any_changed == 'true' }} BUILD_LIBRARIES: ${{ steps.changed-files.outputs.libraries_any_changed == 'true' }} BUILD_STATIC_SKETCHES: ${{ steps.changed-files.outputs.static_sketeches_any_changed == 'true' }} @@ -212,28 +204,6 @@ jobs: - name: Build Sketches run: bash ./.github/scripts/on-push.sh - # # PlatformIO on Windows, Ubuntu and Mac - # build-platformio: - # name: PlatformIO on ${{ matrix.os }} - # needs: gen-chunks - # if: | - # needs.gen-chunks.outputs.build_all == 'true' || - # needs.gen-chunks.outputs.build_static_sketches == 'true' || - # needs.gen-chunks.outputs.build_platformio == 'true' - # runs-on: ${{ matrix.os }} - # strategy: - # fail-fast: false - # matrix: - # os: [ubuntu-latest, windows-latest, macOS-latest] - # steps: - # - uses: actions/checkout@v4 - # - uses: actions/setup-python@v5 - # with: - # python-version: "3.x" - # - name: Build Sketches - # run: bash ./.github/scripts/on-push.sh 1 1 #equal and non-zero to trigger PIO - - # ESP-IDF component build build-esp-idf-component: name: Build with ESP-IDF ${{ matrix.idf_ver }} for ${{ matrix.idf_target }} needs: gen-chunks diff --git a/platform.txt b/platform.txt index b075e539866..44353ab3bf4 100644 --- a/platform.txt +++ b/platform.txt @@ -44,7 +44,7 @@ compiler.warning_flags.more=-Wall compiler.warning_flags.all=-Wall -Wextra # Additional flags specific to Arduino (not based on IDF flags). -# Update tools/platformio-build.py when changing these flags. +# Update tools/pioarduino-build.py when changing these flags. compiler.common_werror_flags=-Werror=return-type # Compile Flags diff --git a/tools/platformio-build.py b/tools/pioarduino-build.py similarity index 98% rename from tools/platformio-build.py rename to tools/pioarduino-build.py index 485879944eb..3335a716888 100644 --- a/tools/platformio-build.py +++ b/tools/pioarduino-build.py @@ -22,7 +22,7 @@ http://arduino.cc/en/Reference/HomePage """ -# Extends: https://github.com/platformio/platform-espressif32/blob/develop/builder/main.py +# Extends: https://github.com/pioarduino/platform-espressif32/blob/develop/builder/main.py from os.path import abspath, basename, isdir, isfile, join from copy import deepcopy @@ -160,7 +160,7 @@ def add_tinyuf2_extra_image(): join( FRAMEWORK_LIBS_DIR, build_mcu, - "platformio-build.py", + "pioarduino-build.py", ) ) From 5a8cba88c7bb46b83698b65fdc68cbeb2f65e4ff Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 10 Dec 2024 12:51:00 -0300 Subject: [PATCH 050/183] feat(Matter): Adds New Matter Humidity Sensor Endpoint (#10703) * feat(matter): adds matter humidity sensor endpoint --- CMakeLists.txt | 1 + .../MatterHumiditySensor.ino | 130 ++++++++++++++++++ .../examples/MatterHumiditySensor/ci.json | 7 + libraries/Matter/keywords.txt | 3 + libraries/Matter/src/Matter.h | 2 + .../MatterEndpoints/MatterHumiditySensor.cpp | 111 +++++++++++++++ .../MatterEndpoints/MatterHumiditySensor.h | 69 ++++++++++ 7 files changed, 323 insertions(+) create mode 100644 libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino create mode 100644 libraries/Matter/examples/MatterHumiditySensor/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index eba1a3fd824..ed9ae23f83f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -176,6 +176,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp libraries/Matter/src/MatterEndpoints/MatterFan.cpp libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp + libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS diff --git a/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino b/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino new file mode 100644 index 00000000000..c4977772c1b --- /dev/null +++ b/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino @@ -0,0 +1,130 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + * This example is an example code that will create a Matter Device which can be + * commissioned and controlled from a Matter Environment APP. + * Additionally the ESP32 will send debug messages indicating the Matter activity. + * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. + */ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Matter Humidity Sensor Endpoint +MatterHumiditySensor SimulatedHumiditySensor; + +// set your board USER BUTTON pin here - decommissioning button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Button control - decommision the Matter Node +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +// Simulate a humidity sensor - add your preferred humidity sensor library code here +float getSimulatedHumidity() { + // The Endpoint implementation keeps an uint16_t as internal value information, + // which stores data in 1/100th of humidity percent + static float simulatedHumidityHWSensor = 10.0; + + // it will increase from 10% to 30% in 0.5% steps to simulate a humidity sensor + simulatedHumidityHWSensor = simulatedHumidityHWSensor + 0.5; + if (simulatedHumidityHWSensor > 30) { + simulatedHumidityHWSensor = 10; + } + + return simulatedHumidityHWSensor; +} + +void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + pinMode(buttonPin, INPUT_PULLUP); + + Serial.begin(115200); + + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + // set initial humidity sensor measurement + // Simulated Sensor - it shall initially print 95% and then move to the 10% to 30% humidity range + SimulatedHumiditySensor.begin(95.00); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Humidity Sensor Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } +} + +void loop() { + static uint32_t timeCounter = 0; + + // Print the current humidity value every 5s + if (!(timeCounter++ % 10)) { // delaying for 500ms x 10 = 5s + // Print the current humidity value + Serial.printf("Current Humidity is %.02f%%\r\n", SimulatedHumiditySensor.getHumidity()); + // Update Humidity from the (Simulated) Hardware Sensor + // Matter APP shall display the updated humidity percent + SimulatedHumiditySensor.setHumidity(getSimulatedHumidity()); + } + + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (digitalRead(buttonPin) == HIGH && button_state) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + } + + delay(500); +} diff --git a/libraries/Matter/examples/MatterHumiditySensor/ci.json b/libraries/Matter/examples/MatterHumiditySensor/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterHumiditySensor/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index 60ffc546bd6..c54b040d94b 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -19,6 +19,7 @@ MatterFan KEYWORD1 FanMode_t KEYWORD1 FanModeSequence_t KEYWORD1 MatterTemperatureSensor KEYWORD1 +MatterHumiditySensor KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -65,6 +66,8 @@ onChangeMode KEYWORD2 onChangeSpeedPercent KEYWORD2 setTemperature KEYWORD2 getTemperature KEYWORD2 +setHumidity KEYWORD2 +getHumidity KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index 1b35d876705..4b7804d61df 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -27,6 +27,7 @@ #include #include #include +#include using namespace esp_matter; @@ -60,6 +61,7 @@ class ArduinoMatter { friend class MatterEnhancedColorLight; friend class MatterFan; friend class MatterTemperatureSensor; + friend class MatterHumiditySensor; protected: static void _init(); diff --git a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp new file mode 100644 index 00000000000..3e911606074 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp @@ -0,0 +1,111 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +bool MatterHumiditySensor::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { + bool ret = true; + if (!started) { + log_e("Matter Humidity Sensor device has not begun."); + return false; + } + + log_d("Humidity Sensor Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); + return ret; +} + +MatterHumiditySensor::MatterHumiditySensor() {} + +MatterHumiditySensor::~MatterHumiditySensor() { + end(); +} + +bool MatterHumiditySensor::begin(uint16_t _rawHumidity) { + ArduinoMatter::_init(); + + // is it a valid percentage value? + if (_rawHumidity > 10000) { + log_e("Humidity Sensor Percentage value out of range [0..100]."); + return false; + } + + humidity_sensor::config_t humidity_sensor_config; + humidity_sensor_config.relative_humidity_measurement.measured_value = _rawHumidity; + humidity_sensor_config.relative_humidity_measurement.min_measured_value = nullptr; + humidity_sensor_config.relative_humidity_measurement.max_measured_value = nullptr; + + // endpoint handles can be used to add/modify clusters. + endpoint_t *endpoint = humidity_sensor::create(node::get(), &humidity_sensor_config, ENDPOINT_FLAG_NONE, (void *)this); + if (endpoint == nullptr) { + log_e("Failed to create Humidity Sensor endpoint"); + return false; + } + rawHumidity = _rawHumidity; + setEndPointId(endpoint::get_id(endpoint)); + log_i("Humidity Sensor created with endpoint_id %d", getEndPointId()); + started = true; + return true; +} + +void MatterHumiditySensor::end() { + started = false; +} + +bool MatterHumiditySensor::setRawHumidity(uint16_t _rawHumidity) { + if (!started) { + log_e("Matter Humidity Sensor device has not begun."); + return false; + } + // is it a valid percentage value? + if (_rawHumidity > 10000) { + log_e("Humidity Sensor Percentage value out of range [0..100]."); + return false; + } + + // avoid processing the a "no-change" + if (rawHumidity == _rawHumidity) { + return true; + } + + esp_matter_attr_val_t humidityVal = esp_matter_invalid(NULL); + + if (!getAttributeVal(RelativeHumidityMeasurement::Id, RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, &humidityVal)) { + log_e("Failed to get Humidity Sensor Attribute."); + return false; + } + if (humidityVal.val.u16 != _rawHumidity) { + humidityVal.val.u16 = _rawHumidity; + bool ret; + ret = updateAttributeVal(RelativeHumidityMeasurement::Id, RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, &humidityVal); + if (!ret) { + log_e("Failed to update Fan Speed Percent Attribute."); + return false; + } + rawHumidity = _rawHumidity; + } + log_v("Humidity Sensor set to %.02f Percent", (float)_rawHumidity / 100.00); + + return true; +} + +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h new file mode 100644 index 00000000000..aed758b7b7a --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h @@ -0,0 +1,69 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +class MatterHumiditySensor : public MatterEndPoint { +public: + MatterHumiditySensor(); + ~MatterHumiditySensor(); + // begin Matter Humidity Sensor endpoint with initial float humidity percent + bool begin(double humidityPercent = 0.00) { + if (humidityPercent < 0.0 || humidityPercent > 100.0) { + log_e("Humidity Sensor Percentage value out of range [0..100]."); + return false; + } + return begin(static_cast(humidityPercent * 100.0f)); + } + // this will just stop processing Humidity Sensor Matter events + void end(); + + // set the humidity percent with 1/100th of a percent precision + bool setHumidity(double humidityPercent) { + if (humidityPercent < 0.0 || humidityPercent > 100.0) { + log_e("Humidity Sensor Percentage value out of range [0..100]."); + return false; + } + return setRawHumidity(static_cast(humidityPercent * 100.0f)); + } + // returns the reported float humidity percent with 1/100th of precision + double getHumidity() { + return (double)rawHumidity / 100.0; + } + // double conversion operator + void operator=(double humidityPercent) { + setHumidity(humidityPercent); + } + // double conversion operator + operator double() { + return (double)getHumidity(); + } + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + +protected: + bool started = false; + // implementation keeps humidity relative percentage with 1/100th of a percent precision + uint16_t rawHumidity = 0; + // internal function to set the raw humidity value (Matter Cluster) + bool begin(uint16_t _rawHumidity); + bool setRawHumidity(uint16_t _rawHumidity); +}; +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From de4824fc24c1e0d1062de5ed1b3753996ca5131c Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 10 Dec 2024 18:16:54 -0300 Subject: [PATCH 051/183] feat(matter_examples): apply boot button change to all examples (#10702) * feat(matter_examples): apply boot button change to all examples --- .../MatterColorLight.ino} | 32 ++++---- .../ci.json | 0 .../MatterComposedLights.ino | 74 ++++++++++++++----- .../MatterDimmableLight.ino | 30 ++++---- .../MatterEnhancedColorLight.ino | 26 ++++--- .../Matter/examples/MatterFan/MatterFan.ino | 29 ++++---- .../examples/MatterMinimum/MatterMinimum.ino | 29 ++++++++ .../MatterOnOffLight/MatterOnOffLight.ino | 26 ++++--- .../MatterSmartButon/MatterSmartButon.ino | 26 ++++--- .../MatterTemperatureLight.ino} | 26 ++++--- .../ci.json | 0 .../MatterTemperatureSensor.ino | 47 ++++++++++-- .../WiFiProvWithinMatter.ino | 30 ++++++++ 13 files changed, 260 insertions(+), 115 deletions(-) rename libraries/Matter/examples/{Matter_ColorLight/Matter_ColorLight.ino => MatterColorLight/MatterColorLight.ino} (86%) rename libraries/Matter/examples/{Matter_ColorLight => MatterColorLight}/ci.json (100%) rename libraries/Matter/examples/{Matter_CW_WW_Light/Matter_CW_WW_Light.ino => MatterTemperatureLight/MatterTemperatureLight.ino} (89%) rename libraries/Matter/examples/{Matter_CW_WW_Light => MatterTemperatureLight}/ci.json (100%) diff --git a/libraries/Matter/examples/Matter_ColorLight/Matter_ColorLight.ino b/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino similarity index 86% rename from libraries/Matter/examples/Matter_ColorLight/Matter_ColorLight.ino rename to libraries/Matter/examples/MatterColorLight/MatterColorLight.ino index 2b9c4e4033a..ea91baef0ea 100644 --- a/libraries/Matter/examples/Matter_ColorLight/Matter_ColorLight.ino +++ b/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino @@ -35,7 +35,13 @@ const uint8_t ledPin = 2; // Set your pin here if your board has not defined LE #endif // set your board USER BUTTON pin here -const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9. +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission // WiFi is manually set and started const char *ssid = "your-ssid"; // Change this to your WiFi SSID @@ -125,11 +131,6 @@ void setup() { ColorLight.updateAccessory(); } } -// Button control -uint32_t button_time_stamp = 0; // debouncing control -bool button_state = false; // false = released | true = pressed -const uint32_t debouceTime = 250; // button debouncing time (ms) -const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the light void loop() { // Check Matter Light Commissioning state, which may change during execution of loop() @@ -167,17 +168,18 @@ void loop() { // Onboard User Button is used as a Light toggle switch or to decommission it uint32_t time_diff = millis() - button_time_stamp; - if (button_state && time_diff > debouceTime && digitalRead(buttonPin) == HIGH) { - button_state = false; // released + if (digitalRead(buttonPin) == HIGH && button_state && time_diff > debouceTime) { // Toggle button is released - toggle the light Serial.println("User button released. Toggling Light!"); - ColorLight.toggle(); // Matter Controller also can see the change + ColorLight.toggle(); // Matter Controller also can see the change + button_state = false; // released + } - // Factory reset is triggered if the button is pressed longer than 10 seconds - if (time_diff > decommissioningTimeout) { - Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); - ColorLight = false; // turn the light off - Matter.decommission(); - } + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + ColorLight = false; // turn the light off + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so } } diff --git a/libraries/Matter/examples/Matter_ColorLight/ci.json b/libraries/Matter/examples/MatterColorLight/ci.json similarity index 100% rename from libraries/Matter/examples/Matter_ColorLight/ci.json rename to libraries/Matter/examples/MatterColorLight/ci.json diff --git a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino index 85fcd9e8973..63062ba36a9 100644 --- a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino +++ b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino @@ -18,31 +18,42 @@ // List of Matter Endpoints for this Node // There will be 3 On/Off Light Endpoints in the same Node -MatterOnOffLight OnOffLight1; -MatterOnOffLight OnOffLight2; -MatterOnOffLight OnOffLight3; +MatterOnOffLight Light1; +MatterDimmableLight Light2; +MatterColorLight Light3; // WiFi is manually set and started const char *ssid = "your-ssid"; // Change this to your WiFi SSID const char *password = "your-password"; // Change this to your WiFi password +// set your board USER BUTTON pin here - USED to decommission the Matter Node +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + // Matter Protocol Endpoint Callback for each Light Accessory bool setLightOnOff1(bool state) { - Serial.printf("CB-Light1 changed state to: %s\r\n", state ? "ON" : "OFF"); + Serial.printf("Light1 changed state to: %s\r\n", state ? "ON" : "OFF"); return true; } bool setLightOnOff2(bool state) { - Serial.printf("CB-Light2 changed state to: %s\r\n", state ? "ON" : "OFF"); + Serial.printf("Light2 changed state to: %s\r\n", state ? "ON" : "OFF"); return true; } bool setLightOnOff3(bool state) { - Serial.printf("CB-Light3 changed state to: %s\r\n", state ? "ON" : "OFF"); + Serial.printf("Light3 changed state to: %s\r\n", state ? "ON" : "OFF"); return true; } void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + pinMode(buttonPin, INPUT_PULLUP); + Serial.begin(115200); while (!Serial) { delay(100); @@ -60,24 +71,27 @@ void setup() { delay(500); Serial.print("."); } - Serial.println("\r\nWiFi connected"); + Serial.println(); + Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); // Initialize all 3 Matter EndPoints - OnOffLight1.begin(); - OnOffLight2.begin(); - OnOffLight3.begin(); - OnOffLight1.onChange(setLightOnOff1); - OnOffLight2.onChange(setLightOnOff2); - OnOffLight3.onChange(setLightOnOff3); + Light1.begin(); + Light2.begin(); + Light3.begin(); + Light1.onChangeOnOff(setLightOnOff1); + Light2.onChangeOnOff(setLightOnOff2); + Light3.onChangeOnOff(setLightOnOff3); // Matter beginning - Last step, after all EndPoints are initialized Matter.begin(); } void loop() { + static uint32_t timeCounter = 0; + // Check Matter Light Commissioning state if (!Matter.isDeviceCommissioned()) { Serial.println(""); @@ -97,10 +111,32 @@ void loop() { Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); } - //displays the Light state every 3 seconds - Serial.println("======================"); - Serial.printf("Matter Light #1 is %s\r\n", OnOffLight1.getOnOff() ? "ON" : "OFF"); - Serial.printf("Matter Light #2 is %s\r\n", OnOffLight2.getOnOff() ? "ON" : "OFF"); - Serial.printf("Matter Light #3 is %s\r\n", OnOffLight3.getOnOff() ? "ON" : "OFF"); - delay(3000); + //displays the Light state every 5 seconds + if (!(timeCounter++ % 10)) { // delaying for 500ms x 10 = 5s + Serial.println("======================"); + Serial.printf("Matter Light #1 is %s\r\n", Light1.getOnOff() ? "ON" : "OFF"); + Serial.printf("Matter Light #2 is %s\r\n", Light2.getOnOff() ? "ON" : "OFF"); + Serial.printf("Matter Light #3 is %s\r\n", Light3.getOnOff() ? "ON" : "OFF"); + } + + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (digitalRead(buttonPin) == HIGH && button_state) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } + + delay(500); } diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index cac511926aa..f1af4f84dfc 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -35,7 +35,13 @@ const uint8_t ledPin = 2; // Set your pin here if your board has not defined LE #endif // set your board USER BUTTON pin here -const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9. +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission // WiFi is manually set and started const char *ssid = "your-ssid"; // Change this to your WiFi SSID @@ -117,11 +123,6 @@ void setup() { DimmableLight.updateAccessory(); } } -// Button control -uint32_t button_time_stamp = 0; // debouncing control -bool button_state = false; // false = released | true = pressed -const uint32_t debouceTime = 250; // button debouncing time (ms) -const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the light void loop() { // Check Matter Light Commissioning state, which may change during execution of loop() @@ -156,17 +157,18 @@ void loop() { // Onboard User Button is used as a Light toggle switch or to decommission it uint32_t time_diff = millis() - button_time_stamp; - if (button_state && time_diff > debouceTime && digitalRead(buttonPin) == HIGH) { - button_state = false; // released + if (digitalRead(buttonPin) == HIGH && button_state && time_diff > debouceTime) { // Toggle button is released - toggle the light Serial.println("User button released. Toggling Light!"); DimmableLight.toggle(); // Matter Controller also can see the change + button_state = false; // released + } - // Factory reset is triggered if the button is pressed longer than 10 seconds - if (time_diff > decommissioningTimeout) { - Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); - DimmableLight = false; // turn the light off - Matter.decommission(); - } + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + DimmableLight = false; // turn the light off + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so } } diff --git a/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino index afba203b708..eddbd0f2b21 100644 --- a/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino +++ b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino @@ -38,7 +38,13 @@ const uint8_t ledPin = 2; // Set your pin here if your board has not defined LE #endif // set your board USER BUTTON pin here -const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9. +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission // WiFi is manually set and started const char *ssid = "your-ssid"; // Change this to your WiFi SSID @@ -147,11 +153,6 @@ void setup() { EnhancedColorLight.updateAccessory(); } } -// Button control -uint32_t button_time_stamp = 0; // debouncing control -bool button_state = false; // false = released | true = pressed -const uint32_t debouceTime = 250; // button debouncing time (ms) -const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the light void loop() { // Check Matter Light Commissioning state, which may change during execution of loop() @@ -194,12 +195,13 @@ void loop() { // Toggle button is released - toggle the light Serial.println("User button released. Toggling Light!"); EnhancedColorLight.toggle(); // Matter Controller also can see the change + } - // Factory reset is triggered if the button is pressed longer than 10 seconds - if (time_diff > decommissioningTimeout) { - Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); - EnhancedColorLight = false; // turn the light off - Matter.decommission(); - } + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + EnhancedColorLight = false; // turn the light off + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so } } diff --git a/libraries/Matter/examples/MatterFan/MatterFan.ino b/libraries/Matter/examples/MatterFan/MatterFan.ino index ac26550f2b6..a226dedf75d 100644 --- a/libraries/Matter/examples/MatterFan/MatterFan.ino +++ b/libraries/Matter/examples/MatterFan/MatterFan.ino @@ -20,8 +20,14 @@ // Fan Endpoint - On/Off control + Speed Percent Control + Fan Modes MatterFan Fan; -// set your board USER BUTTON pin here - used for toggling On/Off -const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9. +// set your board USER BUTTON pin here - used for toggling On/Off and decommission the Matter Node +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission // set your board Analog Pin here - used for changing the Fan speed const uint8_t analogPin = A0; // Analog Pin depends on each board @@ -56,7 +62,7 @@ void fanDCMotorDrive(bool fanState, uint8_t speedPercent) { } void setup() { - // Initialize the USER BUTTON (Boot button) GPIO that will toggle the Fan (On/Off) + // Initialize the USER BUTTON (Boot button) GPIO that will toggle the Fan (On/Off) and decommission the Matter Node pinMode(buttonPin, INPUT_PULLUP); // Initialize the Analog Pin A0 used to read input voltage and to set the Fan speed accordingly pinMode(analogPin, INPUT); @@ -140,12 +146,6 @@ void setup() { } } -// Builtin Button control -uint32_t button_time_stamp = 0; // debouncing control -bool button_state = false; // false = released | true = pressed -const uint32_t debouceTime = 250; // button debouncing time (ms) -const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the Matter Fabric - void loop() { // Check Matter Accessory Commissioning state, which may change during execution of loop() if (!Matter.isDeviceCommissioned()) { @@ -181,12 +181,13 @@ void loop() { // button is released - toggle Fan On/Off Fan.toggle(); Serial.printf("User button released. Setting the Fan %s.\r\n", Fan > 0 ? "ON" : "OFF"); + } - // Factory reset is triggered if the button is pressed longer than 10 seconds - if (time_diff > decommissioningTimeout) { - Serial.println("Decommissioning the Generic Switch Matter Accessory. It shall be commissioned again."); - Matter.decommission(); - } + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Generic Switch Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so } // checks Analog pin and adjust the speed only if it has changed diff --git a/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino b/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino index 719c91db23b..cc54d3c12c0 100644 --- a/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino +++ b/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino @@ -35,6 +35,14 @@ const uint8_t ledPin = LED_BUILTIN; const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN #endif +// set your board USER BUTTON pin here - decommissioning button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control - decommision the Matter Node +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + // Matter Protocol Endpoint (On/OFF Light) Callback bool matterCB(bool state) { digitalWrite(ledPin, state ? HIGH : LOW); @@ -47,6 +55,8 @@ const char *ssid = "your-ssid"; // Change this to your WiFi SSID const char *password = "your-password"; // Change this to your WiFi password void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + pinMode(buttonPin, INPUT_PULLUP); // Initialize the LED GPIO pinMode(ledPin, OUTPUT); @@ -77,5 +87,24 @@ void setup() { } void loop() { + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (digitalRead(buttonPin) == HIGH && button_state) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } + delay(500); } diff --git a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino index 0bdd0eb19b7..c7b8757f37b 100644 --- a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino +++ b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino @@ -34,7 +34,13 @@ const uint8_t ledPin = 2; // Set your pin here if your board has not defined LE #endif // set your board USER BUTTON pin here -const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9. +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission // WiFi is manually set and started const char *ssid = "your-ssid"; // Change this to your WiFi SSID @@ -97,11 +103,6 @@ void setup() { OnOffLight.updateAccessory(); // configure the Light based on initial state } } -// Button control -uint32_t button_time_stamp = 0; // debouncing control -bool button_state = false; // false = released | true = pressed -const uint32_t debouceTime = 250; // button debouncing time (ms) -const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the light void loop() { // Check Matter Light Commissioning state, which may change during execution of loop() @@ -140,12 +141,13 @@ void loop() { // Toggle button is released - toggle the light Serial.println("User button released. Toggling Light!"); OnOffLight.toggle(); // Matter Controller also can see the change + } - // Factory reset is triggered if the button is pressed longer than 10 seconds - if (time_diff > decommissioningTimeout) { - Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); - OnOffLight.setOnOff(false); // turn the light off - Matter.decommission(); - } + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + OnOffLight.setOnOff(false); // turn the light off + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so } } diff --git a/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino b/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino index 1d71f2123a6..929c13c1663 100644 --- a/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino +++ b/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino @@ -21,14 +21,20 @@ MatterGenericSwitch SmartButton; // set your board USER BUTTON pin here -const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9. +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission // WiFi is manually set and started const char *ssid = "your-ssid"; // Change this to your WiFi SSID const char *password = "your-password"; // Change this to your WiFi password void setup() { - // Initialize the USER BUTTON (Boot button) GPIO that will act as a toggle switch + // Initialize the USER BUTTON (Boot button) GPIO that will act as a smart button or to decommission the Matter Node pinMode(buttonPin, INPUT_PULLUP); Serial.begin(115200); @@ -63,11 +69,6 @@ void setup() { Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); } } -// Button control -uint32_t button_time_stamp = 0; // debouncing control -bool button_state = false; // false = released | true = pressed -const uint32_t debouceTime = 250; // button debouncing time (ms) -const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the Matter Fabric void loop() { // Check Matter Accessory Commissioning state, which may change during execution of loop() @@ -105,11 +106,12 @@ void loop() { Serial.println("User button released. Sending Click to the Matter Controller!"); // Matter Controller will receive an event and, if programmed, it will trigger an action SmartButton.click(); + } - // Factory reset is triggered if the button is pressed longer than 10 seconds - if (time_diff > decommissioningTimeout) { - Serial.println("Decommissioning the Generic Switch Matter Accessory. It shall be commissioned again."); - Matter.decommission(); - } + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Generic Switch Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so } } diff --git a/libraries/Matter/examples/Matter_CW_WW_Light/Matter_CW_WW_Light.ino b/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino similarity index 89% rename from libraries/Matter/examples/Matter_CW_WW_Light/Matter_CW_WW_Light.ino rename to libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino index 0ff30f53ec0..7937303de54 100644 --- a/libraries/Matter/examples/Matter_CW_WW_Light/Matter_CW_WW_Light.ino +++ b/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino @@ -36,7 +36,13 @@ const uint8_t ledPin = 2; // Set your pin here if your board has not defined LE #endif // set your board USER BUTTON pin here -const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9. +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission // WiFi is manually set and started const char *ssid = "your-ssid"; // Change this to your WiFi SSID @@ -137,11 +143,6 @@ void setup() { CW_WW_Light.updateAccessory(); } } -// Button control -uint32_t button_time_stamp = 0; // debouncing control -bool button_state = false; // false = released | true = pressed -const uint32_t debouceTime = 250; // button debouncing time (ms) -const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the light void loop() { // Check Matter Light Commissioning state, which may change during execution of loop() @@ -184,12 +185,13 @@ void loop() { // Toggle button is released - toggle the light Serial.println("User button released. Toggling Light!"); CW_WW_Light.toggle(); // Matter Controller also can see the change + } - // Factory reset is triggered if the button is pressed longer than 10 seconds - if (time_diff > decommissioningTimeout) { - Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); - CW_WW_Light = false; // turn the light off - Matter.decommission(); - } + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + CW_WW_Light = false; // turn the light off + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so } } diff --git a/libraries/Matter/examples/Matter_CW_WW_Light/ci.json b/libraries/Matter/examples/MatterTemperatureLight/ci.json similarity index 100% rename from libraries/Matter/examples/Matter_CW_WW_Light/ci.json rename to libraries/Matter/examples/MatterTemperatureLight/ci.json diff --git a/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino b/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino index 216406d6082..86055be26ee 100644 --- a/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino +++ b/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino @@ -27,6 +27,14 @@ // Matter Temperature Sensor Endpoint MatterTemperatureSensor SimulatedTemperatureSensor; +// set your board USER BUTTON pin here - decommissioning button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control - decommision the Matter Node +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + // WiFi is manually set and started const char *ssid = "your-ssid"; // Change this to your WiFi SSID const char *password = "your-password"; // Change this to your WiFi password @@ -47,6 +55,9 @@ float getSimulatedTemperature() { } void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + pinMode(buttonPin, INPUT_PULLUP); + Serial.begin(115200); // Manually connect to WiFi @@ -86,9 +97,35 @@ void setup() { } void loop() { - Serial.printf("Current Temperature is %.02f \r\n", SimulatedTemperatureSensor.getTemperature()); - // update the temperature sensor value every 5 seconds - // Matter APP shall display the updated temperature - delay(5000); - SimulatedTemperatureSensor.setTemperature(getSimulatedTemperature()); + static uint32_t timeCounter = 0; + + // Print the current temperature value every 5s + if (!(timeCounter++ % 10)) { // delaying for 500ms x 10 = 5s + // Print the current temperature value + Serial.printf("Current Temperature is %.02f \r\n", SimulatedTemperatureSensor.getTemperature()); + // Update Temperature from the (Simulated) Hardware Sensor + // Matter APP shall display the updated temperature percent + SimulatedTemperatureSensor.setTemperature(getSimulatedTemperature()); + } + + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (digitalRead(buttonPin) == HIGH && button_state) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } + + delay(500); } diff --git a/libraries/Matter/examples/WiFiProvWithinMatter/WiFiProvWithinMatter.ino b/libraries/Matter/examples/WiFiProvWithinMatter/WiFiProvWithinMatter.ino index eaf1f5096e5..3434217624d 100644 --- a/libraries/Matter/examples/WiFiProvWithinMatter/WiFiProvWithinMatter.ino +++ b/libraries/Matter/examples/WiFiProvWithinMatter/WiFiProvWithinMatter.ino @@ -41,6 +41,14 @@ const uint8_t ledPin = LED_BUILTIN; const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN #endif +// set your board USER BUTTON pin here - decommissioning button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control - decommision the Matter Node +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + // Matter Protocol Endpoint (On/OFF Light) Callback bool matterCB(bool state) { digitalWrite(ledPin, state ? HIGH : LOW); @@ -49,6 +57,9 @@ bool matterCB(bool state) { } void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + pinMode(buttonPin, INPUT_PULLUP); + Serial.begin(115200); // Initialize the LED GPIO pinMode(ledPin, OUTPUT); @@ -118,5 +129,24 @@ void setup() { } void loop() { + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (digitalRead(buttonPin) == HIGH && button_state) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } + delay(500); } From 178af05079730648a1bfd98e6bb89eced68e1efb Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 10 Dec 2024 19:51:52 -0300 Subject: [PATCH 052/183] feat(matter): adds a new matter endpoint for pressure sensor --- CMakeLists.txt | 1 + .../MatterPressureSensor.ino | 131 ++++++++++++++++++ .../examples/MatterPressureSensor/ci.json | 7 + libraries/Matter/keywords.txt | 3 + libraries/Matter/src/Matter.h | 2 + .../MatterEndpoints/MatterPressureSensor.cpp | 99 +++++++++++++ .../MatterEndpoints/MatterPressureSensor.h | 62 +++++++++ 7 files changed, 305 insertions(+) create mode 100644 libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino create mode 100644 libraries/Matter/examples/MatterPressureSensor/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ed9ae23f83f..ec465a4182b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -177,6 +177,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS libraries/Matter/src/MatterEndpoints/MatterFan.cpp libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp + libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS diff --git a/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino b/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino new file mode 100644 index 00000000000..b1708f85d85 --- /dev/null +++ b/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino @@ -0,0 +1,131 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + * This example is an example code that will create a Matter Device which can be + * commissioned and controlled from a Matter Environment APP. + * Additionally the ESP32 will send debug messages indicating the Matter activity. + * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. + */ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Matter Pressure Sensor Endpoint +MatterPressureSensor SimulatedPressureSensor; + +// set your board USER BUTTON pin here - decommissioning button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Button control - decommision the Matter Node +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +// Simulate a pressure sensor - add your preferred pressure sensor library code here +float getSimulatedPressure() { + // The Endpoint implementation keeps an uint16_t as internal value information, + // which stores data in hPa (pressure measurement unit) + static float simulatedPressureHWSensor = 950; + + // it will increase from 950 to 1100 hPa in steps of 10 hPa to simulate a pressure sensor + simulatedPressureHWSensor = simulatedPressureHWSensor + 10; + if (simulatedPressureHWSensor > 1100) { + simulatedPressureHWSensor = 950; + } + + return simulatedPressureHWSensor; +} + +void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + pinMode(buttonPin, INPUT_PULLUP); + + Serial.begin(115200); + + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + // set initial pressure sensor measurement + // Simulated Sensor - it shall initially print 900hPa and then move to the 950 to 1100 hPa as pressure range + SimulatedPressureSensor.begin(900.00); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Pressure Sensor Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } +} + +void loop() { + static uint32_t timeCounter = 0; + + // Print the current pressure value every 5s + if (!(timeCounter++ % 10)) { // delaying for 500ms x 10 = 5s + // Print the current pressure value + Serial.printf("Current Pressure is %.02fhPa\r\n", SimulatedPressureSensor.getPressure()); + // Update Pressure from the (Simulated) Hardware Sensor + // Matter APP shall display the updated pressure percent + SimulatedPressureSensor.setPressure(getSimulatedPressure()); + } + + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (digitalRead(buttonPin) == HIGH && button_state) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + // Factory reset is triggered if the button is pressed longer than 10 seconds + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + } + + delay(500); +} diff --git a/libraries/Matter/examples/MatterPressureSensor/ci.json b/libraries/Matter/examples/MatterPressureSensor/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterPressureSensor/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index c54b040d94b..287b8789a86 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -20,6 +20,7 @@ FanMode_t KEYWORD1 FanModeSequence_t KEYWORD1 MatterTemperatureSensor KEYWORD1 MatterHumiditySensor KEYWORD1 +MatterPressureSensor KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -68,6 +69,8 @@ setTemperature KEYWORD2 getTemperature KEYWORD2 setHumidity KEYWORD2 getHumidity KEYWORD2 +setPressure KEYWORD2 +getPressure KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index 4b7804d61df..ebde7cdf589 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -28,6 +28,7 @@ #include #include #include +#include using namespace esp_matter; @@ -62,6 +63,7 @@ class ArduinoMatter { friend class MatterFan; friend class MatterTemperatureSensor; friend class MatterHumiditySensor; + friend class MatterPressureSensor; protected: static void _init(); diff --git a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp new file mode 100644 index 00000000000..6b54cf8af3a --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp @@ -0,0 +1,99 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +bool MatterPressureSensor::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { + bool ret = true; + if (!started) { + log_e("Matter Pressure Sensor device has not begun."); + return false; + } + + log_d("Pressure Sensor Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); + return ret; +} + +MatterPressureSensor::MatterPressureSensor() {} + +MatterPressureSensor::~MatterPressureSensor() { + end(); +} + +bool MatterPressureSensor::begin(int16_t _rawPressure) { + ArduinoMatter::_init(); + + pressure_sensor::config_t pressure_sensor_config; + pressure_sensor_config.pressure_measurement.pressure_measured_value = _rawPressure; + pressure_sensor_config.pressure_measurement.pressure_min_measured_value = nullptr; + pressure_sensor_config.pressure_measurement.pressure_max_measured_value = nullptr; + + // endpoint handles can be used to add/modify clusters + endpoint_t *endpoint = pressure_sensor::create(node::get(), &pressure_sensor_config, ENDPOINT_FLAG_NONE, (void *)this); + if (endpoint == nullptr) { + log_e("Failed to create Pressure Sensor endpoint"); + return false; + } + rawPressure = _rawPressure; + setEndPointId(endpoint::get_id(endpoint)); + log_i("Pressure Sensor created with endpoint_id %d", getEndPointId()); + started = true; + return true; +} + +void MatterPressureSensor::end() { + started = false; +} + +bool MatterPressureSensor::setRawPressure(int16_t _rawPressure) { + if (!started) { + log_e("Matter Pressure Sensor device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (rawPressure == _rawPressure) { + return true; + } + + esp_matter_attr_val_t pressureVal = esp_matter_invalid(NULL); + + if (!getAttributeVal(PressureMeasurement::Id, PressureMeasurement::Attributes::MeasuredValue::Id, &pressureVal)) { + log_e("Failed to get Pressure Sensor Attribute."); + return false; + } + if (pressureVal.val.i16 != _rawPressure) { + pressureVal.val.i16 = _rawPressure; + bool ret; + ret = updateAttributeVal(PressureMeasurement::Id, PressureMeasurement::Attributes::MeasuredValue::Id, &pressureVal); + if (!ret) { + log_e("Failed to update Fan Speed Percent Attribute."); + return false; + } + rawPressure = _rawPressure; + } + log_v("Pressure Sensor set to %.02f Degrees", (float)_rawPressure / 100.00); + + return true; +} + +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h new file mode 100644 index 00000000000..9fdd90c6ebe --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h @@ -0,0 +1,62 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +class MatterPressureSensor : public MatterEndPoint { +public: + MatterPressureSensor(); + ~MatterPressureSensor(); + // begin Matter Pressure Sensor endpoint with initial float pressure + bool begin(double pressure = 0.00) { + return begin(static_cast(pressure)); + } + // this will stop processing Pressure Sensor Matter events + void end(); + + // set the reported raw pressure in hPa + bool setPressure(double pressure) { + int16_t rawValue = static_cast(pressure); + return setRawPressure(rawValue); + } + // returns the reported float pressure in hPa + double getPressure() { + return (double)rawPressure; + } + // double conversion operator + void operator=(double pressure) { + setPressure(pressure); + } + // double conversion operator + operator double() { + return (double)getPressure(); + } + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + +protected: + bool started = false; + // implementation keeps pressure in hPa + int16_t rawPressure = 0; + // internal function to set the raw pressure value (Matter Cluster) + bool setRawPressure(int16_t _rawPressure); + bool begin(int16_t _rawPressure); +}; +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From 59bc22a98f18ccad725d3cca14c6394928eab01f Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Wed, 11 Dec 2024 00:49:58 +0000 Subject: [PATCH 053/183] IDF release/v5.3 9a6aba74 --- package/package_esp32_index.template.json | 68 +++++++++++------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 6b5a6370a4f..0140b1aa065 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -42,7 +42,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.3-a0f798cf" + "version": "idf-release_v5.3-9a6aba74-v1" }, { "packager": "esp32", @@ -95,63 +95,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.3-a0f798cf", + "version": "idf-release_v5.3-9a6aba74-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "checksum": "SHA-256:f552d02ecef616389f1d0c973cb270718a192e6258db426656cd5965db3c6ed0", - "size": "339750940" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", + "size": "340725612" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "checksum": "SHA-256:f552d02ecef616389f1d0c973cb270718a192e6258db426656cd5965db3c6ed0", - "size": "339750940" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", + "size": "340725612" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "checksum": "SHA-256:f552d02ecef616389f1d0c973cb270718a192e6258db426656cd5965db3c6ed0", - "size": "339750940" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", + "size": "340725612" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "checksum": "SHA-256:f552d02ecef616389f1d0c973cb270718a192e6258db426656cd5965db3c6ed0", - "size": "339750940" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", + "size": "340725612" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "checksum": "SHA-256:f552d02ecef616389f1d0c973cb270718a192e6258db426656cd5965db3c6ed0", - "size": "339750940" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", + "size": "340725612" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "checksum": "SHA-256:f552d02ecef616389f1d0c973cb270718a192e6258db426656cd5965db3c6ed0", - "size": "339750940" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", + "size": "340725612" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "checksum": "SHA-256:f552d02ecef616389f1d0c973cb270718a192e6258db426656cd5965db3c6ed0", - "size": "339750940" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", + "size": "340725612" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-a0f798cf.zip", - "checksum": "SHA-256:f552d02ecef616389f1d0c973cb270718a192e6258db426656cd5965db3c6ed0", - "size": "339750940" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", + "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", + "size": "340725612" } ] }, From 9c383687e0601d855e9680172526ea6ef302ca1c Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Wed, 11 Dec 2024 00:18:11 -0300 Subject: [PATCH 054/183] feat(matter): creates a matter contact sensor endpoint --- CMakeLists.txt | 1 + .../MatterContactSensor.ino | 152 ++++++++++++++++++ .../examples/MatterContactSensor/ci.json | 7 + libraries/Matter/keywords.txt | 3 + libraries/Matter/src/Matter.h | 2 + .../MatterEndpoints/MatterContactSensor.cpp | 98 +++++++++++ .../src/MatterEndpoints/MatterContactSensor.h | 54 +++++++ 7 files changed, 317 insertions(+) create mode 100644 libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino create mode 100644 libraries/Matter/examples/MatterContactSensor/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterContactSensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ed9ae23f83f..f3d889eb4c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -177,6 +177,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS libraries/Matter/src/MatterEndpoints/MatterFan.cpp libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp + libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS diff --git a/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino b/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino new file mode 100644 index 00000000000..ebea5000536 --- /dev/null +++ b/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino @@ -0,0 +1,152 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + * This example is an example code that will create a Matter Device which can be + * commissioned and controlled from a Matter Environment APP. + * Additionally the ESP32 will send debug messages indicating the Matter activity. + * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. + * + * The example will create a Matter Contact Sensor Device. + * The Contact Sensor state can be toggled by pressing the onboard button. + * The Contact Sensor state will be indicated by the onboard LED. + * The Contact Sensor state will be simulated to change every 20 seconds. + * + * The onboard button can be kept pressed for 5 seconds to decommission the Matter Node. + * The example will also show the manual commissioning code and QR code to be used in the Matter environment. + * + */ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Matter Contact Sensor Endpoint +MatterContactSensor ContactSensor; + +// LED will be used to indicate the Contact Sensor state +// set your board RGB LED pin here +#ifdef RGB_BUILTIN +const uint8_t ledPin = RGB_BUILTIN; +#else +const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN +#warning "Do not forget to set the RGB LED pin" +#endif + +// set your board USER BUTTON pin here - decommissioning and Manual Contact Sensor toggle button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + // The button will also be used to manually toggle the Contact Sensor state + pinMode(buttonPin, INPUT_PULLUP); + // Initialize the LED (light) GPIO and Matter End Point + pinMode(ledPin, OUTPUT); + + Serial.begin(115200); + + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + // set initial contact sensor state as false (default) + ContactSensor.begin(); + digitalWrite(ledPin, LOW); // LED OFF + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Contact Sensor Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } +} + +bool simulatedHWContactSensor() { + // Simulated Contact Sensor + static bool contactState = false; + static uint32_t lastTime = 0; + + // Simulate a Contact Sensor state change every 20 seconds + if (millis() - lastTime > 20000) { + contactState = !contactState; + lastTime = millis(); + } + return contactState; +} + +void loop() { + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > debouceTime && digitalRead(buttonPin) == HIGH) { + button_state = false; // released + // button is released - toggle Contact State (Open/Closed) + ContactSensor.setContact(!ContactSensor.getContact()); // same as ContactSensor = !ContactSensor; + Serial.printf("User button released. Setting the Contact Sensor to %s.\r\n", ContactSensor ? "Closed" : "Open"); + // LED will indicate the Contact Sensor state + if (ContactSensor) { + digitalWrite(ledPin, HIGH); // LED ON + } else { + digitalWrite(ledPin, LOW); // LED OFF + } + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Generic Switch Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } + + // Simulated Contact Sensor + ContactSensor.setContact(simulatedHWContactSensor()); + + delay(50); +} diff --git a/libraries/Matter/examples/MatterContactSensor/ci.json b/libraries/Matter/examples/MatterContactSensor/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterContactSensor/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index c54b040d94b..5b04d6f91e4 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -20,6 +20,7 @@ FanMode_t KEYWORD1 FanModeSequence_t KEYWORD1 MatterTemperatureSensor KEYWORD1 MatterHumiditySensor KEYWORD1 +MatterContactSensor KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -68,6 +69,8 @@ setTemperature KEYWORD2 getTemperature KEYWORD2 setHumidity KEYWORD2 getHumidity KEYWORD2 +setContact KEYWORD2 +getContact KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index 4b7804d61df..65483abb583 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -28,6 +28,7 @@ #include #include #include +#include using namespace esp_matter; @@ -62,6 +63,7 @@ class ArduinoMatter { friend class MatterFan; friend class MatterTemperatureSensor; friend class MatterHumiditySensor; + friend class MatterContactSensor; protected: static void _init(); diff --git a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp new file mode 100644 index 00000000000..24266c82c95 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp @@ -0,0 +1,98 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +bool MatterContactSensor::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { + bool ret = true; + if (!started) { + log_e("Matter Contact Sensor device has not begun."); + return false; + } + + log_d("Contact Sensor Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); + return ret; +} + +MatterContactSensor::MatterContactSensor() {} + +MatterContactSensor::~MatterContactSensor() { + end(); +} + +bool MatterContactSensor::begin(bool _contactState) { + ArduinoMatter::_init(); + + contact_sensor::config_t contact_sensor_config; + contact_sensor_config.boolean_state.state_value = _contactState; + + // endpoint handles can be used to add/modify clusters. + endpoint_t *endpoint = contact_sensor::create(node::get(), &contact_sensor_config, ENDPOINT_FLAG_NONE, (void *)this); + if (endpoint == nullptr) { + log_e("Failed to create Contact Sensor endpoint"); + return false; + } + contactState = _contactState; + setEndPointId(endpoint::get_id(endpoint)); + log_i("Contact Sensor created with endpoint_id %d", getEndPointId()); + started = true; + return true; +} + +void MatterContactSensor::end() { + started = false; +} + +bool MatterContactSensor::setContact(bool _contactState) { + if (!started) { + log_e("Matter Contact Sensor device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (contactState == _contactState) { + return true; + } + + esp_matter_attr_val_t contactVal = esp_matter_invalid(NULL); + + if (!getAttributeVal(BooleanState::Id, BooleanState::Attributes::StateValue::Id, &contactVal)) { + log_e("Failed to get Contact Sensor Attribute."); + return false; + } + if (contactVal.val.u8 != _contactState) { + contactVal.val.u8 = _contactState; + bool ret; + ret = updateAttributeVal(BooleanState::Id, BooleanState::Attributes::StateValue::Id, &contactVal); + if (!ret) { + log_e("Failed to update Contact Sensor Attribute."); + return false; + } + contactState = _contactState; + } + log_v("Contact Sensor set to %s", _contactState ? "Closed" : "Open"); + + return true; +} + +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h new file mode 100644 index 00000000000..257da785e53 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h @@ -0,0 +1,54 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +class MatterContactSensor : public MatterEndPoint { +public: + MatterContactSensor(); + ~MatterContactSensor(); + // begin Matter Contact Sensor endpoint with initial contact state + bool begin(bool _contactState = false); + // this will just stop processing Contact Sensor Matter events + void end(); + + // set the contact state + bool setContact(bool _contactState); + // returns the contact state + bool getContact() { + return contactState; + } + + // bool conversion operator + void operator=(bool _contactState) { + setContact(_contactState); + } + // bool conversion operator + operator bool() { + return getContact(); + } + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + +protected: + bool started = false; + bool contactState = false; +}; +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From 1f9eb74337a453a9fba4d3b2120a14270a6d5725 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Wed, 11 Dec 2024 00:25:43 -0300 Subject: [PATCH 055/183] fix(matter): fix a bad error message - left over --- libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp index 6b54cf8af3a..a157469c980 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp @@ -86,7 +86,7 @@ bool MatterPressureSensor::setRawPressure(int16_t _rawPressure) { bool ret; ret = updateAttributeVal(PressureMeasurement::Id, PressureMeasurement::Attributes::MeasuredValue::Id, &pressureVal); if (!ret) { - log_e("Failed to update Fan Speed Percent Attribute."); + log_e("Failed to update Pressure Sensor Measurement Attribute."); return false; } rawPressure = _rawPressure; From 07a3e629c88e01d2d9f14dcdfdfca4f52a9bc2c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Wed, 11 Dec 2024 10:35:54 +0100 Subject: [PATCH 056/183] fix(example): Remove wait on Serial after begin --- .../Zigbee_Color_Dimmable_Light.ino | 3 --- .../Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino | 3 --- .../examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino | 4 +--- .../examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino | 3 --- .../examples/Zigbee_Scan_Networks/Zigbee_Scan_Networks.ino | 3 --- .../Zigbee_Temp_Hum_Sensor_Sleepy.ino | 4 +--- .../Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino | 4 +--- .../Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino | 3 --- 8 files changed, 3 insertions(+), 24 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino b/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino index c43981459f0..e84720d4863 100644 --- a/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino +++ b/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino @@ -66,9 +66,6 @@ void identify(uint16_t time) { /********************* Arduino functions **************************/ void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } // Init RMT and leave light OFF rgbLedWrite(led, 0, 0, 0); diff --git a/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino b/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino index 0ae8fd86a75..6af87748b2d 100644 --- a/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino +++ b/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino @@ -47,9 +47,6 @@ ZigbeeColorDimmerSwitch zbSwitch = ZigbeeColorDimmerSwitch(SWITCH_ENDPOINT_NUMBE /********************* Arduino functions **************************/ void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } //Init button switch pinMode(button, INPUT_PULLUP); diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino b/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino index 23c9b38f7c9..6db8bd7b022 100644 --- a/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino +++ b/libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino @@ -47,9 +47,7 @@ void setLED(bool value) { /********************* Arduino functions **************************/ void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } + // Init LED and turn it OFF (if LED_PIN == RGB_BUILTIN, the rgbLedWrite() will be used under the hood) pinMode(led, OUTPUT); digitalWrite(led, LOW); diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino b/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino index d40f54bc5d9..56d23cdc95f 100644 --- a/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino +++ b/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino @@ -95,9 +95,6 @@ static void enableGpioInterrupt(bool enabled) { /********************* Arduino functions **************************/ void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } //Optional: set Zigbee device name and model zbSwitch.setManufacturerAndModel("Espressif", "ZigbeeSwitch"); diff --git a/libraries/Zigbee/examples/Zigbee_Scan_Networks/Zigbee_Scan_Networks.ino b/libraries/Zigbee/examples/Zigbee_Scan_Networks/Zigbee_Scan_Networks.ino index c3a74e0aee5..eab6ecfd76e 100644 --- a/libraries/Zigbee/examples/Zigbee_Scan_Networks/Zigbee_Scan_Networks.ino +++ b/libraries/Zigbee/examples/Zigbee_Scan_Networks/Zigbee_Scan_Networks.ino @@ -76,9 +76,6 @@ void printScannedNetworks(uint16_t networksFound) { void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } // Initialize Zigbee stack without any EPs just for scanning if (!Zigbee.begin(role)) { diff --git a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino index 67d36fce6cf..2b342161199 100644 --- a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino +++ b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino @@ -68,9 +68,7 @@ void meausureAndSleep() { /********************* Arduino functions **************************/ void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } + // Init button switch pinMode(button, INPUT_PULLUP); diff --git a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino index e3fb1273735..22b0c6fbeed 100644 --- a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino @@ -53,9 +53,7 @@ static void temp_sensor_value_update(void *arg) { /********************* Arduino functions **************************/ void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } + // Init button switch pinMode(button, INPUT_PULLUP); diff --git a/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino b/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino index 3de30dff6be..a4720feeba4 100644 --- a/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino +++ b/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino @@ -60,9 +60,6 @@ void recieveSensorConfig(float min_temp, float max_temp, float tolerance) { /********************* Arduino functions **************************/ void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } // Init button switch pinMode(button, INPUT_PULLUP); From 7c95911ff158d3677edaf7228ec25ae145bc1051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Wed, 11 Dec 2024 11:13:46 +0100 Subject: [PATCH 057/183] fix(SDMMC): Remove need for BOARD_HAS_SDMMC for esp32 --- libraries/SD_MMC/src/SD_MMC.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/SD_MMC/src/SD_MMC.cpp b/libraries/SD_MMC/src/SD_MMC.cpp index 4a0962ff7e4..4665198c4ae 100644 --- a/libraries/SD_MMC/src/SD_MMC.cpp +++ b/libraries/SD_MMC/src/SD_MMC.cpp @@ -49,7 +49,7 @@ SDMMCFS::SDMMCFS(FSImplPtr impl) : FS(impl), _card(nullptr) { _pin_d3 = SDMMC_D3; #endif // BOARD_HAS_1BIT_SDMMC -#elif defined(SOC_SDMMC_USE_IOMUX) && defined(BOARD_HAS_SDMMC) && defined(CONFIG_IDF_TARGET_ESP32) +#elif defined(SOC_SDMMC_USE_IOMUX) && defined(CONFIG_IDF_TARGET_ESP32) _pin_clk = SDMMC_SLOT1_IOMUX_PIN_NUM_CLK; _pin_cmd = SDMMC_SLOT1_IOMUX_PIN_NUM_CMD; _pin_d0 = SDMMC_SLOT1_IOMUX_PIN_NUM_D0; From bfc45db3af2bd920f6dcee3c4f66553daa4a9e5c Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 11 Dec 2024 08:56:12 -0300 Subject: [PATCH 058/183] ci(tests): Re-enable UART test for P4 --- tests/validation/uart/ci.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/validation/uart/ci.json b/tests/validation/uart/ci.json index dc24acbaee2..54da33b6176 100644 --- a/tests/validation/uart/ci.json +++ b/tests/validation/uart/ci.json @@ -1,8 +1,5 @@ { "platforms": { "qemu": false - }, - "targets": { - "esp32p4": false } } From 56a9b1d123fc7c8ea08703818bb68dbeb5536b27 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 12:25:13 +0000 Subject: [PATCH 059/183] ci(pre-commit): Apply automatic fixes --- .../MatterPressureSensor.ino | 262 +++++++++--------- 1 file changed, 131 insertions(+), 131 deletions(-) diff --git a/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino b/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino index b1708f85d85..aa6b28f199f 100644 --- a/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino +++ b/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino @@ -1,131 +1,131 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* - * This example is an example code that will create a Matter Device which can be - * commissioned and controlled from a Matter Environment APP. - * Additionally the ESP32 will send debug messages indicating the Matter activity. - * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. - */ - -// Matter Manager -#include -#include - -// List of Matter Endpoints for this Node -// Matter Pressure Sensor Endpoint -MatterPressureSensor SimulatedPressureSensor; - -// set your board USER BUTTON pin here - decommissioning button -const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. - -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - -// Button control - decommision the Matter Node -uint32_t button_time_stamp = 0; // debouncing control -bool button_state = false; // false = released | true = pressed -const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission - -// Simulate a pressure sensor - add your preferred pressure sensor library code here -float getSimulatedPressure() { - // The Endpoint implementation keeps an uint16_t as internal value information, - // which stores data in hPa (pressure measurement unit) - static float simulatedPressureHWSensor = 950; - - // it will increase from 950 to 1100 hPa in steps of 10 hPa to simulate a pressure sensor - simulatedPressureHWSensor = simulatedPressureHWSensor + 10; - if (simulatedPressureHWSensor > 1100) { - simulatedPressureHWSensor = 950; - } - - return simulatedPressureHWSensor; -} - -void setup() { - // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node - pinMode(buttonPin, INPUT_PULLUP); - - Serial.begin(115200); - - // Manually connect to WiFi - WiFi.begin(ssid, password); - // Wait for connection - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - Serial.println(); - - // set initial pressure sensor measurement - // Simulated Sensor - it shall initially print 900hPa and then move to the 950 to 1100 hPa as pressure range - SimulatedPressureSensor.begin(900.00); - - // Matter beginning - Last step, after all EndPoints are initialized - Matter.begin(); - - // Check Matter Accessory Commissioning state, which may change during execution of loop() - if (!Matter.isDeviceCommissioned()) { - Serial.println(""); - Serial.println("Matter Node is not commissioned yet."); - Serial.println("Initiate the device discovery in your Matter environment."); - Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); - Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); - Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); - // waits for Matter Pressure Sensor Commissioning. - uint32_t timeCount = 0; - while (!Matter.isDeviceCommissioned()) { - delay(100); - if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec - Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); - } - } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); - } -} - -void loop() { - static uint32_t timeCounter = 0; - - // Print the current pressure value every 5s - if (!(timeCounter++ % 10)) { // delaying for 500ms x 10 = 5s - // Print the current pressure value - Serial.printf("Current Pressure is %.02fhPa\r\n", SimulatedPressureSensor.getPressure()); - // Update Pressure from the (Simulated) Hardware Sensor - // Matter APP shall display the updated pressure percent - SimulatedPressureSensor.setPressure(getSimulatedPressure()); - } - - // Check if the button has been pressed - if (digitalRead(buttonPin) == LOW && !button_state) { - // deals with button debouncing - button_time_stamp = millis(); // record the time while the button is pressed. - button_state = true; // pressed. - } - - if (digitalRead(buttonPin) == HIGH && button_state) { - button_state = false; // released - } - - // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node - uint32_t time_diff = millis() - button_time_stamp; - if (button_state && time_diff > decommissioningTimeout) { - // Factory reset is triggered if the button is pressed longer than 10 seconds - Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); - Matter.decommission(); - } - - delay(500); -} +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + * This example is an example code that will create a Matter Device which can be + * commissioned and controlled from a Matter Environment APP. + * Additionally the ESP32 will send debug messages indicating the Matter activity. + * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. + */ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Matter Pressure Sensor Endpoint +MatterPressureSensor SimulatedPressureSensor; + +// set your board USER BUTTON pin here - decommissioning button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Button control - decommision the Matter Node +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +// Simulate a pressure sensor - add your preferred pressure sensor library code here +float getSimulatedPressure() { + // The Endpoint implementation keeps an uint16_t as internal value information, + // which stores data in hPa (pressure measurement unit) + static float simulatedPressureHWSensor = 950; + + // it will increase from 950 to 1100 hPa in steps of 10 hPa to simulate a pressure sensor + simulatedPressureHWSensor = simulatedPressureHWSensor + 10; + if (simulatedPressureHWSensor > 1100) { + simulatedPressureHWSensor = 950; + } + + return simulatedPressureHWSensor; +} + +void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + pinMode(buttonPin, INPUT_PULLUP); + + Serial.begin(115200); + + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + // set initial pressure sensor measurement + // Simulated Sensor - it shall initially print 900hPa and then move to the 950 to 1100 hPa as pressure range + SimulatedPressureSensor.begin(900.00); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Pressure Sensor Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } +} + +void loop() { + static uint32_t timeCounter = 0; + + // Print the current pressure value every 5s + if (!(timeCounter++ % 10)) { // delaying for 500ms x 10 = 5s + // Print the current pressure value + Serial.printf("Current Pressure is %.02fhPa\r\n", SimulatedPressureSensor.getPressure()); + // Update Pressure from the (Simulated) Hardware Sensor + // Matter APP shall display the updated pressure percent + SimulatedPressureSensor.setPressure(getSimulatedPressure()); + } + + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (digitalRead(buttonPin) == HIGH && button_state) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + // Factory reset is triggered if the button is pressed longer than 10 seconds + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + } + + delay(500); +} From dfa732419b4b0453dd41ed24dd4ddff84ca38162 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Wed, 11 Dec 2024 12:35:59 +0000 Subject: [PATCH 060/183] IDF release/v5.3 083aad99 --- package/package_esp32_index.template.json | 68 +++++++++++------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 0140b1aa065..63bb102549b 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -42,7 +42,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.3-9a6aba74-v1" + "version": "idf-release_v5.3-083aad99-v1" }, { "packager": "esp32", @@ -95,63 +95,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.3-9a6aba74-v1", + "version": "idf-release_v5.3-083aad99-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", - "size": "340725612" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", + "size": "341111216" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", - "size": "340725612" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", + "size": "341111216" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", - "size": "340725612" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", + "size": "341111216" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", - "size": "340725612" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", + "size": "341111216" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", - "size": "340725612" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", + "size": "341111216" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", - "size": "340725612" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", + "size": "341111216" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", - "size": "340725612" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", + "size": "341111216" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-9a6aba74-v1.zip", - "checksum": "SHA-256:e218500a539d4d2ba06f588efea1ed71c8a6a99916f4316e433758f41860b33d", - "size": "340725612" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", + "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", + "size": "341111216" } ] }, From 8cbc39512237394c081b16e09f1c0364d85ccbec Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 13:30:13 +0000 Subject: [PATCH 061/183] ci(pre-commit): Apply automatic fixes --- .../MatterContactSensor.ino | 304 +++++++++--------- .../MatterEndpoints/MatterContactSensor.cpp | 2 +- 2 files changed, 153 insertions(+), 153 deletions(-) diff --git a/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino b/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino index ebea5000536..7b4d95a880b 100644 --- a/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino +++ b/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino @@ -1,152 +1,152 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* - * This example is an example code that will create a Matter Device which can be - * commissioned and controlled from a Matter Environment APP. - * Additionally the ESP32 will send debug messages indicating the Matter activity. - * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. - * - * The example will create a Matter Contact Sensor Device. - * The Contact Sensor state can be toggled by pressing the onboard button. - * The Contact Sensor state will be indicated by the onboard LED. - * The Contact Sensor state will be simulated to change every 20 seconds. - * - * The onboard button can be kept pressed for 5 seconds to decommission the Matter Node. - * The example will also show the manual commissioning code and QR code to be used in the Matter environment. - * - */ - -// Matter Manager -#include -#include - -// List of Matter Endpoints for this Node -// Matter Contact Sensor Endpoint -MatterContactSensor ContactSensor; - -// LED will be used to indicate the Contact Sensor state -// set your board RGB LED pin here -#ifdef RGB_BUILTIN -const uint8_t ledPin = RGB_BUILTIN; -#else -const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN -#warning "Do not forget to set the RGB LED pin" -#endif - -// set your board USER BUTTON pin here - decommissioning and Manual Contact Sensor toggle button -const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. - -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - -// Button control -uint32_t button_time_stamp = 0; // debouncing control -bool button_state = false; // false = released | true = pressed -const uint32_t debouceTime = 250; // button debouncing time (ms) -const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission - -void setup() { - // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node - // The button will also be used to manually toggle the Contact Sensor state - pinMode(buttonPin, INPUT_PULLUP); - // Initialize the LED (light) GPIO and Matter End Point - pinMode(ledPin, OUTPUT); - - Serial.begin(115200); - - // Manually connect to WiFi - WiFi.begin(ssid, password); - // Wait for connection - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - Serial.println(); - - // set initial contact sensor state as false (default) - ContactSensor.begin(); - digitalWrite(ledPin, LOW); // LED OFF - - // Matter beginning - Last step, after all EndPoints are initialized - Matter.begin(); - - // Check Matter Accessory Commissioning state, which may change during execution of loop() - if (!Matter.isDeviceCommissioned()) { - Serial.println(""); - Serial.println("Matter Node is not commissioned yet."); - Serial.println("Initiate the device discovery in your Matter environment."); - Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); - Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); - Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); - // waits for Matter Contact Sensor Commissioning. - uint32_t timeCount = 0; - while (!Matter.isDeviceCommissioned()) { - delay(100); - if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec - Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); - } - } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); - } -} - -bool simulatedHWContactSensor() { - // Simulated Contact Sensor - static bool contactState = false; - static uint32_t lastTime = 0; - - // Simulate a Contact Sensor state change every 20 seconds - if (millis() - lastTime > 20000) { - contactState = !contactState; - lastTime = millis(); - } - return contactState; -} - -void loop() { - // Check if the button has been pressed - if (digitalRead(buttonPin) == LOW && !button_state) { - // deals with button debouncing - button_time_stamp = millis(); // record the time while the button is pressed. - button_state = true; // pressed. - } - - uint32_t time_diff = millis() - button_time_stamp; - if (button_state && time_diff > debouceTime && digitalRead(buttonPin) == HIGH) { - button_state = false; // released - // button is released - toggle Contact State (Open/Closed) - ContactSensor.setContact(!ContactSensor.getContact()); // same as ContactSensor = !ContactSensor; - Serial.printf("User button released. Setting the Contact Sensor to %s.\r\n", ContactSensor ? "Closed" : "Open"); - // LED will indicate the Contact Sensor state - if (ContactSensor) { - digitalWrite(ledPin, HIGH); // LED ON - } else { - digitalWrite(ledPin, LOW); // LED OFF - } - } - - // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node - if (button_state && time_diff > decommissioningTimeout) { - Serial.println("Decommissioning the Generic Switch Matter Accessory. It shall be commissioned again."); - Matter.decommission(); - button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so - } - - // Simulated Contact Sensor - ContactSensor.setContact(simulatedHWContactSensor()); - - delay(50); -} +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + * This example is an example code that will create a Matter Device which can be + * commissioned and controlled from a Matter Environment APP. + * Additionally the ESP32 will send debug messages indicating the Matter activity. + * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. + * + * The example will create a Matter Contact Sensor Device. + * The Contact Sensor state can be toggled by pressing the onboard button. + * The Contact Sensor state will be indicated by the onboard LED. + * The Contact Sensor state will be simulated to change every 20 seconds. + * + * The onboard button can be kept pressed for 5 seconds to decommission the Matter Node. + * The example will also show the manual commissioning code and QR code to be used in the Matter environment. + * + */ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Matter Contact Sensor Endpoint +MatterContactSensor ContactSensor; + +// LED will be used to indicate the Contact Sensor state +// set your board RGB LED pin here +#ifdef RGB_BUILTIN +const uint8_t ledPin = RGB_BUILTIN; +#else +const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN +#warning "Do not forget to set the RGB LED pin" +#endif + +// set your board USER BUTTON pin here - decommissioning and Manual Contact Sensor toggle button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t debouceTime = 250; // button debouncing time (ms) +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + // The button will also be used to manually toggle the Contact Sensor state + pinMode(buttonPin, INPUT_PULLUP); + // Initialize the LED (light) GPIO and Matter End Point + pinMode(ledPin, OUTPUT); + + Serial.begin(115200); + + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + // set initial contact sensor state as false (default) + ContactSensor.begin(); + digitalWrite(ledPin, LOW); // LED OFF + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Contact Sensor Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } +} + +bool simulatedHWContactSensor() { + // Simulated Contact Sensor + static bool contactState = false; + static uint32_t lastTime = 0; + + // Simulate a Contact Sensor state change every 20 seconds + if (millis() - lastTime > 20000) { + contactState = !contactState; + lastTime = millis(); + } + return contactState; +} + +void loop() { + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > debouceTime && digitalRead(buttonPin) == HIGH) { + button_state = false; // released + // button is released - toggle Contact State (Open/Closed) + ContactSensor.setContact(!ContactSensor.getContact()); // same as ContactSensor = !ContactSensor; + Serial.printf("User button released. Setting the Contact Sensor to %s.\r\n", ContactSensor ? "Closed" : "Open"); + // LED will indicate the Contact Sensor state + if (ContactSensor) { + digitalWrite(ledPin, HIGH); // LED ON + } else { + digitalWrite(ledPin, LOW); // LED OFF + } + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Generic Switch Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } + + // Simulated Contact Sensor + ContactSensor.setContact(simulatedHWContactSensor()); + + delay(50); +} diff --git a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp index 24266c82c95..44ba1c75a44 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp @@ -75,7 +75,7 @@ bool MatterContactSensor::setContact(bool _contactState) { } esp_matter_attr_val_t contactVal = esp_matter_invalid(NULL); - + if (!getAttributeVal(BooleanState::Id, BooleanState::Attributes::StateValue::Id, &contactVal)) { log_e("Failed to get Contact Sensor Attribute."); return false; From 3a8d4c5244e4c77cff9fc0af1a534b70cb4e4513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:35:32 +0100 Subject: [PATCH 062/183] fix(example): Use Serial in printBoundDevices() --- .../Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino b/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino index 6af87748b2d..a313f3c0594 100644 --- a/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino +++ b/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino @@ -142,6 +142,6 @@ void loop() { static uint32_t last_print = 0; if (millis() - last_print > 30000) { last_print = millis(); - zbSwitch.printBoundDevices(); + zbSwitch.printBoundDevices(Serial); } } From 68cafb460dd2f01a6bd91b42977f3484a85f1f96 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Wed, 11 Dec 2024 10:35:46 -0300 Subject: [PATCH 063/183] feat(arduino): remove all while(not serial) in examples --- libraries/ESP32/examples/AnalogOut/LEDCFade/LEDCFade.ino | 3 --- .../DeepSleep/SmoothBlink_ULP_Code/SmoothBlink_ULP_Code.ino | 1 - libraries/ESP32/examples/FreeRTOS/Mutex/Mutex.ino | 4 +--- libraries/ESP32/examples/FreeRTOS/Queue/Queue.ino | 3 --- libraries/ESP32/examples/FreeRTOS/Semaphore/Semaphore.ino | 4 +--- .../examples/GPIO/FunctionalInterrupt/FunctionalInterrupt.ino | 4 +--- .../ESP32/examples/MacAddress/GetMacAddress/GetMacAddress.ino | 3 --- .../ESP32/examples/Serial/RS485_Echo_Demo/RS485_Echo_Demo.ino | 3 --- libraries/ESP32/examples/Utilities/HEXBuilder/HEXBuilder.ino | 4 +--- libraries/ESP32/examples/Utilities/MD5Builder/MD5Builder.ino | 4 +--- .../ESP32/examples/Utilities/SHA1Builder/SHA1Builder.ino | 4 +--- .../ESP_I2S/examples/ES8388_loopback/ES8388_loopback.ino | 3 --- libraries/ESP_I2S/examples/Record_to_WAV/Record_to_WAV.ino | 3 --- .../ESP_NOW_Broadcast_Master/ESP_NOW_Broadcast_Master.ino | 3 --- .../ESP_NOW_Broadcast_Slave/ESP_NOW_Broadcast_Slave.ino | 3 --- .../ESP_NOW/examples/ESP_NOW_Network/ESP_NOW_Network.ino | 3 --- libraries/SD/examples/SD_Test/SD_Test.ino | 3 --- .../WebServer/examples/HttpAuthCallback/HttpAuthCallback.ino | 4 +--- .../HttpAuthCallbackInline/HttpAuthCallbackInline.ino | 4 +--- .../examples/HttpBasicAuthSHA1/HttpBasicAuthSHA1.ino | 4 +--- .../HttpBasicAuthSHA1orBearerToken.ino | 4 +--- .../examples/MultiHomedServers/MultiHomedServers.ino | 4 +--- libraries/WiFi/examples/WiFiClient/WiFiClient.ino | 3 --- 23 files changed, 11 insertions(+), 67 deletions(-) diff --git a/libraries/ESP32/examples/AnalogOut/LEDCFade/LEDCFade.ino b/libraries/ESP32/examples/AnalogOut/LEDCFade/LEDCFade.ino index 7155d2791cb..ea190e4f140 100644 --- a/libraries/ESP32/examples/AnalogOut/LEDCFade/LEDCFade.ino +++ b/libraries/ESP32/examples/AnalogOut/LEDCFade/LEDCFade.ino @@ -30,9 +30,6 @@ void ARDUINO_ISR_ATTR LED_FADE_ISR() { void setup() { // Initialize serial communication at 115200 bits per second: Serial.begin(115200); - while (!Serial) { - delay(10); - } // Setup timer with given frequency, resolution and attach it to a led pin with auto-selected channel ledcAttach(LED_PIN, LEDC_BASE_FREQ, LEDC_TIMER_12_BIT); diff --git a/libraries/ESP32/examples/DeepSleep/SmoothBlink_ULP_Code/SmoothBlink_ULP_Code.ino b/libraries/ESP32/examples/DeepSleep/SmoothBlink_ULP_Code/SmoothBlink_ULP_Code.ino index 5b21a211557..789d9fa3dc9 100644 --- a/libraries/ESP32/examples/DeepSleep/SmoothBlink_ULP_Code/SmoothBlink_ULP_Code.ino +++ b/libraries/ESP32/examples/DeepSleep/SmoothBlink_ULP_Code/SmoothBlink_ULP_Code.ino @@ -139,7 +139,6 @@ void ulp_setup() { void setup() { Serial.begin(115200); - while (!Serial) {} // wait for Serial to start ulp_setup(); // it really only runs on the first ESP32 boot Serial.printf("\nStarted smooth blink with delay %ld\n", *fadeCycleDelay); diff --git a/libraries/ESP32/examples/FreeRTOS/Mutex/Mutex.ino b/libraries/ESP32/examples/FreeRTOS/Mutex/Mutex.ino index 9ace13a1983..f368e0e864c 100644 --- a/libraries/ESP32/examples/FreeRTOS/Mutex/Mutex.ino +++ b/libraries/ESP32/examples/FreeRTOS/Mutex/Mutex.ino @@ -17,9 +17,7 @@ void Task(void *pvParameters); void setup() { // Initialize serial communication at 115200 bits per second: Serial.begin(115200); - while (!Serial) { - delay(100); - } + Serial.printf(" Task 0 | Task 1\n"); #ifdef USE_MUTEX diff --git a/libraries/ESP32/examples/FreeRTOS/Queue/Queue.ino b/libraries/ESP32/examples/FreeRTOS/Queue/Queue.ino index b617bdd74ac..1ddecea30dc 100644 --- a/libraries/ESP32/examples/FreeRTOS/Queue/Queue.ino +++ b/libraries/ESP32/examples/FreeRTOS/Queue/Queue.ino @@ -24,9 +24,6 @@ typedef struct { void setup() { // Initialize serial communication at 115200 bits per second: Serial.begin(115200); - while (!Serial) { - delay(10); - } // Create the queue which will have number of elements, each of size `message_t` and pass the address to . QueueHandle = xQueueCreate(QueueElementSize, sizeof(message_t)); diff --git a/libraries/ESP32/examples/FreeRTOS/Semaphore/Semaphore.ino b/libraries/ESP32/examples/FreeRTOS/Semaphore/Semaphore.ino index 66f43f9421c..077d20329e3 100644 --- a/libraries/ESP32/examples/FreeRTOS/Semaphore/Semaphore.ino +++ b/libraries/ESP32/examples/FreeRTOS/Semaphore/Semaphore.ino @@ -36,9 +36,7 @@ void warehouse_worker_task(void *pvParameters) { void setup() { Serial.begin(115200); - while (!Serial) { - delay(100); - } + // Create the semaphore package_delivered_semaphore = xSemaphoreCreateCounting(10, 0); diff --git a/libraries/ESP32/examples/GPIO/FunctionalInterrupt/FunctionalInterrupt.ino b/libraries/ESP32/examples/GPIO/FunctionalInterrupt/FunctionalInterrupt.ino index 2ea0ed2a4b3..a38c6e6b5bc 100644 --- a/libraries/ESP32/examples/GPIO/FunctionalInterrupt/FunctionalInterrupt.ino +++ b/libraries/ESP32/examples/GPIO/FunctionalInterrupt/FunctionalInterrupt.ino @@ -56,9 +56,7 @@ Button button2(BUTTON2); void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } + Serial.println("Starting Functional Interrupt example."); button1.begin(); button2.begin(); diff --git a/libraries/ESP32/examples/MacAddress/GetMacAddress/GetMacAddress.ino b/libraries/ESP32/examples/MacAddress/GetMacAddress/GetMacAddress.ino index 4ed2df35d41..effcd0e5642 100644 --- a/libraries/ESP32/examples/MacAddress/GetMacAddress/GetMacAddress.ino +++ b/libraries/ESP32/examples/MacAddress/GetMacAddress/GetMacAddress.ino @@ -34,9 +34,6 @@ esp_mac_type_t values: void setup() { Serial.begin(115200); - while (!Serial) { - delay(100); - } Serial.println("Interface\t\t\t\t\t\tMAC address (6 bytes, 4 universally administered, default)"); diff --git a/libraries/ESP32/examples/Serial/RS485_Echo_Demo/RS485_Echo_Demo.ino b/libraries/ESP32/examples/Serial/RS485_Echo_Demo/RS485_Echo_Demo.ino index dfd4d452690..50ee6f53fe2 100644 --- a/libraries/ESP32/examples/Serial/RS485_Echo_Demo/RS485_Echo_Demo.ino +++ b/libraries/ESP32/examples/Serial/RS485_Echo_Demo/RS485_Echo_Demo.ino @@ -21,9 +21,6 @@ void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } RS485.begin(9600, SERIAL_8N1, RS485_RX_PIN, RS485_TX_PIN); while (!RS485) { diff --git a/libraries/ESP32/examples/Utilities/HEXBuilder/HEXBuilder.ino b/libraries/ESP32/examples/Utilities/HEXBuilder/HEXBuilder.ino index 069368da89f..f580a763b54 100644 --- a/libraries/ESP32/examples/Utilities/HEXBuilder/HEXBuilder.ino +++ b/libraries/ESP32/examples/Utilities/HEXBuilder/HEXBuilder.ino @@ -2,9 +2,7 @@ void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } + Serial.println("\n\n\nStart."); // Convert a HEX string like 6c6c6f20576f726c64 to a binary buffer diff --git a/libraries/ESP32/examples/Utilities/MD5Builder/MD5Builder.ino b/libraries/ESP32/examples/Utilities/MD5Builder/MD5Builder.ino index da692bbfcde..cb1b350d834 100644 --- a/libraries/ESP32/examples/Utilities/MD5Builder/MD5Builder.ino +++ b/libraries/ESP32/examples/Utilities/MD5Builder/MD5Builder.ino @@ -12,9 +12,7 @@ void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } + Serial.println("\n\n\nStart."); // Check if a password obfuscated in an MD5 actually diff --git a/libraries/ESP32/examples/Utilities/SHA1Builder/SHA1Builder.ino b/libraries/ESP32/examples/Utilities/SHA1Builder/SHA1Builder.ino index 09cae874592..251307c4016 100644 --- a/libraries/ESP32/examples/Utilities/SHA1Builder/SHA1Builder.ino +++ b/libraries/ESP32/examples/Utilities/SHA1Builder/SHA1Builder.ino @@ -13,9 +13,7 @@ void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } + Serial.println("\n\n\nStart."); // Check if a password obfuscated in an SHA1 actually diff --git a/libraries/ESP_I2S/examples/ES8388_loopback/ES8388_loopback.ino b/libraries/ESP_I2S/examples/ES8388_loopback/ES8388_loopback.ino index edec1f9c4ea..43232be8354 100644 --- a/libraries/ESP_I2S/examples/ES8388_loopback/ES8388_loopback.ino +++ b/libraries/ESP_I2S/examples/ES8388_loopback/ES8388_loopback.ino @@ -40,9 +40,6 @@ void setup() { // Initialize the serial port Serial.begin(115200); - while (!Serial) { - delay(10); - } pinMode(PA_ENABLE, OUTPUT); digitalWrite(PA_ENABLE, HIGH); diff --git a/libraries/ESP_I2S/examples/Record_to_WAV/Record_to_WAV.ino b/libraries/ESP_I2S/examples/Record_to_WAV/Record_to_WAV.ino index c3ae734faf6..e8f09554cb8 100644 --- a/libraries/ESP_I2S/examples/Record_to_WAV/Record_to_WAV.ino +++ b/libraries/ESP_I2S/examples/Record_to_WAV/Record_to_WAV.ino @@ -32,9 +32,6 @@ void setup() { // Initialize the serial port Serial.begin(115200); - while (!Serial) { - delay(10); - } Serial.println("Initializing I2S bus..."); diff --git a/libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Master/ESP_NOW_Broadcast_Master.ino b/libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Master/ESP_NOW_Broadcast_Master.ino index bab8da6f66a..6ee7dc6f846 100644 --- a/libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Master/ESP_NOW_Broadcast_Master.ino +++ b/libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Master/ESP_NOW_Broadcast_Master.ino @@ -64,9 +64,6 @@ ESP_NOW_Broadcast_Peer broadcast_peer(ESPNOW_WIFI_CHANNEL, WIFI_IF_STA, NULL); void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } // Initialize the Wi-Fi module WiFi.mode(WIFI_STA); diff --git a/libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Slave/ESP_NOW_Broadcast_Slave.ino b/libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Slave/ESP_NOW_Broadcast_Slave.ino index 54978916afc..5f1a8bd8807 100644 --- a/libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Slave/ESP_NOW_Broadcast_Slave.ino +++ b/libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Slave/ESP_NOW_Broadcast_Slave.ino @@ -80,9 +80,6 @@ void register_new_master(const esp_now_recv_info_t *info, const uint8_t *data, i void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } // Initialize the Wi-Fi module WiFi.mode(WIFI_STA); diff --git a/libraries/ESP_NOW/examples/ESP_NOW_Network/ESP_NOW_Network.ino b/libraries/ESP_NOW/examples/ESP_NOW_Network/ESP_NOW_Network.ino index bed4392d7b9..48ea6b731ce 100644 --- a/libraries/ESP_NOW/examples/ESP_NOW_Network/ESP_NOW_Network.ino +++ b/libraries/ESP_NOW/examples/ESP_NOW_Network/ESP_NOW_Network.ino @@ -248,9 +248,6 @@ void setup() { uint8_t self_mac[6]; Serial.begin(115200); - while (!Serial) { - delay(10); - } // Initialize the Wi-Fi module WiFi.mode(WIFI_STA); diff --git a/libraries/SD/examples/SD_Test/SD_Test.ino b/libraries/SD/examples/SD_Test/SD_Test.ino index 57c2b740219..c22e6c3a933 100644 --- a/libraries/SD/examples/SD_Test/SD_Test.ino +++ b/libraries/SD/examples/SD_Test/SD_Test.ino @@ -209,9 +209,6 @@ void testFileIO(fs::FS &fs, const char *path) { void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } #ifdef REASSIGN_PINS SPI.begin(sck, miso, mosi, cs); diff --git a/libraries/WebServer/examples/HttpAuthCallback/HttpAuthCallback.ino b/libraries/WebServer/examples/HttpAuthCallback/HttpAuthCallback.ino index f164429cae9..0d3bca1a720 100644 --- a/libraries/WebServer/examples/HttpAuthCallback/HttpAuthCallback.ino +++ b/libraries/WebServer/examples/HttpAuthCallback/HttpAuthCallback.ino @@ -29,9 +29,7 @@ String *credentialsHandler(HTTPAuthMethod mode, String username, String params[] void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } + WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); if (WiFi.waitForConnectResult() != WL_CONNECTED) { diff --git a/libraries/WebServer/examples/HttpAuthCallbackInline/HttpAuthCallbackInline.ino b/libraries/WebServer/examples/HttpAuthCallbackInline/HttpAuthCallbackInline.ino index 3a69f1db413..bcf78a9ce65 100644 --- a/libraries/WebServer/examples/HttpAuthCallbackInline/HttpAuthCallbackInline.ino +++ b/libraries/WebServer/examples/HttpAuthCallbackInline/HttpAuthCallbackInline.ino @@ -17,9 +17,7 @@ credentials_t passwdfile[] = {{"admin", "esp32"}, {"fred", "41234123"}, {"charli void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } + WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); if (WiFi.waitForConnectResult() != WL_CONNECTED) { diff --git a/libraries/WebServer/examples/HttpBasicAuthSHA1/HttpBasicAuthSHA1.ino b/libraries/WebServer/examples/HttpBasicAuthSHA1/HttpBasicAuthSHA1.ino index aff5da272d4..643a05380e9 100644 --- a/libraries/WebServer/examples/HttpBasicAuthSHA1/HttpBasicAuthSHA1.ino +++ b/libraries/WebServer/examples/HttpBasicAuthSHA1/HttpBasicAuthSHA1.ino @@ -31,9 +31,7 @@ const char *www_password_base64 = "jLEk+MJ3wW7Asu4AVp/RUaCONCs="; void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } + WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); if (WiFi.waitForConnectResult() != WL_CONNECTED) { diff --git a/libraries/WebServer/examples/HttpBasicAuthSHA1orBearerToken/HttpBasicAuthSHA1orBearerToken.ino b/libraries/WebServer/examples/HttpBasicAuthSHA1orBearerToken/HttpBasicAuthSHA1orBearerToken.ino index 968741114fb..89933a4ddb2 100644 --- a/libraries/WebServer/examples/HttpBasicAuthSHA1orBearerToken/HttpBasicAuthSHA1orBearerToken.ino +++ b/libraries/WebServer/examples/HttpBasicAuthSHA1orBearerToken/HttpBasicAuthSHA1orBearerToken.ino @@ -78,9 +78,7 @@ String *check_bearer_or_auth(HTTPAuthMethod mode, String authReq, String params[ void setup() { Serial.begin(115200); - while (!Serial) { - delay(10); - } + WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); if (WiFi.waitForConnectResult() != WL_CONNECTED) { diff --git a/libraries/WebServer/examples/MultiHomedServers/MultiHomedServers.ino b/libraries/WebServer/examples/MultiHomedServers/MultiHomedServers.ino index cc9f15dbd5e..300a651e3b1 100644 --- a/libraries/WebServer/examples/MultiHomedServers/MultiHomedServers.ino +++ b/libraries/WebServer/examples/MultiHomedServers/MultiHomedServers.ino @@ -66,9 +66,7 @@ void setup(void) { pinMode(led, OUTPUT); digitalWrite(led, 0); Serial.begin(115200); - while (!Serial) { - delay(100); - } + Serial.println("Multi-homed Servers example starting"); delay(1000); WiFi.mode(WIFI_STA); diff --git a/libraries/WiFi/examples/WiFiClient/WiFiClient.ino b/libraries/WiFi/examples/WiFiClient/WiFiClient.ino index e91ead028de..b4c88244c26 100644 --- a/libraries/WiFi/examples/WiFiClient/WiFiClient.ino +++ b/libraries/WiFi/examples/WiFiClient/WiFiClient.ino @@ -34,9 +34,6 @@ int fieldNumber = 1; // Field number which will be read out void setup() { Serial.begin(115200); - while (!Serial) { - delay(100); - } // We start by connecting to a WiFi network From 9c169fac8bf937ffc0ac9c38abcc1e81e3252bd1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 13:43:04 +0000 Subject: [PATCH 064/183] ci(pre-commit): Apply automatic fixes --- variants/yb_esp32s3_amp_v2/pins_arduino.h | 24 +++++++++++------------ variants/yb_esp32s3_amp_v3/pins_arduino.h | 24 +++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/variants/yb_esp32s3_amp_v2/pins_arduino.h b/variants/yb_esp32s3_amp_v2/pins_arduino.h index 9a626011606..34d454f5f5e 100644 --- a/variants/yb_esp32s3_amp_v2/pins_arduino.h +++ b/variants/yb_esp32s3_amp_v2/pins_arduino.h @@ -4,7 +4,7 @@ #include static const uint8_t LED_BUILTIN = 47; -#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define BUILTIN_LED LED_BUILTIN // backward compatibility #define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN static const uint8_t TX = 43; @@ -14,21 +14,21 @@ static const uint8_t SDA = 8; static const uint8_t SCL = 9; //I2S for onboard MAX98357A only -static const uint8_t I2S_BCLK = 5; +static const uint8_t I2S_BCLK = 5; static const uint8_t I2S_LRCLK = 6; -static const uint8_t I2S_DOUT = 7; +static const uint8_t I2S_DOUT = 7; // SPI for onboard microSD only -static const uint8_t SS = 10; -static const uint8_t MOSI = 11; -static const uint8_t MISO = 13; -static const uint8_t SCK = 12; +static const uint8_t SS = 10; +static const uint8_t MOSI = 11; +static const uint8_t MISO = 13; +static const uint8_t SCK = 12; // SPI2 for public usage -static const uint8_t SS2 = 38; -static const uint8_t MOSI2 = 39; -static const uint8_t MISO2 = 41; -static const uint8_t SCK2 = 40; +static const uint8_t SS2 = 38; +static const uint8_t MOSI2 = 39; +static const uint8_t MISO2 = 41; +static const uint8_t SCK2 = 40; static const uint8_t A0 = 1; static const uint8_t A1 = 2; @@ -52,6 +52,6 @@ static const uint8_t T9 = 9; static const uint8_t T10 = 10; static const uint8_t T14 = 14; -#define PIN_DAC_MUTE 47 // only if solder bridge "DAC_MUTE" is closed +#define PIN_DAC_MUTE 47 // only if solder bridge "DAC_MUTE" is closed #endif /* Pins_Arduino_h */ diff --git a/variants/yb_esp32s3_amp_v3/pins_arduino.h b/variants/yb_esp32s3_amp_v3/pins_arduino.h index 8e59deda44b..0b6ff0f29a1 100644 --- a/variants/yb_esp32s3_amp_v3/pins_arduino.h +++ b/variants/yb_esp32s3_amp_v3/pins_arduino.h @@ -7,7 +7,7 @@ #define USB_PID 0x1001 static const uint8_t LED_BUILTIN = 47; -#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define BUILTIN_LED LED_BUILTIN // backward compatibility #define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN static const uint8_t TX = 43; @@ -17,21 +17,21 @@ static const uint8_t SDA = 8; static const uint8_t SCL = 9; //I2S for onboard MAX98357A only -static const uint8_t I2S_BCLK = 5; +static const uint8_t I2S_BCLK = 5; static const uint8_t I2S_LRCLK = 6; -static const uint8_t I2S_DOUT = 7; +static const uint8_t I2S_DOUT = 7; // SPI for onboard microSD only -static const uint8_t SS = 10; -static const uint8_t MOSI = 11; -static const uint8_t MISO = 13; -static const uint8_t SCK = 12; +static const uint8_t SS = 10; +static const uint8_t MOSI = 11; +static const uint8_t MISO = 13; +static const uint8_t SCK = 12; // SPI2 for public usage -static const uint8_t SS2 = 38; -static const uint8_t MOSI2 = 39; -static const uint8_t MISO2 = 41; -static const uint8_t SCK2 = 40; +static const uint8_t SS2 = 38; +static const uint8_t MOSI2 = 39; +static const uint8_t MISO2 = 41; +static const uint8_t SCK2 = 40; static const uint8_t A0 = 1; static const uint8_t A1 = 2; @@ -55,6 +55,6 @@ static const uint8_t T9 = 9; static const uint8_t T10 = 10; static const uint8_t T14 = 14; -#define PIN_DAC_MUTE 47 // only if solder bridge "DAC_MUTE" is closed +#define PIN_DAC_MUTE 47 // only if solder bridge "DAC_MUTE" is closed #endif /* Pins_Arduino_h */ From 4ecfd35ec66cf1d9de2d728d0a092ef6deb4a39d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 13:52:12 +0000 Subject: [PATCH 065/183] ci(pre-commit): Apply automatic fixes --- libraries/WiFiProv/src/WiFiProv.cpp | 4 ++-- libraries/WiFiProv/src/WiFiProv.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/WiFiProv/src/WiFiProv.cpp b/libraries/WiFiProv/src/WiFiProv.cpp index fb67377a2ee..31337196b5f 100644 --- a/libraries/WiFiProv/src/WiFiProv.cpp +++ b/libraries/WiFiProv/src/WiFiProv.cpp @@ -1,4 +1,4 @@ - /* +/* WiFiProv.cpp - WiFiProv class for provisioning All rights reserved. @@ -129,7 +129,7 @@ void WiFiProvClass ::beginProvision( const char *service_key, uint8_t *uuid, bool reset_provisioned ) { if (!this->provInitDone) { - WiFiProvClass ::initProvision( prov_scheme, scheme_handler, reset_provisioned); + WiFiProvClass ::initProvision(prov_scheme, scheme_handler, reset_provisioned); } static char service_name_temp[32]; if (provisioned == false) { diff --git a/libraries/WiFiProv/src/WiFiProv.h b/libraries/WiFiProv/src/WiFiProv.h index 53af27f7c80..b660f8cf064 100644 --- a/libraries/WiFiProv/src/WiFiProv.h +++ b/libraries/WiFiProv/src/WiFiProv.h @@ -50,10 +50,10 @@ class WiFiProvClass { private: bool provInitDone = false; bool provisioned = false; + public: void initProvision( - prov_scheme_t prov_scheme = NETWORK_PROV_SCHEME_SOFTAP, scheme_handler_t scheme_handler = NETWORK_PROV_SCHEME_HANDLER_NONE, - bool reset_provisioned = false + prov_scheme_t prov_scheme = NETWORK_PROV_SCHEME_SOFTAP, scheme_handler_t scheme_handler = NETWORK_PROV_SCHEME_HANDLER_NONE, bool reset_provisioned = false ); void beginProvision( prov_scheme_t prov_scheme = NETWORK_PROV_SCHEME_SOFTAP, scheme_handler_t scheme_handler = NETWORK_PROV_SCHEME_HANDLER_NONE, From e17900b02abc1dae61a5a8c13fbef5826ca36b3b Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Wed, 11 Dec 2024 15:57:54 -0300 Subject: [PATCH 066/183] feat(matter): adds matter occupancy sensor endpoint --- CMakeLists.txt | 1 + .../MatterOccupancySensor.ino | 129 ++++++++++++++++++ .../examples/MatterOccupancySensor/ci.json | 7 + libraries/Matter/keywords.txt | 3 + libraries/Matter/src/Matter.h | 2 + .../MatterEndpoints/MatterOccupancySensor.cpp | 107 +++++++++++++++ .../MatterEndpoints/MatterOccupancySensor.h | 73 ++++++++++ 7 files changed, 322 insertions(+) create mode 100644 libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino create mode 100644 libraries/Matter/examples/MatterOccupancySensor/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b6478aa16a3..322824f11ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -179,6 +179,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp + libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS diff --git a/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino b/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino new file mode 100644 index 00000000000..5b4baf23442 --- /dev/null +++ b/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino @@ -0,0 +1,129 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + * This example is an example code that will create a Matter Device which can be + * commissioned and controlled from a Matter Environment APP. + * Additionally the ESP32 will send debug messages indicating the Matter activity. + * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. + * + * The example will create a Matter Occupancy Sensor Device. + * The Occupancy Sensor will be simulated to change its state every 2 minutes. + * + * The onboard button can be kept pressed for 5 seconds to decommission the Matter Node. + * The example will also show the manual commissioning code and QR code to be used in the Matter environment. + * + */ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Matter Occupancy Sensor Endpoint +MatterOccupancySensor OccupancySensor; + +// set your board USER BUTTON pin here - decommissioning only +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + // The button will also be used to manually toggle the Occupancy Sensor state + pinMode(buttonPin, INPUT_PULLUP); + + Serial.begin(115200); + + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + // set initial occupancy sensor state as false and connected to a PIR sensor type (default) + OccupancySensor.begin(); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Occupancy Sensor Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } +} + +bool simulatedHWOccupancySensor() { + // Simulated Occupancy Sensor + static bool occupancyState = false; + static uint32_t lastTime = millis(); + const uint32_t occupancyTimeout = 120000; // 2 minutes to toggle the state + + // Simulate a Occupancy Sensor state change every 2 minutes + if (millis() - lastTime > occupancyTimeout) { + occupancyState = !occupancyState; + lastTime = millis(); + } + return occupancyState; +} + +void loop() { + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (button_state && digitalRead(buttonPin) == HIGH) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Generic Switch Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } + + // Check Simulated Occupancy Sensor and set Matter Attribute + OccupancySensor.setOccupancy(simulatedHWOccupancySensor()); + + delay(50); +} diff --git a/libraries/Matter/examples/MatterOccupancySensor/ci.json b/libraries/Matter/examples/MatterOccupancySensor/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterOccupancySensor/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index d75e9888afd..1daf65974ed 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -22,6 +22,7 @@ MatterTemperatureSensor KEYWORD1 MatterHumiditySensor KEYWORD1 MatterContactSensor KEYWORD1 MatterPressureSensor KEYWORD1 +MatterOccupancySensor KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -74,6 +75,8 @@ setContact KEYWORD2 getContact KEYWORD2 setPressure KEYWORD2 getPressure KEYWORD2 +setOccupancy KEYWORD2 +getOccupancy KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index 02571dbcf40..bc0a0ec1cc7 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -30,6 +30,7 @@ #include #include #include +#include using namespace esp_matter; @@ -66,6 +67,7 @@ class ArduinoMatter { friend class MatterHumiditySensor; friend class MatterContactSensor; friend class MatterPressureSensor; + friend class MatterOccupancySensor; protected: static void _init(); diff --git a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp new file mode 100644 index 00000000000..9efa984431a --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp @@ -0,0 +1,107 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +const uint8_t MatterOccupancySensor::occupancySensorTypeBitmap[4] = { + MatterOccupancySensor::occupancySensorTypePir, + MatterOccupancySensor::occupancySensorTypePir | MatterOccupancySensor::occupancySensorTypeUltrasonic, + MatterOccupancySensor::occupancySensorTypeUltrasonic, + MatterOccupancySensor::occupancySensorTypePhysicalContact +}; + +bool MatterOccupancySensor::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { + bool ret = true; + if (!started) { + log_e("Matter Occupancy Sensor device has not begun."); + return false; + } + + log_d("Occupancy Sensor Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); + return ret; +} + +MatterOccupancySensor::MatterOccupancySensor() {} + +MatterOccupancySensor::~MatterOccupancySensor() { + end(); +} + +bool MatterOccupancySensor::begin(bool _occupancyState, OccupancySensorType_t _occupancySensorType) { + ArduinoMatter::_init(); + + occupancy_sensor::config_t occupancy_sensor_config; + occupancy_sensor_config.occupancy_sensing.occupancy = _occupancyState; + occupancy_sensor_config.occupancy_sensing.occupancy_sensor_type = _occupancySensorType; + occupancy_sensor_config.occupancy_sensing.occupancy_sensor_type_bitmap = occupancySensorTypeBitmap[_occupancySensorType]; + + // endpoint handles can be used to add/modify clusters. + endpoint_t *endpoint = occupancy_sensor::create(node::get(), &occupancy_sensor_config, ENDPOINT_FLAG_NONE, (void *)this); + if (endpoint == nullptr) { + log_e("Failed to create Occupancy Sensor endpoint"); + return false; + } + occupancyState = _occupancyState; + setEndPointId(endpoint::get_id(endpoint)); + log_i("Occupancy Sensor created with endpoint_id %d", getEndPointId()); + started = true; + return true; +} + +void MatterOccupancySensor::end() { + started = false; +} + +bool MatterOccupancySensor::setOccupancy(bool _occupancyState) { + if (!started) { + log_e("Matter Occupancy Sensor device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (occupancyState == _occupancyState) { + return true; + } + + esp_matter_attr_val_t occupancyVal = esp_matter_invalid(NULL); + + if (!getAttributeVal(OccupancySensing::Id, OccupancySensing::Attributes::Occupancy::Id, &occupancyVal)) { + log_e("Failed to get Occupancy Sensor Attribute."); + return false; + } + if (occupancyVal.val.u8 != _occupancyState) { + occupancyVal.val.u8 = _occupancyState; + bool ret; + ret = updateAttributeVal(OccupancySensing::Id, OccupancySensing::Attributes::Occupancy::Id, &occupancyVal); + if (!ret) { + log_e("Failed to update Occupancy Sensor Attribute."); + return false; + } + occupancyState = _occupancyState; + } + log_v("Occupancy Sensor set to %s", _occupancyState ? "Occupied" : "Vacant"); + + return true; +} + +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h new file mode 100644 index 00000000000..30f312a9841 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h @@ -0,0 +1,73 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace chip::app::Clusters::OccupancySensing; + +class MatterOccupancySensor : public MatterEndPoint { +public: + // Different Occupancy Sensor Types + enum OccupancySensorType_t { + OCCUPANCY_SENSOR_TYPE_PIR = (uint8_t)OccupancySensorTypeEnum::kPir, + OCCUPANCY_SENSOR_TYPE_ULTRASONIC = (uint8_t)OccupancySensorTypeEnum::kUltrasonic, + OCCUPANCY_SENSOR_TYPE_PIR_AND_ULTRASONIC = (uint8_t)OccupancySensorTypeEnum::kPIRAndUltrasonic, + OCCUPANCY_SENSOR_TYPE_PHYSICAL_CONTACT = (uint8_t)OccupancySensorTypeEnum::kPhysicalContact + }; + + MatterOccupancySensor(); + ~MatterOccupancySensor(); + // begin Matter Occupancy Sensor endpoint with initial occupancy state and default PIR sensor type + bool begin(bool _occupancyState = false, OccupancySensorType_t _occupancySensorType = OCCUPANCY_SENSOR_TYPE_PIR); + // this will just stop processing Occupancy Sensor Matter events + void end(); + + // set the occupancy state + bool setOccupancy(bool _occupancyState); + // returns the occupancy state + bool getOccupancy() { + return occupancyState; + } + + // bool conversion operator + void operator=(bool _occupancyState) { + setOccupancy(_occupancyState); + } + // bool conversion operator + operator bool() { + return getOccupancy(); + } + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + +protected: + // bitmap for Occupancy Sensor Types + static const uint8_t occupancySensorTypePir = 0x01; + static const uint8_t occupancySensorTypeUltrasonic = 0x02; + static const uint8_t occupancySensorTypePhysicalContact = 0x04; + + // bitmap for Occupancy Sensor Type Bitmap mapped array + static const uint8_t occupancySensorTypeBitmap[4]; + + bool started = false; + bool occupancyState = false; +}; +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From d072cdd41f0788f849c8b41edc7ce141055186a8 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 11 Dec 2024 19:50:49 -0300 Subject: [PATCH 067/183] change(esptool): Bump to version 4.9.dev3 --- package/package_esp32_index.template.json | 60 +++++++++++------------ 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 63bb102549b..16476f27d56 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -72,7 +72,7 @@ { "packager": "esp32", "name": "esptool_py", - "version": "4.9.dev1" + "version": "4.9.dev3" }, { "packager": "esp32", @@ -460,56 +460,56 @@ }, { "name": "esptool_py", - "version": "4.9.dev1", + "version": "4.9.dev3", "systems": [ { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC2/esptool-v4.9.dev1-linux-amd64.tar.gz", - "archiveFileName": "esptool-v4.9.dev1-linux-amd64.tar.gz", - "checksum": "SHA-256:21f6c2155f0ec9e5b475c8a4bf59803d8cfb4d74f4e488a80f97da3d77542bba", - "size": "64632960" + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC3/esptool-v4.9.dev3-linux-amd64.tar.gz", + "archiveFileName": "esptool-v4.9.dev3-linux-amd64.tar.gz", + "checksum": "SHA-256:4ecaf51836cbf4ea3c19840018bfef3b0b8cd8fc3c95f6e1e043ca5bbeab9bf0", + "size": "64958202" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC2/esptool-v4.9.dev1-linux-arm32.tar.gz", - "archiveFileName": "esptool-v4.9.dev1-linux-arm32.tar.gz", - "checksum": "SHA-256:818477f10814b2bd82078fc6695663ac84220d3947722ce1880a6c867d5c2997", - "size": "46042432" + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC3/esptool-v4.9.dev3-linux-armv7.tar.gz", + "archiveFileName": "esptool-v4.9.dev3-linux-armv7.tar.gz", + "checksum": "SHA-256:fff818573bce483ee793ac83c8211f6abf764aa3350f198228859f696a0a0b36", + "size": "31530030" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC2/esptool-v4.9.dev1-linux-arm64.tar.gz", - "archiveFileName": "esptool-v4.9.dev1-linux-arm64.tar.gz", - "checksum": "SHA-256:b377a130a4dca58f3a31c66ed0b9858cc057c998741222cccdb6e5a724651a1f", - "size": "54459357" + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC3/esptool-v4.9.dev3-linux-aarch64.tar.gz", + "archiveFileName": "esptool-v4.9.dev3-linux-aarch64.tar.gz", + "checksum": "SHA-256:5b274bdff2f62e6a07c3c1dfa51b1128924621f661747eca3dbe0f77972f2f06", + "size": "33663882" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC2/esptool-v4.9.dev1-macos-amd64.tar.gz", - "archiveFileName": "esptool-v4.9.dev1-macos-amd64.tar.gz", - "checksum": "SHA-256:25cc246b20230afc287ffdfe95f57b3fab23cec88a6dde3b5092ec05926b5431", - "size": "32386336" + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC3/esptool-v4.9.dev3-macos-amd64.tar.gz", + "archiveFileName": "esptool-v4.9.dev3-macos-amd64.tar.gz", + "checksum": "SHA-256:c733c83b58fcf5f642fbb2fddb8ff24640c2c785126cba0821fb70c4a5ceea7a", + "size": "32767836" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC2/esptool-v4.9.dev1-macos-arm64.tar.gz", - "archiveFileName": "esptool-v4.9.dev1-macos-arm64.tar.gz", - "checksum": "SHA-256:b845d678db1d1559d82894e68366683a7fc3809371a5f5def67c30c9dee15912", - "size": "29841092" + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC3/esptool-v4.9.dev3-macos-arm64.tar.gz", + "archiveFileName": "esptool-v4.9.dev3-macos-arm64.tar.gz", + "checksum": "SHA-256:83c195a15981e6a5e7a130db2ccfb21e2d8093912e5b003681f9a5abadd71af7", + "size": "30121441" }, { "host": "i686-mingw32", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC2/esptool-v4.9.dev1-win64.zip", - "archiveFileName": "esptool-v4.9.dev1-win64.zip", - "checksum": "SHA-256:f649a212e086b06ca6ee595feffd7a4706696ea43a2cd1a4f49352829e8ac96e", - "size": "35812159" + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC3/esptool-v4.9.dev3-win64.zip", + "archiveFileName": "esptool-v4.9.dev3-win64.zip", + "checksum": "SHA-256:890051a4fdc684ff6f4af18d0bb27d274ca940ee0eef716a9455f8c64b25b215", + "size": "36072564" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC2/esptool-v4.9.dev1-win64.zip", - "archiveFileName": "esptool-v4.9.dev1-win64.zip", - "checksum": "SHA-256:f649a212e086b06ca6ee595feffd7a4706696ea43a2cd1a4f49352829e8ac96e", - "size": "35812159" + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.1.0-RC3/esptool-v4.9.dev3-win64.zip", + "archiveFileName": "esptool-v4.9.dev3-win64.zip", + "checksum": "SHA-256:890051a4fdc684ff6f4af18d0bb27d274ca940ee0eef716a9455f8c64b25b215", + "size": "36072564" } ] }, From b9a0122f7b3a6922e040de2f640992483719b46c Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 11 Dec 2024 19:59:15 -0300 Subject: [PATCH 068/183] fix(get): Fix deprecation warning --- tools/get.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/get.py b/tools/get.py index 058c69badb1..b40c0a6e987 100755 --- a/tools/get.py +++ b/tools/get.py @@ -243,11 +243,11 @@ def unpack(filename, destination, force_extract, checksum): # noqa: C901 if filename.endswith("tar.gz"): if not cfile: cfile = tarfile.open(filename, "r:gz") - cfile.extractall(destination) + cfile.extractall(destination, filter='tar') elif filename.endswith("tar.xz"): if not cfile: cfile = tarfile.open(filename, "r:xz") - cfile.extractall(destination) + cfile.extractall(destination, filter='tar') elif filename.endswith("zip"): if not cfile: cfile = zipfile.ZipFile(filename) From c8f23ec65d12f375ce3bea3f37a3d70e77d4d8c0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 23:03:22 +0000 Subject: [PATCH 069/183] change(tools): Push generated binaries to PR --- tools/get.exe | Bin 7493296 -> 7493360 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tools/get.exe b/tools/get.exe index 4a5e209cacf8d7ea8767b1e83ac85ebc8bf2abfc..b5c542501c5924256d567fb2aceb92016cc807ed 100644 GIT binary patch delta 69293 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 delta 69130 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�$h=wLX(RgyeWeyFemY?B7s-yK zVrz##oC#kd=}aDsEcJIh{#Oze%UY1M15V3o_ed9;!Fa$J_iszsdo2G?{DzeCt$?!H zSx$#f=I-&6zR$^=f8eO%@Xl0g6oFN>5aR zTWoWlj9Jb?y=Ng?1l$RBzp|XgaeLAx{j*~nVz7CWfl9x`U=C;4F!`lmD=O1Z z>^RLAWXF}PyMI0sw7|{4iPbhoZdu6^*%SH8O4ior8*szQw?oFPVojM#_F2VRRT*dy zJ8yEoy^3w(Y@ZnHOJ;;_y6Yx0X#i_E4d!S^ zYxB1<;9XXy&Q>DnATq0g`RHGmPzKEHo}e5d)YeEu#=;z_YG={?qg zJ(4ruW3M!9j7+@Fg`df|j9p;%CAh*A9~>R&^Q`y!P}=rPR$0TM`)1%booH_YsLT(i zOx&&F@QsvO2**C$!CnQ4Cc37#9WszB5vZS#5$UoO8Kf_Xw30|lnh(MKkDBMog=<(U z+ar&!VPA$+iP0BO`e6cpL~-|s?{g4nwlC!B_gQB6`|n{=U=$3;+he-NC7X)YRHAD( zO+J60)vym~Se{8QYAfSeJ6!L}puRZxiZLY5$rfu_s|L-;c2dq|wKgxs4whFpRVmq- zg4!@L8y#3wf>E3qkAt6Wf?Thd=GU=nP1=DqbX;>SIbBL4 z^+a_fUYrl;6nOo8ngcF#sZ3wbqHPh#$G&+2cf-b;yu4kRN@d4|(~kK24h0^ZW@t4!xd9;#7F=uJ2-_j@&p6`o2sXgs zoaTdE->y=8i0$b;$v3jWRRYmW%-0q)W3$aVnTJZU4 z&2tb$3B@QeS7v^~VquO={)BxIV8*o;&uv)lVT-FHTW(@0)nC_#%e6ZCoeOrn&Y^PQ zCf1VI2$e;fSUmRJzmTl{X$W1-I-G-jj=mg#mlOTMWZTWGEsyLZr)_3^YmW}4j@W_k z5Fsjl90_;yx;LP2sJye8wdT>GGUij(s>ZkA6Mu~E-Tp+3j{ookT$6d9vJSOR2^yPp z6@ts7+i2u?N5SwSQ$g}1dG1pf8lTFtPuX$ruTj}Z#FH#()k%{#eS3rK4WkC)2E4(dc*e0a@qPW zml>b4HD0eSE4NnUv(K4}2QHJ!R+dp`F)pvM#(k>U{>GyVkv`=In~^4=vy08zqO5ana$#*~zk5 z4*L(=$Rp>us}`~<%y;S{Eb#br)NJn{>uhIfl_%k|I>mBKj@r(m*oSh-b{5U1%N^TU z1KurFUfT})M@YVdHRRr@vdIpt>A%SA9iSeRZ|qJ4_kfBN5r2JQ7a%i5n}^X?e!YP6W?EeRQ8V7i(GT?UAz(p6tI1)9<8QzKazGUG&op+A#&wBS+z>2#!LP+Q>e;S@-H+wtlYVHaY5LDT~HG z$XM^*x0^L#HA^wzVB{WMh0g-}V@fxoAKMs^DEVIYE;r4WYxiQqg}t~J>-t<7ypJts z_vMy-ID~!UKDLk97~3ze?q`QW|DH+x=6#?;V(z`f8L!cLo=5{3M}kk}{;yfA@9fHY z?}ux)tMcL3u)nU#c12J~%b9Xi5!=KT%W4N8(kge#0XCFjm*04h)nmWPl7nnBZxs1*oN+A$JtKCyFZm>Cs;bSJeAE(vh9%kx05V~kEk!( zo@REQK0yvT%_8N@Q>+VnL!LgxLRgu+b&BPX4SO1cD`h+(7V#dB<(X5M+1hDlW@n}O z4C~1|M9BeXz{UQCoOy;_s8{w-w?J!o`e2{OnP400z&|wg2~*o zEZb|&YlfzF$sf`ml{G#AJ*S6FywFC(j?;$8GVvOC#feE6s( z{b-BBfw+9f_c(LRUJ&8GS=O}6@2{{r!DsaMvp@VVo>$%eSJ`eeo8>c+0$dtb@;k%5=_8zT*D+9$Uf!Bwnb|Q&f88q1l>!D+k_Z5td}UmC^m$ zeG$sDVLV1|zt3)A0a*7ZPU+X>-apx^fk)5M>>x*{b>23;{6^XAFBUXFYX^gI>#Ov| zU2fxae52;FJsUvY%hT%H2G!&C#LdaX7hLj&IP_b}i`qY0=7PBo$9Kl>$rT*IXuWNn zmyOYyrG!0`8~$QxO{e@Df?BHR!(umBd0eCq&p4AnA1_b{LW1`Qs9+@KLPtMz=sh5_=w!}0E2X^EPlWmS6@y<{b6Rl zkv&VAAF|gumW8~Bta*av9BF3&-4Bh!J086Ez!rTtXYe8HtLGr-NrczS!(*OM{`imu z2Yu2HD>XSYS0iFLGe4769Vz}N33~Zf)1h=qV*`|vPJfja~`qR zV3po`1gqp78TpviZ#e;diMtl$k3?)&prMEEh^y7{V2yND6GzGB7kkvJ^wTZuDTw#O_s@-Dqjz;CqDFaLVpV;(w*))v&mAN)ZsbFO4hSYrO94%nMt zcMN@s0r&>u@Fn5N&9OXQ)>BChT6RFSM6z7G{IGO0GM}gk_nzbDIkjAGjog}wxwWU1 z?s2Mjigap;^q`Bkl1X6>qI5yzV-q|D^LNouR{yZ#{2_NfVZU&Ds$Baw8y(U%4d&m` zjPLPx7k`iNrx`xON$!ZJSZDd*$Flu1ENcBu$Z^lGDEpj{`=7BNu@1fW58KUdx_dom z{tO1faE)zc&Q(FY2alAi#_;Cs-j4VAamIdikK+6eo*T$s-aL(smG64drP_2%oni9?&wPVSB`n@SB2MMb7Uj@5WA&e5?bT(E5Z0^zfTUX!h>IG zk&JbYZXceu!NT^h+lP>Sn6?%hvhmpZs>jGa=@@zd9A=@waTF+Lc2n-J!dt=z@t_J1 zx9mj8_{&(F!*GKv>sIC6{2L^~yu(^?978Frg?n~Yjy?ZlDSde~%a{9ox!|2tcXvPj zDq}b0R~9~s`|oty{dskUK_74BgQ|3Dg5@MBVL%i4u9b&`)<-gRFYH`;x@w(w91(b` zdpcSt*qX?5R^Bx9$5_3<9RzvPX@R(kn|%7Qb*K4&3=QD+PV14ShQCd-KVc=}^kC{8 za9Bn~4A&<;k$NA$)2h2irx5-wZpVNbhq!g_D1GTj=p8E;1n_OxWD=`!9C#YL->b&E zv6hb->LNTwkZyGk;d#|b4t#T0F30!C*z=+d7=ajq=H0ShAa51A$SA8IFvNfDMX@*J zn}IyCW(Q=c2UhChv_w4jZL}kyq5LwC2m9Bi%;m@g&A*|%7>L1<)j+-*#9v{h@>vj{ z$VRx|uyJ0QH@YY%h4S`({c!Y0ui^AjYm?j`%HQ_yRR>(VIfl{~Y7-s{-_)`ud|uegfDwnVmJ|VpuqcXvLs(EF*}N&A2U~b&Q$7I; zNW(ZjsInhETX!f&W!+!!gSW5GW0mA*al8f&A&27lXf{g5HskZEN8s(wE>j8(4{Q1X zJYuoQ!_9b3eh##PQ*Xwbv{rVqJCZCf8I*W~5(7$GgHqR^#DUV>pjZt`A}BEi<)1vA zPYNh?3`&_naexwJP%asiQJ_S0Hb}(=X*@`^49X6JG6fWWgYuzHQD)H;OR_M7xWphX zG>Cu6>&%1Zi*I#_GR;?;Bd_?-qe$-hRl*C)}`Yzce3A4FOE=t0J^|t&e3A@D~@>vpu z$XYBLw#BZ|3C|mp5^~QfVN2zpw!D?4^1nz!|34FYS0Hf7vOUw#S0d*eN@<=YuSNaqK+N z@TX%A!Y|dHcVc_pEQKdl#&N36%X~jiUnKv2nGfMDL*)PmuUp$U6cdKtW&Rz42;A+f z`rw8D=^Jk8;6u$gEj`WV!`MIWA)Wa?FW&wG8QzT_fFs~~H$IjJY>=;X=Jnlq-8uKd zu05p}f5)45dPfHK=g#~oWthhLa}iqho#t_R`raR!Mt@H85K6nuyWqe=$MrK(dyG^M zr0|2jdVaNb(WxvZt1F#exl>I4K zB$WZYPybyXGE<&kQo;d**13-%UhCwHTNEFT_=wiY*O15?X?0tEMkHN1YIWPbr+l~h z8zLZi)Cj|N>*TN74Wa09LVeDxRHR2Yf5!VEUS&sw$cd0 zmLNn8P9vF6fH1EHcuhnkRrwx`8bMjO0P=@`=KiHJc@QtGyln$Sw(ORV2JtZgX-K44 z-!BH}(1InCMhZ$kTZ z?l)fHy%-MhM_=V5EtP)(?U^+@8+_H8Mq7{NFT|1cEdtFJJ{TMC zW6e7EAjaQV+xH;0#Z}RW)?tA+NCW2D2%MH}pgViobE~9|Eo$p^(3xQeA_G~u)fIE6 z8*w9z{g z7F{F7;Kc1TUzPhu@EJTKP9~4!r|P%73coy5)Wqeeq{eQ*x`u~%3g+O(yUg{42(Ndde%~d1u?s9%Oc@ z^!Pb1-Z9jQqw2s@GIatEX)y&~-NAp=^V)N*v=o)#f8V3ol%Bdd)D=I~rf1_iz6Ah| zp?Kz=?2qf?30Nw($}c9s8voS&C#86&ZZdEZj}KT&H{;Wb|~{ zN#0p<;&iNuZn=LtAI7_Nl94lb175$A>@owkxhCJ70h>?CE0h{9%`^E=Y`6R8nf$Jo zU-iRO_hItpj+9sC@R8B$;FhOv5|v_di5%#lZ$P={$_|%5MM=Rr-F=1}Tfl3FP7b10 zA4{i4CcB}C6xe@Mz-bPfAvYB8Xv>4?#Q(`Zlkq0UDZeS;35kUu;m1{gQ!ZkdjL~en zQfNF^${UPbV%5J2G)M)nf?<*Py)OE7*VMT@%s#)IW`~gY(ga(Hxf6?b7QSHQIvpFyI!lY%{EYIjl2L{iJVOjIjP4`yO)twEp&>^bg!uj98Xe2izg2ZOkBy`a@~F?M!{%-{0$*T}107wGWIl#$+zcd{w^8J@!`J-1eA5a4 z@*bp*{QcXXN1j}c&8PU2rm>R|TIZ%>Nj!4y?j2B$Sm*zY!2pbH3t^rPh>C}l$Vu3P z&^mXCk!yKh=WsdfBMPri`jZ{G{>`z&*PqNRIdbW8)Lo-Y)F)JC&X*)vK1R!t(lXlv zD)2{{ET8s8;@qy1!#A$)Itd1rP@NhO+XLa@8^^-8RE&x9_zV%HgAN`k>+>!0 zcA4$|a{nS;BPB*JG{783VOgKEN1hHk4hf>-$|Z5=Vc$QF{MqLiDmi!fM(O4#FI}qA z&9SwuGDzVO4QuGA0f&xU?sM(P<-V3TE#P*!Z`4c*f9`A6(?9nO8)T6~6dqP@DbdRY z*cMQDZqoS{M@lc-ZuuecBlB7{1qEwP5Nu^0;h$chG2@PZ_$}y&hic-=fO$bFA z6v~h!8YvM)xS#8sddydi%(S)V($`VGfd4HtJ ziewUS$4s~MW;q|DU!`3v!fZ%5udE$;4jHEV?XFqaTs-!^fNT9et^2$N0Y!-?>67WS zk43qs=_WL~RTgXT4BbRcD2qlZ@fqg4PF~wufxeAyEmpMi0$qSc8)QXYq_@$9lvuuL^o6v-qVzPn4NWo97T0N_dppqY zm+l#%6ew!zL}E}f)V6Woc#V$~NnWNur_+3k`ZMV6bozv)EbFWEGQ|y+?BiY|2R4Sh zesFD_2xBb_a-7P3mTDG#4qe@{$TbUB0YV3sAOv zsVuI?9WI->?B?<}mtupQ1C_Yc<nt&mrD~a?YRu#au=7!xJ=`+kjpAA8@TM|a*Pn^Q#{KBC*mmXY(fFynD2-hQv%W5v$xE$ef8aF~+F3q`ggI zQCyzovWm+FF59^5|B7F2B%g0w558eePGz`M=hBKx7cK+1jN|eGm)E$w!{rk$JGlJB zv9l8^9UyzJ7W$t{W*+Gr<<`F z;~0{YgR(dwD^)mqJdbjy;7wx%r7@;5J!c`Fpw-yql8u=gHtlP$86+FZ6KW?L1@gjD zN;o!yH?g7E7tG}_kT*nd8=FY7QMikZ-F>pD#%7Rgs5&U69-B(CX&@UhJQbo+dP%n& z?8QdmGd3s}EN^Ub@ufi_^T@$FYg@nO}1Vbg6 z5&r$4mj1(yieS4@7i^+|{)4CWr-OrF zH53Ht-k?)+AVp{b#0!1Sqf@V;8mJ%-Kf30ZPp8&EE1*S?4x|W;gGO<{d+1I9p0z;P z(0M2U+6Qfc{GnA4`DhiRQZLUKE+mh@vt5N^#u=J%tqT94;8zfPtb58iO1v@W2d%gb(zkilUZ0z+W{(%@`HB zpjmiay#jg+bwCrE@GIYt)KiM;#fx-_x9C(dbP39Y3ZM$87HYkPrs#w51rjQyQ{s>s zI7r25G5%(sq~>`EP3@;C9G1&C3VhCGJO^s7GiDOkb;k7B^wDe44dS<9dlk#n}26_Ll7Y!GijQE5;V*~N?V z&5@7oE{5MBZg8^y-){CXtj0Ws8uIijk1-ukyn%{VVCmdoECRxBF!W~RVggRg34Q1> zNmYQNI)%|$h48oIf)u4KKymi7p50)~Fi`Nt{4>-~!jf$G^0VD5;rEq&JZJyE-Rxsn zI{Az_NO5gGV0ufy-K{41WibQw~}G^w^23CC`u8JOa#6P2;}ag zDDf!NX#+AK#Y0Jji3te!iV6@ve@KP+ldzqF0>r%!G9rG+?0>ueb&NMVz`rBs^eh1Z zI;j*=VSh8BEi9n96~99Oo#aORZ@26mL29b66VFsfN1mzL4m?w7c06M2iuEdFOqSI| z{;iIs5R5um1^(@8s`6Mp4kcf|kLk6{1fX3Z*QXs{cl82;=E^;Mw6 z@+r!?0NEn(kxH(TVY}BCQq+Fphp=S-zuo_F3>iIe4E5h}Q5f9*%a2BWAD-TmukdE8{kO(bDyBokHmHh?x^;Cx!eI(Cz>L+bB716&$f zLNVB9$xXs z?r6Blrww)|akGAvFeXnUhmjrk`Z(VtRfv&%qY$?@UJdUlWzE0Euvh*YZuTqqzvh(T zEVvgUBxO3wx_*lx{ZA&Jz}vEov&)0^`W9mziXmRgI3w}57<;~u+dqoRC}WkEGUWd8 zpErt02B@-(^{JGhB~gpZOp-tg{Q4k-*D7P^{u6%h7+xQSTFO{E$`~3*CbNv;1B@$Y z=mCq%*@NG@a)t$5*UQ=6_+vRkP4{n3o+18rsD)cg;-dIdRdi=jE#aWQVNPIw3OfwT zwu0e@m}F8?F*z z)-h?6Tsfzi|F;5M!2TTQpSUFXC`n%dN>ZDjlGGCWr=X^LX?)cAy)?>@)lS;uHp z8?=$7c!y!ANFpIQZ$3$*R-MB0bZ$AAuoH=!6@g&mNKIv!m#DEEjV! z)RN1|(Epa;+H4xN8Ty;x{}v_{`>%4sn6OJG%Yz=c5DN{trwf+LQ&S+4456$B8ThNH zsoHm`skCy6-Gl5%kM*izOlFTDBsW2_N=HF<$OVFTLA0^Amu43r@ zQ}l#V8kGwD-?A)TMx$mz|FZjSN0>&W^M;ca%jX_r>OZ}zpqfVYLt3nadkmks zf3qA@kB3Ik(hBa`!7b9?W_!|vw@09jEam%*<^RNX{WZDu;`B%x=Tn{mwz(DM+s?hGDEubvc+K`C{yDZ_As%}rIDdtU$T0;Skb{)=S} zE4r3({Gai+Vhf%609mqBA2ZgV2ON0J{=RE`%#fG0i=k6jp>F&Sm?BE{kDDb}$8L_< zb&S>Im^#Mff4;$IreQ_^szgRKSvNTWU)M2~Fa4X9Ct0|`gh&WNL3U60&&ofCd&CBa z+#3>-&wet!g-Af6zMlJQiKcJ z8SP@sf-)X3sCaMy z62aulAh>2euCZWyg0hCV>O^=2@CT#`e==j`2dO;9Q>P#p0mk^c!jwr6C}N8H9oS-E z6=VcE-VC!jPzw&O1br4@<_rFj;N69o6o-EU7_|tG2uQ-_urUL~LyiUi&KCW9R*1|F zy|!RtCk}WGhYG&Ei(wP0Le;SUJqtx0a0flas@QimN03i@%{UJQ(Z*nI^&<&Q}Tgh}zoQ&01C zoYL5VcI(mJ*g-gP14<8D0bCf&>2!AB)(|9y`K(Cr6Xw0f5a!?WSpS~mB6D58Avc64 zWNbl`!6uvnMb+b}BYAM8x|Nf_zo&-Cl+mAUs8Y=R5Xx-FO*m`?Fd-b_VUy=wwGe6V z2C#GorvR1U;azAlBo+@EMW7$RHUkr&D%dIDZzeY6l%sZ|6G7zEG6O63lKExy3Gg{Y z5@-h%_i-}{T0vxDijW13!6v)_iDAm=-}7VtnmqfDi8UsfaTAV4$HT#do1g&Lgu9{b zunA8?`(dYml@Mvm2CzE@^Hazu6^s4>xsW~twm_sX?V#I!oYKgUC)fvh!X5Pgp-dUQ?M1li7X^cY%o6u8H8O4 znqp>+Wcq(*%}}shod5mUA%f{J!umX1tivXJ37Nwl1ZnxGA=v+(9{cyy8JR*eFT(ka zFoZTxE^NYeP$g`_*Ef+l*o0kBHxmwGe1u3Ka^Y?ak@hwN&p>1F&jsrsfhJTtc)ARk zhMf!kh7@3v=MvfwyOiLB3JkaKmjqQH5+~t3;)Z`U$keICv@sm|U?yY^I~Vl3&54LS zxFyeR$-#uDxb|64<}OZIgjWEyAa91~uwAacY7K zA#$ua=*+cUKyR*{!h~@P8bq$iv+vtnn>+$<HyfEG=tRTq@N62@VO1d0craqSjRu9@Sn00u*(8pFV+5E-~y zK-H%>)ew(5cmyKf_wir}MB*$36`paz6AnUQ2oEwT#THIgD}ggx@dO7uR6uWt9PA4g zK_uZ~@F7G>Sqrvt?RIbkBH;83LEroL$8HRsPl%R%%0(_0r@*g=@@v1f!DG=U<8D{9W3a=7YxD|g9AM{ zb>Tk(YWH&DC--wPOs)fq1E>y&l#(oWc!B9=bsYQ(T=S80fG61d2_-;j`oX;eoT`oj zg9kBeBYYS*29YL+{ERULVwV_PHiY3EnXm)5K%|h&?J(rOpxUuR0Xz*=!#)cx_=?^S z+Z?t@&4*Dd#2#F8Bw^VhS_B!*FQBF#@L0XzZ#Zw4rnCL!c=yjXH@iW?+E`joL*H2FY65 zK_pNL-ot`bVpoHYBsg|0_!O(iiGK_D5{sA>8Q4tXz`~9gtWG9_&wg+*Ug{yX z?^GHkDaWx1pL6Xoc^W07NTclVx0i(4(`ZyF>=bbJbQ&c9TN5nj+LfU5OiscsV9P9S zhCpWeY>p!X+^xy6BSC&G8oQkYz@zgxc06dT!?Df4kGdRt5S(d<`BfyW0;-y#=3uLX z1Bm`#T*0=7ZqdaxZ#TaG3mVL(?q zj=vi?46)C9FmVMtQa1VRIkp%W!?pK=(;e`117m;^_`m_}-;PMD;Rtj@3DB-Vppg@* z2~9&N>&&sIfMzR^82kx+T{t#jfh*?B;a?1jyK`(e@FK(>OThbFyBh3Z0+pCKjK)MoURV9psd2*!nT&Y(l#coBfUgA*waSOAf8 zv>05slVfiL{UgxZ5m5k0-%Vo=K0IIw6bXOAJxufw*im2=R12F>F_K1YhphzWLS$ql z+`EUwgYo|mj4u!wmBzqpdvO-vfLw6$KJ?m`3~CCvF$&d)!HV!fH2Mhqt3j(+oQ|;5 zK$HEP%vpjDAu=e*9H3Di5NS$J@Om6Fgz)*GGV>s(8dbnw5Xl{Nh(^7I$d^Ya$U2Ok zjRQ`C&!IHfE#Sr@oW4R>d6Y&~!=F$hfyTa)mIQ4e(oBS(Ark*r(EJ$27Az%W5~Ckd zfh&$)IB zIN>rUj3l@cYC)tf;AO6VF8CQDiG2kP(>a+l0>hw4Bur?Ufzuea8OWQ7@q`J70F3z% zDKUO3i*kq9odv9iR1k*e3XNI_5q~={l4}!|aqUVl?J9)uWO?LMh=lJ3owIPt!k?^| zOosAdr+`esY)-J>flA_B#uo3*WN^JzzzV(f9;T~Bf`fJNvr{!aSKg=Fy`PKJg<8NTayVR z1R^B}18+do8w?KMXJ{krub@F0PEpuK;2Fpg_E~UUIXWF8A}d_uAyQ((=n9k+{`Nw*^KKP^_eXAW`X7xD#BN{kW9SKfq+07du{(uO}-%WDRaQW6%lpof$2U`Z>!Zef>#PhW8C7SQq)GVzv) z-VUQ3B5g+a>otwqPa^ARrUhGaZQ+qkK0_eoGUBCle`w)1WYgd7*KjGUD z@wkC511JD&LW9rfL$HlN@ga0T*plG-FPu}Cxe-SBSL6sgD#2&NoG+3Vuxx}zxe8EVM--3Bzbu zjY-a97?dZS&dyyVI0%u`hVT`G<4>A^h{>68fUD6j`&_Yd&3G#;PAza6xZ#p+(zgbk1xY{Ksl8MsEkXOmD! z__u(Xa;SRPgv>-mJl@8&8)5h~I&}y;c7YqFqZv>|yFgDRJdcM>SOcXXOfC2ZA_=sE zPnA(3__u&TGw}2n%|z&r2kRN|4*+8!5U-u_B+eUlbUu0XO`^z#nrs1>n)dv2#&d?{O@+LW@)Fj)V~DH-z|!3u+L@HiL`w z(EcrOnBzJ77?cZ}torwaNG1q(acx2aLp*0i7$eZi2ptXAcQ#-*L`pox7|**Q(o7q{ zGZ2aAEO^-j{f6`pP|_6X!j@#hSOSsUS%P+EXdje-@XZ3WCG3q0=~TxeP68t4$TdU` z-Uv!A<|IJ47Yac5D6j`&ml)i$gmWx;han3h87c+sEYSX>N{Mj-A_t^^ZCtw@l(s~l zK%_FDC)5v{@CZaMB62}htOCe_zdCpjA_*J5pbRjof52jK}9-&7C=KqQRjF{}+@VKBn6-QdHMh!?ifDZEH=8np|%|1_#A>I|w2-~EKr=kQtw z?s#Otrx5uXZ2?!OqAhWN8~7d~eS*4xP70C4!ocyDP>Tp725x~mVQ&YuE^|7mHn=(+ zg@iwOYlyrwB*G-?JYa}raN3XXG9(HAO0WS^fGw7Z9t)|!)(6e7zC;r?VGu-Wi|{Z+ zG87MrWaHZpVF=YA;;#-GLnM4W$b5~>Mv}layiWp=KxA##U5I?kk!4WQIh^wtFQ-u* zP&_89@q!w~2c3ki36gi7+F=uB7ov2q8^CsG1U6wn3CBMYw7A8#G5-UDEd1S%K!jwW zZz*g-vZU7r7Y>AEF>W(#!XAi(CnRfoNf<)1u9x@|W^ir7N{B4!CnO6#iB0&W4DC-2 zAPZ9E$~iWnA=f5!;M#;6xi%qLmB~&FBy0Fcq=aPcB=ILCOCO0%NEWFPn~z>3+(6mlLbp+x7i05U3cTrp~VVF@Ibsp0up?=63oZ8FU`c-T3_qW z;2p0Ws37H^xG0<+^@5R;*pYaR}k99f5!%{nX zYxx2K0w3$$xH0dI-nUQ7zt!JuY)d&cV`0^_;8{zj~#6_4x-cSnYgdZ^x@2tFFarTv49UJ-J9; zGP-csOV0iB_3OJ$HG?OL`1Czkh8Q8$7{#uCHeYAO%-A)FWa4Yw`H7j#q!n3lhtZlUR{6l(_(3b z|FLPijfL(UY**JUJO0@#=Eu58eQn{%YfdI>Ox&$)D|uh^>sN-Zr1JUh{2t$zpEl`u zN;!}6X)k!lmmkhB3J|Kv+1hL@J@o0*rEr-vKjwGlHCy)zvuVGMr7Uh2Z{WRiaU>{c z`%vLaX2FK#JI#)lv?;YHv|JeSw?4K(yQ5@sWBST#q04nw@0dLAK}*H2mOs){4pbEB zmqt8L5FeW=`kP7#8|>Qt;*#rzjZ>a)Nq$~er@?v@t77tXit+4+(}r`EALV(k7JYbP zdeadli*NV8`Q6-Rsd4j_`|DFl88um6Cue!{Z^^#A?(_`i)>}3Q6$FK}&GvrXqp<9_ z!fgBRd&X267VPFxv2*P0~2#y0PS{ z`m$`bI6I*@yJ%-8R{q}0vlh=!r12jQDjSzmT3GV8-=PmM5SXspOrE$O1fhin5eqsmdX;JxU)@7a;u#tE*n+*#I*K0c;ji!0gr?=jRP54 zeQ6U53yMNZ?#kXSHeA{4G$!5uV!Xe!%J_{bElJIWh24`^2;I6j^Byx&rZjuvxBbh! z1-`VZ=^pgz{8_bMW^wtNLkDJ8%ZshPr`yS2we>n&Px%$(FIx_UX zZMAYL?pOS*$(lMa%TQ77Z65Qu``V*%4sPFER<^GDEI8|~zUa(LAKzWIdK(q${Wjsw zbj#%vZKp-#52`$Ih<31)S3CRZ#p-3dpDisg6(5lMmb7)5)B4pVR;m%NS_`f$*;2PI z|HqNgp(7u5H-;xRIk*i)ZQr%{y@Anzh-X-um8i7nN{I+>2+#3+oOfMomje7=?z1B zi#0EsXKz?}POxil=#y~C4bAS4!+FA%@B5Uwzjs62_8-RQcGA!3H>LJnE|zf!dlqC- zVJlg0mucy~;{Kdb)0_4ul4AUKZdu*D`5E)d@UdKL9WTR2$?8d&r5;;uv|jxp^?d8} zCufq@5C5)uas>wo$_yQbgia)z^8{gV1&*&N5r z)VEn#b6OAEhhNw3nsVgJg?GAg^PRJrqiz`W7+4=(UlTe*`qhrd$=QzQYWm&nHQud1 zx!F>Lx$11-vxgp+Jih$YXj6IGpY9tGT>feHv&~WWuTQr)y8O*Ain(n#W7%>C=S%Nu z;zIA<-Y_X=IL1Nks{4+E$vR_o37_)fw_BxTWwe-XnG_iI{CKtF_tkN=7rrGMbZtL= zcy;QQ5?9yL;+GzLPx)GrIrG#aiOV@&vxm=Y3h=&J?r@9QekPW8YsaAbq^nt5#s#*s zZXfmQGr7B{=&94COX04RRQ`ps(81YHn@n?dd7OJ1HRJ2c6PnK2nk&mM@w>hh2%A6B z$A3-rLDF(nR+6+-;$>$k8xx(W>q9P=uCQ*hI}@Pq`smF1)!`G2PGvofw_Q3otKw4h zsZ;CAO1qtR&2;p?$+Y{XbkJz2Xqn|$_NQGvEuSZB3SBp(-EHmk{d0}4&q?oBB28bE zx0Sn|5`4U0U%Oju;l&OEE$uVo_Dm3+_oXf`qt@V>-lnLDQzNqTJF696*zcP!;9!&* zFyqXzo~ToGJV$0evUjw8oO!V~chaeNZ+#H`&V9{72B5Yc)0LNphWi0-f_{o?vcGZ!;9Z5U%FhjzbIg4Q>yc} zMH@2nyUkQyY5sbZq^jDdWn*CftT)v_XSm~@+R8;2R}AG|ixa*QyzJA(;qJN+16Lpa zM|ZzInWhqVczIT~ox_*)rq5JFUokgFFUh+zb*|}zd1YAz%_pYi7YcpbD|ctUcJ0dZ zW`(DYAD#UCPJUlvpU$4Ovz^v2 zs}I(*Et+{@&W|oHe`2K{~&%{7UtCzSDNn<3?lrQ*2+xEgtu_=t990o8uBY;wRpJF0!Zaj=Ax# zZsU)q7OYb~qlnaG(F$Ir=`?0%$O(7Cn8sapTWf~~GkGG9sM7yT;h@;U69 z`FNSF?Thjw#@`M{e2a2VZ5rD4qCWX!hI__C!JSu_uIr1pm&Cant^K)5(tVx&k;+h^ zs@T`TYT5w@Q!i{<@Ul2LL$9nMt5~`ImQ=6)S4UVH=VP%D0kwbH_p&- zFWntpbL)3($#Fb<-aSX@;&hRp&pt>weaI;8HlHA}(}!Ufwr+K zbPV79PH5*Xou^7^^X*peP?|VTY^uAkdETd6=~oA87mknk zlhO2j4f9aBbn)i>!kV9%zikJe#k4I~F59<$+Y{5|qKHG{>NzWYotyO>|MZD9^`CrF zcQDy0DLG}z4|?e0z*Qcmy&)SdS*cR~sj91g^;~w-s5vdZ}xF)kzdhDwb&+d@A3jb<{(A{GtwK9kBo8pI7hfCe55*_w9@Bl4<5-%C(Ju)*&2yD}K|E}>w@uxJOi~gw-!-2$Q=-(E zPiBbwhX$%Qr}{V9t$S+UD!9yF_Dk@p(|2o|Lt580Onb2Ny>8(l`p9MbchRx3HDc-A zPw(EA@mX{`FO^?CzH58iXOCFf(-8^M2Q7Mbn5)z`7}bT;x18fU{bl@G*#p6PsXr8d zo$-kXQ+whzFU{S<_m!vFM?ac+$jHFTaa)Ajn7ZX%9oy{dw?9{3c6VN8--?!P4pSFq zMu&-QzBnmB+rT<*_R~u(TCd|iN(=D{yQ+@a{1M(mQqPc|>G^1N_WtaItlhttNN zPt)+59`8OJd->d%b4%!Z7ytV4a!&5xaSNI23u1Xv9)BxfI(&-`K6uIZaLs$`L=pRi z`&aFblgL~1PIgo%RCRkoPe>ztZPhco6$hbo4)_w9Hv zpcOSK_yToIM0;BWKl8kG23>zBFeC5}OLNWqL#eYiBsbb7Ojj^HIJ1~XbG_>$5u1gP zclNek=NVKoF0e0{@}nltTi3Pch4fA7laixlwsYR>-&qsU@1YSqr!3&7X@cy%Cg$7B z*yQ4)uQvDZJG3_Wkh1=6Q+<>A8Q;w|hUhdtNX(Z{IZ|wBxvyhwZ9bF9<2Eo{@KZ5e zvpq%L?D4?>oysTTveWcs1*>>9qZSxP{mA|pxV=l^a8ZPph2FSg&zCP<{O>RV zKKD>DEfIbU{(g}Q3Qmd!{&wYciES|swkk)J`~@Fw)_Q-d&sHn7@2vEIX!L{MQlV`} z4AKK)8na$*{Tg%1FL&E?Tr~3EJ5uRl^QEb-Q!u?~Ltu1D^IVUKmu@|0@wGCejqjLT z9aKHzzU5ZRxowLKzZdP;oBXX!Wm4m%^Uv$dS>tNMmOnq$ziecm*GPGf-OcvRh4M$^ zA7=CT#OH)bnWT@GsjPgdH~r+aIq`7{4T^K@gXLRydkUzY8K-i>UHo<4ob%r4lb)?G zSr+#4c~h(1jwDyQ@z&AS8r!6bcUrCfO#7=FI;VC!#OCcDuJpH>@LTPC`0)D!E60}` z1qY4Y-q{;fae(1EL0R>5l54~T*HghW$8L*C|CsntB~e%W^1GSL*kw(jAAfkW?9cbA zY+)9E**jD)dq}TUx;L-1jXvVTI(O;E;f&mlkmL1J*R`g|ue{s#&@EfzZIyU!@UMhA zSLOkpt3O|@xGXZS%VS6Hi+epCU!6|P+;&2DbzNif6+OeIk15hG15Z2(+T?fUX>ayY zX068!-KCNVD;{)?ls8Zmj2_r& zYMm`}Vampe>9B;2w)HPbNH<&_CRMoi(C^%~@iSxgoqOOt)8+mL>Gd+63WMGMoOueYF|3&}9kqQM5=`Rv;Hr?r*G=K36n=z3@iNS*^ z>Vb(16jr<+Va~P~m^3>2YrSnzV+emhtoEh@!JPvezeb0?j{j^bsC8vw=B(N0LZyD^ z+LoIhDw>!Uw-f-GWr6A2mUBS%SZH+>NA|o+9%} zeD|Z~K8~Lzk~bvnv7BlWl=?pHYO!0qvXpdXn#sZsIjo5JX3pYbU9ys3q#&gPC|4rji6c;0q(Ozw)s zr&+qecOJ_wy`8l4C-ZV&!GR+Z3R@M+Vn3}Pe^uyALFM)}8Mij+)ZTw*SGBcRB)7+4 z@!Q%Hr=8+@f}BqJ2dzAtbF1HS!7>~7a@VuFH|?0!f8e!n$M)Krt}~f-Pd=s?Re6Y? z%?VdI1 z(c}|6Vy84i&?`7F!MAk60onU}w_?2y(*Qy)1UZ@CC5HxWI7O8&D#oA$n&UeUg`GFEl) zZR!arm-cz%4YoEF5B=D%LFc(Y^Vw%-(VO$-JF>%SR}W2nkv_+MXlLRsReOhX#w?~; z%}SNgMOKzOt8-Qy`=rmeAzj9hZ=mr@;THdyfA$|U_1NZ{7a{NT^wy{RBaNdi^7GHv zwN`a$U8%|0+&p=7#N%{*=hgN6-43NTQ{U;IZn!TQx$AwAHoaP|j<52B+3DNj)0yY! zb@6V+lt_-fFx8dcH56i&^7V>8?S;&pw5`*O>9ZqWO`1I#;mx7t=bG++(BHMnYd>pr9Zr6g%!owwW{gpeP z3>;dJfWOwbICt!g)ula)F9kOr_+X;W=lneTqHdhdc>3N+b2ol!-u_bc#eFlUq>6D@ zmThpH#xGXP_#!8ia(yKw_&{%YY{c9&MaQ|z_zsJ7xR*@d-;%jR;F@9LCe!vaqGBc6 z+mnApGSBabR55bbllyaD{wAK^4xJ3hllD-k}aMM3s|e} zg{-}3=1`e!`ObJ*-Y(UIwM!;6{!!pP*`Div%Xe2i!+zC?;3cAFs=sD=iKGamL}xA0 zs7S3D*wlQ_Z|vQ{r_41Eq_2i$TD@@})KgR+#w9-f`EBvuH=AWQFYJ}p2|p0D$MVgL zb0S5fMy|6jzgJ#;jf_`R|_oqu$t`KE|DeVNw=t{G1~ zI^xs#bF#{|?W#9l&Qtsq)BWz}pWk{(N&;IV^s+1`saQ;Yx6@`vtob;m4a3)Bt_q8H zn$72@zskmjY9`#9Ai7+vy<)WC`p%mV4;-I)tmvo542iE>do;F=|2?2~^Mp`n+9B17 ztL`%!ofhqjHwy{PS|%s>^!^gL>g3Da$~Rq)7B!F9H&ju-<(_>tnm0aZ>l&q*vm;Ym zErNc{?C9IFbF}Ji%}l{-#tz>6m$qd!o9sAfYQ&#< z?aaRWp~Xe29!V}mb^~OF`kVc_xw7h~zl%QKq@owpsWrP(VMF%pDIWRlH(Xw5hR@A9e8|@J zw&fH1p{}&!iR0vVhUHe*Pv4ax_{&{LUH0tpXUtTi+3I!k8nhC>m!4UF+q=-QrrM2V_2tHIvjbTYmWEQ|^1IK+ zSVeybmoum}A3gP`J|@%JT-Nn$s={8zpUAW;+iaJVFOU9H{hK%DaFVj{wXvC3espzf z&6wo&TUaVwuyAmjo7d~GhizSQxa%^KUfvNOA>MDX*7Gsbr*Y+!OKVF^1{Mn6S5K7v z^0`=i{Da2S@vA3ZG@Rwb=YC)JlsBXAW}%^@21TnLwo)lK-*xM}veES$&;Fe55in?a z>Cw4!w3YhvkmkrD`YQjz8W}hpGG1C!;LJM>K8nOW41Ka|1cJe$aEe4zPbD6hV03cc9a{;U9eL8cTec0Nj(}Z zmrq$ezCOD5LuHg+UG~k*y;Z7uH;*zV+!^057<;TW_*>1dTBr5X&lE7-SN>}2ddDza z9RK9JzL7!rh!1l{*TCbg(>p%(yi4k`RlIY1!?2%|QqdBl_^}Bc=PE9>_7`qG@v1<- zD=k9SzVy@aq%3Bb@nglEmzT=(Zf$D4FwG^iY3ZkjKYUt!*KYl~wEbS^6QTS0=UaYf zYPwgcvJT$UT&-TGTQ+0lvWku~^W8n~%$~>3m1pgYtNA6mUe>N+L5lAAIg>Z@eNV;c^4Td*d%%GQmkWm^0Q+akBfH+Y)rb* z$eL5dH@5cJ^tA!{kEG_jlH8CPH~pEmtl>;1)1u~l&I1W|jjEnYB>~Ro9>_LLpwF#6 z>zCW}Yd`aK@Vj2mB-;n%ZDn5nvSY zGtSAOmPkyhd61(X0Jbj+i{8)cBTG{ZnI#+E`>avo_^-arv znl3+v9}|u>Fyn*xApuAb5`u&w5ojDV9ukGbAaO_nngB^cQqV+58j^uzp-IqWXbLnH zl7r+S1xOK^22F>QAZ2I*U3+X}nkO4Fw zGK7pEW5@(Dh0LG@&_ZYtWDYHcmOvJeCA1W>f~+AMXc=S+Er;x&6_7pT069WVkTbLr za)DMsuFz`84RVJ(iVV!wG+(1R#f~3XQ#5|SQ+hG~)(+**KgVi{)U~~W1!?6)$;Muj z+?WBU)8tOfjN53PXa4Az_oE|O+ZStGD#*B0d&xI^vd`RChDsJ^BL?fT0_Weop!1af z$$U%U{O;HUdo$+#3zmBd0~#xBe>P6!{qa17_wr)qkH!pB)mhqeb&tFXt*g~wy-GTm zqIuwE==bEG`U4NnF;{*YTiYHkmCS$SipoOq+7%C(Z_gyjmW7|Xd&Y46GPMmNURNeu z?OA*7$LR?<$`1v5ADs1_?PR-R&9<2JJs~B!ZgSVwK0NiJe5l;D@ND+SIRi7dzmm-~ zcHS-WLogw1$%dmW`JBT^57xhX|M`V^_=T-0yHd91?uu7+zB6CNUS6{=ev6ApMD=1< zkvC6uSB)N!t5#(0^{q15JEdojZ`LAy$-RE}cJDQ5Eqb?q`yquT^1hBnw()a@7u>JX zUvT8xf*Dn`y}NFThS*J+R(;*1+UqmVg5=(PQ^c1`boQ9+S1dP=_y3__agQY!QYso^ zW3)JaLPUJ}y?Hzat^5WWwql*FCe=$nt1qynb>{0_uPJG8pp0iTX9&)3E&5~-9HUTw z;MkV?J4}u>wu(9h+n%kMtaiRYqC@Sq)SSvV>3h7c!Q(&p-yMB+N_qTM4|?~bj;q@W zhQd!ri0`hLrg3{9XFu;0+UxC7Tk8%y%Kaj&sb!PC>~`t8gxK&o7k;})SBcb?OuKfc z+FCp0-ziYQ`cA;Bu#HUx zZrwAcwq9|3+#47D&U&l+$s;$i`D@giUmv^tJbsVvhFc!-CpYZadU4bIJ+67oQiZ~X z_4A#@Zmo)4;IgB8$D_~v_qNpcntnE6Z1k+RDc9H0b64@mbgO^7Mvd1e+HLMi)z_uL zKAUzcn!2k>U6b|;{c`*Gm(hoZZ`x-Dh3l^Axuzy~i=hZxF zShE~LpU;tw8|`VY8K07P{b`|nG-YL7h)w?|8Xke~h z;*XP;x9`$XK0258&l^WOm7?2?qZ^$z3#BgEJbTB33q^8e?-~uo%Z`umUB4VR?_=}i zXlC@)`$?m(vUfGtFMI7)UDVWk{^4?IKmX8=BEL>+bPjzPwNGtslU^wN#X&EpzV^dr z3u|ei8%?9%#D;UaE`R8XYpf0TEKay(v`wudn{QEe$>9*m%l>?>ud`My=snSspH-ST z?&jn7$1C@GTDoj05ArtD0Yd zP}~zOW9vhT^Ulxs7II?GAD-o!zvk5q$GSab-q-o%AlJlvxTWmzyB{-$)N5ZUO9^Pj zJxh3~q;076`IKRYn({sW)oz+HZ$I(T=60U2Ru?$am9XHhr_|x1?EN3! z?Oz*Ly=?B`bw>BztLyc&Sw?^{80Zswv(tqE%~>we{AgxGrM6U$0)X*(|Z@92h5 z_ajvjMvo*!^tEoVrr)yJJk+Ia+`ixStf2P|&!NTP5}!}@d*|HNKVnGGRs9 zF`IH-%a0{m^KV&ye1EcCxiU`a!GfN|r%^_#%@V%)CNs0V??t|LIVl*kDZkfA zn?GMM>FXRz$J_HyOb$7BQap3DX5QU_@kT90^K|212LwGn$A~}1f69(=yIDIq#aUyQ zMl_4xu3JuIRPCsO(@qs*HSHAbm_%KV;ZqGOz3L9=+qnt3i0?o0I5ISd$uM~tAG*J< zk70g{r}_2p3-7z(H>CUe$3Lskv~<|c-{)go$k12txR@cEU~Mv~#5aUKZ-LgD4ck*r zZjt8kURicOPy39TnEE2YsNc3H_)-jb0$dwAq>S_yoHSR_7{4%>75?+#iIC;NH%u~S z=Y}Rq^4l1DZB?VZ#*WCpdS@XY(c;H?(ch|jt5_^|=z+e>;N)@Jd5oMi z+loJyEW5Ej!MkR%aaFCT!i>X4MW<&d(?ViTZ|u(M^jPmQN2gUory*~rkl;Bf#X`D- z?YpV_vl`avoH=!B9 zRt7hG?7C~dd1p+I+2+h#)!L_AJa%smy`t*ron4=V(ri-uUTlw|Uu${drrY;nvq)v% zuQ@z98*WCwD)=)Y$H`LOnU?cLHu8DSZt?9sD;0-t8T<^$YPgyenZD7W!jwwiyjxs< zo$$)gXbT@6-4&mmZFcUYOy2xhxIOVqJ=0yoCc@-srNG3Gz2`+Ldx}h@)1`OYo}JXS z^H=WJY?n4Ujl>TM9$o2&Pu(2tJ9iYbXx}zDc>LJ;YQ^-d;wL8K!aiA@skB&>FMiqW zd}+7#mCNruPWNAn_Hn#Xt|8h{{-!5+@Z6`l{PJb5->4e?{wB&7oH^P3sM=J2Q7^T| z?eoJ%&y}}domJ)}L|16lHI%uZH4q_R)!?|0zcDeMX?yV^YhZl*<`}V$b))>3j`L-# zJJIVXc>bYjRKm}=JqPULgR%=wIOVwBj^A)9uf#q)ho&=o>DliM5=Z4OthE-L$9ps| zMDN|_@2ApZMh~Tj&lRan{MP(GRg&4>DM~yo!Xxr5-v6TVx{7u zIhz8?3zLe|H!_u@H9EeJ#C*6^7^AY&l+n6#V67F>c8f)gaTyXydfB*5VAb^;+ta0njUJ;61B z;KAM9{=ba#yBPO;}U3hx(_P%i$U)k9ZuxDgXVGI$rQ zTkjiNf;$Z@1kTqt47Qn+zQui$*U{FNdeQl-KcSFFLH8#>=E{9H@$l6VOR{uWV3W~V zgnWADiXq#}o{#%j#Zyf3@{|5w^q@mYmy^xrEqVc=dO9Cv!+Hc-EqM|ak?d-!QFamo zvdljsnG~pF%766BWT2irO=BDDQ1ALkw%<_d-xS(qBa)48w{R z{%R0qIJ5X0O{y{J142`}++#l;>u61kRh@)9}cT@AhR*1}}a=QsP1BdE1TNto76EzZRA#St$V#IGpl4Pj|C5seVU z4T_Rq2`rs;B$ zj8&$O*{gjxvWz!d5!a?U$$T!qc=}18COrvXKI7NCP`6l1cXbl0Eg$OWo`c4!{to;( zHGA*KGXK;sfoAZCDF_t}kW|Fu()3I5`byeF9${x>Ny;Tj%ZfNR?ght8uS)jq!1yqe z*?C!u=0VDzB)8%f27FuLpWk}QtJ)+EA`DEd5r*b(;1M&3in+#PQn~W6WDqhep)FK6 z=Wi({SmoWQjbY`9C0%B|WiQgA&0s~FjZPVr#(X_f2X3S0?kuZK&wrY{eN-)YJJ_Pn zzoAN$cKWf69gi}$%1-v8$83a#p-kfi6AjEqo?KTMhpS&dV}(Pmu6g&H69cL!ukf!v zQKK*8#JS$#ben1ko(t?VV&(2KL_?n@q_r$K5}{Ee+2*f+$ZT_0f{)l5nWzv$-p)kM3F%-C%1pQ1C8|)mcRU zWK4BQwlcz=NOob|qdoD`u^v9OzTuHA8jg6I4nZoGQDRElfmSTY-t-jAbO zv!mryum)wsWTNYfM9SJX4|-_BT}6xE-;%Wi)%Wj4Uape0pG>P zQr>?}`174uglO!BwMt3SP?`|BpTYzU^wQ>)r&8AU;Xm3a9tl~<_AtXxoS^GahNdai zz@7*u=Yj5Pf0Cvf1YQO2Zs#@j)tGjeu;J+OVp)&zf!E&M#l8u_Jn!)yP52DJ^E|^Vstys1@2OW1-BG0wqf@d3U3ypXcnMbXhEQ%;t zId!$i5yx$YYARkTSZCuwH~qC!(7x_4ucP}@pws$TesK4s-(kLIxG!5nBf=qPmE6dJ zWAbxcjNuWLy=ihgb)JVW3&rG`a9TV3 zOc6D(OyKYZUA0$Y#m(S;UWMu;mq34}YD*di$DPF_>;XYqQ|2Tb>aHtUt>i%~+^J8; zlN+(lM8vNv#OvnYPraMtR1a_<{GjpQNKU)Efq3D3rr42jMFi+rPRlw z*!Db^B4a`9ssX_pE3eLd(h9U5)BE|b1)Ng~P}91OXpGvsSq5(DJvE)o$uTY+&F{Gr zaBh`y@*H#)x#RYi6({nr+fwoo6igGV#AD<6Xkdlr5Es^NE0*l$Rm!gR_0VP(1x+CSq04-eeYkB&TtIrR z7~1}FoKeC!dFp_7@pMv~ZP9R&k#=!#LYrh!d_wz8F{aOJ=?y4}m zer6OTfu_^m-N!wShqWg}-mC~@pUjWL0Z5+$XJI2GqhTWn!oo?)%)w&OKvHH&a)ZoFcj1|z z6$J?8TUkOo%5mm!YNQ@p#EZMy4LS1)P4Cbd)A%w}Rn&i^UtcWMcI4z_q7t%7 zYw=>m!y#=ulfcwilWz)qe}`Z?y#Hg4cpuj0WlvxiKR?fzaL)*}u>k{e@^Mcu8S1RJ zkcKq;h)ZiTf4jn?u)6-_F5PzTw_QXA_q5W~D9;q=j8ENq^-Hy#X%a%lWOM`lW43l; zrV*oT#@88Di=kp6f0thB$ z@7hE!Xj2ssu}+PP?Cbov0p}}^BZsyZ8GbH{UmL*(yV-L3YP~Uv6=6Mx&7Cp2QO3Ht z*DC1njOv}D;ZzPuUl9!5T2OEDs;bA{jBRlaaKrP2hf)^K4U6nqRwkS+Q;(a7-DRY5` z4YKf9%;$6DLUj7jW?JA5XO1K}f4Hlc1cnYfHX#can?%!CM` z>O%_J;SE%(k`pVXo-Bi4cW-B44T9yK@UJ>VC z=cZ7&e5T;|!(=slzOJ=`^VJPEg98P?_9Dobzr|u9l4*m34fgI|LsQK_+R*sYC>I8e zSsH&AfOqeof%ZOJLT>zRtuLYhT|7N*TTaB(TlZPC{q$KcCd@l7CF$BG3cB)!OpAvg zRZg5w#L)$HN?z$p`|kAPY{;(bj&{KK<)x_xv-u4LLM zU-(%$Ce0LtraW3`9Vh*lH{4gDM3`stYr}1n0a+%0W zwwiuZY1UQGVa5V?8qVkoSLW>5AU5yDb!^8e^a62XKRUnC$y%80EIOfIpjIV9joD8- zKYtP)dqQ!|#t>1k6`^03Vo7oI9_yvjF}M9oF(bA=(+u#tN$;-SbTzBR`g{vu$jpe# z;)BihQH(8D!!$lmbFhE)XZ4&Thn{|5{^EMyyXx^o%YH-X7c?$ z(%d_;@z{$c{$@Uyqeww14R}RbXdh+zy(oV#*J5y@ibvokij`*h*4BigIC`pcP za!g0j=-ikq>ztmam(w2aQe00t4gC+OeWNNLq~j|eXdVrEmJai(^$oWpxVs#@pHoUCgG?h!CvkfIc?B8-3b5ZoZgVF57M(L=bej?)@+uK&ch2~T3eR3h( zG`(h+ApHfA8lqt?38#BtDuH`hbetdC#}RbxWndm~%Gy?yiWhlbzfSPXfaizghNCx7n z2x;oEQUr(_S4k=bDM%d&rO+jlca)32Oz^Z{&?CGZ1$Vd7BzIIy|&ChmCiG#vR1 zy*7g5X^FsRrxTTl43DJSa^kTgf31lcOnbO6a}!D+MU-De`3Z)Am6$zM)hV@*-rl_J z$8Q)1FO|j+IT^J=;UD_1_$wUU5^{o62KW~EJv03l$ZY2fd(($j)QeYG?E^})IFiXOH0wd2RV#z(#P zZJ$R3KR-xG2#yNAIm`8uQqN43ji#%6<>1^zpx$ekvrUWgflZyJD!#d4n-eNC@k&kh z#cMV6^R!G1f`gB*G$;SOnfw(N7SDIo_Wtbi)l%!KWQZm7{dF5wN2T{`X&M=Q8Vmh= zJi@C!2$bplpcccVNN#3bXpIc7ER+7%1PTqsEIY5dOnQ2&^AdHPpCqiEd}=0iuOXWy zdcPvxF#XWak-PNdRV>V$IAx(^ji2yslG+G%f7xs-7D6h4x1d}jHO9|>DXP&4ErkUP zxP0jvCkMJsaPy14Ol-=&mmvtaI|#Y^9CF7YA`i96Li0?@TqZt3yR*9@I5!cV5LGo{ zBL2x(WpANyg`RU~bVKo5oO16`#tN`F;Gssu%wFOg+gBZj`!YwobK@5{x*!|LPU9Y^ ztYv}P{wsPT`uuMf<0;)2krYi%(}?&Nl6cf3Vr*iQRIy@%$t9}hkEhGJ+S0|J{THj* zKTJXCox^u4w;Q~M90kR78x{j<)JzPDG1m08`WJ6EWaGe45{>hmi z`qg`M6GZ%jPC?3#FDAMNI&`(?)#fY<2PbLEYe=orY|rxm@4};v2+LC!a!YU(JGE0`-VK@7ehhQ4dPGx>x7NwUyeTb@(4iV z=cLQ*vI_0-34v?dp z+ZFAHf9twnkTg-gq7S|qrZE#7miE)qsS6wnCiUL6;l>%qePh}HW5Hc-eJfFn@J{vv zmG@B__Tl3Aa_QHdTPzh)Lm7%e9bL~^s7kcHl-SYFA5)P+4X&{V4lGSV5t!rtMThUJ z<|xv(w6;a-)xKbHEjfNAhm*qmJ@4L?NHK6Jf-XSLg&0f=`TOO~6+%54fiM==Pw!UB z5UQAOv(nVQG4(>oCu;+5d)t5KOE1ztVq(%&EW!yDdTbA!37u!3HTYZQcQwE(oI*#H zkjKLc`r9kPEo}tXU3aPjCu;q;bh6Y92h4@9aP=eLDIX|SWFiAiBB;;_nwSRq%eo&$ zm}gGDnAZsw!s=1$sqK?p1dCKrJS}a_1=se$7u%a%nw?d@(7*N#>i;=M<50#lr8+EE z9YlgD;r`_iYviHRWxSnpljK(FQ>$TiEyY;D87s*v@|I$#dc$4UMBIdk zJz=?y^AOUwx&M!g@^^pfPIi4=1g_!35JRZ0nUUlmY?;$(>t>6tx)vmzZ;xI(pM-HJ}EbBI3_vK z%V7@J>u4$INW0`bZ51WaSD`3?+{}6cYSw>svMhQ%7D~#FD+c#}xfICMzpFGfY}qR_ zY(dzzZmx4otAAI%cN`~4HnqtMJ?`}JLiL|1H~!!!_;YxLC8W73^i`QEkdjHsoOXQB z&xIu-tSjVbVr<-|Q(ciZd{L_1{9(qxpgc_{LYs|K-zt`C>cUZ(eTdNU;nu+3uT7@H zxac>Kwu3hNn_ZSvN+9WkBRXX^<67TfP3?#CJ!&N9AS1J$(sg1+mI*5&RMX+Z2Sx&= z&ATF9B{*BPINpT)ypp$SfZgf$JVr8mZL<7ki|NmWeR8>{R+h5_Rip!j5hJ8d{7!N? z)xDO4>;%f)l-~?GLK3C6qjG&{!n$*3Q)MDiV#Qi;ls>CF9<<@gyq;H|HHLeLn;r>C zKZxN7q5HYetJ98Zbco?*4GkYgRG zHIXyoQr2o4aupLatxF?-qzT>7ys5xrn!jO5y9HziBIHR|ih^3cYr%m$r1cIrV<- zYwV~(yy&V7uI=wX-jKS`i)Oz&U1d2tT*OPRKEe}J@C#MV4?q!Sd0Qp=`-ru?nz%aL zyCWqIQ+C|(1l50d+!{)9i_x-BWYW)+{YLV*4z|zh%kI~r^F9Nl_W7c?!ug727ju^o zzJP2T>7v&cODdid+-%PCfz9(IrS6zR-*@>3r|od8F=O@+Uc$qDS;O0i5$+7-cK@ z&P_rmqUsw|e(}I^S^|R%0mCobt>&F*YVa%K82gy#xEe$P8lgI2I)p{~ z+@Nym&}biXBs?ntLs>}zbp1;{t2USsr2Xl0`@|?8Ll)7I>c{T^Cki3+-QfX$Em`Fb z=7>sH@UQX}42+_B7uV|7U4IoTdmHZmqE@H0(IT}mgJ#2=V0b=sysf+_vZ2lj2`GD7 zI}Xu#XGb>NrIZnU*(>}9&fWBs8IEyVOaf>kBh5X?eZe+Yd zU{KAX)2UXF(I-Z_#7n+Kqnxk4pB#U1^t$^bW1WV#X3(W`lV;;G(cVd$UP=Y?K^aKI z39w)P2!bk|N~E>gzA9i_ZRjeZo5myk%8zilm4jn5eyPsX6gK#XR5vQDqw9N~&CPc9 zQu<&sa&jinHIWw~-GjxtbP^t093E`(`^wPM&0r}6RKVn0Jq zEA!7j)yc=T`=b#5p^V3Ev-mqxE-m^p7sF-#o@nuDy6WqgxbN0z;bU;pqm{M0y~*D4 z&+CIDbL7L0!xi|?q|m<+ULQ^vG4@u@qqFt9DmmQdd&YGAw2vRD^3O&_kZW`B3fW1q zmwmRNhYy5nBi^pd6J>5)XL~*u4vcbl_m*gD&@CSxnE z&h2f7iD7&jP5^A0_RwJPFkYB*M-e3Lza4kx4g6pEq;GUPPBOi-e^5lm$M(V#ybdwAv7?0vU-me zb9&89$|sumD_=Fj{44jk9+ z)AAzXsC7CTZ0p)4@vO5-dQGgtOtIa?Y*1CR2PStvaomamqP_1yc>qVe`r+qRvB%uX zqkyp%6Bs{dfTKIoEnb-+K6VLReSxgE79&s0oTRYU@||yc%phdr-_C=-?ho-)C`>s znKgS*rvktEBR;9vaEQ}|g~nV-Zu!)aQOs#bJXRs%V@gYEB`n0?_j1N`RGvg6E7t^p z$MB0Roe>VS6r2zpsj@+UuqVC?wGb%B?qh*6QPJ4_{dO7rC9q&ki5bPR%*8LqOE zKJF9z>eeZ$PiDE^h{t?C;WDBWUP$;olQmduz+wv)yM}uvd)7iIN=yFL?szrtV*ZAJ zvAf=p&@IV$?QB3$vv*&VM|?gk@;pX2@XfBg^jGbkH^xM~{XQQRJbu!hI93b`&wWYS zjyS1a&_k`XTz|aVBvtDGsch`A7{i^=m*fn$yEEg2{>yas+Q6+r92vy7c#V0zN&@)! zBTZQ9_>{qvpXf`VlMLmXx8eDHaV4@&HOhA(El%DorVdgthG~&BLlcGJZn^bWWBlat z?> z@uku{|Gf&2S#j?ZmDVYdke(AF4H;}&FU4O@XhoWl70b4~W49j7DywszNv$2z;m5XO zFjsOa^}Kl3`$b83!n!0BK_rMp1@=U)zd8(G<`E5d%Dkbz`?F7ZUoALURke&%&OBM~ zY3%>hd0Qj>0vh?rlHNT{YA%}IBlSDJb^dTUe<_EY42r^R9(rft173n>f^1i&4wBje z8aHkUcYnH#h67jKyt`J2ouE<1G^=-1k%a0&K9cwz5wU&Z#3B<}^q&tuw_Lwj@OdZI zZu>EKE95dNy?@g!OcI|YU({v^(Zp4jSLUY8bSm-_-h}G6qWdMGk&39>i(FI{p`A~|jd(Rc1s z2U)kf!F6LK>$fqp&&udLhIBn7wDf*Zrm(?qb0r&l{eYy6ogezao1J z*x&!8I7Qp=o6?6{bxXlq;7-^1>Y6!t@3t-zAyYkGdT*B=tCY|7sCNX}OzRkn(j;;2 z<5!h`L6RVghPxIc!S6<#=u7*BCoQDiOO~RB<3aSC2czN7pQ-q<4?DfU6t7H9_cvZSoU$kMpCalPk@Q2CiBA2`0vV zi9bB_^Hm1>P#gT`%E%@2(9PC{VQS7#SH&{C_3vYxm-a~JU9T*8@9RzX`2^c>cd6tl zwGO69+%u#5Ne+Tj623^`Ql^tEbXUj_;pT9Z>6N>xxTe{R{)|&)Phf1)EJKdRd&zPj zvMFvnTNYl=51U`GG+r#ApM6=8aWc@XmyP8Ct!1ye#hdFw)-6?4z|K9O^BLVzE5=dW zt4_}?F|GaE$+EHJYseW&D z(y1V>lz+(>r zG*AxbH65zHXTuizs}rC2-nESoyfr?iSWCy7mBq<9fGSEM7WA4|ll_4!o~>(~MK zro6b0XO;NqMi70Zg?EPfJ~=)|l5cXjiRSeFeik46fPvt9$g^aW(UIAm-0}86%$x?v zfre#tY5siqSb;WJ#lxGRk!SCLJ;1C71A3->h{u}y+wl-H5`)x*S+ko{1C=eeui;MG zCc;sf;ySn&E>x=PvN(q84V&jI5}*Bb=7c8e*OpwqAI=TQKRok|zN;kZsRofLvd{W{ zgqgOg=^GZO9T$f$Z^KVu;VQq*#K_!_`x}0Xc@(d*GqmojM8qyE$EoOT^Y_ejL>Bth zXQ-9^*9PPE_&oHBp5W;qz)i&2ov*X?j+yeaq>ng%tF_PAibv~YZ=lsjN^;Eg51S^%*K$C{8LA$w0S3!0O0fFtW0Av>U$Y#jy?ARJz!uHaxN6&$&zM zTi)8henBuT7~-G z0KW}im?*R?Z=jYa+Np1;U>w#98rnF8$}f!n8vH3I)v~`W7Dr36V!lrHh~k<=!PYh#03o zyJQuVgTsVql5a$RD4Nwmq_#3wm^v&x#+M1?u6LsvYO(27`m;!cCuewip`9gH;cr@( zvUZGJ^CCk5-TA{ee}7Mc8*&8b%$YU+whj_U{UBwnfl=iBHf4NL^iwHgeevbBB@e@3 zx1}nbEE$zJ(R`iVg=|`w7<>y4cF+tW-SlF1q!T7-laAbts5P3_DW72Q#aP#4HGy^Z zA$rtz{m*YlEO&9M-(Wc|ctTG*920gU$>r}VFv2!gU=Nn8q`sLzp<5XV87D%`4C81u zFUfg1U+dS=$^UHo7GpB|9jOaRDC^LG1W)k3Ew4*!t<$(zZha3XvmJw7&tXYFRQ0>a zhII0pI>uLeV==FyMyfcn(3fC%S$8dBKl$~ zlYds@tkMw#2w5e8kc<3V&Wm?DsB5v<@5ReTjz6@9Q(DFsRojX~8>k|~U8u1FT9|n? zROFU6d&%qGZ8Q|LD^9&%rF^r+aHmJ(Ui0Acrr*-t`eq{iNpksN>vO{=GU4UMkL|YY z^p>lTHcc;NWIi!|yKWKaXpp2Z4eF)oVf|LW+^2|li}Twy8G$Kb8CeOU-P734>L)4cc@u1W(oN~@^fEMpcHM2DYLZ)z0%KX%OR2c0s=psy7sF@!7S6q=0Q+2F@l?p_$v zH&)|}@mAv2$$Vu6zt{>EJ%1;Sq+FFLR4&7iHBqPiWxdnADKc0xw|&gQd@{7Uw4?A0 znX|s^s3|kP!#~Fqs<6)&&p?GrD3dsBB1@P@HpNG5KU~@WhYcFIQOg>-qMn@#{_CTG zPeUb_&`+bgQ&%HK?=iKK3>niDd`c34~ z5(3^AJU22r@_J-NZG-yS{NS@K8PTq_wsCplfZOX5mHoCbXu^;i4=gbv;mu8)E2~z; zA|_jw=os~YwSYy?+6NJ9l=kY`5~9SEbDhy0lg5)<80ec#V4Ks?2)m;#JLe61B>imjPt3V{RnBf$?_lNu*|6 z9ZL=nQt)`a?}dBlg~XUWO*Zl)J;1=+#7`xjEtH8^i@sfHK)l@?j`3=3fG<&-l`kru zuk79+yu;Z1ggGH4Tlm9Y!>GxlHgYBWKcj+?gkB}RG0;zj-xcDU33x(>W_j|_eeEvc~PWe9ihf3;l=GN)`p)3TMYKT)o28gFw zCGhS{R8|WflXa&itBEp(l}VqpDkgZ;l-I<(O(2Il?^NQ(v|Ms2$YfK$K~%EFU5Gg< z^(yoH$u74~vNYTOXMA8;FlO=gFk*#SK*%S4w-jT+V4d1(ujgPW7n6^Vk6iA2;DRg3 zB{FJis#xi%N!_g6pD0yDC)4YIg7f?olr!FnF4R7i zX~z{7DR=Td@0@Eb=0D6%4GN)H-oJy0wkV0eS8klK^~??%-q2c6d0d_(@cqRQMYQFR zJhVEASFLj03eR+s*jqonxsSUS9LUWxPZ=eG+A2$I#Y`R**UmJ>LvKvA_inKd#LDa! zO)p}3g+wSXrB||_Mn-ws!)5hS2mYL0%pe5b1`;hUI+y9e`QUy;a+VFw+85oHrjDdH zTNf!Q_dEFfnb@~7$H(?YAv~F;3{{XjUnXa5TVRg)h(1_lSx+ASUDD_80;vPD%mI5; zP|>~#4O3`QRRuNaG^@+q7q8t3tevO5BVxNQty0sq9sk!OJy21cZ2TH+N?DPB0PH_( zQfS-Gs~!=X{q9YKuj67hM{E|a9$EkJ&<(VC6Uj@4<`E0LvHd2vhhi3PSZ$PE{z31> zk~G0eDV4>9`1Tj7?isOGE>A0e!>MF)K`3{LH9R~!)iTQ<$);NuEd`eew*x`ahw8uN{fC-cGo)5%;jgM(#x-)cjrN<&MB7D zn92>98T!82ueMGdb=uAJ%&;!Ek>w;SC`roanw{gUh6b1JO&C=Dy)7r<=$=-q$9y~o4ydTXM20TdBll&hw zf~Bk5`+pV3z#=My7`6nsK!s2Xl1hOzHI{#9C|2g4)}Hpx*8fuN>_DZo?mtR+D|?TB z>q`J7GzdLxC*XnxA%!IaBG4c#u-QO08iWg$5?DclFu=wDi0BYTSapCM9h77Mb#w?V zEH3~-2btl(XLJZ1EFRE~4xxcn0G6LAjsOA%Xwwy7!2l~U0Ywau84p07D+_=$46ykn z(D^>H07Fa&8AV7T0*rmxi+?(fWNYo|>gM@x z-(LWU&qOnz90dEQJ&BFMFEDeK!$`dD&g82fI;f1ZeG@9gFZdCnCsbBq7>T@5(LhA_h(02DY7CRi%q z6%HuX0ggDJNqry=2lN>VP>KVgBx`ty0%OnfkF7rl4j!&9|8{O0SjB#Eq`YCYS zpcgQn^<362mabOTkbm9OQwS2m@&AY5VQKE-^8X1+%^)EQ;hFFU*~!(`*51YT|3AbG z7eWF%2E50GP?GoZpu*VyB>9Jl=wj^&`R{mQfofa`72Ja+Fo6puDLSx+3!xCkH3#|c z{?m74H*?Sb4QqHQs5_SV#}<;Cy``hmeo6Y z$bZrR(cR11>%VkIpz4`d1q^{e)mIGiIvM`4ivqC*nI4|ck^Uz$LIHSuFid&?2R?)Y zwiwXI2O}v9K=Hv0Hvn?*!6=ge-S}V-uz(GGa4viVPzk`auK>6RzyJ*aIs~B340ulf z>SBQ}1YmP~pywF^fE@yGxj+E$2|;ETAW8@_`2Z6_FgqdvUqT2e#p*UXj6ELqe}?Q~ z=jCbd^ly;PfNDZ;3~zy95J*KOFktL$x&I-;dwBep^%Zz}X1xK(h`{vL07O7|IWq~8 z1OLy-p5_o6`~UAr9STes`+58SIK$K0+3kOoJU}85=;jlkf(Yy*CooI|A=Tf#2U~a{ z{$C4MM{5`R5C8SFDI6AzJu>}2N_0<%xuvzUxs#LYf3v`b5!7>&{-a0oeDC(3MEYle zOaml{!LFwP`oy5G7l04X00Vp`2EEh@v=c+yg;QWC=GSCVEP)r7PX$%-515FnJ$7Enm zOaOS~;PbEmNpdi@=78-pI05nGAf*-fP7V$Q1DGL)u*0eWuoR#bWPpVN?57!^K>?b^ z1wMk6aM##C9tGHf8u&p0;e(9=?kT{>uK;Y6AQc~YO9|?*03S*)nUsJm5J-*#abfJ6 z|1&e;yuAKRmQrAz5?mm-fGbKcaBB^ORN#OSMZvpaLjiGW2ostxc$*$60eIu$OTd{L z{PckbLa8AyV6lNZYH;zk0%kyvZiRt05(2NHs)DsJb^73J&gJ&r3S2$^dC|bYdxMwf ziTs9vfjsN~nQ#9?0QJ>_fB+3>%^A>sh5*2e1|kW50@Xc(8F29oD1ZPh2qu8nGrR-p zXdx1CaZA9(vnT}!(18#Gcs+w6Q1=X9fQx6y0|e+nAO^hX!4@3bK;5&509-ta1>=AK z11PouUe90#)ICEMaKQj7lb-+qMo?r0yq=*GsCx!o;DQlU`pp9ZOdvMh0$xmDwH#3Q z41B=FGdKbQ%%C!V2=IEwr8A(88LZ9(E}nrH5MTkp4e)vfeV~p70J8!AUR}D`Bt}X+v-%05LlR z6I_`X*}+J00ou^_}@UnxB@wSa6|wjCxi+Otj2qR^IQN`P6#=oCydjJ1;CjTq6{=}LLfAOqA2Zd zG7y^PX!c6Ogb-8P_6$#XrljPNhNpaF>l42QMJ@<0Hk4DXsLS}YGyV$_b$-0|AuDjE zP^PGkOKC7X*LbPcJ;9BMgvu7C5O#$L3k!<~gAfFsMb7-bHxU-EokTi+4DNHyO_M4Y z=4z(sevTnt$GcT}o~qA*-r;Qz!2akVCB>JVM(r+)yE&3tqj$JV z*fxAZ4N&(l&4%g?n1!k$)?0TvWV5E~8QM<;1r?U9$r-N5Ns=)$kel@Rm*$c;BiJc? zDQhNJ2iWa4kr69qYfZf}-6&#Si7#Ly0>A11+z`O|&fht~)rn_|lKukgk;R8f01y=v z&56FaK~Fz4^8Yf!*fql{Z>jR*WXGPLwMw4a{1U25URA>>5K~Y~%RehC)gO}DSGxA{ z#B7dRkV|e?G7F(upT6G0(#L{v?Qr3N2Ed{iJWiooykr5Y}s_R`mO>BhynI9m^Le||F$lX@r{ z4O2qVez8NGwxJmdLKh6tw(12Y_EQ%fp;u2PB;Ws({wXuy&EpOF*7)ApVL=k9vt57Z z%e159o%fF>q_RT6aYGbX1UJ;_5iJX)ad*a}>=e=OBA6TDah4}@u?-bwZ?JM-Wp)dx zx*H(~i7e3bn55@9zX;Qq70X9l{$VyX{p-3yXiG+sr9>k5@98Bug<>j(Nt^cU3O0g~ zA#%m+fF!M-BL1{8%HM?(_@&BfU!o-2A+}`~rL; z4faxyQGC?@%7By>M3Tl%F~7VaV{B|xd?ksZ1=X6mPcIdaJbb~aItp!nm zrrCK)QEm%x_j)q=VW@YJZS#MqJ<&2^7Q9dq{M!t`nQ_Z9>fo@~`wFk!emLF`lN$Wv zNANH*kBF7XYT)z>DNCH!9rdz3(dlS!_iXJm@BP+STy*^sMGdTI_@QX4w(=A?g|C&X z3d3o=wR5ip;VU64F*4;JqnJ3ThBEbXpeChn;-b&KZok8@ep12-4mK$+e3HTV(JxU_ zoKGlEfhb3rJmFRx)`Ydtz&dcwg}D`J+U^v|vw0ioGR3dWufT{f$f&*2B;kRK{}{&t ze8$iqfHQ1$IrUo`r>V3F{XsQb+`}U2Nz*nYvS@FWEH!l~^C?5BrJSPnx3YAX5Y*^c z-`hbxL(?*M3T^FTQHM4$(dlQfd*i3Kk_xY(HS_u;s)$B&m-ZPIa(YVUyhhkT8NQEr zUEklQ7Bju^Qfn0}pvx=Dyq-N;{`J-o4J(j~&Cj{pQc&Bq@?hzLMq1|&&uwpNvDmNc zI}d0QeP8Fol>4>Drj~_;>jYo9=o0kZVT{*J?58BU>&pkPo%#~%-wp~6ILxJ$iP#^Z z8J0*7H_PdY2Q@XJD{>LB)l8p^tz=WB5<15H^m15DO8h7#wXKpr`Y>jRUxryl^AH*K ze;S}V3Phw@_SvIeV?x|cq=VZy+~mVlI$3r_{gy~?nam)2Ss3TaXk)i#D5Qw`OS1&L I85w;2Kix}l#sB~S From 217eec6e1e64b164c93f239675f9ae8c5dd9ac2d Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Thu, 12 Dec 2024 09:41:07 +0000 Subject: [PATCH 070/183] IDF release/v5.3 083aad99 --- package/package_esp32_index.template.json | 68 +++++++++++------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 63bb102549b..5051c3b01a6 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -42,7 +42,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.3-083aad99-v1" + "version": "idf-release_v5.3-083aad99-v2" }, { "packager": "esp32", @@ -95,63 +95,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.3-083aad99-v1", + "version": "idf-release_v5.3-083aad99-v2", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", - "size": "341111216" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", + "size": "341175680" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", - "size": "341111216" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", + "size": "341175680" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", - "size": "341111216" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", + "size": "341175680" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", - "size": "341111216" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", + "size": "341175680" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", - "size": "341111216" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", + "size": "341175680" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", - "size": "341111216" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", + "size": "341175680" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", - "size": "341111216" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", + "size": "341175680" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v1.zip", - "checksum": "SHA-256:5aabafdd3bdc2cfc4a409efc00202aee4d8b1bcb1efaf5021c02ac2e90473603", - "size": "341111216" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", + "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", + "size": "341175680" } ] }, From 3bf8f23e487676ec3af812004bb4be634afe01c8 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Thu, 12 Dec 2024 10:03:45 -0300 Subject: [PATCH 071/183] fix(matter): removed commentary that has no code related --- .../examples/MatterOccupancySensor/MatterOccupancySensor.ino | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino b/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino index 5b4baf23442..7582a423dc0 100644 --- a/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino +++ b/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino @@ -48,7 +48,6 @@ const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s void setup() { // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node - // The button will also be used to manually toggle the Occupancy Sensor state pinMode(buttonPin, INPUT_PULLUP); Serial.begin(115200); From 4cf0f20129fd192935691a59cf24c3e065fb5a19 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 13:43:48 +0000 Subject: [PATCH 072/183] ci(pre-commit): Apply automatic fixes --- .../Matter/src/MatterEndpoints/MatterOccupancySensor.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp index 9efa984431a..2477038bf28 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp @@ -24,10 +24,8 @@ using namespace esp_matter::endpoint; using namespace chip::app::Clusters; const uint8_t MatterOccupancySensor::occupancySensorTypeBitmap[4] = { - MatterOccupancySensor::occupancySensorTypePir, - MatterOccupancySensor::occupancySensorTypePir | MatterOccupancySensor::occupancySensorTypeUltrasonic, - MatterOccupancySensor::occupancySensorTypeUltrasonic, - MatterOccupancySensor::occupancySensorTypePhysicalContact + MatterOccupancySensor::occupancySensorTypePir, MatterOccupancySensor::occupancySensorTypePir | MatterOccupancySensor::occupancySensorTypeUltrasonic, + MatterOccupancySensor::occupancySensorTypeUltrasonic, MatterOccupancySensor::occupancySensorTypePhysicalContact }; bool MatterOccupancySensor::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { From 77df256f5db51c139715cc73927dccd38d652cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 12 Dec 2024 15:07:31 +0100 Subject: [PATCH 073/183] feat(zigbee): Add pressure, flow and occupancy sensor --- .../Zigbee_Occupancy_Sensor/README.md | 57 ++++++++ .../Zigbee_Occupancy_Sensor.ino | 104 ++++++++++++++ .../examples/Zigbee_Occupancy_Sensor/ci.json | 6 + .../Zigbee_Pressure_Flow_Sensor/README.md | 72 ++++++++++ .../Zigbee_Pressure_Flow_Sensor.ino | 134 ++++++++++++++++++ .../Zigbee_Pressure_Flow_Sensor/ci.json | 6 + .../Zigbee_Temp_Hum_Sensor_Sleepy/README.md | 2 +- .../Zigbee_Temp_Hum_Sensor_Sleepy.ino | 7 +- .../Zigbee_Temperature_Sensor/README.md | 2 +- .../Zigbee_Temperature_Sensor.ino | 4 +- libraries/Zigbee/src/Zigbee.h | 3 + libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp | 105 ++++++++++++++ libraries/Zigbee/src/ep/ZigbeeFlowSensor.h | 58 ++++++++ .../Zigbee/src/ep/ZigbeeOccupancySensor.cpp | 63 ++++++++ .../Zigbee/src/ep/ZigbeeOccupancySensor.h | 52 +++++++ .../Zigbee/src/ep/ZigbeePressureSensor.cpp | 101 +++++++++++++ .../Zigbee/src/ep/ZigbeePressureSensor.h | 58 ++++++++ libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp | 9 ++ libraries/Zigbee/src/ep/ZigbeeTempSensor.h | 8 ++ 19 files changed, 844 insertions(+), 7 deletions(-) create mode 100644 libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/Zigbee_Occupancy_Sensor.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/ci.json create mode 100644 libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeFlowSensor.h create mode 100644 libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h create mode 100644 libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeePressureSensor.h diff --git a/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/README.md new file mode 100644 index 00000000000..0e668775f5c --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/README.md @@ -0,0 +1,57 @@ +# Arduino-ESP32 Zigbee Occupancy Sensor Example + +This example shows how to configure the Zigbee end device and use it as a Home Automation (HA) occupancy sensor (PIR). + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## Hardware Required + +* A USB cable for power supply and programming + +### Configure the Project + +Set the Button GPIO by changing the `button` variable. By default, it's the pin `BOOT_PIN` (BOOT button on ESP32-C6 and ESP32-H2). +Set the Sensor GPIO by changing the `sensor_pin` variable. + +#### Using Arduino IDE + +To get more information about the Espressif boards see [Espressif Development Kits](https://www.espressif.com/en/products/devkits). + +* Before Compile/Verify, select the correct board: `Tools -> Board`. +* Select the End device Zigbee mode: `Tools -> Zigbee mode: Zigbee ED (end device)` +* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee 4MB with spiffs` +* Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. +* Optional: Set debug level to verbose to see all logs from Zigbee stack: `Tools -> Core Debug Level: Verbose`. + +## Troubleshooting + +If the End device flashed with this example is not connecting to the coordinator, erase the flash of the End device before flashing the example to the board. + +***Important: Make sure you are using a good quality USB cable and that you have a reliable power source*** + +* **LED not blinking:** Check the wiring connection and the IO selection. +* **Programming Fail:** If the programming/flash procedure fails, try reducing the serial connection speed. +* **COM port not detected:** Check the USB cable and the USB to Serial driver installation. + +If the error persists, you can ask for help at the official [ESP32 forum](https://esp32.com) or see [Contribute](#contribute). + +## Contribute + +To know how to contribute to this project, see [How to contribute.](https://github.com/espressif/arduino-esp32/blob/master/CONTRIBUTING.rst) + +If you have any **feedback** or **issue** to report on this example/library, please open an issue or fix it by creating a new PR. Contributions are more than welcome! + +Before creating a new issue, be sure to try Troubleshooting and check if the same issue was already created by someone else. + +## Resources + +* Official ESP32 Forum: [Link](https://esp32.com) +* Arduino-ESP32 Official Repository: [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) +* ESP32-C6 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf) +* ESP32-H2 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf) +* Official ESP-IDF documentation: [ESP-IDF](https://idf.espressif.com) diff --git a/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/Zigbee_Occupancy_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/Zigbee_Occupancy_Sensor.ino new file mode 100644 index 00000000000..b1cb53eb33d --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/Zigbee_Occupancy_Sensor.ino @@ -0,0 +1,104 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @brief This example demonstrates Zigbee occupancy sensor. + * + * The example demonstrates how to use Zigbee library to create a end device occupancy sensor. + * The occupancy sensor is a Zigbee end device, which is reporting data to the Zigbee network. + * Tested with PIR sensor HC-SR501 connected to GPIO4. + * + * Proper Zigbee mode must be selected in Tools->Zigbee mode + * and also the correct partition scheme must be selected in Tools->Partition Scheme. + * + * Please check the README.md for instructions and more detailed description. + * + * Created by Jan Procházka (https://github.com/P-R-O-C-H-Y/) + */ + +#ifndef ZIGBEE_MODE_ED +#error "Zigbee end device mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +/* Zigbee occupancy sensor configuration */ +#define OCCUPANCY_SENSOR_ENDPOINT_NUMBER 10 +uint8_t button = BOOT_PIN; +uint8_t sensor_pin = 4; + +ZigbeeOccupancySensor zbOccupancySensor = ZigbeeOccupancySensor(OCCUPANCY_SENSOR_ENDPOINT_NUMBER); + +/********************* Arduino functions **************************/ +void setup() { + Serial.begin(115200); + + // Init button + PIR sensor + pinMode(button, INPUT_PULLUP); + pinMode(sensor_pin, INPUT); + + // Optional: set Zigbee device name and model + zbOccupancySensor.setManufacturerAndModel("Espressif", "ZigbeeOccupancyPIRSensor"); + + // Add endpoint to Zigbee Core + Zigbee.addEndpoint(&zbOccupancySensor); + + Serial.println("Starting Zigbee..."); + // When all EPs are registered, start Zigbee in End Device mode + if (!Zigbee.begin()) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } else { + Serial.println("Zigbee started successfully!"); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) { + Serial.print("."); + delay(100); + } + Serial.println(); +} + +void loop() { + // Checking PIR sensor for occupancy change + static bool occupancy = false; + if(digitalRead(sensor_pin) == HIGH && !occupancy) { + // Update occupancy sensor value + zbOccupancySensor.setOccupancy(true); + zbOccupancySensor.report(); + occupancy = true; + } else if (digitalRead(sensor_pin) == LOW && occupancy) { + zbOccupancySensor.setOccupancy(false); + zbOccupancySensor.report(); + occupancy = false; + } + + // Checking button for factory reset + if (digitalRead(button) == LOW) { // Push button pressed + // Key debounce handling + delay(100); + int startTime = millis(); + while (digitalRead(button) == LOW) { + delay(50); + if ((millis() - startTime) > 3000) { + // If key pressed for more than 3secs, factory reset Zigbee and reboot + Serial.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); + Zigbee.factoryReset(); + } + } + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/ci.json new file mode 100644 index 00000000000..7b7ccef8ed7 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y" + ] +} diff --git a/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/README.md new file mode 100644 index 00000000000..964c7503027 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/README.md @@ -0,0 +1,72 @@ +# Arduino-ESP32 Zigbee Pressure + Flow Sensor Example + +This example shows how to configure the Zigbee end device and use it as a Home Automation (HA) simple sensor device type with pressure and flow measuring. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## Pressure + Flow Sensor Functions + + * After this board first starts up, it would be configured locally to report the pressure and flow on change or every 30 seconds. + * By clicking the button (BOOT) on this board, this board will immediately send a report of the current measured flow and pressure to the network. + +## Hardware Required + +* A USB cable for power supply and programming + +### Configure the Project + +In this example, the internal temperature sensor is used to demonstrate reading of the flow and pressure sensors. +Set the Button GPIO by changing the `button` variable. By default, it's the pin `BOOT_PIN` (BOOT button on ESP32-C6 and ESP32-H2). + +#### Using Arduino IDE + +To get more information about the Espressif boards see [Espressif Development Kits](https://www.espressif.com/en/products/devkits). + +* Before Compile/Verify, select the correct board: `Tools -> Board`. +* Select the End device Zigbee mode: `Tools -> Zigbee mode: Zigbee ED (end device)` +* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee 4MB with spiffs` +* Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. +* Optional: Set debug level to verbose to see all logs from Zigbee stack: `Tools -> Core Debug Level: Verbose`. + +## Troubleshooting + +If the End device flashed with this example is not connecting to the coordinator, erase the flash of the End device before flashing the example to the board. It is recommended to do this if you re-flash the coordinator. +You can do the following: + +* In the Arduino IDE go to the Tools menu and set `Erase All Flash Before Sketch Upload` to `Enabled`. +* Add to the sketch `Zigbee.factoryReset();` to reset the device and Zigbee stack. + +By default, the coordinator network is closed after rebooting or flashing new firmware. +To open the network you have 2 options: + +* Open network after reboot by setting `Zigbee.setRebootOpenNetwork(time);` before calling `Zigbee.begin();`. +* In application you can anytime call `Zigbee.openNetwork(time);` to open the network for devices to join. + +***Important: Make sure you are using a good quality USB cable and that you have a reliable power source*** + +* **LED not blinking:** Check the wiring connection and the IO selection. +* **Programming Fail:** If the programming/flash procedure fails, try reducing the serial connection speed. +* **COM port not detected:** Check the USB cable and the USB to Serial driver installation. + +If the error persists, you can ask for help at the official [ESP32 forum](https://esp32.com) or see [Contribute](#contribute). + +## Contribute + +To know how to contribute to this project, see [How to contribute.](https://github.com/espressif/arduino-esp32/blob/master/CONTRIBUTING.rst) + +If you have any **feedback** or **issue** to report on this example/library, please open an issue or fix it by creating a new PR. Contributions are more than welcome! + +Before creating a new issue, be sure to try Troubleshooting and check if the same issue was already created by someone else. + +## Resources + +* Official ESP32 Forum: [Link](https://esp32.com) +* Arduino-ESP32 Official Repository: [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) +* ESP32-C6 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf) +* ESP32-H2 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf) +* Official ESP-IDF documentation: [ESP-IDF](https://idf.espressif.com) diff --git a/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino new file mode 100644 index 00000000000..889ae21dcb4 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino @@ -0,0 +1,134 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @brief This example demonstrates Zigbee temperature sensor. + * + * The example demonstrates how to use Zigbee library to create a end device temperature sensor. + * The temperature sensor is a Zigbee end device, which is controlled by a Zigbee coordinator. + * + * Proper Zigbee mode must be selected in Tools->Zigbee mode + * and also the correct partition scheme must be selected in Tools->Partition Scheme. + * + * Please check the README.md for instructions and more detailed description. + * + * Created by Jan Procházka (https://github.com/P-R-O-C-H-Y/) + */ + +#ifndef ZIGBEE_MODE_ED +#error "Zigbee end device mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +/* Zigbee flow + pressure sensor configuration */ +#define FLOW_SENSOR_ENDPOINT_NUMBER 10 +#define PRESSURE_SENSOR_ENDPOINT_NUMBER 11 + +uint8_t button = BOOT_PIN; + +ZigbeeFlowSensor zbFlowSensor = ZigbeeFlowSensor(FLOW_SENSOR_ENDPOINT_NUMBER); +ZigbeePressureSensor zbPressureSensor = ZigbeePressureSensor(PRESSURE_SENSOR_ENDPOINT_NUMBER); + +/************************ Temp sensor *****************************/ +static void sensors_reading(void *arg) { + for (;;) { + // Read Pressure and Flow sensors value - here is chip temperature used as a dummy value for demonstration + float flow_value = temperatureRead(); + uint16_t pressure_value = (uint16_t)temperatureRead()*100; //*100 for demonstration so the value is in 1-3hPa + Serial.printf("Updating flow sensor value to %.2f\r\n", flow_value); + zbFlowSensor.setFlow(flow_value); + Serial.printf("Updating pressure sensor value to %.2f\r\n", pressure_value); + zbPressureSensor.setPressure(pressure_value); + delay(1000); + } +} + +/********************* Arduino functions **************************/ +void setup() { + Serial.begin(115200); + + // Init button switch + pinMode(button, INPUT_PULLUP); + + // Optional: set Zigbee device name and model + zbFlowSensor.setManufacturerAndModel("Espressif", "ZigbeeFlowSensor"); + + // Set minimum and maximum temperature measurement value (10-50°C is default range for chip temperature measurement) + zbFlowSensor.setMinMaxValue(0, 100); + + // Set tolerance for temperature measurement in °C (lowest possible value is 0.01°C) + zbFlowSensor.setTolerance(1); + + // Optional: set Zigbee device name and model + zbPressureSensor.setManufacturerAndModel("Espressif", "ZigbeePressureSensor"); + + // Set minimum and maximum temperature measurement value (10-50°C is default range for chip temperature measurement) + zbPressureSensor.setMinMaxValue(0, 30); + + // Set tolerance for temperature measurement in °C (lowest possible value is 0.01°C) + zbPressureSensor.setTolerance(1); + + // Add endpoints to Zigbee Core + Zigbee.addEndpoint(&zbFlowSensor); + Zigbee.addEndpoint(&zbPressureSensor); + + Serial.println("Starting Zigbee..."); + // When all EPs are registered, start Zigbee in End Device mode + if (!Zigbee.begin()) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } else { + Serial.println("Zigbee started successfully!"); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) { + Serial.print("."); + delay(100); + } + Serial.println(); + + // Start Flow and Pressure sensor reading task + xTaskCreate(sensors_reading, "flow_pressure_sensors_read", 2048, NULL, 10, NULL); + + // Set reporting interval for flow and pressure measurement in seconds, must be called after Zigbee.begin() + // min_interval and max_interval in seconds, delta (pressure change in Pa, flow change in 0,1 m3/h) + // if min = 1 and max = 0, reporting is sent only when temperature changes by delta + // if min = 0 and max = 10, reporting is sent every 10 seconds or temperature changes by delta + // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of delta change + zbFlowSensor.setReporting(0, 30, 1); + zbPressureSensor.setReporting(0, 30, 1); +} + +void loop() { + // Checking button for factory reset + if (digitalRead(button) == LOW) { // Push button pressed + // Key debounce handling + delay(100); + int startTime = millis(); + while (digitalRead(button) == LOW) { + delay(50); + if ((millis() - startTime) > 3000) { + // If key pressed for more than 3secs, factory reset Zigbee and reboot + Serial.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); + Zigbee.factoryReset(); + } + } + zbFlowSensor.report(); + zbPressureSensor.report(); + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/ci.json new file mode 100644 index 00000000000..7b7ccef8ed7 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y" + ] +} diff --git a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/README.md b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/README.md index d88b01cda3a..afaa12c0bfa 100644 --- a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/README.md +++ b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/README.md @@ -24,7 +24,7 @@ Currently, this example supports the following targets. ### Configure the Project In this example, to demonstrate the functionality the chip temperature is used and reported as temperature and humidity. -Set the Button GPIO by changing the `BUTTON_PIN` definition. By default, it's the pin `9` (BOOT button on ESP32-C6 and ESP32-H2). +Set the Button GPIO by changing the `button` variable. By default, it's the pin `BOOT_PIN` (BOOT button on ESP32-C6 and ESP32-H2). #### Using Arduino IDE diff --git a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino index 2b342161199..60bd784cca9 100644 --- a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino +++ b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino @@ -55,11 +55,12 @@ void meausureAndSleep() { zbTempSensor.setHumidity(humidity); // Report temperature and humidity values - zbTempSensor.reportTemperature(); - zbTempSensor.reportHumidity(); - + zbTempSensor.report(); Serial.printf("Reported temperature: %.2f°C, Humidity: %.2f%%\r\n", temperature, humidity); + // Add small delay to allow the data to be sent before going to sleep + delay(100); + // Put device to deep sleep Serial.println("Going to sleep now"); esp_deep_sleep_start(); diff --git a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/README.md index f3dd9248f87..577bd7c8058 100644 --- a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/README.md +++ b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/README.md @@ -28,7 +28,7 @@ Functions: ### Configure the Project In this example, the internal temperature sensor task is reading the chip temperature. -Set the Button GPIO by changing the `BUTTON_PIN` definition. By default, it's the pin `9` (BOOT button on ESP32-C6 and ESP32-H2). +Set the Button GPIO by changing the `button` variable. By default, it's the pin `BOOT_PIN` (BOOT button on ESP32-C6 and ESP32-H2). #### Using Arduino IDE diff --git a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino index 22b0c6fbeed..27aa2db97bd 100644 --- a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino @@ -63,7 +63,7 @@ void setup() { // Set minimum and maximum temperature measurement value (10-50°C is default range for chip temperature measurement) zbTempSensor.setMinMaxValue(10, 50); - // Set tolerance for temperature measurement in °C (lowest possible value is 0.01°C) + // Optional: Set tolerance for temperature measurement in °C (lowest possible value is 0.01°C) zbTempSensor.setTolerance(1); // Add endpoint to Zigbee Core @@ -89,7 +89,7 @@ void setup() { xTaskCreate(temp_sensor_value_update, "temp_sensor_update", 2048, NULL, 10, NULL); // Set reporting interval for temperature measurement in seconds, must be called after Zigbee.begin() - // min_interval and max_interval in seconds, delta (temp change in °C) + // min_interval and max_interval in seconds, delta (temp change in 0,1 °C) // if min = 1 and max = 0, reporting is sent only when temperature changes by delta // if min = 0 and max = 10, reporting is sent every 10 seconds or temperature changes by delta // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of temperature change diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index 98674a9d115..a1f5dcd7903 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -13,3 +13,6 @@ #include "ep/ZigbeeColorDimmerSwitch.h" #include "ep/ZigbeeTempSensor.h" #include "ep/ZigbeeThermostat.h" +#include "ep/ZigbeePressureSensor.h" +#include "ep/ZigbeeFlowSensor.h" +#include "ep/ZigbeeOccupancySensor.h" diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp new file mode 100644 index 00000000000..17182a56b5b --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp @@ -0,0 +1,105 @@ +#include "ZigbeeFlowSensor.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +esp_zb_cluster_list_t *zigbee_flow_sensor_clusters_create(zigbee_flow_sensor_cfg_t *flow_sensor) +{ + esp_zb_basic_cluster_cfg_t *basic_cfg = flow_sensor ? &(flow_sensor->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = flow_sensor ? &(flow_sensor->identify_cfg) : NULL; + esp_zb_flow_meas_cluster_cfg_t *flow_meas_cfg = flow_sensor ? &(flow_sensor->flow_meas_cfg) : NULL; + esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_flow_meas_cluster(cluster_list, esp_zb_flow_meas_cluster_create(flow_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + return cluster_list; +} + +ZigbeeFlowSensor::ZigbeeFlowSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID; + + //Create custom pressure sensor configuration + zigbee_flow_sensor_cfg_t flow_sensor_cfg = ZIGBEE_DEFAULT_FLOW_SENSOR_CONFIG(); + _cluster_list = zigbee_flow_sensor_clusters_create(&flow_sensor_cfg); + + _ep_config = { + .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0 + }; +} + +void ZigbeeFlowSensor::setMinMaxValue(float min, float max) { + uint16_t zb_min = (uint16_t)(min * 10); + uint16_t zb_max = (uint16_t)(max * 10); + esp_zb_attribute_list_t *flow_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_FLOW_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_update_attr(flow_measure_cluster, ESP_ZB_ZCL_ATTR_FLOW_MEASUREMENT_MIN_VALUE_ID, (void *)&zb_min); + esp_zb_cluster_update_attr(flow_measure_cluster, ESP_ZB_ZCL_ATTR_FLOW_MEASUREMENT_MAX_VALUE_ID, (void *)&zb_max); +} + +void ZigbeeFlowSensor::setTolerance(float tolerance) { + // Convert tolerance to ZCL uint16_t + uint16_t zb_tolerance = (uint16_t)(tolerance * 10); + esp_zb_attribute_list_t *flow_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_FLOW_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_flow_meas_cluster_add_attr(flow_measure_cluster, ESP_ZB_ZCL_ATTR_FLOW_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); +} + +void ZigbeeFlowSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { + esp_zb_zcl_reporting_info_t reporting_info = { + .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, + .ep = _endpoint, + .cluster_id = ESP_ZB_ZCL_CLUSTER_ID_FLOW_MEASUREMENT, + .cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, + .attr_id = ESP_ZB_ZCL_ATTR_FLOW_MEASUREMENT_VALUE_ID, + .u = + { + .send_info = + { + .min_interval = min_interval, + .max_interval = max_interval, + .delta = + { + .u16 = (uint16_t)(delta * 10), // Convert delta to ZCL uint16_t + }, + .def_min_interval = min_interval, + .def_max_interval = max_interval, + }, + }, + .dst = + { + .profile_id = ESP_ZB_AF_HA_PROFILE_ID, + }, + .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, + }; + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_update_reporting_info(&reporting_info); + esp_zb_lock_release(); +} + +void ZigbeeFlowSensor::setFlow(float flow) { + uint16_t zb_flow = (uint16_t)(flow * 10); + log_v("Updating flow sensor value..."); + /* Update temperature sensor measured value */ + log_d("Setting flow to %d", zb_flow); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_FLOW_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_FLOW_MEASUREMENT_VALUE_ID, &zb_flow, false + ); + esp_zb_lock_release(); +} + +void ZigbeeFlowSensor::report() { + /* Send report attributes command */ + esp_zb_zcl_report_attr_cmd_t report_attr_cmd; + report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; + report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_FLOW_MEASUREMENT_VALUE_ID; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; + report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_FLOW_MEASUREMENT; + report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_zb_lock_release(); + log_v("Flow report sent"); +} + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h new file mode 100644 index 00000000000..cfb7d4311ed --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h @@ -0,0 +1,58 @@ +/* Class of Zigbee Flow sensor endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +#define ZIGBEE_DEFAULT_FLOW_SENSOR_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .flow_meas_cfg = \ + { \ + .measured_value = 0, \ + .min_value = 0, \ + .max_value = 0x7FFF, \ + }, \ + } + +typedef struct zigbee_flow_sensor_cfg_s { + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_flow_meas_cluster_cfg_t flow_meas_cfg; +} zigbee_flow_sensor_cfg_t; + +class ZigbeeFlowSensor : public ZigbeeEP { +public: + ZigbeeFlowSensor(uint8_t endpoint); + ~ZigbeeFlowSensor(); + + // Set the flow value in 0,01 m3/h + void setFlow(float value); + + // Set the min and max value for the flow sensor in 0,1 m3/h + void setMinMaxValue(float min, float max); + + // Set the tolerance value for the flow sensor in 0,01 m3/h + void setTolerance(float tolerance); + + // Set the reporting interval for flow measurement in seconds and delta (temp change in 0,01 m3/h) + void setReporting(uint16_t min_interval, uint16_t max_interval, float delta); + + // Report the flow value + void report(); +}; + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp new file mode 100644 index 00000000000..cbc475c8f7e --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp @@ -0,0 +1,63 @@ +#include "ZigbeeOccupancySensor.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +esp_zb_cluster_list_t *zigbee_occupancy_sensor_clusters_create(zigbee_occupancy_sensor_cfg_t *occupancy_sensor) +{ + esp_zb_basic_cluster_cfg_t *basic_cfg = occupancy_sensor ? &(occupancy_sensor->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = occupancy_sensor ? &(occupancy_sensor->identify_cfg) : NULL; + esp_zb_occupancy_sensing_cluster_cfg_t *occupancy_meas_cfg = occupancy_sensor ? &(occupancy_sensor->occupancy_meas_cfg) : NULL; + esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_occupancy_sensing_cluster(cluster_list, esp_zb_occupancy_sensing_cluster_create(occupancy_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + return cluster_list; +} + +ZigbeeOccupancySensor::ZigbeeOccupancySensor(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID; + + //Create custom occupancy sensor configuration + zigbee_occupancy_sensor_cfg_t occupancy_sensor_cfg = ZIGBEE_DEFAULT_OCCUPANCY_SENSOR_CONFIG(); + _cluster_list = zigbee_occupancy_sensor_clusters_create(&occupancy_sensor_cfg); + + _ep_config = { + .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0 + }; +} + +void ZigbeeOccupancySensor::setSensorType(uint8_t sensor_type) { + uint8_t sensor_type_bitmap = 1 << sensor_type; + esp_zb_attribute_list_t *occupancy_sens_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_OCCUPANCY_SENSING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_update_attr(occupancy_sens_cluster, ESP_ZB_ZCL_ATTR_OCCUPANCY_SENSING_OCCUPANCY_SENSOR_TYPE_ID, (void *)&sensor_type); + esp_zb_cluster_update_attr(occupancy_sens_cluster, ESP_ZB_ZCL_ATTR_OCCUPANCY_SENSING_OCCUPANCY_SENSOR_TYPE_BITMAP_ID, (void *)&sensor_type_bitmap); +} + +void ZigbeeOccupancySensor::setOccupancy(bool occupied) { + log_v("Updating occupancy sensor value..."); + /* Update occupancy sensor value */ + log_d("Setting occupancy to %d", occupied); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_OCCUPANCY_SENSING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_OCCUPANCY_SENSING_OCCUPANCY_ID, &occupied, false + ); + esp_zb_lock_release(); +} + +void ZigbeeOccupancySensor::report() { + /* Send report attributes command */ + esp_zb_zcl_report_attr_cmd_t report_attr_cmd; + report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; + report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_OCCUPANCY_SENSING_OCCUPANCY_ID; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; + report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_OCCUPANCY_SENSING; + report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_zb_lock_release(); + log_v("Occupancy report sent"); +} + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h new file mode 100644 index 00000000000..67103d63369 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h @@ -0,0 +1,52 @@ +/* Class of Zigbee Pressure sensor endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +#define ZIGBEE_DEFAULT_OCCUPANCY_SENSOR_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .occupancy_meas_cfg = \ + { \ + .occupancy = ESP_ZB_ZCL_OCCUPANCY_SENSING_OCCUPANCY_UNOCCUPIED, \ + .sensor_type = ESP_ZB_ZCL_OCCUPANCY_SENSING_OCCUPANCY_SENSOR_TYPE_PIR, \ + .sensor_type_bitmap = (1 << ESP_ZB_ZCL_OCCUPANCY_SENSING_OCCUPANCY_SENSOR_TYPE_PIR), \ + }, \ + } + +typedef struct zigbee_occupancy_sensor_cfg_s { + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_occupancy_sensing_cluster_cfg_t occupancy_meas_cfg; +} zigbee_occupancy_sensor_cfg_t; + +class ZigbeeOccupancySensor : public ZigbeeEP { +public: + ZigbeeOccupancySensor(uint8_t endpoint); + ~ZigbeeOccupancySensor(); + + // Set the occupancy value. True for occupied, false for unoccupied + void setOccupancy(bool occupied); + + // Set the sensor type, see esp_zb_zcl_occupancy_sensing_occupancy_sensor_type_t + void setSensorType(uint8_t sensor_type); + + // Report the occupancy value + void report(); +}; + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp new file mode 100644 index 00000000000..a6ccacbd562 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp @@ -0,0 +1,101 @@ +#include "ZigbeePressureSensor.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +esp_zb_cluster_list_t *zigbee_pressure_sensor_clusters_create(zigbee_pressure_sensor_cfg_t *pressure_sensor) +{ + esp_zb_basic_cluster_cfg_t *basic_cfg = pressure_sensor ? &(pressure_sensor->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = pressure_sensor ? &(pressure_sensor->identify_cfg) : NULL; + esp_zb_pressure_meas_cluster_cfg_t *pressure_meas_cfg = pressure_sensor ? &(pressure_sensor->pressure_meas_cfg) : NULL; + esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_pressure_meas_cluster(cluster_list, esp_zb_pressure_meas_cluster_create(pressure_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + return cluster_list; +} + +ZigbeePressureSensor::ZigbeePressureSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID; + + //Create custom pressure sensor configuration + zigbee_pressure_sensor_cfg_t presssure_sensor_cfg = ZIGBEE_DEFAULT_PRESSURE_SENSOR_CONFIG(); + _cluster_list = zigbee_pressure_sensor_clusters_create(&presssure_sensor_cfg); + + _ep_config = { + .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0 + }; +} + +void ZigbeePressureSensor::setMinMaxValue(int16_t min, int16_t max) { + + esp_zb_attribute_list_t *pressure_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_PRESSURE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_update_attr(pressure_measure_cluster, ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_MIN_VALUE_ID, (void *)&min); + esp_zb_cluster_update_attr(pressure_measure_cluster, ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_MAX_VALUE_ID, (void *)&max); +} + +void ZigbeePressureSensor::setTolerance(uint16_t tolerance) { + esp_zb_attribute_list_t *pressure_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_PRESSURE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_temperature_meas_cluster_add_attr(pressure_measure_cluster, ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_TOLERANCE_ID, (void *)&tolerance); +} + +void ZigbeePressureSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) { + esp_zb_zcl_reporting_info_t reporting_info = { + .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, + .ep = _endpoint, + .cluster_id = ESP_ZB_ZCL_CLUSTER_ID_PRESSURE_MEASUREMENT, + .cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, + .attr_id = ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_VALUE_ID, + .u = + { + .send_info = + { + .min_interval = min_interval, + .max_interval = max_interval, + .delta = + { + .u16 = delta, // x Pa + }, + .def_min_interval = min_interval, + .def_max_interval = max_interval, + }, + }, + .dst = + { + .profile_id = ESP_ZB_AF_HA_PROFILE_ID, + }, + .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, + }; + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_update_reporting_info(&reporting_info); + esp_zb_lock_release(); +} + +void ZigbeePressureSensor::setPressure(int16_t pressure) { + log_v("Updating pressure sensor value..."); + /* Update temperature sensor measured value */ + log_d("Setting pressure to %d Pa", pressure); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_PRESSURE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_VALUE_ID, &pressure, false + ); + esp_zb_lock_release(); +} + +void ZigbeePressureSensor::report() { + /* Send report attributes command */ + esp_zb_zcl_report_attr_cmd_t report_attr_cmd; + report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; + report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_VALUE_ID; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; + report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_PRESSURE_MEASUREMENT; + report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_zb_lock_release(); + log_v("Pressure report sent"); +} + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h new file mode 100644 index 00000000000..a2869aaeb5e --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h @@ -0,0 +1,58 @@ +/* Class of Zigbee Pressure sensor endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +#define ZIGBEE_DEFAULT_PRESSURE_SENSOR_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .pressure_meas_cfg = \ + { \ + .measured_value = ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_VALUE_DEFAULT_VALUE, \ + .min_value = ESP_ZB_ZCL_PATTR_RESSURE_MEASUREMENT_MIN_VALUE_DEFAULT_VALUE, \ + .max_value = ESP_ZB_ZCL_PATTR_RESSURE_MEASUREMENT_MAX_VALUE_DEFAULT_VALUE, \ + }, \ + } + +typedef struct zigbee_pressure_sensor_cfg_s { + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_pressure_meas_cluster_cfg_t pressure_meas_cfg; +} zigbee_pressure_sensor_cfg_t; + +class ZigbeePressureSensor : public ZigbeeEP { +public: + ZigbeePressureSensor(uint8_t endpoint); + ~ZigbeePressureSensor(); + + // Set the pressure value in 1 Pa + void setPressure(int16_t value); + + // Set the min and max value for the pressure sensor in 1 Pa + void setMinMaxValue(int16_t min, int16_t max); + + // Set the tolerance value for the pressure sensor in 1 Pa + void setTolerance(uint16_t tolerance); + + // Set the reporting interval for pressure measurement in seconds and delta (pressure change in 1 Pa) + void setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta); + + // Report the pressure value + void report(); +}; + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp index 3dfac0489dd..98a3793fbad 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp @@ -3,6 +3,7 @@ ZigbeeTempSensor::ZigbeeTempSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_TEMPERATURE_SENSOR_DEVICE_ID; + _humidity_sensor = false; esp_zb_temperature_sensor_cfg_t temp_sensor_cfg = ESP_ZB_DEFAULT_TEMPERATURE_SENSOR_CONFIG(); _cluster_list = esp_zb_temperature_sensor_clusters_create(&temp_sensor_cfg); @@ -103,6 +104,7 @@ void ZigbeeTempSensor::addHumiditySensor(float min, float max, float tolerance) esp_zb_humidity_meas_cluster_add_attr(humidity_cluster, ESP_ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_MAX_VALUE_ID, &zb_max); esp_zb_humidity_meas_cluster_add_attr(humidity_cluster, ESP_ZB_ZCL_ATTR_REL_HUMIDITY_TOLERANCE_ID, &zb_tolerance); esp_zb_cluster_list_add_humidity_meas_cluster(_cluster_list, humidity_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + _humidity_sensor = true; } void ZigbeeTempSensor::setHumidity(float humidity) { @@ -165,4 +167,11 @@ void ZigbeeTempSensor::setHumidityReporting(uint16_t min_interval, uint16_t max_ esp_zb_lock_release(); } +void ZigbeeTempSensor::report() { + reportTemperature(); + if (_humidity_sensor) { + reportHumidity(); + } +} + #endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.h b/libraries/Zigbee/src/ep/ZigbeeTempSensor.h index d868034280d..9b074ba0ae1 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.h @@ -40,6 +40,14 @@ class ZigbeeTempSensor : public ZigbeeEP { // Report the humidity value void reportHumidity(); + + // Report the temperature and humidity values if humidity sensor is added + void report(); + +private: + bool _humidity_sensor; + }; + #endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED From aef691e0e2f3de3f886f70a76a562ab7e4e5ec1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 12 Dec 2024 15:15:33 +0100 Subject: [PATCH 074/183] fix(example): use correct print format --- .../Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino index 889ae21dcb4..f70341af9d5 100644 --- a/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino @@ -49,7 +49,7 @@ static void sensors_reading(void *arg) { uint16_t pressure_value = (uint16_t)temperatureRead()*100; //*100 for demonstration so the value is in 1-3hPa Serial.printf("Updating flow sensor value to %.2f\r\n", flow_value); zbFlowSensor.setFlow(flow_value); - Serial.printf("Updating pressure sensor value to %.2f\r\n", pressure_value); + Serial.printf("Updating pressure sensor value to %d\r\n", pressure_value); zbPressureSensor.setPressure(pressure_value); delay(1000); } From b4d7227068db7780225cc829eff777b0e6f7b658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 12 Dec 2024 15:18:01 +0100 Subject: [PATCH 075/183] fix(zigbee): Fix functions comment --- libraries/Zigbee/src/ep/ZigbeeFlowSensor.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h index cfb7d4311ed..65156369984 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h @@ -39,7 +39,7 @@ class ZigbeeFlowSensor : public ZigbeeEP { ZigbeeFlowSensor(uint8_t endpoint); ~ZigbeeFlowSensor(); - // Set the flow value in 0,01 m3/h + // Set the flow value in 0,1 m3/h void setFlow(float value); // Set the min and max value for the flow sensor in 0,1 m3/h @@ -48,7 +48,7 @@ class ZigbeeFlowSensor : public ZigbeeEP { // Set the tolerance value for the flow sensor in 0,01 m3/h void setTolerance(float tolerance); - // Set the reporting interval for flow measurement in seconds and delta (temp change in 0,01 m3/h) + // Set the reporting interval for flow measurement in seconds and delta (temp change in 0,1 m3/h) void setReporting(uint16_t min_interval, uint16_t max_interval, float delta); // Report the flow value From 5e7139b8feae6876f20fe3aa1957fb6df31756c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 12 Dec 2024 15:19:31 +0100 Subject: [PATCH 076/183] fix(cmake): Update CMakeLists.txt --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b6478aa16a3..45c4e9c0400 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -278,6 +278,9 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeSwitch.cpp libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp libraries/Zigbee/src/ep/ZigbeeThermostat.cpp + libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp + libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp + libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp ) set(ARDUINO_LIBRARY_BLE_SRCS From b64b8500cb8f614d75694a45368b373ade4e5ff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 12 Dec 2024 15:27:53 +0100 Subject: [PATCH 077/183] feat(zigbee): Fill the keywords.txt --- libraries/Zigbee/keywords.txt | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/libraries/Zigbee/keywords.txt b/libraries/Zigbee/keywords.txt index 40e5dcec004..0faba2a1eef 100644 --- a/libraries/Zigbee/keywords.txt +++ b/libraries/Zigbee/keywords.txt @@ -18,6 +18,9 @@ ZigbeeColorDimmableLight KEYWORD1 ZigbeeColorDimmerSwitch KEYWORD1 ZigbeeTempSensor KEYWORD1 ZigbeeThermostat KEYWORD1 +ZigbeeFlowSensor KEYWORD1 +ZigbeePressureSensor KEYWORD1 +ZigbeeOccupancySensor KEYWORD1 # Other zigbee_role_t KEYWORD1 @@ -89,23 +92,36 @@ lightOnWithSceneRecall KEYWORD2 setLightLevel KEYWORD2 setLightColor KEYWORD2 -# ZigbeeTempSensor + humidity -setTemperature KEYWORD2 +# ZigbeeThermostat +onTempRecieve KEYWORD2 +onConfigRecieve KEYWORD2 +getTemperature KEYWORD2 +getSensorSettings KEYWORD2 +setTemperatureReporting KEYWORD2 + +# Common Zigbee Sensor setMinMaxValue KEYWORD2 setTolerance KEYWORD2 setReporting KEYWORD2 +report KEYWORD2 + +# ZigbeeTempSensor + humidity +setTemperature KEYWORD2 reportTemperature KEYWORD2 addHumiditySensor KEYWORD2 setHumidity KEYWORD2 setHumidityReporting KEYWORD2 reportHumidity KEYWORD2 -# ZigbeeThermostat -onTempRecieve KEYWORD2 -onConfigRecieve KEYWORD2 -getTemperature KEYWORD2 -getSensorSettings KEYWORD2 -setTemperatureReporting KEYWORD2 +# ZigbeeFlowSensor +setFlow KEYWORD2 + +# ZigbeePressureSensor +setPressure KEYWORD2 + +# ZigbeeOccupancySensor +setOccupancy KEYWORD2 +setSensorType KEYWORD2 ####################################### # Constants (LITERAL1) From e060b0232842d42ba03ff43772b98acdb3b892c9 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Thu, 12 Dec 2024 12:49:10 -0300 Subject: [PATCH 078/183] feat(matter): adds new Matter Occupancy Sensor endpoint (#10717) * feat(matter): adds matter occupancy sensor endpoint --- CMakeLists.txt | 1 + .../MatterOccupancySensor.ino | 128 ++++++++++++++++++ .../examples/MatterOccupancySensor/ci.json | 7 + libraries/Matter/keywords.txt | 3 + libraries/Matter/src/Matter.h | 2 + .../MatterEndpoints/MatterOccupancySensor.cpp | 109 +++++++++++++++ .../MatterEndpoints/MatterOccupancySensor.h | 73 ++++++++++ 7 files changed, 323 insertions(+) create mode 100644 libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino create mode 100644 libraries/Matter/examples/MatterOccupancySensor/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b6478aa16a3..322824f11ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -179,6 +179,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp + libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS diff --git a/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino b/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino new file mode 100644 index 00000000000..7582a423dc0 --- /dev/null +++ b/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino @@ -0,0 +1,128 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + * This example is an example code that will create a Matter Device which can be + * commissioned and controlled from a Matter Environment APP. + * Additionally the ESP32 will send debug messages indicating the Matter activity. + * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. + * + * The example will create a Matter Occupancy Sensor Device. + * The Occupancy Sensor will be simulated to change its state every 2 minutes. + * + * The onboard button can be kept pressed for 5 seconds to decommission the Matter Node. + * The example will also show the manual commissioning code and QR code to be used in the Matter environment. + * + */ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Matter Occupancy Sensor Endpoint +MatterOccupancySensor OccupancySensor; + +// set your board USER BUTTON pin here - decommissioning only +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + pinMode(buttonPin, INPUT_PULLUP); + + Serial.begin(115200); + + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + // set initial occupancy sensor state as false and connected to a PIR sensor type (default) + OccupancySensor.begin(); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Occupancy Sensor Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } +} + +bool simulatedHWOccupancySensor() { + // Simulated Occupancy Sensor + static bool occupancyState = false; + static uint32_t lastTime = millis(); + const uint32_t occupancyTimeout = 120000; // 2 minutes to toggle the state + + // Simulate a Occupancy Sensor state change every 2 minutes + if (millis() - lastTime > occupancyTimeout) { + occupancyState = !occupancyState; + lastTime = millis(); + } + return occupancyState; +} + +void loop() { + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (button_state && digitalRead(buttonPin) == HIGH) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Generic Switch Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } + + // Check Simulated Occupancy Sensor and set Matter Attribute + OccupancySensor.setOccupancy(simulatedHWOccupancySensor()); + + delay(50); +} diff --git a/libraries/Matter/examples/MatterOccupancySensor/ci.json b/libraries/Matter/examples/MatterOccupancySensor/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterOccupancySensor/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index d75e9888afd..1daf65974ed 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -22,6 +22,7 @@ MatterTemperatureSensor KEYWORD1 MatterHumiditySensor KEYWORD1 MatterContactSensor KEYWORD1 MatterPressureSensor KEYWORD1 +MatterOccupancySensor KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -74,6 +75,8 @@ setContact KEYWORD2 getContact KEYWORD2 setPressure KEYWORD2 getPressure KEYWORD2 +setOccupancy KEYWORD2 +getOccupancy KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index 02571dbcf40..bc0a0ec1cc7 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -30,6 +30,7 @@ #include #include #include +#include using namespace esp_matter; @@ -66,6 +67,7 @@ class ArduinoMatter { friend class MatterHumiditySensor; friend class MatterContactSensor; friend class MatterPressureSensor; + friend class MatterOccupancySensor; protected: static void _init(); diff --git a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp new file mode 100644 index 00000000000..d893f14b6bb --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp @@ -0,0 +1,109 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +// clang-format off +const uint8_t MatterOccupancySensor::occupancySensorTypeBitmap[4] = { + MatterOccupancySensor::occupancySensorTypePir, + MatterOccupancySensor::occupancySensorTypePir | MatterOccupancySensor::occupancySensorTypeUltrasonic, + MatterOccupancySensor::occupancySensorTypeUltrasonic, + MatterOccupancySensor::occupancySensorTypePhysicalContact +}; +// clang-format on + +bool MatterOccupancySensor::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { + bool ret = true; + if (!started) { + log_e("Matter Occupancy Sensor device has not begun."); + return false; + } + + log_d("Occupancy Sensor Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); + return ret; +} + +MatterOccupancySensor::MatterOccupancySensor() {} + +MatterOccupancySensor::~MatterOccupancySensor() { + end(); +} + +bool MatterOccupancySensor::begin(bool _occupancyState, OccupancySensorType_t _occupancySensorType) { + ArduinoMatter::_init(); + + occupancy_sensor::config_t occupancy_sensor_config; + occupancy_sensor_config.occupancy_sensing.occupancy = _occupancyState; + occupancy_sensor_config.occupancy_sensing.occupancy_sensor_type = _occupancySensorType; + occupancy_sensor_config.occupancy_sensing.occupancy_sensor_type_bitmap = occupancySensorTypeBitmap[_occupancySensorType]; + + // endpoint handles can be used to add/modify clusters. + endpoint_t *endpoint = occupancy_sensor::create(node::get(), &occupancy_sensor_config, ENDPOINT_FLAG_NONE, (void *)this); + if (endpoint == nullptr) { + log_e("Failed to create Occupancy Sensor endpoint"); + return false; + } + occupancyState = _occupancyState; + setEndPointId(endpoint::get_id(endpoint)); + log_i("Occupancy Sensor created with endpoint_id %d", getEndPointId()); + started = true; + return true; +} + +void MatterOccupancySensor::end() { + started = false; +} + +bool MatterOccupancySensor::setOccupancy(bool _occupancyState) { + if (!started) { + log_e("Matter Occupancy Sensor device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (occupancyState == _occupancyState) { + return true; + } + + esp_matter_attr_val_t occupancyVal = esp_matter_invalid(NULL); + + if (!getAttributeVal(OccupancySensing::Id, OccupancySensing::Attributes::Occupancy::Id, &occupancyVal)) { + log_e("Failed to get Occupancy Sensor Attribute."); + return false; + } + if (occupancyVal.val.u8 != _occupancyState) { + occupancyVal.val.u8 = _occupancyState; + bool ret; + ret = updateAttributeVal(OccupancySensing::Id, OccupancySensing::Attributes::Occupancy::Id, &occupancyVal); + if (!ret) { + log_e("Failed to update Occupancy Sensor Attribute."); + return false; + } + occupancyState = _occupancyState; + } + log_v("Occupancy Sensor set to %s", _occupancyState ? "Occupied" : "Vacant"); + + return true; +} + +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h new file mode 100644 index 00000000000..30f312a9841 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h @@ -0,0 +1,73 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace chip::app::Clusters::OccupancySensing; + +class MatterOccupancySensor : public MatterEndPoint { +public: + // Different Occupancy Sensor Types + enum OccupancySensorType_t { + OCCUPANCY_SENSOR_TYPE_PIR = (uint8_t)OccupancySensorTypeEnum::kPir, + OCCUPANCY_SENSOR_TYPE_ULTRASONIC = (uint8_t)OccupancySensorTypeEnum::kUltrasonic, + OCCUPANCY_SENSOR_TYPE_PIR_AND_ULTRASONIC = (uint8_t)OccupancySensorTypeEnum::kPIRAndUltrasonic, + OCCUPANCY_SENSOR_TYPE_PHYSICAL_CONTACT = (uint8_t)OccupancySensorTypeEnum::kPhysicalContact + }; + + MatterOccupancySensor(); + ~MatterOccupancySensor(); + // begin Matter Occupancy Sensor endpoint with initial occupancy state and default PIR sensor type + bool begin(bool _occupancyState = false, OccupancySensorType_t _occupancySensorType = OCCUPANCY_SENSOR_TYPE_PIR); + // this will just stop processing Occupancy Sensor Matter events + void end(); + + // set the occupancy state + bool setOccupancy(bool _occupancyState); + // returns the occupancy state + bool getOccupancy() { + return occupancyState; + } + + // bool conversion operator + void operator=(bool _occupancyState) { + setOccupancy(_occupancyState); + } + // bool conversion operator + operator bool() { + return getOccupancy(); + } + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + +protected: + // bitmap for Occupancy Sensor Types + static const uint8_t occupancySensorTypePir = 0x01; + static const uint8_t occupancySensorTypeUltrasonic = 0x02; + static const uint8_t occupancySensorTypePhysicalContact = 0x04; + + // bitmap for Occupancy Sensor Type Bitmap mapped array + static const uint8_t occupancySensorTypeBitmap[4]; + + bool started = false; + bool occupancyState = false; +}; +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From c310c1ade4c0e9e0d27b137da5f1575fdc70ab57 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Thu, 12 Dec 2024 13:05:35 -0300 Subject: [PATCH 079/183] feat(matter): adds matter on off plugin endpoint --- CMakeLists.txt | 1 + .../MatterOnOffPlugin/MatterOnOffPlugin.ino | 142 ++++++++++++++++++ .../Matter/examples/MatterOnOffPlugin/ci.json | 7 + libraries/Matter/keywords.txt | 1 + libraries/Matter/src/Matter.h | 2 + .../src/MatterEndpoints/MatterOnOffPlugin.cpp | 136 +++++++++++++++++ .../src/MatterEndpoints/MatterOnOffPlugin.h | 56 +++++++ 7 files changed, 345 insertions(+) create mode 100644 libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino create mode 100644 libraries/Matter/examples/MatterOnOffPlugin/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 322824f11ab..6f89f3b8715 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,6 +180,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp + libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS diff --git a/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino b/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino new file mode 100644 index 00000000000..04cf8bff31a --- /dev/null +++ b/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino @@ -0,0 +1,142 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Matter Manager +#include +#include +#include + +// List of Matter Endpoints for this Node +// On/Off Plugin Endpoint +MatterOnOffPlugin OnOffPlugin; + +// it will keep last OnOff state stored, using Preferences +Preferences matterPref; +const char *onOffPrefKey = "OnOff"; + +// set your board Power Relay pin here - this example uses the built-in LED for easy visualization +#ifdef LED_BUILTIN +const uint8_t onoffPin = LED_BUILTIN; +#else +const uint8_t onoffPin = 2; // Set your pin here - usually a power relay +#warning "Do not forget to set the Power Relay pin" +#endif + +// board USER BUTTON pin necessary for Decommissioning +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Matter Protocol Endpoint Callback +bool setPluginOnOff(bool state) { + Serial.printf("User Callback :: New Plugin State = %s\r\n", state ? "ON" : "OFF"); + if (state) { + digitalWrite(onoffPin, HIGH); + } else { + digitalWrite(onoffPin, LOW); + } + // store last OnOff state for when the Plugin is restarted / power goes off + matterPref.putBool(onOffPrefKey, state); + // This callback must return the success state to Matter core + return true; +} + +void setup() { + // Initialize the USER BUTTON + pinMode(buttonPin, INPUT_PULLUP); + // Initialize the Power Relay (plugin) GPIO + pinMode(onoffPin, OUTPUT); + + Serial.begin(115200); + + // We start by connecting to a WiFi network + Serial.print("Connecting to "); + Serial.println(ssid); + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println("\r\nWiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + delay(500); + + // Initialize Matter EndPoint + matterPref.begin("MatterPrefs", false); + bool lastOnOffState = matterPref.getBool(onOffPrefKey, false); + OnOffPlugin.begin(lastOnOffState); + OnOffPlugin.onChange(setPluginOnOff); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + // This may be a restart of a already commissioned Matter accessory + if (Matter.isDeviceCommissioned()) { + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.printf("Initial state: %s\r\n", OnOffPlugin.getOnOff() ? "ON" : "OFF"); + OnOffPlugin.updateAccessory(); // configure the Plugin based on initial state + } +} + +void loop() { + // Check Matter Plugin Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Plugin Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.printf("Initial state: %s\r\n", OnOffPlugin.getOnOff() ? "ON" : "OFF"); + OnOffPlugin.updateAccessory(); // configure the Plugin based on initial state + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } + + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + // Onboard User Button is used to decommission the Matter Node + if (button_state && digitalRead(buttonPin) == HIGH) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Plugin Matter Accessory. It shall be commissioned again."); + OnOffPlugin.setOnOff(false); // turn the plugin off + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } +} diff --git a/libraries/Matter/examples/MatterOnOffPlugin/ci.json b/libraries/Matter/examples/MatterOnOffPlugin/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterOnOffPlugin/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index 1daf65974ed..3f40e598ada 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -23,6 +23,7 @@ MatterHumiditySensor KEYWORD1 MatterContactSensor KEYWORD1 MatterPressureSensor KEYWORD1 MatterOccupancySensor KEYWORD1 +MatterOnOffPlugin KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index bc0a0ec1cc7..7fcab363f11 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -31,6 +31,7 @@ #include #include #include +#include using namespace esp_matter; @@ -68,6 +69,7 @@ class ArduinoMatter { friend class MatterContactSensor; friend class MatterPressureSensor; friend class MatterOccupancySensor; + friend class MatterOnOffPlugin; protected: static void _init(); diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp new file mode 100644 index 00000000000..6b5e5e630e0 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp @@ -0,0 +1,136 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +bool MatterOnOffPlugin::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { + bool ret = true; + if (!started) { + log_e("Matter On-Off Plugin device has not begun."); + return false; + } + + log_d("OnOff Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); + + if (endpoint_id == getEndPointId()) { + log_d("OnOffPlugin state changed to %d", val->val.b); + if (cluster_id == OnOff::Id) { + if (attribute_id == OnOff::Attributes::OnOff::Id) { + if (_onChangeOnOffCB != NULL) { + ret &= _onChangeOnOffCB(val->val.b); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(val->val.b); + } + if (ret == true) { + onOffState = val->val.b; + } + } + } + } + return ret; +} + +MatterOnOffPlugin::MatterOnOffPlugin() {} + +MatterOnOffPlugin::~MatterOnOffPlugin() { + end(); +} + +bool MatterOnOffPlugin::begin(bool initialState) { + ArduinoMatter::_init(); + on_off_plugin_unit::config_t plugin_config; + + plugin_config.on_off.on_off = initialState; + plugin_config.on_off.lighting.start_up_on_off = nullptr; + + // endpoint handles can be used to add/modify clusters. + endpoint_t *endpoint = on_off_plugin_unit::create(node::get(), &plugin_config, ENDPOINT_FLAG_NONE, (void *)this); + if (endpoint == nullptr) { + log_e("Failed to create on-off plugin endpoint"); + return false; + } + onOffState = initialState; + setEndPointId(endpoint::get_id(endpoint)); + log_i("On-Off Plugin created with endpoint_id %d", getEndPointId()); + started = true; + return true; +} + +void MatterOnOffPlugin::end() { + started = false; +} + +void MatterOnOffPlugin::updateAccessory() { + if (_onChangeCB != NULL) { + _onChangeCB(onOffState); + } +} + +bool MatterOnOffPlugin::setOnOff(bool newState) { + if (!started) { + log_e("Matter On-Off Plugin device has not begun."); + return false; + } + + // avoid processing the a "no-change" + if (onOffState == newState) { + return true; + } + + esp_matter_attr_val_t onoffVal = esp_matter_invalid(NULL); + + if (!getAttributeVal(OnOff::Id, OnOff::Attributes::OnOff::Id, &onoffVal)) { + log_e("Failed to get Pressure Sensor Attribute."); + return false; + } + if (onoffVal.val.b != newState) { + onoffVal.val.b = newState; + bool ret; + ret = updateAttributeVal(OnOff::Id, OnOff::Attributes::OnOff::Id, &onoffVal); + if (!ret) { + log_e("Failed to update Pressure Sensor Measurement Attribute."); + return false; + } + onOffState = newState; + } + log_v("Plugin OnOff state set to %s", newState ? "ON" : "OFF"); + return true; +} + +bool MatterOnOffPlugin::getOnOff() { + return onOffState; +} + +bool MatterOnOffPlugin::toggle() { + return setOnOff(!onOffState); +} + +MatterOnOffPlugin::operator bool() { + return getOnOff(); +} + +void MatterOnOffPlugin::operator=(bool newState) { + setOnOff(newState); +} +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h new file mode 100644 index 00000000000..241726a3a46 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h @@ -0,0 +1,56 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +class MatterOnOffPlugin : public MatterEndPoint { +public: + MatterOnOffPlugin(); + ~MatterOnOffPlugin(); + virtual bool begin(bool initialState = false); // default initial state is off + void end(); // this will just stop processing Plugin Matter events + + bool setOnOff(bool newState); // returns true if successful + bool getOnOff(); // returns current plugin state + bool toggle(); // returns true if successful + + // used to update the state of the plugin using the current Matter Plugin internal state + // It is necessary to set a user callback function using onChange() to handle the physical plugin state + void updateAccessory(); + + operator bool(); // returns current plugin state + void operator=(bool state); // turns plugin on or off + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // User Callback for whenever the Plugin state is changed by the Matter Controller + using EndPointCB = std::function; + void onChange(EndPointCB onChangeCB) { + _onChangeCB = onChangeCB; + } + void onChangeOnOff(EndPointCB onChangeCB) { + _onChangeOnOffCB = onChangeCB; + } + +protected: + bool started = false; + bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) + EndPointCB _onChangeCB = NULL; + EndPointCB _onChangeOnOffCB = NULL; +}; +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From 8f0f46fe549fb331129d25e1193e3db3a4f57946 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 16:24:21 +0000 Subject: [PATCH 080/183] ci(pre-commit): Apply automatic fixes --- tools/get.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/get.py b/tools/get.py index b40c0a6e987..c791020b7e9 100755 --- a/tools/get.py +++ b/tools/get.py @@ -243,11 +243,11 @@ def unpack(filename, destination, force_extract, checksum): # noqa: C901 if filename.endswith("tar.gz"): if not cfile: cfile = tarfile.open(filename, "r:gz") - cfile.extractall(destination, filter='tar') + cfile.extractall(destination, filter="tar") elif filename.endswith("tar.xz"): if not cfile: cfile = tarfile.open(filename, "r:xz") - cfile.extractall(destination, filter='tar') + cfile.extractall(destination, filter="tar") elif filename.endswith("zip"): if not cfile: cfile = zipfile.ZipFile(filename) From c6ec1120543a3acfb23a21bf435e24446557bb03 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 16:25:55 +0000 Subject: [PATCH 081/183] change(tools): Push generated binaries to PR --- tools/get.exe | Bin 7493360 -> 7493360 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tools/get.exe b/tools/get.exe index b5c542501c5924256d567fb2aceb92016cc807ed..b88062159a648836c66ee002504a1ceb99cb332b 100644 GIT binary patch delta 18398 zcmYhB1yEeg67O+$cMlH1-3jjQ?hcCvTio521lQof-QAs_AwbYT(4axy`M&$^eXnYN zHFc){(=*fEGgW(bFKZ`YF98anVUsY7(qW-hV2j>B;abqqTG0Oh)20OtYf<`-F}ke` z761+a9smIV5daAQ82|+U6#xwY9RLFW695YU8vq9Y7XS|cAAkUW5P%4P7=Q$T6o3qX z9Do9V5`YST8h{3X7Jv@m9RNK50{|lc696*+3jiws8vr}NdjJjqP5>?dZU7ztUI0D- zegFXgK>#5DVE_>TQ2;RjaR3PbNdPGTX@Cy^G61pwascuG3IK`#N&w0LDgdegY5?j0 z8UUIAS^(MrIsm!=dI0(W1^|Wt|HRlBzy!dwt*y*VR{`2A8soyO4dcT6vI@+If`_DT zZusX5W#UtMu@tV=&vDVC=`+xTNe2?jh2{BH$I)!h(M$Wy#blisLfz_)|9(Xr4c-7* z8QHeMr-eL-;8sV;x8}xCta71-&!*ohzY1O%7UvcQPb+-WJixp4wkynH|Kb#WFko1o zTlt&mqS9t+ePjFDG;A!dXrmW=Eq2WCVUf5_R42HKPm`iDF-y+L>Y!oc_4;)q^cuQc zANe#yK4`oq{2MjrB{rc0r=QxU`N5YiDn#To>;NQCJ8D`3#~X-i7U z1d8!`zc?zhU!e&x8ewE7p$V}saE~C&{SX29loHVt={<)qkxf`Z)_iL4xTh$VbYLvi z+`U9n%zNB@ea!s|zbvY;0IIpzBVKY|NfTw|UakQ6y{?$kyJ0;cH{%d~QyjvRL{AQJ(%ClE_wIhD zHX*$1hAaqX@RU1s=8sLT?x{hyV$9^`RlIAN?w;0QzEE^`ZBser9s3|4ud%^nswS6S4NUDdq_Os4CSlMo|iZ9}w1&^yx z>xm(|S9+3ht@g~Xw8)>RJ|@{oO=XA^)wtuU968mXF>dNsz*7eSxiHK=Gu0!$U+e{93 zljq}vVx@ZtM_vwkKKRp&p6hIeVkFDbqvBDXlt&{+Y7WaZUigC12u#8uOH;?*N?;`y zr{_<_qU-{+d55+KsaP#l1BLG?}Bqbk$CiNklMT_~q3 zFZrn>*2wcw_wy6(CMQn>mC%PDhu$URD46GPdyN`ax3o znz%K5rp)=)$mPnzr^WdroZ$ziKFed{Z&2DO^>l0C&^JC7TXq-xJF0+EFwu;F}bq? zR@gTiH9iuUEACs?qyWz**VQNCeU^74 zb~(lzM7#OF9K;Ci4}T&2kSJM*W3!dd_&vn>%SpKxs_nWE>RlZ#XzYQJ(z0>y__x4%h}J zbdQq=So_e_;QLI4gWnBbZ@hakP!6i6I;Wp$H>cKDq>F1Btrpt((O zxkfJXlp2^dCyWk;nY5^kNpz5)HfnGy54D`eC)s$_nCI#;g|SzlGwlb{G1vy^&U{~# zx<(ZCWZ|HdU)aMpZpw`aMG?Jsr_-##@~<08)eo~X0Ea=#mHT*FN1r6V<(4CoX~b(u zI+G~(GOAHg{3K6kT~G|M6e_n{_1xr&(@vXM{aa}wCu`?hk!RjsO@`eKr=Pknz?j#V zo5B!b7=|`>6roc?RG;IiHPAn^;*UQA?IQo~1rAnX2vIGZjB11){XMxggrWjr)qSWi;ko*d};v5P(VD0!)R$f+W{&~&S@+L1&Up@% zG7a9*-=g-R?jRejj<4+ol*p3i+o4qQ)AwOMO3R# z4cBj{gv+t3U(@ws+BIjLN%8y}zZ3n6+5LWCrt1@c%nrVa?|<)6%aPNC!lZTF`K_QZ zM5&dBaHjK-H0bha2X)}o-<93>UV zckl&IIB2Vk^@wbLBy81~dHO68avJ;v+%)7Xv`OZ74FZ30{<|rDJXWUaC0gE`CmK=v z;b+JELEGQ3_tjo{Oh_TtMrRU4O}+O)SkhX^*IND9jh zs!ZMmGQVNTQZOUXD@qQw=<3$`ub?0pPi3r>P5wo%a8TImj?eP*!e+}+%x3a)28VYM zCxiP%c&F_|X5uZ(@4P6Ry~E#7@GyOUhN0@%Q(mKw4_cIW4t#L_H04yW+KWQ$?_qM& zGBX@x!_DM{-8Z+&`@Tg`V*Rhf__oz)C*=*V-%9*e1pEd(9A*l>+=a6p_W?ikZ?1GQxA{0hFqdvEL<%Nx33ow^wdGp};D9ht#4t^W4sJ{Uvx+yY{t+3UvBrw*<^bvj_^^1s&?2 z5YMgdEs+F0i(ox!>I2SMRg2F@;+)<`-I)D?BCpPLE!j^3TLme}skrMMRVST#mj5bK zj8yrD`mX<2z-OzfHlybwgwwue3%!H!p%QFPVn2ergOnZx+v1+YL9jp zli3ap_xgRqBgJAqOaM47|8L!IHfXF$81^s<-*)w+73GezEZ*+lhg)L8QV0hKGJZC_ z8cI!!_=v5NJ4&47ctRsl9f3rR=h14*yGfpE&E5h@5rmXf60fv;Z_Bb!){jGCjbz>s zlIo<2_Wb4?6Mb^q-~EI8$%T1Ci=`W-WWw_vJ}alUi=P+0ySc%&&9t-hGPajhDSFOT z`#P91b~Gpt4k?s)npV9e3hvW(*Pp*2dvizGwhxGz`*FZ&D7*^Nyb>PoCm4Ara7L|i zSpVIRI77`?^Lr&dopU?6{_1{bX0_yDevQZXMlyNV*N_~R1rDG2aks0M77?#aY4O`$ z_8ftRWK}5{mCgHTKGs|lOIoBJcUxW;uLF0;%ns{udb#aUX&q5 ztOClOZuXKyXgPcpDvwneYGpW9=;2x&BHT-c2nvL`++r5y*}v_n+yWU6uCglnB^t5X z0>H8jvDzx;4rws^@OybItVbK9$odluA_L8>S80A6gum3<3fxzVwK-Imrf1kF@!BO? zG0nXEhrG=`aAwnI zZsGu;&ZtGeVDVsQe9yQ*Dbp~I|KrL8}0SfuRlq1Ze%w%QcF z#~fd>7UGr=4K@cBswcAVd;vx>Q-2`+bH!4y1ll8n)G|wkaq9({0Rn=^uY|iqsD4)+zC{UW}FN zX(yUxx!Z|hMyD8YUzRSN9Jvc&oJUY(nHeL9O%4r2h-A{%)1aU_~pcI#ebSQ%nChWD-p}?sMJtc;};hc>6N10RPDYqUWjge_CEpRgr zy$Ms;gKAXokz270lx)5ZQgFR9--$5Ow&InRCMbnD`xRA#{W7>kgyk_X@3 zs(!WpQ%}8+0RtB5VZ}h;YvHLa zeCMyEzT+hMVMx;4cz-d?2TSvl@6M>V$l&@^6PD}#oNR%)HzcF9=q7)%937-LcK@&z z($dbfr+jF-V$IbuN{D|;!!m%9vzkI{(b;)MPk%l`Soa~BPrTjc>EwpGh~<;efCVd1 zkC1}10}P@4UiNPUfzZzLRZr^jGL>{5!;Y*+k4vj@5b;%^{{DJq7_Xqp%LN*JLp zm!*j#tYHt{h87{$Og;6PI1%t4L`bxj9S2E2KiOY%hGt(@W^Lj3Hh$xW)-zNohrvBi z52Qwl7YVdi+ws(sBpC=#+&k1a#7{R?AH_{WFcejR%TiC2z=J=yPg5?-K2SV1Vqva zTFo-Yhj9L4&5y4w^a>&y_9BnsS8$sf8Vro*#YTOrKbNi)j+V-Epo01$jWt>nZ1!_W z{Tp5fOl&)hhkR@K>s22(DtPYWu|PWuy!yJYOe2bnF2|sXArmsuj-pg5p5w7?Oa5L0 zg>sKXMM5ok&XtNSqn`y|yuPj9*dvajlY4}Z{ZaA?ff(O==SOjEh+r1OUNk!}#V8MdTReIW2l zg?20-I;+Q2O2b@0>Ge4(;AhRk7xPqq<9X%ZHMKFgrZ;*8W4C)+PuF2?zhd-w4{t_L z%tgSKro3`8M#u_4{dpKew+b*57H!oy#L}>R8)NBVOb;^=7wshT^w=FBG8EumVtQA~ z|LLi=xjP!GMmqp*;*O5$jApTcNM$b(s#D@Z9HH*Z*9n2v)o+k*eFQV=>fIr1i3!23 z8=q2#J!8S};DwKdseHU|_#)40c(_E+NRP<9iE13wl5nyVvAMdK5q~5)f4c49BfvlY z7#;GxoM(yqFpG&o6+~QJ6g2w2axof0uOL=7x)&|4Zd8R#>1bDOkoNG9oQgD-QuE|8 z>3BL85?|#Y&4s`#Z%sT_m?Dxqp4(iSn3h?rD$JJ04DKmSM_xR^9}Z^9>u-iR`GZ5G z;!i7mfEJ82J)DrCgD_DQXwO$O54ABatx&C`Yg1a&3Dp=RHY}0vwe;33v+_Kcm|yHz z8Rd4B{u6(Bt17=31CG`!VluaOwxZv1Eeyx*n{Gg)>H*K!Tv}cx-V~Pd#PsH9=oyM*-7IQ_V7ew z=TxzOu!{8*k6N##MLbysRVrb%;sn3pE>ekU-<82pYg#E1wZ^qo?(2Tu3T{K}2!(p) zLy}M__2VouDwZC{eCF~Ly5N$SM&wY{9oO9qqJlA)kZ48hzJm>6{hC;8%3Yuz0~F9sW0s*_INDhHxm;c&P-dD*d#(6%K4@ zpodD3<&MPQ5_E znsKxl#>#bul6yp87{dqGP2^n)n5JxSH@F!Fv0bBGN&1Z)_^W&;mcO+O3veoQbrJY+N(X?KJt zS295x#UqlMBN*mGhEPH%N&RlCmjYEYtF;ax91PJFpMj4oQkXrda~JuoOVAW}W72uu z#)bv874nYka+A0jyQsVCfQO9HL2E*cas9`!n>A_B=3NpwRJKA@=*WT+bguaW=_G9da6oBiwaWqEEB-by~lu-mU_T7vS6J502dh@Jf;iFn`?M>kT)(qjbHyHHK^PF;-K4N+&bAhSa@wA6h~Al9F>+w9D%gX| zVlomqL8d)Mwhp*0CtKMj*>ZvXm-nbMXqHibm9dEZBqJD+nks`G_*tf9;sR-Pu1P3* z>*T{ZCc~nz7pvaC{=icNf3I`(3-pz+O{9LlruSBzuUA-1OBf8K6n&3XPul_|LJk{4 z?^WP-h#p9M;u}^Ll?xim)X5oe!_4y9<0wE6~#Vtk@mca4$jB@>vbjTAr7O6YHwc zg-Rf1cvbde=3tY!9JqQ4Z@;)r!h^r?uMgzz;M5cdq4kjK5+eI*M(OSom|689>;C|)5ede-7)_J^>&MJ zT4ltoZ&+=zN0%3L{~ywDSP``nQe z47<58?5{r*qt*m7Po11;BOioncS=vf`AvxZCUy{n5#(BjN<6pyZ|hc*QbxC&^o)B; zTe*zE)sVX3)%DdD-Qh(4{(#aM27-j@=4pRLE}TM9I!SP~;(V~=wEu!s@4H9`+-S?0hH~t?@POP`I9T9=+I4HOuvqCf(?~7K51hS zfBn(j3sp#KS;pa>-0Oih8(c9`jme0>;*JL?_bG$l^jNLy-xVdisc&T@?k=2QO<};+ zvjW2%);NPTboC_bJ6TDnCW`erQ;xp)dldx2x0|MEb7`_a&$vgj6F4jcX6HcD^<<-+ zXD!ApnI=$rB@rkED=Bf6@Jx>m$T!i?(x}Vtz>!?&Lv>Uyf;;{4$)Emy_wHWIiE7h^`?G4|>hOnELe~M|aGwlL<1w1`X>+Dk4qlbMv)mSd*-b|*+ z*T4hAU>;qCq)R!G3J$^g$I+%|C0_}N+1E-HIqMi3P+f;JX@#Wey&Ee=T>nBeBEUHjE&5QQC*dXejkcEs^4`degI1b(jRu6KY|eKM-8HIdE6rMlGXS$g0e=WbMQqmBD2L5JIo zQ{^?5O^Hj{Y_fR&RbpoIjB|?sy{?gUDi;%+(LMB}FP{5%xYhnKcw_Lx1ZKU(#_)$3 z%t;mHJ8CeAC=vB0BdhWp_&Fy824ZiPRM^Ydx{eh2Oqk#f|%A_KS0h-;6hQ+j&Je6NZYq7VZ~!hI+*g?a>~RexZt+HI!mIq^@<}Y>bRqah8)7j?SS2;J@SQRou zLWfxjO1Zlo`pPl~VUYbBeu-m7{7f+3}>6?Zt4W&LhuV7ZRx3~Cci%&64Pu1 z(AWgeY~mT6G`oy8n_`}3$e(;?0qgwA9@!Adsnfakd#J2R#rW2p5m?s4ewYAr^r4L% zw|X|zb0r*0!0)-GQ9nmU0lv%7daR`+!TDz69O?~TbDS@ZZ1o;4HB@imm8H?e+^21r z<(07F>vIfDs-${s6sku)cszsy<+?EPlukO52(1|^XdqOrVvwuNffLdmFbW?QmIGlsnNQfwLz??f}F6{m5w z7*!{ZxHG{^*`Yl^ciZssz6#->h55a^wB_bz(bqWPMIr~#N#e2o*fn-VkT zY^xvnq#&=W!QJZDD36q?{cDVq1|@wZ{)dgc{uy0=bmDhC2@}v2kKtKhJ9WCNFpZP> za%RNgV#Lq1xz9apKhnvy@Jh?=H}RIj+&DdDoIPcByN?bdX{0%6K<=5$rm4xegvSU$ zb%G%dN5~npL5_}9sCHm2EZR%sjiu@LnTp3zSS-st4KpFe_NrD<_W_s&&NS(heCop- zoRC7S_jtjL z)d3ra9kTF%th}T@0-w>$IT%eO4sRhBFV{>QtX^^~+`z~cgq$!OS1?aEm9(zQ!uzam z`O`-ok?*R4V$9EhDMjVvat8KFe?xOiIPX33c!A!=sx`xA7gPI(B(h?~#to5hCt|JB zx!vcU$#cY>^iM%EQW zY=dtf5^aV`9CWp_KlcWE+lFRqPp)4%Puo6l`w@)|Ik4pyh&x}nR?mSE+`uO3+6WT9 zY!Wmnu@8S6Jm)zlb|@QN7^H3PO)=jSjI`7qibv!so^?rqKQ$2!Z0NCk*6)vbdH~dM^ZOZvZ!buM{9n$p2!~A!YVyqL2#eH@H8_l2J&z}M==~AuMUN%Bbuu5a zFB5MVuy#s6fzho}w~+6Dr>3^8HE!aisz*xN4T) z!RhP$Yw>wyyqibd`^De7jxaR*=AtOrhW*B|r?nat@sIZ~ws()GqY0y6)tC`qcE$A? zp2|EPqBceJv$S@Vi{>T)BKYT@xC-isH@i+DTjJmj2xUEy{Pc^iPpj>cvJ08QjP((9o@|9jFRV5 zKPe~;1bJJzI9oyf&Ii-_znAr0EdThSByOetY@VZFKcB!4&qX>w7#pdY`XVQDCJ2d; zr=LaT@dJOh1)mkkq0nAk4DRA?WLx2C499A~eTKm+iaq?gXJLp-Vx9`CC_smX^bQ7l zK!y(bHP;-mAW~Y4Ryfyib}N*t-LoIksbQOPU37`k1gg|FA}etznE~HnWfawXl#VK& z<~27d%JR1wSelmHLBPu#x%aHS-y=US4T}LG)qx9bwjX;Xck5hwbn;WC`te1kqey-z zI95y#4-aC^qtf=@d%VQ0*AK%?9JXy@{gz@Veze3tKN@Y8EeVxhdYHgElhPu`7AQxl zqq!W#@v~yh45A;#A3c*XBrlSUQm1v>aoipUe$%(G25s5$adFPRVWE9QtLm#8n~KMh zh63|D%Zv-=v{Lw`?NcaZs$P=7#-`mcP2lnk zMc^8G_V#D?7isR^$Q+LiClYY-c1~!ZTGQM`U`mFjgD2AMtc>PlmCA#=plu`>{NP)A`LD8BOBm=Ctt<@Wf$2(6BX)SLfmyZSb9+)9NBEO8s7@ z5M$-B-jFW&g}c;d)S8YhUq#zI5Z`L><|F7UyQUV`W=@&E2b7i^~3Kd$~PK9mA72WN82H&JkV#Yo-n(BT7zT&l)qH46JO1{zGYTms7?~Lwr zTT@kJkLO>ZE~FBv{g{<3l!CLFZ8R${>U-I~=%D03gN7_#s6gpZTGkSD`lnc>_CnM4I0`nbTID^vwnFD zq$L~EjFTq3{LgehUX6a9kqcb5rGU0S%AJwleDgbC+bO=-ANG(2C2P%jevBY_OQCyNIR zSNrO1P3DGWCFioda7G6`uMyqyB85ramL|LYTv+{!WW0uYMzaMmiLb(vPyDxK4F)r! zdm?eSr?%1p#TrQvEI*bR;%$w3%zaZwd~lLo#5+}CkHub?W>l4O_5QaBrO-Dqu_rCo zD{(BE_3C?fZfNC% zmZ!(_3knF_%oa);#@w7Z3*<)P_nWa&##J3+2FK=yu(8$&N8WS~W$+HghdoHl=-4n` zpfS;&zYve6Fuy5}K|P#?i+_pf>z0k5B%fJ~B1saeApP7!8H{*_Y4NwvMQG>_UhYMl zg@lo^jc3GKOB=j3iqFuoWy1ch*4iNLAek;9UN^0};;G(x-D6AORYHtxBylmY1|Q3K z_Kdy77$mxHXqbtLmx_uf3MZ)sj{>*oalz(4RiOT79(O@$Aw6_EEj^?-$SrEiL`iW` zcMyZpZad)SkpH6R;}BSW>=orQfIQgjVlwSRY1)VVG-WV8^Tkw|^0juQa)zfS)2VzJ z*#uUmwL;QmV*fQd@MTyFWHm#yLhUC(G6*7-MbTi(3o-p~gbDEMs z-t7bn@4kZRcg2)uQ%}C&ZHOZG5UT!BO@&OzfRLR@DCb{bj>YtZ#=O;# zznhJprOmTHFxo%-adq%_%OyDZ)2lppq2%>MuV@S%i)viVO7~#+K8t-Z9uYDg@Aagv z&=N>3-uo;c%=1$5AP?sGQz1dmU)C`NHd~;pw1o%rt}>CL7c?6?c3W=oIrlAGiVj^# zO)_VxB+m1bWUcb0tX4FO2zv#-*Pr)JKA-m24WA_)MyXw$8T_?M zH>DAbT4poWq@VL1`dc&fDRoFFVML8hwAks_wR$36R{l%$)7XP{-Sx=K@cfYL)Hr-7 zOMm^QZtEnxf)3KoZK~=f&l_3wrmVE1>+6*aLldQn%-d!+ZwKPaMyHh%P=^|V#IJGS zAJr+Gl43;?z$ahJ+mW5^>l|s8T$&cRl4TDs+Q{=aR)gp?aN~ghc(8u zB&@csN61_>v9F`<8X*VPY=1qpB}c0RJah$|&j)`D--{m1^Y0wnRfQ*`7|Kkn)a+mz zmMH}1@)>8U{Cn$thxnP_20#6T6whz1V4HtbK8iW>MIQ*_k0#-&w+Cq^@f?1s_m2;FpnW?SUSn?*A0bP9eD>|*B3q?o@&Ez7Mi?pXDc2I!x?$mgMjWN zhU|Kby~%$XwK;iU-MV0Q4MC zV23$NkD#vgSWNpe}2)mA?{F#;wOp`cyX7x6H7XW3znz}*R)!#5t@dr|OLDD2zTO^IH`r;y3>$ z6PhR$>$c1EM%~3i2VO#Gq6vpsg<#K)J+haop$rTDm=Ba!HYF&iDYHFB-=x150o-37 zG7tMU+%K;hnZA)m<_uTc7y=CzxfO#WVMX(N7I9568qNO=o^$@4HD&E|-`UgB)!W#j6k=Lz)b;Jxx4Izm?JGGjybBvNW`Z8U zuHO1a*{WUIG+L5W1)`Ba{f3vq#JYzi@(J)Z+KB9+R`f@jSZ9%)hCRI# z#i`q_80cCB3UbYvu!jx7{{Cfn@(w2_nd*!N$9bkq$hjuGvl5NT3~Hh#d$CJNS$-7; zb?K9h22T2Xq*0UUiRN0vws<+5&a>tvR@`ujY?RgdMfz#y<||L{5+XF^lJ;Q*(=ZN_ zaF{++5w1nbuSXaZ=@oTr?zK3kzlmp-lHypq!oK2U+xBWQQbRr+0# z+L?D?EI6Cl$Mo?BR5F5y87SYFfz+n$CihGKM=$%PO_B@ZJ<%bmTYUM%kY%$D?V|K} z(5BE46DVK9-g8sB+b-cg7rN3cd|5!A+@o?=Rcz8Nxqr=IXWWf2^fOc)m%GY0Pj&A) zkKTnO0*6g24k7qJ@Wvf+;jD)vS%rgY9{ewn@mD14_wMVp(Cf%VJ>!q`p`Bjbl~F@X zrkhdWE0-R_7SEo;A|i68F{PgBPGEXmWXDZH{$5S_p`gEH{F{kY(YPMYshJ_y|?G(MFT@@rRXsvBLXt5CVi(hO_RGl9(?)B*Y)CT&ljYzv) zDF-KW7K}VaXMs11bI%DZ@s)Z7SXjwOI6j+5UQt?cC(p2~v6|oD+IQj@Ni+W8apK#& z`nVKR@8oXz1>W|O^`AvEX^$lgC zE<`bs^ywH3#h>9lQ!p2`2{YSa9uuhfTs#qHJiVVm1~vZh4mV zrxP~`^N!UKClV}k*c8z*F_?KYIN~k!tH8;1av`?oVE0#6P|qSuCtFo~vTbq+8|fP; z^Hgp;8*q5AXA;AF+U90^E=*oB<8ASZNEGNUm_{b~6rNJe}rXq0{-g_2`0k(Tp7YJmeoJ@iDocJq$ou3H8hwnod z%Ph(oPcb&J1Y^W&Ah;xJr+sxgb5lP}u=F00dqXZ^{)*eI8oDp!FVGrP&JA}%(9hn2 zkx6_*!=_2|Vouh_OTnzK=M^>75YD~8(d#Qa*d(yp9P#5`tY?`C=8fa}1MLFV^%)DP zCfIHt_3>&&o}t4@Q!W{0VSGSf*|DSo+8-r3xfo_b?$_6ho9ve8q~2g8!VU5Q>=NhQ zm0HzJgd#N8&1Zt|f0yf>r^Nz~X3MX_b$(7<5ANk|ccou#{utuh0{6Tk@+k%GVF?9! zAP)%%yzJR!Ua_EV-Cf@3sNr|_A)W+!-hcV%F+*rSjtm8>&`rQe2Qe(mjbMKTHoOj}czzxL{ zpy=s>vRGk4xO=rL2);%Nx*TP~E3Mm=oUE|<9P=8)HiR>-w@J2&9Rejc=dwtK)2Ob#j=Bsjgib%to zyL@xo;$r-QFGC!T{weKCM#HJRbZG7Z7s_&|mA+-Q;G_7^<~6ckZms@I^bNfYfGvO> zfPLEyy@Nj?oG((hN}Gq6!zWm1v}jZ*2LML^Cje&v7XViPHvsoGR4EVDF=$JOAu@;w z8W9qK45AXO?1qMNSd)f=VuIN~v2t_uvhnkBcCciE1;Ic;K{iwvUVqmTe(YK;HNkgP4dY`h#?Z2l{Cu?LKjdjA?>tsOl7+g}G! zL;=x4k3d{eK*Z3LkQfvYBXlXG0R_YkO#|6M0ntIHLf}zB@1S)cEU3Vf97G)zL=DXk z0igoQ1V|1lhz6Pv(u)eBf>we2_($RnfkOj)dO;Y`fKD8U0ve#qfPnt#tb$~r0mJ`7 z+W)aRLDv6iW*|>!z_<(uB|3-_`W-|Z9YhK(4>3Xqk&wlf!$CQGegE&m5$tTd+}yqX zyLJIc>OVpUNG;IVr=J2sYs&vb$oAaZDY$P@+;k6XxZz#a4$1Pc=g^?L{(Ch(LB zF~9^QH4tA+Ab{JDLQD`R?PpR%D2G9Xe`iE@aB+77{ZlIJ7MA~8x-sMrCWrz02||Vi zqK9UINMiv{gAgYyz@;rD2@41rKBNi@L{2g+gaqZl`LC}HI7d%6*Z(f=7P5;4qB48Q z0PIV^wt*m^{bOghakX-@wgLS&O7rD_AR71o6L?x#xVrv7fnFyd$cOt!uz~38W@qQ% zYWM#pF~X4c!B=6pU;p6Y!C%B3S=G|L;_6&ImHH% z2~b!7a-aV!9nsyw>;F$`MipTDE%mP}1a}83C+GhigHVV#4u}l87-EbA_}YQ^;(#bf zE5ImF4m1BL0(cK^8}I+gy&?7g=sF=&KtnNC0qFYa{`HFlvH_HyUjHQe-?~VKz~TZ~ zvV^eWf>@y&AqKcWB2^(^T%f+KA%(a=l4&4=xIhkwAP2a>Nr;3X;{iqA4q?Xw^0NZb z#RF`PkdJtP4Fbu-1BR1BhW=^dASZahWq|>~#RrsA5Mg{kDGD*g2Z|#d5{M5XCObVw zg>t~b{Lhv>?Y+Gmod27n7f1s>um=;!G|&*sh@n9_*m3+Tg!T0NpQ;A(_K!**LP7w< z+6W>DG(tZX0deU64YHR7$kyTiMbexM9m-+T;XlFfvT z(*z)5gFnx}2ygiRJHpM$26!p+zeqd4U_dz_(*A2i^#WN~*|=CZJG=d_2;AQRb`Iiy z?Fe2U-TzZZ|6Y%U5HUhv>4gvjLLk z22Kq3e-oz)c_jogrT}3f0`kWR(Ix_(h9IFtKysWQkSk&kKlCz$i3G$3+@pFVK;mK`p(KD83P=SB zu%va!6bazE0dh$K)WjwPhZLBP2qI1j z?jAY>KU<+m8ru}uL1Gy2)*N9Z=8yyt&;@u|6{4?S z<9UaY!i6tT9=pO(7WY+B0ue#%?hsm2@3@fz{eP1|L&HPCg~34O;wKK6x(j>3T*`BK zi;|xl{<$DXG%gO4tMkGT*ie6UH;WsS=k8EX(~a(I*VjUHmv4^q=N_FjBb$bi2#qrE zaD!hI=^_F3s$^YOe;niFl`!M<(l0y7{rZ~iS zYU{x!xFG-$Jw2M{#V))AZLu8d$enE&^X4qteFu?&a!scdXeG=?Mr?l~t0^|(Vvl?{ zu<=514*`=IZh*cB{Lfa#HIO`MC+d!DCPJ_KtpO7gR?gs-QNM zlGsbl_EJu=?!yIv<6D21WD8K;;$7)_jS1#N`+xCZC$6_b6oPu-z~p9YytXm~CsUMc zNI`NAxTxKlTDk60-DBbU?q>AlpmCd;8NKW0Z+#QPg;bf5F zvsy%G#p|IsaHJWAF@TgDmJt;JQy$sVbwUzqOLMx~qUy>d!z_Ql{k^?0TWwnn9!CY@ z4oyB88(+N$MixL$v&11q5-^{Y?;zpK=3zciD$NC9O7 z1OfpC05Et43n~zXNQU`*a;YDL{`0D=(6D314M? z_itld)mX0}*iAJi$k^^lu?MQ+zx-{v(S$;P7Jiw1jM9J#Y`s~gH4wsrp1t44b|}rI z`7@noRc2#Sw65ENP&dv*zB7<}gfvdDNPn#S913PkV2}-#+JXs6Fb@P5&$^%a8~rqN zW1T@Yy?W@`|0+odT6jU71(wU64HhlPTK1k1>n08WPf<# zf1xb#*=em2j{>A%oN7{uul390{brL+F56gKJhoZck8a~yXCq<=G(ny=(1sVm7famD zV0f};+}EsG$_fxt`ON4e1UucxO?{gDZSsr(g+O`UMK(n F000zD$=?6~ delta 18396 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 Date: Thu, 12 Dec 2024 20:45:05 +0000 Subject: [PATCH 082/183] change(tools): Push generated binaries to PR --- tools/get.exe | Bin 7493360 -> 7493360 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tools/get.exe b/tools/get.exe index b88062159a648836c66ee002504a1ceb99cb332b..b56f2b98384cecf56ab72ac3ccb6e859eee59b6d 100644 GIT binary patch delta 23560 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 delta 23615 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 From 784ef0f286f37b0c2e8a0a786885343a044dea38 Mon Sep 17 00:00:00 2001 From: Marcos Del Sol Vives Date: Fri, 13 Dec 2024 02:55:30 +0100 Subject: [PATCH 083/183] fix(webserver): Cap size of last chunk in raw read in WebServer Before, the raw read would time out if the content length was not a multiple of HTTP_RAW_BUFLEN, as it tried to read HTTP_RAW_BUFLEN bytes even if the last chunk should actually contain less. --- libraries/WebServer/src/Parsing.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libraries/WebServer/src/Parsing.cpp b/libraries/WebServer/src/Parsing.cpp index 875ca305753..eb468e4a05b 100644 --- a/libraries/WebServer/src/Parsing.cpp +++ b/libraries/WebServer/src/Parsing.cpp @@ -186,8 +186,12 @@ bool WebServer::_parseRequest(NetworkClient &client) { _currentHandler->raw(*this, _currentUri, *_currentRaw); _currentRaw->status = RAW_WRITE; - while (_currentRaw->totalSize < _clientContentLength) { - _currentRaw->currentSize = client.readBytes(_currentRaw->buf, HTTP_RAW_BUFLEN); + while (1) { + size_t read_len = std::min(_clientContentLength - _currentRaw->totalSize, (size_t) HTTP_RAW_BUFLEN); + if (read_len == 0) { + break; + } + _currentRaw->currentSize = client.readBytes(_currentRaw->buf, read_len); _currentRaw->totalSize += _currentRaw->currentSize; if (_currentRaw->currentSize == 0) { _currentRaw->status = RAW_ABORTED; From 71396de822b6c8734839462ed87bd3c6a5d43143 Mon Sep 17 00:00:00 2001 From: Mathieu Carbou Date: Fri, 13 Dec 2024 09:09:09 +0100 Subject: [PATCH 084/183] fix(sntp): Lock / Unlock LWIP if CONFIG_LWIP_TCPIP_CORE_LOCKING is set - Fixes: #10526 - Completes old PR #10529 --- cores/esp32/esp32-hal-time.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/cores/esp32/esp32-hal-time.c b/cores/esp32/esp32-hal-time.c index 25c060eabdd..074e999be71 100644 --- a/cores/esp32/esp32-hal-time.c +++ b/cores/esp32/esp32-hal-time.c @@ -51,9 +51,6 @@ static void setTimeZone(long offset, int daylight) { void configTime(long gmtOffset_sec, int daylightOffset_sec, const char *server1, const char *server2, const char *server3) { //tcpip_adapter_init(); // Should not hurt anything if already inited esp_netif_init(); - if (sntp_enabled()) { - sntp_stop(); - } #ifdef CONFIG_LWIP_TCPIP_CORE_LOCKING if (!sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER)) { @@ -61,6 +58,10 @@ void configTime(long gmtOffset_sec, int daylightOffset_sec, const char *server1, } #endif + if (sntp_enabled()) { + sntp_stop(); + } + sntp_setoperatingmode(SNTP_OPMODE_POLL); sntp_setservername(0, (char *)server1); sntp_setservername(1, (char *)server2); @@ -83,9 +84,6 @@ void configTime(long gmtOffset_sec, int daylightOffset_sec, const char *server1, void configTzTime(const char *tz, const char *server1, const char *server2, const char *server3) { //tcpip_adapter_init(); // Should not hurt anything if already inited esp_netif_init(); - if (sntp_enabled()) { - sntp_stop(); - } #ifdef CONFIG_LWIP_TCPIP_CORE_LOCKING if (!sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER)) { @@ -93,6 +91,10 @@ void configTzTime(const char *tz, const char *server1, const char *server2, cons } #endif + if (sntp_enabled()) { + sntp_stop(); + } + sntp_setoperatingmode(SNTP_OPMODE_POLL); sntp_setservername(0, (char *)server1); sntp_setservername(1, (char *)server2); From ce9a34db9a5407be125122a7b839e2beab76bbfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Fri, 13 Dec 2024 11:13:28 +0100 Subject: [PATCH 085/183] fix(zigbee): Update example + pressure unit --- .../Zigbee_Pressure_Flow_Sensor.ino | 48 ++++++++----------- .../Zigbee/src/ep/ZigbeePressureSensor.cpp | 4 +- .../Zigbee/src/ep/ZigbeePressureSensor.h | 8 ++-- 3 files changed, 27 insertions(+), 33 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino index f70341af9d5..84b1edb1f96 100644 --- a/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino @@ -41,21 +41,6 @@ uint8_t button = BOOT_PIN; ZigbeeFlowSensor zbFlowSensor = ZigbeeFlowSensor(FLOW_SENSOR_ENDPOINT_NUMBER); ZigbeePressureSensor zbPressureSensor = ZigbeePressureSensor(PRESSURE_SENSOR_ENDPOINT_NUMBER); -/************************ Temp sensor *****************************/ -static void sensors_reading(void *arg) { - for (;;) { - // Read Pressure and Flow sensors value - here is chip temperature used as a dummy value for demonstration - float flow_value = temperatureRead(); - uint16_t pressure_value = (uint16_t)temperatureRead()*100; //*100 for demonstration so the value is in 1-3hPa - Serial.printf("Updating flow sensor value to %.2f\r\n", flow_value); - zbFlowSensor.setFlow(flow_value); - Serial.printf("Updating pressure sensor value to %d\r\n", pressure_value); - zbPressureSensor.setPressure(pressure_value); - delay(1000); - } -} - -/********************* Arduino functions **************************/ void setup() { Serial.begin(115200); @@ -65,19 +50,19 @@ void setup() { // Optional: set Zigbee device name and model zbFlowSensor.setManufacturerAndModel("Espressif", "ZigbeeFlowSensor"); - // Set minimum and maximum temperature measurement value (10-50°C is default range for chip temperature measurement) - zbFlowSensor.setMinMaxValue(0, 100); + // Set minimum and maximum flow measurement value in 0,1 m3/h + zbFlowSensor.setMinMaxValue(0.0, 100.0); - // Set tolerance for temperature measurement in °C (lowest possible value is 0.01°C) - zbFlowSensor.setTolerance(1); + // Set tolerance for flow measurement in 0,1 m3/h + zbFlowSensor.setTolerance(1.0); // Optional: set Zigbee device name and model zbPressureSensor.setManufacturerAndModel("Espressif", "ZigbeePressureSensor"); - // Set minimum and maximum temperature measurement value (10-50°C is default range for chip temperature measurement) - zbPressureSensor.setMinMaxValue(0, 30); + // Set minimum and maximum pressure measurement value in hPa + zbPressureSensor.setMinMaxValue(0, 10000); - // Set tolerance for temperature measurement in °C (lowest possible value is 0.01°C) + // Set tolerance for temperature measurement in hPa zbPressureSensor.setTolerance(1); // Add endpoints to Zigbee Core @@ -100,19 +85,28 @@ void setup() { } Serial.println(); - // Start Flow and Pressure sensor reading task - xTaskCreate(sensors_reading, "flow_pressure_sensors_read", 2048, NULL, 10, NULL); - // Set reporting interval for flow and pressure measurement in seconds, must be called after Zigbee.begin() - // min_interval and max_interval in seconds, delta (pressure change in Pa, flow change in 0,1 m3/h) + // min_interval and max_interval in seconds, delta (pressure change in hPa, flow change in 0,1 m3/h) // if min = 1 and max = 0, reporting is sent only when temperature changes by delta // if min = 0 and max = 10, reporting is sent every 10 seconds or temperature changes by delta // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of delta change - zbFlowSensor.setReporting(0, 30, 1); + zbFlowSensor.setReporting(0, 30, 1.0); zbPressureSensor.setReporting(0, 30, 1); } void loop() { + static uint32_t timeCounter = 0; + + // Read flow nad pressure sensors every 2s + if (!(timeCounter++ % 20)) { // delaying for 100ms x 20 = 2s + float flow_value = temperatureRead(); + uint16_t pressure_value = (uint16_t)temperatureRead()*100; //*100 for demonstration so the value is in 1000-3000hPa + Serial.printf("Updating flow sensor value to %.2f m3/h\r\n", flow_value); + zbFlowSensor.setFlow(flow_value); + Serial.printf("Updating pressure sensor value to %d hPa\r\n", pressure_value); + zbPressureSensor.setPressure(pressure_value); + } + // Checking button for factory reset if (digitalRead(button) == LOW) { // Push button pressed // Key debounce handling diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp index a6ccacbd562..6880a109b46 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp @@ -55,7 +55,7 @@ void ZigbeePressureSensor::setReporting(uint16_t min_interval, uint16_t max_inte .max_interval = max_interval, .delta = { - .u16 = delta, // x Pa + .u16 = delta, // x hPa }, .def_min_interval = min_interval, .def_max_interval = max_interval, @@ -75,7 +75,7 @@ void ZigbeePressureSensor::setReporting(uint16_t min_interval, uint16_t max_inte void ZigbeePressureSensor::setPressure(int16_t pressure) { log_v("Updating pressure sensor value..."); /* Update temperature sensor measured value */ - log_d("Setting pressure to %d Pa", pressure); + log_d("Setting pressure to %d hPa", pressure); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_set_attribute_val( _endpoint, ESP_ZB_ZCL_CLUSTER_ID_PRESSURE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_VALUE_ID, &pressure, false diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h index a2869aaeb5e..5874cb7ff3e 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h @@ -39,16 +39,16 @@ class ZigbeePressureSensor : public ZigbeeEP { ZigbeePressureSensor(uint8_t endpoint); ~ZigbeePressureSensor(); - // Set the pressure value in 1 Pa + // Set the pressure value in 1 hPa void setPressure(int16_t value); - // Set the min and max value for the pressure sensor in 1 Pa + // Set the min and max value for the pressure sensor in 1 hPa void setMinMaxValue(int16_t min, int16_t max); - // Set the tolerance value for the pressure sensor in 1 Pa + // Set the tolerance value for the pressure sensor in 1 hPa void setTolerance(uint16_t tolerance); - // Set the reporting interval for pressure measurement in seconds and delta (pressure change in 1 Pa) + // Set the reporting interval for pressure measurement in seconds and delta (pressure change in 1 hPa) void setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta); // Report the pressure value From 44e1559830de3943a156cd32dc5b74442c1f983b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Fri, 13 Dec 2024 11:40:31 +0100 Subject: [PATCH 086/183] feat(zigbee): Add carbon dioxide sensor ed --- CMakeLists.txt | 1 + .../Zigbee_CarbonDioxide_Sensor/README.md | 72 ++++++++++++ .../Zigbee_CarbonDioxide_Sensor.ino | 106 ++++++++++++++++++ .../Zigbee_CarbonDioxide_Sensor/ci.json | 6 + .../Zigbee_Occupancy_Sensor.ino | 1 - .../Zigbee_Pressure_Flow_Sensor.ino | 8 +- libraries/Zigbee/src/Zigbee.h | 1 + .../src/ep/ZigbeeCarbonDioxideSensor.cpp | 104 +++++++++++++++++ .../Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h | 58 ++++++++++ 9 files changed, 352 insertions(+), 5 deletions(-) create mode 100644 libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/Zigbee_CarbonDioxide_Sensor.ino create mode 100644 libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 45c4e9c0400..1c8af639695 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -281,6 +281,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp + libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp ) set(ARDUINO_LIBRARY_BLE_SRCS diff --git a/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/README.md new file mode 100644 index 00000000000..88c8bf04a65 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/README.md @@ -0,0 +1,72 @@ +# Arduino-ESP32 Carbon dioxide (CO2) Sensor Example + +This example shows how to configure the Zigbee end device and use it as a Home Automation (HA) simple sensor device type with carbon dioxide measuring. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## Pressure + Flow Sensor Functions + + * After this board first starts up, it would be configured locally to report the carbon dioxide on every 30 seconds. + * By clicking the button (BOOT) on this board, this board will immediately send a report of the current measured carbon dioxide to the network. + +## Hardware Required + +* A USB cable for power supply and programming + +### Configure the Project + +In this example, the internal temperature sensor is used to demonstrate reading of the carbon dioxide sensors. +Set the Button GPIO by changing the `button` variable. By default, it's the pin `BOOT_PIN` (BOOT button on ESP32-C6 and ESP32-H2). + +#### Using Arduino IDE + +To get more information about the Espressif boards see [Espressif Development Kits](https://www.espressif.com/en/products/devkits). + +* Before Compile/Verify, select the correct board: `Tools -> Board`. +* Select the End device Zigbee mode: `Tools -> Zigbee mode: Zigbee ED (end device)` +* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee 4MB with spiffs` +* Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. +* Optional: Set debug level to verbose to see all logs from Zigbee stack: `Tools -> Core Debug Level: Verbose`. + +## Troubleshooting + +If the End device flashed with this example is not connecting to the coordinator, erase the flash of the End device before flashing the example to the board. It is recommended to do this if you re-flash the coordinator. +You can do the following: + +* In the Arduino IDE go to the Tools menu and set `Erase All Flash Before Sketch Upload` to `Enabled`. +* Add to the sketch `Zigbee.factoryReset();` to reset the device and Zigbee stack. + +By default, the coordinator network is closed after rebooting or flashing new firmware. +To open the network you have 2 options: + +* Open network after reboot by setting `Zigbee.setRebootOpenNetwork(time);` before calling `Zigbee.begin();`. +* In application you can anytime call `Zigbee.openNetwork(time);` to open the network for devices to join. + +***Important: Make sure you are using a good quality USB cable and that you have a reliable power source*** + +* **LED not blinking:** Check the wiring connection and the IO selection. +* **Programming Fail:** If the programming/flash procedure fails, try reducing the serial connection speed. +* **COM port not detected:** Check the USB cable and the USB to Serial driver installation. + +If the error persists, you can ask for help at the official [ESP32 forum](https://esp32.com) or see [Contribute](#contribute). + +## Contribute + +To know how to contribute to this project, see [How to contribute.](https://github.com/espressif/arduino-esp32/blob/master/CONTRIBUTING.rst) + +If you have any **feedback** or **issue** to report on this example/library, please open an issue or fix it by creating a new PR. Contributions are more than welcome! + +Before creating a new issue, be sure to try Troubleshooting and check if the same issue was already created by someone else. + +## Resources + +* Official ESP32 Forum: [Link](https://esp32.com) +* Arduino-ESP32 Official Repository: [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) +* ESP32-C6 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf) +* ESP32-H2 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf) +* Official ESP-IDF documentation: [ESP-IDF](https://idf.espressif.com) diff --git a/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/Zigbee_CarbonDioxide_Sensor.ino b/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/Zigbee_CarbonDioxide_Sensor.ino new file mode 100644 index 00000000000..4a987826597 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/Zigbee_CarbonDioxide_Sensor.ino @@ -0,0 +1,106 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @brief This example demonstrates Zigbee carbon dioxide sensor. + * + * The example demonstrates how to use Zigbee library to create a end device carbon dioxide sensor. + * + * Proper Zigbee mode must be selected in Tools->Zigbee mode + * and also the correct partition scheme must be selected in Tools->Partition Scheme. + * + * Please check the README.md for instructions and more detailed description. + * + * Created by Jan Procházka (https://github.com/P-R-O-C-H-Y/) + */ + +#ifndef ZIGBEE_MODE_ED +#error "Zigbee end device mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +/* Zigbee carbon dioxide sensor configuration */ +#define CARBON_DIOXIDE_SENSOR_ENDPOINT_NUMBER 10 +uint8_t button = BOOT_PIN; + +ZigbeeCarbonDioxideSensor zbCarbonDioxideSensor = ZigbeeCarbonDioxideSensor(CARBON_DIOXIDE_SENSOR_ENDPOINT_NUMBER); + +void setup() { + Serial.begin(115200); + + // Init button switch + pinMode(button, INPUT_PULLUP); + + // Optional: set Zigbee device name and model + zbCarbonDioxideSensor.setManufacturerAndModel("Espressif", "ZigbeeCarbonDioxideSensor"); + + // Set minimum and maximum carbon dioxide measurement value in ppm + zbCarbonDioxideSensor.setMinMaxValue(0, 1500); + + // Add endpoints to Zigbee Core + Zigbee.addEndpoint(&zbCarbonDioxideSensor); + + Serial.println("Starting Zigbee..."); + // When all EPs are registered, start Zigbee in End Device mode + if (!Zigbee.begin()) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } else { + Serial.println("Zigbee started successfully!"); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) { + Serial.print("."); + delay(100); + } + Serial.println(); + + // Set reporting interval for carbon dioxide measurement to be done every 30 seconds, must be called after Zigbee.begin() + // min_interval and max_interval in seconds, delta (carbon dioxide change in ppm) + // if min = 1 and max = 0, reporting is sent only when carbon dioxide changes by delta + // if min = 0 and max = 10, reporting is sent every 10 seconds or when carbon dioxide changes by delta + // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of delta change + zbCarbonDioxideSensor.setReporting(0, 30, 0); +} + +void loop() { + static uint32_t timeCounter = 0; + // Read carbon dioxide sensor every 2s + if (!(timeCounter++ % 20)) { // delaying for 100ms x 20 = 2s + // Read sensor value - here is chip temperature used + 300 as a dummy value for demonstration + uint16_t carbon_dioxide_value = 300+(uint16_t)temperatureRead(); + Serial.printf("Updating carbon dioxide sensor value to %d ppm\r\n", carbon_dioxide_value); + zbCarbonDioxideSensor.setCarbonDioxide(carbon_dioxide_value); + } + + // Checking button for factory reset and reporting + if (digitalRead(button) == LOW) { // Push button pressed + // Key debounce handling + delay(100); + int startTime = millis(); + while (digitalRead(button) == LOW) { + delay(50); + if ((millis() - startTime) > 3000) { + // If key pressed for more than 3secs, factory reset Zigbee and reboot + Serial.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); + Zigbee.factoryReset(); + } + } + zbCarbonDioxideSensor.report(); + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/ci.json new file mode 100644 index 00000000000..7b7ccef8ed7 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y" + ] +} diff --git a/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/Zigbee_Occupancy_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/Zigbee_Occupancy_Sensor.ino index b1cb53eb33d..fa0bb749c8f 100644 --- a/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/Zigbee_Occupancy_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/Zigbee_Occupancy_Sensor.ino @@ -40,7 +40,6 @@ uint8_t sensor_pin = 4; ZigbeeOccupancySensor zbOccupancySensor = ZigbeeOccupancySensor(OCCUPANCY_SENSOR_ENDPOINT_NUMBER); -/********************* Arduino functions **************************/ void setup() { Serial.begin(115200); diff --git a/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino index 84b1edb1f96..9a28534cbd2 100644 --- a/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino @@ -53,7 +53,7 @@ void setup() { // Set minimum and maximum flow measurement value in 0,1 m3/h zbFlowSensor.setMinMaxValue(0.0, 100.0); - // Set tolerance for flow measurement in 0,1 m3/h + // Optional: Set tolerance for flow measurement in 0,1 m3/h zbFlowSensor.setTolerance(1.0); // Optional: set Zigbee device name and model @@ -62,7 +62,7 @@ void setup() { // Set minimum and maximum pressure measurement value in hPa zbPressureSensor.setMinMaxValue(0, 10000); - // Set tolerance for temperature measurement in hPa + // Optional: Set tolerance for pressure measurement in hPa zbPressureSensor.setTolerance(1); // Add endpoints to Zigbee Core @@ -97,7 +97,7 @@ void setup() { void loop() { static uint32_t timeCounter = 0; - // Read flow nad pressure sensors every 2s + // Read flow and pressure sensors every 2s if (!(timeCounter++ % 20)) { // delaying for 100ms x 20 = 2s float flow_value = temperatureRead(); uint16_t pressure_value = (uint16_t)temperatureRead()*100; //*100 for demonstration so the value is in 1000-3000hPa @@ -107,7 +107,7 @@ void loop() { zbPressureSensor.setPressure(pressure_value); } - // Checking button for factory reset + // Checking button for factory reset and reporting if (digitalRead(button) == LOW) { // Push button pressed // Key debounce handling delay(100); diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index a1f5dcd7903..727761c900d 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -16,3 +16,4 @@ #include "ep/ZigbeePressureSensor.h" #include "ep/ZigbeeFlowSensor.h" #include "ep/ZigbeeOccupancySensor.h" +#include "ep/ZigbeeCarbonDioxideSensor.h" diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp new file mode 100644 index 00000000000..410816a918c --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp @@ -0,0 +1,104 @@ +#include "ZigbeeCarbonDioxideSensor.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +esp_zb_cluster_list_t *zigbee_carbon_dioxide_sensor_clusters_create(zigbee_carbon_dioxide_sensor_cfg_t *carbon_dioxide_sensor) +{ + esp_zb_basic_cluster_cfg_t *basic_cfg = carbon_dioxide_sensor ? &(carbon_dioxide_sensor->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = carbon_dioxide_sensor ? &(carbon_dioxide_sensor->identify_cfg) : NULL; + esp_zb_carbon_dioxide_measurement_cluster_cfg_t *carbon_dioxide_meas_cfg = carbon_dioxide_sensor ? &(carbon_dioxide_sensor->carbon_dioxide_meas_cfg) : NULL; + esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_carbon_dioxide_measurement_cluster(cluster_list, esp_zb_carbon_dioxide_measurement_cluster_create(carbon_dioxide_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + return cluster_list; +} + +ZigbeeCarbonDioxideSensor::ZigbeeCarbonDioxideSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID; + + //Create custom pressure sensor configuration + zigbee_carbon_dioxide_sensor_cfg_t carbon_dioxide_sensor_cfg = ZIGBEE_DEFAULT_CARBON_DIOXIDE_SENSOR_CONFIG(); + _cluster_list = zigbee_carbon_dioxide_sensor_clusters_create(&carbon_dioxide_sensor_cfg); + + _ep_config = { + .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0 + }; +} + +void ZigbeeCarbonDioxideSensor::setMinMaxValue(float min, float max) { + float zb_min = min/1000000.0f; + float zb_max = max/1000000.0f; + esp_zb_attribute_list_t *carbon_dioxide_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_CARBON_DIOXIDE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_update_attr(carbon_dioxide_measure_cluster, ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&zb_min); + esp_zb_cluster_update_attr(carbon_dioxide_measure_cluster, ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&zb_max); +} + +void ZigbeeCarbonDioxideSensor::setTolerance(float tolerance) { + float zb_tolerance = tolerance/1000000.0f; + esp_zb_attribute_list_t *carbon_dioxide_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_CARBON_DIOXIDE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_temperature_meas_cluster_add_attr(carbon_dioxide_measure_cluster, ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); +} + +void ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) { + esp_zb_zcl_reporting_info_t reporting_info = { + .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, + .ep = _endpoint, + .cluster_id = ESP_ZB_ZCL_CLUSTER_ID_CARBON_DIOXIDE_MEASUREMENT, + .cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, + .attr_id = ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MEASURED_VALUE_ID, + .u = + { + .send_info = + { + .min_interval = min_interval, + .max_interval = max_interval, + .delta = + { + .u16 = delta, // x ppm + }, + .def_min_interval = min_interval, + .def_max_interval = max_interval, + }, + }, + .dst = + { + .profile_id = ESP_ZB_AF_HA_PROFILE_ID, + }, + .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, + }; + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_update_reporting_info(&reporting_info); + esp_zb_lock_release(); +} + +void ZigbeeCarbonDioxideSensor::setCarbonDioxide(float carbon_dioxide) { + float zb_carbon_dioxide = carbon_dioxide/1000000.0f; + log_v("Updating carbon dioxide sensor value..."); + /* Update carbon dioxide sensor measured value */ + log_d("Setting carbon dioxide to %0.1f", carbon_dioxide); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_CARBON_DIOXIDE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MEASURED_VALUE_ID, &zb_carbon_dioxide, false + ); + esp_zb_lock_release(); +} + +void ZigbeeCarbonDioxideSensor::report() { + /* Send report attributes command */ + esp_zb_zcl_report_attr_cmd_t report_attr_cmd; + report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; + report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MEASURED_VALUE_ID; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; + report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_CARBON_DIOXIDE_MEASUREMENT; + report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_zb_lock_release(); + log_v("Carbon dioxide report sent"); +} + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h new file mode 100644 index 00000000000..7ee973c7d10 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h @@ -0,0 +1,58 @@ +/* Class of Zigbee Pressure sensor endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +#define ZIGBEE_DEFAULT_CARBON_DIOXIDE_SENSOR_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .carbon_dioxide_meas_cfg = \ + { \ + .measured_value = 0.0, \ + .min_measured_value = 0.0, \ + .max_measured_value = 1.0, \ + }, \ + } + +typedef struct zigbee_carbon_dioxide_sensor_cfg_s { + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_carbon_dioxide_measurement_cluster_cfg_t carbon_dioxide_meas_cfg; +} zigbee_carbon_dioxide_sensor_cfg_t; + +class ZigbeeCarbonDioxideSensor : public ZigbeeEP { +public: + ZigbeeCarbonDioxideSensor(uint8_t endpoint); + ~ZigbeeCarbonDioxideSensor(); + + // Set the carbon dioxide value in ppm + void setCarbonDioxide(float carbon_dioxide); + + // Set the min and max value for the carbon dioxide sensor in ppm + void setMinMaxValue(float min, float max); + + // Set the tolerance value for the carbon dioxide sensor in ppm + void setTolerance(float tolerance); + + // Set the reporting interval for carbon dioxide measurement in seconds and delta (carbon dioxide change in ppm) + void setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta); + + // Report the carbon dioxide value + void report(); +}; + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED From b72e8669df0ca633ec3c16257c8e8875cc867f0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Fri, 13 Dec 2024 14:15:08 +0100 Subject: [PATCH 087/183] fix(zigbee): mention Carbon dioxide delta reporting is not supported --- libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp | 5 ++++- libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp index 410816a918c..e7623e96a15 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp @@ -43,6 +43,9 @@ void ZigbeeCarbonDioxideSensor::setTolerance(float tolerance) { } void ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) { + if(delta > 0) { + log_e("Delta reporting is currently not supported by the carbon dioxide sensor"); + } esp_zb_zcl_reporting_info_t reporting_info = { .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, .ep = _endpoint, @@ -57,7 +60,7 @@ void ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max .max_interval = max_interval, .delta = { - .u16 = delta, // x ppm + .u16 = delta, }, .def_min_interval = min_interval, .def_max_interval = max_interval, diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h index 7ee973c7d10..96d3e7f17c2 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h @@ -49,6 +49,7 @@ class ZigbeeCarbonDioxideSensor : public ZigbeeEP { void setTolerance(float tolerance); // Set the reporting interval for carbon dioxide measurement in seconds and delta (carbon dioxide change in ppm) + // NOTE: Delta reporting is currently not supported by the carbon dioxide sensor void setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta); // Report the carbon dioxide value From 57339ba58c92f1c399b1143128b43970e2349ed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Fri, 13 Dec 2024 14:27:04 +0100 Subject: [PATCH 088/183] feat(zigbee): Update keywords.txt with co2 sensor --- libraries/Zigbee/keywords.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/Zigbee/keywords.txt b/libraries/Zigbee/keywords.txt index 0faba2a1eef..483d54eb712 100644 --- a/libraries/Zigbee/keywords.txt +++ b/libraries/Zigbee/keywords.txt @@ -123,6 +123,9 @@ setPressure KEYWORD2 setOccupancy KEYWORD2 setSensorType KEYWORD2 +# ZigbeeCarbonDioxideSensor +setCarbonDioxide KEYWORD2 + ####################################### # Constants (LITERAL1) ####################################### From c562aeceda7457924fd255ebdbec90c005d19e1a Mon Sep 17 00:00:00 2001 From: Marcos Del Sol Vives Date: Fri, 13 Dec 2024 14:32:32 +0100 Subject: [PATCH 089/183] Update libraries/WebServer/src/Parsing.cpp Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> --- libraries/WebServer/src/Parsing.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/libraries/WebServer/src/Parsing.cpp b/libraries/WebServer/src/Parsing.cpp index eb468e4a05b..aae89e3ec42 100644 --- a/libraries/WebServer/src/Parsing.cpp +++ b/libraries/WebServer/src/Parsing.cpp @@ -186,11 +186,8 @@ bool WebServer::_parseRequest(NetworkClient &client) { _currentHandler->raw(*this, _currentUri, *_currentRaw); _currentRaw->status = RAW_WRITE; - while (1) { + while (_currentRaw->totalSize < _clientContentLength) { size_t read_len = std::min(_clientContentLength - _currentRaw->totalSize, (size_t) HTTP_RAW_BUFLEN); - if (read_len == 0) { - break; - } _currentRaw->currentSize = client.readBytes(_currentRaw->buf, read_len); _currentRaw->totalSize += _currentRaw->currentSize; if (_currentRaw->currentSize == 0) { From 8b77d91b69f5ea5648c9b9307eba72393cf49f8b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 13:45:07 +0000 Subject: [PATCH 090/183] ci(pre-commit): Apply automatic fixes --- libraries/WebServer/src/Parsing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/WebServer/src/Parsing.cpp b/libraries/WebServer/src/Parsing.cpp index aae89e3ec42..040338bb749 100644 --- a/libraries/WebServer/src/Parsing.cpp +++ b/libraries/WebServer/src/Parsing.cpp @@ -187,7 +187,7 @@ bool WebServer::_parseRequest(NetworkClient &client) { _currentRaw->status = RAW_WRITE; while (_currentRaw->totalSize < _clientContentLength) { - size_t read_len = std::min(_clientContentLength - _currentRaw->totalSize, (size_t) HTTP_RAW_BUFLEN); + size_t read_len = std::min(_clientContentLength - _currentRaw->totalSize, (size_t)HTTP_RAW_BUFLEN); _currentRaw->currentSize = client.readBytes(_currentRaw->buf, read_len); _currentRaw->totalSize += _currentRaw->currentSize; if (_currentRaw->currentSize == 0) { From faed83229864601272690f2cdda55a12d0417133 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 14:34:24 +0000 Subject: [PATCH 091/183] ci(pre-commit): Apply automatic fixes --- .../MatterOnOffPlugin/MatterOnOffPlugin.ino | 284 +++++++++--------- 1 file changed, 142 insertions(+), 142 deletions(-) diff --git a/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino b/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino index 04cf8bff31a..1950b5bb9f3 100644 --- a/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino +++ b/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino @@ -1,142 +1,142 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Matter Manager -#include -#include -#include - -// List of Matter Endpoints for this Node -// On/Off Plugin Endpoint -MatterOnOffPlugin OnOffPlugin; - -// it will keep last OnOff state stored, using Preferences -Preferences matterPref; -const char *onOffPrefKey = "OnOff"; - -// set your board Power Relay pin here - this example uses the built-in LED for easy visualization -#ifdef LED_BUILTIN -const uint8_t onoffPin = LED_BUILTIN; -#else -const uint8_t onoffPin = 2; // Set your pin here - usually a power relay -#warning "Do not forget to set the Power Relay pin" -#endif - -// board USER BUTTON pin necessary for Decommissioning -const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. - -// Button control -uint32_t button_time_stamp = 0; // debouncing control -bool button_state = false; // false = released | true = pressed -const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission - -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - -// Matter Protocol Endpoint Callback -bool setPluginOnOff(bool state) { - Serial.printf("User Callback :: New Plugin State = %s\r\n", state ? "ON" : "OFF"); - if (state) { - digitalWrite(onoffPin, HIGH); - } else { - digitalWrite(onoffPin, LOW); - } - // store last OnOff state for when the Plugin is restarted / power goes off - matterPref.putBool(onOffPrefKey, state); - // This callback must return the success state to Matter core - return true; -} - -void setup() { - // Initialize the USER BUTTON - pinMode(buttonPin, INPUT_PULLUP); - // Initialize the Power Relay (plugin) GPIO - pinMode(onoffPin, OUTPUT); - - Serial.begin(115200); - - // We start by connecting to a WiFi network - Serial.print("Connecting to "); - Serial.println(ssid); - WiFi.begin(ssid, password); - // Wait for connection - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - Serial.println("\r\nWiFi connected"); - Serial.println("IP address: "); - Serial.println(WiFi.localIP()); - delay(500); - - // Initialize Matter EndPoint - matterPref.begin("MatterPrefs", false); - bool lastOnOffState = matterPref.getBool(onOffPrefKey, false); - OnOffPlugin.begin(lastOnOffState); - OnOffPlugin.onChange(setPluginOnOff); - - // Matter beginning - Last step, after all EndPoints are initialized - Matter.begin(); - // This may be a restart of a already commissioned Matter accessory - if (Matter.isDeviceCommissioned()) { - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); - Serial.printf("Initial state: %s\r\n", OnOffPlugin.getOnOff() ? "ON" : "OFF"); - OnOffPlugin.updateAccessory(); // configure the Plugin based on initial state - } -} - -void loop() { - // Check Matter Plugin Commissioning state, which may change during execution of loop() - if (!Matter.isDeviceCommissioned()) { - Serial.println(""); - Serial.println("Matter Node is not commissioned yet."); - Serial.println("Initiate the device discovery in your Matter environment."); - Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); - Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); - Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); - // waits for Matter Plugin Commissioning. - uint32_t timeCount = 0; - while (!Matter.isDeviceCommissioned()) { - delay(100); - if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec - Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); - } - } - Serial.printf("Initial state: %s\r\n", OnOffPlugin.getOnOff() ? "ON" : "OFF"); - OnOffPlugin.updateAccessory(); // configure the Plugin based on initial state - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); - } - - // Check if the button has been pressed - if (digitalRead(buttonPin) == LOW && !button_state) { - // deals with button debouncing - button_time_stamp = millis(); // record the time while the button is pressed. - button_state = true; // pressed. - } - - // Onboard User Button is used to decommission the Matter Node - if (button_state && digitalRead(buttonPin) == HIGH) { - button_state = false; // released - } - - // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node - uint32_t time_diff = millis() - button_time_stamp; - if (button_state && time_diff > decommissioningTimeout) { - Serial.println("Decommissioning the Plugin Matter Accessory. It shall be commissioned again."); - OnOffPlugin.setOnOff(false); // turn the plugin off - Matter.decommission(); - button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so - } -} +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Matter Manager +#include +#include +#include + +// List of Matter Endpoints for this Node +// On/Off Plugin Endpoint +MatterOnOffPlugin OnOffPlugin; + +// it will keep last OnOff state stored, using Preferences +Preferences matterPref; +const char *onOffPrefKey = "OnOff"; + +// set your board Power Relay pin here - this example uses the built-in LED for easy visualization +#ifdef LED_BUILTIN +const uint8_t onoffPin = LED_BUILTIN; +#else +const uint8_t onoffPin = 2; // Set your pin here - usually a power relay +#warning "Do not forget to set the Power Relay pin" +#endif + +// board USER BUTTON pin necessary for Decommissioning +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Matter Protocol Endpoint Callback +bool setPluginOnOff(bool state) { + Serial.printf("User Callback :: New Plugin State = %s\r\n", state ? "ON" : "OFF"); + if (state) { + digitalWrite(onoffPin, HIGH); + } else { + digitalWrite(onoffPin, LOW); + } + // store last OnOff state for when the Plugin is restarted / power goes off + matterPref.putBool(onOffPrefKey, state); + // This callback must return the success state to Matter core + return true; +} + +void setup() { + // Initialize the USER BUTTON + pinMode(buttonPin, INPUT_PULLUP); + // Initialize the Power Relay (plugin) GPIO + pinMode(onoffPin, OUTPUT); + + Serial.begin(115200); + + // We start by connecting to a WiFi network + Serial.print("Connecting to "); + Serial.println(ssid); + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println("\r\nWiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + delay(500); + + // Initialize Matter EndPoint + matterPref.begin("MatterPrefs", false); + bool lastOnOffState = matterPref.getBool(onOffPrefKey, false); + OnOffPlugin.begin(lastOnOffState); + OnOffPlugin.onChange(setPluginOnOff); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + // This may be a restart of a already commissioned Matter accessory + if (Matter.isDeviceCommissioned()) { + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.printf("Initial state: %s\r\n", OnOffPlugin.getOnOff() ? "ON" : "OFF"); + OnOffPlugin.updateAccessory(); // configure the Plugin based on initial state + } +} + +void loop() { + // Check Matter Plugin Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Plugin Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.printf("Initial state: %s\r\n", OnOffPlugin.getOnOff() ? "ON" : "OFF"); + OnOffPlugin.updateAccessory(); // configure the Plugin based on initial state + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } + + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + // Onboard User Button is used to decommission the Matter Node + if (button_state && digitalRead(buttonPin) == HIGH) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Plugin Matter Accessory. It shall be commissioned again."); + OnOffPlugin.setOnOff(false); // turn the plugin off + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } +} From a7e2e64c5bf79ad3370bead3d4b77507382b7263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Fri, 13 Dec 2024 17:07:08 +0100 Subject: [PATCH 092/183] Apply suggestions from code review Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> --- libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp | 2 ++ libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h | 2 ++ libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp | 2 ++ libraries/Zigbee/src/ep/ZigbeeFlowSensor.h | 2 ++ libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h | 2 ++ libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp | 2 ++ libraries/Zigbee/src/ep/ZigbeePressureSensor.h | 2 ++ 7 files changed, 14 insertions(+) diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp index e7623e96a15..b409a5ce6a3 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp @@ -46,6 +46,7 @@ void ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max if(delta > 0) { log_e("Delta reporting is currently not supported by the carbon dioxide sensor"); } + // clang-format off esp_zb_zcl_reporting_info_t reporting_info = { .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, .ep = _endpoint, @@ -72,6 +73,7 @@ void ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max }, .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, }; + // clang-format on esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h index 96d3e7f17c2..72bf63ddfac 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h @@ -9,6 +9,7 @@ #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" +// clang-format off #define ZIGBEE_DEFAULT_CARBON_DIOXIDE_SENSOR_CONFIG() \ { \ .basic_cfg = \ @@ -27,6 +28,7 @@ .max_measured_value = 1.0, \ }, \ } +// clang-format on typedef struct zigbee_carbon_dioxide_sensor_cfg_s { esp_zb_basic_cluster_cfg_t basic_cfg; diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp index 17182a56b5b..38b31e846ef 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp @@ -44,6 +44,7 @@ void ZigbeeFlowSensor::setTolerance(float tolerance) { } void ZigbeeFlowSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { + // clang-format off esp_zb_zcl_reporting_info_t reporting_info = { .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, .ep = _endpoint, @@ -70,6 +71,7 @@ void ZigbeeFlowSensor::setReporting(uint16_t min_interval, uint16_t max_interval }, .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, }; + // clang-format on esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h index 65156369984..d0f624c851a 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h @@ -9,6 +9,7 @@ #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" +// clang-format off #define ZIGBEE_DEFAULT_FLOW_SENSOR_CONFIG() \ { \ .basic_cfg = \ @@ -27,6 +28,7 @@ .max_value = 0x7FFF, \ }, \ } +// clang-format on typedef struct zigbee_flow_sensor_cfg_s { esp_zb_basic_cluster_cfg_t basic_cfg; diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h index 67103d63369..d62ce749629 100644 --- a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h @@ -9,6 +9,7 @@ #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" +// clang-format off #define ZIGBEE_DEFAULT_OCCUPANCY_SENSOR_CONFIG() \ { \ .basic_cfg = \ @@ -27,6 +28,7 @@ .sensor_type_bitmap = (1 << ESP_ZB_ZCL_OCCUPANCY_SENSING_OCCUPANCY_SENSOR_TYPE_PIR), \ }, \ } +// clang-format on typedef struct zigbee_occupancy_sensor_cfg_s { esp_zb_basic_cluster_cfg_t basic_cfg; diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp index 6880a109b46..0421c53eede 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp @@ -41,6 +41,7 @@ void ZigbeePressureSensor::setTolerance(uint16_t tolerance) { } void ZigbeePressureSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) { + // clang-format off esp_zb_zcl_reporting_info_t reporting_info = { .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, .ep = _endpoint, @@ -67,6 +68,7 @@ void ZigbeePressureSensor::setReporting(uint16_t min_interval, uint16_t max_inte }, .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, }; + // clang-format on esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h index 5874cb7ff3e..6439b6fcc88 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h @@ -9,6 +9,7 @@ #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" +// clang-format off #define ZIGBEE_DEFAULT_PRESSURE_SENSOR_CONFIG() \ { \ .basic_cfg = \ @@ -27,6 +28,7 @@ .max_value = ESP_ZB_ZCL_PATTR_RESSURE_MEASUREMENT_MAX_VALUE_DEFAULT_VALUE, \ }, \ } +// clang-format on typedef struct zigbee_pressure_sensor_cfg_s { esp_zb_basic_cluster_cfg_t basic_cfg; From 6bc971c1a368db44f0fde43f4d140958c5b245e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Fri, 13 Dec 2024 17:12:13 +0100 Subject: [PATCH 093/183] fix(zigbee): fix formatting of defines --- .../Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h | 36 +++++++++---------- libraries/Zigbee/src/ep/ZigbeeFlowSensor.h | 36 +++++++++---------- .../Zigbee/src/ep/ZigbeeOccupancySensor.h | 36 +++++++++---------- 3 files changed, 54 insertions(+), 54 deletions(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h index 72bf63ddfac..2faa5ab1aaa 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h @@ -10,24 +10,24 @@ #include "ha/esp_zigbee_ha_standard.h" // clang-format off -#define ZIGBEE_DEFAULT_CARBON_DIOXIDE_SENSOR_CONFIG() \ - { \ - .basic_cfg = \ - { \ - .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ - .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ - }, \ - .identify_cfg = \ - { \ - .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ - }, \ - .carbon_dioxide_meas_cfg = \ - { \ - .measured_value = 0.0, \ - .min_measured_value = 0.0, \ - .max_measured_value = 1.0, \ - }, \ - } +#define ZIGBEE_DEFAULT_CARBON_DIOXIDE_SENSOR_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .carbon_dioxide_meas_cfg = \ + { \ + .measured_value = 0.0, \ + .min_measured_value = 0.0, \ + .max_measured_value = 1.0, \ + }, \ + } // clang-format on typedef struct zigbee_carbon_dioxide_sensor_cfg_s { diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h index d0f624c851a..65e2436fa80 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h @@ -10,24 +10,24 @@ #include "ha/esp_zigbee_ha_standard.h" // clang-format off -#define ZIGBEE_DEFAULT_FLOW_SENSOR_CONFIG() \ - { \ - .basic_cfg = \ - { \ - .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ - .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ - }, \ - .identify_cfg = \ - { \ - .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ - }, \ - .flow_meas_cfg = \ - { \ - .measured_value = 0, \ - .min_value = 0, \ - .max_value = 0x7FFF, \ - }, \ - } +#define ZIGBEE_DEFAULT_FLOW_SENSOR_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .flow_meas_cfg = \ + { \ + .measured_value = 0, \ + .min_value = 0, \ + .max_value = 0x7FFF, \ + }, \ + } // clang-format on typedef struct zigbee_flow_sensor_cfg_s { diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h index d62ce749629..02c0fe24f8b 100644 --- a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h @@ -10,24 +10,24 @@ #include "ha/esp_zigbee_ha_standard.h" // clang-format off -#define ZIGBEE_DEFAULT_OCCUPANCY_SENSOR_CONFIG() \ - { \ - .basic_cfg = \ - { \ - .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ - .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ - }, \ - .identify_cfg = \ - { \ - .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ - }, \ - .occupancy_meas_cfg = \ - { \ - .occupancy = ESP_ZB_ZCL_OCCUPANCY_SENSING_OCCUPANCY_UNOCCUPIED, \ - .sensor_type = ESP_ZB_ZCL_OCCUPANCY_SENSING_OCCUPANCY_SENSOR_TYPE_PIR, \ - .sensor_type_bitmap = (1 << ESP_ZB_ZCL_OCCUPANCY_SENSING_OCCUPANCY_SENSOR_TYPE_PIR), \ - }, \ - } +#define ZIGBEE_DEFAULT_OCCUPANCY_SENSOR_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .occupancy_meas_cfg = \ + { \ + .occupancy = ESP_ZB_ZCL_OCCUPANCY_SENSING_OCCUPANCY_UNOCCUPIED, \ + .sensor_type = ESP_ZB_ZCL_OCCUPANCY_SENSING_OCCUPANCY_SENSOR_TYPE_PIR, \ + .sensor_type_bitmap = (1 << ESP_ZB_ZCL_OCCUPANCY_SENSING_OCCUPANCY_SENSOR_TYPE_PIR), \ + }, \ + } // clang-format on typedef struct zigbee_occupancy_sensor_cfg_s { From a44e45795c510d2c1316b1244fab66d754199fd4 Mon Sep 17 00:00:00 2001 From: FaBjE <5355001+FaBjE@users.noreply.github.com> Date: Fri, 13 Dec 2024 13:45:57 +0100 Subject: [PATCH 094/183] feat(Zigbee): Add Zigbee Dimmable light endpoint class Add a endpoint type class for a dimmable light. Based on a copy of color dimmable light. --- libraries/Zigbee/src/Zigbee.h | 1 + .../Zigbee/src/ep/ZigbeeDimmableLight.cpp | 93 ++++++++++++++++ libraries/Zigbee/src/ep/ZigbeeDimmableLight.h | 103 ++++++++++++++++++ 3 files changed, 197 insertions(+) create mode 100644 libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeDimmableLight.h diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index 98674a9d115..9f09a63320a 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -9,6 +9,7 @@ // Endpoints #include "ep/ZigbeeLight.h" #include "ep/ZigbeeSwitch.h" +#include "ep/ZigbeeDimmableLight.h" #include "ep/ZigbeeColorDimmableLight.h" #include "ep/ZigbeeColorDimmerSwitch.h" #include "ep/ZigbeeTempSensor.h" diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp new file mode 100644 index 00000000000..df268ba8a9e --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp @@ -0,0 +1,93 @@ + +#include "ZigbeeDimmableLight.h" +#if SOC_IEEE802154_SUPPORTED + +#include "esp_zigbee_cluster.h" + +ZigbeeDimmableLight::ZigbeeDimmableLight(uint8_t endpoint) : ZigbeeEP(endpoint) +{ + _device_id = ESP_ZB_HA_DIMMABLE_LIGHT_DEVICE_ID; + + esp_zb_dimmable_light_cfg_t light_cfg = ESP_ZB_DEFAULT_DIMMABLE_LIGHT_CONFIG(); + _cluster_list = esp_zb_dimmable_light_clusters_create(&light_cfg); + + _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_DIMMABLE_LIGHT_DEVICE_ID, .app_device_version = 0}; + + // set default values + _current_state = false; + _current_level = 255; +} + +// set attribute method -> method overridden in child class +void ZigbeeDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) +{ + // check the data and call right method + if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ON_OFF) + { + if (message->attribute.id == ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_BOOL) + { + if (_current_state != *(bool *)message->attribute.data.value) + { + _current_state = *(bool *)message->attribute.data.value; + lightChanged(); + } + return; + } + else + { + log_w("Received message ignored. Attribute ID: %d not supported for On/Off Light", message->attribute.id); + } + } + else if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_LEVEL_CONTROL) + { + if (message->attribute.id == ESP_ZB_ZCL_ATTR_LEVEL_CONTROL_CURRENT_LEVEL_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_U8) + { + if (_current_level != *(uint8_t *)message->attribute.data.value) + { + _current_level = *(uint8_t *)message->attribute.data.value; + lightChanged(); + } + return; + } + else + { + log_w("Received message ignored. Attribute ID: %d not supported for Level Control", message->attribute.id); + // TODO: implement more attributes -> includes/zcl/esp_zigbee_zcl_level.h + } + } + else + { + log_w("Received message ignored. Cluster ID: %d not supported for Color dimmable Light", message->info.cluster); + } +} + +void ZigbeeDimmableLight::lightChanged() +{ + if (_on_light_change) + { + _on_light_change(_current_state, _current_level); + } +} + +esp_zb_cluster_list_t *ZigbeeDimmableLight::esp_zb_dimmable_light_clusters_create(esp_zb_dimmable_light_cfg_t *light_cfg) +{ + esp_zb_attribute_list_t *esp_zb_basic_cluster = esp_zb_basic_cluster_create(&light_cfg->basic_cfg); + esp_zb_attribute_list_t *esp_zb_identify_cluster = esp_zb_identify_cluster_create(&light_cfg->identify_cfg); + esp_zb_attribute_list_t *esp_zb_groups_cluster = esp_zb_groups_cluster_create(&light_cfg->groups_cfg); + esp_zb_attribute_list_t *esp_zb_scenes_cluster = esp_zb_scenes_cluster_create(&light_cfg->scenes_cfg); + esp_zb_attribute_list_t *esp_zb_on_off_cluster = esp_zb_on_off_cluster_create(&light_cfg->on_off_cfg); + esp_zb_attribute_list_t *esp_zb_level_cluster = esp_zb_level_cluster_create(&light_cfg->level_cfg); + + // ------------------------------ Create cluster list ------------------------------ + esp_zb_cluster_list_t *esp_zb_cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(esp_zb_cluster_list, esp_zb_basic_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(esp_zb_cluster_list, esp_zb_identify_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_groups_cluster(esp_zb_cluster_list, esp_zb_groups_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_scenes_cluster(esp_zb_cluster_list, esp_zb_scenes_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_on_off_cluster(esp_zb_cluster_list, esp_zb_on_off_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_level_cluster(esp_zb_cluster_list, esp_zb_level_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + + return esp_zb_cluster_list; +} + +#endif // SOC_IEEE802154_SUPPORTED diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h new file mode 100644 index 00000000000..1d86a37254e --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h @@ -0,0 +1,103 @@ +/* Class of Zigbee On/Off Light endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#if SOC_IEEE802154_SUPPORTED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +/** + * @brief Zigbee HA standard dimmable light device clusters. + * Added here as not supported by ESP Zigbee library. + * + * + */ +typedef struct esp_zb_dimmable_light_cfg_s +{ + esp_zb_basic_cluster_cfg_t basic_cfg; /*!< Basic cluster configuration, @ref esp_zb_basic_cluster_cfg_s */ + esp_zb_identify_cluster_cfg_t identify_cfg; /*!< Identify cluster configuration, @ref esp_zb_identify_cluster_cfg_s */ + esp_zb_groups_cluster_cfg_t groups_cfg; /*!< Groups cluster configuration, @ref esp_zb_groups_cluster_cfg_s */ + esp_zb_scenes_cluster_cfg_t scenes_cfg; /*!< Scenes cluster configuration, @ref esp_zb_scenes_cluster_cfg_s */ + esp_zb_on_off_cluster_cfg_t on_off_cfg; /*!< On off cluster configuration, @ref esp_zb_on_off_cluster_cfg_s */ + esp_zb_level_cluster_cfg_t level_cfg; /*!< Level cluster configuration, @ref esp_zb_level_cluster_cfg_s */ +} esp_zb_dimmable_light_cfg_t; + +/** + * @brief Zigbee HA standard dimmable light device default config value. + * Added here as not supported by ESP Zigbee library. + * + */ +#define ESP_ZB_DEFAULT_DIMMABLE_LIGHT_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .groups_cfg = \ + { \ + .groups_name_support_id = ESP_ZB_ZCL_GROUPS_NAME_SUPPORT_DEFAULT_VALUE, \ + }, \ + .scenes_cfg = \ + { \ + .scenes_count = ESP_ZB_ZCL_SCENES_SCENE_COUNT_DEFAULT_VALUE, \ + .current_scene = ESP_ZB_ZCL_SCENES_CURRENT_SCENE_DEFAULT_VALUE, \ + .current_group = ESP_ZB_ZCL_SCENES_CURRENT_GROUP_DEFAULT_VALUE, \ + .scene_valid = ESP_ZB_ZCL_SCENES_SCENE_VALID_DEFAULT_VALUE, \ + .name_support = ESP_ZB_ZCL_SCENES_NAME_SUPPORT_DEFAULT_VALUE, \ + }, \ + .on_off_cfg = \ + { \ + .on_off = ESP_ZB_ZCL_ON_OFF_ON_OFF_DEFAULT_VALUE, \ + }, \ + .level_cfg = \ + { \ + .current_level = ESP_ZB_ZCL_LEVEL_CONTROL_CURRENT_LEVEL_DEFAULT_VALUE, \ + }, \ + } + +class ZigbeeDimmableLight : public ZigbeeEP +{ +public: + ZigbeeDimmableLight(uint8_t endpoint); + ~ZigbeeDimmableLight(); + + void onLightChange(void (*callback)(bool, uint8_t)) + { + _on_light_change = callback; + } + void restoreLight() + { + lightChanged(); + } + +private: + void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override; + + void lightChanged(); + // callback function to be called on light change (State, Level) + void (*_on_light_change)(bool, uint8_t); + + /** + * @brief Create a standard HA dimmable light cluster list. + * Added here as not supported by ESP Zigbee library. + * + * @note This contains basic, identify, groups, scenes, on-off, level, as server side. + * @param[in] light_cfg Configuration parameters for this cluster lists defined by @ref esp_zb_dimmable_light_cfg_t + * + * @return Pointer to cluster list @ref esp_zb_cluster_list_s + * + */ + esp_zb_cluster_list_t *esp_zb_dimmable_light_clusters_create(esp_zb_dimmable_light_cfg_t *light_cfg); + + bool _current_state; + uint8_t _current_level; +}; + +#endif // SOC_IEEE802154_SUPPORTED From aa0c3da729dae253e6a93e6518900e80a80fd712 Mon Sep 17 00:00:00 2001 From: FaBjE <5355001+FaBjE@users.noreply.github.com> Date: Fri, 13 Dec 2024 17:13:55 +0100 Subject: [PATCH 095/183] feat(Zigbee): Add Zigbee Dimmable light example Add example for a dimmable light. Based on a copy of color dimmable light example. --- .../examples/Zigbee_Dimmable_Light/README.md | 68 +++++++++++ .../Zigbee_Dimmable_Light.ino | 110 ++++++++++++++++++ .../examples/Zigbee_Dimmable_Light/ci.json | 6 + 3 files changed, 184 insertions(+) create mode 100644 libraries/Zigbee/examples/Zigbee_Dimmable_Light/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Dimmable_Light/ci.json diff --git a/libraries/Zigbee/examples/Zigbee_Dimmable_Light/README.md b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/README.md new file mode 100644 index 00000000000..e5bf51b660c --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/README.md @@ -0,0 +1,68 @@ +# Arduino-ESP32 Zigbee Dimmable Light Example + +This example shows how to configure the Zigbee end device and use it as a Home Automation (HA) dimmable light. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## Hardware Required + +* A USB cable for power supply and programming +* Board (ESP32-H2 or ESP32-C6) as Zigbee end device and upload the Zigbee_Dimmable_Light example +* Zigbee network / coordinator (Other board with switch examples or Zigbee2mqtt or ZigbeeHomeAssistant like application) + +### Configure the Project + +Set the LED GPIO by changing the `LED_PIN` definition. By default, the LED_PIN is `RGB_BUILTIN`. + +#### Using Arduino IDE + +To get more information about the Espressif boards see [Espressif Development Kits](https://www.espressif.com/en/products/devkits). + +* Before Compile/Verify, select the correct board: `Tools -> Board`. +* Select the End device Zigbee mode: `Tools -> Zigbee mode: Zigbee ED (end device)` +* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee 4MB with spiffs` +* Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. +* Optional: Set debug level to verbose to see all logs from Zigbee stack: `Tools -> Core Debug Level: Verbose`. + +## Troubleshooting + +If the End device flashed with this example is not connecting to the coordinator, erase the flash of the End device before flashing the example to the board. It is recommended to do this if you re-flash the coordinator. +You can do the following: + +* In the Arduino IDE go to the Tools menu and set `Erase All Flash Before Sketch Upload` to `Enabled`. +* Add to the sketch `Zigbee.factoryReset();` to reset the device and Zigbee stack. + +By default, the coordinator network is closed after rebooting or flashing new firmware. +To open the network you have 2 options: + +* Open network after reboot by setting `Zigbee.setRebootOpenNetwork(time);` before calling `Zigbee.begin();`. +* In application you can anytime call `Zigbee.openNetwork(time);` to open the network for devices to join. + +***Important: Make sure you are using a good quality USB cable and that you have a reliable power source*** + +* **LED not blinking:** Check the wiring connection and the IO selection. +* **Programming Fail:** If the programming/flash procedure fails, try reducing the serial connection speed. +* **COM port not detected:** Check the USB cable and the USB to Serial driver installation. + +If the error persists, you can ask for help at the official [ESP32 forum](https://esp32.com) or see [Contribute](#contribute). + +## Contribute + +To know how to contribute to this project, see [How to contribute.](https://github.com/espressif/arduino-esp32/blob/master/CONTRIBUTING.rst) + +If you have any **feedback** or **issue** to report on this example/library, please open an issue or fix it by creating a new PR. Contributions are more than welcome! + +Before creating a new issue, be sure to try Troubleshooting and check if the same issue was already created by someone else. + +## Resources + +* Official ESP32 Forum: [Link](https://esp32.com) +* Arduino-ESP32 Official Repository: [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) +* ESP32-C6 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf) +* ESP32-H2 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf) +* Official ESP-IDF documentation: [ESP-IDF](https://idf.espressif.com) diff --git a/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino new file mode 100644 index 00000000000..01659cc6a2d --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino @@ -0,0 +1,110 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @brief This example demonstrates Zigbee Dimmable light bulb. + * + * The example demonstrates how to use Zigbee library to create an end device with + * dimmable light end point. + * The light bulb is a Zigbee end device, which is controlled by a Zigbee coordinator. + * + * Proper Zigbee mode must be selected in Tools->Zigbee mode + * and also the correct partition scheme must be selected in Tools->Partition Scheme. + * + * Please check the README.md for instructions and more detailed description. + * + * Created by Jan Procházka (https://github.com/P-R-O-C-H-Y/) + */ + +#ifndef ZIGBEE_MODE_ED +#error "Zigbee end device mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +#define LED_PIN RGB_BUILTIN +#define BUTTON_PIN 9 // C6/H2 Boot button +#define ZIGBEE_LIGHT_ENDPOINT 10 + +ZigbeeDimmableLight zbDimmableLight = ZigbeeDimmableLight(ZIGBEE_LIGHT_ENDPOINT); + +/********************* LED functions **************************/ +void setLight(bool state, uint8_t level) +{ + rgbLedWrite(LED_PIN, level, level, level); +} + +// Create a task on identify call to handle the identify function +void identify(uint16_t time) +{ + static uint8_t blink = 1; + log_d("Identify called for %d seconds", time); + if (time == 0) + { + // If identify time is 0, stop blinking and restore light as it was used for identify + zbDimmableLight.restoreLight(); + return; + } + rgbLedWrite(LED_PIN, 255 * blink, 255 * blink, 255 * blink); + blink = !blink; +} + +/********************* Arduino functions **************************/ +void setup() +{ + // Init RMT and leave light OFF + rgbLedWrite(LED_PIN, 0, 0, 0); + + // Init button for factory reset + pinMode(BUTTON_PIN, INPUT_PULLUP); + + // Set callback function for light change + zbDimmableLight.onLightChange(setLight); + + // Optional: Set callback function for device identify + zbDimmableLight.onIdentify(identify); + + // Optional: Set Zigbee device name and model + zbDimmableLight.setManufacturerAndModel("Espressif", "ZBLightBulb"); + + // Add endpoint to Zigbee Core + log_d("Adding ZigbeeLight endpoint to Zigbee Core"); + Zigbee.addEndpoint(&zbDimmableLight); + + // When all EPs are registered, start Zigbee. By default acts as ZIGBEE_END_DEVICE + log_d("Calling Zigbee.begin()"); + Zigbee.begin(); +} + +void loop() +{ + // Checking button for factory reset + if (digitalRead(BUTTON_PIN) == LOW) + { // Push button pressed + // Key debounce handling + delay(100); + int startTime = millis(); + while (digitalRead(BUTTON_PIN) == LOW) + { + delay(50); + if ((millis() - startTime) > 3000) + { + // If key pressed for more than 3secs, factory reset Zigbee and reboot + Serial.printf("Resetting Zigbee to factory settings, reboot.\n"); + Zigbee.factoryReset(); + } + } + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_Dimmable_Light/ci.json b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/ci.json new file mode 100644 index 00000000000..7b7ccef8ed7 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y" + ] +} From 538c57a9945d303d678145272a07962e5b8c0b8b Mon Sep 17 00:00:00 2001 From: FaBjE <5355001+FaBjE@users.noreply.github.com> Date: Fri, 13 Dec 2024 19:09:36 +0100 Subject: [PATCH 096/183] feat(Zigbee): Update Zigbee Dimmable light example to 3.1.x features --- .../Zigbee_Dimmable_Light.ino | 50 +++++++++++++------ .../Zigbee/src/ep/ZigbeeDimmableLight.cpp | 31 +++++++++++- libraries/Zigbee/src/ep/ZigbeeDimmableLight.h | 16 +++++- 3 files changed, 81 insertions(+), 16 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino index 01659cc6a2d..dec633975d3 100644 --- a/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino +++ b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino @@ -33,16 +33,22 @@ #include "Zigbee.h" -#define LED_PIN RGB_BUILTIN -#define BUTTON_PIN 9 // C6/H2 Boot button +/* Zigbee dimmable light configuration */ #define ZIGBEE_LIGHT_ENDPOINT 10 +uint8_t led = RGB_BUILTIN; +uint8_t button = BOOT_PIN; ZigbeeDimmableLight zbDimmableLight = ZigbeeDimmableLight(ZIGBEE_LIGHT_ENDPOINT); -/********************* LED functions **************************/ +/********************* RGB LED functions **************************/ void setLight(bool state, uint8_t level) { - rgbLedWrite(LED_PIN, level, level, level); + if (!state) + { + rgbLedWrite(led, 0, 0, 0); + return; + } + rgbLedWrite(led, level, level, level); } // Create a task on identify call to handle the identify function @@ -56,18 +62,20 @@ void identify(uint16_t time) zbDimmableLight.restoreLight(); return; } - rgbLedWrite(LED_PIN, 255 * blink, 255 * blink, 255 * blink); + rgbLedWrite(led, 255 * blink, 255 * blink, 255 * blink); blink = !blink; } /********************* Arduino functions **************************/ void setup() { + Serial.begin(115200); + // Init RMT and leave light OFF - rgbLedWrite(LED_PIN, 0, 0, 0); + rgbLedWrite(led, 0, 0, 0); // Init button for factory reset - pinMode(BUTTON_PIN, INPUT_PULLUP); + pinMode(button, INPUT_PULLUP); // Set callback function for light change zbDimmableLight.onLightChange(setLight); @@ -79,32 +87,46 @@ void setup() zbDimmableLight.setManufacturerAndModel("Espressif", "ZBLightBulb"); // Add endpoint to Zigbee Core - log_d("Adding ZigbeeLight endpoint to Zigbee Core"); + Serial.println("Adding ZigbeeLight endpoint to Zigbee Core"); Zigbee.addEndpoint(&zbDimmableLight); - // When all EPs are registered, start Zigbee. By default acts as ZIGBEE_END_DEVICE - log_d("Calling Zigbee.begin()"); - Zigbee.begin(); + // When all EPs are registered, start Zigbee in End Device mode + if (!Zigbee.begin()) + { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) + { + Serial.print("."); + delay(100); + } + Serial.println(); } void loop() { // Checking button for factory reset - if (digitalRead(BUTTON_PIN) == LOW) + if (digitalRead(button) == LOW) { // Push button pressed // Key debounce handling delay(100); int startTime = millis(); - while (digitalRead(BUTTON_PIN) == LOW) + while (digitalRead(button) == LOW) { delay(50); if ((millis() - startTime) > 3000) { // If key pressed for more than 3secs, factory reset Zigbee and reboot - Serial.printf("Resetting Zigbee to factory settings, reboot.\n"); + Serial.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); Zigbee.factoryReset(); } } + // Increase blightness by 50 every time the button is pressed + zbDimmableLight.setLightLevel(zbDimmableLight.getLightLevel() + 50); } delay(100); } diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp index df268ba8a9e..40edc5f74ba 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp @@ -57,7 +57,7 @@ void ZigbeeDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_message } else { - log_w("Received message ignored. Cluster ID: %d not supported for Color dimmable Light", message->info.cluster); + log_w("Received message ignored. Cluster ID: %d not supported for dimmable Light", message->info.cluster); } } @@ -69,6 +69,35 @@ void ZigbeeDimmableLight::lightChanged() } } +void ZigbeeDimmableLight::setLight(bool state, uint8_t level) +{ + // Update all attributes + _current_state = state; + _current_level = level; + lightChanged(); + + log_v("Updating on/off light state to %d", state); + /* Update light clusters */ + esp_zb_lock_acquire(portMAX_DELAY); + // set on/off state + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_ON_OFF, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID, &_current_state, false); + // set level + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_LEVEL_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_LEVEL_CONTROL_CURRENT_LEVEL_ID, &_current_level, false); + esp_zb_lock_release(); +} + +void ZigbeeDimmableLight::setLightState(bool state) +{ + setLight(state, _current_level); +} + +void ZigbeeDimmableLight::setLightLevel(uint8_t level) +{ + setLight(_current_state, level); +} + esp_zb_cluster_list_t *ZigbeeDimmableLight::esp_zb_dimmable_light_clusters_create(esp_zb_dimmable_light_cfg_t *light_cfg) { esp_zb_attribute_list_t *esp_zb_basic_cluster = esp_zb_basic_cluster_create(&light_cfg->basic_cfg); diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h index 1d86a37254e..df0f4324cd2 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h @@ -3,7 +3,8 @@ #pragma once #include "soc/soc_caps.h" -#if SOC_IEEE802154_SUPPORTED +#include "sdkconfig.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -77,6 +78,19 @@ class ZigbeeDimmableLight : public ZigbeeEP lightChanged(); } + void setLightState(bool state); + void setLightLevel(uint8_t level); + void setLight(bool state, uint8_t level); + + bool getLightState() + { + return _current_state; + } + uint8_t getLightLevel() + { + return _current_level; + } + private: void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override; From a0d57bb6d0d55472f15001fe7225c62b4b0ef0cd Mon Sep 17 00:00:00 2001 From: FaBjE <5355001+FaBjE@users.noreply.github.com> Date: Fri, 13 Dec 2024 19:16:06 +0100 Subject: [PATCH 097/183] feat(Zigbee): Update Zigbee Dimmable light example config/define names --- .../Zigbee/src/ep/ZigbeeDimmableLight.cpp | 4 +- libraries/Zigbee/src/ep/ZigbeeDimmableLight.h | 88 +++++++++---------- 2 files changed, 43 insertions(+), 49 deletions(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp index 40edc5f74ba..e39cd36844d 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp @@ -8,7 +8,7 @@ ZigbeeDimmableLight::ZigbeeDimmableLight(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_DIMMABLE_LIGHT_DEVICE_ID; - esp_zb_dimmable_light_cfg_t light_cfg = ESP_ZB_DEFAULT_DIMMABLE_LIGHT_CONFIG(); + zigbee_dimmable_light_cfg_t light_cfg = ZIGBEE_DEFAULT_DIMMABLE_LIGHT_CONFIG(); _cluster_list = esp_zb_dimmable_light_clusters_create(&light_cfg); _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_DIMMABLE_LIGHT_DEVICE_ID, .app_device_version = 0}; @@ -98,7 +98,7 @@ void ZigbeeDimmableLight::setLightLevel(uint8_t level) setLight(_current_state, level); } -esp_zb_cluster_list_t *ZigbeeDimmableLight::esp_zb_dimmable_light_clusters_create(esp_zb_dimmable_light_cfg_t *light_cfg) +esp_zb_cluster_list_t *ZigbeeDimmableLight::esp_zb_dimmable_light_clusters_create(zigbee_dimmable_light_cfg_t *light_cfg) { esp_zb_attribute_list_t *esp_zb_basic_cluster = esp_zb_basic_cluster_create(&light_cfg->basic_cfg); esp_zb_attribute_list_t *esp_zb_identify_cluster = esp_zb_identify_cluster_create(&light_cfg->identify_cfg); diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h index df0f4324cd2..7e16d11b93b 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h @@ -15,66 +15,62 @@ * * */ -typedef struct esp_zb_dimmable_light_cfg_s -{ +typedef struct zigbee_dimmable_light_cfg_s { esp_zb_basic_cluster_cfg_t basic_cfg; /*!< Basic cluster configuration, @ref esp_zb_basic_cluster_cfg_s */ esp_zb_identify_cluster_cfg_t identify_cfg; /*!< Identify cluster configuration, @ref esp_zb_identify_cluster_cfg_s */ esp_zb_groups_cluster_cfg_t groups_cfg; /*!< Groups cluster configuration, @ref esp_zb_groups_cluster_cfg_s */ esp_zb_scenes_cluster_cfg_t scenes_cfg; /*!< Scenes cluster configuration, @ref esp_zb_scenes_cluster_cfg_s */ esp_zb_on_off_cluster_cfg_t on_off_cfg; /*!< On off cluster configuration, @ref esp_zb_on_off_cluster_cfg_s */ esp_zb_level_cluster_cfg_t level_cfg; /*!< Level cluster configuration, @ref esp_zb_level_cluster_cfg_s */ -} esp_zb_dimmable_light_cfg_t; +} zigbee_dimmable_light_cfg_t; /** * @brief Zigbee HA standard dimmable light device default config value. * Added here as not supported by ESP Zigbee library. * */ -#define ESP_ZB_DEFAULT_DIMMABLE_LIGHT_CONFIG() \ - { \ - .basic_cfg = \ - { \ - .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ - .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ - }, \ - .identify_cfg = \ - { \ - .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ - }, \ - .groups_cfg = \ - { \ - .groups_name_support_id = ESP_ZB_ZCL_GROUPS_NAME_SUPPORT_DEFAULT_VALUE, \ - }, \ - .scenes_cfg = \ - { \ - .scenes_count = ESP_ZB_ZCL_SCENES_SCENE_COUNT_DEFAULT_VALUE, \ - .current_scene = ESP_ZB_ZCL_SCENES_CURRENT_SCENE_DEFAULT_VALUE, \ - .current_group = ESP_ZB_ZCL_SCENES_CURRENT_GROUP_DEFAULT_VALUE, \ - .scene_valid = ESP_ZB_ZCL_SCENES_SCENE_VALID_DEFAULT_VALUE, \ - .name_support = ESP_ZB_ZCL_SCENES_NAME_SUPPORT_DEFAULT_VALUE, \ - }, \ - .on_off_cfg = \ - { \ - .on_off = ESP_ZB_ZCL_ON_OFF_ON_OFF_DEFAULT_VALUE, \ - }, \ - .level_cfg = \ - { \ - .current_level = ESP_ZB_ZCL_LEVEL_CONTROL_CURRENT_LEVEL_DEFAULT_VALUE, \ - }, \ +#define ZIGBEE_DEFAULT_DIMMABLE_LIGHT_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .groups_cfg = \ + { \ + .groups_name_support_id = ESP_ZB_ZCL_GROUPS_NAME_SUPPORT_DEFAULT_VALUE, \ + }, \ + .scenes_cfg = \ + { \ + .scenes_count = ESP_ZB_ZCL_SCENES_SCENE_COUNT_DEFAULT_VALUE, \ + .current_scene = ESP_ZB_ZCL_SCENES_CURRENT_SCENE_DEFAULT_VALUE, \ + .current_group = ESP_ZB_ZCL_SCENES_CURRENT_GROUP_DEFAULT_VALUE, \ + .scene_valid = ESP_ZB_ZCL_SCENES_SCENE_VALID_DEFAULT_VALUE, \ + .name_support = ESP_ZB_ZCL_SCENES_NAME_SUPPORT_DEFAULT_VALUE, \ + }, \ + .on_off_cfg = \ + { \ + .on_off = ESP_ZB_ZCL_ON_OFF_ON_OFF_DEFAULT_VALUE, \ + }, \ + .level_cfg = \ + { \ + .current_level = ESP_ZB_ZCL_LEVEL_CONTROL_CURRENT_LEVEL_DEFAULT_VALUE, \ + }, \ } -class ZigbeeDimmableLight : public ZigbeeEP -{ +class ZigbeeDimmableLight : public ZigbeeEP { public: ZigbeeDimmableLight(uint8_t endpoint); ~ZigbeeDimmableLight(); - void onLightChange(void (*callback)(bool, uint8_t)) - { + void onLightChange(void (*callback)(bool, uint8_t)) { _on_light_change = callback; } - void restoreLight() - { + void restoreLight() { lightChanged(); } @@ -82,12 +78,10 @@ class ZigbeeDimmableLight : public ZigbeeEP void setLightLevel(uint8_t level); void setLight(bool state, uint8_t level); - bool getLightState() - { + bool getLightState() { return _current_state; } - uint8_t getLightLevel() - { + uint8_t getLightLevel() { return _current_level; } @@ -103,15 +97,15 @@ class ZigbeeDimmableLight : public ZigbeeEP * Added here as not supported by ESP Zigbee library. * * @note This contains basic, identify, groups, scenes, on-off, level, as server side. - * @param[in] light_cfg Configuration parameters for this cluster lists defined by @ref esp_zb_dimmable_light_cfg_t + * @param[in] light_cfg Configuration parameters for this cluster lists defined by @ref zigbee_dimmable_light_cfg_t * * @return Pointer to cluster list @ref esp_zb_cluster_list_s * */ - esp_zb_cluster_list_t *esp_zb_dimmable_light_clusters_create(esp_zb_dimmable_light_cfg_t *light_cfg); + esp_zb_cluster_list_t *esp_zb_dimmable_light_clusters_create(zigbee_dimmable_light_cfg_t *light_cfg); bool _current_state; uint8_t _current_level; }; -#endif // SOC_IEEE802154_SUPPORTED +#endif // SOC_IEEE802154_SUPPORTED From b6d0553fa55db503d0fc66e2005c1d09e295c574 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 22:26:35 +0000 Subject: [PATCH 098/183] ci(pre-commit): Apply automatic fixes --- .../Zigbee_CarbonDioxide_Sensor.ino | 2 +- .../Zigbee_Occupancy_Sensor/README.md | 2 +- .../Zigbee_Occupancy_Sensor.ino | 2 +- .../Zigbee_Pressure_Flow_Sensor.ino | 4 +- .../src/ep/ZigbeeCarbonDioxideSensor.cpp | 40 +++++++++---------- .../Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h | 6 +-- libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp | 25 +++++------- libraries/Zigbee/src/ep/ZigbeeFlowSensor.h | 6 +-- .../Zigbee/src/ep/ZigbeeOccupancySensor.cpp | 25 +++++------- .../Zigbee/src/ep/ZigbeeOccupancySensor.h | 6 +-- .../Zigbee/src/ep/ZigbeePressureSensor.cpp | 25 +++++------- .../Zigbee/src/ep/ZigbeePressureSensor.h | 6 +-- libraries/Zigbee/src/ep/ZigbeeTempSensor.h | 2 - 13 files changed, 70 insertions(+), 81 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/Zigbee_CarbonDioxide_Sensor.ino b/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/Zigbee_CarbonDioxide_Sensor.ino index 4a987826597..47b9a05493f 100644 --- a/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/Zigbee_CarbonDioxide_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/Zigbee_CarbonDioxide_Sensor.ino @@ -81,7 +81,7 @@ void loop() { // Read carbon dioxide sensor every 2s if (!(timeCounter++ % 20)) { // delaying for 100ms x 20 = 2s // Read sensor value - here is chip temperature used + 300 as a dummy value for demonstration - uint16_t carbon_dioxide_value = 300+(uint16_t)temperatureRead(); + uint16_t carbon_dioxide_value = 300 + (uint16_t)temperatureRead(); Serial.printf("Updating carbon dioxide sensor value to %d ppm\r\n", carbon_dioxide_value); zbCarbonDioxideSensor.setCarbonDioxide(carbon_dioxide_value); } diff --git a/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/README.md index 0e668775f5c..0c5dcd013f2 100644 --- a/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/README.md +++ b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/README.md @@ -30,7 +30,7 @@ To get more information about the Espressif boards see [Espressif Development Ki ## Troubleshooting -If the End device flashed with this example is not connecting to the coordinator, erase the flash of the End device before flashing the example to the board. +If the End device flashed with this example is not connecting to the coordinator, erase the flash of the End device before flashing the example to the board. ***Important: Make sure you are using a good quality USB cable and that you have a reliable power source*** diff --git a/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/Zigbee_Occupancy_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/Zigbee_Occupancy_Sensor.ino index fa0bb749c8f..46afdf3d273 100644 --- a/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/Zigbee_Occupancy_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/Zigbee_Occupancy_Sensor.ino @@ -73,7 +73,7 @@ void setup() { void loop() { // Checking PIR sensor for occupancy change static bool occupancy = false; - if(digitalRead(sensor_pin) == HIGH && !occupancy) { + if (digitalRead(sensor_pin) == HIGH && !occupancy) { // Update occupancy sensor value zbOccupancySensor.setOccupancy(true); zbOccupancySensor.report(); diff --git a/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino index 9a28534cbd2..a652a22c493 100644 --- a/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino @@ -33,7 +33,7 @@ #include "Zigbee.h" /* Zigbee flow + pressure sensor configuration */ -#define FLOW_SENSOR_ENDPOINT_NUMBER 10 +#define FLOW_SENSOR_ENDPOINT_NUMBER 10 #define PRESSURE_SENSOR_ENDPOINT_NUMBER 11 uint8_t button = BOOT_PIN; @@ -100,7 +100,7 @@ void loop() { // Read flow and pressure sensors every 2s if (!(timeCounter++ % 20)) { // delaying for 100ms x 20 = 2s float flow_value = temperatureRead(); - uint16_t pressure_value = (uint16_t)temperatureRead()*100; //*100 for demonstration so the value is in 1000-3000hPa + uint16_t pressure_value = (uint16_t)temperatureRead() * 100; //*100 for demonstration so the value is in 1000-3000hPa Serial.printf("Updating flow sensor value to %.2f m3/h\r\n", flow_value); zbFlowSensor.setFlow(flow_value); Serial.printf("Updating pressure sensor value to %d hPa\r\n", pressure_value); diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp index b409a5ce6a3..89454c057e3 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp @@ -1,17 +1,18 @@ #include "ZigbeeCarbonDioxideSensor.h" #if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED -esp_zb_cluster_list_t *zigbee_carbon_dioxide_sensor_clusters_create(zigbee_carbon_dioxide_sensor_cfg_t *carbon_dioxide_sensor) -{ - esp_zb_basic_cluster_cfg_t *basic_cfg = carbon_dioxide_sensor ? &(carbon_dioxide_sensor->basic_cfg) : NULL; - esp_zb_identify_cluster_cfg_t *identify_cfg = carbon_dioxide_sensor ? &(carbon_dioxide_sensor->identify_cfg) : NULL; - esp_zb_carbon_dioxide_measurement_cluster_cfg_t *carbon_dioxide_meas_cfg = carbon_dioxide_sensor ? &(carbon_dioxide_sensor->carbon_dioxide_meas_cfg) : NULL; - esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); - esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_carbon_dioxide_measurement_cluster(cluster_list, esp_zb_carbon_dioxide_measurement_cluster_create(carbon_dioxide_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - return cluster_list; +esp_zb_cluster_list_t *zigbee_carbon_dioxide_sensor_clusters_create(zigbee_carbon_dioxide_sensor_cfg_t *carbon_dioxide_sensor) { + esp_zb_basic_cluster_cfg_t *basic_cfg = carbon_dioxide_sensor ? &(carbon_dioxide_sensor->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = carbon_dioxide_sensor ? &(carbon_dioxide_sensor->identify_cfg) : NULL; + esp_zb_carbon_dioxide_measurement_cluster_cfg_t *carbon_dioxide_meas_cfg = carbon_dioxide_sensor ? &(carbon_dioxide_sensor->carbon_dioxide_meas_cfg) : NULL; + esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_carbon_dioxide_measurement_cluster( + cluster_list, esp_zb_carbon_dioxide_measurement_cluster_create(carbon_dioxide_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE + ); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + return cluster_list; } ZigbeeCarbonDioxideSensor::ZigbeeCarbonDioxideSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { @@ -21,14 +22,12 @@ ZigbeeCarbonDioxideSensor::ZigbeeCarbonDioxideSensor(uint8_t endpoint) : ZigbeeE zigbee_carbon_dioxide_sensor_cfg_t carbon_dioxide_sensor_cfg = ZIGBEE_DEFAULT_CARBON_DIOXIDE_SENSOR_CONFIG(); _cluster_list = zigbee_carbon_dioxide_sensor_clusters_create(&carbon_dioxide_sensor_cfg); - _ep_config = { - .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0 - }; + _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0}; } void ZigbeeCarbonDioxideSensor::setMinMaxValue(float min, float max) { - float zb_min = min/1000000.0f; - float zb_max = max/1000000.0f; + float zb_min = min / 1000000.0f; + float zb_max = max / 1000000.0f; esp_zb_attribute_list_t *carbon_dioxide_measure_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_CARBON_DIOXIDE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); esp_zb_cluster_update_attr(carbon_dioxide_measure_cluster, ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&zb_min); @@ -36,14 +35,14 @@ void ZigbeeCarbonDioxideSensor::setMinMaxValue(float min, float max) { } void ZigbeeCarbonDioxideSensor::setTolerance(float tolerance) { - float zb_tolerance = tolerance/1000000.0f; + float zb_tolerance = tolerance / 1000000.0f; esp_zb_attribute_list_t *carbon_dioxide_measure_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_CARBON_DIOXIDE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); esp_zb_temperature_meas_cluster_add_attr(carbon_dioxide_measure_cluster, ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); } void ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) { - if(delta > 0) { + if (delta > 0) { log_e("Delta reporting is currently not supported by the carbon dioxide sensor"); } // clang-format off @@ -80,13 +79,14 @@ void ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max } void ZigbeeCarbonDioxideSensor::setCarbonDioxide(float carbon_dioxide) { - float zb_carbon_dioxide = carbon_dioxide/1000000.0f; + float zb_carbon_dioxide = carbon_dioxide / 1000000.0f; log_v("Updating carbon dioxide sensor value..."); /* Update carbon dioxide sensor measured value */ log_d("Setting carbon dioxide to %0.1f", carbon_dioxide); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_set_attribute_val( - _endpoint, ESP_ZB_ZCL_CLUSTER_ID_CARBON_DIOXIDE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MEASURED_VALUE_ID, &zb_carbon_dioxide, false + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_CARBON_DIOXIDE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MEASURED_VALUE_ID, + &zb_carbon_dioxide, false ); esp_zb_lock_release(); } diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h index 2faa5ab1aaa..71c353d4695 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h @@ -31,9 +31,9 @@ // clang-format on typedef struct zigbee_carbon_dioxide_sensor_cfg_s { - esp_zb_basic_cluster_cfg_t basic_cfg; - esp_zb_identify_cluster_cfg_t identify_cfg; - esp_zb_carbon_dioxide_measurement_cluster_cfg_t carbon_dioxide_meas_cfg; + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_carbon_dioxide_measurement_cluster_cfg_t carbon_dioxide_meas_cfg; } zigbee_carbon_dioxide_sensor_cfg_t; class ZigbeeCarbonDioxideSensor : public ZigbeeEP { diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp index 38b31e846ef..6adf8172194 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp @@ -1,17 +1,16 @@ #include "ZigbeeFlowSensor.h" #if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED -esp_zb_cluster_list_t *zigbee_flow_sensor_clusters_create(zigbee_flow_sensor_cfg_t *flow_sensor) -{ - esp_zb_basic_cluster_cfg_t *basic_cfg = flow_sensor ? &(flow_sensor->basic_cfg) : NULL; - esp_zb_identify_cluster_cfg_t *identify_cfg = flow_sensor ? &(flow_sensor->identify_cfg) : NULL; - esp_zb_flow_meas_cluster_cfg_t *flow_meas_cfg = flow_sensor ? &(flow_sensor->flow_meas_cfg) : NULL; - esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); - esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_flow_meas_cluster(cluster_list, esp_zb_flow_meas_cluster_create(flow_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - return cluster_list; +esp_zb_cluster_list_t *zigbee_flow_sensor_clusters_create(zigbee_flow_sensor_cfg_t *flow_sensor) { + esp_zb_basic_cluster_cfg_t *basic_cfg = flow_sensor ? &(flow_sensor->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = flow_sensor ? &(flow_sensor->identify_cfg) : NULL; + esp_zb_flow_meas_cluster_cfg_t *flow_meas_cfg = flow_sensor ? &(flow_sensor->flow_meas_cfg) : NULL; + esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_flow_meas_cluster(cluster_list, esp_zb_flow_meas_cluster_create(flow_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + return cluster_list; } ZigbeeFlowSensor::ZigbeeFlowSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { @@ -21,9 +20,7 @@ ZigbeeFlowSensor::ZigbeeFlowSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { zigbee_flow_sensor_cfg_t flow_sensor_cfg = ZIGBEE_DEFAULT_FLOW_SENSOR_CONFIG(); _cluster_list = zigbee_flow_sensor_clusters_create(&flow_sensor_cfg); - _ep_config = { - .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0 - }; + _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0}; } void ZigbeeFlowSensor::setMinMaxValue(float min, float max) { diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h index 65e2436fa80..3514e2fcc1b 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h @@ -31,9 +31,9 @@ // clang-format on typedef struct zigbee_flow_sensor_cfg_s { - esp_zb_basic_cluster_cfg_t basic_cfg; - esp_zb_identify_cluster_cfg_t identify_cfg; - esp_zb_flow_meas_cluster_cfg_t flow_meas_cfg; + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_flow_meas_cluster_cfg_t flow_meas_cfg; } zigbee_flow_sensor_cfg_t; class ZigbeeFlowSensor : public ZigbeeEP { diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp index cbc475c8f7e..3a7acee040c 100644 --- a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp @@ -1,17 +1,16 @@ #include "ZigbeeOccupancySensor.h" #if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED -esp_zb_cluster_list_t *zigbee_occupancy_sensor_clusters_create(zigbee_occupancy_sensor_cfg_t *occupancy_sensor) -{ - esp_zb_basic_cluster_cfg_t *basic_cfg = occupancy_sensor ? &(occupancy_sensor->basic_cfg) : NULL; - esp_zb_identify_cluster_cfg_t *identify_cfg = occupancy_sensor ? &(occupancy_sensor->identify_cfg) : NULL; - esp_zb_occupancy_sensing_cluster_cfg_t *occupancy_meas_cfg = occupancy_sensor ? &(occupancy_sensor->occupancy_meas_cfg) : NULL; - esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); - esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_occupancy_sensing_cluster(cluster_list, esp_zb_occupancy_sensing_cluster_create(occupancy_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - return cluster_list; +esp_zb_cluster_list_t *zigbee_occupancy_sensor_clusters_create(zigbee_occupancy_sensor_cfg_t *occupancy_sensor) { + esp_zb_basic_cluster_cfg_t *basic_cfg = occupancy_sensor ? &(occupancy_sensor->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = occupancy_sensor ? &(occupancy_sensor->identify_cfg) : NULL; + esp_zb_occupancy_sensing_cluster_cfg_t *occupancy_meas_cfg = occupancy_sensor ? &(occupancy_sensor->occupancy_meas_cfg) : NULL; + esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_occupancy_sensing_cluster(cluster_list, esp_zb_occupancy_sensing_cluster_create(occupancy_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + return cluster_list; } ZigbeeOccupancySensor::ZigbeeOccupancySensor(uint8_t endpoint) : ZigbeeEP(endpoint) { @@ -21,9 +20,7 @@ ZigbeeOccupancySensor::ZigbeeOccupancySensor(uint8_t endpoint) : ZigbeeEP(endpoi zigbee_occupancy_sensor_cfg_t occupancy_sensor_cfg = ZIGBEE_DEFAULT_OCCUPANCY_SENSOR_CONFIG(); _cluster_list = zigbee_occupancy_sensor_clusters_create(&occupancy_sensor_cfg); - _ep_config = { - .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0 - }; + _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0}; } void ZigbeeOccupancySensor::setSensorType(uint8_t sensor_type) { diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h index 02c0fe24f8b..e4b25c063e5 100644 --- a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h @@ -31,9 +31,9 @@ // clang-format on typedef struct zigbee_occupancy_sensor_cfg_s { - esp_zb_basic_cluster_cfg_t basic_cfg; - esp_zb_identify_cluster_cfg_t identify_cfg; - esp_zb_occupancy_sensing_cluster_cfg_t occupancy_meas_cfg; + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_occupancy_sensing_cluster_cfg_t occupancy_meas_cfg; } zigbee_occupancy_sensor_cfg_t; class ZigbeeOccupancySensor : public ZigbeeEP { diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp index 0421c53eede..9415502215d 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp @@ -1,17 +1,16 @@ #include "ZigbeePressureSensor.h" #if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED -esp_zb_cluster_list_t *zigbee_pressure_sensor_clusters_create(zigbee_pressure_sensor_cfg_t *pressure_sensor) -{ - esp_zb_basic_cluster_cfg_t *basic_cfg = pressure_sensor ? &(pressure_sensor->basic_cfg) : NULL; - esp_zb_identify_cluster_cfg_t *identify_cfg = pressure_sensor ? &(pressure_sensor->identify_cfg) : NULL; - esp_zb_pressure_meas_cluster_cfg_t *pressure_meas_cfg = pressure_sensor ? &(pressure_sensor->pressure_meas_cfg) : NULL; - esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); - esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_pressure_meas_cluster(cluster_list, esp_zb_pressure_meas_cluster_create(pressure_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - return cluster_list; +esp_zb_cluster_list_t *zigbee_pressure_sensor_clusters_create(zigbee_pressure_sensor_cfg_t *pressure_sensor) { + esp_zb_basic_cluster_cfg_t *basic_cfg = pressure_sensor ? &(pressure_sensor->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = pressure_sensor ? &(pressure_sensor->identify_cfg) : NULL; + esp_zb_pressure_meas_cluster_cfg_t *pressure_meas_cfg = pressure_sensor ? &(pressure_sensor->pressure_meas_cfg) : NULL; + esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_pressure_meas_cluster(cluster_list, esp_zb_pressure_meas_cluster_create(pressure_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + return cluster_list; } ZigbeePressureSensor::ZigbeePressureSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { @@ -21,9 +20,7 @@ ZigbeePressureSensor::ZigbeePressureSensor(uint8_t endpoint) : ZigbeeEP(endpoint zigbee_pressure_sensor_cfg_t presssure_sensor_cfg = ZIGBEE_DEFAULT_PRESSURE_SENSOR_CONFIG(); _cluster_list = zigbee_pressure_sensor_clusters_create(&presssure_sensor_cfg); - _ep_config = { - .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0 - }; + _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0}; } void ZigbeePressureSensor::setMinMaxValue(int16_t min, int16_t max) { diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h index 6439b6fcc88..f088c033bb9 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h @@ -31,9 +31,9 @@ // clang-format on typedef struct zigbee_pressure_sensor_cfg_s { - esp_zb_basic_cluster_cfg_t basic_cfg; - esp_zb_identify_cluster_cfg_t identify_cfg; - esp_zb_pressure_meas_cluster_cfg_t pressure_meas_cfg; + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_pressure_meas_cluster_cfg_t pressure_meas_cfg; } zigbee_pressure_sensor_cfg_t; class ZigbeePressureSensor : public ZigbeeEP { diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.h b/libraries/Zigbee/src/ep/ZigbeeTempSensor.h index 9b074ba0ae1..2951d4b7628 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.h @@ -46,8 +46,6 @@ class ZigbeeTempSensor : public ZigbeeEP { private: bool _humidity_sensor; - }; - #endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED From af541a5c14bd16c781160718c5a0223eeaacca1d Mon Sep 17 00:00:00 2001 From: FaBjE <5355001+FaBjE@users.noreply.github.com> Date: Sat, 14 Dec 2024 11:16:26 +0100 Subject: [PATCH 099/183] feat(Zigbee): Add Zigbee Dimmable light to CMakeLists.txt --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 322824f11ab..58fc3301518 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -275,6 +275,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ZigbeeHandlers.cpp libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp + libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp libraries/Zigbee/src/ep/ZigbeeLight.cpp libraries/Zigbee/src/ep/ZigbeeSwitch.cpp libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp From 42f9cfca60bd4efae6eccbc5ee0a08d0f10dca4b Mon Sep 17 00:00:00 2001 From: FaBjE <5355001+FaBjE@users.noreply.github.com> Date: Sat, 14 Dec 2024 16:39:32 +0100 Subject: [PATCH 100/183] feat(Zigbee): Add additional zigbee enabled check --- libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp index e39cd36844d..355847c8d02 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp @@ -1,6 +1,6 @@ #include "ZigbeeDimmableLight.h" -#if SOC_IEEE802154_SUPPORTED +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED #include "esp_zigbee_cluster.h" From ff7e50482a68ef55cd32c7b3b29f2143f3e0895e Mon Sep 17 00:00:00 2001 From: FaBjE <5355001+FaBjE@users.noreply.github.com> Date: Sat, 14 Dec 2024 17:57:00 +0100 Subject: [PATCH 101/183] feat(Zigbee): Applied formatter + add formatter protection As suggested by code review --- libraries/Zigbee/src/ep/ZigbeeDimmableLight.h | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h index 7e16d11b93b..4c92899eb5e 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h @@ -15,7 +15,8 @@ * * */ -typedef struct zigbee_dimmable_light_cfg_s { +typedef struct zigbee_dimmable_light_cfg_s +{ esp_zb_basic_cluster_cfg_t basic_cfg; /*!< Basic cluster configuration, @ref esp_zb_basic_cluster_cfg_s */ esp_zb_identify_cluster_cfg_t identify_cfg; /*!< Identify cluster configuration, @ref esp_zb_identify_cluster_cfg_s */ esp_zb_groups_cluster_cfg_t groups_cfg; /*!< Groups cluster configuration, @ref esp_zb_groups_cluster_cfg_s */ @@ -29,6 +30,7 @@ typedef struct zigbee_dimmable_light_cfg_s { * Added here as not supported by ESP Zigbee library. * */ +// clang-format off #define ZIGBEE_DEFAULT_DIMMABLE_LIGHT_CONFIG() \ { \ .basic_cfg = \ @@ -61,16 +63,20 @@ typedef struct zigbee_dimmable_light_cfg_s { .current_level = ESP_ZB_ZCL_LEVEL_CONTROL_CURRENT_LEVEL_DEFAULT_VALUE, \ }, \ } +// clang-format on -class ZigbeeDimmableLight : public ZigbeeEP { +class ZigbeeDimmableLight : public ZigbeeEP +{ public: ZigbeeDimmableLight(uint8_t endpoint); ~ZigbeeDimmableLight(); - void onLightChange(void (*callback)(bool, uint8_t)) { + void onLightChange(void (*callback)(bool, uint8_t)) + { _on_light_change = callback; } - void restoreLight() { + void restoreLight() + { lightChanged(); } @@ -78,10 +84,12 @@ class ZigbeeDimmableLight : public ZigbeeEP { void setLightLevel(uint8_t level); void setLight(bool state, uint8_t level); - bool getLightState() { + bool getLightState() + { return _current_state; } - uint8_t getLightLevel() { + uint8_t getLightLevel() + { return _current_level; } @@ -108,4 +116,4 @@ class ZigbeeDimmableLight : public ZigbeeEP { uint8_t _current_level; }; -#endif // SOC_IEEE802154_SUPPORTED +#endif // SOC_IEEE802154_SUPPORTED From ae274ee8973ba534b30be5ebfdf145802e314841 Mon Sep 17 00:00:00 2001 From: FaBjE <5355001+FaBjE@users.noreply.github.com> Date: Sat, 14 Dec 2024 18:01:49 +0100 Subject: [PATCH 102/183] feat(Zigbee): Adjusted example author comment --- .../examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino index dec633975d3..3e325ea9d1e 100644 --- a/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino +++ b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino @@ -24,7 +24,7 @@ * * Please check the README.md for instructions and more detailed description. * - * Created by Jan Procházka (https://github.com/P-R-O-C-H-Y/) + * Created by [FaBjE](https://github.com/FaBjE) based on examples by [Jan Procházka](https://github.com/P-R-O-C-H-Y/) */ #ifndef ZIGBEE_MODE_ED From 2c7b76aea8e3c87360f32d61b7916ff4178f3f68 Mon Sep 17 00:00:00 2001 From: Lei Chen Date: Sun, 15 Dec 2024 12:19:49 -0500 Subject: [PATCH 103/183] Use INPUT_PULLUP instead of INPUT Tested on some of the popular S3 board bought from Amazon, the digitalRead of an INPUT pin is LOW, which stops the timer right after start. Setting it to INPUT_PULLUP will fix it. --- libraries/ESP32/examples/Timer/RepeatTimer/RepeatTimer.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP32/examples/Timer/RepeatTimer/RepeatTimer.ino b/libraries/ESP32/examples/Timer/RepeatTimer/RepeatTimer.ino index 18fdc8035a5..e4ef7bc865b 100644 --- a/libraries/ESP32/examples/Timer/RepeatTimer/RepeatTimer.ino +++ b/libraries/ESP32/examples/Timer/RepeatTimer/RepeatTimer.ino @@ -33,7 +33,7 @@ void setup() { Serial.begin(115200); // Set BTN_STOP_ALARM to input mode - pinMode(BTN_STOP_ALARM, INPUT); + pinMode(BTN_STOP_ALARM, INPUT_PULLUP); // Create semaphore to inform us when the timer has fired timerSemaphore = xSemaphoreCreateBinary(); From ddf8c42af365fe9f15d6e6d7206bec4c9c21554c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 09:10:57 +0000 Subject: [PATCH 104/183] ci(pre-commit): Apply automatic fixes --- .../Zigbee_Dimmable_Light.ino | 33 ++++------ .../Zigbee/src/ep/ZigbeeDimmableLight.cpp | 63 +++++++------------ libraries/Zigbee/src/ep/ZigbeeDimmableLight.h | 20 +++--- 3 files changed, 40 insertions(+), 76 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino index 3e325ea9d1e..c77a7e742d1 100644 --- a/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino +++ b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino @@ -41,10 +41,8 @@ uint8_t button = BOOT_PIN; ZigbeeDimmableLight zbDimmableLight = ZigbeeDimmableLight(ZIGBEE_LIGHT_ENDPOINT); /********************* RGB LED functions **************************/ -void setLight(bool state, uint8_t level) -{ - if (!state) - { +void setLight(bool state, uint8_t level) { + if (!state) { rgbLedWrite(led, 0, 0, 0); return; } @@ -52,12 +50,10 @@ void setLight(bool state, uint8_t level) } // Create a task on identify call to handle the identify function -void identify(uint16_t time) -{ +void identify(uint16_t time) { static uint8_t blink = 1; log_d("Identify called for %d seconds", time); - if (time == 0) - { + if (time == 0) { // If identify time is 0, stop blinking and restore light as it was used for identify zbDimmableLight.restoreLight(); return; @@ -67,8 +63,7 @@ void identify(uint16_t time) } /********************* Arduino functions **************************/ -void setup() -{ +void setup() { Serial.begin(115200); // Init RMT and leave light OFF @@ -91,34 +86,28 @@ void setup() Zigbee.addEndpoint(&zbDimmableLight); // When all EPs are registered, start Zigbee in End Device mode - if (!Zigbee.begin()) - { + if (!Zigbee.begin()) { Serial.println("Zigbee failed to start!"); Serial.println("Rebooting..."); ESP.restart(); } Serial.println("Connecting to network"); - while (!Zigbee.connected()) - { + while (!Zigbee.connected()) { Serial.print("."); delay(100); } Serial.println(); } -void loop() -{ +void loop() { // Checking button for factory reset - if (digitalRead(button) == LOW) - { // Push button pressed + if (digitalRead(button) == LOW) { // Push button pressed // Key debounce handling delay(100); int startTime = millis(); - while (digitalRead(button) == LOW) - { + while (digitalRead(button) == LOW) { delay(50); - if ((millis() - startTime) > 3000) - { + if ((millis() - startTime) > 3000) { // If key pressed for more than 3secs, factory reset Zigbee and reboot Serial.println("Resetting Zigbee to factory and rebooting in 1s."); delay(1000); diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp index 355847c8d02..fd560096090 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp @@ -4,8 +4,7 @@ #include "esp_zigbee_cluster.h" -ZigbeeDimmableLight::ZigbeeDimmableLight(uint8_t endpoint) : ZigbeeEP(endpoint) -{ +ZigbeeDimmableLight::ZigbeeDimmableLight(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_DIMMABLE_LIGHT_DEVICE_ID; zigbee_dimmable_light_cfg_t light_cfg = ZIGBEE_DEFAULT_DIMMABLE_LIGHT_CONFIG(); @@ -19,58 +18,41 @@ ZigbeeDimmableLight::ZigbeeDimmableLight(uint8_t endpoint) : ZigbeeEP(endpoint) } // set attribute method -> method overridden in child class -void ZigbeeDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) -{ +void ZigbeeDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) { // check the data and call right method - if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ON_OFF) - { - if (message->attribute.id == ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_BOOL) - { - if (_current_state != *(bool *)message->attribute.data.value) - { + if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ON_OFF) { + if (message->attribute.id == ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_BOOL) { + if (_current_state != *(bool *)message->attribute.data.value) { _current_state = *(bool *)message->attribute.data.value; lightChanged(); } return; - } - else - { + } else { log_w("Received message ignored. Attribute ID: %d not supported for On/Off Light", message->attribute.id); } - } - else if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_LEVEL_CONTROL) - { - if (message->attribute.id == ESP_ZB_ZCL_ATTR_LEVEL_CONTROL_CURRENT_LEVEL_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_U8) - { - if (_current_level != *(uint8_t *)message->attribute.data.value) - { + } else if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_LEVEL_CONTROL) { + if (message->attribute.id == ESP_ZB_ZCL_ATTR_LEVEL_CONTROL_CURRENT_LEVEL_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_U8) { + if (_current_level != *(uint8_t *)message->attribute.data.value) { _current_level = *(uint8_t *)message->attribute.data.value; lightChanged(); } return; - } - else - { + } else { log_w("Received message ignored. Attribute ID: %d not supported for Level Control", message->attribute.id); // TODO: implement more attributes -> includes/zcl/esp_zigbee_zcl_level.h } - } - else - { + } else { log_w("Received message ignored. Cluster ID: %d not supported for dimmable Light", message->info.cluster); } } -void ZigbeeDimmableLight::lightChanged() -{ - if (_on_light_change) - { +void ZigbeeDimmableLight::lightChanged() { + if (_on_light_change) { _on_light_change(_current_state, _current_level); } } -void ZigbeeDimmableLight::setLight(bool state, uint8_t level) -{ +void ZigbeeDimmableLight::setLight(bool state, uint8_t level) { // Update all attributes _current_state = state; _current_level = level; @@ -81,25 +63,24 @@ void ZigbeeDimmableLight::setLight(bool state, uint8_t level) esp_zb_lock_acquire(portMAX_DELAY); // set on/off state esp_zb_zcl_set_attribute_val( - _endpoint, ESP_ZB_ZCL_CLUSTER_ID_ON_OFF, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID, &_current_state, false); + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_ON_OFF, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID, &_current_state, false + ); // set level esp_zb_zcl_set_attribute_val( - _endpoint, ESP_ZB_ZCL_CLUSTER_ID_LEVEL_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_LEVEL_CONTROL_CURRENT_LEVEL_ID, &_current_level, false); + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_LEVEL_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_LEVEL_CONTROL_CURRENT_LEVEL_ID, &_current_level, false + ); esp_zb_lock_release(); } -void ZigbeeDimmableLight::setLightState(bool state) -{ +void ZigbeeDimmableLight::setLightState(bool state) { setLight(state, _current_level); } -void ZigbeeDimmableLight::setLightLevel(uint8_t level) -{ +void ZigbeeDimmableLight::setLightLevel(uint8_t level) { setLight(_current_state, level); } -esp_zb_cluster_list_t *ZigbeeDimmableLight::esp_zb_dimmable_light_clusters_create(zigbee_dimmable_light_cfg_t *light_cfg) -{ +esp_zb_cluster_list_t *ZigbeeDimmableLight::esp_zb_dimmable_light_clusters_create(zigbee_dimmable_light_cfg_t *light_cfg) { esp_zb_attribute_list_t *esp_zb_basic_cluster = esp_zb_basic_cluster_create(&light_cfg->basic_cfg); esp_zb_attribute_list_t *esp_zb_identify_cluster = esp_zb_identify_cluster_create(&light_cfg->identify_cfg); esp_zb_attribute_list_t *esp_zb_groups_cluster = esp_zb_groups_cluster_create(&light_cfg->groups_cfg); @@ -119,4 +100,4 @@ esp_zb_cluster_list_t *ZigbeeDimmableLight::esp_zb_dimmable_light_clusters_creat return esp_zb_cluster_list; } -#endif // SOC_IEEE802154_SUPPORTED +#endif // SOC_IEEE802154_SUPPORTED diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h index 4c92899eb5e..4e00536a4d2 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h @@ -15,8 +15,7 @@ * * */ -typedef struct zigbee_dimmable_light_cfg_s -{ +typedef struct zigbee_dimmable_light_cfg_s { esp_zb_basic_cluster_cfg_t basic_cfg; /*!< Basic cluster configuration, @ref esp_zb_basic_cluster_cfg_s */ esp_zb_identify_cluster_cfg_t identify_cfg; /*!< Identify cluster configuration, @ref esp_zb_identify_cluster_cfg_s */ esp_zb_groups_cluster_cfg_t groups_cfg; /*!< Groups cluster configuration, @ref esp_zb_groups_cluster_cfg_s */ @@ -65,18 +64,15 @@ typedef struct zigbee_dimmable_light_cfg_s } // clang-format on -class ZigbeeDimmableLight : public ZigbeeEP -{ +class ZigbeeDimmableLight : public ZigbeeEP { public: ZigbeeDimmableLight(uint8_t endpoint); ~ZigbeeDimmableLight(); - void onLightChange(void (*callback)(bool, uint8_t)) - { + void onLightChange(void (*callback)(bool, uint8_t)) { _on_light_change = callback; } - void restoreLight() - { + void restoreLight() { lightChanged(); } @@ -84,12 +80,10 @@ class ZigbeeDimmableLight : public ZigbeeEP void setLightLevel(uint8_t level); void setLight(bool state, uint8_t level); - bool getLightState() - { + bool getLightState() { return _current_state; } - uint8_t getLightLevel() - { + uint8_t getLightLevel() { return _current_level; } @@ -116,4 +110,4 @@ class ZigbeeDimmableLight : public ZigbeeEP uint8_t _current_level; }; -#endif // SOC_IEEE802154_SUPPORTED +#endif // SOC_IEEE802154_SUPPORTED From 4f863d52baa0dd09529e1ca6c6b0523a96679098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Mon, 16 Dec 2024 10:19:42 +0100 Subject: [PATCH 105/183] fix(zigbee): Rename method to avoid future conflict --- libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp | 4 ++-- libraries/Zigbee/src/ep/ZigbeeDimmableLight.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp index fd560096090..00d3aac3752 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp @@ -8,7 +8,7 @@ ZigbeeDimmableLight::ZigbeeDimmableLight(uint8_t endpoint) : ZigbeeEP(endpoint) _device_id = ESP_ZB_HA_DIMMABLE_LIGHT_DEVICE_ID; zigbee_dimmable_light_cfg_t light_cfg = ZIGBEE_DEFAULT_DIMMABLE_LIGHT_CONFIG(); - _cluster_list = esp_zb_dimmable_light_clusters_create(&light_cfg); + _cluster_list = zigbee_dimmable_light_clusters_create(&light_cfg); _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_DIMMABLE_LIGHT_DEVICE_ID, .app_device_version = 0}; @@ -80,7 +80,7 @@ void ZigbeeDimmableLight::setLightLevel(uint8_t level) { setLight(_current_state, level); } -esp_zb_cluster_list_t *ZigbeeDimmableLight::esp_zb_dimmable_light_clusters_create(zigbee_dimmable_light_cfg_t *light_cfg) { +esp_zb_cluster_list_t *ZigbeeDimmableLight::zigbee_dimmable_light_clusters_create(zigbee_dimmable_light_cfg_t *light_cfg) { esp_zb_attribute_list_t *esp_zb_basic_cluster = esp_zb_basic_cluster_create(&light_cfg->basic_cfg); esp_zb_attribute_list_t *esp_zb_identify_cluster = esp_zb_identify_cluster_create(&light_cfg->identify_cfg); esp_zb_attribute_list_t *esp_zb_groups_cluster = esp_zb_groups_cluster_create(&light_cfg->groups_cfg); diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h index 4e00536a4d2..034c34899b4 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h @@ -104,7 +104,7 @@ class ZigbeeDimmableLight : public ZigbeeEP { * @return Pointer to cluster list @ref esp_zb_cluster_list_s * */ - esp_zb_cluster_list_t *esp_zb_dimmable_light_clusters_create(zigbee_dimmable_light_cfg_t *light_cfg); + esp_zb_cluster_list_t *zigbee_dimmable_light_clusters_create(zigbee_dimmable_light_cfg_t *light_cfg); bool _current_state; uint8_t _current_level; From 31dc520c4d1287d1be41e7e13ac53b689fe7acac Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 16 Dec 2024 08:11:50 -0300 Subject: [PATCH 106/183] feat(matter): removed while(serial) and ipv6 enabling, which is a default --- .../Matter/examples/MatterColorLight/MatterColorLight.ino | 5 ----- .../examples/MatterCommissionTest/MatterCommissionTest.ino | 5 ----- .../examples/MatterComposedLights/MatterComposedLights.ino | 5 ----- .../examples/MatterDimmableLight/MatterDimmableLight.ino | 5 ----- .../MatterEnhancedColorLight/MatterEnhancedColorLight.ino | 5 ----- libraries/Matter/examples/MatterFan/MatterFan.ino | 5 ----- libraries/Matter/examples/MatterMinimum/MatterMinimum.ino | 1 - .../Matter/examples/MatterOnOffLight/MatterOnOffLight.ino | 5 ----- .../Matter/examples/MatterSmartButon/MatterSmartButon.ino | 6 +----- .../MatterTemperatureLight/MatterTemperatureLight.ino | 5 ----- 10 files changed, 1 insertion(+), 46 deletions(-) diff --git a/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino b/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino index ea91baef0ea..4f296a684c9 100644 --- a/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino +++ b/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino @@ -76,15 +76,10 @@ void setup() { pinMode(ledPin, OUTPUT); Serial.begin(115200); - while (!Serial) { - delay(100); - } // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); - // enable IPv6 - WiFi.enableIPv6(true); // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection diff --git a/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino b/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino index 9024479c881..0e93ed6d155 100644 --- a/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino +++ b/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino @@ -26,15 +26,10 @@ const char *password = "your-password"; // Change this to your WiFi password void setup() { Serial.begin(115200); - while (!Serial) { - delay(100); - } // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); - // enable IPv6 - WiFi.enableIPv6(true); // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection diff --git a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino index 63062ba36a9..9c3dcf05a83 100644 --- a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino +++ b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino @@ -55,15 +55,10 @@ void setup() { pinMode(buttonPin, INPUT_PULLUP); Serial.begin(115200); - while (!Serial) { - delay(100); - } // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); - // enable IPv6 - WiFi.enableIPv6(true); // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index f1af4f84dfc..7e176803c0a 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -72,15 +72,10 @@ void setup() { pinMode(ledPin, OUTPUT); Serial.begin(115200); - while (!Serial) { - delay(100); - } // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); - // enable IPv6 - WiFi.enableIPv6(true); // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection diff --git a/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino index eddbd0f2b21..5821707a6f7 100644 --- a/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino +++ b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino @@ -80,15 +80,10 @@ void setup() { pinMode(ledPin, OUTPUT); Serial.begin(115200); - while (!Serial) { - delay(100); - } // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); - // enable IPv6 - WiFi.enableIPv6(true); // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection diff --git a/libraries/Matter/examples/MatterFan/MatterFan.ino b/libraries/Matter/examples/MatterFan/MatterFan.ino index a226dedf75d..62eaef038ef 100644 --- a/libraries/Matter/examples/MatterFan/MatterFan.ino +++ b/libraries/Matter/examples/MatterFan/MatterFan.ino @@ -71,15 +71,10 @@ void setup() { pinMode(dcMotorPin, OUTPUT); Serial.begin(115200); - while (!Serial) { - delay(100); - } // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); - // enable IPv6 - WiFi.enableIPv6(true); // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection diff --git a/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino b/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino index cc54d3c12c0..bd1e601c53f 100644 --- a/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino +++ b/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino @@ -60,7 +60,6 @@ void setup() { // Initialize the LED GPIO pinMode(ledPin, OUTPUT); - WiFi.enableIPv6(true); // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection diff --git a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino index c7b8757f37b..93cc12f901f 100644 --- a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino +++ b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino @@ -67,15 +67,10 @@ void setup() { pinMode(ledPin, OUTPUT); Serial.begin(115200); - while (!Serial) { - delay(100); - } // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); - // enable IPv6 - WiFi.enableIPv6(true); // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection diff --git a/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino b/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino index 929c13c1663..c0c13e31814 100644 --- a/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino +++ b/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino @@ -38,15 +38,11 @@ void setup() { pinMode(buttonPin, INPUT_PULLUP); Serial.begin(115200); - while (!Serial) { - delay(100); - } // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); - // enable IPv6 - WiFi.enableIPv6(true); + // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection diff --git a/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino b/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino index 7937303de54..31bb535bf82 100644 --- a/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino +++ b/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino @@ -83,15 +83,10 @@ void setup() { pinMode(ledPin, OUTPUT); Serial.begin(115200); - while (!Serial) { - delay(100); - } // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); - // enable IPv6 - WiFi.enableIPv6(true); // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection From 7d465f323bfbc542e7010fa2bf364ca4c22a0161 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 16 Dec 2024 08:14:13 -0300 Subject: [PATCH 107/183] feat(matter): fix commentaries related to feature changes and log messages --- libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp | 4 ++-- .../src/MatterEndpoints/MatterColorTemperatureLight.cpp | 6 +++--- .../Matter/src/MatterEndpoints/MatterContactSensor.cpp | 2 +- .../Matter/src/MatterEndpoints/MatterDimmableLight.cpp | 4 ++-- .../src/MatterEndpoints/MatterEnhancedColorLight.cpp | 8 ++++---- libraries/Matter/src/MatterEndpoints/MatterFan.cpp | 6 +++--- .../Matter/src/MatterEndpoints/MatterHumiditySensor.cpp | 4 ++-- .../Matter/src/MatterEndpoints/MatterOccupancySensor.cpp | 2 +- libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp | 2 +- .../Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp | 2 +- .../Matter/src/MatterEndpoints/MatterPressureSensor.cpp | 2 +- .../src/MatterEndpoints/MatterTemperatureSensor.cpp | 4 ++-- 12 files changed, 23 insertions(+), 23 deletions(-) diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp index b67cf6a23b1..6e2a7910433 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp @@ -206,7 +206,7 @@ bool MatterColorLight::setOnOff(bool newState) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (onOffState == newState) { return true; } @@ -256,7 +256,7 @@ bool MatterColorLight::setColorHSV(espHsvColor_t _hsvColor) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (colorHSV.h == _hsvColor.h && colorHSV.s == _hsvColor.s && colorHSV.v == _hsvColor.v) { return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp index 7bbcb83dcfe..f54203b7928 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp @@ -138,7 +138,7 @@ bool MatterColorTemperatureLight::setOnOff(bool newState) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (onOffState == newState) { return true; } @@ -179,7 +179,7 @@ bool MatterColorTemperatureLight::setBrightness(uint8_t newBrightness) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (brightnessLevel == newBrightness) { return true; } @@ -210,7 +210,7 @@ bool MatterColorTemperatureLight::setColorTemperature(uint16_t newTemperature) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (colorTemperatureLevel == newTemperature) { return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp index 44ba1c75a44..fb08587c6f6 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp @@ -69,7 +69,7 @@ bool MatterContactSensor::setContact(bool _contactState) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (contactState == _contactState) { return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp index c3991e0c0f3..cd9830be8ac 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp @@ -114,7 +114,7 @@ bool MatterDimmableLight::setOnOff(bool newState) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (onOffState == newState) { return true; } @@ -155,7 +155,7 @@ bool MatterDimmableLight::setBrightness(uint8_t newBrightness) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (brightnessLevel == newBrightness) { return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp index 423a6a7d2ef..215e52b4137 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp @@ -226,7 +226,7 @@ bool MatterEnhancedColorLight::setOnOff(bool newState) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (onOffState == newState) { return true; } @@ -267,7 +267,7 @@ bool MatterEnhancedColorLight::setBrightness(uint8_t newBrightness) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (brightnessLevel == newBrightness) { return true; } @@ -298,7 +298,7 @@ bool MatterEnhancedColorLight::setColorTemperature(uint16_t newTemperature) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (colorTemperatureLevel == newTemperature) { return true; } @@ -338,7 +338,7 @@ bool MatterEnhancedColorLight::setColorHSV(espHsvColor_t _hsvColor) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (colorHSV.h == _hsvColor.h && colorHSV.s == _hsvColor.s && colorHSV.v == _hsvColor.v) { return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterFan.cpp b/libraries/Matter/src/MatterEndpoints/MatterFan.cpp index 8db6a317ead..12de176d176 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterFan.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterFan.cpp @@ -118,7 +118,7 @@ bool MatterFan::setMode(FanMode_t newMode, bool performUpdate) { log_w("Matter Fan device has not begun."); return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (currentFanMode == newMode) { return true; } @@ -159,7 +159,7 @@ bool MatterFan::setSpeedPercent(uint8_t newPercent, bool performUpdate) { log_w("Matter Fan device has not begun."); return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (currentPercent == newPercent) { return true; } @@ -193,7 +193,7 @@ bool MatterFan::setOnOff(bool newState, bool performUpdate) { log_w("Matter Fan device has not begun."); return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (getOnOff() == newState) { return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp index 3e911606074..7526b99a7b9 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp @@ -82,7 +82,7 @@ bool MatterHumiditySensor::setRawHumidity(uint16_t _rawHumidity) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (rawHumidity == _rawHumidity) { return true; } @@ -98,7 +98,7 @@ bool MatterHumiditySensor::setRawHumidity(uint16_t _rawHumidity) { bool ret; ret = updateAttributeVal(RelativeHumidityMeasurement::Id, RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, &humidityVal); if (!ret) { - log_e("Failed to update Fan Speed Percent Attribute."); + log_e("Failed to update Humidity Sensor Attribute."); return false; } rawHumidity = _rawHumidity; diff --git a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp index d893f14b6bb..ad200bc2ad8 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp @@ -80,7 +80,7 @@ bool MatterOccupancySensor::setOccupancy(bool _occupancyState) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (occupancyState == _occupancyState) { return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp index 3f71ff1eb76..1071b595e5b 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp @@ -94,7 +94,7 @@ bool MatterOnOffLight::setOnOff(bool newState) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (onOffState == newState) { return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp index 6b5e5e630e0..546da3b04e9 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp @@ -93,7 +93,7 @@ bool MatterOnOffPlugin::setOnOff(bool newState) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (onOffState == newState) { return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp index a157469c980..f246ea81223 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp @@ -70,7 +70,7 @@ bool MatterPressureSensor::setRawPressure(int16_t _rawPressure) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (rawPressure == _rawPressure) { return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp index 4a43650f924..6f59a5b2426 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp @@ -70,7 +70,7 @@ bool MatterTemperatureSensor::setRawTemperature(int16_t _rawTemperature) { return false; } - // avoid processing the a "no-change" + // avoid processing if there was no change if (rawTemperature == _rawTemperature) { return true; } @@ -86,7 +86,7 @@ bool MatterTemperatureSensor::setRawTemperature(int16_t _rawTemperature) { bool ret; ret = updateAttributeVal(TemperatureMeasurement::Id, TemperatureMeasurement::Attributes::MeasuredValue::Id, &temperatureVal); if (!ret) { - log_e("Failed to update Fan Speed Percent Attribute."); + log_e("Failed to update Temperature Sensor Attribute."); return false; } rawTemperature = _rawTemperature; From 1ef1e7dbac6ac040d473e3895472a3483890f182 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Mon, 16 Dec 2024 14:43:33 +0200 Subject: [PATCH 108/183] fix(version): Update Zigbee Library version --- libraries/Zigbee/library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Zigbee/library.properties b/libraries/Zigbee/library.properties index 4d66f470378..2b1f041fc94 100644 --- a/libraries/Zigbee/library.properties +++ b/libraries/Zigbee/library.properties @@ -1,5 +1,5 @@ name=Zigbee -version=3.0.5 +version=3.1.0 author=P-R-O-C-H-Y maintainer=Jan Procházka sentence=Enables zigbee connection with the ESP32 From 1dff8bc75953d63c11df0db2a3389511d73e9672 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 16 Dec 2024 10:01:24 -0300 Subject: [PATCH 109/183] feat(matter) adds Identification callback to all matter endpoints --- .../MatterOnIdentify/MatterOnIdentify.ino | 126 ++++++++++++++++++ .../Matter/examples/MatterOnIdentify/ci.json | 7 + libraries/Matter/src/Matter.cpp | 26 +++- libraries/Matter/src/MatterEndPoint.h | 2 + .../src/MatterEndpoints/MatterColorLight.h | 13 ++ .../MatterColorTemperatureLight.h | 14 ++ .../src/MatterEndpoints/MatterContactSensor.h | 13 ++ .../src/MatterEndpoints/MatterDimmableLight.h | 15 +++ .../MatterEnhancedColorLight.h | 13 ++ .../Matter/src/MatterEndpoints/MatterFan.h | 13 ++ .../src/MatterEndpoints/MatterGenericSwitch.h | 13 ++ .../MatterEndpoints/MatterHumiditySensor.h | 13 ++ .../MatterEndpoints/MatterOccupancySensor.h | 13 ++ .../src/MatterEndpoints/MatterOnOffLight.h | 15 +++ .../src/MatterEndpoints/MatterOnOffPlugin.h | 15 +++ .../MatterEndpoints/MatterPressureSensor.h | 13 ++ .../MatterEndpoints/MatterTemperatureSensor.h | 13 ++ 17 files changed, 335 insertions(+), 2 deletions(-) create mode 100644 libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino create mode 100644 libraries/Matter/examples/MatterOnIdentify/ci.json diff --git a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino new file mode 100644 index 00000000000..f55a20ae3ab --- /dev/null +++ b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino @@ -0,0 +1,126 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + * This example is the smallest code that will create a Matter Device which can be + * commissioned and controlled from a Matter Environment APP. + * It controls a GPIO that could be attached to a LED for visualization. + * Additionally the ESP32 will send debug messages indicating the Matter activity. + * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. + * + * This example is a simple Matter On/Off Light that can be controlled by a Matter Controller. + * It demonstrates how to use On Identify callback when the Identify Cluster is called. + * The Matter user APP can be used to request the device to identify itself by blinking the LED. + */ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Single On/Off Light Endpoint - at least one per node +MatterOnOffLight OnOffLight; + +// Light GPIO that can be controlled by Matter APP +#ifdef LED_BUILTIN +const uint8_t ledPin = LED_BUILTIN; +#else +const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN +#endif + +// set your board USER BUTTON pin here - decommissioning button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control - decommision the Matter Node +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +// Matter Protocol Endpoint (On/OFF Light) Callback +bool matterCB(bool state) { + digitalWrite(ledPin, state ? HIGH : LOW); + // This callback must return the success state to Matter core + return true; +} + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + pinMode(buttonPin, INPUT_PULLUP); + // Initialize the LED GPIO + pinMode(ledPin, OUTPUT); + + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + } + + // Initialize at least one Matter EndPoint + OnOffLight.begin(); + + // On Identify Callback - Blink the LED + OnOffLight.onIdentify([](bool identifyIsActive, uint8_t counter) { + log_i("Identify Cluster is %s, counter: %d", identifyIsActive ? "Active" : "Inactive", counter); + if (identifyIsActive) { + // Start Blinking the light + OnOffLight.toggle(); + } else { + // Stop Blinking and restore the light to the its last state + OnOffLight.updateAccessory(); + } + return true; + }); + + // Associate a callback to the Matter Controller + OnOffLight.onChange(matterCB); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + if (!Matter.isDeviceCommissioned()) { + log_i("Matter Node is not commissioned yet."); + log_i("Initiate the device discovery in your Matter environment."); + log_i("Commission it to your Matter hub with the manual pairing code or QR code"); + log_i("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + log_i("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + } +} + +void loop() { + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (digitalRead(buttonPin) == HIGH && button_state) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } + + delay(500); +} diff --git a/libraries/Matter/examples/MatterOnIdentify/ci.json b/libraries/Matter/examples/MatterOnIdentify/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterOnIdentify/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/src/Matter.cpp b/libraries/Matter/src/Matter.cpp index 89ef87b4db3..51ab9c91cf1 100644 --- a/libraries/Matter/src/Matter.cpp +++ b/libraries/Matter/src/Matter.cpp @@ -21,6 +21,7 @@ using namespace esp_matter; using namespace esp_matter::attribute; using namespace esp_matter::endpoint; +using namespace esp_matter::identification; using namespace chip::app::Clusters; constexpr auto k_timeout_seconds = 300; @@ -67,8 +68,29 @@ static esp_err_t app_attribute_update_cb( // This callback is invoked when clients interact with the Identify Cluster. // In the callback implementation, an endpoint can identify itself. (e.g., by flashing an LED or light). static esp_err_t app_identification_cb(identification::callback_type_t type, uint16_t endpoint_id, uint8_t effect_id, uint8_t effect_variant, void *priv_data) { - log_i("Identification callback: type: %u, effect: %u, variant: %u", type, effect_id, effect_variant); - return ESP_OK; + log_d("Identification callback to endpoint %d: type: %u, effect: %u, variant: %u", endpoint_id, effect_id, effect_variant); + esp_err_t err = ESP_OK; + MatterEndPoint *ep = (MatterEndPoint *)priv_data; // endpoint pointer to base class + // Identify the endpoint sending a counter to the application + static uint8_t counter = 0; + bool identifyIsActive = false; + + if (type == identification::callback_type_t::START) { + log_v("Identification callback: START"); + counter = 0; + identifyIsActive = true; + } else if (type == identification::callback_type_t::EFFECT) { + log_v("Identification callback: EFFECT"); + counter++; + } else if (type == identification::callback_type_t::STOP) { + identifyIsActive = false; + log_v("Identification callback: STOP"); + } + if (ep != NULL) { + err = ep->endpointIdentifyCB(endpoint_id, identifyIsActive, counter) ? ESP_OK : ESP_FAIL; + } + + return err; } // This callback is invoked for all Matter events. The application can handle the events as required. diff --git a/libraries/Matter/src/MatterEndPoint.h b/libraries/Matter/src/MatterEndPoint.h index 99bff8470d3..7f791ff49d9 100644 --- a/libraries/Matter/src/MatterEndPoint.h +++ b/libraries/Matter/src/MatterEndPoint.h @@ -102,6 +102,8 @@ class MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. virtual bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) = 0; + // This callback is invoked when clients interact with the Identify Cluster of an specific endpoint. + virtual bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) = 0; protected: uint16_t endpoint_id = 0; }; diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorLight.h index 13ff0decbc2..f579d555066 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterColorLight.h @@ -46,6 +46,18 @@ class MatterColorLight : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // this function is invoked when clients interact with the Identify Cluster of an specific endpoint + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } // User Callback for whenever the Light On/Off state is changed by the Matter Controller using EndPointOnOffCB = std::function; @@ -71,5 +83,6 @@ class MatterColorLight : public MatterEndPoint { EndPointOnOffCB _onChangeOnOffCB = NULL; EndPointRGBColorCB _onChangeColorCB = NULL; EndPointCB _onChangeCB = NULL; + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h index e886a184182..de51be4a227 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h @@ -51,6 +51,18 @@ class MatterColorTemperatureLight : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // this function is invoked when clients interact with the Identify Cluster of an specific endpoint + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } // User Callback for whenever the Light On/Off state is changed by the Matter Controller using EndPointOnOffCB = std::function; @@ -85,5 +97,7 @@ class MatterColorTemperatureLight : public MatterEndPoint { EndPointBrightnessCB _onChangeBrightnessCB = NULL; EndPointTemperatureCB _onChangeTemperatureCB = NULL; EndPointCB _onChangeCB = NULL; + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; + }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h index 257da785e53..c4e74d6c30f 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h @@ -46,9 +46,22 @@ class MatterContactSensor : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // this function is invoked when clients interact with the Identify Cluster of an specific endpoint + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } protected: bool started = false; bool contactState = false; + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h index aacce883277..aeb85fae2b5 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h @@ -43,8 +43,22 @@ class MatterDimmableLight : public MatterEndPoint { operator bool(); // returns current on/off light state void operator=(bool state); // turns light on or off + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // this function is invoked when clients interact with the Identify Cluster of an specific endpoint + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } + // User Callback for whenever the Light On/Off state is changed by the Matter Controller using EndPointOnOffCB = std::function; void onChangeOnOff(EndPointOnOffCB onChangeCB) { @@ -69,5 +83,6 @@ class MatterDimmableLight : public MatterEndPoint { EndPointOnOffCB _onChangeOnOffCB = NULL; EndPointBrightnessCB _onChangeBrightnessCB = NULL; EndPointCB _onChangeCB = NULL; + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h index 66ed1943b8d..599ae55ffa4 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h @@ -56,6 +56,18 @@ class MatterEnhancedColorLight : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // this function is invoked when clients interact with the Identify Cluster of an specific endpoint + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } // User Callback for whenever the Light On/Off state is changed by the Matter Controller using EndPointOnOffCB = std::function; @@ -98,5 +110,6 @@ class MatterEnhancedColorLight : public MatterEndPoint { EndPointRGBColorCB _onChangeColorCB = NULL; EndPointTemperatureCB _onChangeTemperatureCB = NULL; EndPointCB _onChangeCB = NULL; + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterFan.h b/libraries/Matter/src/MatterEndpoints/MatterFan.h index 232577b7bef..ba8772fd1be 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterFan.h +++ b/libraries/Matter/src/MatterEndpoints/MatterFan.h @@ -105,6 +105,18 @@ class MatterFan : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // this function is invoked when clients interact with the Identify Cluster of an specific endpoint + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } // User Callback for whenever the Fan Mode (state) is changed by the Matter Controller using EndPointModeCB = std::function; @@ -133,6 +145,7 @@ class MatterFan : public MatterEndPoint { EndPointModeCB _onChangeModeCB = NULL; EndPointSpeedCB _onChangeSpeedCB = NULL; EndPointCB _onChangeCB = NULL; + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; // bitmap for Fan Sequence Modes (OFF, LOW, MEDIUM, HIGH, AUTO) static const uint8_t fanSeqModeOff = 0x01; diff --git a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h index 14118462932..895413f2fd3 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h +++ b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h @@ -32,8 +32,21 @@ class MatterGenericSwitch : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // this function is invoked when clients interact with the Identify Cluster of an specific endpoint + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } protected: bool started = false; + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h index aed758b7b7a..7268947d18d 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h @@ -57,6 +57,18 @@ class MatterHumiditySensor : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // this function is invoked when clients interact with the Identify Cluster of an specific endpoint + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } protected: bool started = false; @@ -65,5 +77,6 @@ class MatterHumiditySensor : public MatterEndPoint { // internal function to set the raw humidity value (Matter Cluster) bool begin(uint16_t _rawHumidity); bool setRawHumidity(uint16_t _rawHumidity); + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h index 30f312a9841..61d4ad1bcb7 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h @@ -57,6 +57,18 @@ class MatterOccupancySensor : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // this function is invoked when clients interact with the Identify Cluster of an specific endpoint + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } protected: // bitmap for Occupancy Sensor Types @@ -69,5 +81,6 @@ class MatterOccupancySensor : public MatterEndPoint { bool started = false; bool occupancyState = false; + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h index 6d140a9948e..4b1b5e4eabb 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h @@ -36,8 +36,22 @@ class MatterOnOffLight : public MatterEndPoint { operator bool(); // returns current light state void operator=(bool state); // turns light on or off + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // this function is invoked when clients interact with the Identify Cluster of an specific endpoint + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } + // User Callback for whenever the Light state is changed by the Matter Controller using EndPointCB = std::function; void onChange(EndPointCB onChangeCB) { @@ -52,5 +66,6 @@ class MatterOnOffLight : public MatterEndPoint { bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) EndPointCB _onChangeCB = NULL; EndPointCB _onChangeOnOffCB = NULL; + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h index 241726a3a46..cf733f4c497 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h @@ -36,8 +36,22 @@ class MatterOnOffPlugin : public MatterEndPoint { operator bool(); // returns current plugin state void operator=(bool state); // turns plugin on or off + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // this function is invoked when clients interact with the Identify Cluster of an specific endpoint + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } + // User Callback for whenever the Plugin state is changed by the Matter Controller using EndPointCB = std::function; void onChange(EndPointCB onChangeCB) { @@ -52,5 +66,6 @@ class MatterOnOffPlugin : public MatterEndPoint { bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) EndPointCB _onChangeCB = NULL; EndPointCB _onChangeOnOffCB = NULL; + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h index 9fdd90c6ebe..8ff4446c6b7 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h @@ -50,11 +50,24 @@ class MatterPressureSensor : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // this function is invoked when clients interact with the Identify Cluster of an specific endpoint + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } protected: bool started = false; // implementation keeps pressure in hPa int16_t rawPressure = 0; + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; // internal function to set the raw pressure value (Matter Cluster) bool setRawPressure(int16_t _rawPressure); bool begin(int16_t _rawPressure); diff --git a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h index 826abac9a2a..cb50dc0ff5d 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h @@ -51,11 +51,24 @@ class MatterTemperatureSensor : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + // this function is invoked when clients interact with the Identify Cluster of an specific endpoint + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } protected: bool started = false; // implementation keeps temperature in 1/100th of a degree, any temperature unit int16_t rawTemperature = 0; + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; // internal function to set the raw temperature value (Matter Cluster) bool setRawTemperature(int16_t _rawTemperature); bool begin(int16_t _rawTemperature); From c688f3090f5ecb722c6b0ad196bb13bd53ded169 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 16 Dec 2024 10:48:50 -0300 Subject: [PATCH 110/183] fix(clk_src): Fix error as APLL is not yet supported for P4 --- cores/esp32/esp32-hal-cpu.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/cores/esp32/esp32-hal-cpu.c b/cores/esp32/esp32-hal-cpu.c index e9baf3613c2..1ffde860792 100644 --- a/cores/esp32/esp32-hal-cpu.c +++ b/cores/esp32/esp32-hal-cpu.c @@ -259,18 +259,10 @@ bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) { if (apb_change_callbacks) { triggerApbChangeCallback(APB_AFTER_CHANGE, capb, apb); } - // clang-format off -#ifdef SOC_CLK_APLL_SUPPORTED +#if defined(SOC_CLK_APLL_SUPPORTED) && !defined(CONFIG_IDF_TARGET_ESP32P4) // APLL not yet supported in ESP32-P4 log_d( "%s: %u / %u = %u Mhz, APB: %u Hz", - (conf.source == SOC_CPU_CLK_SRC_PLL) ? "PLL" - : ((conf.source == SOC_CPU_CLK_SRC_APLL) ? "APLL" - : ((conf.source == SOC_CPU_CLK_SRC_XTAL) ? "XTAL" -#ifdef CONFIG_IDF_TARGET_ESP32P4 - : "17.5M")), -#else - : "8M")), -#endif + (conf.source == SOC_CPU_CLK_SRC_PLL) ? "PLL" : ((conf.source == SOC_CPU_CLK_SRC_APLL) ? "APLL" : ((conf.source == SOC_CPU_CLK_SRC_XTAL) ? "XTAL" : "8M")), conf.source_freq_mhz, conf.div, conf.freq_mhz, apb ); #else @@ -279,7 +271,6 @@ bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) { conf.source_freq_mhz, conf.div, conf.freq_mhz, apb ); #endif - // clang-format on return true; } From 0e22bb4bac0a65719ea56d82ddb4d0b1eee71fd9 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 16 Dec 2024 10:58:49 -0300 Subject: [PATCH 111/183] feat(matter): moved all identify callback to endpoint.h --- .../MatterOnIdentify/MatterOnIdentify.ino | 34 ++++++++++--------- libraries/Matter/src/MatterEndPoint.h | 15 +++++++- .../src/MatterEndpoints/MatterColorLight.h | 13 ------- .../MatterColorTemperatureLight.h | 14 -------- .../src/MatterEndpoints/MatterContactSensor.h | 13 ------- .../src/MatterEndpoints/MatterDimmableLight.h | 13 ------- .../MatterEnhancedColorLight.h | 13 ------- .../Matter/src/MatterEndpoints/MatterFan.h | 13 ------- .../src/MatterEndpoints/MatterGenericSwitch.h | 13 ------- .../MatterEndpoints/MatterHumiditySensor.h | 13 ------- .../MatterEndpoints/MatterOccupancySensor.h | 13 ------- .../src/MatterEndpoints/MatterOnOffLight.h | 13 ------- .../src/MatterEndpoints/MatterOnOffPlugin.h | 13 ------- .../MatterEndpoints/MatterPressureSensor.h | 13 ------- .../MatterEndpoints/MatterTemperatureSensor.h | 13 ------- 15 files changed, 32 insertions(+), 187 deletions(-) diff --git a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino index f55a20ae3ab..9b183e0b175 100644 --- a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino +++ b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino @@ -32,6 +32,10 @@ // Single On/Off Light Endpoint - at least one per node MatterOnOffLight OnOffLight; +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + // Light GPIO that can be controlled by Matter APP #ifdef LED_BUILTIN const uint8_t ledPin = LED_BUILTIN; @@ -48,15 +52,23 @@ bool button_state = false; // false = released | true = pres const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission // Matter Protocol Endpoint (On/OFF Light) Callback -bool matterCB(bool state) { +bool onOffLightCallback(bool state) { digitalWrite(ledPin, state ? HIGH : LOW); // This callback must return the success state to Matter core return true; } -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password +bool onIdentifyLightCallback(bool identifyIsActive, uint8_t counter) { + log_i("Identify Cluster is %s, counter: %d", identifyIsActive ? "Active" : "Inactive", counter); + if (identifyIsActive) { + // Start Blinking the light + OnOffLight.toggle(); + } else { + // Stop Blinking and restore the light to the its last state + OnOffLight.updateAccessory(); + } + return true; +} void setup() { // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node @@ -75,20 +87,10 @@ void setup() { OnOffLight.begin(); // On Identify Callback - Blink the LED - OnOffLight.onIdentify([](bool identifyIsActive, uint8_t counter) { - log_i("Identify Cluster is %s, counter: %d", identifyIsActive ? "Active" : "Inactive", counter); - if (identifyIsActive) { - // Start Blinking the light - OnOffLight.toggle(); - } else { - // Stop Blinking and restore the light to the its last state - OnOffLight.updateAccessory(); - } - return true; - }); + OnOffLight.onIdentify(onIdentifyLightCallback); // Associate a callback to the Matter Controller - OnOffLight.onChange(matterCB); + OnOffLight.onChange(onOffLightCallback); // Matter beginning - Last step, after all EndPoints are initialized Matter.begin(); diff --git a/libraries/Matter/src/MatterEndPoint.h b/libraries/Matter/src/MatterEndPoint.h index 7f791ff49d9..34b59bb18c8 100644 --- a/libraries/Matter/src/MatterEndPoint.h +++ b/libraries/Matter/src/MatterEndPoint.h @@ -103,8 +103,21 @@ class MatterEndPoint { virtual bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) = 0; // This callback is invoked when clients interact with the Identify Cluster of an specific endpoint. - virtual bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) = 0; + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + } + return true; + } + // User callaback for the Identify Cluster functionality + using EndPointIdentifyCB = std::function; + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; + } + + protected: uint16_t endpoint_id = 0; + EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorLight.h index f579d555066..13ff0decbc2 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterColorLight.h @@ -46,18 +46,6 @@ class MatterColorLight : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // this function is invoked when clients interact with the Identify Cluster of an specific endpoint - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } // User Callback for whenever the Light On/Off state is changed by the Matter Controller using EndPointOnOffCB = std::function; @@ -83,6 +71,5 @@ class MatterColorLight : public MatterEndPoint { EndPointOnOffCB _onChangeOnOffCB = NULL; EndPointRGBColorCB _onChangeColorCB = NULL; EndPointCB _onChangeCB = NULL; - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h index de51be4a227..e886a184182 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h @@ -51,18 +51,6 @@ class MatterColorTemperatureLight : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // this function is invoked when clients interact with the Identify Cluster of an specific endpoint - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } // User Callback for whenever the Light On/Off state is changed by the Matter Controller using EndPointOnOffCB = std::function; @@ -97,7 +85,5 @@ class MatterColorTemperatureLight : public MatterEndPoint { EndPointBrightnessCB _onChangeBrightnessCB = NULL; EndPointTemperatureCB _onChangeTemperatureCB = NULL; EndPointCB _onChangeCB = NULL; - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; - }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h index c4e74d6c30f..257da785e53 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h @@ -46,22 +46,9 @@ class MatterContactSensor : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // this function is invoked when clients interact with the Identify Cluster of an specific endpoint - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } protected: bool started = false; bool contactState = false; - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h index aeb85fae2b5..838fe364760 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h @@ -46,18 +46,6 @@ class MatterDimmableLight : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // this function is invoked when clients interact with the Identify Cluster of an specific endpoint - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } // User Callback for whenever the Light On/Off state is changed by the Matter Controller using EndPointOnOffCB = std::function; @@ -83,6 +71,5 @@ class MatterDimmableLight : public MatterEndPoint { EndPointOnOffCB _onChangeOnOffCB = NULL; EndPointBrightnessCB _onChangeBrightnessCB = NULL; EndPointCB _onChangeCB = NULL; - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h index 599ae55ffa4..66ed1943b8d 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h @@ -56,18 +56,6 @@ class MatterEnhancedColorLight : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // this function is invoked when clients interact with the Identify Cluster of an specific endpoint - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } // User Callback for whenever the Light On/Off state is changed by the Matter Controller using EndPointOnOffCB = std::function; @@ -110,6 +98,5 @@ class MatterEnhancedColorLight : public MatterEndPoint { EndPointRGBColorCB _onChangeColorCB = NULL; EndPointTemperatureCB _onChangeTemperatureCB = NULL; EndPointCB _onChangeCB = NULL; - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterFan.h b/libraries/Matter/src/MatterEndpoints/MatterFan.h index ba8772fd1be..232577b7bef 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterFan.h +++ b/libraries/Matter/src/MatterEndpoints/MatterFan.h @@ -105,18 +105,6 @@ class MatterFan : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // this function is invoked when clients interact with the Identify Cluster of an specific endpoint - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } // User Callback for whenever the Fan Mode (state) is changed by the Matter Controller using EndPointModeCB = std::function; @@ -145,7 +133,6 @@ class MatterFan : public MatterEndPoint { EndPointModeCB _onChangeModeCB = NULL; EndPointSpeedCB _onChangeSpeedCB = NULL; EndPointCB _onChangeCB = NULL; - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; // bitmap for Fan Sequence Modes (OFF, LOW, MEDIUM, HIGH, AUTO) static const uint8_t fanSeqModeOff = 0x01; diff --git a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h index 895413f2fd3..14118462932 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h +++ b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h @@ -32,21 +32,8 @@ class MatterGenericSwitch : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // this function is invoked when clients interact with the Identify Cluster of an specific endpoint - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } protected: bool started = false; - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h index 7268947d18d..aed758b7b7a 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h @@ -57,18 +57,6 @@ class MatterHumiditySensor : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // this function is invoked when clients interact with the Identify Cluster of an specific endpoint - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } protected: bool started = false; @@ -77,6 +65,5 @@ class MatterHumiditySensor : public MatterEndPoint { // internal function to set the raw humidity value (Matter Cluster) bool begin(uint16_t _rawHumidity); bool setRawHumidity(uint16_t _rawHumidity); - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h index 61d4ad1bcb7..30f312a9841 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h @@ -57,18 +57,6 @@ class MatterOccupancySensor : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // this function is invoked when clients interact with the Identify Cluster of an specific endpoint - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } protected: // bitmap for Occupancy Sensor Types @@ -81,6 +69,5 @@ class MatterOccupancySensor : public MatterEndPoint { bool started = false; bool occupancyState = false; - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h index 4b1b5e4eabb..b27a2530075 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h @@ -39,18 +39,6 @@ class MatterOnOffLight : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // this function is invoked when clients interact with the Identify Cluster of an specific endpoint - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } // User Callback for whenever the Light state is changed by the Matter Controller using EndPointCB = std::function; @@ -66,6 +54,5 @@ class MatterOnOffLight : public MatterEndPoint { bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) EndPointCB _onChangeCB = NULL; EndPointCB _onChangeOnOffCB = NULL; - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h index cf733f4c497..0b66be6c14e 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h @@ -39,18 +39,6 @@ class MatterOnOffPlugin : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // this function is invoked when clients interact with the Identify Cluster of an specific endpoint - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } // User Callback for whenever the Plugin state is changed by the Matter Controller using EndPointCB = std::function; @@ -66,6 +54,5 @@ class MatterOnOffPlugin : public MatterEndPoint { bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) EndPointCB _onChangeCB = NULL; EndPointCB _onChangeOnOffCB = NULL; - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h index 8ff4446c6b7..9fdd90c6ebe 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h @@ -50,24 +50,11 @@ class MatterPressureSensor : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // this function is invoked when clients interact with the Identify Cluster of an specific endpoint - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } protected: bool started = false; // implementation keeps pressure in hPa int16_t rawPressure = 0; - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; // internal function to set the raw pressure value (Matter Cluster) bool setRawPressure(int16_t _rawPressure); bool begin(int16_t _rawPressure); diff --git a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h index cb50dc0ff5d..826abac9a2a 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h @@ -51,24 +51,11 @@ class MatterTemperatureSensor : public MatterEndPoint { // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // this function is invoked when clients interact with the Identify Cluster of an specific endpoint - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } protected: bool started = false; // implementation keeps temperature in 1/100th of a degree, any temperature unit int16_t rawTemperature = 0; - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; // internal function to set the raw temperature value (Matter Cluster) bool setRawTemperature(int16_t _rawTemperature); bool begin(int16_t _rawTemperature); From 3f7c5976d2fd8f8407546d257a29adaad9faa014 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 16 Dec 2024 11:40:49 -0300 Subject: [PATCH 112/183] feat(matter):replacing code in examples and header files --- .../MatterColorLight/MatterColorLight.ino | 8 ++++---- .../MatterContactSensor.ino | 8 ++++---- .../MatterDimmableLight.ino | 8 ++++---- .../MatterEnhancedColorLight.ino | 8 ++++---- .../Matter/examples/MatterFan/MatterFan.ino | 8 ++++---- .../MatterHumiditySensor.ino | 6 +++--- .../examples/MatterMinimum/MatterMinimum.ino | 12 +++++------ .../MatterOccupancySensor.ino | 6 +++--- .../MatterOnOffLight/MatterOnOffLight.ino | 8 ++++---- .../MatterOnOffPlugin/MatterOnOffPlugin.ino | 8 ++++---- .../MatterPressureSensor.ino | 6 +++--- .../MatterSmartButon/MatterSmartButon.ino | 8 ++++---- .../MatterTemperatureLight.ino | 8 ++++---- .../MatterTemperatureSensor.ino | 8 ++++---- .../src/MatterEndpoints/MatterColorLight.h | 20 +++++++++---------- .../MatterColorTemperatureLight.h | 20 +++++++++---------- .../src/MatterEndpoints/MatterDimmableLight.h | 20 ++++++++++--------- .../MatterEnhancedColorLight.h | 20 +++++++++---------- .../Matter/src/MatterEndpoints/MatterFan.h | 15 +++++++------- .../src/MatterEndpoints/MatterOnOffLight.h | 20 +++++++++++-------- .../src/MatterEndpoints/MatterOnOffPlugin.h | 20 +++++++++++-------- .../MatterEndpoints/MatterPressureSensor.h | 1 + .../MatterEndpoints/MatterTemperatureSensor.h | 1 + 23 files changed, 130 insertions(+), 117 deletions(-) diff --git a/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino b/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino index 4f296a684c9..dd1724f602d 100644 --- a/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino +++ b/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino @@ -21,6 +21,10 @@ // Color Light Endpoint MatterColorLight ColorLight; +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + // it will keep last OnOff & HSV Color state stored, using Preferences Preferences matterPref; const char *onOffPrefKey = "OnOff"; @@ -43,10 +47,6 @@ bool button_state = false; // false = released | true = pres const uint32_t debouceTime = 250; // button debouncing time (ms) const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - // Set the RGB LED Light based on the current state of the Color Light bool setLightState(bool state, espHsvColor_t colorHSV) { diff --git a/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino b/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino index 7b4d95a880b..e27f70e613d 100644 --- a/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino +++ b/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino @@ -36,6 +36,10 @@ // Matter Contact Sensor Endpoint MatterContactSensor ContactSensor; +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + // LED will be used to indicate the Contact Sensor state // set your board RGB LED pin here #ifdef RGB_BUILTIN @@ -48,10 +52,6 @@ const uint8_t ledPin = 2; // Set your pin here if your board has not defined LE // set your board USER BUTTON pin here - decommissioning and Manual Contact Sensor toggle button const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - // Button control uint32_t button_time_stamp = 0; // debouncing control bool button_state = false; // false = released | true = pressed diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index 7e176803c0a..cb8b8b6f17f 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -21,6 +21,10 @@ // Dimmable Light Endpoint MatterDimmableLight DimmableLight; +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + // it will keep last OnOff & Brightness state stored, using Preferences Preferences matterPref; const char *onOffPrefKey = "OnOff"; @@ -43,10 +47,6 @@ bool button_state = false; // false = released | true = pres const uint32_t debouceTime = 250; // button debouncing time (ms) const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - // Set the RGB LED Light based on the current state of the Dimmable Light bool setLightState(bool state, uint8_t brightness) { if (state) { diff --git a/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino index 5821707a6f7..bd2d13899ca 100644 --- a/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino +++ b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino @@ -21,6 +21,10 @@ // Color Light Endpoint MatterEnhancedColorLight EnhancedColorLight; +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + // It will use HSV color to control all Matter Attribute Changes HsvColor_t currentHSVColor = {0, 0, 0}; @@ -46,10 +50,6 @@ bool button_state = false; // false = released | true = pres const uint32_t debouceTime = 250; // button debouncing time (ms) const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - // Set the RGB LED Light based on the current state of the Enhanced Color Light bool setLightState(bool state, espHsvColor_t colorHSV, uint8_t brighteness, uint16_t temperature_Mireds) { diff --git a/libraries/Matter/examples/MatterFan/MatterFan.ino b/libraries/Matter/examples/MatterFan/MatterFan.ino index 62eaef038ef..3dc0c89fcf4 100644 --- a/libraries/Matter/examples/MatterFan/MatterFan.ino +++ b/libraries/Matter/examples/MatterFan/MatterFan.ino @@ -20,6 +20,10 @@ // Fan Endpoint - On/Off control + Speed Percent Control + Fan Modes MatterFan Fan; +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + // set your board USER BUTTON pin here - used for toggling On/Off and decommission the Matter Node const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. @@ -41,10 +45,6 @@ const uint8_t dcMotorPin = 2; // Set your pin here if your board has not define #warning "Do not forget to set the RGB LED pin" #endif -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - void fanDCMotorDrive(bool fanState, uint8_t speedPercent) { // drive the Fan DC motor if (fanState == false) { diff --git a/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino b/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino index c4977772c1b..3fcab46c565 100644 --- a/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino +++ b/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino @@ -27,13 +27,13 @@ // Matter Humidity Sensor Endpoint MatterHumiditySensor SimulatedHumiditySensor; -// set your board USER BUTTON pin here - decommissioning button -const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. - // WiFi is manually set and started const char *ssid = "your-ssid"; // Change this to your WiFi SSID const char *password = "your-password"; // Change this to your WiFi password +// set your board USER BUTTON pin here - decommissioning button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + // Button control - decommision the Matter Node uint32_t button_time_stamp = 0; // debouncing control bool button_state = false; // false = released | true = pressed diff --git a/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino b/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino index bd1e601c53f..fa2599df6dd 100644 --- a/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino +++ b/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino @@ -28,6 +28,10 @@ // Single On/Off Light Endpoint - at least one per node MatterOnOffLight OnOffLight; +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + // Light GPIO that can be controlled by Matter APP #ifdef LED_BUILTIN const uint8_t ledPin = LED_BUILTIN; @@ -44,16 +48,12 @@ bool button_state = false; // false = released | true = pres const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission // Matter Protocol Endpoint (On/OFF Light) Callback -bool matterCB(bool state) { +bool onOffLightCallback(bool state) { digitalWrite(ledPin, state ? HIGH : LOW); // This callback must return the success state to Matter core return true; } -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - void setup() { // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node pinMode(buttonPin, INPUT_PULLUP); @@ -71,7 +71,7 @@ void setup() { OnOffLight.begin(); // Associate a callback to the Matter Controller - OnOffLight.onChange(matterCB); + OnOffLight.onChange(onOffLightCallback); // Matter beginning - Last step, after all EndPoints are initialized Matter.begin(); diff --git a/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino b/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino index 7582a423dc0..e88a9a8986b 100644 --- a/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino +++ b/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino @@ -34,13 +34,13 @@ // Matter Occupancy Sensor Endpoint MatterOccupancySensor OccupancySensor; -// set your board USER BUTTON pin here - decommissioning only -const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. - // WiFi is manually set and started const char *ssid = "your-ssid"; // Change this to your WiFi SSID const char *password = "your-password"; // Change this to your WiFi password +// set your board USER BUTTON pin here - decommissioning only +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + // Button control uint32_t button_time_stamp = 0; // debouncing control bool button_state = false; // false = released | true = pressed diff --git a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino index 93cc12f901f..5faa0a385b0 100644 --- a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino +++ b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino @@ -17,6 +17,10 @@ #include #include +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + // List of Matter Endpoints for this Node // On/Off Light Endpoint MatterOnOffLight OnOffLight; @@ -42,10 +46,6 @@ bool button_state = false; // false = released | true = pres const uint32_t debouceTime = 250; // button debouncing time (ms) const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - // Matter Protocol Endpoint Callback bool setLightOnOff(bool state) { Serial.printf("User Callback :: New Light State = %s\r\n", state ? "ON" : "OFF"); diff --git a/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino b/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino index 1950b5bb9f3..d14e2189ec1 100644 --- a/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino +++ b/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino @@ -21,6 +21,10 @@ // On/Off Plugin Endpoint MatterOnOffPlugin OnOffPlugin; +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + // it will keep last OnOff state stored, using Preferences Preferences matterPref; const char *onOffPrefKey = "OnOff"; @@ -41,10 +45,6 @@ uint32_t button_time_stamp = 0; // debouncing control bool button_state = false; // false = released | true = pressed const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - // Matter Protocol Endpoint Callback bool setPluginOnOff(bool state) { Serial.printf("User Callback :: New Plugin State = %s\r\n", state ? "ON" : "OFF"); diff --git a/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino b/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino index aa6b28f199f..394a217b87a 100644 --- a/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino +++ b/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino @@ -27,13 +27,13 @@ // Matter Pressure Sensor Endpoint MatterPressureSensor SimulatedPressureSensor; -// set your board USER BUTTON pin here - decommissioning button -const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. - // WiFi is manually set and started const char *ssid = "your-ssid"; // Change this to your WiFi SSID const char *password = "your-password"; // Change this to your WiFi password +// set your board USER BUTTON pin here - decommissioning button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + // Button control - decommision the Matter Node uint32_t button_time_stamp = 0; // debouncing control bool button_state = false; // false = released | true = pressed diff --git a/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino b/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino index c0c13e31814..f8da970595d 100644 --- a/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino +++ b/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino @@ -20,6 +20,10 @@ // Generic Switch Endpoint - works as a smart button with a single click MatterGenericSwitch SmartButton; +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + // set your board USER BUTTON pin here const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. @@ -29,10 +33,6 @@ bool button_state = false; // false = released | true = pres const uint32_t debouceTime = 250; // button debouncing time (ms) const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - void setup() { // Initialize the USER BUTTON (Boot button) GPIO that will act as a smart button or to decommission the Matter Node pinMode(buttonPin, INPUT_PULLUP); diff --git a/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino b/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino index 31bb535bf82..b814ba89704 100644 --- a/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino +++ b/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino @@ -21,6 +21,10 @@ // Color Temperature CW/WW Light Endpoint MatterColorTemperatureLight CW_WW_Light; +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + // it will keep last OnOff & Brightness state stored, using Preferences Preferences matterPref; const char *onOffPrefKey = "OnOff"; @@ -44,10 +48,6 @@ bool button_state = false; // false = released | true = pres const uint32_t debouceTime = 250; // button debouncing time (ms) const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - // Set the RGB LED Light based on the current state of the Color Temperature Light bool setLightState(bool state, uint8_t brightness, uint16_t temperature_Mireds) { diff --git a/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino b/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino index 86055be26ee..e8513f12aaa 100644 --- a/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino +++ b/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino @@ -27,6 +27,10 @@ // Matter Temperature Sensor Endpoint MatterTemperatureSensor SimulatedTemperatureSensor; +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + // set your board USER BUTTON pin here - decommissioning button const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. @@ -35,10 +39,6 @@ uint32_t button_time_stamp = 0; // debouncing control bool button_state = false; // false = released | true = pressed const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - // Simulate a temperature sensor - add your preferred temperature sensor library code here float getSimulatedTemperature() { // The Endpoint implementation keeps an int16_t as internal value information, diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorLight.h index 13ff0decbc2..b896afa9b7a 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterColorLight.h @@ -37,16 +37,6 @@ class MatterColorLight : public MatterEndPoint { bool setColorHSV(espHsvColor_t hsvColor); // returns true if successful espHsvColor_t getColorHSV(); // returns current HSV Color - // used to update the state of the light using the current Matter Light internal state - // It is necessary to set a user callback function using onChange() to handle the physical light state - void updateAccessory(); - - operator bool(); // returns current on/off light state - void operator=(bool state); // turns light on or off - - // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. - bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // User Callback for whenever the Light On/Off state is changed by the Matter Controller using EndPointOnOffCB = std::function; void onChangeOnOff(EndPointOnOffCB onChangeCB) { @@ -64,6 +54,16 @@ class MatterColorLight : public MatterEndPoint { _onChangeCB = onChangeCB; } + // used to update the state of the light using the current Matter Light internal state + // It is necessary to set a user callback function using onChange() to handle the physical light state + void updateAccessory(); + + operator bool(); // returns current on/off light state + void operator=(bool state); // turns light on or off + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + protected: bool started = false; bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h index e886a184182..539bc386e92 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h @@ -42,16 +42,6 @@ class MatterColorTemperatureLight : public MatterEndPoint { bool setColorTemperature(uint16_t newTemperature); // returns true if successful uint16_t getColorTemperature(); // returns current temperature - // used to update the state of the light using the current Matter Light internal state - // It is necessary to set a user callback function using onChange() to handle the physical light state - void updateAccessory(); - - operator bool(); // returns current on/off light state - void operator=(bool state); // turns light on or off - - // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. - bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // User Callback for whenever the Light On/Off state is changed by the Matter Controller using EndPointOnOffCB = std::function; void onChangeOnOff(EndPointOnOffCB onChangeCB) { @@ -76,6 +66,16 @@ class MatterColorTemperatureLight : public MatterEndPoint { _onChangeCB = onChangeCB; } + // used to update the state of the light using the current Matter Light internal state + // It is necessary to set a user callback function using onChange() to handle the physical light state + void updateAccessory(); + + operator bool(); // returns current on/off light state + void operator=(bool state); // turns light on or off + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + protected: bool started = false; bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h index aacce883277..04e658d8c0d 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h @@ -37,19 +37,12 @@ class MatterDimmableLight : public MatterEndPoint { bool setBrightness(uint8_t newBrightness); // returns true if successful uint8_t getBrightness(); // returns current brightness - // used to update the state of the light using the current Matter Light internal state - // It is necessary to set a user callback function using onChange() to handle the physical light state - void updateAccessory(); - - operator bool(); // returns current on/off light state - void operator=(bool state); // turns light on or off - // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. - bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // User Callback for whenever the Light On/Off state is changed by the Matter Controller + // User Callback for whenever the Light On/Off state is changed by the Matter Controller using EndPointOnOffCB = std::function; void onChangeOnOff(EndPointOnOffCB onChangeCB) { _onChangeOnOffCB = onChangeCB; } + // User Callback for whenever the Light brightness value [0..255] is changed by the Matter Controller using EndPointBrightnessCB = std::function; void onChangeBrightness(EndPointBrightnessCB onChangeCB) { @@ -62,6 +55,15 @@ class MatterDimmableLight : public MatterEndPoint { _onChangeCB = onChangeCB; } + // used to update the state of the light using the current Matter Light internal state + // It is necessary to set a user callback function using onChange() to handle the physical light state + void updateAccessory(); + +operator bool(); // returns current on/off light state + void operator=(bool state); // turns light on or off + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + protected: bool started = false; bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h index 66ed1943b8d..ff6e69e3e65 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h @@ -47,16 +47,6 @@ class MatterEnhancedColorLight : public MatterEndPoint { bool setColorHSV(espHsvColor_t hsvColor); // returns true if successful espHsvColor_t getColorHSV(); // returns current HSV Color - // used to update the state of the light using the current Matter Light internal state - // It is necessary to set a user callback function using onChange() to handle the physical light state - void updateAccessory(); - - operator bool(); // returns current on/off light state - void operator=(bool state); // turns light on or off - - // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. - bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); - // User Callback for whenever the Light On/Off state is changed by the Matter Controller using EndPointOnOffCB = std::function; void onChangeOnOff(EndPointOnOffCB onChangeCB) { @@ -87,6 +77,16 @@ class MatterEnhancedColorLight : public MatterEndPoint { _onChangeCB = onChangeCB; } + // used to update the state of the light using the current Matter Light internal state + // It is necessary to set a user callback function using onChange() to handle the physical light state + void updateAccessory(); + + operator bool(); // returns current on/off light state + void operator=(bool state); // turns light on or off + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + protected: bool started = false; bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) diff --git a/libraries/Matter/src/MatterEndpoints/MatterFan.h b/libraries/Matter/src/MatterEndpoints/MatterFan.h index 232577b7bef..a1cd6e42423 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterFan.h +++ b/libraries/Matter/src/MatterEndpoints/MatterFan.h @@ -98,13 +98,6 @@ class MatterFan : public MatterEndPoint { operator uint8_t() { return getSpeedPercent(); } - // sets Fan speed percent - void operator=(uint8_t speedPercent) { - setSpeedPercent(speedPercent); - } - - // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. - bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); // User Callback for whenever the Fan Mode (state) is changed by the Matter Controller using EndPointModeCB = std::function; @@ -124,6 +117,14 @@ class MatterFan : public MatterEndPoint { _onChangeCB = onChangeCB; } + // sets Fan speed percent + void operator=(uint8_t speedPercent) { + setSpeedPercent(speedPercent); + } + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + protected: bool started = false; uint8_t validFanModes = 0; // bitmap for valid Fan Modes - index of fanModeSequence[] diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h index 6d140a9948e..ec524d2c300 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h @@ -30,23 +30,27 @@ class MatterOnOffLight : public MatterEndPoint { bool getOnOff(); // returns current light state bool toggle(); // returns true if successful - // used to update the state of the light using the current Matter Light internal state - // It is necessary to set a user callback function using onChange() to handle the physical light state - void updateAccessory(); - - operator bool(); // returns current light state - void operator=(bool state); // turns light on or off - // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. - bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); // User Callback for whenever the Light state is changed by the Matter Controller using EndPointCB = std::function; void onChange(EndPointCB onChangeCB) { _onChangeCB = onChangeCB; } + + // User Callback for whenever the Light On/Off state is changed by the Matter Controller void onChangeOnOff(EndPointCB onChangeCB) { _onChangeOnOffCB = onChangeCB; } + // used to update the state of the light using the current Matter Light internal state + // It is necessary to set a user callback function using onChange() to handle the physical light state + void updateAccessory(); + + operator bool(); // returns current light state + void operator=(bool state); // turns light on or off + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + protected: bool started = false; bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h index 241726a3a46..f95e127ca98 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h @@ -30,23 +30,27 @@ class MatterOnOffPlugin : public MatterEndPoint { bool getOnOff(); // returns current plugin state bool toggle(); // returns true if successful - // used to update the state of the plugin using the current Matter Plugin internal state - // It is necessary to set a user callback function using onChange() to handle the physical plugin state - void updateAccessory(); - - operator bool(); // returns current plugin state - void operator=(bool state); // turns plugin on or off - // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. - bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); // User Callback for whenever the Plugin state is changed by the Matter Controller using EndPointCB = std::function; void onChange(EndPointCB onChangeCB) { _onChangeCB = onChangeCB; } + + // User Callback for whenever the On/Off state is changed by the Matter Controller void onChangeOnOff(EndPointCB onChangeCB) { _onChangeOnOffCB = onChangeCB; } + // used to update the state of the plugin using the current Matter Plugin internal state + // It is necessary to set a user callback function using onChange() to handle the physical plugin state + void updateAccessory(); + + operator bool(); // returns current plugin state + void operator=(bool state); // turns plugin on or off + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + protected: bool started = false; bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) diff --git a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h index 9fdd90c6ebe..0715c05609d 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h @@ -39,6 +39,7 @@ class MatterPressureSensor : public MatterEndPoint { double getPressure() { return (double)rawPressure; } + // double conversion operator void operator=(double pressure) { setPressure(pressure); diff --git a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h index 826abac9a2a..27c61fdb978 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h @@ -40,6 +40,7 @@ class MatterTemperatureSensor : public MatterEndPoint { double getTemperature() { return (double)rawTemperature / 100.0; } + // double conversion operator void operator=(double temperature) { setTemperature(temperature); From 43c419e31b1de080ab00c6e33fad323f48222fad Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 14:41:38 +0000 Subject: [PATCH 113/183] ci(pre-commit): Apply automatic fixes --- libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h | 4 ++-- libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h index 04e658d8c0d..4497edd2fe2 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h @@ -37,7 +37,7 @@ class MatterDimmableLight : public MatterEndPoint { bool setBrightness(uint8_t newBrightness); // returns true if successful uint8_t getBrightness(); // returns current brightness - // User Callback for whenever the Light On/Off state is changed by the Matter Controller + // User Callback for whenever the Light On/Off state is changed by the Matter Controller using EndPointOnOffCB = std::function; void onChangeOnOff(EndPointOnOffCB onChangeCB) { _onChangeOnOffCB = onChangeCB; @@ -59,7 +59,7 @@ class MatterDimmableLight : public MatterEndPoint { // It is necessary to set a user callback function using onChange() to handle the physical light state void updateAccessory(); -operator bool(); // returns current on/off light state + operator bool(); // returns current on/off light state void operator=(bool state); // turns light on or off // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h index f95e127ca98..0b05c0944c4 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h @@ -35,7 +35,7 @@ class MatterOnOffPlugin : public MatterEndPoint { void onChange(EndPointCB onChangeCB) { _onChangeCB = onChangeCB; } - + // User Callback for whenever the On/Off state is changed by the Matter Controller void onChangeOnOff(EndPointCB onChangeCB) { _onChangeOnOffCB = onChangeCB; From cd7a775344ba671dd9c01c930882bd62d5a1d98b Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 16 Dec 2024 11:47:07 -0300 Subject: [PATCH 114/183] fix(matter): missing logged message type value --- libraries/Matter/src/Matter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Matter/src/Matter.cpp b/libraries/Matter/src/Matter.cpp index 51ab9c91cf1..5d125ce6919 100644 --- a/libraries/Matter/src/Matter.cpp +++ b/libraries/Matter/src/Matter.cpp @@ -68,7 +68,7 @@ static esp_err_t app_attribute_update_cb( // This callback is invoked when clients interact with the Identify Cluster. // In the callback implementation, an endpoint can identify itself. (e.g., by flashing an LED or light). static esp_err_t app_identification_cb(identification::callback_type_t type, uint16_t endpoint_id, uint8_t effect_id, uint8_t effect_variant, void *priv_data) { - log_d("Identification callback to endpoint %d: type: %u, effect: %u, variant: %u", endpoint_id, effect_id, effect_variant); + log_d("Identification callback to endpoint %d: type: %u, effect: %u, variant: %u", endpoint_id, type, effect_id, effect_variant); esp_err_t err = ESP_OK; MatterEndPoint *ep = (MatterEndPoint *)priv_data; // endpoint pointer to base class // Identify the endpoint sending a counter to the application From 8479b4cd9f0ba6e04360629e38b8e9a41a085b13 Mon Sep 17 00:00:00 2001 From: TD-er Date: Mon, 16 Dec 2024 16:25:53 +0100 Subject: [PATCH 115/183] [NetworkClient] Init members of NetworkClient Fixes: #10736 --- libraries/Network/src/NetworkClient.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/Network/src/NetworkClient.h b/libraries/Network/src/NetworkClient.h index bdf857e9637..13abf32f934 100644 --- a/libraries/Network/src/NetworkClient.h +++ b/libraries/Network/src/NetworkClient.h @@ -35,13 +35,13 @@ class ESPLwIPClient : public Client { class NetworkClient : public ESPLwIPClient { protected: - std::shared_ptr clientSocketHandle; - std::shared_ptr _rxBuffer; - bool _connected; - bool _sse; + std::shared_ptr clientSocketHandle = nullptr; + std::shared_ptr _rxBuffer = nullptr; + bool _connected = false; + bool _sse = false; int _timeout; - int _lastWriteTimeout; - int _lastReadTimeout; + int _lastWriteTimeout = 0; + int _lastReadTimeout = 0; public: NetworkClient *next; From 6f79e034495f6f8cea24ade0933810b336b43a23 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 16 Dec 2024 15:48:41 -0300 Subject: [PATCH 116/183] fix(matter): fixes identify and double begin() call --- .../MatterOnIdentify/MatterOnIdentify.ino | 58 +++++++++++++++---- libraries/Matter/src/Matter.cpp | 10 +--- libraries/Matter/src/MatterEndPoint.h | 6 +- .../src/MatterEndpoints/MatterColorLight.cpp | 7 ++- .../MatterColorTemperatureLight.cpp | 27 +++++---- .../MatterEndpoints/MatterContactSensor.cpp | 5 ++ .../MatterEndpoints/MatterDimmableLight.cpp | 6 +- .../MatterEnhancedColorLight.cpp | 7 ++- .../Matter/src/MatterEndpoints/MatterFan.cpp | 7 ++- .../MatterEndpoints/MatterGenericSwitch.cpp | 9 ++- .../MatterEndpoints/MatterHumiditySensor.cpp | 5 ++ .../MatterEndpoints/MatterOccupancySensor.cpp | 5 ++ .../src/MatterEndpoints/MatterOnOffLight.cpp | 7 ++- .../src/MatterEndpoints/MatterOnOffPlugin.cpp | 7 ++- .../MatterEndpoints/MatterPressureSensor.cpp | 5 ++ .../MatterTemperatureSensor.cpp | 5 ++ 16 files changed, 134 insertions(+), 42 deletions(-) diff --git a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino index 9b183e0b175..933b5a72367 100644 --- a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino +++ b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino @@ -51,6 +51,11 @@ uint32_t button_time_stamp = 0; // debouncing control bool button_state = false; // false = released | true = pressed const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission +// Identify Flag and blink time - Blink the LED +const uint8_t identifyLedPin = ledPin; // uses the same LED as the Light - change if needed +volatile bool identifyFlag = false; // Flag to start the Blink when in Identify state +bool identifyBlink = false; // Blink state when in Identify state + // Matter Protocol Endpoint (On/OFF Light) Callback bool onOffLightCallback(bool state) { digitalWrite(ledPin, state ? HIGH : LOW); @@ -58,14 +63,19 @@ bool onOffLightCallback(bool state) { return true; } -bool onIdentifyLightCallback(bool identifyIsActive, uint8_t counter) { - log_i("Identify Cluster is %s, counter: %d", identifyIsActive ? "Active" : "Inactive", counter); +// Identification shall be done by Blink in Red or just the GPIO when no LED_BUILTIN is not defined +bool onIdentifyLightCallback(bool identifyIsActive) { + log_i("Identify Cluster is %s", identifyIsActive ? "Active" : "Inactive"); if (identifyIsActive) { - // Start Blinking the light - OnOffLight.toggle(); + // Start Blinking the light in loop() + identifyFlag = true; + identifyBlink = !OnOffLight; // Start with the inverted light state } else { // Stop Blinking and restore the light to the its last state - OnOffLight.updateAccessory(); + identifyFlag = false; + // force returning to the original state by toggling the light twice + OnOffLight.toggle(); + OnOffLight.toggle(); } return true; } @@ -76,12 +86,16 @@ void setup() { // Initialize the LED GPIO pinMode(ledPin, OUTPUT); + Serial.begin(115200); + // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); + Serial.print("."); } + Serial.println(); // Initialize at least one Matter EndPoint OnOffLight.begin(); @@ -95,16 +109,38 @@ void setup() { // Matter beginning - Last step, after all EndPoints are initialized Matter.begin(); + // Check Matter Accessory Commissioning state, which may change during execution of loop() if (!Matter.isDeviceCommissioned()) { - log_i("Matter Node is not commissioned yet."); - log_i("Initiate the device discovery in your Matter environment."); - log_i("Commission it to your Matter hub with the manual pairing code or QR code"); - log_i("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); - log_i("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Occupancy Sensor Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); } } void loop() { + // check if the Ligth is in identify state and blink it every 500ms (delay loop time) + if (identifyFlag) { +#ifdef LED_BUILTIN + uint8_t brightness = 32 * identifyBlink; + rgbLedWrite(identifyLedPin, brightness, 0, 0); +#else + digitalWrite(identifyLedPin, identifyBlink ? HIGH : LOW); +#endif + identifyBlink = !identifyBlink; + } + // Check if the button has been pressed if (digitalRead(buttonPin) == LOW && !button_state) { // deals with button debouncing @@ -124,5 +160,5 @@ void loop() { button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so } - delay(500); + delay(500); // works as a debounce for the button and also for the LED blink } diff --git a/libraries/Matter/src/Matter.cpp b/libraries/Matter/src/Matter.cpp index 5d125ce6919..1c80bff941e 100644 --- a/libraries/Matter/src/Matter.cpp +++ b/libraries/Matter/src/Matter.cpp @@ -30,11 +30,6 @@ static bool _matter_has_started = false; static node::config_t node_config; static node_t *deviceNode = NULL; -typedef void *app_driver_handle_t; -esp_err_t matter_light_attribute_update( - app_driver_handle_t driver_handle, uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val -); - // This callback is called for every attribute update. The callback implementation shall // handle the desired attributes and return an appropriate error code. If the attribute // is not of your interest, please do not return an error code and strictly return ESP_OK. @@ -72,22 +67,19 @@ static esp_err_t app_identification_cb(identification::callback_type_t type, uin esp_err_t err = ESP_OK; MatterEndPoint *ep = (MatterEndPoint *)priv_data; // endpoint pointer to base class // Identify the endpoint sending a counter to the application - static uint8_t counter = 0; bool identifyIsActive = false; if (type == identification::callback_type_t::START) { log_v("Identification callback: START"); - counter = 0; identifyIsActive = true; } else if (type == identification::callback_type_t::EFFECT) { log_v("Identification callback: EFFECT"); - counter++; } else if (type == identification::callback_type_t::STOP) { identifyIsActive = false; log_v("Identification callback: STOP"); } if (ep != NULL) { - err = ep->endpointIdentifyCB(endpoint_id, identifyIsActive, counter) ? ESP_OK : ESP_FAIL; + err = ep->endpointIdentifyCB(endpoint_id, identifyIsActive) ? ESP_OK : ESP_FAIL; } return err; diff --git a/libraries/Matter/src/MatterEndPoint.h b/libraries/Matter/src/MatterEndPoint.h index 34b59bb18c8..f269b713a5e 100644 --- a/libraries/Matter/src/MatterEndPoint.h +++ b/libraries/Matter/src/MatterEndPoint.h @@ -103,14 +103,14 @@ class MatterEndPoint { virtual bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) = 0; // This callback is invoked when clients interact with the Identify Cluster of an specific endpoint. - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled, uint8_t identifyCounter) { + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled) { if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled, identifyCounter); + return _onEndPointIdentifyCB(identifyIsEnabled); } return true; } // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; + using EndPointIdentifyCB = std::function; void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { _onEndPointIdentifyCB = onEndPointIdentifyCB; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp index 6e2a7910433..eaaf0bf2ffe 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp @@ -162,8 +162,13 @@ MatterColorLight::~MatterColorLight() { bool MatterColorLight::begin(bool initialState, espHsvColor_t _colorHSV) { ArduinoMatter::_init(); - rgb_color_light::config_t light_config; + if (getEndPointId() != 0) { + log_e("Matter RGB Color Light with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + + rgb_color_light::config_t light_config; light_config.on_off.on_off = initialState; light_config.on_off.lighting.start_up_on_off = nullptr; onOffState = initialState; diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp index f54203b7928..5ef69749bb1 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp @@ -26,17 +26,17 @@ using namespace chip::app::Clusters; bool MatterColorTemperatureLight::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { bool ret = true; if (!started) { - log_e("Matter CW_WW Light device has not begun."); + log_e("Matter Temperature Light device has not begun."); return false; } - log_d("CW_WW Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); + log_d("Temperature Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); if (endpoint_id == getEndPointId()) { switch (cluster_id) { case OnOff::Id: if (attribute_id == OnOff::Attributes::OnOff::Id) { - log_d("CW_WW Light On/Off State changed to %d", val->val.b); + log_d("Temperature Light On/Off State changed to %d", val->val.b); if (_onChangeOnOffCB != NULL) { ret &= _onChangeOnOffCB(val->val.b); } @@ -50,7 +50,7 @@ bool MatterColorTemperatureLight::attributeChangeCB(uint16_t endpoint_id, uint32 break; case LevelControl::Id: if (attribute_id == LevelControl::Attributes::CurrentLevel::Id) { - log_d("CW_WW Light Brightness changed to %d", val->val.u8); + log_d("Temperature Light Brightness changed to %d", val->val.u8); if (_onChangeBrightnessCB != NULL) { ret &= _onChangeBrightnessCB(val->val.u8); } @@ -64,7 +64,7 @@ bool MatterColorTemperatureLight::attributeChangeCB(uint16_t endpoint_id, uint32 break; case ColorControl::Id: if (attribute_id == ColorControl::Attributes::ColorTemperatureMireds::Id) { - log_d("CW_WW Light Temperature changed to %d", val->val.u16); + log_d("Temperature Light Temperature changed to %d", val->val.u16); if (_onChangeTemperatureCB != NULL) { ret &= _onChangeTemperatureCB(val->val.u16); } @@ -89,8 +89,13 @@ MatterColorTemperatureLight::~MatterColorTemperatureLight() { bool MatterColorTemperatureLight::begin(bool initialState, uint8_t brightness, uint16_t ColorTemperature) { ArduinoMatter::_init(); - color_temperature_light::config_t light_config; + if (getEndPointId() != 0) { + log_e("Matter Temperature Light with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + + color_temperature_light::config_t light_config; light_config.on_off.on_off = initialState; light_config.on_off.lighting.start_up_on_off = nullptr; onOffState = initialState; @@ -108,12 +113,12 @@ bool MatterColorTemperatureLight::begin(bool initialState, uint8_t brightness, u // endpoint handles can be used to add/modify clusters. endpoint_t *endpoint = color_temperature_light::create(node::get(), &light_config, ENDPOINT_FLAG_NONE, (void *)this); if (endpoint == nullptr) { - log_e("Failed to create CW_WW light endpoint"); + log_e("Failed to create Temperature Light endpoint"); return false; } setEndPointId(endpoint::get_id(endpoint)); - log_i("CW_WW Light created with endpoint_id %d", getEndPointId()); + log_i("Temperature Light created with endpoint_id %d", getEndPointId()); /* Mark deferred persistence for some attributes that might be changed rapidly */ cluster_t *level_control_cluster = cluster::get(endpoint, LevelControl::Id); @@ -134,7 +139,7 @@ void MatterColorTemperatureLight::end() { bool MatterColorTemperatureLight::setOnOff(bool newState) { if (!started) { - log_e("Matter CW_WW Light device has not begun."); + log_e("Matter Temperature Light device has not begun."); return false; } @@ -175,7 +180,7 @@ bool MatterColorTemperatureLight::toggle() { bool MatterColorTemperatureLight::setBrightness(uint8_t newBrightness) { if (!started) { - log_w("Matter CW_WW Light device has not begun."); + log_w("Matter Temperature Light device has not begun."); return false; } @@ -206,7 +211,7 @@ uint8_t MatterColorTemperatureLight::getBrightness() { bool MatterColorTemperatureLight::setColorTemperature(uint16_t newTemperature) { if (!started) { - log_w("Matter CW_WW Light device has not begun."); + log_w("Matter Temperature Light device has not begun."); return false; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp index fb08587c6f6..17b0fe7a247 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp @@ -43,6 +43,11 @@ MatterContactSensor::~MatterContactSensor() { bool MatterContactSensor::begin(bool _contactState) { ArduinoMatter::_init(); + if (getEndPointId() != 0) { + log_e("Matter Contact Sensor with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + contact_sensor::config_t contact_sensor_config; contact_sensor_config.boolean_state.state_value = _contactState; diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp index cd9830be8ac..9f6f872ca3e 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp @@ -75,8 +75,12 @@ MatterDimmableLight::~MatterDimmableLight() { bool MatterDimmableLight::begin(bool initialState, uint8_t brightness) { ArduinoMatter::_init(); - dimmable_light::config_t light_config; + if (getEndPointId() != 0) { + log_e("Matter Dimmable Light with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + dimmable_light::config_t light_config; light_config.on_off.on_off = initialState; light_config.on_off.lighting.start_up_on_off = nullptr; onOffState = initialState; diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp index 215e52b4137..022e62654df 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp @@ -178,8 +178,13 @@ MatterEnhancedColorLight::~MatterEnhancedColorLight() { bool MatterEnhancedColorLight::begin(bool initialState, espHsvColor_t _colorHSV, uint8_t brightness, uint16_t ColorTemperature) { ArduinoMatter::_init(); - enhanced_color_light::config_t light_config; + if (getEndPointId() != 0) { + log_e("Matter Enhanced ColorLight with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + + enhanced_color_light::config_t light_config; light_config.on_off.on_off = initialState; light_config.on_off.lighting.start_up_on_off = nullptr; onOffState = initialState; diff --git a/libraries/Matter/src/MatterEndpoints/MatterFan.cpp b/libraries/Matter/src/MatterEndpoints/MatterFan.cpp index 12de176d176..f81d49f22a7 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterFan.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterFan.cpp @@ -85,7 +85,12 @@ bool MatterFan::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uin bool MatterFan::begin(uint8_t percent, FanMode_t fanMode, FanModeSequence_t fanModeSeq) { ArduinoMatter::_init(); - // endpoint handles can be used to add/modify clusters. + if (getEndPointId() != 0) { + log_e("Matter Fan with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + + // endpoint handles can be used to add/modify clusters. fan::config_t fan_config; fan_config.fan_control.fan_mode = fanMode; fan_config.fan_control.percent_current = percent; diff --git a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp index bbf72af0a95..c8f2c4ec444 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp @@ -42,12 +42,17 @@ bool MatterGenericSwitch::attributeChangeCB(uint16_t endpoint_id, uint32_t clust bool MatterGenericSwitch::begin() { ArduinoMatter::_init(); - generic_switch::config_t switch_config; + if (getEndPointId() != 0) { + log_e("Matter Generic Switch with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + + generic_switch::config_t switch_config; // endpoint handles can be used to add/modify clusters. endpoint_t *endpoint = generic_switch::create(node::get(), &switch_config, ENDPOINT_FLAG_NONE, (void *)this); if (endpoint == nullptr) { - log_e("Failed to create Generic switch endpoint"); + log_e("Failed to create Generic Switch endpoint"); return false; } // Add group cluster to the switch endpoint diff --git a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp index 7526b99a7b9..d31d0e43728 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp @@ -43,6 +43,11 @@ MatterHumiditySensor::~MatterHumiditySensor() { bool MatterHumiditySensor::begin(uint16_t _rawHumidity) { ArduinoMatter::_init(); + if (getEndPointId() != 0) { + log_e("Matter Humidity Sensor with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + // is it a valid percentage value? if (_rawHumidity > 10000) { log_e("Humidity Sensor Percentage value out of range [0..100]."); diff --git a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp index ad200bc2ad8..0d55c37708a 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp @@ -52,6 +52,11 @@ MatterOccupancySensor::~MatterOccupancySensor() { bool MatterOccupancySensor::begin(bool _occupancyState, OccupancySensorType_t _occupancySensorType) { ArduinoMatter::_init(); + if (getEndPointId() != 0) { + log_e("Matter Occupancy Sensor with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + occupancy_sensor::config_t occupancy_sensor_config; occupancy_sensor_config.occupancy_sensing.occupancy = _occupancyState; occupancy_sensor_config.occupancy_sensing.occupancy_sensor_type = _occupancySensorType; diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp index 1071b595e5b..3faba821528 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp @@ -59,8 +59,13 @@ MatterOnOffLight::~MatterOnOffLight() { bool MatterOnOffLight::begin(bool initialState) { ArduinoMatter::_init(); - on_off_light::config_t light_config; + if (getEndPointId() != 0) { + log_e("Matter On-Off Light with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + + on_off_light::config_t light_config; light_config.on_off.on_off = initialState; light_config.on_off.lighting.start_up_on_off = nullptr; onOffState = initialState; diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp index 546da3b04e9..9b08958684c 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp @@ -59,8 +59,13 @@ MatterOnOffPlugin::~MatterOnOffPlugin() { bool MatterOnOffPlugin::begin(bool initialState) { ArduinoMatter::_init(); - on_off_plugin_unit::config_t plugin_config; + if (getEndPointId() != 0) { + log_e("Matter On-Off Plugin with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + + on_off_plugin_unit::config_t plugin_config; plugin_config.on_off.on_off = initialState; plugin_config.on_off.lighting.start_up_on_off = nullptr; diff --git a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp index f246ea81223..86d245d4041 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp @@ -42,6 +42,11 @@ MatterPressureSensor::~MatterPressureSensor() { bool MatterPressureSensor::begin(int16_t _rawPressure) { ArduinoMatter::_init(); + if (getEndPointId() != 0) { + log_e("Matter Pressure Sensor with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + pressure_sensor::config_t pressure_sensor_config; pressure_sensor_config.pressure_measurement.pressure_measured_value = _rawPressure; pressure_sensor_config.pressure_measurement.pressure_min_measured_value = nullptr; diff --git a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp index 6f59a5b2426..903e6b98d98 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp @@ -42,6 +42,11 @@ MatterTemperatureSensor::~MatterTemperatureSensor() { bool MatterTemperatureSensor::begin(int16_t _rawTemperature) { ArduinoMatter::_init(); + if (getEndPointId() != 0) { + log_e("Temperature Sensor with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + temperature_sensor::config_t temperature_sensor_config; temperature_sensor_config.temperature_measurement.measured_value = _rawTemperature; temperature_sensor_config.temperature_measurement.min_measured_value = nullptr; From 7302be97925072e87a3fa927c387e5082ee41b38 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 16 Dec 2024 15:50:59 -0300 Subject: [PATCH 117/183] fix(matter): log_i() leftover --- libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino index 933b5a72367..8a9da918443 100644 --- a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino +++ b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino @@ -65,7 +65,7 @@ bool onOffLightCallback(bool state) { // Identification shall be done by Blink in Red or just the GPIO when no LED_BUILTIN is not defined bool onIdentifyLightCallback(bool identifyIsActive) { - log_i("Identify Cluster is %s", identifyIsActive ? "Active" : "Inactive"); + Serial.printf("Identify Cluster is %s\r\n", identifyIsActive ? "Active" : "Inactive"); if (identifyIsActive) { // Start Blinking the light in loop() identifyFlag = true; From 1ef603aab7a47d58db94bfe48473404a7e03674f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 19:13:45 +0000 Subject: [PATCH 118/183] ci(pre-commit): Apply automatic fixes --- .../MatterOnIdentify/MatterOnIdentify.ino | 328 +++++++++--------- libraries/Matter/src/Matter.cpp | 2 +- libraries/Matter/src/MatterEndPoint.h | 1 - .../Matter/src/MatterEndpoints/MatterFan.cpp | 4 +- .../MatterEndpoints/MatterGenericSwitch.cpp | 2 +- 5 files changed, 168 insertions(+), 169 deletions(-) diff --git a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino index 8a9da918443..6dce8d863a6 100644 --- a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino +++ b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino @@ -1,164 +1,164 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* - * This example is the smallest code that will create a Matter Device which can be - * commissioned and controlled from a Matter Environment APP. - * It controls a GPIO that could be attached to a LED for visualization. - * Additionally the ESP32 will send debug messages indicating the Matter activity. - * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. - * - * This example is a simple Matter On/Off Light that can be controlled by a Matter Controller. - * It demonstrates how to use On Identify callback when the Identify Cluster is called. - * The Matter user APP can be used to request the device to identify itself by blinking the LED. - */ - -// Matter Manager -#include -#include - -// List of Matter Endpoints for this Node -// Single On/Off Light Endpoint - at least one per node -MatterOnOffLight OnOffLight; - -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - -// Light GPIO that can be controlled by Matter APP -#ifdef LED_BUILTIN -const uint8_t ledPin = LED_BUILTIN; -#else -const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN -#endif - -// set your board USER BUTTON pin here - decommissioning button -const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. - -// Button control - decommision the Matter Node -uint32_t button_time_stamp = 0; // debouncing control -bool button_state = false; // false = released | true = pressed -const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission - -// Identify Flag and blink time - Blink the LED -const uint8_t identifyLedPin = ledPin; // uses the same LED as the Light - change if needed -volatile bool identifyFlag = false; // Flag to start the Blink when in Identify state -bool identifyBlink = false; // Blink state when in Identify state - -// Matter Protocol Endpoint (On/OFF Light) Callback -bool onOffLightCallback(bool state) { - digitalWrite(ledPin, state ? HIGH : LOW); - // This callback must return the success state to Matter core - return true; -} - -// Identification shall be done by Blink in Red or just the GPIO when no LED_BUILTIN is not defined -bool onIdentifyLightCallback(bool identifyIsActive) { - Serial.printf("Identify Cluster is %s\r\n", identifyIsActive ? "Active" : "Inactive"); - if (identifyIsActive) { - // Start Blinking the light in loop() - identifyFlag = true; - identifyBlink = !OnOffLight; // Start with the inverted light state - } else { - // Stop Blinking and restore the light to the its last state - identifyFlag = false; - // force returning to the original state by toggling the light twice - OnOffLight.toggle(); - OnOffLight.toggle(); - } - return true; -} - -void setup() { - // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node - pinMode(buttonPin, INPUT_PULLUP); - // Initialize the LED GPIO - pinMode(ledPin, OUTPUT); - - Serial.begin(115200); - - // Manually connect to WiFi - WiFi.begin(ssid, password); - // Wait for connection - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - Serial.println(); - - // Initialize at least one Matter EndPoint - OnOffLight.begin(); - - // On Identify Callback - Blink the LED - OnOffLight.onIdentify(onIdentifyLightCallback); - - // Associate a callback to the Matter Controller - OnOffLight.onChange(onOffLightCallback); - - // Matter beginning - Last step, after all EndPoints are initialized - Matter.begin(); - - // Check Matter Accessory Commissioning state, which may change during execution of loop() - if (!Matter.isDeviceCommissioned()) { - Serial.println(""); - Serial.println("Matter Node is not commissioned yet."); - Serial.println("Initiate the device discovery in your Matter environment."); - Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); - Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); - Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); - // waits for Matter Occupancy Sensor Commissioning. - uint32_t timeCount = 0; - while (!Matter.isDeviceCommissioned()) { - delay(100); - if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec - Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); - } - } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); - } -} - -void loop() { - // check if the Ligth is in identify state and blink it every 500ms (delay loop time) - if (identifyFlag) { -#ifdef LED_BUILTIN - uint8_t brightness = 32 * identifyBlink; - rgbLedWrite(identifyLedPin, brightness, 0, 0); -#else - digitalWrite(identifyLedPin, identifyBlink ? HIGH : LOW); -#endif - identifyBlink = !identifyBlink; - } - - // Check if the button has been pressed - if (digitalRead(buttonPin) == LOW && !button_state) { - // deals with button debouncing - button_time_stamp = millis(); // record the time while the button is pressed. - button_state = true; // pressed. - } - - if (digitalRead(buttonPin) == HIGH && button_state) { - button_state = false; // released - } - - // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node - uint32_t time_diff = millis() - button_time_stamp; - if (button_state && time_diff > decommissioningTimeout) { - Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); - Matter.decommission(); - button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so - } - - delay(500); // works as a debounce for the button and also for the LED blink -} +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + * This example is the smallest code that will create a Matter Device which can be + * commissioned and controlled from a Matter Environment APP. + * It controls a GPIO that could be attached to a LED for visualization. + * Additionally the ESP32 will send debug messages indicating the Matter activity. + * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. + * + * This example is a simple Matter On/Off Light that can be controlled by a Matter Controller. + * It demonstrates how to use On Identify callback when the Identify Cluster is called. + * The Matter user APP can be used to request the device to identify itself by blinking the LED. + */ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Single On/Off Light Endpoint - at least one per node +MatterOnOffLight OnOffLight; + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Light GPIO that can be controlled by Matter APP +#ifdef LED_BUILTIN +const uint8_t ledPin = LED_BUILTIN; +#else +const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN +#endif + +// set your board USER BUTTON pin here - decommissioning button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control - decommision the Matter Node +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +// Identify Flag and blink time - Blink the LED +const uint8_t identifyLedPin = ledPin; // uses the same LED as the Light - change if needed +volatile bool identifyFlag = false; // Flag to start the Blink when in Identify state +bool identifyBlink = false; // Blink state when in Identify state + +// Matter Protocol Endpoint (On/OFF Light) Callback +bool onOffLightCallback(bool state) { + digitalWrite(ledPin, state ? HIGH : LOW); + // This callback must return the success state to Matter core + return true; +} + +// Identification shall be done by Blink in Red or just the GPIO when no LED_BUILTIN is not defined +bool onIdentifyLightCallback(bool identifyIsActive) { + Serial.printf("Identify Cluster is %s\r\n", identifyIsActive ? "Active" : "Inactive"); + if (identifyIsActive) { + // Start Blinking the light in loop() + identifyFlag = true; + identifyBlink = !OnOffLight; // Start with the inverted light state + } else { + // Stop Blinking and restore the light to the its last state + identifyFlag = false; + // force returning to the original state by toggling the light twice + OnOffLight.toggle(); + OnOffLight.toggle(); + } + return true; +} + +void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + pinMode(buttonPin, INPUT_PULLUP); + // Initialize the LED GPIO + pinMode(ledPin, OUTPUT); + + Serial.begin(115200); + + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + // Initialize at least one Matter EndPoint + OnOffLight.begin(); + + // On Identify Callback - Blink the LED + OnOffLight.onIdentify(onIdentifyLightCallback); + + // Associate a callback to the Matter Controller + OnOffLight.onChange(onOffLightCallback); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Occupancy Sensor Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } +} + +void loop() { + // check if the Ligth is in identify state and blink it every 500ms (delay loop time) + if (identifyFlag) { +#ifdef LED_BUILTIN + uint8_t brightness = 32 * identifyBlink; + rgbLedWrite(identifyLedPin, brightness, 0, 0); +#else + digitalWrite(identifyLedPin, identifyBlink ? HIGH : LOW); +#endif + identifyBlink = !identifyBlink; + } + + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (digitalRead(buttonPin) == HIGH && button_state) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } + + delay(500); // works as a debounce for the button and also for the LED blink +} diff --git a/libraries/Matter/src/Matter.cpp b/libraries/Matter/src/Matter.cpp index 1c80bff941e..af7c4c8657e 100644 --- a/libraries/Matter/src/Matter.cpp +++ b/libraries/Matter/src/Matter.cpp @@ -81,7 +81,7 @@ static esp_err_t app_identification_cb(identification::callback_type_t type, uin if (ep != NULL) { err = ep->endpointIdentifyCB(endpoint_id, identifyIsActive) ? ESP_OK : ESP_FAIL; } - + return err; } diff --git a/libraries/Matter/src/MatterEndPoint.h b/libraries/Matter/src/MatterEndPoint.h index f269b713a5e..6f99aa7cd33 100644 --- a/libraries/Matter/src/MatterEndPoint.h +++ b/libraries/Matter/src/MatterEndPoint.h @@ -115,7 +115,6 @@ class MatterEndPoint { _onEndPointIdentifyCB = onEndPointIdentifyCB; } - protected: uint16_t endpoint_id = 0; EndPointIdentifyCB _onEndPointIdentifyCB = NULL; diff --git a/libraries/Matter/src/MatterEndpoints/MatterFan.cpp b/libraries/Matter/src/MatterEndpoints/MatterFan.cpp index f81d49f22a7..1647490aa05 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterFan.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterFan.cpp @@ -85,12 +85,12 @@ bool MatterFan::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uin bool MatterFan::begin(uint8_t percent, FanMode_t fanMode, FanModeSequence_t fanModeSeq) { ArduinoMatter::_init(); - if (getEndPointId() != 0) { + if (getEndPointId() != 0) { log_e("Matter Fan with Endpoint Id %d device has already been created.", getEndPointId()); return false; } - // endpoint handles can be used to add/modify clusters. + // endpoint handles can be used to add/modify clusters. fan::config_t fan_config; fan_config.fan_control.fan_mode = fanMode; fan_config.fan_control.percent_current = percent; diff --git a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp index c8f2c4ec444..e20479af088 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp @@ -43,7 +43,7 @@ bool MatterGenericSwitch::attributeChangeCB(uint16_t endpoint_id, uint32_t clust bool MatterGenericSwitch::begin() { ArduinoMatter::_init(); - if (getEndPointId() != 0) { + if (getEndPointId() != 0) { log_e("Matter Generic Switch with Endpoint Id %d device has already been created.", getEndPointId()); return false; } From 017f2df8efb8a58966f945962cb30f86452ff6d0 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 16 Dec 2024 16:19:47 -0300 Subject: [PATCH 119/183] fix(matter): ci codespell --- .../MatterOnIdentify/MatterOnIdentify.ino | 167 ++++++++++++++++++ 1 file changed, 167 insertions(+) diff --git a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino index 6dce8d863a6..f8f708ed5b2 100644 --- a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino +++ b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino @@ -1,3 +1,4 @@ +<<<<<<< Updated upstream // Copyright 2024 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -162,3 +163,169 @@ void loop() { delay(500); // works as a debounce for the button and also for the LED blink } +======= +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + * This example is the smallest code that will create a Matter Device which can be + * commissioned and controlled from a Matter Environment APP. + * It controls a GPIO that could be attached to a LED for visualization. + * Additionally the ESP32 will send debug messages indicating the Matter activity. + * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. + * + * This example is a simple Matter On/Off Light that can be controlled by a Matter Controller. + * It demonstrates how to use On Identify callback when the Identify Cluster is called. + * The Matter user APP can be used to request the device to identify itself by blinking the LED. + */ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Single On/Off Light Endpoint - at least one per node +MatterOnOffLight OnOffLight; + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Light GPIO that can be controlled by Matter APP +#ifdef LED_BUILTIN +const uint8_t ledPin = LED_BUILTIN; +#else +const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN +#endif + +// set your board USER BUTTON pin here - decommissioning button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control - decommision the Matter Node +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +// Identify Flag and blink time - Blink the LED +const uint8_t identifyLedPin = ledPin; // uses the same LED as the Light - change if needed +volatile bool identifyFlag = false; // Flag to start the Blink when in Identify state +bool identifyBlink = false; // Blink state when in Identify state + +// Matter Protocol Endpoint (On/OFF Light) Callback +bool onOffLightCallback(bool state) { + digitalWrite(ledPin, state ? HIGH : LOW); + // This callback must return the success state to Matter core + return true; +} + +// Identification shall be done by Blink in Red or just the GPIO when no LED_BUILTIN is not defined +bool onIdentifyLightCallback(bool identifyIsActive) { + Serial.printf("Identify Cluster is %s\r\n", identifyIsActive ? "Active" : "Inactive"); + if (identifyIsActive) { + // Start Blinking the light in loop() + identifyFlag = true; + identifyBlink = !OnOffLight; // Start with the inverted light state + } else { + // Stop Blinking and restore the light to the its last state + identifyFlag = false; + // force returning to the original state by toggling the light twice + OnOffLight.toggle(); + OnOffLight.toggle(); + } + return true; +} + +void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + pinMode(buttonPin, INPUT_PULLUP); + // Initialize the LED GPIO + pinMode(ledPin, OUTPUT); + + Serial.begin(115200); + + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + // Initialize at least one Matter EndPoint + OnOffLight.begin(); + + // On Identify Callback - Blink the LED + OnOffLight.onIdentify(onIdentifyLightCallback); + + // Associate a callback to the Matter Controller + OnOffLight.onChange(onOffLightCallback); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Occupancy Sensor Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } +} + +void loop() { + // check if the Light is in identify state and blink it every 500ms (delay loop time) + if (identifyFlag) { +#ifdef LED_BUILTIN + uint8_t brightness = 32 * identifyBlink; + rgbLedWrite(identifyLedPin, brightness, 0, 0); +#else + digitalWrite(identifyLedPin, identifyBlink ? HIGH : LOW); +#endif + identifyBlink = !identifyBlink; + } + + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (digitalRead(buttonPin) == HIGH && button_state) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } + + delay(500); // works as a debounce for the button and also for the LED blink +} +>>>>>>> Stashed changes From bce01087d282870311b03edfdfa65850b2e8f2c8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 19:20:35 +0000 Subject: [PATCH 120/183] ci(pre-commit): Apply automatic fixes --- .../MatterOnIdentify/MatterOnIdentify.ino | 328 +++++++++--------- 1 file changed, 164 insertions(+), 164 deletions(-) diff --git a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino index f8f708ed5b2..2779cb4cda7 100644 --- a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino +++ b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino @@ -164,168 +164,168 @@ void loop() { delay(500); // works as a debounce for the button and also for the LED blink } ======= -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* - * This example is the smallest code that will create a Matter Device which can be - * commissioned and controlled from a Matter Environment APP. - * It controls a GPIO that could be attached to a LED for visualization. - * Additionally the ESP32 will send debug messages indicating the Matter activity. - * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. - * - * This example is a simple Matter On/Off Light that can be controlled by a Matter Controller. - * It demonstrates how to use On Identify callback when the Identify Cluster is called. - * The Matter user APP can be used to request the device to identify itself by blinking the LED. - */ - -// Matter Manager -#include -#include - -// List of Matter Endpoints for this Node -// Single On/Off Light Endpoint - at least one per node -MatterOnOffLight OnOffLight; - -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - -// Light GPIO that can be controlled by Matter APP -#ifdef LED_BUILTIN -const uint8_t ledPin = LED_BUILTIN; -#else -const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN -#endif - -// set your board USER BUTTON pin here - decommissioning button -const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. - -// Button control - decommision the Matter Node -uint32_t button_time_stamp = 0; // debouncing control -bool button_state = false; // false = released | true = pressed -const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission - -// Identify Flag and blink time - Blink the LED -const uint8_t identifyLedPin = ledPin; // uses the same LED as the Light - change if needed -volatile bool identifyFlag = false; // Flag to start the Blink when in Identify state -bool identifyBlink = false; // Blink state when in Identify state - -// Matter Protocol Endpoint (On/OFF Light) Callback -bool onOffLightCallback(bool state) { - digitalWrite(ledPin, state ? HIGH : LOW); - // This callback must return the success state to Matter core - return true; -} - -// Identification shall be done by Blink in Red or just the GPIO when no LED_BUILTIN is not defined -bool onIdentifyLightCallback(bool identifyIsActive) { - Serial.printf("Identify Cluster is %s\r\n", identifyIsActive ? "Active" : "Inactive"); - if (identifyIsActive) { - // Start Blinking the light in loop() - identifyFlag = true; - identifyBlink = !OnOffLight; // Start with the inverted light state - } else { - // Stop Blinking and restore the light to the its last state - identifyFlag = false; - // force returning to the original state by toggling the light twice - OnOffLight.toggle(); - OnOffLight.toggle(); - } - return true; -} - -void setup() { - // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node - pinMode(buttonPin, INPUT_PULLUP); - // Initialize the LED GPIO - pinMode(ledPin, OUTPUT); - - Serial.begin(115200); - - // Manually connect to WiFi - WiFi.begin(ssid, password); - // Wait for connection - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - Serial.println(); - - // Initialize at least one Matter EndPoint - OnOffLight.begin(); - - // On Identify Callback - Blink the LED - OnOffLight.onIdentify(onIdentifyLightCallback); - - // Associate a callback to the Matter Controller - OnOffLight.onChange(onOffLightCallback); - - // Matter beginning - Last step, after all EndPoints are initialized - Matter.begin(); - - // Check Matter Accessory Commissioning state, which may change during execution of loop() - if (!Matter.isDeviceCommissioned()) { - Serial.println(""); - Serial.println("Matter Node is not commissioned yet."); - Serial.println("Initiate the device discovery in your Matter environment."); - Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); - Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); - Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); - // waits for Matter Occupancy Sensor Commissioning. - uint32_t timeCount = 0; - while (!Matter.isDeviceCommissioned()) { - delay(100); - if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec - Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); - } - } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); - } -} - -void loop() { - // check if the Light is in identify state and blink it every 500ms (delay loop time) - if (identifyFlag) { -#ifdef LED_BUILTIN - uint8_t brightness = 32 * identifyBlink; - rgbLedWrite(identifyLedPin, brightness, 0, 0); -#else - digitalWrite(identifyLedPin, identifyBlink ? HIGH : LOW); -#endif - identifyBlink = !identifyBlink; - } - - // Check if the button has been pressed - if (digitalRead(buttonPin) == LOW && !button_state) { - // deals with button debouncing - button_time_stamp = millis(); // record the time while the button is pressed. - button_state = true; // pressed. - } - - if (digitalRead(buttonPin) == HIGH && button_state) { - button_state = false; // released - } - - // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node - uint32_t time_diff = millis() - button_time_stamp; - if (button_state && time_diff > decommissioningTimeout) { - Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); - Matter.decommission(); - button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so - } - - delay(500); // works as a debounce for the button and also for the LED blink -} +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + * This example is the smallest code that will create a Matter Device which can be + * commissioned and controlled from a Matter Environment APP. + * It controls a GPIO that could be attached to a LED for visualization. + * Additionally the ESP32 will send debug messages indicating the Matter activity. + * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. + * + * This example is a simple Matter On/Off Light that can be controlled by a Matter Controller. + * It demonstrates how to use On Identify callback when the Identify Cluster is called. + * The Matter user APP can be used to request the device to identify itself by blinking the LED. + */ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Single On/Off Light Endpoint - at least one per node +MatterOnOffLight OnOffLight; + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// Light GPIO that can be controlled by Matter APP +#ifdef LED_BUILTIN +const uint8_t ledPin = LED_BUILTIN; +#else +const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN +#endif + +// set your board USER BUTTON pin here - decommissioning button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control - decommision the Matter Node +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +// Identify Flag and blink time - Blink the LED +const uint8_t identifyLedPin = ledPin; // uses the same LED as the Light - change if needed +volatile bool identifyFlag = false; // Flag to start the Blink when in Identify state +bool identifyBlink = false; // Blink state when in Identify state + +// Matter Protocol Endpoint (On/OFF Light) Callback +bool onOffLightCallback(bool state) { + digitalWrite(ledPin, state ? HIGH : LOW); + // This callback must return the success state to Matter core + return true; +} + +// Identification shall be done by Blink in Red or just the GPIO when no LED_BUILTIN is not defined +bool onIdentifyLightCallback(bool identifyIsActive) { + Serial.printf("Identify Cluster is %s\r\n", identifyIsActive ? "Active" : "Inactive"); + if (identifyIsActive) { + // Start Blinking the light in loop() + identifyFlag = true; + identifyBlink = !OnOffLight; // Start with the inverted light state + } else { + // Stop Blinking and restore the light to the its last state + identifyFlag = false; + // force returning to the original state by toggling the light twice + OnOffLight.toggle(); + OnOffLight.toggle(); + } + return true; +} + +void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + pinMode(buttonPin, INPUT_PULLUP); + // Initialize the LED GPIO + pinMode(ledPin, OUTPUT); + + Serial.begin(115200); + + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + // Initialize at least one Matter EndPoint + OnOffLight.begin(); + + // On Identify Callback - Blink the LED + OnOffLight.onIdentify(onIdentifyLightCallback); + + // Associate a callback to the Matter Controller + OnOffLight.onChange(onOffLightCallback); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Occupancy Sensor Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + } +} + +void loop() { + // check if the Light is in identify state and blink it every 500ms (delay loop time) + if (identifyFlag) { +#ifdef LED_BUILTIN + uint8_t brightness = 32 * identifyBlink; + rgbLedWrite(identifyLedPin, brightness, 0, 0); +#else + digitalWrite(identifyLedPin, identifyBlink ? HIGH : LOW); +#endif + identifyBlink = !identifyBlink; + } + + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (digitalRead(buttonPin) == HIGH && button_state) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } + + delay(500); // works as a debounce for the button and also for the LED blink +} >>>>>>> Stashed changes From e2dc5b60f351c943b6c6f0a95135545f5a3aae05 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 16 Dec 2024 16:28:51 -0300 Subject: [PATCH 121/183] fix(matter): stashing merge error --- .../MatterOnIdentify/MatterOnIdentify.ino | 167 ------------------ 1 file changed, 167 deletions(-) diff --git a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino index 2779cb4cda7..47183241c17 100644 --- a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino +++ b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino @@ -1,169 +1,3 @@ -<<<<<<< Updated upstream -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* - * This example is the smallest code that will create a Matter Device which can be - * commissioned and controlled from a Matter Environment APP. - * It controls a GPIO that could be attached to a LED for visualization. - * Additionally the ESP32 will send debug messages indicating the Matter activity. - * Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. - * - * This example is a simple Matter On/Off Light that can be controlled by a Matter Controller. - * It demonstrates how to use On Identify callback when the Identify Cluster is called. - * The Matter user APP can be used to request the device to identify itself by blinking the LED. - */ - -// Matter Manager -#include -#include - -// List of Matter Endpoints for this Node -// Single On/Off Light Endpoint - at least one per node -MatterOnOffLight OnOffLight; - -// WiFi is manually set and started -const char *ssid = "your-ssid"; // Change this to your WiFi SSID -const char *password = "your-password"; // Change this to your WiFi password - -// Light GPIO that can be controlled by Matter APP -#ifdef LED_BUILTIN -const uint8_t ledPin = LED_BUILTIN; -#else -const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN -#endif - -// set your board USER BUTTON pin here - decommissioning button -const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. - -// Button control - decommision the Matter Node -uint32_t button_time_stamp = 0; // debouncing control -bool button_state = false; // false = released | true = pressed -const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission - -// Identify Flag and blink time - Blink the LED -const uint8_t identifyLedPin = ledPin; // uses the same LED as the Light - change if needed -volatile bool identifyFlag = false; // Flag to start the Blink when in Identify state -bool identifyBlink = false; // Blink state when in Identify state - -// Matter Protocol Endpoint (On/OFF Light) Callback -bool onOffLightCallback(bool state) { - digitalWrite(ledPin, state ? HIGH : LOW); - // This callback must return the success state to Matter core - return true; -} - -// Identification shall be done by Blink in Red or just the GPIO when no LED_BUILTIN is not defined -bool onIdentifyLightCallback(bool identifyIsActive) { - Serial.printf("Identify Cluster is %s\r\n", identifyIsActive ? "Active" : "Inactive"); - if (identifyIsActive) { - // Start Blinking the light in loop() - identifyFlag = true; - identifyBlink = !OnOffLight; // Start with the inverted light state - } else { - // Stop Blinking and restore the light to the its last state - identifyFlag = false; - // force returning to the original state by toggling the light twice - OnOffLight.toggle(); - OnOffLight.toggle(); - } - return true; -} - -void setup() { - // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node - pinMode(buttonPin, INPUT_PULLUP); - // Initialize the LED GPIO - pinMode(ledPin, OUTPUT); - - Serial.begin(115200); - - // Manually connect to WiFi - WiFi.begin(ssid, password); - // Wait for connection - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - Serial.println(); - - // Initialize at least one Matter EndPoint - OnOffLight.begin(); - - // On Identify Callback - Blink the LED - OnOffLight.onIdentify(onIdentifyLightCallback); - - // Associate a callback to the Matter Controller - OnOffLight.onChange(onOffLightCallback); - - // Matter beginning - Last step, after all EndPoints are initialized - Matter.begin(); - - // Check Matter Accessory Commissioning state, which may change during execution of loop() - if (!Matter.isDeviceCommissioned()) { - Serial.println(""); - Serial.println("Matter Node is not commissioned yet."); - Serial.println("Initiate the device discovery in your Matter environment."); - Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); - Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); - Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); - // waits for Matter Occupancy Sensor Commissioning. - uint32_t timeCount = 0; - while (!Matter.isDeviceCommissioned()) { - delay(100); - if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec - Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); - } - } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); - } -} - -void loop() { - // check if the Ligth is in identify state and blink it every 500ms (delay loop time) - if (identifyFlag) { -#ifdef LED_BUILTIN - uint8_t brightness = 32 * identifyBlink; - rgbLedWrite(identifyLedPin, brightness, 0, 0); -#else - digitalWrite(identifyLedPin, identifyBlink ? HIGH : LOW); -#endif - identifyBlink = !identifyBlink; - } - - // Check if the button has been pressed - if (digitalRead(buttonPin) == LOW && !button_state) { - // deals with button debouncing - button_time_stamp = millis(); // record the time while the button is pressed. - button_state = true; // pressed. - } - - if (digitalRead(buttonPin) == HIGH && button_state) { - button_state = false; // released - } - - // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node - uint32_t time_diff = millis() - button_time_stamp; - if (button_state && time_diff > decommissioningTimeout) { - Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); - Matter.decommission(); - button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so - } - - delay(500); // works as a debounce for the button and also for the LED blink -} -======= // Copyright 2024 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -328,4 +162,3 @@ void loop() { delay(500); // works as a debounce for the button and also for the LED blink } ->>>>>>> Stashed changes From 71e57eaf52e6d53dcdaeeaa613b91a81234fce01 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 19:29:30 +0000 Subject: [PATCH 122/183] ci(pre-commit): Apply automatic fixes --- .../Matter/examples/MatterOnIdentify/MatterOnIdentify.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino index 47183241c17..b2e77900e95 100644 --- a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino +++ b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino @@ -69,7 +69,7 @@ bool onIdentifyLightCallback(bool identifyIsActive) { if (identifyIsActive) { // Start Blinking the light in loop() identifyFlag = true; - identifyBlink = !OnOffLight; // Start with the inverted light state + identifyBlink = !OnOffLight; // Start with the inverted light state } else { // Stop Blinking and restore the light to the its last state identifyFlag = false; @@ -136,7 +136,7 @@ void loop() { uint8_t brightness = 32 * identifyBlink; rgbLedWrite(identifyLedPin, brightness, 0, 0); #else - digitalWrite(identifyLedPin, identifyBlink ? HIGH : LOW); + digitalWrite(identifyLedPin, identifyBlink ? HIGH : LOW); #endif identifyBlink = !identifyBlink; } @@ -160,5 +160,5 @@ void loop() { button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so } - delay(500); // works as a debounce for the button and also for the LED blink + delay(500); // works as a debounce for the button and also for the LED blink } From 25ebe440e277123e7a9235e8bd240f9988e0e50a Mon Sep 17 00:00:00 2001 From: Thomas Jentzsch <76921504+yellobyte@users.noreply.github.com> Date: Mon, 16 Dec 2024 23:36:33 +0100 Subject: [PATCH 123/183] add board yb_esp32s3_eth --- boards.txt | 219 +++++++++++++++++++++++++ variants/yb_esp32s3_eth/pins_arduino.h | 63 +++++++ 2 files changed, 282 insertions(+) create mode 100644 variants/yb_esp32s3_eth/pins_arduino.h diff --git a/boards.txt b/boards.txt index 791396da338..a740bde11d8 100644 --- a/boards.txt +++ b/boards.txt @@ -47922,3 +47922,222 @@ yb_esp32s3_amp_v3.menu.EraseFlash.all=Enabled yb_esp32s3_amp_v3.menu.EraseFlash.all.upload.erase_cmd=-e ############################################################## + +yb_esp32s3_eth.name=YelloByte YB-ESP32-S3-ETH + +yb_esp32s3_eth.bootloader.tool=esptool_py +yb_esp32s3_eth.bootloader.tool.default=esptool_py + +yb_esp32s3_eth.upload.tool=esptool_py +yb_esp32s3_eth.upload.tool.default=esptool_py +yb_esp32s3_eth.upload.tool.network=esp_ota + +yb_esp32s3_eth.upload.maximum_size=1310720 +yb_esp32s3_eth.upload.maximum_data_size=327680 +yb_esp32s3_eth.upload.flags= +yb_esp32s3_eth.upload.extra_flags= +yb_esp32s3_eth.upload.use_1200bps_touch=false +yb_esp32s3_eth.upload.wait_for_upload_port=false + +yb_esp32s3_eth.serial.disableDTR=false +yb_esp32s3_eth.serial.disableRTS=false + +yb_esp32s3_eth.build.tarch=xtensa +yb_esp32s3_eth.build.bootloader_addr=0x0 +yb_esp32s3_eth.build.target=esp32s3 +yb_esp32s3_eth.build.mcu=esp32s3 +yb_esp32s3_eth.build.core=esp32 +yb_esp32s3_eth.build.variant=yb_esp32s3_eth +yb_esp32s3_eth.build.board=YB_ESP32S3_ETH + +yb_esp32s3_eth.build.usb_mode=1 +yb_esp32s3_eth.build.cdc_on_boot=0 +yb_esp32s3_eth.build.msc_on_boot=0 +yb_esp32s3_eth.build.dfu_on_boot=0 +yb_esp32s3_eth.build.f_cpu=240000000L +yb_esp32s3_eth.build.flash_size=4MB +yb_esp32s3_eth.build.flash_freq=80m +yb_esp32s3_eth.build.flash_mode=dio +yb_esp32s3_eth.build.boot=qio +yb_esp32s3_eth.build.boot_freq=80m +yb_esp32s3_eth.build.partitions=default +yb_esp32s3_eth.build.defines= +yb_esp32s3_eth.build.loop_core= +yb_esp32s3_eth.build.event_core= +yb_esp32s3_eth.build.psram_type=qspi +yb_esp32s3_eth.build.memory_type={build.boot}_{build.psram_type} + +yb_esp32s3_eth.menu.JTAGAdapter.default=Disabled +yb_esp32s3_eth.menu.JTAGAdapter.default.build.copy_jtag_files=0 +yb_esp32s3_eth.menu.JTAGAdapter.builtin=Integrated USB JTAG +yb_esp32s3_eth.menu.JTAGAdapter.builtin.build.openocdscript=esp32s3-builtin.cfg +yb_esp32s3_eth.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 +yb_esp32s3_eth.menu.JTAGAdapter.external=FTDI Adapter +yb_esp32s3_eth.menu.JTAGAdapter.external.build.openocdscript=esp32s3-ftdi.cfg +yb_esp32s3_eth.menu.JTAGAdapter.external.build.copy_jtag_files=1 +yb_esp32s3_eth.menu.JTAGAdapter.bridge=ESP USB Bridge +yb_esp32s3_eth.menu.JTAGAdapter.bridge.build.openocdscript=esp32s3-bridge.cfg +yb_esp32s3_eth.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +yb_esp32s3_eth.menu.LoopCore.1=Core 1 +yb_esp32s3_eth.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +yb_esp32s3_eth.menu.LoopCore.0=Core 0 +yb_esp32s3_eth.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +yb_esp32s3_eth.menu.EventsCore.1=Core 1 +yb_esp32s3_eth.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +yb_esp32s3_eth.menu.EventsCore.0=Core 0 +yb_esp32s3_eth.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +yb_esp32s3_eth.menu.USBMode.hwcdc=Hardware CDC and JTAG +yb_esp32s3_eth.menu.USBMode.hwcdc.build.usb_mode=1 +yb_esp32s3_eth.menu.USBMode.default=USB-OTG (TinyUSB) +yb_esp32s3_eth.menu.USBMode.default.build.usb_mode=0 + +yb_esp32s3_eth.menu.CDCOnBoot.default=Disabled +yb_esp32s3_eth.menu.CDCOnBoot.default.build.cdc_on_boot=0 +yb_esp32s3_eth.menu.CDCOnBoot.cdc=Enabled +yb_esp32s3_eth.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 + +yb_esp32s3_eth.menu.MSCOnBoot.default=Disabled +yb_esp32s3_eth.menu.MSCOnBoot.default.build.msc_on_boot=0 +yb_esp32s3_eth.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +yb_esp32s3_eth.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +yb_esp32s3_eth.menu.DFUOnBoot.default=Disabled +yb_esp32s3_eth.menu.DFUOnBoot.default.build.dfu_on_boot=0 +yb_esp32s3_eth.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +yb_esp32s3_eth.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +yb_esp32s3_eth.menu.UploadMode.default=UART0 / Hardware CDC +yb_esp32s3_eth.menu.UploadMode.default.upload.use_1200bps_touch=false +yb_esp32s3_eth.menu.UploadMode.default.upload.wait_for_upload_port=false +yb_esp32s3_eth.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +yb_esp32s3_eth.menu.UploadMode.cdc.upload.use_1200bps_touch=true +yb_esp32s3_eth.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +yb_esp32s3_eth.menu.PSRAM.disabled=Disabled +yb_esp32s3_eth.menu.PSRAM.disabled.build.defines= +yb_esp32s3_eth.menu.PSRAM.disabled.build.psram_type=qspi +yb_esp32s3_eth.menu.PSRAM.enabled=QSPI PSRAM +yb_esp32s3_eth.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM +yb_esp32s3_eth.menu.PSRAM.enabled.build.psram_type=qspi +yb_esp32s3_eth.menu.PSRAM.opi=OPI PSRAM +yb_esp32s3_eth.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM +yb_esp32s3_eth.menu.PSRAM.opi.build.psram_type=opi + +yb_esp32s3_eth.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +yb_esp32s3_eth.menu.PartitionScheme.default.build.partitions=default +yb_esp32s3_eth.menu.PartitionScheme.default_8MB=8M with spiffs (3MB APP/1.5MB SPIFFS) +yb_esp32s3_eth.menu.PartitionScheme.default_8MB.build.partitions=default_8MB +yb_esp32s3_eth.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 +yb_esp32s3_eth.menu.PartitionScheme.default_16MB=16M with spiffs (6.25MB APP/3.43MB SPIFFS) +yb_esp32s3_eth.menu.PartitionScheme.default_16MB.build.partitions=default_16MB +yb_esp32s3_eth.menu.PartitionScheme.default_16MB.upload.maximum_size=6553600 +yb_esp32s3_eth.menu.PartitionScheme.max_app_8MB=Maximum APP (7.9MB APP No OTA/No FS) +yb_esp32s3_eth.menu.PartitionScheme.max_app_8MB.build.partitions=max_app_8MB +yb_esp32s3_eth.menu.PartitionScheme.max_app_8MB.upload.maximum_size=8257536 +yb_esp32s3_eth.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) +yb_esp32s3_eth.menu.PartitionScheme.fatflash.build.partitions=ffat +yb_esp32s3_eth.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 +yb_esp32s3_eth.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +yb_esp32s3_eth.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +yb_esp32s3_eth.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +yb_esp32s3_eth.menu.PartitionScheme.minimal.build.partitions=minimal +yb_esp32s3_eth.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +yb_esp32s3_eth.menu.PartitionScheme.no_ota.build.partitions=no_ota +yb_esp32s3_eth.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +yb_esp32s3_eth.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +yb_esp32s3_eth.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +yb_esp32s3_eth.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +yb_esp32s3_eth.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +yb_esp32s3_eth.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +yb_esp32s3_eth.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +yb_esp32s3_eth.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +yb_esp32s3_eth.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +yb_esp32s3_eth.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +yb_esp32s3_eth.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +yb_esp32s3_eth.menu.PartitionScheme.huge_app.build.partitions=huge_app +yb_esp32s3_eth.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +yb_esp32s3_eth.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +yb_esp32s3_eth.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +yb_esp32s3_eth.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 +yb_esp32s3_eth.menu.PartitionScheme.custom=Custom +yb_esp32s3_eth.menu.PartitionScheme.custom.build.partitions= +yb_esp32s3_eth.menu.PartitionScheme.custom.upload.maximum_size=16777216 + +yb_esp32s3_eth.menu.CPUFreq.240=240MHz (WiFi) +yb_esp32s3_eth.menu.CPUFreq.240.build.f_cpu=240000000L +yb_esp32s3_eth.menu.CPUFreq.160=160MHz (WiFi) +yb_esp32s3_eth.menu.CPUFreq.160.build.f_cpu=160000000L +yb_esp32s3_eth.menu.CPUFreq.80=80MHz (WiFi) +yb_esp32s3_eth.menu.CPUFreq.80.build.f_cpu=80000000L +yb_esp32s3_eth.menu.CPUFreq.40=40MHz +yb_esp32s3_eth.menu.CPUFreq.40.build.f_cpu=40000000L +yb_esp32s3_eth.menu.CPUFreq.20=20MHz +yb_esp32s3_eth.menu.CPUFreq.20.build.f_cpu=20000000L +yb_esp32s3_eth.menu.CPUFreq.10=10MHz +yb_esp32s3_eth.menu.CPUFreq.10.build.f_cpu=10000000L + +yb_esp32s3_eth.menu.FlashMode.qio=QIO 80MHz +yb_esp32s3_eth.menu.FlashMode.qio.build.flash_mode=dio +yb_esp32s3_eth.menu.FlashMode.qio.build.boot=qio +yb_esp32s3_eth.menu.FlashMode.qio.build.boot_freq=80m +yb_esp32s3_eth.menu.FlashMode.qio.build.flash_freq=80m +yb_esp32s3_eth.menu.FlashMode.qio120=QIO 120MHz +yb_esp32s3_eth.menu.FlashMode.qio120.build.flash_mode=dio +yb_esp32s3_eth.menu.FlashMode.qio120.build.boot=qio +yb_esp32s3_eth.menu.FlashMode.qio120.build.boot_freq=120m +yb_esp32s3_eth.menu.FlashMode.qio120.build.flash_freq=80m +yb_esp32s3_eth.menu.FlashMode.dio=DIO 80MHz +yb_esp32s3_eth.menu.FlashMode.dio.build.flash_mode=dio +yb_esp32s3_eth.menu.FlashMode.dio.build.boot=dio +yb_esp32s3_eth.menu.FlashMode.dio.build.boot_freq=80m +yb_esp32s3_eth.menu.FlashMode.dio.build.flash_freq=80m +yb_esp32s3_eth.menu.FlashMode.opi=OPI 80MHz +yb_esp32s3_eth.menu.FlashMode.opi.build.flash_mode=dout +yb_esp32s3_eth.menu.FlashMode.opi.build.boot=opi +yb_esp32s3_eth.menu.FlashMode.opi.build.boot_freq=80m +yb_esp32s3_eth.menu.FlashMode.opi.build.flash_freq=80m + +yb_esp32s3_eth.menu.FlashSize.4M=4MB (32Mb) +yb_esp32s3_eth.menu.FlashSize.4M.build.flash_size=4MB +yb_esp32s3_eth.menu.FlashSize.8M=8MB (64Mb) +yb_esp32s3_eth.menu.FlashSize.8M.build.flash_size=8MB +yb_esp32s3_eth.menu.FlashSize.16M=16MB (128Mb) +yb_esp32s3_eth.menu.FlashSize.16M.build.flash_size=16MB + +yb_esp32s3_eth.menu.UploadSpeed.921600=921600 +yb_esp32s3_eth.menu.UploadSpeed.921600.upload.speed=921600 +yb_esp32s3_eth.menu.UploadSpeed.115200=115200 +yb_esp32s3_eth.menu.UploadSpeed.115200.upload.speed=115200 +yb_esp32s3_eth.menu.UploadSpeed.256000.windows=256000 +yb_esp32s3_eth.menu.UploadSpeed.256000.upload.speed=256000 +yb_esp32s3_eth.menu.UploadSpeed.230400.windows.upload.speed=256000 +yb_esp32s3_eth.menu.UploadSpeed.230400=230400 +yb_esp32s3_eth.menu.UploadSpeed.230400.upload.speed=230400 +yb_esp32s3_eth.menu.UploadSpeed.460800.linux=460800 +yb_esp32s3_eth.menu.UploadSpeed.460800.macosx=460800 +yb_esp32s3_eth.menu.UploadSpeed.460800.upload.speed=460800 +yb_esp32s3_eth.menu.UploadSpeed.512000.windows=512000 +yb_esp32s3_eth.menu.UploadSpeed.512000.upload.speed=512000 + +yb_esp32s3_eth.menu.DebugLevel.none=None +yb_esp32s3_eth.menu.DebugLevel.none.build.code_debug=0 +yb_esp32s3_eth.menu.DebugLevel.error=Error +yb_esp32s3_eth.menu.DebugLevel.error.build.code_debug=1 +yb_esp32s3_eth.menu.DebugLevel.warn=Warn +yb_esp32s3_eth.menu.DebugLevel.warn.build.code_debug=2 +yb_esp32s3_eth.menu.DebugLevel.info=Info +yb_esp32s3_eth.menu.DebugLevel.info.build.code_debug=3 +yb_esp32s3_eth.menu.DebugLevel.debug=Debug +yb_esp32s3_eth.menu.DebugLevel.debug.build.code_debug=4 +yb_esp32s3_eth.menu.DebugLevel.verbose=Verbose +yb_esp32s3_eth.menu.DebugLevel.verbose.build.code_debug=5 + +yb_esp32s3_eth.menu.EraseFlash.none=Disabled +yb_esp32s3_eth.menu.EraseFlash.none.upload.erase_cmd= +yb_esp32s3_eth.menu.EraseFlash.all=Enabled +yb_esp32s3_eth.menu.EraseFlash.all.upload.erase_cmd=-e + +############################################################## diff --git a/variants/yb_esp32s3_eth/pins_arduino.h b/variants/yb_esp32s3_eth/pins_arduino.h new file mode 100644 index 00000000000..d7ac750489a --- /dev/null +++ b/variants/yb_esp32s3_eth/pins_arduino.h @@ -0,0 +1,63 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +#define USB_VID 0x303A +#define USB_PID 0x1001 + +static const uint8_t LED_BUILTIN = 47; +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN + +static const uint8_t TX = 43; +static const uint8_t RX = 44; + +static const uint8_t SDA = 8; +static const uint8_t SCL = 9; + +static const uint8_t SS = 10; +static const uint8_t MOSI = 11; +static const uint8_t MISO = 13; +static const uint8_t SCK = 12; + +// Definitions for onboard WIZnet W5500 ethernet controller chip +static const uint8_t W5500_SS = 14; // W5500 chip select +static const uint8_t W5500_INT = 18; // available only if solder bridge "INT" is closed (default open) +static const uint8_t W5500_RST = 21; // set GPIO21 to INPUT (high impedance) if RST signal is unused + +static const uint8_t A0 = 1; +static const uint8_t A1 = 2; +static const uint8_t A2 = 3; +static const uint8_t A3 = 4; +static const uint8_t A4 = 5; +static const uint8_t A5 = 6; +static const uint8_t A6 = 7; +static const uint8_t A7 = 8; +static const uint8_t A8 = 9; +static const uint8_t A9 = 10; +static const uint8_t A10 = 11; +static const uint8_t A11 = 12; +static const uint8_t A12 = 13; +static const uint8_t A13 = 14; +static const uint8_t A14 = 15; +static const uint8_t A15 = 16; +static const uint8_t A16 = 17; +static const uint8_t A17 = 18; + +static const uint8_t T1 = 1; +static const uint8_t T2 = 2; +static const uint8_t T3 = 3; +static const uint8_t T4 = 4; +static const uint8_t T5 = 5; +static const uint8_t T6 = 6; +static const uint8_t T7 = 7; +static const uint8_t T8 = 8; +static const uint8_t T9 = 9; +static const uint8_t T10 = 10; +static const uint8_t T11 = 11; +static const uint8_t T12 = 12; +static const uint8_t T13 = 13; +static const uint8_t T14 = 14; + +#endif /* Pins_Arduino_h */ From 4d0ae18aee4168b72d1d7848a6c264883be5344c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2024 06:37:40 +0000 Subject: [PATCH 124/183] ci(pre-commit): Apply automatic fixes --- variants/yb_esp32s3_eth/pins_arduino.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/yb_esp32s3_eth/pins_arduino.h b/variants/yb_esp32s3_eth/pins_arduino.h index d7ac750489a..77fcf6923fc 100644 --- a/variants/yb_esp32s3_eth/pins_arduino.h +++ b/variants/yb_esp32s3_eth/pins_arduino.h @@ -22,7 +22,7 @@ static const uint8_t MISO = 13; static const uint8_t SCK = 12; // Definitions for onboard WIZnet W5500 ethernet controller chip -static const uint8_t W5500_SS = 14; // W5500 chip select +static const uint8_t W5500_SS = 14; // W5500 chip select static const uint8_t W5500_INT = 18; // available only if solder bridge "INT" is closed (default open) static const uint8_t W5500_RST = 21; // set GPIO21 to INPUT (high impedance) if RST signal is unused From 2fc679151c34f301fe42f3b87b0283c2e38e2ad1 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 17 Dec 2024 09:57:22 -0300 Subject: [PATCH 125/183] ci(debug): Compile once a week with verbose log level --- .github/scripts/on-push.sh | 24 +++++++++++++----------- .github/scripts/sketch_utils.sh | 5 +++++ .github/workflows/push.yml | 30 ++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/.github/scripts/on-push.sh b/.github/scripts/on-push.sh index aafc9de0596..6095f88e727 100755 --- a/.github/scripts/on-push.sh +++ b/.github/scripts/on-push.sh @@ -9,8 +9,9 @@ function build { local chunk_index=$2 local chunks_cnt=$3 local build_log=$4 - local sketches_file=$5 - shift 5 + local log_level=${5:-none} + local sketches_file=$6 + shift 6 local sketches=("$@") local BUILD_SKETCH="${SCRIPTS_DIR}/sketch_utils.sh build" @@ -19,7 +20,7 @@ function build { local args=("-ai" "$ARDUINO_IDE_PATH" "-au" "$ARDUINO_USR_PATH" "-t" "$target") if [ "$OS_IS_LINUX" == "1" ]; then - args+=("-p" "$ARDUINO_ESP32_PATH/libraries" "-i" "$chunk_index" "-m" "$chunks_cnt") + args+=("-p" "$ARDUINO_ESP32_PATH/libraries" "-i" "$chunk_index" "-m" "$chunks_cnt" "-d" "$log_level") if [ -n "$sketches_file" ]; then args+=("-f" "$sketches_file") fi @@ -54,7 +55,8 @@ fi CHUNK_INDEX=$1 CHUNKS_CNT=$2 BUILD_LOG=$3 -SKETCHES_FILE=$4 +LOG_LEVEL=$4 +SKETCHES_FILE=$5 if [ "$#" -lt 2 ] || [ "$CHUNKS_CNT" -le 0 ]; then CHUNK_INDEX=0 CHUNKS_CNT=1 @@ -88,13 +90,13 @@ if [ "$BUILD_LOG" -eq 1 ]; then fi #build sketches for different targets -build "esp32p4" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" -build "esp32s3" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" -build "esp32s2" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" -build "esp32c3" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" -build "esp32c6" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" -build "esp32h2" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" -build "esp32" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" +build "esp32p4" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$LOG_LEVEL" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" +build "esp32s3" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$LOG_LEVEL" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" +build "esp32s2" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$LOG_LEVEL" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" +build "esp32c3" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$LOG_LEVEL" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" +build "esp32c6" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$LOG_LEVEL" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" +build "esp32h2" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$LOG_LEVEL" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" +build "esp32" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$LOG_LEVEL" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}" if [ "$BUILD_LOG" -eq 1 ]; then #remove last comma from the last JSON object diff --git a/.github/scripts/sketch_utils.sh b/.github/scripts/sketch_utils.sh index 3e6ceb675e9..00d7d1bc232 100755 --- a/.github/scripts/sketch_utils.sh +++ b/.github/scripts/sketch_utils.sh @@ -443,6 +443,11 @@ function build_sketches { # build_sketches > $GITHUB_ENV + elif [ "${{ github.event_name }}" == "schedule" ]; then + echo "LOG_LEVEL=verbose" >> $GITHUB_ENV + else + echo "LOG_LEVEL=none" >> $GITHUB_ENV + fi + - name: Build all sketches if: ${{ needs.gen-chunks.outputs.build_all == 'true' }} - run: bash ./.github/scripts/on-push.sh ${{ matrix.chunk }} ${{ env.MAX_CHUNKS }} 1 + run: bash ./.github/scripts/on-push.sh ${{ matrix.chunk }} ${{ env.MAX_CHUNKS }} 1 ${{ env.LOG_LEVEL }} - name: Download sketches found if: ${{ needs.gen-chunks.outputs.build_all == 'false' && needs.gen-chunks.outputs.build_libraries == 'true' }} @@ -175,7 +201,7 @@ jobs: - name: Build selected sketches if: ${{ needs.gen-chunks.outputs.build_all == 'false' && needs.gen-chunks.outputs.build_libraries == 'true' }} - run: bash ./.github/scripts/on-push.sh ${{ matrix.chunk }} ${{ needs.gen-chunks.outputs.chunk_count }} 1 sketches_found.txt + run: bash ./.github/scripts/on-push.sh ${{ matrix.chunk }} ${{ needs.gen-chunks.outputs.chunk_count }} 1 ${{ env.LOG_LEVEL }} sketches_found.txt #Upload cli compile json as artifact - name: Upload cli compile json From 238c384e4ed97cb0b836793e9554fcaae943e5b5 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 17 Dec 2024 19:02:24 -0300 Subject: [PATCH 126/183] fix(readme): Update readme and fix badges --- .github/workflows/tests_results.yml | 3 ++- README.md | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/workflows/tests_results.yml b/.github/workflows/tests_results.yml index 4ef338a9e16..947de64ece5 100644 --- a/.github/workflows/tests_results.yml +++ b/.github/workflows/tests_results.yml @@ -149,9 +149,10 @@ jobs: uses: jaywcjlove/generated-badges@v1.0.13 with: label: Runtime Tests - status: ${{ job.status }} + status: ${{ job.status == 'success' && 'passing' || 'failing' }} output: runtime-tests-results/badge.svg color: ${{ job.status == 'success' && 'green' || 'red' }} + style: flat - name: Push badge if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled diff --git a/README.md b/README.md index 5b1b1865efa..e610229fc60 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # Arduino core for the ESP32, ESP32-P4, ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6 and ESP32-H2 -[![Build Status](https://github.com/espressif/arduino-esp32/actions/workflows/push.yml/badge.svg?branch=master&event=push)](https://github.com/espressif/arduino-esp32/actions/workflows/push.yml) [![External Libraries Test](https://github.com/espressif/arduino-esp32/actions/workflows/lib.yml/badge.svg?branch=master&event=schedule)](https://github.com/espressif/arduino-esp32/blob/gh-pages/LIBRARIES_TEST.md) [![Hardware Tests](https://github.com/espressif/arduino-esp32/blob/gh-pages/runtime-tests-results/badge.svg)](https://github.com/espressif/arduino-esp32/actions/workflows/tests_results.yml) +[![Build Status](https://img.shields.io/github/actions/workflow/status/espressif/arduino-esp32/push.yml?branch=master&event=push&label=Compilation%20Tests)](https://github.com/espressif/arduino-esp32/actions/workflows/push.yml?query=branch%3Amaster+event%3Apush) +[![Verbose Build Status](https://img.shields.io/github/actions/workflow/status/espressif/arduino-esp32/push.yml?branch=master&event=schedule&label=Compilation%20Tests%20(Verbose))](https://github.com/espressif/arduino-esp32/actions/workflows/push.yml?query=branch%3Amaster+event%3Aschedule) +[![External Libraries Test](https://img.shields.io/github/actions/workflow/status/espressif/arduino-esp32/lib.yml?branch=master&event=schedule&label=External%20Libraries%20Test)](https://github.com/espressif/arduino-esp32/blob/gh-pages/LIBRARIES_TEST.md) +[![Runtime Tests](https://github.com/espressif/arduino-esp32/blob/gh-pages/runtime-tests-results/badge.svg)](https://github.com/espressif/arduino-esp32/actions/workflows/tests_results.yml) ### Need help or have a question? Join the chat at [Gitter](https://gitter.im/espressif/arduino-esp32) or [open a new Discussion](https://github.com/espressif/arduino-esp32/discussions) @@ -16,9 +19,17 @@ ### Development Status -Latest Stable Release [![Release Version](https://img.shields.io/github/release/espressif/arduino-esp32.svg?style=plastic)](https://github.com/espressif/arduino-esp32/releases/latest/) [![Release Date](https://img.shields.io/github/release-date/espressif/arduino-esp32.svg?style=plastic)](https://github.com/espressif/arduino-esp32/releases/latest/) [![Downloads](https://img.shields.io/github/downloads/espressif/arduino-esp32/latest/total.svg?style=plastic)](https://github.com/espressif/arduino-esp32/releases/latest/) +#### Latest Stable Release -Latest Development Release [![Release Version](https://img.shields.io/github/release/espressif/arduino-esp32/all.svg?style=plastic)](https://github.com/espressif/arduino-esp32/releases/) [![Release Date](https://img.shields.io/github/release-date-pre/espressif/arduino-esp32.svg?style=plastic)](https://github.com/espressif/arduino-esp32/releases/) [![Downloads](https://img.shields.io/github/downloads-pre/espressif/arduino-esp32/latest/total.svg?style=plastic)](https://github.com/espressif/arduino-esp32/releases/) +[![Release Version](https://img.shields.io/github/release/espressif/arduino-esp32.svg)](https://github.com/espressif/arduino-esp32/releases/latest/) +[![Release Date](https://img.shields.io/github/release-date/espressif/arduino-esp32.svg)](https://github.com/espressif/arduino-esp32/releases/latest/) +[![Downloads](https://img.shields.io/github/downloads/espressif/arduino-esp32/latest/total.svg)](https://github.com/espressif/arduino-esp32/releases/latest/) + +#### Latest Development Release + +[![Release Version](https://img.shields.io/github/release/espressif/arduino-esp32/all.svg)](https://github.com/espressif/arduino-esp32/releases/) +[![Release Date](https://img.shields.io/github/release-date-pre/espressif/arduino-esp32.svg)](https://github.com/espressif/arduino-esp32/releases/) +[![Downloads](https://img.shields.io/github/downloads-pre/espressif/arduino-esp32/latest/total.svg)](https://github.com/espressif/arduino-esp32/releases/) ### Development Planning @@ -59,7 +70,7 @@ Here are the ESP32 series supported by the Arduino-ESP32 project: | ESP32-S3 | Yes | Yes | [ESP32-S3](https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf) | | ESP32-C6 | Yes | Yes | [ESP32-C6](https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf) | | ESP32-H2 | Yes | Yes | [ESP32-H2](https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf) | -| ESP32-P4 | No | Yes | [ESP32-P4](https://www.espressif.com/sites/default/files/documentation/esp32-p4_datasheet_en.pdf) | +| ESP32-P4 | Yes | Yes | [ESP32-P4](https://www.espressif.com/sites/default/files/documentation/esp32-p4_datasheet_en.pdf) | > [!NOTE] > ESP32-C2 is also supported by Arduino-ESP32 but requires rebuilding the static libraries. This is not trivial and requires a good understanding of the ESP-IDF From 4884c964631b6fd097a1f4e3504a9524b3b9f0ec Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 18 Dec 2024 15:35:59 -0300 Subject: [PATCH 127/183] fix(component): Checkout proper branch for uploading component --- .github/workflows/upload-idf-component.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/upload-idf-component.yml b/.github/workflows/upload-idf-component.yml index c716e8144c2..bc544e02114 100644 --- a/.github/workflows/upload-idf-component.yml +++ b/.github/workflows/upload-idf-component.yml @@ -1,6 +1,11 @@ name: Push components to https://components.espressif.com on: + workflow_dispatch: + inputs: + tag: + description: 'Tag to push to the component registry' + required: true workflow_run: workflows: ["ESP32 Arduino Release"] types: @@ -15,7 +20,7 @@ jobs: steps: - name: Get the release tag env: - head_branch: ${{ github.event.workflow_run.head_branch }} + head_branch: ${{ github.event.inputs.tag || github.event.workflow_run.head_branch }} run: | if [ "${{ github.event.workflow_run.conclusion }}" != "success" ]; then echo "Release workflow failed. Exiting..." @@ -39,6 +44,7 @@ jobs: - uses: actions/checkout@v4 with: + ref: ${{ env.RELEASE_TAG }} submodules: "recursive" - name: Upload components to the component registry From 352705e6077de4f0575324efa234814e823b9fb8 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 18 Dec 2024 15:55:26 -0300 Subject: [PATCH 128/183] fix(component): Add check for workflow_run (#10753) --- .github/workflows/upload-idf-component.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upload-idf-component.yml b/.github/workflows/upload-idf-component.yml index bc544e02114..8faddef7e5f 100644 --- a/.github/workflows/upload-idf-component.yml +++ b/.github/workflows/upload-idf-component.yml @@ -20,9 +20,9 @@ jobs: steps: - name: Get the release tag env: - head_branch: ${{ github.event.inputs.tag || github.event.workflow_run.head_branch }} + head_branch: ${{ inputs.tag || github.event.workflow_run.head_branch }} run: | - if [ "${{ github.event.workflow_run.conclusion }}" != "success" ]; then + if [ "${{ github.event.workflow_run.conclusion }}" != "success" ] && [ "${{ github.event_name }}" == "workflow_run" ]; then echo "Release workflow failed. Exiting..." exit 1 fi From 9eb7dc6f7bddf98600f6e8de3ccc19cc8ba5281b Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 19 Dec 2024 12:54:56 +0200 Subject: [PATCH 129/183] Update Issue-report.yml with the latest version numbers --- .github/ISSUE_TEMPLATE/Issue-report.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/Issue-report.yml b/.github/ISSUE_TEMPLATE/Issue-report.yml index 436c8a57b7e..e3a4e92926e 100644 --- a/.github/ISSUE_TEMPLATE/Issue-report.yml +++ b/.github/ISSUE_TEMPLATE/Issue-report.yml @@ -41,6 +41,8 @@ body: options: - latest master (checkout manually) - latest development Release Candidate (RC-X) + - v3.1.0 + - v3.0.7 - v3.0.6 - v3.0.5 - v3.0.4 From 5c41881858d3f387f80bbdea53be39b10e5608df Mon Sep 17 00:00:00 2001 From: Ramprasad G Date: Tue, 7 Jan 2025 01:59:52 -0800 Subject: [PATCH 130/183] improving logging message while waiting for WiFi (#10739) Co-authored-by: Me No Dev --- .../ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino b/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino index 5c544c934bf..d483e11b1df 100644 --- a/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino +++ b/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino @@ -136,6 +136,7 @@ void setup() { WiFi.begin(ssid, password); WiFi.setSleep(false); + Serial.print("WiFi connecting"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); From 089cbabf1716aef8b0350891c201dcf1e1feb14d Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 7 Jan 2025 07:00:21 -0300 Subject: [PATCH 131/183] docs(3rd-party): Add section for third party tools (#10749) * docs(3rd-party): Add section for third party tools * fix(docs): Fix dependencies in Python 3.13 * fix(typo): Fix docs typo * docs(3rd-party): Re-write some phrases * ci(pre-commit): Apply automatic fixes * fix(naming): Rename files * fix(spelling): Fix spelling mistake --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- docs/en/index.rst | 1 + docs/en/third_party/pioarduino.rst | 14 ++++++++++ docs/en/third_party/wokwi.rst | 42 ++++++++++++++++++++++++++++++ docs/en/third_party_tools.rst | 16 ++++++++++++ docs/requirements.txt | 1 + 5 files changed, 74 insertions(+) create mode 100644 docs/en/third_party/pioarduino.rst create mode 100644 docs/en/third_party/wokwi.rst create mode 100644 docs/en/third_party_tools.rst diff --git a/docs/en/index.rst b/docs/en/index.rst index 40b3251c912..1314a8fc78d 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -16,6 +16,7 @@ Here you will find all the relevant information about the project. Guides Tutorials Advanced Utilities + Third Party Tools Migration Guides FAQ Troubleshooting diff --git a/docs/en/third_party/pioarduino.rst b/docs/en/third_party/pioarduino.rst new file mode 100644 index 00000000000..49af583befa --- /dev/null +++ b/docs/en/third_party/pioarduino.rst @@ -0,0 +1,14 @@ +####################################################### +pioarduino - (p)eople (i)nitiated (o)ptimized (arduino) +####################################################### + +.. warning:: + This tool is **not maintained by the ESP32 Arduino Core team**, so we cannot provide support or guarantee that it will work as expected. + +.. note:: + This is a work in progress documentation and we will appreciate your help! We are looking for contributors! + +About +----- + +For more information, please refer to the `official documentation `_. diff --git a/docs/en/third_party/wokwi.rst b/docs/en/third_party/wokwi.rst new file mode 100644 index 00000000000..0a6eb9d0992 --- /dev/null +++ b/docs/en/third_party/wokwi.rst @@ -0,0 +1,42 @@ +##### +Wokwi +##### + +.. warning:: + This tool is **not maintained by the ESP32 Arduino Core team**, so we cannot provide support or guarantee that it will work as expected. + +.. note:: + This is a work in progress documentation and we will appreciate your help! We are looking for contributors! + +About +----- + +Wokwi is an online Electronics simulator. You can use it to simulate Arduino, ESP32, and many other popular boards, parts and sensors. + +The advantages of using Wokwi include: + +- Immediate start: No need to wait for components or download large software. Everything required is available in your browser, enabling you to begin coding your IoT project within seconds. +- Safe experimentation: Virtual hardware cannot be damaged, allowing users to experiment freely without the risk of destroying components. Mistakes can be easily undone. +- Easy collaboration: Sharing a link to your Wokwi project facilitates obtaining help and feedback from others. +- Code reliability: Helps in distinguishing between hardware and software issues, thereby increasing confidence in your code. +- Unlimited resources: Access to an unlimited number of parts without concerns about cost or availability. +- Supportive community: A maker-friendly environment where users can share projects, seek assistance, and find inspiration. + +Unique features provided by Wokwi: + +- Wi-Fi simulation - Connect your simulated project to the internet. You can use MQTT, HTTP, NTP, and many other network protocols. +- Virtual Logic Analyzer - Capture digital signals in your simulation (e.g. UART, I2C, SPI) and analyze them on your computer. +- Advanced debugging with GDB - Powerful Arduino debugger for advanced users. +- SD card simulation - Store and retrieve files and directories from your code. Paying users can also upload binary files (such as images) +- Chips API - Create your own custom chips and parts, and share them with the community. +- Visual Studio Code integration - Simulate your embedded projects directly from VS Code. + +Pricing +------- + +Wokwi is free for personal use. For commercial users and professionals, please check out the paid plans in the `pricing page `_. + +Learn more +---------- + +For more information, please refer to the `official Wokwi website `_ and the `Wokwi documentation `_. diff --git a/docs/en/third_party_tools.rst b/docs/en/third_party_tools.rst new file mode 100644 index 00000000000..fd8fd92ae0c --- /dev/null +++ b/docs/en/third_party_tools.rst @@ -0,0 +1,16 @@ +################# +Third Party Tools +################# + +Here you will find documentation pages for third party tools that can be used with the ESP32 Arduino Core. + +.. warning:: + These tools are **not maintained by the ESP32 Arduino Core team**, so we cannot provide support or guarantee that they will work as expected. + Each tool documentation should be provided and maintained by the community. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + pioarduino + Wokwi diff --git a/docs/requirements.txt b/docs/requirements.txt index 505feb2e764..d3017fb5adc 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -2,3 +2,4 @@ esp-docs>=1.4.0 sphinx-copybutton==0.5.0 sphinx-tabs==3.2.0 numpydoc==1.5.0 +standard-imghdr==3.13.0 From b07eb175d8cc7e64c321f9a5673783d9149968a7 Mon Sep 17 00:00:00 2001 From: Mathieu Carbou Date: Tue, 7 Jan 2025 11:00:50 +0100 Subject: [PATCH 132/183] feat(webserver): Middleware with default middleware for cors, authc, curl-like logging (#10750) * feat(webserver): Middleware with default middleware for cors, authc, curl-like logging * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Rodrigo Garcia Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- CMakeLists.txt | 6 +- .../examples/Middleware/Middleware.ino | 186 ++++++++++++++ .../WebServer/examples/Middleware/ci.json | 5 + libraries/WebServer/src/Middlewares.h | 66 +++++ libraries/WebServer/src/Parsing.cpp | 39 ++- libraries/WebServer/src/WebServer.cpp | 242 +++++++++++++----- libraries/WebServer/src/WebServer.h | 79 +++--- .../WebServer/src/detail/RequestHandler.h | 10 +- .../src/detail/RequestHandlersImpl.h | 33 +++ .../middleware/AuthenticationMiddleware.cpp | 82 ++++++ .../src/middleware/CorsMiddleware.cpp | 47 ++++ .../src/middleware/LoggingMiddleware.cpp | 74 ++++++ .../WebServer/src/middleware/Middleware.h | 54 ++++ .../src/middleware/MiddlewareChain.cpp | 73 ++++++ 14 files changed, 895 insertions(+), 101 deletions(-) create mode 100644 libraries/WebServer/examples/Middleware/Middleware.ino create mode 100644 libraries/WebServer/examples/Middleware/ci.json create mode 100644 libraries/WebServer/src/Middlewares.h create mode 100644 libraries/WebServer/src/middleware/AuthenticationMiddleware.cpp create mode 100644 libraries/WebServer/src/middleware/CorsMiddleware.cpp create mode 100644 libraries/WebServer/src/middleware/LoggingMiddleware.cpp create mode 100644 libraries/WebServer/src/middleware/Middleware.h create mode 100644 libraries/WebServer/src/middleware/MiddlewareChain.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index dd15e06dac8..3718b965386 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -242,7 +242,11 @@ set(ARDUINO_LIBRARY_USB_SRCS set(ARDUINO_LIBRARY_WebServer_SRCS libraries/WebServer/src/WebServer.cpp libraries/WebServer/src/Parsing.cpp - libraries/WebServer/src/detail/mimetable.cpp) + libraries/WebServer/src/detail/mimetable.cpp + libraries/WebServer/src/middleware/MiddlewareChain.cpp + libraries/WebServer/src/middleware/AuthenticationMiddleware.cpp + libraries/WebServer/src/middleware/CorsMiddleware.cpp + libraries/WebServer/src/middleware/LoggingMiddleware.cpp) set(ARDUINO_LIBRARY_NetworkClientSecure_SRCS libraries/NetworkClientSecure/src/ssl_client.cpp diff --git a/libraries/WebServer/examples/Middleware/Middleware.ino b/libraries/WebServer/examples/Middleware/Middleware.ino new file mode 100644 index 00000000000..9d957341c2d --- /dev/null +++ b/libraries/WebServer/examples/Middleware/Middleware.ino @@ -0,0 +1,186 @@ +/** + * Basic example of using Middlewares with WebServer + * + * Middleware are common request/response processing functions that can be applied globally to all incoming requests or to specific handlers. + * They allow for a common processing thus saving memory and space to avoid duplicating code or states on multiple handlers. + * + * Once the example is flashed (with the correct WiFi credentials), you can test the following scenarios with the listed curl commands: + * - CORS Middleware: answers to OPTIONS requests with the specified CORS headers and also add CORS headers to the response when the request has the Origin header + * - Logging Middleware: logs the request and response to an output in a curl-like format + * - Authentication Middleware: test the authentication with Digest Auth + * + * You can also add your own Middleware by extending the Middleware class and implementing the run method. + * When implementing a Middleware, you can decide when to call the next Middleware in the chain by calling next(). + * + * Middleware are execute in order of addition, the ones attached to the server will be executed first. + */ +#include +#include +#include + +// Your AP WiFi Credentials +// ( This is the AP your ESP will broadcast ) +const char *ap_ssid = "ESP32_Demo"; +const char *ap_password = ""; + +WebServer server(80); + +LoggingMiddleware logger; +CorsMiddleware cors; +AuthenticationMiddleware auth; + +void setup(void) { + Serial.begin(115200); + WiFi.softAP(ap_ssid, ap_password); + + Serial.print("IP address: "); + Serial.println(WiFi.AP.localIP()); + + // curl-like output example: + // + // > curl -v -X OPTIONS -H "origin: http://192.168.4.1" http://192.168.4.1/ + // + // Connection from 192.168.4.2:51683 + // > OPTIONS / HTTP/1.1 + // > Host: 192.168.4.1 + // > User-Agent: curl/8.10.0 + // > Accept: */* + // > origin: http://192.168.4.1 + // > + // * Processed in 5 ms + // < HTTP/1.HTTP/1.1 200 OK + // < Content-Type: text/html + // < Access-Control-Allow-Origin: http://192.168.4.1 + // < Access-Control-Allow-Methods: POST,GET,OPTIONS,DELETE + // < Access-Control-Allow-Headers: X-Custom-Header + // < Access-Control-Allow-Credentials: false + // < Access-Control-Max-Age: 600 + // < Content-Length: 0 + // < Connection: close + // < + logger.setOutput(Serial); + + cors.setOrigin("http://192.168.4.1"); + cors.setMethods("POST,GET,OPTIONS,DELETE"); + cors.setHeaders("X-Custom-Header"); + cors.setAllowCredentials(false); + cors.setMaxAge(600); + + auth.setUsername("admin"); + auth.setPassword("admin"); + auth.setRealm("My Super App"); + auth.setAuthMethod(DIGEST_AUTH); + auth.setAuthFailureMessage("Authentication Failed"); + + server.addMiddleware(&logger); + server.addMiddleware(&cors); + + // Not authenticated + // + // Test CORS preflight request with: + // > curl -v -X OPTIONS -H "origin: http://192.168.4.1" http://192.168.4.1/ + // + // Test cross-domain request with: + // > curl -v -X GET -H "origin: http://192.168.4.1" http://192.168.4.1/ + // + server.on("/", []() { + server.send(200, "text/plain", "Home"); + }); + + // Authenticated + // + // > curl -v -X GET -H "origin: http://192.168.4.1" http://192.168.4.1/protected + // + // Outputs: + // + // * Connection from 192.168.4.2:51750 + // > GET /protected HTTP/1.1 + // > Host: 192.168.4.1 + // > User-Agent: curl/8.10.0 + // > Accept: */* + // > origin: http://192.168.4.1 + // > + // * Processed in 7 ms + // < HTTP/1.HTTP/1.1 401 Unauthorized + // < Content-Type: text/html + // < Access-Control-Allow-Origin: http://192.168.4.1 + // < Access-Control-Allow-Methods: POST,GET,OPTIONS,DELETE + // < Access-Control-Allow-Headers: X-Custom-Header + // < Access-Control-Allow-Credentials: false + // < Access-Control-Max-Age: 600 + // < WWW-Authenticate: Digest realm="My Super App", qop="auth", nonce="ac388a64184e3e102aae6fff1c9e8d76", opaque="e7d158f2b54d25328142d118ff0f932d" + // < Content-Length: 21 + // < Connection: close + // < + // + // > curl -v -X GET -H "origin: http://192.168.4.1" --digest -u admin:admin http://192.168.4.1/protected + // + // Outputs: + // + // * Connection from 192.168.4.2:53662 + // > GET /protected HTTP/1.1 + // > Authorization: Digest username="admin", realm="My Super App", nonce="db9e6824eb2a13bc7b2bf8f3c43db896", uri="/protected", cnonce="NTliZDZiNTcwODM2MzAyY2JjMDBmZGJmNzFiY2ZmNzk=", nc=00000001, qop=auth, response="6ebd145ba0d3496a4a73f5ae79ff5264", opaque="23d739c22810282ff820538cba98bda4" + // > Host: 192.168.4.1 + // > User-Agent: curl/8.10.0 + // > Accept: */* + // > origin: http://192.168.4.1 + // > + // Request handling... + // * Processed in 7 ms + // < HTTP/1.HTTP/1.1 200 OK + // < Content-Type: text/plain + // < Access-Control-Allow-Origin: http://192.168.4.1 + // < Access-Control-Allow-Methods: POST,GET,OPTIONS,DELETE + // < Access-Control-Allow-Headers: X-Custom-Header + // < Access-Control-Allow-Credentials: false + // < Access-Control-Max-Age: 600 + // < Content-Length: 9 + // < Connection: close + // < + server + .on( + "/protected", + []() { + Serial.println("Request handling..."); + server.send(200, "text/plain", "Protected"); + } + ) + .addMiddleware(&auth); + + // Not found is also handled by global middleware + // + // curl -v -X GET -H "origin: http://192.168.4.1" http://192.168.4.1/inexsting + // + // Outputs: + // + // * Connection from 192.168.4.2:53683 + // > GET /inexsting HTTP/1.1 + // > Host: 192.168.4.1 + // > User-Agent: curl/8.10.0 + // > Accept: */* + // > origin: http://192.168.4.1 + // > + // * Processed in 16 ms + // < HTTP/1.HTTP/1.1 404 Not Found + // < Content-Type: text/plain + // < Access-Control-Allow-Origin: http://192.168.4.1 + // < Access-Control-Allow-Methods: POST,GET,OPTIONS,DELETE + // < Access-Control-Allow-Headers: X-Custom-Header + // < Access-Control-Allow-Credentials: false + // < Access-Control-Max-Age: 600 + // < Content-Length: 14 + // < Connection: close + // < + server.onNotFound([]() { + server.send(404, "text/plain", "Page not found"); + }); + + server.collectAllHeaders(); + server.begin(); + Serial.println("HTTP server started"); +} + +void loop(void) { + server.handleClient(); + delay(2); //allow the cpu to switch to other tasks +} diff --git a/libraries/WebServer/examples/Middleware/ci.json b/libraries/WebServer/examples/Middleware/ci.json new file mode 100644 index 00000000000..36babb82730 --- /dev/null +++ b/libraries/WebServer/examples/Middleware/ci.json @@ -0,0 +1,5 @@ +{ + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y" + ] +} diff --git a/libraries/WebServer/src/Middlewares.h b/libraries/WebServer/src/Middlewares.h new file mode 100644 index 00000000000..04fab52790b --- /dev/null +++ b/libraries/WebServer/src/Middlewares.h @@ -0,0 +1,66 @@ +#ifndef MIDDLEWARES_H +#define MIDDLEWARES_H + +#include +#include + +#include + +// curl-like logging middleware +class LoggingMiddleware : public Middleware { +public: + void setOutput(Print &output); + + bool run(WebServer &server, Middleware::Callback next) override; + +private: + Print *_out = nullptr; +}; + +class CorsMiddleware : public Middleware { +public: + CorsMiddleware &setOrigin(const char *origin); + CorsMiddleware &setMethods(const char *methods); + CorsMiddleware &setHeaders(const char *headers); + CorsMiddleware &setAllowCredentials(bool credentials); + CorsMiddleware &setMaxAge(uint32_t seconds); + + void addCORSHeaders(WebServer &server); + + bool run(WebServer &server, Middleware::Callback next) override; + +private: + String _origin = F("*"); + String _methods = F("*"); + String _headers = F("*"); + bool _credentials = true; + uint32_t _maxAge = 86400; +}; + +class AuthenticationMiddleware : public Middleware { +public: + AuthenticationMiddleware &setUsername(const char *username); + AuthenticationMiddleware &setPassword(const char *password); + AuthenticationMiddleware &setPasswordHash(const char *sha1AsBase64orHex); + AuthenticationMiddleware &setCallback(WebServer::THandlerFunctionAuthCheck fn); + + AuthenticationMiddleware &setRealm(const char *realm); + AuthenticationMiddleware &setAuthMethod(HTTPAuthMethod method); + AuthenticationMiddleware &setAuthFailureMessage(const char *message); + + bool isAllowed(WebServer &server) const; + + bool run(WebServer &server, Middleware::Callback next) override; + +private: + String _username; + String _password; + bool _hash = false; + WebServer::THandlerFunctionAuthCheck _callback; + + const char *_realm = nullptr; + HTTPAuthMethod _method = BASIC_AUTH; + String _authFailMsg; +}; + +#endif diff --git a/libraries/WebServer/src/Parsing.cpp b/libraries/WebServer/src/Parsing.cpp index 040338bb749..3030317eeea 100644 --- a/libraries/WebServer/src/Parsing.cpp +++ b/libraries/WebServer/src/Parsing.cpp @@ -78,8 +78,14 @@ bool WebServer::_parseRequest(NetworkClient &client) { String req = client.readStringUntil('\r'); client.readStringUntil('\n'); //reset header value - for (int i = 0; i < _headerKeysCount; ++i) { - _currentHeaders[i].value = String(); + if (_collectAllHeaders) { + // clear previous headers + collectAllHeaders(); + } else { + // clear previous headers + for (RequestArgument *header = _currentHeaders; header; header = header->next) { + header->value = String(); + } } // First line of HTTP request looks like "GET /path HTTP/1.1" @@ -154,9 +160,6 @@ bool WebServer::_parseRequest(NetworkClient &client) { headerValue.trim(); _collectHeader(headerName.c_str(), headerValue.c_str()); - log_v("headerName: %s", headerName.c_str()); - log_v("headerValue: %s", headerValue.c_str()); - if (headerName.equalsIgnoreCase(FPSTR(Content_Type))) { using namespace mime; if (headerValue.startsWith(FPSTR(mimeTable[txt].mimeType))) { @@ -254,9 +257,6 @@ bool WebServer::_parseRequest(NetworkClient &client) { headerValue = req.substring(headerDiv + 2); _collectHeader(headerName.c_str(), headerValue.c_str()); - log_v("headerName: %s", headerName.c_str()); - log_v("headerValue: %s", headerValue.c_str()); - if (headerName.equalsIgnoreCase("Host")) { _hostHeader = headerValue; } @@ -272,12 +272,29 @@ bool WebServer::_parseRequest(NetworkClient &client) { } bool WebServer::_collectHeader(const char *headerName, const char *headerValue) { - for (int i = 0; i < _headerKeysCount; i++) { - if (_currentHeaders[i].key.equalsIgnoreCase(headerName)) { - _currentHeaders[i].value = headerValue; + RequestArgument *last = nullptr; + for (RequestArgument *header = _currentHeaders; header; header = header->next) { + if (header->next == nullptr) { + last = header; + } + if (header->key.equalsIgnoreCase(headerName)) { + header->value = headerValue; + log_v("header collected: %s: %s", headerName, headerValue); return true; } } + assert(last); + if (_collectAllHeaders) { + last->next = new RequestArgument(); + last->next->key = headerName; + last->next->value = headerValue; + _headerKeysCount++; + log_v("header collected: %s: %s", headerName, headerValue); + return true; + } + + log_v("header skipped: %s: %s", headerName, headerValue); + return false; } diff --git a/libraries/WebServer/src/WebServer.cpp b/libraries/WebServer/src/WebServer.cpp index 53c575d2c56..652a86f587f 100644 --- a/libraries/WebServer/src/WebServer.cpp +++ b/libraries/WebServer/src/WebServer.cpp @@ -41,31 +41,28 @@ static const char WWW_Authenticate[] = "WWW-Authenticate"; static const char Content_Length[] = "Content-Length"; static const char ETAG_HEADER[] = "If-None-Match"; -WebServer::WebServer(IPAddress addr, int port) - : _corsEnabled(false), _server(addr, port), _currentMethod(HTTP_ANY), _currentVersion(0), _currentStatus(HC_NONE), _statusChange(0), _nullDelay(true), - _currentHandler(nullptr), _firstHandler(nullptr), _lastHandler(nullptr), _currentArgCount(0), _currentArgs(nullptr), _postArgsLen(0), _postArgs(nullptr), - _headerKeysCount(0), _currentHeaders(nullptr), _contentLength(0), _clientContentLength(0), _chunked(false) { +WebServer::WebServer(IPAddress addr, int port) : _server(addr, port) { log_v("WebServer::Webserver(addr=%s, port=%d)", addr.toString().c_str(), port); } -WebServer::WebServer(int port) - : _corsEnabled(false), _server(port), _currentMethod(HTTP_ANY), _currentVersion(0), _currentStatus(HC_NONE), _statusChange(0), _nullDelay(true), - _currentHandler(nullptr), _firstHandler(nullptr), _lastHandler(nullptr), _currentArgCount(0), _currentArgs(nullptr), _postArgsLen(0), _postArgs(nullptr), - _headerKeysCount(0), _currentHeaders(nullptr), _contentLength(0), _clientContentLength(0), _chunked(false) { +WebServer::WebServer(int port) : _server(port) { log_v("WebServer::Webserver(port=%d)", port); } WebServer::~WebServer() { _server.close(); - if (_currentHeaders) { - delete[] _currentHeaders; - } + + _clearRequestHeaders(); + _clearResponseHeaders(); + delete _chain; + RequestHandler *handler = _firstHandler; while (handler) { RequestHandler *next = handler->next(); delete handler; handler = next; } + _firstHandler = nullptr; } void WebServer::begin() { @@ -436,7 +433,17 @@ void WebServer::handleClient() { _currentClient.setTimeout(HTTP_MAX_SEND_WAIT); /* / 1000 removed, WifiClient setTimeout changed to ms */ if (_parseRequest(_currentClient)) { _contentLength = CONTENT_LENGTH_NOT_SET; - _handleRequest(); + _responseCode = 0; + _clearResponseHeaders(); + + // Run server-level middlewares + if (_chain) { + _chain->runChain(*this, [this]() { + return _handleRequest(); + }); + } else { + _handleRequest(); + } if (_currentClient.isSSE()) { _currentStatus = HC_WAIT_CLOSE; @@ -495,16 +502,22 @@ void WebServer::stop() { } void WebServer::sendHeader(const String &name, const String &value, bool first) { - String headerLine = name; - headerLine += F(": "); - headerLine += value; - headerLine += "\r\n"; + RequestArgument *header = new RequestArgument(); + header->key = name; + header->value = value; - if (first) { - _responseHeaders = headerLine + _responseHeaders; + if (!_responseHeaders || first) { + header->next = _responseHeaders; + _responseHeaders = header; } else { - _responseHeaders += headerLine; + RequestArgument *last = _responseHeaders; + while (last->next) { + last = last->next; + } + last->next = header; } + + _responseHeaderCount++; } void WebServer::setContentLength(const size_t contentLength) { @@ -529,11 +542,14 @@ void WebServer::enableETag(bool enable, ETagFunction fn) { } void WebServer::_prepareHeader(String &response, int code, const char *content_type, size_t contentLength) { - response = String(F("HTTP/1.")) + String(_currentVersion) + ' '; - response += String(code); - response += ' '; - response += _responseCodeToString(code); - response += "\r\n"; + _responseCode = code; + + response.concat(version()); + response.concat(' '); + response.concat(String(code)); + response.concat(' '); + response.concat(responseCodeToString(code)); + response.concat(F("\r\n")); using namespace mime; if (!content_type) { @@ -558,9 +574,14 @@ void WebServer::_prepareHeader(String &response, int code, const char *content_t } sendHeader(String(F("Connection")), String(F("close"))); - response += _responseHeaders; - response += "\r\n"; - _responseHeaders = ""; + for (RequestArgument *header = _responseHeaders; header; header = header->next) { + response.concat(header->key); + response.concat(F(": ")); + response.concat(header->value); + response.concat(F("\r\n")); + } + + response.concat(F("\r\n")); } void WebServer::send(int code, const char *content_type, const String &content) { @@ -568,9 +589,6 @@ void WebServer::send(int code, const char *content_type, const String &content) // Can we assume the following? //if(code == 200 && content.length() == 0 && _contentLength == CONTENT_LENGTH_NOT_SET) // _contentLength = CONTENT_LENGTH_UNKNOWN; - if (content.length() == 0) { - log_w("content length is zero"); - } _prepareHeader(header, code, content_type, content.length()); _currentClientWrite(header.c_str(), header.length()); if (content.length()) { @@ -728,39 +746,43 @@ bool WebServer::hasArg(const String &name) const { } String WebServer::header(const String &name) const { - for (int i = 0; i < _headerKeysCount; ++i) { - if (_currentHeaders[i].key.equalsIgnoreCase(name)) { - return _currentHeaders[i].value; + for (RequestArgument *current = _currentHeaders; current; current = current->next) { + if (current->key.equalsIgnoreCase(name)) { + return current->value; } } return ""; } void WebServer::collectHeaders(const char *headerKeys[], const size_t headerKeysCount) { - _headerKeysCount = headerKeysCount + 2; - if (_currentHeaders) { - delete[] _currentHeaders; - } - _currentHeaders = new RequestArgument[_headerKeysCount]; - _currentHeaders[0].key = FPSTR(AUTHORIZATION_HEADER); - _currentHeaders[1].key = FPSTR(ETAG_HEADER); + collectAllHeaders(); + _collectAllHeaders = false; + + _headerKeysCount += headerKeysCount; + + RequestArgument *last = _currentHeaders->next; + for (int i = 2; i < _headerKeysCount; i++) { - _currentHeaders[i].key = headerKeys[i - 2]; + last->next = new RequestArgument(); + last->next->key = headerKeys[i - 2]; + last = last->next; } } String WebServer::header(int i) const { - if (i < _headerKeysCount) { - return _currentHeaders[i].value; + RequestArgument *current = _currentHeaders; + while (current && i--) { + current = current->next; } - return ""; + return current ? current->value : emptyString; } String WebServer::headerName(int i) const { - if (i < _headerKeysCount) { - return _currentHeaders[i].key; + RequestArgument *current = _currentHeaders; + while (current && i--) { + current = current->next; } - return ""; + return current ? current->key : emptyString; } int WebServer::headers() const { @@ -768,12 +790,7 @@ int WebServer::headers() const { } bool WebServer::hasHeader(const String &name) const { - for (int i = 0; i < _headerKeysCount; ++i) { - if ((_currentHeaders[i].key.equalsIgnoreCase(name)) && (_currentHeaders[i].value.length() > 0)) { - return true; - } - } - return false; + return header(name).length() > 0; } String WebServer::hostHeader() const { @@ -788,16 +805,17 @@ void WebServer::onNotFound(THandlerFunction fn) { _notFoundHandler = fn; } -void WebServer::_handleRequest() { +bool WebServer::_handleRequest() { bool handled = false; - if (!_currentHandler) { - log_e("request handler not found"); - } else { - handled = _currentHandler->handle(*this, _currentMethod, _currentUri); + if (_currentHandler) { + handled = _currentHandler->process(*this, _currentMethod, _currentUri); if (!handled) { log_e("request handler failed to handle request"); } } + // DO NOT LOG if _currentHandler == null !! + // This is is valid use case to handle any other requests + // Also, this is just causing log flooding if (!handled && _notFoundHandler) { _notFoundHandler(); handled = true; @@ -811,6 +829,7 @@ void WebServer::_handleRequest() { _finalizeResponse(); } _currentUri = ""; + return handled; } void WebServer::_finalizeResponse() { @@ -819,7 +838,7 @@ void WebServer::_finalizeResponse() { } } -String WebServer::_responseCodeToString(int code) { +String WebServer::responseCodeToString(int code) { switch (code) { case 100: return F("Continue"); case 101: return F("Switching Protocols"); @@ -864,3 +883,108 @@ String WebServer::_responseCodeToString(int code) { default: return F(""); } } + +void WebServer::_clearResponseHeaders() { + _responseHeaderCount = 0; + RequestArgument *current = _responseHeaders; + while (current) { + RequestArgument *next = current->next; + delete current; + current = next; + } + _responseHeaders = nullptr; +} + +void WebServer::_clearRequestHeaders() { + _headerKeysCount = 0; + RequestArgument *current = _currentHeaders; + while (current) { + RequestArgument *next = current->next; + delete current; + current = next; + } + _currentHeaders = nullptr; +} + +void WebServer::collectAllHeaders() { + _clearRequestHeaders(); + + _currentHeaders = new RequestArgument(); + _currentHeaders->key = FPSTR(AUTHORIZATION_HEADER); + + _currentHeaders->next = new RequestArgument(); + _currentHeaders->next->key = FPSTR(ETAG_HEADER); + + _headerKeysCount = 2; + _collectAllHeaders = true; +} + +const String &WebServer::responseHeader(String name) const { + for (RequestArgument *current = _responseHeaders; current; current = current->next) { + if (current->key.equalsIgnoreCase(name)) { + return current->value; + } + } + return emptyString; +} + +const String &WebServer::responseHeader(int i) const { + RequestArgument *current = _responseHeaders; + while (current && i--) { + current = current->next; + } + return current ? current->value : emptyString; +} + +const String &WebServer::responseHeaderName(int i) const { + RequestArgument *current = _responseHeaders; + while (current && i--) { + current = current->next; + } + return current ? current->key : emptyString; +} + +bool WebServer::hasResponseHeader(const String &name) const { + return header(name).length() > 0; +} + +int WebServer::clientContentLength() const { + return _clientContentLength; +} + +const String WebServer::version() const { + String v; + v.reserve(8); + v.concat(F("HTTP/1.")); + v.concat(_currentVersion); + return v; +} +int WebServer::responseCode() const { + return _responseCode; +} +int WebServer::responseHeaders() const { + return _responseHeaderCount; +} + +WebServer &WebServer::addMiddleware(Middleware *middleware) { + if (!_chain) { + _chain = new MiddlewareChain(); + } + _chain->addMiddleware(middleware); + return *this; +} + +WebServer &WebServer::addMiddleware(Middleware::Function fn) { + if (!_chain) { + _chain = new MiddlewareChain(); + } + _chain->addMiddleware(fn); + return *this; +} + +WebServer &WebServer::removeMiddleware(Middleware *middleware) { + if (_chain) { + _chain->removeMiddleware(middleware); + } + return *this; +} diff --git a/libraries/WebServer/src/WebServer.h b/libraries/WebServer/src/WebServer.h index 0f3405430a7..8daf12c5c30 100644 --- a/libraries/WebServer/src/WebServer.h +++ b/libraries/WebServer/src/WebServer.h @@ -92,6 +92,7 @@ typedef struct { void *data; // additional data } HTTPRaw; +#include "middleware/Middleware.h" #include "detail/RequestHandler.h" namespace fs { @@ -158,6 +159,10 @@ class WebServer { void onNotFound(THandlerFunction fn); //called when handler is not assigned void onFileUpload(THandlerFunction ufn); //handle file uploads + WebServer &addMiddleware(Middleware *middleware); + WebServer &addMiddleware(Middleware::Function fn); + WebServer &removeMiddleware(Middleware *middleware); + String uri() const { return _currentUri; } @@ -181,17 +186,23 @@ class WebServer { int args() const; // get arguments count bool hasArg(const String &name) const; // check if argument exists void collectHeaders(const char *headerKeys[], const size_t headerKeysCount); // set the request headers to collect + void collectAllHeaders(); // collect all request headers String header(const String &name) const; // get request header value by name String header(int i) const; // get request header value by number String headerName(int i) const; // get request header name by number int headers() const; // get header count bool hasHeader(const String &name) const; // check if header exists - int clientContentLength() const { - return _clientContentLength; - } // return "content-length" of incoming HTTP header from "_currentClient" + int clientContentLength() const; // return "content-length" of incoming HTTP header from "_currentClient" + const String version() const; // get the HTTP version string + String hostHeader() const; // get request host header if available or empty String if not - String hostHeader() const; // get request host header if available or empty String if not + int responseCode() const; // get the HTTP response code set + int responseHeaders() const; // get the HTTP response headers count + const String &responseHeader(String name) const; // get the HTTP response header value by name + const String &responseHeader(int i) const; // get the HTTP response header value by number + const String &responseHeaderName(int i) const; // get the HTTP response header name by number + bool hasResponseHeader(const String &name) const; // check if response header exists // send response to the client // code - HTTP response code, can be 200 or 404 @@ -228,6 +239,8 @@ class WebServer { bool _eTagEnabled = false; ETagFunction _eTagFunction = nullptr; + static String responseCodeToString(int code); + protected: virtual size_t _currentClientWrite(const char *b, size_t l) { return _currentClient.write(b, l); @@ -237,11 +250,10 @@ class WebServer { } void _addRequestHandler(RequestHandler *handler); bool _removeRequestHandler(RequestHandler *handler); - void _handleRequest(); + bool _handleRequest(); void _finalizeResponse(); bool _parseRequest(NetworkClient &client); void _parseArguments(const String &data); - static String _responseCodeToString(int code); bool _parseForm(NetworkClient &client, const String &boundary, uint32_t len); bool _parseFormUploadAborted(); void _uploadWriteByte(uint8_t b); @@ -255,48 +267,57 @@ class WebServer { // for extracting Auth parameters String _extractParam(String &authReq, const String ¶m, const char delimit = '"'); + void _clearResponseHeaders(); + void _clearRequestHeaders(); + struct RequestArgument { String key; String value; + RequestArgument *next; }; - boolean _corsEnabled; + boolean _corsEnabled = false; NetworkServer _server; NetworkClient _currentClient; - HTTPMethod _currentMethod; + HTTPMethod _currentMethod = HTTP_ANY; String _currentUri; - uint8_t _currentVersion; - HTTPClientStatus _currentStatus; - unsigned long _statusChange; - boolean _nullDelay; - - RequestHandler *_currentHandler; - RequestHandler *_firstHandler; - RequestHandler *_lastHandler; - THandlerFunction _notFoundHandler; - THandlerFunction _fileUploadHandler; - - int _currentArgCount; - RequestArgument *_currentArgs; - int _postArgsLen; - RequestArgument *_postArgs; + uint8_t _currentVersion = 0; + HTTPClientStatus _currentStatus = HC_NONE; + unsigned long _statusChange = 0; + boolean _nullDelay = true; + + RequestHandler *_currentHandler = nullptr; + RequestHandler *_firstHandler = nullptr; + RequestHandler *_lastHandler = nullptr; + THandlerFunction _notFoundHandler = nullptr; + THandlerFunction _fileUploadHandler = nullptr; + + int _currentArgCount = 0; + RequestArgument *_currentArgs = nullptr; + int _postArgsLen = 0; + RequestArgument *_postArgs = nullptr; std::unique_ptr _currentUpload; std::unique_ptr _currentRaw; - int _headerKeysCount; - RequestArgument *_currentHeaders; - size_t _contentLength; - int _clientContentLength; // "Content-Length" from header of incoming POST or GET request - String _responseHeaders; + int _headerKeysCount = 0; + RequestArgument *_currentHeaders = nullptr; + size_t _contentLength = 0; + int _clientContentLength = 0; // "Content-Length" from header of incoming POST or GET request + RequestArgument *_responseHeaders = nullptr; String _hostHeader; - bool _chunked; + bool _chunked = false; String _snonce; // Store noance and opaque for future comparison String _sopaque; String _srealm; // Store the Auth realm between Calls + + int _responseHeaderCount = 0; + int _responseCode = 0; + bool _collectAllHeaders = false; + MiddlewareChain *_chain = nullptr; }; #endif //ESP8266WEBSERVER_H diff --git a/libraries/WebServer/src/detail/RequestHandler.h b/libraries/WebServer/src/detail/RequestHandler.h index c730ce25bcb..75e11c94ba8 100644 --- a/libraries/WebServer/src/detail/RequestHandler.h +++ b/libraries/WebServer/src/detail/RequestHandler.h @@ -6,7 +6,9 @@ class RequestHandler { public: - virtual ~RequestHandler() {} + virtual ~RequestHandler() { + delete _chain; + } /* note: old handler API for backward compatibility @@ -75,8 +77,14 @@ class RequestHandler { _next = r; } + RequestHandler &addMiddleware(Middleware *middleware); + RequestHandler &addMiddleware(Middleware::Function fn); + RequestHandler &removeMiddleware(Middleware *middleware); + bool process(WebServer &server, HTTPMethod requestMethod, String requestUri); + private: RequestHandler *_next = nullptr; + MiddlewareChain *_chain = nullptr; protected: std::vector pathArgs; diff --git a/libraries/WebServer/src/detail/RequestHandlersImpl.h b/libraries/WebServer/src/detail/RequestHandlersImpl.h index c66c294dd33..3750b594ab2 100644 --- a/libraries/WebServer/src/detail/RequestHandlersImpl.h +++ b/libraries/WebServer/src/detail/RequestHandlersImpl.h @@ -10,6 +10,39 @@ using namespace mime; +RequestHandler &RequestHandler::addMiddleware(Middleware *middleware) { + if (!_chain) { + _chain = new MiddlewareChain(); + } + _chain->addMiddleware(middleware); + return *this; +} + +RequestHandler &RequestHandler::addMiddleware(Middleware::Function fn) { + if (!_chain) { + _chain = new MiddlewareChain(); + } + _chain->addMiddleware(fn); + return *this; +} + +RequestHandler &RequestHandler::removeMiddleware(Middleware *middleware) { + if (_chain) { + _chain->removeMiddleware(middleware); + } + return *this; +} + +bool RequestHandler::process(WebServer &server, HTTPMethod requestMethod, String requestUri) { + if (_chain) { + return _chain->runChain(server, [this, &server, &requestMethod, &requestUri]() { + return handle(server, requestMethod, requestUri); + }); + } else { + return handle(server, requestMethod, requestUri); + } +} + class FunctionRequestHandler : public RequestHandler { public: FunctionRequestHandler(WebServer::THandlerFunction fn, WebServer::THandlerFunction ufn, const Uri &uri, HTTPMethod method) diff --git a/libraries/WebServer/src/middleware/AuthenticationMiddleware.cpp b/libraries/WebServer/src/middleware/AuthenticationMiddleware.cpp new file mode 100644 index 00000000000..cab25ba4e50 --- /dev/null +++ b/libraries/WebServer/src/middleware/AuthenticationMiddleware.cpp @@ -0,0 +1,82 @@ +#include "Middlewares.h" + +AuthenticationMiddleware &AuthenticationMiddleware::setUsername(const char *username) { + _username = username; + _callback = nullptr; + return *this; +} + +AuthenticationMiddleware &AuthenticationMiddleware::setPassword(const char *password) { + _password = password; + _hash = false; + _callback = nullptr; + return *this; +} + +AuthenticationMiddleware &AuthenticationMiddleware::setPasswordHash(const char *sha1AsBase64orHex) { + _password = sha1AsBase64orHex; + _hash = true; + _callback = nullptr; + return *this; +} + +AuthenticationMiddleware &AuthenticationMiddleware::setCallback(WebServer::THandlerFunctionAuthCheck fn) { + assert(fn); + _callback = fn; + _hash = false; + _username = emptyString; + _password = emptyString; + return *this; +} + +AuthenticationMiddleware &AuthenticationMiddleware::setRealm(const char *realm) { + _realm = realm; + return *this; +} + +AuthenticationMiddleware &AuthenticationMiddleware::setAuthMethod(HTTPAuthMethod method) { + _method = method; + return *this; +} + +AuthenticationMiddleware &AuthenticationMiddleware::setAuthFailureMessage(const char *message) { + _authFailMsg = message; + return *this; +} + +bool AuthenticationMiddleware::isAllowed(WebServer &server) const { + if (_callback) { + return server.authenticate(_callback); + } + + if (!_username.isEmpty() && !_password.isEmpty()) { + if (_hash) { + return server.authenticateBasicSHA1(_username.c_str(), _password.c_str()); + } else { + return server.authenticate(_username.c_str(), _password.c_str()); + } + } + + return true; +} + +bool AuthenticationMiddleware::run(WebServer &server, Middleware::Callback next) { + bool authenticationRequired = false; + + if (_callback) { + authenticationRequired = !server.authenticate(_callback); + } else if (!_username.isEmpty() && !_password.isEmpty()) { + if (_hash) { + authenticationRequired = !server.authenticateBasicSHA1(_username.c_str(), _password.c_str()); + } else { + authenticationRequired = !server.authenticate(_username.c_str(), _password.c_str()); + } + } + + if (authenticationRequired) { + server.requestAuthentication(_method, _realm, _authFailMsg); + return true; + } else { + return next(); + } +} diff --git a/libraries/WebServer/src/middleware/CorsMiddleware.cpp b/libraries/WebServer/src/middleware/CorsMiddleware.cpp new file mode 100644 index 00000000000..a52ccd59f23 --- /dev/null +++ b/libraries/WebServer/src/middleware/CorsMiddleware.cpp @@ -0,0 +1,47 @@ +#include "Middlewares.h" + +CorsMiddleware &CorsMiddleware::setOrigin(const char *origin) { + _origin = origin; + return *this; +} + +CorsMiddleware &CorsMiddleware::setMethods(const char *methods) { + _methods = methods; + return *this; +} + +CorsMiddleware &CorsMiddleware::setHeaders(const char *headers) { + _headers = headers; + return *this; +} + +CorsMiddleware &CorsMiddleware::setAllowCredentials(bool credentials) { + _credentials = credentials; + return *this; +} + +CorsMiddleware &CorsMiddleware::setMaxAge(uint32_t seconds) { + _maxAge = seconds; + return *this; +} + +void CorsMiddleware::addCORSHeaders(WebServer &server) { + server.sendHeader(F("Access-Control-Allow-Origin"), _origin.c_str()); + server.sendHeader(F("Access-Control-Allow-Methods"), _methods.c_str()); + server.sendHeader(F("Access-Control-Allow-Headers"), _headers.c_str()); + server.sendHeader(F("Access-Control-Allow-Credentials"), _credentials ? F("true") : F("false")); + server.sendHeader(F("Access-Control-Max-Age"), String(_maxAge).c_str()); +} + +bool CorsMiddleware::run(WebServer &server, Middleware::Callback next) { + // Origin header ? => CORS handling + if (server.hasHeader(F("Origin"))) { + addCORSHeaders(server); + // check if this is a preflight request => handle it and return + if (server.method() == HTTP_OPTIONS) { + server.send(200); + return true; + } + } + return next(); +} diff --git a/libraries/WebServer/src/middleware/LoggingMiddleware.cpp b/libraries/WebServer/src/middleware/LoggingMiddleware.cpp new file mode 100644 index 00000000000..e1f6d708c2e --- /dev/null +++ b/libraries/WebServer/src/middleware/LoggingMiddleware.cpp @@ -0,0 +1,74 @@ +#include "Middlewares.h" + +void LoggingMiddleware::setOutput(Print &output) { + _out = &output; +} + +bool LoggingMiddleware::run(WebServer &server, Middleware::Callback next) { + if (_out == nullptr) { + return next(); + } + + _out->print(F("* Connection from ")); + _out->print(server.client().remoteIP().toString()); + _out->print(F(":")); + _out->println(server.client().remotePort()); + + _out->print(F("> ")); + const HTTPMethod method = server.method(); + if (method == HTTP_ANY) { + _out->print(F("HTTP_ANY")); + } else { + _out->print(http_method_str(method)); + } + _out->print(F(" ")); + _out->print(server.uri()); + _out->print(F(" ")); + _out->println(server.version()); + + int n = server.headers(); + for (int i = 0; i < n; i++) { + String v = server.header(i); + if (!v.isEmpty()) { + // because these 2 are always there, eventually empty: "Authorization", "If-None-Match" + _out->print(F("> ")); + _out->print(server.headerName(i)); + _out->print(F(": ")); + _out->println(server.header(i)); + } + } + + _out->println(F(">")); + + uint32_t elapsed = millis(); + const bool ret = next(); + elapsed = millis() - elapsed; + + if (ret) { + _out->print(F("* Processed in ")); + _out->print(elapsed); + _out->println(F(" ms")); + _out->print(F("< ")); + _out->print(F("HTTP/1.")); + _out->print(server.version()); + _out->print(F(" ")); + _out->print(server.responseCode()); + _out->print(F(" ")); + _out->println(WebServer::responseCodeToString(server.responseCode())); + + n = server.responseHeaders(); + for (int i = 0; i < n; i++) { + _out->print(F("< ")); + _out->print(server.responseHeaderName(i)); + _out->print(F(": ")); + _out->println(server.responseHeader(i)); + } + + _out->println(F("<")); + + } else { + _out->println(F("* Not processed!")); + } + + return ret; +} diff --git a/libraries/WebServer/src/middleware/Middleware.h b/libraries/WebServer/src/middleware/Middleware.h new file mode 100644 index 00000000000..080f5be0aba --- /dev/null +++ b/libraries/WebServer/src/middleware/Middleware.h @@ -0,0 +1,54 @@ +#ifndef MIDDLEWARE_H +#define MIDDLEWARE_H + +#include +#include + +class MiddlewareChain; +class WebServer; + +class Middleware { +public: + typedef std::function Callback; + typedef std::function Function; + + virtual ~Middleware() {} + + virtual bool run(WebServer &server, Callback next) { + return next(); + }; + +private: + friend MiddlewareChain; + Middleware *_next = nullptr; + bool _freeOnRemoval = false; +}; + +class MiddlewareFunction : public Middleware { +public: + MiddlewareFunction(Middleware::Function fn) : _fn(fn) {} + + bool run(WebServer &server, Middleware::Callback next) override { + return _fn(server, next); + } + +private: + Middleware::Function _fn; +}; + +class MiddlewareChain { +public: + ~MiddlewareChain(); + + void addMiddleware(Middleware::Function fn); + void addMiddleware(Middleware *middleware); + bool removeMiddleware(Middleware *middleware); + + bool runChain(WebServer &server, Middleware::Callback finalizer); + +private: + Middleware *_root = nullptr; + Middleware *_current = nullptr; +}; + +#endif diff --git a/libraries/WebServer/src/middleware/MiddlewareChain.cpp b/libraries/WebServer/src/middleware/MiddlewareChain.cpp new file mode 100644 index 00000000000..56b3066caea --- /dev/null +++ b/libraries/WebServer/src/middleware/MiddlewareChain.cpp @@ -0,0 +1,73 @@ +#include "Middleware.h" + +MiddlewareChain::~MiddlewareChain() { + Middleware *current = _root; + while (current) { + Middleware *next = current->_next; + if (current->_freeOnRemoval) { + delete current; + } + current = next; + } + _root = nullptr; +} + +void MiddlewareChain::addMiddleware(Middleware::Function fn) { + MiddlewareFunction *middleware = new MiddlewareFunction(fn); + middleware->_freeOnRemoval = true; + addMiddleware(middleware); +} + +void MiddlewareChain::addMiddleware(Middleware *middleware) { + if (!_root) { + _root = middleware; + return; + } + Middleware *current = _root; + while (current->_next) { + current = current->_next; + } + current->_next = middleware; +} + +bool MiddlewareChain::removeMiddleware(Middleware *middleware) { + if (!_root) { + return false; + } + if (_root == middleware) { + _root = _root->_next; + if (middleware->_freeOnRemoval) { + delete middleware; + } + return true; + } + Middleware *current = _root; + while (current->_next) { + if (current->_next == middleware) { + current->_next = current->_next->_next; + if (middleware->_freeOnRemoval) { + delete middleware; + } + return true; + } + current = current->_next; + } + return false; +} + +bool MiddlewareChain::runChain(WebServer &server, Middleware::Callback finalizer) { + if (!_root) { + return finalizer(); + } + _current = _root; + Middleware::Callback next; + next = [this, &server, &next, finalizer]() { + if (!_current) { + return finalizer(); + } + Middleware *that = _current; + _current = _current->_next; + return that->run(server, next); + }; + return next(); +} From e3cc04084de36c066d5101d2998ee0ad838a94cf Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 7 Jan 2025 07:01:16 -0300 Subject: [PATCH 133/183] feat(matter): new Matter Endpoint for Thermostat (#10755) * feat(matter): add new matter endpoint for thermostat * fix(matter): not used variable from log_e() message * feat(matter): adds specifc type name for thermostat auto mode enabled * fix(matter): suggested changes in pr review * feat(matter): added the whole list of thermostat operational modes * fix(matter): fixed type in thermostat operational modes * ci(pre-commit): Apply automatic fixes * fix(matter): typos caught by CI codespell --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- CMakeLists.txt | 1 + .../MatterThermostat/MatterThermostat.ino | 243 ++++++++++++ .../Matter/examples/MatterThermostat/ci.json | 7 + libraries/Matter/keywords.txt | 42 ++ libraries/Matter/src/Matter.h | 2 + .../src/MatterEndpoints/MatterThermostat.cpp | 370 ++++++++++++++++++ .../src/MatterEndpoints/MatterThermostat.h | 207 ++++++++++ 7 files changed, 872 insertions(+) create mode 100644 libraries/Matter/examples/MatterThermostat/MatterThermostat.ino create mode 100644 libraries/Matter/examples/MatterThermostat/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterThermostat.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterThermostat.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 3718b965386..9fd23d14d77 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -181,6 +181,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp + libraries/Matter/src/MatterEndpoints/MatterThermostat.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS diff --git a/libraries/Matter/examples/MatterThermostat/MatterThermostat.ino b/libraries/Matter/examples/MatterThermostat/MatterThermostat.ino new file mode 100644 index 00000000000..508b508573a --- /dev/null +++ b/libraries/Matter/examples/MatterThermostat/MatterThermostat.ino @@ -0,0 +1,243 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + This example is an example code that will create a Matter Device which can be + commissioned and controlled from a Matter Environment APP. + Additionally the ESP32 will send debug messages indicating the Matter activity. + Turning DEBUG Level ON may be useful to following Matter Accessory and Controller messages. +*/ + +// Matter Manager +#include +#include + +// List of Matter Endpoints for this Node +// Matter Thermostat Endpoint +MatterThermostat SimulatedThermostat; + +// WiFi is manually set and started +const char *ssid = "your-ssid"; // Change this to your WiFi SSID +const char *password = "your-password"; // Change this to your WiFi password + +// set your board USER BUTTON pin here - decommissioning button +const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. + +// Button control - decommision the Matter Node +uint32_t button_time_stamp = 0; // debouncing control +bool button_state = false; // false = released | true = pressed +const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission + +// Simulate a system that will activate heating/cooling in addition to a temperature sensor - add your preferred code here +float getSimulatedTemperature(bool isHeating, bool isCooling) { + // read sensor temperature and apply heating/cooling + float simulatedTempHWSensor = SimulatedThermostat.getLocalTemperature(); + + if (isHeating) { + // it will increase to simulate a heating system + simulatedTempHWSensor = simulatedTempHWSensor + 0.5; + } + if (isCooling) { + // it will decrease to simulate a colling system + simulatedTempHWSensor = simulatedTempHWSensor - 0.5; + } + // otherwise, it will keep the temperature stable + return simulatedTempHWSensor; +} + +void setup() { + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node + pinMode(buttonPin, INPUT_PULLUP); + + Serial.begin(115200); + + // Manually connect to WiFi + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + // Simulated Thermostat in COOLING and HEATING mode with Auto Mode to keep the temperature between setpoints + // Auto Mode can only be used when the control sequence of operation is Cooling & Heating + SimulatedThermostat.begin(MatterThermostat::THERMOSTAT_SEQ_OP_COOLING_HEATING, MatterThermostat::THERMOSTAT_AUTO_MODE_ENABLED); + + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + + // Check Matter Accessory Commissioning state, which may change during execution of loop() + if (!Matter.isDeviceCommissioned()) { + Serial.println(""); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + // waits for Matter Thermostat Commissioning. + uint32_t timeCount = 0; + while (!Matter.isDeviceCommissioned()) { + delay(100); + if ((timeCount++ % 50) == 0) { // 50*100ms = 5 sec + Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + + // after commissioning, set initial thermostat parameters + // start the thermostat in AUTO mode + SimulatedThermostat.setMode(MatterThermostat::THERMOSTAT_MODE_AUTO); + // cooling setpoint must be lower than heating setpoint by at least 2.5C (deadband), in auto mode + SimulatedThermostat.setCoolingHeatingSetpoints(20.0, 23.00); // the target cooler and heating setpoint + // set the local temperature sensor in Celsius + SimulatedThermostat.setLocalTemperature(12.50); + + Serial.println(); + Serial.printf( + "Initial Setpoints are %.01fC to %.01fC with a minimum 2.5C difference\r\n", SimulatedThermostat.getHeatingSetpoint(), + SimulatedThermostat.getCoolingSetpoint() + ); + Serial.printf("Auto mode is ON. Initial Temperature of %.01fC \r\n", SimulatedThermostat.getLocalTemperature()); + Serial.println("Local Temperature Sensor will be simulated every 10 seconds and changed by a simulated heater and cooler to move in between setpoints."); + } +} + +// This will simulate the thermostat control system (heating and cooling) +// User can set a local temperature using the Serial input (type a number and press Enter) +// New temperature can be an positive or negative temperature in Celsius, between -50C and 50C +// Initial local temperature is 10C as defined in getSimulatedTemperature() function +void readSerialForNewTemperature() { + static String newTemperatureStr; + + while (Serial.available()) { + char c = Serial.read(); + if (c == '\n' || c == '\r') { + if (newTemperatureStr.length() > 0) { + // convert the string to a float value + float newTemperature = newTemperatureStr.toFloat(); + // check if the new temperature is valid + if (newTemperature >= -50.0 && newTemperature <= 50.0) { + // set the new temperature + SimulatedThermostat.setLocalTemperature(newTemperature); + Serial.printf("New Temperature is %.01fC\r\n", newTemperature); + } else { + Serial.println("Invalid Temperature value. Please type a number between -50 and 50"); + } + newTemperatureStr = ""; + } + } else { + if (c == '+' || c == '-' || (c >= '0' && c <= '9') || c == '.') { + newTemperatureStr += c; + } else { + Serial.println("Invalid character. Please type a number between -50 and 50"); + newTemperatureStr = ""; + } + } + } +} + +// loop will simulate the thermostat control system +// User can set a local temperature using the Serial input (type a number and press Enter) +// User can change the thermostat mode using the Matter APP (smartphone) +// The loop will simulate a heating and cooling system and the associated local temperature change +void loop() { + static uint32_t timeCounter = 0; + + // Simulate the heating and cooling systems + static bool isHeating = false; + static bool isCooling = false; + + // check if a new temperature is typed in the Serial Monitor + readSerialForNewTemperature(); + + // simulate thermostat with heating/cooling system and the associated local temperature change, every 10s + if (!(timeCounter++ % 20)) { // delaying for 500ms x 20 = 10s + float localTemperature = getSimulatedTemperature(isHeating, isCooling); + // Print the current thermostat local temperature value + Serial.printf("Current Local Temperature is %.01fC\r\n", localTemperature); + SimulatedThermostat.setLocalTemperature(localTemperature); // publish the new temperature value + + // Simulate the thermostat control system - User has 4 modes: OFF, HEAT, COOL, AUTO + switch (SimulatedThermostat.getMode()) { + case MatterThermostat::THERMOSTAT_MODE_OFF: + // turn off the heating and cooling systems + isHeating = false; + isCooling = false; + break; + case MatterThermostat::THERMOSTAT_MODE_AUTO: + // User APP has set the thermostat to AUTO mode -- keeping the tempeature between both setpoints + // check if the heating system should be turned on or off + if (localTemperature < SimulatedThermostat.getHeatingSetpoint() + SimulatedThermostat.getDeadBand()) { + // turn on the heating system and turn off the cooling system + isHeating = true; + isCooling = false; + } + if (localTemperature > SimulatedThermostat.getCoolingSetpoint() - SimulatedThermostat.getDeadBand()) { + // turn off the heating system and turn on the cooling system + isHeating = false; + isCooling = true; + } + break; + case MatterThermostat::THERMOSTAT_MODE_HEAT: + // Simulate the heating system - User has turned the heating system ON + isHeating = true; + isCooling = false; // keep the cooling system off as it is in heating mode + // when the heating system is in HEATING mode, it will be turned off as soon as the local temperature is above the setpoint + if (localTemperature > SimulatedThermostat.getHeatingSetpoint()) { + // turn off the heating system + isHeating = false; + } + break; + case MatterThermostat::THERMOSTAT_MODE_COOL: + // Simulate the cooling system - User has turned the cooling system ON + if (SimulatedThermostat.getMode() == MatterThermostat::THERMOSTAT_MODE_COOL) { + isCooling = true; + isHeating = false; // keep the heating system off as it is in cooling mode + // when the cooling system is in COOLING mode, it will be turned off as soon as the local temperature is bellow the setpoint + if (localTemperature < SimulatedThermostat.getCoolingSetpoint()) { + // turn off the cooling system + isCooling = false; + } + } + break; + default: log_e("Invalid Thermostat Mode %d", SimulatedThermostat.getMode()); + } + // Reporting Heating and Cooling status + Serial.printf( + "\tThermostat Mode: %s >>> Heater is %s -- Cooler is %s\r\n", MatterThermostat::getThermostatModeString(SimulatedThermostat.getMode()), + isHeating ? "ON" : "OFF", isCooling ? "ON" : "OFF" + ); + } + // Check if the button has been pressed + if (digitalRead(buttonPin) == LOW && !button_state) { + // deals with button debouncing + button_time_stamp = millis(); // record the time while the button is pressed. + button_state = true; // pressed. + } + + if (digitalRead(buttonPin) == HIGH && button_state) { + button_state = false; // released + } + + // Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node + uint32_t time_diff = millis() - button_time_stamp; + if (button_state && time_diff > decommissioningTimeout) { + Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again."); + Matter.decommission(); + button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so + } + + delay(500); +} diff --git a/libraries/Matter/examples/MatterThermostat/ci.json b/libraries/Matter/examples/MatterThermostat/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterThermostat/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index 3f40e598ada..a63d9a65acb 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -24,6 +24,18 @@ MatterContactSensor KEYWORD1 MatterPressureSensor KEYWORD1 MatterOccupancySensor KEYWORD1 MatterOnOffPlugin KEYWORD1 +MatterThermostat KEYWORD1 +ControlSequenceOfOperation_t KEYWORD1 +ThermostatMode_t KEYWORD1 +EndPointCB KEYWORD1 +EndPointHeatingSetpointCB KEYWORD1 +EndPointCoolingSetpointCB KEYWORD1 +EndPointTemperatureCB KEYWORD1 +EndPointModeCB KEYWORD1 +EndPointSpeedCB KEYWORD1 +EndPointOnOffCB KEYWORD1 +EndPointBrightnessCB KEYWORD1 +EndPointRGBColorCB KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -78,6 +90,24 @@ setPressure KEYWORD2 getPressure KEYWORD2 setOccupancy KEYWORD2 getOccupancy KEYWORD2 +getControlSequence KEYWORD2 +getMinHeatSetpoint KEYWORD2 +getMaxHeatSetpoint KEYWORD2 +getMinCoolSetpoint KEYWORD2 +getMaxCoolSetpoint KEYWORD2 +getDeadBand KEYWORD2 +setCoolingSetpoint KEYWORD2 +getCoolingSetpoint KEYWORD2 +setHeatingSetpoint KEYWORD2 +getHeatingSetpoint KEYWORD2 +setCoolingHeatingSetpoints KEYWORD2 +setLocalTemperature KEYWORD2 +getLocalTemperature KEYWORD2 +getThermostatModeString KEYWORD2 +onChangeMode KEYWORD2 +onChangeLocalTemperature KEYWORD2 +onChangeCoolingSetpoint KEYWORD2 +onChangeHeatingSetpoint KEYWORD2 ####################################### # Constants (LITERAL1) @@ -104,3 +134,15 @@ FAN_MODE_SEQ_OFF_LOW_MED_HIGH_AUTO LITERAL1 FAN_MODE_SEQ_OFF_LOW_HIGH_AUTO LITERAL1 FAN_MODE_SEQ_OFF_HIGH_AUTO LITERAL1 FAN_MODE_SEQ_OFF_HIGH LITERAL1 +THERMOSTAT_SEQ_OP_COOLING LITERAL1 +THERMOSTAT_SEQ_OP_COOLING_REHEAT LITERAL1 +THERMOSTAT_SEQ_OP_HEATING LITERAL1 +THERMOSTAT_SEQ_OP_HEATING_REHEAT LITERAL1 +THERMOSTAT_SEQ_OP_COOLING_HEATING LITERAL1 +THERMOSTAT_SEQ_OP_COOLING_HEATING_REHEAT LITERAL1 +THERMOSTAT_MODE_OFF LITERAL1 +THERMOSTAT_MODE_AUTO LITERAL1 +THERMOSTAT_MODE_COOL LITERAL1 +THERMOSTAT_MODE_HEAT LITERAL1 +THERMOSTAT_AUTO_MODE_DISABLED LITERAL1 +THERMOSTAT_AUTO_MODE_ENABLED LITERAL1 diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index 7fcab363f11..e54ceb47e5e 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -32,6 +32,7 @@ #include #include #include +#include using namespace esp_matter; @@ -70,6 +71,7 @@ class ArduinoMatter { friend class MatterPressureSensor; friend class MatterOccupancySensor; friend class MatterOnOffPlugin; + friend class MatterThermostat; protected: static void _init(); diff --git a/libraries/Matter/src/MatterEndpoints/MatterThermostat.cpp b/libraries/Matter/src/MatterEndpoints/MatterThermostat.cpp new file mode 100644 index 00000000000..5a68421bd8a --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterThermostat.cpp @@ -0,0 +1,370 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +// string helper for the THERMOSTAT MODE +const char *MatterThermostat::thermostatModeString[5] = {"OFF", "AUTO", "UNKNOWN", "COOL", "HEAT"}; + +// endpoint for color light device +namespace esp_matter { +using namespace cluster; +namespace endpoint { +namespace multi_mode_thermostat { +typedef struct config { + cluster::descriptor::config_t descriptor; + cluster::identify::config_t identify; + cluster::scenes_management::config_t scenes_management; + cluster::groups::config_t groups; + cluster::thermostat::config_t thermostat; +} config_t; + +uint32_t get_device_type_id() { + return ESP_MATTER_THERMOSTAT_DEVICE_TYPE_ID; +} + +uint8_t get_device_type_version() { + return ESP_MATTER_THERMOSTAT_DEVICE_TYPE_VERSION; +} + +esp_err_t add(endpoint_t *endpoint, config_t *config) { + if (!endpoint) { + log_e("Endpoint cannot be NULL"); + return ESP_ERR_INVALID_ARG; + } + esp_err_t err = add_device_type(endpoint, get_device_type_id(), get_device_type_version()); + if (err != ESP_OK) { + log_e("Failed to add device type id:%" PRIu32 ",err: %d", get_device_type_id(), err); + return err; + } + + descriptor::create(endpoint, &(config->descriptor), CLUSTER_FLAG_SERVER); + identify::create(endpoint, &(config->identify), CLUSTER_FLAG_SERVER); + groups::create(endpoint, &(config->groups), CLUSTER_FLAG_SERVER); + uint32_t thermostatFeatures = 0; + switch (config->thermostat.control_sequence_of_operation) { + case MatterThermostat::THERMOSTAT_SEQ_OP_COOLING: + case MatterThermostat::THERMOSTAT_SEQ_OP_COOLING_REHEAT: thermostatFeatures = cluster::thermostat::feature::cooling::get_id(); break; + case MatterThermostat::THERMOSTAT_SEQ_OP_HEATING: + case MatterThermostat::THERMOSTAT_SEQ_OP_HEATING_REHEAT: thermostatFeatures = cluster::thermostat::feature::heating::get_id(); break; + case MatterThermostat::THERMOSTAT_SEQ_OP_COOLING_HEATING: + case MatterThermostat::THERMOSTAT_SEQ_OP_COOLING_HEATING_REHEAT: + thermostatFeatures = cluster::thermostat::feature::cooling::get_id() | cluster::thermostat::feature::heating::get_id(); + break; + } + cluster::thermostat::create(endpoint, &(config->thermostat), CLUSTER_FLAG_SERVER, thermostatFeatures); + return ESP_OK; +} + +endpoint_t *create(node_t *node, config_t *config, uint8_t flags, void *priv_data) { + endpoint_t *endpoint = endpoint::create(node, flags, priv_data); + add(endpoint, config); + return endpoint; +} +} // namespace multi_mode_thermostat +} // namespace endpoint +} // namespace esp_matter + +bool MatterThermostat::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) { + bool ret = true; + if (!started) { + log_e("Matter Thermostat device has not begun."); + return false; + } + log_d("Thermostat Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); + + if (cluster_id == Thermostat::Id) { + switch (attribute_id) { + case Thermostat::Attributes::SystemMode::Id: + if (_onChangeModeCB != NULL) { + ret &= _onChangeModeCB((ThermostatMode_t)val->val.u8); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(); + } + if (ret == true) { + currentMode = (ThermostatMode_t)val->val.u8; + log_v("Thermostat Mode updated to %d", val->val.u8); + } + break; + case Thermostat::Attributes::LocalTemperature::Id: + if (_onChangeTemperatureCB != NULL) { + ret &= _onChangeTemperatureCB((float)val->val.i16 / 100.00); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(); + } + if (ret == true) { + localTemperature = val->val.i16; + log_v("Local Temperature updated to %.01fC", (float)val->val.i16 / 100.00); + } + break; + case Thermostat::Attributes::OccupiedCoolingSetpoint::Id: + if (_onChangeCoolingSetpointCB != NULL) { + ret &= _onChangeCoolingSetpointCB((float)val->val.i16 / 100.00); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(); + } + if (ret == true) { + coolingSetpointTemperature = val->val.i16; + log_v("Cooling Setpoint updated to %.01fC", (float)val->val.i16 / 100.00); + } + break; + case Thermostat::Attributes::OccupiedHeatingSetpoint::Id: + if (_onChangeHeatingSetpointCB != NULL) { + ret &= _onChangeHeatingSetpointCB((float)val->val.i16 / 100.00); + } + if (_onChangeCB != NULL) { + ret &= _onChangeCB(); + } + if (ret == true) { + heatingSetpointTemperature = val->val.i16; + log_v("Heating Setpoint updated to %.01fC", (float)val->val.i16 / 100.00); + } + break; + default: log_w("Unhandled Thermostat Attribute ID: %u", attribute_id); break; + } + } + return ret; +} + +MatterThermostat::MatterThermostat() {} + +MatterThermostat::~MatterThermostat() { + end(); +} + +bool MatterThermostat::begin(ControlSequenceOfOperation_t _controlSequence, ThermostatAutoMode_t _autoMode) { + ArduinoMatter::_init(); + + if (getEndPointId() != 0) { + log_e("Matter Thermostat with Endpoint Id %d device has already been created.", getEndPointId()); + return false; + } + + // check if auto mode is allowed with the control sequence of operation - only allowed for Cooling & Heating + if (_autoMode == THERMOSTAT_AUTO_MODE_ENABLED && _controlSequence != THERMOSTAT_SEQ_OP_COOLING_HEATING + && _controlSequence != THERMOSTAT_SEQ_OP_COOLING_HEATING_REHEAT) { + log_e("Thermostat in Auto Mode requires a Cooling & Heating Control Sequence of Operation."); + return false; + } + + const int16_t _localTemperature = 2000; // initial value to be automatically changed by the Matter Thermostat + const int16_t _coolingSetpointTemperature = 2400; // 24C cooling setpoint + const int16_t _heatingSetpointTemperature = 1600; // 16C heating setpoint + const ThermostatMode_t _currentMode = THERMOSTAT_MODE_OFF; + + multi_mode_thermostat::config_t thermostat_config; + thermostat_config.thermostat.control_sequence_of_operation = (uint8_t)_controlSequence; + thermostat_config.thermostat.cooling.occupied_cooling_setpoint = _coolingSetpointTemperature; + thermostat_config.thermostat.heating.occupied_heating_setpoint = _heatingSetpointTemperature; + thermostat_config.thermostat.system_mode = (uint8_t)_currentMode; + thermostat_config.thermostat.local_temperature = _localTemperature; + + // endpoint handles can be used to add/modify clusters + endpoint_t *endpoint = multi_mode_thermostat::create(node::get(), &thermostat_config, ENDPOINT_FLAG_NONE, (void *)this); + if (endpoint == nullptr) { + log_e("Failed to create Thermostat endpoint"); + return false; + } + if (_autoMode == THERMOSTAT_AUTO_MODE_ENABLED) { + cluster_t *cluster = cluster::get(endpoint, Thermostat::Id); + thermostat_config.thermostat.auto_mode.min_setpoint_dead_band = kDefaultDeadBand; // fixed by default to 2.5C + cluster::thermostat::feature::auto_mode::add(cluster, &thermostat_config.thermostat.auto_mode); + } + + controlSequence = _controlSequence; + autoMode = _autoMode; + coolingSetpointTemperature = _coolingSetpointTemperature; + heatingSetpointTemperature = _heatingSetpointTemperature; + localTemperature = _localTemperature; + currentMode = _currentMode; + + setEndPointId(endpoint::get_id(endpoint)); + log_i("Thermostat created with endpoint_id %d", getEndPointId()); + started = true; + return true; +} + +void MatterThermostat::end() { + started = false; +} + +bool MatterThermostat::setMode(ThermostatMode_t _mode) { + if (!started) { + log_e("Matter Thermostat device has not begun."); + return false; + } + + if (autoMode == THERMOSTAT_AUTO_MODE_DISABLED && _mode == THERMOSTAT_MODE_AUTO) { + log_e("Thermostat can't set Auto Mode."); + return false; + } + // check if the requested mode is valid based on the control sequence of operation + // no restrictions for OFF mode + if (_mode != THERMOSTAT_MODE_OFF) { + // check HEAT, COOL and AUTO modes + switch (controlSequence) { + case THERMOSTAT_SEQ_OP_COOLING: + case THERMOSTAT_SEQ_OP_COOLING_REHEAT: + if (_mode == THERMOSTAT_MODE_HEAT || _mode == THERMOSTAT_MODE_AUTO) { + break; + } + log_e("Invalid Thermostat Mode for Cooling Control Sequence of Operation."); + return false; + case THERMOSTAT_SEQ_OP_HEATING: + case THERMOSTAT_SEQ_OP_HEATING_REHEAT: + if (_mode == THERMOSTAT_MODE_COOL || _mode == THERMOSTAT_MODE_AUTO) { + break; + } + log_e("Invalid Thermostat Mode for Heating Control Sequence of Operation."); + return false; + default: + // compiler warning about not handling all enum values + break; + } + } + + // avoid processing if there was no change + if (currentMode == _mode) { + return true; + } + + esp_matter_attr_val_t modeVal = esp_matter_invalid(NULL); + if (!getAttributeVal(Thermostat::Id, Thermostat::Attributes::SystemMode::Id, &modeVal)) { + log_e("Failed to get Thermostat Mode Attribute."); + return false; + } + if (modeVal.val.u8 != _mode) { + modeVal.val.u8 = _mode; + bool ret; + ret = updateAttributeVal(Thermostat::Id, Thermostat::Attributes::SystemMode::Id, &modeVal); + if (!ret) { + log_e("Failed to update Thermostat Mode Attribute."); + return false; + } + currentMode = _mode; + } + log_v("Thermostat Mode set to %d", _mode); + + return true; +} + +bool MatterThermostat::setRawTemperature(int16_t _rawTemperature, uint32_t attribute_id, int16_t *internalValue) { + if (!started) { + log_e("Matter Thermostat device has not begun."); + return false; + } + + // avoid processing if there was no change + if (*internalValue == _rawTemperature) { + return true; + } + + esp_matter_attr_val_t temperatureVal = esp_matter_invalid(NULL); + if (!getAttributeVal(Thermostat::Id, attribute_id, &temperatureVal)) { + log_e("Failed to get Thermostat Temperature or Setpoint Attribute."); + return false; + } + if (temperatureVal.val.i16 != _rawTemperature) { + temperatureVal.val.i16 = _rawTemperature; + bool ret; + ret = updateAttributeVal(Thermostat::Id, attribute_id, &temperatureVal); + if (!ret) { + log_e("Failed to update Thermostat Temperature or Setpoint Attribute."); + return false; + } + *internalValue = _rawTemperature; + } + log_v("Temperature set to %.01fC", (float)_rawTemperature / 100.00); + + return true; +} + +bool MatterThermostat::setCoolingHeatingSetpoints(double _setpointHeatingTemperature, double _setpointCollingTemperature) { + // at least one of the setpoints must be valid + bool settingCooling = _setpointCollingTemperature != (float)0xffff; + bool settingHeating = _setpointHeatingTemperature != (float)0xffff; + if (!settingCooling && !settingHeating) { + log_e("Invalid Setpoints values. Set correctly at least one of them in Celsius."); + return false; + } + int16_t _rawHeatValue = static_cast(_setpointHeatingTemperature * 100.0f); + int16_t _rawCoolValue = static_cast(_setpointCollingTemperature * 100.0f); + + // check limits for the setpoints + if (settingHeating && (_rawHeatValue < kDefaultMinHeatSetpointLimit || _rawHeatValue > kDefaultMaxHeatSetpointLimit)) { + log_e( + "Invalid Heating Setpoint value: %.01fC - valid range %d..%d", _setpointHeatingTemperature, kDefaultMinHeatSetpointLimit / 100, + kDefaultMaxHeatSetpointLimit / 100 + ); + return false; + } + if (settingCooling && (_rawCoolValue < kDefaultMinCoolSetpointLimit || _rawCoolValue > kDefaultMaxCoolSetpointLimit)) { + log_e( + "Invalid Cooling Setpoint value: %.01fC - valid range %d..%d", _setpointCollingTemperature, kDefaultMinCoolSetpointLimit / 100, + kDefaultMaxCoolSetpointLimit / 100 + ); + return false; + } + + // AUTO mode requires both setpoints to be valid to each other and respect the deadband + if (currentMode == THERMOSTAT_MODE_AUTO) { +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_ERROR + float deadband = getDeadBand(); +#endif + // only setting Cooling Setpoint + if (settingCooling && !settingHeating && _rawCoolValue < (heatingSetpointTemperature + (kDefaultDeadBand * 10))) { + log_e( + "AutoMode :: Invalid Cooling Setpoint value: %.01fC - must be higher or equal than %.01fC", _setpointCollingTemperature, getHeatingSetpoint() + deadband + ); + return false; + } + // only setting Heating Setpoint + if (!settingCooling && settingHeating && _rawHeatValue > (coolingSetpointTemperature - (kDefaultDeadBand * 10))) { + log_e( + "AutoMode :: Invalid Heating Setpoint value: %.01fC - must be lower or equal than %.01fC", _setpointHeatingTemperature, getCoolingSetpoint() - deadband + ); + return false; + } + // setting both setpoints + if (settingCooling && settingHeating && (_rawCoolValue <= _rawHeatValue || _rawCoolValue - _rawHeatValue < kDefaultDeadBand * 10.0)) { + log_e( + "AutoMode :: Error - Heating Setpoint %.01fC must be lower than Cooling Setpoint %.01fC with a minimum difference of %0.1fC", + _setpointHeatingTemperature, _setpointCollingTemperature, deadband + ); + return false; + } + } + + bool ret = true; + if (settingCooling) { + ret &= setRawTemperature(_rawCoolValue, Thermostat::Attributes::OccupiedCoolingSetpoint::Id, &coolingSetpointTemperature); + } + if (settingHeating) { + ret &= setRawTemperature(_rawHeatValue, Thermostat::Attributes::OccupiedHeatingSetpoint::Id, &heatingSetpointTemperature); + } + return ret; +} + +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterThermostat.h b/libraries/Matter/src/MatterEndpoints/MatterThermostat.h new file mode 100644 index 00000000000..2d64bdf3b01 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterThermostat.h @@ -0,0 +1,207 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace chip::app::Clusters; + +class MatterThermostat : public MatterEndPoint { +public: + // clang-format off + enum ControlSequenceOfOperation_t { + THERMOSTAT_SEQ_OP_COOLING = (uint8_t) Thermostat::ControlSequenceOfOperationEnum::kCoolingOnly, + THERMOSTAT_SEQ_OP_COOLING_REHEAT = (uint8_t) Thermostat::ControlSequenceOfOperationEnum::kCoolingWithReheat, + THERMOSTAT_SEQ_OP_HEATING = (uint8_t) Thermostat::ControlSequenceOfOperationEnum::kHeatingOnly, + THERMOSTAT_SEQ_OP_HEATING_REHEAT = (uint8_t) Thermostat::ControlSequenceOfOperationEnum::kHeatingWithReheat, + THERMOSTAT_SEQ_OP_COOLING_HEATING = (uint8_t) Thermostat::ControlSequenceOfOperationEnum::kCoolingAndHeating, + THERMOSTAT_SEQ_OP_COOLING_HEATING_REHEAT = (uint8_t) Thermostat::ControlSequenceOfOperationEnum::kCoolingAndHeatingWithReheat, + }; + + enum ThermostatMode_t { + THERMOSTAT_MODE_OFF = (uint8_t) Thermostat::SystemModeEnum::kOff, + THERMOSTAT_MODE_AUTO = (uint8_t) Thermostat::SystemModeEnum::kAuto, + THERMOSTAT_MODE_COOL = (uint8_t) Thermostat::SystemModeEnum::kCool, + THERMOSTAT_MODE_HEAT = (uint8_t) Thermostat::SystemModeEnum::kHeat, + THERMOSTAT_MODE_EMERGENCY_HEAT = (uint8_t) Thermostat::SystemModeEnum::kEmergencyHeat, + THERMOSTAT_MODE_PRECOOLING = (uint8_t) Thermostat::SystemModeEnum::kPrecooling, + THERMOSTAT_MODE_FAN_ONLY = (uint8_t) Thermostat::SystemModeEnum::kFanOnly, + THERMOSTAT_MODE_DRY = (uint8_t) Thermostat::SystemModeEnum::kDry, + THERMOSTAT_MODE_SLEEP = (uint8_t) Thermostat::SystemModeEnum::kSleep + }; + + enum ThermostatAutoMode_t { + THERMOSTAT_AUTO_MODE_DISABLED = (uint8_t) Thermostat::SystemModeEnum::kOff, + THERMOSTAT_AUTO_MODE_ENABLED = (uint8_t) Thermostat::SystemModeEnum::kAuto, + }; + // clang-format on + + MatterThermostat(); + ~MatterThermostat(); + // begin Matter Thermostat endpoint with initial Operation Mode + bool begin(ControlSequenceOfOperation_t controlSequence = THERMOSTAT_SEQ_OP_COOLING, ThermostatAutoMode_t autoMode = THERMOSTAT_AUTO_MODE_DISABLED); + // this will stop processing Thermostat Matter events + void end(); + + // set the Thermostat Mode + bool setMode(ThermostatMode_t mode); + // get the Thermostat Mode + ThermostatMode_t getMode() { + return currentMode; + } + // returns a friendly string for the Fan Mode + static const char *getThermostatModeString(uint8_t mode) { + return thermostatModeString[mode]; + } + + // get the Thermostat Control Sequence of Operation + ControlSequenceOfOperation_t getControlSequence() { + return controlSequence; + } + + // get the minimum heating setpoint in 1/100th of a Celsio degree + float getMinHeatSetpoint() { + return (float)kDefaultMinHeatSetpointLimit / 100.00; + } + // get the maximum heating setpoint in 1/100th of a Celsio degree + float getMaxHeatSetpoint() { + return (float)kDefaultMaxHeatSetpointLimit / 100.00; + } + // get the minimum cooling setpoint in 1/100th of a Celsio degree + float getMinCoolSetpoint() { + return (float)kDefaultMinCoolSetpointLimit / 100.00; + } + // get the maximum cooling setpoint in 1/100th of a Celsio degree + float getMaxCoolSetpoint() { + return (float)kDefaultMaxCoolSetpointLimit / 100.00; + } + // get the deadband in 1/10th of a Celsio degree + float getDeadBand() { + return (float)kDefaultDeadBand / 10.00; + } + + // generic function for setting the cooling and heating setpoints - checks if the setpoints are valid + // it can be used to set both setpoints at the same time or only one of them, by setting the other to (float)0xffff + // Heating Setpoint must be lower than Cooling Setpoint + // When using AUTO mode the Cooling Setpoint must be higher than Heating Setpoint by at least the 2.5C (deadband) + // Thermostat Matter Server will enforce those rules and the Max/Min setpoints limits as in the Matter Specification + bool setCoolingHeatingSetpoints(double _setpointHeatingTemperature, double _setpointCollingTemperature); + + // set the heating setpoint in 1/100th of a Celsio degree + bool setHeatingSetpoint(double _setpointHeatingTemperature) { + return setCoolingHeatingSetpoints((double)0xffff, _setpointHeatingTemperature); + } + // get the heating setpoint in 1/100th of a Celsio degree + double getHeatingSetpoint() { + return heatingSetpointTemperature / 100.0; + } + // set the cooling setpoint in 1/100th of a Celsio degree + bool setCoolingSetpoint(double _setpointCollingTemperature) { + return setCoolingHeatingSetpoints(_setpointCollingTemperature, (double)0xffff); + } + // get the cooling setpoint in 1/100th of a Celsio degree + double getCoolingSetpoint() { + return coolingSetpointTemperature / 100.0; + } + + // set the local Thermostat temperature in Celsio degrees + bool setLocalTemperature(double temperature) { + // stores up to 1/100th of a Celsio degree precision + int16_t rawValue = static_cast(temperature * 100.0f); + return setRawTemperature(rawValue, Thermostat::Attributes::LocalTemperature::Id, &localTemperature); + } + // returns the local Thermostat float temperature with 1/100th of a Celsio degree precision + double getLocalTemperature() { + return (double)localTemperature / 100.0; + } + + // User Callback for whenever the Thermostat Mode is changed by the Matter Controller + using EndPointModeCB = std::function; + void onChangeMode(EndPointModeCB onChangeCB) { + _onChangeModeCB = onChangeCB; + } + + // User Callback for whenever the Local Temperature is changed by the Matter Controller + using EndPointTemperatureCB = std::function; + void onChangeLocalTemperature(EndPointTemperatureCB onChangeCB) { + _onChangeTemperatureCB = onChangeCB; + } + + // User Callback for whenever the Cooling or Heating Setpoint is changed by the Matter Controller + using EndPointCoolingSetpointCB = std::function; + void onChangeCoolingSetpoint(EndPointCoolingSetpointCB onChangeCB) { + _onChangeCoolingSetpointCB = onChangeCB; + } + + // User Callback for whenever the Cooling or Heating Setpoint is changed by the Matter Controller + using EndPointHeatingSetpointCB = std::function; + void onChangeHeatingSetpoint(EndPointHeatingSetpointCB onChangeCB) { + _onChangeHeatingSetpointCB = onChangeCB; + } + + // User Callback for whenever any parameter is changed by the Matter Controller + // Main parameters are Thermostat Mode, Local Temperature, Cooling Setpoint and Heating Setpoint + // Those can be obtained using getMode(), getTemperature(), getCoolingSetpoint() and getHeatingSetpoint() + using EndPointCB = std::function; + void onChange(EndPointCB onChangeCB) { + _onChangeCB = onChangeCB; + } + + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. + bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val); + +protected: + bool started = false; + // implementation keeps temperature in 1/100th of a Celsio degree + int16_t coolingSetpointTemperature = 2400; // 24C cooling setpoint + int16_t localTemperature = 2000; // 20C local temperature + int16_t heatingSetpointTemperature = 1600; // 16C heating setpoint + + ThermostatMode_t currentMode = THERMOSTAT_MODE_OFF; + ControlSequenceOfOperation_t controlSequence = THERMOSTAT_SEQ_OP_COOLING; + ThermostatAutoMode_t autoMode = THERMOSTAT_AUTO_MODE_DISABLED; + + EndPointModeCB _onChangeModeCB = NULL; + EndPointTemperatureCB _onChangeTemperatureCB = NULL; + EndPointCoolingSetpointCB _onChangeCoolingSetpointCB = NULL; + EndPointHeatingSetpointCB _onChangeHeatingSetpointCB = NULL; + EndPointCB _onChangeCB = NULL; + + // internal function to set the raw temperature value (Matter Cluster) + bool setRawTemperature(int16_t _rawTemperature, uint32_t attribute_id, int16_t *internalValue); + + // clang-format off + // Default Thermostat values - can't be changed - defined in the Thermostat Cluster Server code + static const int16_t kDefaultAbsMinHeatSetpointLimit = 700; // 7C (44.5 F) + static const int16_t kDefaultMinHeatSetpointLimit = 700; // 7C (44.5 F) + static const int16_t kDefaultAbsMaxHeatSetpointLimit = 3000; // 30C (86 F) + static const int16_t kDefaultMaxHeatSetpointLimit = 3000; // 30C (86 F) + + static const int16_t kDefaultAbsMinCoolSetpointLimit = 1600; // 16C (61 F) + static const int16_t kDefaultMinCoolSetpointLimit = 1600; // 16C (61 F) + static const int16_t kDefaultAbsMaxCoolSetpointLimit = 3200; // 32C (90 F) + static const int16_t kDefaultMaxCoolSetpointLimit = 3200; // 32C (90 F) + + static const int8_t kDefaultDeadBand = 25; // 2.5C when in AUTO mode + // clang-format on + + // string helper for the THERMOSTAT MODE + static const char *thermostatModeString[5]; +}; +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From 10d0bf8ea74a8c51a34ebb1762a1a9082c7cd0fb Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 7 Jan 2025 12:01:55 +0200 Subject: [PATCH 134/183] ci: Allow push to the component registry from a given git ref (#10757) Co-authored-by: Sergei Silnov Co-authored-by: Rodrigo Garcia --- .github/workflows/upload-idf-component.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upload-idf-component.yml b/.github/workflows/upload-idf-component.yml index 8faddef7e5f..5ce4562c01a 100644 --- a/.github/workflows/upload-idf-component.yml +++ b/.github/workflows/upload-idf-component.yml @@ -4,7 +4,10 @@ on: workflow_dispatch: inputs: tag: - description: 'Tag to push to the component registry' + description: 'Version to push to the component registry' + required: true + git_ref: + description: 'Git ref with the source to push to the component registry' required: true workflow_run: workflows: ["ESP32 Arduino Release"] @@ -44,7 +47,7 @@ jobs: - uses: actions/checkout@v4 with: - ref: ${{ env.RELEASE_TAG }} + ref: ${{ inputs.git_ref || env.RELEASE_TAG }} submodules: "recursive" - name: Upload components to the component registry From 5aaccd8f890ca5448975b08179d4432083958721 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 7 Jan 2025 07:02:30 -0300 Subject: [PATCH 135/183] feat(matter): fixes matter temperature sensor endpoint to indicate celsius as measure unit (#10759) --- .../MatterTemperatureSensor/MatterTemperatureSensor.ino | 6 +++--- .../src/MatterEndpoints/MatterTemperatureSensor.cpp | 2 +- .../Matter/src/MatterEndpoints/MatterTemperatureSensor.h | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino b/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino index e8513f12aaa..a2866e4655e 100644 --- a/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino +++ b/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino @@ -42,7 +42,7 @@ const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s // Simulate a temperature sensor - add your preferred temperature sensor library code here float getSimulatedTemperature() { // The Endpoint implementation keeps an int16_t as internal value information, - // which stores data in 1/100th of any temperature unit + // which stores data in 1/100th Celsius. static float simulatedTempHWSensor = -10.0; // it will increase from -10C to 10C in 0.5C steps to simulate a temperature sensor @@ -70,7 +70,7 @@ void setup() { Serial.println(); // set initial temperature sensor measurement - // Simulated Sensor - it shall initially print -25 degrees and then move to the -10 to 10 range + // Simulated Sensor - it shall initially print -25C and then move to the -10C to 10C range SimulatedTemperatureSensor.begin(-25.00); // Matter beginning - Last step, after all EndPoints are initialized @@ -102,7 +102,7 @@ void loop() { // Print the current temperature value every 5s if (!(timeCounter++ % 10)) { // delaying for 500ms x 10 = 5s // Print the current temperature value - Serial.printf("Current Temperature is %.02f \r\n", SimulatedTemperatureSensor.getTemperature()); + Serial.printf("Current Temperature is %.02fC\r\n", SimulatedTemperatureSensor.getTemperature()); // Update Temperature from the (Simulated) Hardware Sensor // Matter APP shall display the updated temperature percent SimulatedTemperatureSensor.setTemperature(getSimulatedTemperature()); diff --git a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp index 903e6b98d98..863f86386c1 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp @@ -96,7 +96,7 @@ bool MatterTemperatureSensor::setRawTemperature(int16_t _rawTemperature) { } rawTemperature = _rawTemperature; } - log_v("Temperature Sensor set to %.02f Degrees", (float)_rawTemperature / 100.00); + log_v("Temperature Sensor set to %.02fC", (float)_rawTemperature / 100.00); return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h index 27c61fdb978..3be6101166c 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h @@ -23,7 +23,7 @@ class MatterTemperatureSensor : public MatterEndPoint { public: MatterTemperatureSensor(); ~MatterTemperatureSensor(); - // begin Matter Temperature Sensor endpoint with initial float temperature + // begin Matter Temperature Sensor endpoint with initial float temperature in Celsius bool begin(double temperature = 0.00) { return begin(static_cast(temperature * 100.0f)); } @@ -32,11 +32,11 @@ class MatterTemperatureSensor : public MatterEndPoint { // set the reported raw temperature bool setTemperature(double temperature) { - // stores up to 1/100th of a degree precision + // stores up to 1/100th Celsius precision int16_t rawValue = static_cast(temperature * 100.0f); return setRawTemperature(rawValue); } - // returns the reported float temperature with 1/100th of a degree precision + // returns the reported float temperature with 1/100th Celsius precision double getTemperature() { return (double)rawTemperature / 100.0; } @@ -55,7 +55,7 @@ class MatterTemperatureSensor : public MatterEndPoint { protected: bool started = false; - // implementation keeps temperature in 1/100th of a degree, any temperature unit + // implementation keeps temperature in 1/100th Celsius x 100 (int16_t) normalized value int16_t rawTemperature = 0; // internal function to set the raw temperature value (Matter Cluster) bool setRawTemperature(int16_t _rawTemperature); From 9eee1dd559ff66be6e6421472c1618b75318674c Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 7 Jan 2025 07:02:50 -0300 Subject: [PATCH 136/183] ci(dangerjs): Fix and update settings (#10770) --- .github/workflows/dangerjs.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/dangerjs.yml b/.github/workflows/dangerjs.yml index f4bdad3c16e..8fa7b737317 100644 --- a/.github/workflows/dangerjs.yml +++ b/.github/workflows/dangerjs.yml @@ -20,5 +20,8 @@ jobs: uses: espressif/shared-github-dangerjs@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + instructions-cla-link: "https://cla-assistant.io/espressif/arduino-esp32" + instructions-contributions-file: "docs/en/contributing.rst" rule-max-commits: "false" commit-messages-min-summary-length: "10" From 5f44c4ebc5f35a583004b1e45d5c122da95a567c Mon Sep 17 00:00:00 2001 From: Mattia Pennasilico Date: Tue, 7 Jan 2025 11:03:11 +0100 Subject: [PATCH 137/183] fix(client): Restore Arduino Client API (#10776) --- cores/esp32/Client.h | 2 -- libraries/Network/src/NetworkClient.h | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cores/esp32/Client.h b/cores/esp32/Client.h index 4ea10d070fb..ab013612401 100644 --- a/cores/esp32/Client.h +++ b/cores/esp32/Client.h @@ -26,9 +26,7 @@ class Client : public Stream { public: virtual int connect(IPAddress ip, uint16_t port) = 0; - virtual int connect(IPAddress ip, uint16_t port, int32_t timeout) = 0; virtual int connect(const char *host, uint16_t port) = 0; - virtual int connect(const char *host, uint16_t port, int32_t timeout) = 0; virtual size_t write(uint8_t) = 0; virtual size_t write(const uint8_t *buf, size_t size) = 0; virtual int available() = 0; diff --git a/libraries/Network/src/NetworkClient.h b/libraries/Network/src/NetworkClient.h index 1baf8b36139..52df868a0b0 100644 --- a/libraries/Network/src/NetworkClient.h +++ b/libraries/Network/src/NetworkClient.h @@ -29,6 +29,9 @@ class NetworkClientRxBuffer; class ESPLwIPClient : public Client { public: virtual void setConnectionTimeout(uint32_t milliseconds) = 0; + using Client::connect; + virtual int connect(IPAddress ip, uint16_t port, int32_t timeout) = 0; + virtual int connect(const char *host, uint16_t port, int32_t timeout) = 0; }; class NetworkClient : public ESPLwIPClient { From 2cb08193d80149dac3f5edfe4a1b87f6f416ad7c Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 7 Jan 2025 07:03:31 -0300 Subject: [PATCH 138/183] feat(matter): adds esp_matter:: namespace to attribute_t (#10807) * feat(matter): adds esp_matter:: namespace to attribute_t * feat(matter): adds esp_matter:: namespace to attribute_t * feat(matter): adds esp_matter:: namespace to attribute_t * feat(matter): adds esp_matter:: namespace to attribute_t * feat(matter): adds esp_matter:: namespace to attribute_t * feat(matter): adds esp_matter:: namespace to attribute_t --- libraries/Matter/src/MatterEndPoint.h | 8 ++++---- .../Matter/src/MatterEndpoints/MatterColorLight.cpp | 6 +++--- .../MatterEndpoints/MatterColorTemperatureLight.cpp | 10 +++++----- .../Matter/src/MatterEndpoints/MatterDimmableLight.cpp | 6 +++--- .../src/MatterEndpoints/MatterEnhancedColorLight.cpp | 10 +++++----- .../Matter/src/MatterEndpoints/MatterOnOffLight.cpp | 2 +- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/libraries/Matter/src/MatterEndPoint.h b/libraries/Matter/src/MatterEndPoint.h index 6f99aa7cd33..5baa4747d18 100644 --- a/libraries/Matter/src/MatterEndPoint.h +++ b/libraries/Matter/src/MatterEndPoint.h @@ -38,7 +38,7 @@ class MatterEndPoint { } // helper functions for attribute manipulation - attribute_t *getAttribute(uint32_t cluster_id, uint32_t attribute_id) { + esp_matter::attribute_t *getAttribute(uint32_t cluster_id, uint32_t attribute_id) { if (endpoint_id == 0) { log_e("Endpoint ID is not set"); return NULL; @@ -53,7 +53,7 @@ class MatterEndPoint { log_e("Cluster [%d] not found", cluster_id); return NULL; } - attribute_t *attribute = attribute::get(cluster, attribute_id); + esp_matter::attribute_t *attribute = attribute::get(cluster, attribute_id); if (attribute == NULL) { log_e("Attribute [%d] not found", attribute_id); return NULL; @@ -63,7 +63,7 @@ class MatterEndPoint { // get the value of an attribute from its cluster id and attribute it bool getAttributeVal(uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *attrVal) { - attribute_t *attribute = getAttribute(cluster_id, attribute_id); + esp_matter::attribute_t *attribute = getAttribute(cluster_id, attribute_id); if (attribute == NULL) { return false; } @@ -77,7 +77,7 @@ class MatterEndPoint { // set the value of an attribute from its cluster id and attribute it bool setAttributeVal(uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *attrVal) { - attribute_t *attribute = getAttribute(cluster_id, attribute_id); + esp_matter::attribute_t *attribute = getAttribute(cluster_id, attribute_id); if (attribute == NULL) { return false; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp index eaaf0bf2ffe..39d79e86325 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp @@ -194,7 +194,7 @@ bool MatterColorLight::begin(bool initialState, espHsvColor_t _colorHSV) { /* Mark deferred persistence for some attributes that might be changed rapidly */ cluster_t *level_control_cluster = cluster::get(endpoint, LevelControl::Id); - attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id); + esp_matter::attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id); attribute::set_deferred_persistence(current_level_attribute); started = true; @@ -220,7 +220,7 @@ bool MatterColorLight::setOnOff(bool newState) { endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); cluster_t *cluster = cluster::get(endpoint, OnOff::Id); - attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id); + esp_matter::attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id); esp_matter_attr_val_t val = esp_matter_invalid(NULL); attribute::get_val(attribute, &val); @@ -271,7 +271,7 @@ bool MatterColorLight::setColorHSV(espHsvColor_t _hsvColor) { endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); cluster_t *cluster = cluster::get(endpoint, ColorControl::Id); // update hue - attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::CurrentHue::Id); + esp_matter::attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::CurrentHue::Id); esp_matter_attr_val_t val = esp_matter_invalid(NULL); attribute::get_val(attribute, &val); if (val.val.u8 != colorHSV.h) { diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp index 5ef69749bb1..3c4fccfa046 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp @@ -122,11 +122,11 @@ bool MatterColorTemperatureLight::begin(bool initialState, uint8_t brightness, u /* Mark deferred persistence for some attributes that might be changed rapidly */ cluster_t *level_control_cluster = cluster::get(endpoint, LevelControl::Id); - attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id); + esp_matter::attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id); attribute::set_deferred_persistence(current_level_attribute); cluster_t *color_control_cluster = cluster::get(endpoint, ColorControl::Id); - attribute_t *color_temp_attribute = attribute::get(color_control_cluster, ColorControl::Attributes::ColorTemperatureMireds::Id); + esp_matter::attribute_t *color_temp_attribute = attribute::get(color_control_cluster, ColorControl::Attributes::ColorTemperatureMireds::Id); attribute::set_deferred_persistence(color_temp_attribute); started = true; @@ -152,7 +152,7 @@ bool MatterColorTemperatureLight::setOnOff(bool newState) { endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); cluster_t *cluster = cluster::get(endpoint, OnOff::Id); - attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id); + esp_matter::attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id); esp_matter_attr_val_t val = esp_matter_invalid(NULL); attribute::get_val(attribute, &val); @@ -193,7 +193,7 @@ bool MatterColorTemperatureLight::setBrightness(uint8_t newBrightness) { endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); cluster_t *cluster = cluster::get(endpoint, LevelControl::Id); - attribute_t *attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id); + esp_matter::attribute_t *attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id); esp_matter_attr_val_t val = esp_matter_invalid(NULL); attribute::get_val(attribute, &val); @@ -224,7 +224,7 @@ bool MatterColorTemperatureLight::setColorTemperature(uint16_t newTemperature) { endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); cluster_t *cluster = cluster::get(endpoint, ColorControl::Id); - attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::ColorTemperatureMireds::Id); + esp_matter::attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::ColorTemperatureMireds::Id); esp_matter_attr_val_t val = esp_matter_invalid(NULL); attribute::get_val(attribute, &val); diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp index 9f6f872ca3e..5167cf1f21c 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp @@ -101,7 +101,7 @@ bool MatterDimmableLight::begin(bool initialState, uint8_t brightness) { /* Mark deferred persistence for some attributes that might be changed rapidly */ cluster_t *level_control_cluster = cluster::get(endpoint, LevelControl::Id); - attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id); + esp_matter::attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id); attribute::set_deferred_persistence(current_level_attribute); started = true; @@ -127,7 +127,7 @@ bool MatterDimmableLight::setOnOff(bool newState) { endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); cluster_t *cluster = cluster::get(endpoint, OnOff::Id); - attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id); + esp_matter::attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id); esp_matter_attr_val_t val = esp_matter_invalid(NULL); attribute::get_val(attribute, &val); @@ -168,7 +168,7 @@ bool MatterDimmableLight::setBrightness(uint8_t newBrightness) { endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); cluster_t *cluster = cluster::get(endpoint, LevelControl::Id); - attribute_t *attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id); + esp_matter::attribute_t *attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id); esp_matter_attr_val_t val = esp_matter_invalid(NULL); attribute::get_val(attribute, &val); diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp index 022e62654df..9b245fb9408 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp @@ -214,7 +214,7 @@ bool MatterEnhancedColorLight::begin(bool initialState, espHsvColor_t _colorHSV, /* Mark deferred persistence for some attributes that might be changed rapidly */ cluster_t *level_control_cluster = cluster::get(endpoint, LevelControl::Id); - attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id); + esp_matter::attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id); attribute::set_deferred_persistence(current_level_attribute); started = true; @@ -240,7 +240,7 @@ bool MatterEnhancedColorLight::setOnOff(bool newState) { endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); cluster_t *cluster = cluster::get(endpoint, OnOff::Id); - attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id); + esp_matter::attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id); esp_matter_attr_val_t val = esp_matter_invalid(NULL); attribute::get_val(attribute, &val); @@ -281,7 +281,7 @@ bool MatterEnhancedColorLight::setBrightness(uint8_t newBrightness) { endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); cluster_t *cluster = cluster::get(endpoint, LevelControl::Id); - attribute_t *attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id); + esp_matter::attribute_t *attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id); esp_matter_attr_val_t val = esp_matter_invalid(NULL); attribute::get_val(attribute, &val); @@ -312,7 +312,7 @@ bool MatterEnhancedColorLight::setColorTemperature(uint16_t newTemperature) { endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); cluster_t *cluster = cluster::get(endpoint, ColorControl::Id); - attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::ColorTemperatureMireds::Id); + esp_matter::attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::ColorTemperatureMireds::Id); esp_matter_attr_val_t val = esp_matter_invalid(NULL); attribute::get_val(attribute, &val); @@ -353,7 +353,7 @@ bool MatterEnhancedColorLight::setColorHSV(espHsvColor_t _hsvColor) { endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); cluster_t *cluster = cluster::get(endpoint, ColorControl::Id); // update hue - attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::CurrentHue::Id); + esp_matter::attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::CurrentHue::Id); esp_matter_attr_val_t val = esp_matter_invalid(NULL); attribute::get_val(attribute, &val); if (val.val.u8 != colorHSV.h) { diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp index 3faba821528..f400390f9a7 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp @@ -108,7 +108,7 @@ bool MatterOnOffLight::setOnOff(bool newState) { endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); cluster_t *cluster = cluster::get(endpoint, OnOff::Id); - attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id); + esp_matter::attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id); esp_matter_attr_val_t val = esp_matter_invalid(NULL); attribute::get_val(attribute, &val); From ed9a5d876d4da63fd9223b1d4280678dee91c977 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 7 Jan 2025 12:03:55 +0200 Subject: [PATCH 139/183] fix(udp): Add missing LwIP locks to init multicast (#10813) * fix(udp): Add missing LwIP locks to init multicast * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- libraries/AsyncUDP/src/AsyncUDP.cpp | 32 ++++++++++++++++++----------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/libraries/AsyncUDP/src/AsyncUDP.cpp b/libraries/AsyncUDP/src/AsyncUDP.cpp index 48714bce5c5..f44cc839c97 100644 --- a/libraries/AsyncUDP/src/AsyncUDP.cpp +++ b/libraries/AsyncUDP/src/AsyncUDP.cpp @@ -601,76 +601,84 @@ static esp_err_t joinMulticastGroup(const ip_addr_t *addr, bool join, tcpip_adap return ESP_ERR_INVALID_ARG; } netif = (struct netif *)nif; + UDP_MUTEX_LOCK(); #if CONFIG_LWIP_IPV6 if (addr->type == IPADDR_TYPE_V4) { if (join) { if (igmp_joingroup_netif(netif, (const ip4_addr *)&(addr->u_addr.ip4))) { - return ESP_ERR_INVALID_STATE; + goto igmp_fail; } } else { if (igmp_leavegroup_netif(netif, (const ip4_addr *)&(addr->u_addr.ip4))) { - return ESP_ERR_INVALID_STATE; + goto igmp_fail; } } } else { if (join) { if (mld6_joingroup_netif(netif, &(addr->u_addr.ip6))) { - return ESP_ERR_INVALID_STATE; + goto igmp_fail; } } else { if (mld6_leavegroup_netif(netif, &(addr->u_addr.ip6))) { - return ESP_ERR_INVALID_STATE; + goto igmp_fail; } } } #else if (join) { if (igmp_joingroup_netif(netif, (const ip4_addr *)(addr))) { - return ESP_ERR_INVALID_STATE; + goto igmp_fail; } } else { if (igmp_leavegroup_netif(netif, (const ip4_addr *)(addr))) { - return ESP_ERR_INVALID_STATE; + goto igmp_fail; } } #endif + UDP_MUTEX_UNLOCK(); } else { + UDP_MUTEX_LOCK(); #if CONFIG_LWIP_IPV6 if (addr->type == IPADDR_TYPE_V4) { if (join) { if (igmp_joingroup((const ip4_addr *)IP4_ADDR_ANY, (const ip4_addr *)&(addr->u_addr.ip4))) { - return ESP_ERR_INVALID_STATE; + goto igmp_fail; } } else { if (igmp_leavegroup((const ip4_addr *)IP4_ADDR_ANY, (const ip4_addr *)&(addr->u_addr.ip4))) { - return ESP_ERR_INVALID_STATE; + goto igmp_fail; } } } else { if (join) { if (mld6_joingroup((const ip6_addr *)IP6_ADDR_ANY, &(addr->u_addr.ip6))) { - return ESP_ERR_INVALID_STATE; + goto igmp_fail; } } else { if (mld6_leavegroup((const ip6_addr *)IP6_ADDR_ANY, &(addr->u_addr.ip6))) { - return ESP_ERR_INVALID_STATE; + goto igmp_fail; } } } #else if (join) { if (igmp_joingroup((const ip4_addr *)IP4_ADDR_ANY, (const ip4_addr *)(addr))) { - return ESP_ERR_INVALID_STATE; + goto igmp_fail; } } else { if (igmp_leavegroup((const ip4_addr *)IP4_ADDR_ANY, (const ip4_addr *)(addr))) { - return ESP_ERR_INVALID_STATE; + goto igmp_fail; } } #endif + UDP_MUTEX_UNLOCK(); } return ESP_OK; + +igmp_fail: + UDP_MUTEX_UNLOCK(); + return ESP_ERR_INVALID_STATE; } bool AsyncUDP::listenMulticast(const ip_addr_t *addr, uint16_t port, uint8_t ttl, tcpip_adapter_if_t tcpip_if) { From 30b97d1f9194da098d01548cb24d3c1af481e48f Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 7 Jan 2025 12:04:20 +0200 Subject: [PATCH 140/183] fix(camera): Update resolutions and remove face detection (#10814) * fix(camera): Update resolutions and remove face detection * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../Camera/CameraWebServer/camera_index.h | 1903 ++++++++--------- 1 file changed, 938 insertions(+), 965 deletions(-) diff --git a/libraries/ESP32/examples/Camera/CameraWebServer/camera_index.h b/libraries/ESP32/examples/Camera/CameraWebServer/camera_index.h index 040f1ec5267..07e2d661821 100644 --- a/libraries/ESP32/examples/Camera/CameraWebServer/camera_index.h +++ b/libraries/ESP32/examples/Camera/CameraWebServer/camera_index.h @@ -1,971 +1,944 @@ - -//File: index_ov2640.html.gz, Size: 6787 -#define index_ov2640_html_gz_len 6787 -const uint8_t index_ov2640_html_gz[] = { - 0x1F, 0x8B, 0x08, 0x08, 0x23, 0xFC, 0x69, 0x5E, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x5F, 0x6F, 0x76, 0x32, 0x36, 0x34, 0x30, 0x2E, 0x68, 0x74, 0x6D, - 0x6C, 0x00, 0xED, 0x3D, 0x6B, 0x73, 0xDB, 0x46, 0x92, 0xDF, 0xFD, 0x2B, 0x60, 0x24, 0x6B, 0x92, 0x25, 0x92, 0x22, 0x29, 0x4A, 0x96, 0x15, 0x89, 0x3E, 0x5B, - 0x96, 0x1F, 0xB5, 0x76, 0xE2, 0xB5, 0x12, 0xC7, 0x5B, 0xA9, 0x2D, 0x07, 0x04, 0x86, 0x24, 0x62, 0x10, 0xE0, 0x02, 0xA0, 0x48, 0x26, 0xA5, 0xDF, 0x71, 0x3F, - 0xE8, 0xFE, 0xD8, 0x75, 0xCF, 0x03, 0x18, 0x00, 0x83, 0x07, 0x49, 0x89, 0xF4, 0xFA, 0x8E, 0x4E, 0x45, 0x78, 0x4C, 0xF7, 0xF4, 0xBB, 0x7B, 0x66, 0x30, 0xC0, - 0xF9, 0x43, 0xCB, 0x33, 0xC3, 0xD5, 0x8C, 0x68, 0x93, 0x70, 0xEA, 0x0C, 0x1E, 0x9C, 0xB3, 0x3F, 0x1A, 0xFC, 0xCE, 0x27, 0xC4, 0xB0, 0xD8, 0x21, 0x3D, 0x9D, - 0x92, 0xD0, 0xD0, 0xCC, 0x89, 0xE1, 0x07, 0x24, 0xBC, 0xD0, 0xE7, 0xE1, 0xA8, 0x75, 0xAA, 0xA7, 0x6F, 0xBB, 0xC6, 0x94, 0x5C, 0xE8, 0x37, 0x36, 0x59, 0xCC, - 0x3C, 0x3F, 0xD4, 0x35, 0xD3, 0x73, 0x43, 0xE2, 0x42, 0xF3, 0x85, 0x6D, 0x85, 0x93, 0x0B, 0x8B, 0xDC, 0xD8, 0x26, 0x69, 0xD1, 0x93, 0xA6, 0xED, 0xDA, 0xA1, - 0x6D, 0x38, 0xAD, 0xC0, 0x34, 0x1C, 0x72, 0xD1, 0x95, 0x71, 0x85, 0x76, 0xE8, 0x90, 0xC1, 0xD5, 0xF5, 0xFB, 0xA3, 0x9E, 0xF6, 0xD3, 0xC7, 0x5E, 0xFF, 0xA4, - 0x73, 0x7E, 0xC8, 0xAE, 0xC5, 0x6D, 0x82, 0x70, 0x25, 0x9F, 0xE3, 0x6F, 0xE8, 0x59, 0x2B, 0xED, 0xAF, 0xC4, 0x25, 0xFC, 0x8D, 0x80, 0x88, 0xD6, 0xC8, 0x98, - 0xDA, 0xCE, 0xEA, 0x4C, 0x7B, 0xE6, 0x43, 0x9F, 0xCD, 0xD7, 0xC4, 0xB9, 0x21, 0xA1, 0x6D, 0x1A, 0xCD, 0xC0, 0x70, 0x83, 0x56, 0x40, 0x7C, 0x7B, 0xF4, 0x43, - 0x06, 0x70, 0x68, 0x98, 0x5F, 0xC6, 0xBE, 0x37, 0x77, 0xAD, 0x33, 0xED, 0xBB, 0xEE, 0x29, 0xFE, 0xCB, 0x36, 0x32, 0x3D, 0xC7, 0xF3, 0xE1, 0xFE, 0xD5, 0x4B, - 0xFC, 0x97, 0xBD, 0x4F, 0x7B, 0x0F, 0xEC, 0x3F, 0xC9, 0x99, 0xD6, 0x3D, 0x99, 0x2D, 0x13, 0xF7, 0x6F, 0x1F, 0x24, 0x4E, 0x27, 0xBD, 0x3C, 0xEA, 0x39, 0xFC, - 0x69, 0x31, 0x7C, 0x40, 0xCC, 0xD0, 0xF6, 0xDC, 0xF6, 0xD4, 0xB0, 0x5D, 0x05, 0x26, 0xCB, 0x0E, 0x66, 0x8E, 0x01, 0x32, 0x18, 0x39, 0xA4, 0x10, 0xCF, 0x77, - 0x53, 0xE2, 0xCE, 0x9B, 0x25, 0xD8, 0x10, 0x49, 0xCB, 0xB2, 0x7D, 0xD6, 0xEA, 0x0C, 0xE5, 0x30, 0x9F, 0xBA, 0xA5, 0x68, 0x8B, 0xE8, 0x72, 0x3D, 0x97, 0x28, - 0x04, 0x88, 0x1D, 0x2D, 0x7C, 0x63, 0x86, 0x0D, 0xF0, 0x6F, 0xB6, 0xC9, 0xD4, 0x76, 0x99, 0x51, 0x9D, 0x69, 0x47, 0xFD, 0xCE, 0x6C, 0x59, 0xA2, 0xCA, 0xA3, - 0x13, 0xFC, 0x97, 0x6D, 0x34, 0x33, 0x2C, 0xCB, 0x76, 0xC7, 0x67, 0xDA, 0xA9, 0x12, 0x85, 0xE7, 0x5B, 0xC4, 0x6F, 0xF9, 0x86, 0x65, 0xCF, 0x83, 0x33, 0xAD, - 0xAF, 0x6A, 0x33, 0x35, 0xFC, 0x31, 0xD0, 0x12, 0x7A, 0x40, 0x6C, 0xAB, 0xAB, 0xA4, 0x84, 0x37, 0xF1, 0xED, 0xF1, 0x24, 0x04, 0x95, 0x66, 0xDA, 0xA4, 0x85, - 0xC6, 0x5D, 0xA8, 0x4C, 0x9F, 0x85, 0x72, 0x53, 0x4B, 0xCD, 0x70, 0xEC, 0xB1, 0xDB, 0xB2, 0x43, 0x32, 0x05, 0x76, 0x82, 0xD0, 0x27, 0xA1, 0x39, 0x29, 0x22, - 0x65, 0x64, 0x8F, 0xE7, 0x3E, 0x51, 0x10, 0x12, 0xC9, 0xAD, 0x80, 0x61, 0xB8, 0x99, 0xBD, 0xD5, 0x5A, 0x90, 0xE1, 0x17, 0x3B, 0x6C, 0x71, 0x99, 0x0C, 0xC9, - 0xC8, 0xF3, 0x89, 0xB2, 0xA5, 0x68, 0xE1, 0x78, 0xE6, 0x97, 0x56, 0x10, 0x1A, 0x7E, 0x58, 0x05, 0xA1, 0x31, 0x0A, 0x89, 0x5F, 0x8E, 0x8F, 0xA0, 0x55, 0x94, - 0x63, 0xCB, 0xEF, 0x96, 0x37, 0xB0, 0x5D, 0xC7, 0x76, 0x49, 0x75, 0xF2, 0xF2, 0xFA, 0x4D, 0xA2, 0x63, 0xAD, 0x2A, 0x28, 0xC6, 0x9E, 0x8E, 0x8B, 0xAC, 0x84, - 0xF2, 0x9A, 0xED, 0x8C, 0xFB, 0x4D, 0xB7, 0xD3, 0xF9, 0x5B, 0xF6, 0xE6, 0x84, 0x30, 0x33, 0x35, 0xE6, 0xA1, 0xB7, 0xBD, 0x47, 0x64, 0xDC, 0x2A, 0xC5, 0xC7, - 0x7F, 0x4D, 0x89, 0x65, 0x1B, 0x5A, 0x5D, 0x72, 0xE7, 0xD3, 0x0E, 0xD8, 0x54, 0x43, 0x33, 0x5C, 0x4B, 0xAB, 0x7B, 0xBE, 0x0D, 0x8E, 0x60, 0xD0, 0x70, 0xE3, - 0xC0, 0x15, 0x48, 0x1C, 0x33, 0xD2, 0x50, 0xB0, 0x5C, 0xE0, 0x33, 0xB2, 0x44, 0xD4, 0x6E, 0x83, 0xBF, 0x0A, 0x21, 0x07, 0x7F, 0xA5, 0x0E, 0xA4, 0xE0, 0x91, - 0xA2, 0x2F, 0xD2, 0x97, 0x4C, 0x61, 0x9E, 0xCE, 0xF0, 0x37, 0x35, 0x96, 0xAD, 0x42, 0xDD, 0x89, 0x46, 0x42, 0x87, 0x90, 0x66, 0xCD, 0x3A, 0x34, 0xBD, 0x99, - 0x68, 0x2D, 0x0D, 0xA3, 0x64, 0x43, 0x0D, 0xC3, 0x91, 0xAA, 0x55, 0x8E, 0x3F, 0xD9, 0x28, 0xD6, 0x60, 0x57, 0xCD, 0x6A, 0x1C, 0x3B, 0xD8, 0x3F, 0x95, 0x0D, - 0x31, 0x4E, 0x72, 0xA3, 0x08, 0xFE, 0xAA, 0x47, 0x92, 0x18, 0x59, 0x69, 0x34, 0x51, 0x20, 0xCE, 0x8F, 0x28, 0x19, 0xBC, 0x79, 0xDE, 0xAD, 0xC0, 0x5A, 0x4C, - 0x42, 0xD5, 0xE8, 0xA2, 0x40, 0x5C, 0x44, 0x43, 0x69, 0x94, 0xC1, 0xDF, 0x6D, 0x85, 0x7A, 0xE3, 0xBB, 0xE1, 0x3C, 0x0C, 0x3D, 0x37, 0xD8, 0x2A, 0x45, 0xE5, - 0xF9, 0xD9, 0x1F, 0xF3, 0x20, 0xB4, 0x47, 0xAB, 0x16, 0x77, 0x69, 0xF0, 0xB3, 0x99, 0x01, 0x25, 0xE4, 0x90, 0x84, 0x0B, 0x42, 0x8A, 0xCB, 0x0D, 0xD7, 0xB8, - 0x81, 0xB8, 0x33, 0x1E, 0x3B, 0x2A, 0xDB, 0x33, 0xE7, 0x7E, 0x80, 0x75, 0xDB, 0xCC, 0xB3, 0x01, 0xB1, 0x9F, 0xED, 0x38, 0xE9, 0x83, 0x15, 0x3B, 0x6A, 0x99, - 0x43, 0x45, 0x5F, 0xDE, 0x3C, 0x44, 0x19, 0x2B, 0x35, 0xE1, 0x01, 0x3B, 0x76, 0xB8, 0x52, 0xDE, 0xE3, 0x9E, 0xA8, 0xB8, 0x23, 0x5C, 0xB0, 0x30, 0x2D, 0x24, - 0xE9, 0x3A, 0x33, 0x27, 0xC4, 0xFC, 0x42, 0xAC, 0x83, 0xD2, 0x32, 0xAC, 0xAC, 0x3C, 0x6C, 0xDB, 0xEE, 0x6C, 0x1E, 0xB6, 0xB0, 0x9C, 0x9A, 0xDD, 0x8B, 0xCE, - 0xA9, 0x41, 0x0A, 0x16, 0x7B, 0xBD, 0xA2, 0xA2, 0xE2, 0x78, 0xB6, 0x2C, 0x16, 0x82, 0x4C, 0xEC, 0xC0, 0x31, 0x86, 0xC4, 0x29, 0x22, 0x99, 0x3B, 0x43, 0x4E, - 0xD8, 0xE5, 0xB1, 0x2A, 0xBF, 0x76, 0xA3, 0x94, 0xC5, 0xC9, 0xAB, 0xFF, 0xF8, 0x6F, 0x95, 0xE5, 0x48, 0x8F, 0x9B, 0x89, 0x4B, 0x01, 0x71, 0xC0, 0xC1, 0xF2, - 0x4A, 0x6F, 0x68, 0xB3, 0x00, 0x1A, 0x0A, 0x3B, 0xF0, 0x0D, 0x77, 0x4C, 0x20, 0x16, 0x2C, 0x9B, 0xE2, 0xB0, 0x78, 0x60, 0x50, 0x89, 0x7D, 0x0C, 0xD5, 0xC7, - 0xC5, 0x03, 0x11, 0x16, 0x10, 0x9A, 0x5A, 0x9B, 0x1D, 0x6C, 0x50, 0x95, 0x48, 0xFA, 0x2D, 0x24, 0xA4, 0xAB, 0xB4, 0x0E, 0x56, 0x98, 0x28, 0x3D, 0x27, 0x69, - 0x5B, 0xCA, 0x42, 0xBF, 0x34, 0x34, 0x88, 0x21, 0xDF, 0x68, 0x54, 0x36, 0x68, 0x1C, 0x8D, 0x8E, 0x3A, 0x47, 0xFD, 0xD2, 0xCA, 0x49, 0xC9, 0x65, 0x6A, 0xE0, - 0xA8, 0x08, 0x1D, 0x51, 0x58, 0x29, 0x34, 0x82, 0xC0, 0xB8, 0x51, 0x16, 0xED, 0x5E, 0x60, 0xB3, 0x91, 0x9B, 0x31, 0x0C, 0x60, 0xEC, 0x16, 0x2A, 0x86, 0x5E, - 0xDC, 0xD0, 0x7B, 0x4A, 0xFA, 0x68, 0x49, 0xA7, 0x74, 0x01, 0x21, 0x5E, 0x35, 0xD9, 0x09, 0x0D, 0xA8, 0x9B, 0x48, 0x0A, 0x56, 0x16, 0x95, 0x21, 0x59, 0x86, - 0x2D, 0x8B, 0x98, 0x9E, 0xCF, 0xAA, 0xC1, 0x9C, 0x91, 0x63, 0x4A, 0x91, 0xE5, 0x16, 0x7B, 0x36, 0xF1, 0x6E, 0x88, 0xAF, 0x10, 0x56, 0x4A, 0xA9, 0xFD, 0x27, - 0x7D, 0xAB, 0x02, 0x36, 0x03, 0xD2, 0xA3, 0x52, 0xF6, 0x49, 0x74, 0xBD, 0xAE, 0xD9, 0x2B, 0xF4, 0x63, 0x86, 0xAE, 0x0D, 0x3E, 0x63, 0x0C, 0x1D, 0x62, 0x15, - 0x64, 0x33, 0x8B, 0x8C, 0x8C, 0xB9, 0x13, 0x96, 0x58, 0xA5, 0xD1, 0xC1, 0x7F, 0x45, 0x3D, 0xD2, 0x30, 0xF4, 0x1B, 0xCE, 0x0B, 0x5D, 0xD0, 0xC0, 0xF1, 0x2F, - 0x45, 0x9F, 0xA2, 0xD4, 0x30, 0x66, 0x33, 0x62, 0x40, 0x2B, 0x93, 0xE4, 0xE9, 0xA1, 0xD2, 0x10, 0x43, 0x1D, 0xE7, 0x2B, 0x8D, 0xDB, 0x4B, 0x1D, 0x36, 0x2A, - 0x1E, 0xD7, 0xE2, 0xF9, 0x6C, 0xE4, 0x99, 0x73, 0x55, 0x55, 0x53, 0xCD, 0xF1, 0xB2, 0xF8, 0xCE, 0x84, 0xC8, 0x02, 0xC7, 0xA6, 0xEE, 0x3F, 0x77, 0x5D, 0xD4, - 0x68, 0x2B, 0xF4, 0x81, 0x4D, 0x45, 0x47, 0xD5, 0x04, 0xB7, 0x51, 0x0C, 0x4B, 0x08, 0x36, 0x6F, 0xEE, 0x2A, 0x15, 0xA6, 0x14, 0xE1, 0x34, 0x8A, 0xB4, 0x1A, - 0xC4, 0x10, 0xDB, 0x12, 0xA8, 0xB6, 0x93, 0x4B, 0x38, 0x99, 0x4F, 0x55, 0x75, 0x94, 0xE8, 0xAC, 0x0B, 0x49, 0x9F, 0x75, 0xE7, 0x8F, 0x87, 0x46, 0xBD, 0xD3, - 0xEC, 0x34, 0x8F, 0xE0, 0x7F, 0x8A, 0xF1, 0x4C, 0xB1, 0x71, 0x71, 0xF1, 0xE6, 0x58, 0x5E, 0x2A, 0x44, 0x97, 0x4F, 0x2B, 0xE5, 0x05, 0xFB, 0x52, 0x5D, 0x54, - 0xF7, 0xA4, 0xE4, 0xFC, 0x52, 0xB7, 0x5D, 0x92, 0x87, 0x73, 0x4C, 0x7A, 0x7D, 0x43, 0x54, 0x58, 0xCB, 0xBA, 0x2A, 0x9E, 0x7A, 0x7F, 0xB6, 0x58, 0x11, 0xF2, - 0x7F, 0xDE, 0xDA, 0x25, 0x51, 0x7C, 0xD3, 0x96, 0xBE, 0xB6, 0x5C, 0x82, 0x7D, 0xDB, 0x46, 0x27, 0x5F, 0xEB, 0x2D, 0x5E, 0xF5, 0x01, 0x85, 0x2E, 0x8C, 0x41, - 0x7D, 0x18, 0x8C, 0xE6, 0x56, 0x86, 0x52, 0x9B, 0x0D, 0x64, 0x30, 0xB2, 0x1D, 0xA7, 0xE5, 0x78, 0x8B, 0xF2, 0x4A, 0xA4, 0xD8, 0x92, 0x33, 0x76, 0x5A, 0x6E, - 0xF2, 0x9B, 0x52, 0x3B, 0x87, 0xC8, 0xF5, 0x1F, 0x41, 0xED, 0xB7, 0xED, 0x70, 0x85, 0xAE, 0xB1, 0x59, 0xA2, 0xD8, 0xC0, 0x1E, 0xB7, 0xEB, 0xA8, 0x92, 0x29, - 0xB1, 0x4A, 0xB0, 0x78, 0xD8, 0xB3, 0xB0, 0x43, 0x73, 0xB2, 0xC1, 0xD0, 0x33, 0x1E, 0x18, 0xF9, 0xC4, 0x31, 0xB0, 0x82, 0xDF, 0x68, 0x86, 0xA2, 0x74, 0xF8, - 0x26, 0x83, 0x57, 0xE1, 0x84, 0x8A, 0xEE, 0xEB, 0x99, 0x5D, 0x6A, 0xB3, 0xDA, 0x21, 0x3F, 0x56, 0xAB, 0xCD, 0xBA, 0xA4, 0xDC, 0x4F, 0x7A, 0x86, 0xBA, 0xD1, - 0x1A, 0x11, 0x5D, 0x04, 0xED, 0xB1, 0x4F, 0x56, 0x15, 0x98, 0x69, 0xF2, 0xBF, 0x67, 0x6C, 0xFE, 0x78, 0xF3, 0xA9, 0x12, 0x9A, 0x00, 0xB8, 0x15, 0xB5, 0xFB, - 0x41, 0x85, 0xAE, 0xF3, 0xBB, 0xAC, 0x62, 0x8F, 0xD1, 0xEC, 0xA8, 0xAE, 0x57, 0x08, 0x37, 0x05, 0x29, 0x54, 0x6D, 0xAA, 0x22, 0xFB, 0xAA, 0xC7, 0xF3, 0x64, - 0x14, 0xE6, 0x2C, 0xFE, 0xD0, 0x3A, 0xF5, 0xA8, 0x38, 0xBA, 0xB5, 0xA4, 0xD9, 0x94, 0xD2, 0xC8, 0x11, 0x4D, 0x62, 0xE6, 0x5B, 0x9F, 0x12, 0x33, 0x46, 0xCF, - 0xB5, 0x91, 0xE7, 0xAB, 0x44, 0x94, 0xCF, 0x54, 0xCD, 0xD0, 0x66, 0xCA, 0x53, 0x3E, 0xA8, 0x87, 0x7C, 0xAA, 0xF7, 0x4E, 0x94, 0x6B, 0x2B, 0x05, 0x8D, 0x8B, - 0x48, 0xCB, 0x9D, 0x05, 0xCC, 0xA6, 0xAC, 0xDC, 0x01, 0xB2, 0x1C, 0x8B, 0x94, 0x8A, 0x2A, 0xF6, 0xCA, 0xA2, 0x08, 0x93, 0x9D, 0xC9, 0x2A, 0x34, 0x76, 0x7B, - 0x6A, 0x40, 0xD9, 0x8B, 0xE6, 0x6A, 0x00, 0x46, 0x95, 0xFE, 0xAA, 0x98, 0xBB, 0x34, 0xC7, 0xDA, 0x3D, 0xE9, 0x94, 0x74, 0x69, 0x3A, 0x5E, 0xB0, 0xE5, 0x04, - 0x58, 0xFE, 0xFC, 0x97, 0xF2, 0x4E, 0xA5, 0xD4, 0x5D, 0xE8, 0x53, 0xC5, 0xEE, 0x98, 0x92, 0x79, 0xB7, 0xA3, 0x8C, 0xB4, 0x85, 0xB3, 0x94, 0x74, 0x06, 0x8D, - 0xAE, 0x5F, 0x9E, 0x69, 0x26, 0x51, 0x87, 0xD1, 0xE4, 0x44, 0x5D, 0x95, 0xA9, 0xD2, 0x42, 0x3D, 0x4C, 0x6C, 0xCB, 0x22, 0x85, 0x73, 0xC1, 0x38, 0xE6, 0xAD, - 0x58, 0x3C, 0x20, 0xFD, 0xAA, 0x49, 0xA9, 0x7B, 0x71, 0x8A, 0xC2, 0xC7, 0x1A, 0xBA, 0xF7, 0xED, 0x31, 0x3C, 0xD1, 0xE4, 0xCD, 0xA4, 0x27, 0x4B, 0x91, 0x42, - 0x52, 0x95, 0xCE, 0x1D, 0xCD, 0xB5, 0xA2, 0xC8, 0x40, 0x0E, 0xD8, 0x2A, 0x1B, 0xCD, 0x53, 0x54, 0xD1, 0x85, 0x94, 0x36, 0x5F, 0x5B, 0xE2, 0xCB, 0x80, 0xAD, - 0xBC, 0xD5, 0x95, 0x3B, 0x5C, 0x6A, 0xA3, 0x16, 0x90, 0xEE, 0x37, 0x57, 0x34, 0x7B, 0xAA, 0x8C, 0x0A, 0x88, 0x8C, 0x52, 0x8C, 0x78, 0xB8, 0x2A, 0xD9, 0x6A, - 0x53, 0xE7, 0x38, 0x3F, 0x94, 0x9E, 0x86, 0x3B, 0x3F, 0x8C, 0x1F, 0xDC, 0x3B, 0xC7, 0x47, 0xE2, 0xE4, 0x87, 0xE6, 0x78, 0x3F, 0xA6, 0x63, 0x04, 0xC1, 0x85, - 0x8E, 0x8F, 0x76, 0xE9, 0xC9, 0x67, 0xE8, 0xCE, 0x2D, 0xFB, 0x46, 0xB3, 0xAD, 0x0B, 0xDD, 0xF1, 0xC6, 0x5E, 0xEA, 0x1E, 0xBD, 0xCF, 0xB4, 0x0C, 0x79, 0xEC, - 0x42, 0x4F, 0xAC, 0x2F, 0xEA, 0x14, 0x2A, 0xBE, 0xA4, 0x0F, 0x1E, 0x7D, 0xF7, 0xE4, 0xF1, 0xE3, 0x93, 0x1F, 0x1E, 0xB9, 0xC3, 0x60, 0xC6, 0xFF, 0xFF, 0x33, - 0x5B, 0x8E, 0xFD, 0xE9, 0x63, 0xEF, 0xA4, 0x0F, 0xC3, 0x3D, 0x12, 0x86, 0x60, 0x7A, 0xC1, 0xF9, 0x21, 0x45, 0x9A, 0x22, 0xE4, 0x10, 0x28, 0xC9, 0xA1, 0x8D, - 0x97, 0x3B, 0x2A, 0xF2, 0x44, 0x93, 0x00, 0x32, 0xF8, 0xD0, 0xF0, 0x15, 0x4D, 0x68, 0x33, 0x56, 0x4C, 0xD3, 0x50, 0xA2, 0x53, 0x9D, 0x0C, 0xBD, 0x65, 0x9A, - 0x03, 0xCA, 0x14, 0x57, 0x18, 0x6F, 0x45, 0xAC, 0x3C, 0x84, 0x00, 0x46, 0xC1, 0x71, 0x71, 0x15, 0xDA, 0x28, 0x1B, 0x25, 0x54, 0x80, 0x8D, 0x97, 0xA6, 0xF3, - 0x45, 0xE8, 0x5E, 0x17, 0x4A, 0x71, 0xBD, 0x90, 0x85, 0xCA, 0x9C, 0xAE, 0x12, 0xAC, 0x72, 0x18, 0x69, 0xD9, 0x90, 0x71, 0x01, 0xA2, 0x6D, 0x51, 0xEC, 0xEC, - 0x5A, 0x31, 0x26, 0x8A, 0x4D, 0xD2, 0xAB, 0x00, 0xD6, 0x07, 0x9F, 0x2E, 0xDF, 0xFE, 0x5D, 0x7B, 0xF7, 0xFA, 0x4F, 0xA5, 0x86, 0xCA, 0x88, 0xC2, 0x18, 0x5D, - 0xA1, 0x67, 0x0A, 0xC6, 0xF4, 0x21, 0x64, 0xA2, 0x73, 0xCD, 0x50, 0x0C, 0x98, 0xED, 0x1D, 0xE2, 0x8E, 0xC3, 0xC9, 0x85, 0xDE, 0xD5, 0xF1, 0x91, 0x16, 0x71, - 0xD6, 0xD3, 0x35, 0x8C, 0xDF, 0xF4, 0xE0, 0xC6, 0x70, 0xE6, 0x78, 0xD4, 0xA9, 0xC2, 0x6B, 0xD6, 0xB4, 0x94, 0xCD, 0x78, 0x60, 0x89, 0x64, 0x2C, 0x05, 0xE2, - 0xA4, 0x94, 0xF5, 0xC1, 0x35, 0x09, 0xCF, 0x0F, 0xD9, 0xAD, 0x12, 0xAD, 0x15, 0xF7, 0x0D, 0x9E, 0xCC, 0xCC, 0xA1, 0xC8, 0x84, 0x8A, 0x14, 0x3F, 0xF2, 0x8D, - 0x29, 0x41, 0xA9, 0x54, 0xD2, 0xBC, 0xAC, 0xF5, 0x08, 0x52, 0x1F, 0x7C, 0x20, 0xB4, 0x20, 0x02, 0x32, 0x2A, 0x29, 0xFE, 0x9C, 0xD7, 0xA8, 0x89, 0xFE, 0x23, - 0x7B, 0xE6, 0x6B, 0x52, 0x2D, 0x83, 0x99, 0x79, 0x05, 0xB9, 0x3F, 0x6C, 0xB5, 0xB4, 0xDE, 0xBB, 0xF7, 0x5A, 0xAB, 0x55, 0xA1, 0xB1, 0x37, 0xA3, 0xEE, 0xC4, - 0xF5, 0xDF, 0x3D, 0xD2, 0x07, 0xBF, 0x7C, 0x7A, 0xF5, 0xAC, 0x0E, 0x75, 0x61, 0x67, 0xD9, 0xED, 0x75, 0x3A, 0x8D, 0xF3, 0x43, 0xD6, 0x64, 0x7D, 0x5C, 0x3D, - 0xD0, 0x2B, 0xC5, 0xD5, 0x3B, 0x05, 0x5C, 0x9D, 0x5E, 0x7F, 0x0B, 0x5C, 0x5D, 0x7D, 0xF0, 0xFA, 0x05, 0xC3, 0xF4, 0xB8, 0xB7, 0x0D, 0x51, 0x60, 0xE0, 0x94, - 0x26, 0x20, 0x67, 0xF9, 0xF8, 0xE4, 0x74, 0x73, 0x4C, 0x4F, 0x80, 0xBB, 0x8F, 0x80, 0xE9, 0x14, 0x04, 0x75, 0xB2, 0x8D, 0x9C, 0x4E, 0xF5, 0x01, 0xE2, 0x81, - 0x88, 0xBE, 0xEC, 0x9F, 0x6E, 0x81, 0xE7, 0x31, 0x88, 0x08, 0x11, 0x01, 0x92, 0xE5, 0xD1, 0x36, 0x32, 0x3A, 0xD1, 0x07, 0x97, 0x6F, 0x5E, 0xD6, 0xFB, 0xC0, - 0x58, 0xEF, 0xC9, 0xC9, 0xE6, 0x78, 0x8E, 0xF5, 0xC1, 0x3F, 0x90, 0x20, 0x20, 0x66, 0xD9, 0xEB, 0x6F, 0x41, 0x50, 0x5F, 0x1F, 0x00, 0x3C, 0xE2, 0xD8, 0x18, - 0x05, 0xD8, 0xF5, 0x6B, 0x4A, 0x0C, 0x22, 0xEA, 0x3E, 0xDE, 0x82, 0x2B, 0xB0, 0xEA, 0x7F, 0xA0, 0x78, 0x00, 0xC9, 0xB2, 0xDB, 0xDF, 0xC6, 0xA6, 0x01, 0x11, - 0x25, 0x09, 0x7C, 0x0D, 0x5D, 0x6D, 0x73, 0x4C, 0x60, 0xD3, 0x4F, 0x4E, 0x96, 0x4F, 0x4E, 0xAA, 0x21, 0xC0, 0x18, 0x89, 0xF1, 0xA6, 0x28, 0x8A, 0x16, 0x07, - 0xD9, 0xA2, 0x00, 0xFA, 0xEF, 0x39, 0x0C, 0x8B, 0xC2, 0xD5, 0xDA, 0xE1, 0x93, 0xC3, 0x81, 0x4C, 0xD8, 0x41, 0xB5, 0xC8, 0x29, 0x51, 0x12, 0x3D, 0xA1, 0xA3, - 0x0F, 0xFA, 0x15, 0x32, 0x54, 0xA2, 0x84, 0xA1, 0xB0, 0x09, 0xFA, 0x69, 0xDA, 0x44, 0xCB, 0xC3, 0x84, 0x09, 0x2E, 0x71, 0xA4, 0x4B, 0x11, 0x64, 0xA3, 0xD0, - 0xAC, 0xA0, 0xD5, 0x58, 0xEA, 0x83, 0x93, 0xA3, 0xD2, 0x94, 0xB6, 0xB9, 0x32, 0x86, 0x74, 0x00, 0xEE, 0x92, 0x20, 0x58, 0x5B, 0x1F, 0x31, 0xA8, 0x3E, 0x78, - 0x1E, 0x1D, 0x6F, 0xA3, 0x95, 0x56, 0x6F, 0x0B, 0xB5, 0x48, 0xE4, 0x30, 0xCD, 0xB4, 0x7A, 0x5C, 0x35, 0x71, 0xF1, 0x72, 0xB7, 0x8A, 0x29, 0xA3, 0x76, 0x1B, - 0xBD, 0x60, 0x01, 0xEE, 0x1B, 0x41, 0xB8, 0xB6, 0x56, 0x04, 0x20, 0x44, 0x68, 0x7E, 0xB4, 0x37, 0x8D, 0x44, 0xA4, 0x7C, 0x03, 0xFA, 0x08, 0x8C, 0x70, 0xCE, - 0x9E, 0x85, 0x5A, 0x5B, 0x23, 0x31, 0x28, 0xD4, 0x03, 0xD1, 0xF1, 0xDE, 0xB4, 0x22, 0x91, 0xF3, 0x2D, 0xE8, 0x65, 0x46, 0x4C, 0xDB, 0x70, 0x3E, 0x93, 0xD1, - 0x08, 0x12, 0xD6, 0xFA, 0xBA, 0x49, 0x80, 0x83, 0x7E, 0xD8, 0xB9, 0x76, 0x45, 0xCF, 0xD7, 0xAE, 0xCD, 0x53, 0xE8, 0x36, 0x2F, 0xD0, 0xD3, 0xD9, 0x9B, 0x4F, - 0x52, 0x13, 0x3A, 0x24, 0x62, 0x47, 0xFA, 0xE0, 0x47, 0x2F, 0xA2, 0x73, 0xF3, 0x02, 0xE3, 0x47, 0x32, 0xA6, 0x73, 0xC0, 0xDB, 0x54, 0x3B, 0xAF, 0x7C, 0x63, - 0x45, 0x37, 0x19, 0x6E, 0x53, 0x7C, 0x7D, 0x20, 0x96, 0xF6, 0xB3, 0xED, 0x6E, 0xCE, 0x4C, 0x1F, 0x09, 0x21, 0xC4, 0xDD, 0x0E, 0x0B, 0x94, 0xA4, 0xCF, 0xE1, - 0x60, 0x3B, 0x24, 0x27, 0x38, 0x5E, 0x9D, 0xD9, 0xC6, 0xD7, 0x50, 0x6E, 0x19, 0x8B, 0xE1, 0xDA, 0x6E, 0x01, 0x30, 0xFA, 0xE0, 0xD9, 0xAF, 0xCF, 0xD7, 0x0E, - 0x52, 0x6C, 0x25, 0xB5, 0x8A, 0x85, 0xC7, 0xF3, 0x11, 0xD8, 0x59, 0x66, 0xA2, 0x48, 0xED, 0x39, 0x55, 0x27, 0x8B, 0x14, 0x7C, 0x09, 0x02, 0xE9, 0xC2, 0x93, - 0x2E, 0xB1, 0x59, 0x8D, 0xC7, 0xFB, 0x8B, 0x60, 0x40, 0xC4, 0xE7, 0xB1, 0x61, 0xAF, 0x9F, 0x57, 0x04, 0x20, 0xD5, 0x94, 0xF6, 0x0A, 0x8E, 0x76, 0xA5, 0x2E, - 0xD6, 0xED, 0xDE, 0x74, 0xC6, 0xB9, 0xDE, 0xB7, 0xE2, 0x80, 0x90, 0xA9, 0x67, 0xAD, 0x3F, 0x0D, 0xC4, 0xE1, 0xF4, 0x01, 0x68, 0xED, 0x1D, 0x1C, 0xAC, 0x9D, - 0x65, 0x04, 0x82, 0x7B, 0x4E, 0x2F, 0xCF, 0xE6, 0xA1, 0xB7, 0x4D, 0x66, 0xB9, 0x9E, 0xBB, 0xEE, 0x6A, 0x9B, 0xB4, 0x72, 0xE9, 0x78, 0x73, 0x6B, 0x73, 0x0C, - 0x90, 0x53, 0x7E, 0x1A, 0x8D, 0x6C, 0x73, 0xF3, 0xAC, 0x04, 0x19, 0xE5, 0xB5, 0x37, 0xAD, 0x08, 0x7F, 0xCF, 0x51, 0x9C, 0x98, 0xEB, 0x07, 0x08, 0x62, 0x82, - 0x16, 0xAF, 0x2E, 0xB5, 0xEB, 0xAB, 0x1F, 0xAF, 0x7F, 0xFA, 0xB0, 0x9B, 0xE8, 0x00, 0x7D, 0xEE, 0x29, 0x30, 0x20, 0xB7, 0xFB, 0x8E, 0x09, 0x40, 0x44, 0x6F, - 0x13, 0x3D, 0xF5, 0x98, 0xA2, 0x5E, 0x5C, 0xBF, 0xDF, 0x95, 0x96, 0x7A, 0xFB, 0x53, 0x53, 0xEF, 0x6B, 0xD0, 0xD3, 0x67, 0x87, 0xDC, 0x10, 0x67, 0x03, 0x5D, - 0x31, 0x40, 0xD4, 0x97, 0xF6, 0x16, 0x8F, 0xF6, 0x36, 0x90, 0x8B, 0x48, 0xF9, 0x06, 0x86, 0x71, 0x60, 0x15, 0x9F, 0x29, 0xD1, 0x9B, 0x38, 0x0F, 0x83, 0xD4, - 0x07, 0x57, 0xCB, 0x99, 0x17, 0xCC, 0xFD, 0x8A, 0x09, 0x55, 0xAD, 0x91, 0xCE, 0x56, 0x0A, 0x11, 0xA4, 0x30, 0x8D, 0x74, 0xB8, 0x42, 0x70, 0x91, 0x44, 0x5A, - 0x3F, 0xEB, 0xDF, 0xA9, 0x56, 0x10, 0xF9, 0x7D, 0x2A, 0x66, 0xBC, 0x41, 0xDE, 0x19, 0x63, 0xDE, 0x79, 0x75, 0xB9, 0x9B, 0x50, 0x36, 0xDE, 0x5B, 0xC2, 0x19, - 0xEF, 0x35, 0xE1, 0x68, 0x7C, 0x0D, 0x5B, 0x48, 0x61, 0xC3, 0x41, 0x04, 0x07, 0x84, 0xB1, 0xF3, 0x26, 0x03, 0x08, 0xC9, 0x73, 0xBA, 0xCB, 0x6D, 0x5C, 0x47, - 0x90, 0x91, 0xF4, 0x9C, 0xA3, 0xD8, 0x6F, 0x8E, 0xEF, 0xD4, 0x6B, 0x8E, 0x4A, 0xA9, 0xDD, 0xC6, 0x69, 0x90, 0x13, 0x93, 0xD8, 0x0E, 0x6E, 0x65, 0x5E, 0x57, - 0x21, 0x12, 0x2C, 0xD3, 0x89, 0x76, 0xC9, 0xCE, 0xB6, 0xD1, 0x4D, 0x6F, 0x1B, 0xDD, 0xC8, 0x14, 0x25, 0xD5, 0x73, 0x72, 0x4F, 0x99, 0xA6, 0xDB, 0x3B, 0xBD, - 0x4F, 0xF5, 0x0C, 0x67, 0xEB, 0xC7, 0x34, 0x80, 0xD1, 0x07, 0xCF, 0xDF, 0xEF, 0x26, 0xA6, 0x61, 0x67, 0x15, 0x63, 0xDA, 0x56, 0x11, 0x8C, 0x32, 0xB5, 0xEF, - 0x52, 0x6C, 0xB1, 0x81, 0x36, 0x16, 0x48, 0xF8, 0xAF, 0x3B, 0xD2, 0xC6, 0xA2, 0xBA, 0x36, 0xEE, 0x38, 0xC3, 0x2C, 0xBE, 0x06, 0xFD, 0xF8, 0xC6, 0xE2, 0xF3, - 0x78, 0x6A, 0xAC, 0xAD, 0x23, 0x0E, 0xA7, 0x0F, 0x3E, 0x18, 0x0B, 0xED, 0xD5, 0xBB, 0x67, 0x3B, 0xD1, 0x95, 0xE8, 0x74, 0x3F, 0xFA, 0x8A, 0x58, 0xDE, 0xB7, - 0xCE, 0x1C, 0xE2, 0xAE, 0xEF, 0x54, 0x08, 0xA4, 0x0F, 0xDE, 0x12, 0x37, 0xD0, 0x2E, 0x3D, 0x9F, 0xBF, 0x76, 0x6E, 0x27, 0x5A, 0xA3, 0x3D, 0xEF, 0x47, 0x65, - 0x8C, 0xE9, 0x7D, 0xEB, 0x6B, 0x32, 0xB5, 0x7D, 0xDF, 0xF3, 0xD7, 0x56, 0x19, 0x87, 0xD3, 0x07, 0xAF, 0x5B, 0xEF, 0xE8, 0xD1, 0x4E, 0xD4, 0x25, 0x7A, 0xDD, - 0x8F, 0xC6, 0x22, 0x9E, 0xF7, 0xAD, 0xB4, 0x9B, 0x91, 0x63, 0xCF, 0xD6, 0x56, 0x19, 0x85, 0xD2, 0x07, 0x1F, 0x5B, 0x2F, 0xE1, 0xEF, 0x4E, 0xD4, 0xC5, 0x7A, - 0xDC, 0x8F, 0xB2, 0x38, 0xB7, 0xFB, 0x56, 0x95, 0x65, 0x2E, 0xD6, 0x56, 0x14, 0xC0, 0xE8, 0x83, 0x17, 0x97, 0xBF, 0x6A, 0xF5, 0x17, 0xDE, 0xC2, 0xC5, 0x07, - 0x2E, 0xB5, 0xAB, 0x1F, 0x1B, 0x3B, 0xD1, 0x18, 0x76, 0xBD, 0x1F, 0x7D, 0x51, 0xA6, 0xF7, 0xAD, 0x2D, 0xBA, 0xAF, 0x66, 0x68, 0xAC, 0x1F, 0x0E, 0x05, 0x20, - 0x3E, 0xFB, 0x02, 0x47, 0xDA, 0x73, 0x63, 0x37, 0x01, 0x31, 0xEA, 0x77, 0x17, 0x45, 0x7B, 0xCC, 0xE4, 0xBE, 0xF5, 0xE4, 0x10, 0xAB, 0x82, 0x8A, 0x92, 0x25, - 0x86, 0xF5, 0x19, 0xB7, 0xA8, 0xE0, 0xD6, 0xCD, 0x15, 0xD4, 0x1A, 0x57, 0x2F, 0xB4, 0x37, 0xE2, 0xB4, 0x02, 0x37, 0x1B, 0xCF, 0xD9, 0xE5, 0x0D, 0x6D, 0x93, - 0xF4, 0x24, 0x07, 0xB7, 0xBD, 0xE3, 0xE3, 0xED, 0x86, 0xB7, 0x79, 0xD3, 0xA8, 0xC7, 0xC7, 0xF7, 0xA8, 0x93, 0x91, 0x61, 0x92, 0xCF, 0x16, 0x09, 0x37, 0x79, - 0x18, 0x46, 0x82, 0xD5, 0x07, 0x2F, 0xE1, 0x44, 0x7B, 0x41, 0x4F, 0x76, 0x55, 0x06, 0xCA, 0xFD, 0xEF, 0xC2, 0x93, 0x12, 0xFC, 0xEE, 0xDB, 0x99, 0x28, 0x31, - 0x50, 0x74, 0x7B, 0x63, 0x77, 0xA3, 0xBD, 0x05, 0x09, 0x70, 0xAE, 0xBE, 0x0F, 0xEC, 0x7C, 0xB7, 0x0A, 0x8C, 0x89, 0xD8, 0x99, 0x0E, 0x25, 0xBE, 0x77, 0xA1, - 0x46, 0x79, 0x83, 0x11, 0x7F, 0x33, 0x67, 0x99, 0xA6, 0xF8, 0x46, 0x17, 0x3A, 0x9D, 0x46, 0xC2, 0x56, 0x10, 0xDA, 0x8E, 0xA3, 0x0F, 0x5E, 0x91, 0x50, 0xBB, - 0xC6, 0xC3, 0x8A, 0x3B, 0x5B, 0x24, 0x2C, 0x62, 0x5B, 0x5B, 0xE8, 0x13, 0x63, 0xAA, 0x0F, 0xAE, 0xF1, 0x9D, 0xA5, 0x80, 0x0B, 0xCF, 0xD6, 0x47, 0x46, 0x85, - 0x48, 0x5C, 0xDF, 0x03, 0xA2, 0x22, 0x25, 0xF1, 0x77, 0xA1, 0xE9, 0x9A, 0x38, 0x92, 0xAE, 0x0D, 0xAE, 0x68, 0x63, 0x0D, 0xAD, 0xAC, 0xBC, 0xBB, 0xCA, 0x5B, - 0x6E, 0xE8, 0x1E, 0x3B, 0xDC, 0x34, 0x97, 0x7C, 0xA3, 0x31, 0x68, 0x95, 0xED, 0xA0, 0x1D, 0x9C, 0x07, 0x33, 0xC3, 0x15, 0xCD, 0xE8, 0xF6, 0xD2, 0x05, 0xDF, - 0x2F, 0x38, 0xF4, 0x1C, 0x0B, 0x1A, 0x3E, 0xB3, 0x6E, 0xF0, 0xED, 0x4E, 0x96, 0x76, 0x1D, 0xED, 0x7C, 0x43, 0x10, 0x30, 0x0B, 0x81, 0xA1, 0x44, 0xB7, 0x13, - 0x5F, 0xA0, 0x67, 0x7B, 0x14, 0xF1, 0x7D, 0x38, 0x05, 0xCA, 0xCD, 0xD9, 0xAC, 0xE7, 0x93, 0x71, 0x24, 0x48, 0xD5, 0x1E, 0x4E, 0xE5, 0xD6, 0xBD, 0x0F, 0x64, - 0x6C, 0x07, 0x40, 0xA3, 0x06, 0x66, 0x71, 0x48, 0xB7, 0x3B, 0x31, 0x53, 0xAE, 0xB6, 0x95, 0x4E, 0xEE, 0x92, 0x6F, 0x04, 0x56, 0x6E, 0x90, 0x5C, 0xAB, 0x62, - 0x4C, 0x6F, 0x67, 0x4C, 0x62, 0x2C, 0x33, 0xFA, 0x87, 0xAD, 0xD6, 0xA4, 0x8F, 0x1B, 0xB7, 0x34, 0xC1, 0xDA, 0xF9, 0xE1, 0xA4, 0x5F, 0xB6, 0xE7, 0xA8, 0x74, - 0xD7, 0x1D, 0x70, 0xBA, 0xF1, 0xA6, 0x3B, 0x94, 0xD2, 0x00, 0xA8, 0x69, 0x6A, 0xEF, 0x8C, 0xE0, 0x4B, 0x53, 0xFB, 0x88, 0xF9, 0x7D, 0x87, 0x7B, 0xEF, 0x90, - 0x76, 0xC3, 0xB2, 0xFC, 0xDC, 0xFD, 0x77, 0xFD, 0xC4, 0xFE, 0xBB, 0x13, 0xB1, 0xFF, 0x4E, 0x9A, 0x69, 0x5F, 0x76, 0xBB, 0xDD, 0x2A, 0x9C, 0x57, 0xDC, 0x82, - 0x77, 0x27, 0x2C, 0x4D, 0x41, 0x98, 0x15, 0x59, 0xEA, 0x0B, 0x96, 0xFA, 0x12, 0x4B, 0xA7, 0x77, 0xB9, 0xA9, 0xF0, 0x4E, 0x38, 0xE2, 0xEB, 0xB8, 0x5F, 0x09, - 0x4B, 0x95, 0xF6, 0x49, 0x52, 0xDB, 0xBE, 0xAB, 0x6D, 0x92, 0xB4, 0x49, 0x3A, 0x18, 0x1E, 0x17, 0xC6, 0x42, 0x0A, 0xC2, 0x7C, 0xFE, 0xD5, 0x5D, 0xFA, 0xFC, - 0x78, 0x0B, 0x9F, 0x1F, 0x67, 0x7C, 0x7E, 0x87, 0xCE, 0x2E, 0x08, 0xFF, 0xC6, 0x1C, 0x5E, 0xB0, 0xB5, 0x86, 0xD3, 0x2B, 0xD9, 0xDA, 0xAD, 0x87, 0x44, 0x96, - 0xF0, 0xEA, 0x2E, 0x3D, 0x24, 0xC7, 0x6E, 0x37, 0x32, 0x52, 0x1E, 0x73, 0x06, 0xBB, 0xC9, 0x49, 0xB4, 0x92, 0x92, 0xD5, 0xC9, 0x7B, 0xC7, 0x8D, 0x86, 0x47, - 0x7D, 0x5E, 0x36, 0xDD, 0x85, 0x7A, 0xAA, 0xEF, 0xC7, 0xCE, 0x6D, 0x72, 0x37, 0x45, 0x19, 0xBE, 0x11, 0x61, 0x26, 0x55, 0xB8, 0x95, 0x0B, 0xB3, 0xCB, 0xB7, - 0x7F, 0x5F, 0xAF, 0x16, 0x4B, 0xF7, 0xB4, 0xBB, 0x7A, 0x6C, 0x33, 0x6B, 0x95, 0x05, 0xC6, 0x69, 0x87, 0x88, 0x83, 0x6F, 0x26, 0xE8, 0x7D, 0x8A, 0x38, 0x57, - 0x8C, 0x0D, 0xA5, 0xA0, 0x10, 0x81, 0xE5, 0x0D, 0xFA, 0x68, 0x20, 0xE4, 0x73, 0x96, 0x70, 0x2C, 0xE2, 0x9A, 0xE6, 0x8D, 0x46, 0xF4, 0x73, 0x57, 0x8F, 0x31, - 0x60, 0x04, 0x5F, 0xF0, 0x7A, 0xA7, 0x1B, 0x91, 0xA4, 0x1A, 0xF2, 0xC5, 0x14, 0x46, 0xB4, 0x51, 0x13, 0xE3, 0x86, 0x76, 0x67, 0x22, 0x38, 0x62, 0x22, 0x78, - 0xF1, 0xE6, 0xA3, 0x4A, 0x06, 0xCC, 0xD7, 0x3A, 0x59, 0x11, 0x1C, 0x6D, 0xFE, 0x6E, 0x85, 0x6E, 0x65, 0x69, 0x75, 0x62, 0x69, 0x1D, 0x8D, 0xE2, 0x2D, 0xA2, - 0xDB, 0x84, 0x2C, 0x85, 0x04, 0x8E, 0xD9, 0x43, 0xE0, 0xDA, 0x7B, 0xD9, 0x03, 0x2A, 0xD9, 0xC1, 0xF1, 0x3A, 0x76, 0x60, 0x1D, 0x6D, 0x61, 0x06, 0xC7, 0x39, - 0x66, 0x70, 0x57, 0x32, 0xE8, 0xEB, 0x83, 0xF7, 0x9B, 0x98, 0x41, 0xBF, 0xA2, 0x19, 0x1C, 0x09, 0x33, 0x88, 0xF7, 0x0F, 0xF7, 0xAB, 0x0A, 0x4B, 0xB2, 0x82, - 0xC7, 0x23, 0x7C, 0x6C, 0xE6, 0x71, 0x35, 0x4F, 0xD8, 0x5D, 0xCC, 0x5D, 0xD8, 0xEE, 0xFA, 0xF1, 0xF6, 0x57, 0xDB, 0xB5, 0xBC, 0xC5, 0x7A, 0x21, 0x57, 0xEE, - 0xE8, 0x6B, 0x0F, 0xB7, 0xEB, 0x8D, 0x5A, 0x71, 0x66, 0xA7, 0xB5, 0xC4, 0xCA, 0xDE, 0x0D, 0x3C, 0x5F, 0xCB, 0xBE, 0x39, 0x24, 0xB1, 0x01, 0x51, 0xB4, 0xAE, - 0x56, 0x04, 0x64, 0xB7, 0x5C, 0xBC, 0x79, 0xA9, 0x6D, 0xF0, 0x5A, 0x07, 0x05, 0xB2, 0x2E, 0x7B, 0xF9, 0x85, 0xB6, 0xC1, 0xDB, 0x2F, 0x14, 0xD8, 0x72, 0xB6, - 0xA8, 0xE0, 0x8B, 0x48, 0xB4, 0xCD, 0xDE, 0x44, 0x52, 0xBA, 0x5B, 0x83, 0xB5, 0xDA, 0x3C, 0xA5, 0x44, 0xE3, 0x32, 0xE6, 0xAD, 0x50, 0x63, 0x55, 0xDB, 0x62, - 0x4F, 0x71, 0x4A, 0x06, 0xC0, 0xC1, 0x97, 0x74, 0x37, 0x4B, 0x40, 0xAA, 0x6D, 0x4A, 0x4D, 0x13, 0xB6, 0x46, 0x65, 0xF8, 0xE9, 0x4C, 0x0A, 0x66, 0x51, 0xE7, - 0x6B, 0x06, 0xB3, 0xB8, 0xCE, 0x07, 0x63, 0xDA, 0xFB, 0xE0, 0xE5, 0x9F, 0x0A, 0x96, 0x56, 0x9B, 0xB3, 0x74, 0x74, 0x57, 0x2C, 0x6D, 0x91, 0xAA, 0x22, 0xEB, - 0x0A, 0xBD, 0xD0, 0x70, 0x36, 0x36, 0x2E, 0x06, 0x0D, 0xB6, 0xC5, 0x62, 0xAE, 0x76, 0x0D, 0xAC, 0xEE, 0xD4, 0xC0, 0x04, 0x01, 0xD5, 0x94, 0xD1, 0xCF, 0x2A, - 0xE3, 0xF4, 0x6B, 0xB3, 0x2F, 0xC6, 0x51, 0x55, 0xF3, 0x52, 0x70, 0x74, 0xF2, 0x35, 0x99, 0x97, 0x37, 0x0F, 0xF1, 0xEA, 0xC6, 0xC1, 0x8B, 0x81, 0x63, 0xF0, - 0xA2, 0x47, 0xBB, 0x37, 0xB0, 0x88, 0x82, 0x8D, 0xF5, 0x71, 0x74, 0xA7, 0xAF, 0x3C, 0xBB, 0x8B, 0x08, 0xC6, 0x58, 0xDA, 0xC2, 0xC4, 0x7A, 0xFD, 0x1D, 0x9A, - 0x98, 0xB4, 0xD0, 0xC4, 0xF3, 0x20, 0x2F, 0x60, 0x74, 0xBE, 0x36, 0x10, 0x17, 0x34, 0xEB, 0xAC, 0x24, 0xA9, 0xB3, 0xF2, 0xF9, 0x21, 0x14, 0x85, 0x59, 0x04, - 0x39, 0x74, 0x9E, 0xB3, 0x2F, 0x27, 0xAA, 0x3B, 0x8C, 0xDF, 0x74, 0x48, 0x97, 0xD5, 0xE2, 0x77, 0xEA, 0x46, 0x85, 0x66, 0xFA, 0x5D, 0xBB, 0xA5, 0x6F, 0x15, - 0x3C, 0x37, 0xF8, 0x2B, 0x38, 0x6E, 0x08, 0x5F, 0x03, 0xD4, 0x26, 0x3E, 0x19, 0x5D, 0xE8, 0xDF, 0x45, 0x38, 0xB9, 0xB4, 0xB0, 0x89, 0xAE, 0x41, 0x48, 0x76, - 0x1D, 0xCF, 0xC0, 0x62, 0xD5, 0x98, 0x85, 0x40, 0x69, 0xFB, 0x8F, 0x19, 0x4E, 0xF2, 0x1A, 0xF8, 0xBE, 0x06, 0xA3, 0xDA, 0x4A, 0x33, 0x7D, 0x3B, 0x2F, 0x7F, - 0xB0, 0x06, 0x0F, 0xA3, 0x35, 0xC3, 0xFF, 0xF9, 0xEF, 0xB2, 0xA9, 0x19, 0xFC, 0x7E, 0x66, 0x2C, 0x00, 0x30, 0x23, 0xDF, 0xBC, 0xD0, 0x81, 0x52, 0xDF, 0x0B, - 0xA0, 0x14, 0xB5, 0xC7, 0x76, 0x8E, 0xAA, 0xF2, 0xA4, 0x7D, 0xA8, 0x12, 0x77, 0xAA, 0xB1, 0x62, 0x6C, 0x72, 0x1E, 0x98, 0xBE, 0x3D, 0x83, 0x52, 0xCD, 0xF2, - 0xCC, 0xF9, 0x94, 0xB8, 0x61, 0xDB, 0xB0, 0xAC, 0xAB, 0x1B, 0x38, 0x78, 0x8B, 0x33, 0xCC, 0x20, 0xF9, 0x7A, 0xED, 0xC5, 0x4F, 0xEF, 0x2E, 0xD9, 0x3B, 0x2B, - 0xDF, 0x82, 0xBC, 0x88, 0x55, 0x6B, 0x6A, 0xA3, 0xB9, 0xCB, 0xAA, 0xF7, 0x3A, 0xC1, 0xB6, 0xEC, 0x3B, 0xA6, 0x37, 0x86, 0xAF, 0x0D, 0x8D, 0x80, 0xBC, 0xF6, - 0x82, 0x50, 0xBB, 0xD0, 0x22, 0x8C, 0x8E, 0x67, 0xD2, 0x77, 0xA2, 0xB4, 0x19, 0x5F, 0xBC, 0x25, 0x63, 0xFC, 0x17, 0xDF, 0x81, 0xA6, 0x11, 0xD4, 0x81, 0x56, - 0x3B, 0x3B, 0xED, 0xD6, 0xD0, 0xFE, 0xA2, 0x2E, 0x46, 0xF8, 0x65, 0x52, 0x68, 0x57, 0x9F, 0xFB, 0x4E, 0x53, 0x33, 0x87, 0x0D, 0xF6, 0x9E, 0x51, 0x7A, 0x19, - 0xAF, 0x89, 0x17, 0x50, 0xB7, 0xC3, 0x09, 0x71, 0xEB, 0x31, 0x65, 0xE0, 0x0C, 0x33, 0xCF, 0x0D, 0x12, 0x1F, 0x59, 0xB5, 0x47, 0xF1, 0xF5, 0x36, 0x14, 0xF4, - 0xE1, 0x3C, 0xD0, 0x1E, 0x5E, 0x5C, 0x68, 0x58, 0xE0, 0x26, 0xDE, 0x5F, 0x6A, 0x0E, 0xD3, 0xED, 0x9A, 0x5A, 0xEA, 0xC2, 0xCF, 0x10, 0x1A, 0xA4, 0x37, 0x65, - 0xDF, 0x6A, 0xC4, 0x49, 0xBD, 0xAA, 0x39, 0x02, 0xC0, 0x28, 0x52, 0x6F, 0x24, 0x09, 0xAC, 0x5B, 0x46, 0x68, 0x34, 0x92, 0xEF, 0x4C, 0x85, 0x5E, 0x81, 0x92, - 0xA6, 0x46, 0x6F, 0xC9, 0x2F, 0x70, 0xBD, 0x6D, 0xB4, 0x41, 0x86, 0xC0, 0x6F, 0x04, 0x4D, 0x7C, 0x3F, 0xFD, 0xF5, 0x58, 0x80, 0x6E, 0x75, 0x9B, 0x1A, 0xDE, - 0x49, 0xC2, 0x4A, 0x44, 0x3E, 0x10, 0xD7, 0x84, 0xD0, 0x8A, 0xD1, 0x2A, 0x50, 0x32, 0x74, 0xB7, 0x09, 0x15, 0x41, 0xEC, 0xF9, 0x40, 0xC6, 0x20, 0xB1, 0x71, - 0x93, 0x0F, 0xA0, 0x9B, 0x74, 0xF4, 0xDC, 0x64, 0x41, 0x51, 0xD2, 0xDA, 0xE1, 0x21, 0xB8, 0x34, 0x04, 0x25, 0x02, 0x56, 0x31, 0xAE, 0xD7, 0xF8, 0x02, 0x26, - 0x58, 0x54, 0xAD, 0xB3, 0xAC, 0x1D, 0x00, 0x82, 0x76, 0xE8, 0x5D, 0x87, 0xBE, 0xED, 0x8E, 0x61, 0xE8, 0xD1, 0x88, 0xB1, 0xD1, 0xDB, 0x88, 0x32, 0x75, 0x9F, - 0x5E, 0xA7, 0x9D, 0xA4, 0x6F, 0xD4, 0xF9, 0xF5, 0x83, 0x5A, 0xA3, 0xC6, 0x89, 0xA7, 0xE7, 0x60, 0x6E, 0x75, 0x76, 0xF0, 0x88, 0xD2, 0xD8, 0xD0, 0xCE, 0xCF, - 0x79, 0x37, 0xAC, 0x15, 0x5E, 0x84, 0x46, 0xF4, 0x4F, 0xEA, 0x56, 0x64, 0x8A, 0xBF, 0x7F, 0xFF, 0x97, 0xB0, 0xD9, 0xDB, 0x43, 0xA0, 0xFA, 0x29, 0xCE, 0x20, - 0x7C, 0xFF, 0x17, 0xFC, 0xFF, 0xF6, 0x11, 0x9D, 0x36, 0xF8, 0xFE, 0x2F, 0xFC, 0x73, 0xFB, 0x08, 0x7A, 0x82, 0x63, 0xDA, 0xDF, 0xED, 0xEF, 0x54, 0x0E, 0x59, - 0xE9, 0x8D, 0x73, 0xA5, 0x17, 0x89, 0x6D, 0x6D, 0x9A, 0xC6, 0x05, 0x44, 0xFD, 0x1E, 0xFB, 0x6F, 0xDD, 0xF4, 0x2C, 0x50, 0x4F, 0x08, 0x96, 0x2C, 0x94, 0xEE, - 0x80, 0x4A, 0x84, 0xA0, 0xA2, 0x97, 0x08, 0xDB, 0x23, 0xDA, 0x52, 0xE3, 0xAE, 0x12, 0x1B, 0x88, 0x68, 0x39, 0x33, 0xFC, 0x80, 0xBC, 0x71, 0xC3, 0x7A, 0x98, - 0x70, 0x8A, 0x1C, 0x89, 0x0F, 0x06, 0x09, 0x16, 0xF0, 0x07, 0x70, 0xD0, 0xAE, 0xC6, 0x95, 0x16, 0x19, 0xDB, 0x83, 0xC8, 0x0E, 0x63, 0x4A, 0xD9, 0xCD, 0x1C, - 0x3B, 0xFC, 0x64, 0x3A, 0x5F, 0xEA, 0xF8, 0x5A, 0xD3, 0x74, 0xA8, 0xC8, 0x88, 0x08, 0x1B, 0x3D, 0xC5, 0xFF, 0x81, 0x5C, 0xF0, 0x4F, 0xAE, 0x7E, 0x00, 0x2B, - 0x2B, 0xE1, 0xEB, 0x74, 0x0A, 0xE0, 0xF3, 0xB2, 0xA9, 0xB1, 0x83, 0x15, 0x78, 0x86, 0x6B, 0xE1, 0x39, 0xFE, 0x59, 0x09, 0xED, 0xE1, 0x05, 0x7E, 0x04, 0xD7, - 0x68, 0xCD, 0x8A, 0x97, 0xD8, 0x01, 0xB6, 0xA2, 0x35, 0x06, 0x6D, 0xC5, 0x8E, 0xE0, 0x1A, 0xBE, 0xE2, 0x07, 0x6C, 0xB7, 0xA9, 0x0D, 0x6D, 0xD7, 0xA5, 0x07, - 0x25, 0xD4, 0xC7, 0xA9, 0xFE, 0x69, 0xB0, 0x04, 0x0E, 0x38, 0x69, 0xB7, 0x8F, 0x82, 0x55, 0x74, 0xB6, 0xBA, 0x7D, 0x44, 0xF0, 0x1E, 0x25, 0x12, 0x8E, 0x57, - 0xFC, 0x18, 0xAE, 0x03, 0x7D, 0x78, 0x47, 0x10, 0x4C, 0x2F, 0xAC, 0xE2, 0x0B, 0xD0, 0x22, 0xC4, 0xFB, 0x9C, 0x78, 0x38, 0x5B, 0x45, 0x67, 0x08, 0x4D, 0x61, - 0x39, 0x1B, 0x70, 0xBA, 0x8A, 0x4F, 0xE1, 0x2E, 0x7D, 0x5D, 0x11, 0x12, 0xC1, 0x78, 0xBA, 0x7D, 0xC4, 0x79, 0x82, 0x4B, 0xFC, 0x28, 0x2D, 0x6A, 0x8C, 0x09, - 0x21, 0x8F, 0x22, 0xCF, 0x59, 0x92, 0x96, 0xF2, 0x07, 0xF8, 0xC7, 0x95, 0x43, 0xF0, 0xF0, 0xF9, 0xEA, 0x8D, 0x55, 0xAF, 0xF1, 0x05, 0xD9, 0x1A, 0xC6, 0x30, - 0x19, 0xA6, 0xED, 0xB9, 0xA6, 0x63, 0x9B, 0xE8, 0x28, 0xF5, 0x86, 0x76, 0x31, 0xE0, 0x71, 0x0C, 0x0D, 0x1A, 0x9A, 0xCB, 0x46, 0x9A, 0x8B, 0x5A, 0x2C, 0x29, - 0xD6, 0x1A, 0x6D, 0x6A, 0x87, 0xDC, 0xD6, 0x10, 0x05, 0x77, 0xC1, 0x6A, 0x38, 0xB0, 0xB1, 0x02, 0x47, 0xC6, 0x5B, 0x0A, 0x91, 0xD0, 0xD6, 0x12, 0x16, 0x8A, - 0x46, 0x0E, 0xB5, 0x9D, 0x54, 0x94, 0x2D, 0xF0, 0x6A, 0xE1, 0xC0, 0x0F, 0xD3, 0x0E, 0x0C, 0xAA, 0xF2, 0xC3, 0x7A, 0xED, 0x0A, 0x9F, 0xFB, 0xFF, 0xAD, 0x76, - 0x80, 0x8D, 0x0E, 0x6A, 0xFF, 0x3A, 0xD3, 0x6A, 0x07, 0xB2, 0x27, 0xDF, 0xA6, 0x5D, 0x8E, 0x69, 0x6C, 0x5C, 0x51, 0x63, 0x63, 0x49, 0x63, 0xE3, 0xBB, 0xD5, - 0x98, 0xBC, 0x10, 0xBC, 0x8D, 0xD6, 0xE4, 0x95, 0xD7, 0x02, 0xCD, 0x95, 0xC2, 0x73, 0xA5, 0x71, 0x6D, 0x8D, 0x55, 0xDA, 0xDA, 0x44, 0x4D, 0x2C, 0xC5, 0x81, - 0xF7, 0x10, 0xFF, 0xF5, 0xCF, 0xEF, 0xDE, 0x62, 0xA8, 0x54, 0xAB, 0x2C, 0xD2, 0x58, 0xBA, 0x1C, 0x51, 0x60, 0xC0, 0xDC, 0x99, 0x08, 0xDC, 0x89, 0x1C, 0x7A, - 0x50, 0xD3, 0xEA, 0x14, 0x25, 0x66, 0xD0, 0x12, 0x43, 0xE0, 0x81, 0xB7, 0x9A, 0xEF, 0x62, 0xB0, 0x15, 0xCE, 0x1B, 0x43, 0x15, 0xD8, 0x02, 0x02, 0x54, 0x52, - 0x22, 0xC3, 0x9C, 0x71, 0x18, 0x29, 0x27, 0xEC, 0xDC, 0x45, 0xA8, 0xBF, 0x06, 0x55, 0x83, 0x9A, 0x88, 0xE9, 0x71, 0x6C, 0x0B, 0x4A, 0xA5, 0xC3, 0x23, 0x7F, - 0x25, 0x01, 0xF1, 0x39, 0x6C, 0x85, 0x81, 0x8B, 0x4C, 0x50, 0x09, 0x8D, 0x98, 0xBA, 0xCC, 0xC7, 0xB3, 0x5A, 0x07, 0xCF, 0x4A, 0x81, 0x87, 0x67, 0x9E, 0x4A, - 0x68, 0xF8, 0x44, 0x57, 0x2E, 0x96, 0x6A, 0xC4, 0xF0, 0xC9, 0x25, 0x15, 0x4F, 0x3C, 0xD3, 0x55, 0xE3, 0x89, 0x4F, 0x8A, 0xE4, 0xE3, 0xA9, 0x28, 0x1B, 0x3E, - 0x13, 0xA1, 0xB0, 0xE7, 0x74, 0x35, 0xD2, 0x11, 0xFF, 0x6D, 0x5E, 0x7F, 0x8C, 0x0C, 0x88, 0x16, 0xF1, 0x9F, 0xBD, 0x78, 0xC9, 0xF8, 0xA3, 0xA8, 0x16, 0x89, - 0xA3, 0xCC, 0x06, 0xC4, 0x69, 0x1B, 0x21, 0xC4, 0x27, 0x18, 0xC7, 0x93, 0xA0, 0x8D, 0x15, 0x6E, 0x24, 0xC6, 0xCC, 0xAD, 0xB6, 0x0B, 0x04, 0x50, 0x84, 0x8D, - 0xB3, 0x4E, 0xDA, 0x3C, 0x33, 0xB8, 0xD8, 0xE5, 0x3C, 0x74, 0xEC, 0x6E, 0x0E, 0x46, 0x9E, 0x61, 0x92, 0x10, 0x78, 0x31, 0x0F, 0x1B, 0x1D, 0xC5, 0x48, 0xB8, - 0x7A, 0xC7, 0xC7, 0xD9, 0x3C, 0xC3, 0x3B, 0xE0, 0x5F, 0x4F, 0x43, 0x0C, 0x38, 0x1F, 0x15, 0x0F, 0xCD, 0x4C, 0x28, 0x04, 0xB5, 0x9A, 0x58, 0xB2, 0xAB, 0x9D, - 0x65, 0x2A, 0x6E, 0x80, 0xE0, 0x8B, 0x70, 0xDA, 0x53, 0x46, 0x63, 0xE2, 0x9B, 0x20, 0x43, 0x18, 0x7C, 0x47, 0x9F, 0xFE, 0x62, 0xC8, 0xE8, 0x3E, 0x8A, 0x08, - 0x13, 0xBB, 0x86, 0x03, 0xD7, 0xD4, 0x25, 0xB6, 0xB6, 0xD3, 0xF2, 0x5C, 0xA2, 0xEE, 0x35, 0x51, 0xBF, 0xF3, 0x8E, 0xF8, 0x19, 0x7F, 0x38, 0x3D, 0x06, 0xF3, - 0x49, 0x38, 0xF7, 0x5D, 0x5E, 0xCF, 0x67, 0xEB, 0x1B, 0xE5, 0x50, 0x72, 0x87, 0xB6, 0x79, 0x78, 0xA8, 0x3D, 0x0B, 0x43, 0x03, 0x14, 0x80, 0xEB, 0x94, 0x13, - 0x94, 0x8F, 0x66, 0xF0, 0x49, 0x09, 0xCF, 0x47, 0xA3, 0x64, 0x0F, 0x15, 0x13, 0xE6, 0xB7, 0xF8, 0xA5, 0x34, 0xE1, 0xCE, 0x14, 0x55, 0xFB, 0xDF, 0x73, 0xE2, - 0xAF, 0xAE, 0xA9, 0xC0, 0x3C, 0xFF, 0x99, 0xE3, 0xD4, 0x6B, 0xED, 0x78, 0xD9, 0xB9, 0xC6, 0xC6, 0xE0, 0x6D, 0x40, 0x75, 0x05, 0x7D, 0x80, 0x8E, 0x63, 0x9B, - 0x67, 0xDC, 0x44, 0x7A, 0x87, 0x71, 0xD7, 0x05, 0x57, 0x46, 0x7A, 0xD0, 0x0F, 0x2D, 0x3C, 0xF7, 0x0B, 0x59, 0xCD, 0x67, 0x20, 0xFE, 0x78, 0x18, 0x9F, 0x9A, - 0x58, 0xE0, 0xD2, 0x21, 0x6D, 0x68, 0x79, 0xC9, 0x07, 0x72, 0xDD, 0x23, 0x45, 0xA3, 0x58, 0x05, 0xD4, 0x3A, 0xD1, 0x13, 0xB3, 0x1F, 0x92, 0xB9, 0x7D, 0xA0, - 0x3E, 0x53, 0x4C, 0x81, 0x70, 0x02, 0xB9, 0xF0, 0x44, 0xF2, 0x4A, 0xF5, 0x90, 0x9A, 0x9E, 0xB8, 0x6D, 0x3C, 0x88, 0x23, 0xC3, 0x7C, 0x66, 0x19, 0x21, 0x49, - 0x06, 0x87, 0xC8, 0x16, 0xC4, 0xCD, 0xA9, 0x17, 0x92, 0x54, 0xC4, 0xB0, 0x71, 0x6F, 0x86, 0xE1, 0x7C, 0x8C, 0xAD, 0xF1, 0x5E, 0xDD, 0x5F, 0xE1, 0xE3, 0x6B, - 0xF8, 0x7F, 0x66, 0x0E, 0xA2, 0xDA, 0xB8, 0x39, 0x63, 0x21, 0x51, 0x3C, 0x88, 0xAD, 0x44, 0x96, 0x43, 0x22, 0x2C, 0xF0, 0xFB, 0xA2, 0xA7, 0x87, 0x0F, 0xE9, - 0xD1, 0x83, 0x48, 0x69, 0x22, 0x7A, 0x5C, 0x68, 0xF1, 0x8D, 0x94, 0x82, 0xB3, 0xB8, 0x53, 0x38, 0x04, 0x72, 0x09, 0x03, 0xF3, 0xAD, 0x48, 0xBD, 0x33, 0xA8, - 0x36, 0xD1, 0x16, 0xFE, 0x3F, 0xEA, 0x7F, 0x45, 0x51, 0xFF, 0xFE, 0x42, 0x7C, 0x81, 0x6D, 0xA7, 0x3C, 0x80, 0xC1, 0xA9, 0xA7, 0x05, 0x0F, 0x6A, 0x50, 0xED, - 0x28, 0xE7, 0xFD, 0x78, 0xE8, 0x8E, 0xED, 0x6B, 0x62, 0x5B, 0x8C, 0xE8, 0xD8, 0xB2, 0x50, 0x46, 0x38, 0x7D, 0x8F, 0x13, 0xDC, 0x38, 0xDB, 0x5D, 0xAF, 0xB1, - 0xB5, 0x05, 0x1A, 0x8F, 0x6F, 0xE3, 0x92, 0x64, 0xE2, 0x2D, 0x8A, 0x20, 0x7D, 0x88, 0x3A, 0x37, 0x24, 0x05, 0x1C, 0x41, 0xF3, 0xED, 0x3C, 0xA5, 0x5D, 0x8B, - 0x6D, 0x3F, 0x3C, 0x19, 0x40, 0x03, 0x71, 0x05, 0x40, 0x43, 0x9F, 0x7A, 0x8D, 0x84, 0x96, 0xB8, 0x65, 0x58, 0x05, 0x59, 0x85, 0x88, 0x69, 0x99, 0x97, 0xC4, - 0xCC, 0x42, 0xE9, 0x1A, 0x41, 0x56, 0xBE, 0x0C, 0x10, 0xC9, 0xD3, 0x0B, 0xCD, 0x9D, 0x3B, 0x0E, 0xD8, 0x20, 0xB2, 0x00, 0x36, 0x28, 0xDF, 0x55, 0x86, 0xE8, - 0xFF, 0xDC, 0x78, 0x16, 0x51, 0x9E, 0x90, 0xC0, 0xA3, 0x47, 0x49, 0x6C, 0xB8, 0xC8, 0xC0, 0xCA, 0xF8, 0xA8, 0x37, 0xD6, 0xFE, 0xD2, 0x73, 0x47, 0xF6, 0x38, - 0xCE, 0xB3, 0x9C, 0x24, 0x48, 0xD6, 0x0F, 0x13, 0x82, 0x97, 0x6A, 0x1C, 0x20, 0xC4, 0xB6, 0xA8, 0x80, 0xE8, 0x8B, 0x39, 0x33, 0xB3, 0xB1, 0x4F, 0xA9, 0xD5, - 0xD7, 0x09, 0x7F, 0x65, 0x5F, 0x03, 0xE4, 0x8F, 0xC6, 0x1C, 0x5F, 0x10, 0xF5, 0x4E, 0xD4, 0x95, 0x8C, 0x71, 0x9C, 0xC0, 0x88, 0x8C, 0xA5, 0xE8, 0xC6, 0x1F, - 0xC5, 0x87, 0x2F, 0xAF, 0xE2, 0x2F, 0xD0, 0x92, 0x3F, 0x02, 0x4A, 0x3B, 0x07, 0x34, 0xF8, 0x82, 0x2D, 0x29, 0xB5, 0x67, 0x6B, 0x03, 0xDA, 0x30, 0x07, 0x09, - 0xED, 0x20, 0x8B, 0xA4, 0x90, 0x72, 0xF1, 0xF6, 0x62, 0x85, 0x40, 0x28, 0xBA, 0xC5, 0x10, 0x45, 0x41, 0x7B, 0x85, 0xC3, 0x22, 0x54, 0xA9, 0x9D, 0x8F, 0x0A, - 0x84, 0xCC, 0x11, 0xEB, 0x6C, 0x63, 0x1F, 0x1B, 0xA2, 0x23, 0x72, 0xEE, 0x63, 0xC9, 0xEB, 0xB9, 0x3D, 0x69, 0xA9, 0x4D, 0xD2, 0x99, 0x7E, 0x06, 0x5A, 0xAB, - 0x2B, 0xA8, 0x87, 0xA6, 0xAF, 0xF0, 0x29, 0x81, 0x88, 0x87, 0xE8, 0x42, 0xB2, 0x7C, 0x15, 0x6E, 0x1D, 0x4D, 0x5F, 0xCB, 0x76, 0xC6, 0x92, 0x6C, 0x9C, 0x61, - 0x63, 0x43, 0xBE, 0xA3, 0x9C, 0xD3, 0xD5, 0xE4, 0xEF, 0x0B, 0xCA, 0x99, 0x61, 0xCB, 0x74, 0x53, 0x80, 0x93, 0x2D, 0xEB, 0xA6, 0x91, 0xCE, 0x87, 0x53, 0x3B, - 0x54, 0x20, 0xAC, 0x75, 0x6B, 0xEB, 0x64, 0x2E, 0xD9, 0xCB, 0x59, 0xA4, 0xA4, 0x45, 0x3D, 0x20, 0x4A, 0x4C, 0xC7, 0xD3, 0xEF, 0x71, 0x78, 0xCE, 0xD3, 0x1B, - 0xC3, 0xC7, 0x49, 0x76, 0x54, 0x70, 0x6A, 0xF1, 0x87, 0xA1, 0x60, 0xAB, 0x96, 0x14, 0x45, 0x72, 0xDD, 0x52, 0xAC, 0x15, 0x26, 0xC7, 0x00, 0xF2, 0x62, 0xD9, - 0xEF, 0x3E, 0x01, 0xB8, 0x00, 0x27, 0x35, 0xB4, 0xEF, 0xFF, 0xA2, 0x28, 0x6E, 0xB5, 0x11, 0x44, 0x99, 0x60, 0x42, 0x2C, 0xBA, 0x24, 0x11, 0xE2, 0x27, 0x39, - 0x71, 0xC1, 0x27, 0xB1, 0x4E, 0x79, 0xFB, 0x7B, 0x64, 0x21, 0x51, 0x92, 0x2A, 0x1D, 0xA6, 0xD0, 0xE5, 0xEC, 0xE2, 0x11, 0x0A, 0x2B, 0xEC, 0x15, 0x93, 0x52, - 0xF8, 0x63, 0x11, 0xC8, 0x69, 0x43, 0x35, 0x04, 0xDD, 0xFC, 0x08, 0x75, 0x4F, 0xCA, 0x4C, 0x1B, 0x7C, 0x80, 0x05, 0x1A, 0xB0, 0x44, 0xA8, 0x64, 0x3A, 0xC2, - 0x61, 0x14, 0x13, 0x53, 0x42, 0xC2, 0x8C, 0x19, 0xCE, 0x4B, 0xF9, 0x5A, 0x2F, 0xAF, 0x1F, 0x22, 0x59, 0xFC, 0x11, 0xC0, 0xB0, 0xA8, 0xF1, 0x20, 0x12, 0x43, - 0x16, 0x07, 0x76, 0x20, 0x21, 0x48, 0x88, 0x28, 0x4F, 0x4C, 0xC9, 0xED, 0xD6, 0xB5, 0x38, 0x52, 0xE5, 0x8E, 0xEA, 0x34, 0x39, 0xD3, 0xD2, 0x34, 0x4B, 0xFB, - 0xFD, 0x8D, 0x9A, 0xCC, 0xBF, 0xF8, 0x0C, 0x8C, 0x14, 0xF1, 0x1A, 0xEB, 0x90, 0x93, 0x19, 0x5C, 0x96, 0x90, 0x72, 0x87, 0x65, 0xB6, 0xF8, 0x41, 0x78, 0xA3, - 0xF8, 0xA0, 0x98, 0xCD, 0x0C, 0x2F, 0xE5, 0x5A, 0x30, 0x62, 0x30, 0x71, 0x96, 0x1C, 0xED, 0x49, 0xE2, 0x51, 0xD6, 0x81, 0xB9, 0xE2, 0x62, 0xD6, 0xC5, 0xDC, - 0xF5, 0xC6, 0x26, 0x8B, 0xC2, 0x89, 0x57, 0xFA, 0x1C, 0x02, 0x95, 0x57, 0x0C, 0x70, 0x19, 0x3D, 0x77, 0x52, 0x0A, 0x19, 0x3F, 0xA3, 0x22, 0xE1, 0xA0, 0x0F, - 0xA0, 0x54, 0x5B, 0x17, 0xA1, 0x4D, 0x13, 0xA0, 0x88, 0xB5, 0x1C, 0x36, 0xB1, 0x4B, 0x5D, 0x82, 0x97, 0x53, 0x4F, 0x11, 0xBC, 0xB4, 0x31, 0x5D, 0x82, 0xA6, - 0x7E, 0x5F, 0x0E, 0x2C, 0x3F, 0xED, 0x22, 0xD3, 0x6E, 0xDC, 0x54, 0x00, 0x8E, 0x1F, 0xD1, 0x91, 0x40, 0x45, 0x36, 0x2B, 0x02, 0x8C, 0x5E, 0x8A, 0x52, 0x93, - 0xF4, 0x1B, 0x84, 0xDE, 0x8C, 0x6D, 0xCE, 0x4F, 0x85, 0xA1, 0x05, 0x9D, 0x25, 0x6D, 0xE3, 0xFD, 0x3A, 0x2F, 0xAE, 0x64, 0xD9, 0x26, 0x97, 0x42, 0xE4, 0x4D, - 0xFE, 0xB5, 0x64, 0x65, 0x4C, 0xA7, 0x59, 0x95, 0x3D, 0xA0, 0xA5, 0xB4, 0x03, 0xDF, 0x64, 0xC9, 0x20, 0x7A, 0xA0, 0x05, 0x63, 0x15, 0x1E, 0xFE, 0xCE, 0xFA, - 0xC4, 0xE4, 0x9D, 0xB0, 0xA9, 0x46, 0x29, 0x2D, 0xDE, 0x2C, 0x4D, 0x4A, 0x3C, 0x15, 0xC5, 0xFC, 0x3B, 0xC0, 0x2C, 0xC0, 0x5F, 0x90, 0xF0, 0x40, 0x93, 0xED, - 0x2D, 0x27, 0x28, 0xC7, 0x62, 0xE2, 0x51, 0x30, 0x49, 0xBC, 0x94, 0xC9, 0xD8, 0xD3, 0x50, 0x4F, 0x3F, 0x9B, 0x43, 0x48, 0x5E, 0x2F, 0xC0, 0xF9, 0xC0, 0xDB, - 0x17, 0xF5, 0xC6, 0x6D, 0x11, 0x3B, 0x4C, 0x5C, 0xB1, 0xED, 0x54, 0x25, 0x82, 0xA6, 0x09, 0x35, 0xB6, 0x84, 0x7C, 0xD4, 0xE8, 0x64, 0x87, 0xB9, 0x72, 0xC5, - 0xE0, 0x26, 0x4F, 0xB0, 0x17, 0x59, 0xD1, 0xB2, 0xFA, 0x36, 0x81, 0x20, 0x4E, 0x00, 0x19, 0x62, 0x53, 0x25, 0xAC, 0x64, 0x17, 0xA2, 0x81, 0xA0, 0x5D, 0xF6, - 0xC1, 0x1C, 0xDA, 0x93, 0xD5, 0x7F, 0xAA, 0x5C, 0x64, 0x02, 0x88, 0x9C, 0x29, 0x07, 0x05, 0x3E, 0x45, 0x65, 0x1A, 0xEE, 0x8D, 0x11, 0xC8, 0x4E, 0x63, 0x02, - 0x41, 0x21, 0xE1, 0x7E, 0x53, 0xD7, 0x59, 0x03, 0x9D, 0x3B, 0x00, 0x3B, 0x6B, 0xD3, 0x6D, 0x27, 0x38, 0x8E, 0x41, 0x1B, 0xA0, 0x27, 0x89, 0xDB, 0xEC, 0x43, - 0xD1, 0xE2, 0x3E, 0x3B, 0x63, 0x0D, 0xA2, 0x5E, 0xF0, 0xD3, 0xCC, 0x6D, 0x63, 0x36, 0x23, 0xAE, 0x75, 0x39, 0xB1, 0x1D, 0xAB, 0xCE, 0x40, 0xA3, 0x07, 0x6D, - 0x7C, 0x8D, 0x7E, 0xE6, 0x98, 0x3E, 0xD4, 0xC1, 0xB1, 0x82, 0x37, 0x5F, 0xB2, 0x6B, 0xF5, 0x5A, 0xCF, 0x12, 0xCF, 0xE4, 0xF0, 0x66, 0x6D, 0xCB, 0x37, 0x16, - 0x6F, 0xF0, 0x99, 0x3F, 0x6A, 0x0E, 0xCD, 0x4E, 0xB3, 0xC3, 0x1B, 0x84, 0x50, 0x6C, 0x09, 0x91, 0x23, 0x5E, 0x7C, 0x36, 0xEA, 0x97, 0x0F, 0x6F, 0x63, 0xBC, - 0xA1, 0xF7, 0x82, 0x5D, 0xAA, 0xD7, 0xE8, 0x43, 0x83, 0x87, 0x7F, 0xCC, 0x70, 0xA9, 0x59, 0xA4, 0x19, 0x49, 0x8C, 0xF8, 0x3C, 0x20, 0x8A, 0x8A, 0x35, 0xFF, - 0x41, 0x46, 0x0A, 0x97, 0x5D, 0xC8, 0x13, 0x68, 0xEE, 0x75, 0x15, 0xA8, 0x78, 0x5A, 0x10, 0xC1, 0x91, 0x93, 0x97, 0x30, 0xBC, 0xFD, 0x27, 0x31, 0x7C, 0xD0, - 0xC7, 0x81, 0x56, 0xD7, 0x3B, 0xFA, 0x41, 0x9D, 0x5E, 0x7F, 0x07, 0xEC, 0x4C, 0xEA, 0x8D, 0x83, 0x6E, 0xA3, 0xD1, 0x0E, 0x40, 0x67, 0xA4, 0xDE, 0xEA, 0x89, - 0x26, 0xF0, 0x87, 0xB6, 0x61, 0x9D, 0xE4, 0xDF, 0x7F, 0xED, 0xCD, 0xFD, 0xA0, 0xA8, 0xC1, 0x3B, 0xDB, 0xC5, 0x4C, 0x5C, 0xD4, 0xE4, 0x1A, 0x06, 0x2F, 0xAE, - 0x95, 0x69, 0xA2, 0xD3, 0x87, 0x1C, 0xC5, 0x48, 0x93, 0x3E, 0xFB, 0x05, 0x25, 0xBF, 0x54, 0xEC, 0xF3, 0x7A, 0x93, 0xE0, 0x4C, 0x79, 0x5D, 0xAC, 0x5D, 0xDD, - 0xCA, 0xC6, 0x11, 0x57, 0x74, 0x7C, 0xAE, 0x21, 0xA3, 0xFF, 0x54, 0xC0, 0xE2, 0x35, 0x52, 0x66, 0x0E, 0xBD, 0x4A, 0x19, 0xAA, 0xAC, 0xAF, 0x0A, 0xEB, 0xD1, - 0xE4, 0x44, 0x73, 0x7A, 0x8C, 0x9D, 0xAC, 0x3D, 0x2F, 0xE7, 0xE0, 0xE3, 0x53, 0x11, 0x51, 0xD9, 0x35, 0x1C, 0x70, 0x46, 0xA1, 0x1F, 0x06, 0xA0, 0x45, 0xF9, - 0x08, 0x6E, 0x4B, 0x19, 0x8C, 0x8F, 0x56, 0x4B, 0x00, 0xA4, 0x57, 0x89, 0x4B, 0xB0, 0xD2, 0x28, 0xB8, 0xB0, 0x5E, 0x48, 0xBF, 0xFC, 0x9A, 0xA2, 0x00, 0xAC, - 0x59, 0xCE, 0x15, 0x51, 0x06, 0xDA, 0x35, 0xA2, 0xA0, 0x87, 0x40, 0x7C, 0xD8, 0x26, 0x85, 0xBC, 0x9C, 0x61, 0x7D, 0x76, 0x48, 0x9F, 0x8A, 0x85, 0x79, 0x43, - 0xF9, 0xEC, 0x30, 0xFE, 0x56, 0x32, 0x10, 0xF1, 0x51, 0x81, 0x58, 0x84, 0xA4, 0x58, 0xDE, 0x44, 0x96, 0xB7, 0x98, 0xCE, 0x28, 0x81, 0x90, 0xBF, 0x7D, 0xC0, - 0xC4, 0x45, 0x2A, 0x8A, 0x8B, 0x70, 0x71, 0x21, 0x40, 0x3C, 0xC2, 0x2D, 0x9F, 0x5B, 0x89, 0xEC, 0xFF, 0xD7, 0xE7, 0x31, 0x67, 0x8B, 0x61, 0x21, 0x9D, 0x7C, - 0xEE, 0x42, 0x62, 0xAF, 0x18, 0x20, 0xF1, 0x81, 0x24, 0xC6, 0xD6, 0x62, 0x58, 0x8D, 0x2D, 0x31, 0xF7, 0x81, 0x00, 0x31, 0x5B, 0xEA, 0x19, 0x12, 0xC1, 0x4A, - 0xF4, 0xB2, 0x32, 0xCD, 0x70, 0x2D, 0x2D, 0xFA, 0x4C, 0x76, 0x44, 0x2C, 0x7B, 0xD3, 0x57, 0x69, 0xB9, 0xC9, 0x9A, 0x49, 0x4C, 0x46, 0x73, 0x2C, 0xA5, 0xA0, - 0x51, 0x4B, 0x09, 0x3A, 0xA2, 0xA3, 0x10, 0x5A, 0x34, 0x62, 0x45, 0x63, 0x74, 0x5A, 0x49, 0x58, 0x51, 0xEB, 0xD8, 0x71, 0x62, 0x04, 0x62, 0x8E, 0xE6, 0x38, - 0x3D, 0xA7, 0xC7, 0x06, 0x2F, 0x8C, 0xD9, 0xD4, 0x10, 0x45, 0x6E, 0x10, 0xB1, 0x94, 0x68, 0x13, 0x39, 0x08, 0x83, 0xCF, 0x23, 0xB3, 0x94, 0x14, 0xB6, 0xE6, - 0xA9, 0xBF, 0x77, 0x08, 0xCE, 0x87, 0xF0, 0x7D, 0x8C, 0xB8, 0x07, 0xD1, 0xF3, 0x35, 0xC7, 0x5B, 0x10, 0x5C, 0xBF, 0x14, 0x8F, 0x9B, 0x68, 0x43, 0x02, 0x31, - 0x95, 0xB0, 0x59, 0x2D, 0x8C, 0x41, 0xE1, 0xC4, 0x0E, 0x60, 0x10, 0x8E, 0x9F, 0xB3, 0x24, 0x0F, 0xF5, 0x28, 0x21, 0x96, 0xB2, 0x97, 0x9D, 0xED, 0x4F, 0x88, - 0x93, 0xC1, 0xC4, 0xB2, 0x7C, 0xC8, 0x79, 0xCC, 0x04, 0xA2, 0xA2, 0x79, 0xB4, 0x35, 0x44, 0x18, 0xDD, 0xFE, 0x6A, 0xA5, 0xA8, 0x66, 0xA0, 0x54, 0x90, 0x11, - 0x58, 0x2C, 0xCB, 0x98, 0xD7, 0x8C, 0x34, 0x55, 0x93, 0x95, 0x05, 0x1A, 0xC5, 0x39, 0x7B, 0x65, 0x94, 0xCF, 0xD7, 0x0A, 0x93, 0x38, 0x4B, 0xAC, 0xEC, 0x77, - 0x7E, 0x28, 0x76, 0x16, 0xB0, 0x33, 0x2C, 0x18, 0x07, 0x0F, 0xCE, 0x0F, 0x27, 0xE1, 0xD4, 0x19, 0x3C, 0xF8, 0x5F, 0x94, 0x18, 0xA6, 0xBF, 0xBA, 0xAB, 0x00, - 0x00 +//File: index_ov2640.html.gz, Size: 6578 +#define index_ov2640_html_gz_len 6578 +const unsigned char index_ov2640_html_gz[] = { + 0x1F, 0x8B, 0x08, 0x08, 0x99, 0xA8, 0x7B, 0x67, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x5F, 0x6F, 0x76, 0x32, 0x36, 0x34, 0x30, 0x2E, 0x68, 0x74, 0x6D, + 0x6C, 0x00, 0xED, 0x3D, 0x6B, 0x73, 0xDB, 0x46, 0x92, 0xDF, 0xFD, 0x2B, 0x60, 0x24, 0x6B, 0x92, 0x65, 0x92, 0x22, 0x29, 0x4A, 0x96, 0x15, 0x89, 0x3E, 0x5B, + 0x56, 0x6C, 0xD7, 0xDA, 0x89, 0xD7, 0x4A, 0x1C, 0x6F, 0xA5, 0xB6, 0x6C, 0x10, 0x18, 0x92, 0x88, 0x41, 0x80, 0x0B, 0x80, 0xA2, 0x98, 0x94, 0x7E, 0xC7, 0xFD, + 0xA0, 0xFB, 0x63, 0xD7, 0x3D, 0x0F, 0x60, 0x00, 0x0C, 0x5E, 0xA4, 0x4C, 0x7A, 0x7D, 0x47, 0xA7, 0x22, 0x3C, 0x7A, 0x7A, 0xFA, 0xDD, 0x3D, 0x33, 0x18, 0xE0, + 0xEC, 0xBE, 0xE5, 0x99, 0xE1, 0x7A, 0x41, 0xB4, 0x59, 0x38, 0x77, 0x46, 0xF7, 0xCE, 0xD8, 0x1F, 0x0D, 0x7E, 0x67, 0x33, 0x62, 0x58, 0xEC, 0x90, 0x9E, 0xCE, + 0x49, 0x68, 0x68, 0xE6, 0xCC, 0xF0, 0x03, 0x12, 0x9E, 0xEB, 0xCB, 0x70, 0xD2, 0x39, 0xD1, 0xD3, 0xB7, 0x5D, 0x63, 0x4E, 0xCE, 0xF5, 0x6B, 0x9B, 0xAC, 0x16, + 0x9E, 0x1F, 0xEA, 0x9A, 0xE9, 0xB9, 0x21, 0x71, 0x01, 0x7C, 0x65, 0x5B, 0xE1, 0xEC, 0xDC, 0x22, 0xD7, 0xB6, 0x49, 0x3A, 0xF4, 0xA4, 0x6D, 0xBB, 0x76, 0x68, + 0x1B, 0x4E, 0x27, 0x30, 0x0D, 0x87, 0x9C, 0xF7, 0x65, 0x5C, 0xA1, 0x1D, 0x3A, 0x64, 0x74, 0x79, 0xF5, 0xF6, 0x70, 0xA0, 0xFD, 0xFC, 0x7E, 0x30, 0x3C, 0xEE, + 0x9D, 0x1D, 0xB0, 0x6B, 0x31, 0x4C, 0x10, 0xAE, 0xE5, 0x73, 0xFC, 0x8D, 0x3D, 0x6B, 0xAD, 0xFD, 0x95, 0xB8, 0x84, 0xBF, 0x09, 0x10, 0xD1, 0x99, 0x18, 0x73, + 0xDB, 0x59, 0x9F, 0x6A, 0x4F, 0x7D, 0xE8, 0xB3, 0xFD, 0x92, 0x38, 0xD7, 0x24, 0xB4, 0x4D, 0xA3, 0x1D, 0x18, 0x6E, 0xD0, 0x09, 0x88, 0x6F, 0x4F, 0x7E, 0xC8, + 0x34, 0x1C, 0x1B, 0xE6, 0xE7, 0xA9, 0xEF, 0x2D, 0x5D, 0xEB, 0x54, 0xFB, 0xAE, 0x7F, 0x82, 0xFF, 0xB2, 0x40, 0xA6, 0xE7, 0x78, 0x3E, 0xDC, 0xBF, 0xFC, 0x11, + 0xFF, 0x65, 0xEF, 0xD3, 0xDE, 0x03, 0xFB, 0x4F, 0x72, 0xAA, 0xF5, 0x8F, 0x17, 0x37, 0x89, 0xFB, 0xB7, 0xF7, 0x12, 0xA7, 0xB3, 0x41, 0x1E, 0xF5, 0xBC, 0xFD, + 0x49, 0x71, 0xFB, 0x80, 0x98, 0xA1, 0xED, 0xB9, 0xDD, 0xB9, 0x61, 0xBB, 0x0A, 0x4C, 0x96, 0x1D, 0x2C, 0x1C, 0x03, 0x64, 0x30, 0x71, 0x48, 0x21, 0x9E, 0xEF, + 0xE6, 0xC4, 0x5D, 0xB6, 0x4B, 0xB0, 0x21, 0x92, 0x8E, 0x65, 0xFB, 0x0C, 0xEA, 0x14, 0xE5, 0xB0, 0x9C, 0xBB, 0xA5, 0x68, 0x8B, 0xE8, 0x72, 0x3D, 0x97, 0x28, + 0x04, 0x88, 0x1D, 0xAD, 0x7C, 0x63, 0x81, 0x00, 0xF8, 0x37, 0x0B, 0x32, 0xB7, 0x5D, 0x66, 0x54, 0xA7, 0xDA, 0xE1, 0xB0, 0xB7, 0xB8, 0x29, 0x51, 0xE5, 0xE1, + 0x31, 0xFE, 0xCB, 0x02, 0x2D, 0x0C, 0xCB, 0xB2, 0xDD, 0xE9, 0xA9, 0x76, 0xA2, 0x44, 0xE1, 0xF9, 0x16, 0xF1, 0x3B, 0xBE, 0x61, 0xD9, 0xCB, 0xE0, 0x54, 0x1B, + 0xAA, 0x60, 0xE6, 0x86, 0x3F, 0x05, 0x5A, 0x42, 0x0F, 0x88, 0xED, 0xF4, 0x95, 0x94, 0x70, 0x10, 0xDF, 0x9E, 0xCE, 0x42, 0x50, 0x69, 0x06, 0x26, 0x2D, 0x34, + 0xEE, 0x42, 0x65, 0xFA, 0x2C, 0x94, 0x9B, 0x5A, 0x6A, 0x86, 0x63, 0x4F, 0xDD, 0x8E, 0x1D, 0x92, 0x39, 0xB0, 0x13, 0x84, 0x3E, 0x09, 0xCD, 0x59, 0x11, 0x29, + 0x13, 0x7B, 0xBA, 0xF4, 0x89, 0x82, 0x90, 0x48, 0x6E, 0x05, 0x0C, 0xC3, 0xCD, 0xEC, 0xAD, 0xCE, 0x8A, 0x8C, 0x3F, 0xDB, 0x61, 0x87, 0xCB, 0x64, 0x4C, 0x26, + 0x9E, 0x4F, 0x94, 0x90, 0x02, 0xC2, 0xF1, 0xCC, 0xCF, 0x9D, 0x20, 0x34, 0xFC, 0xB0, 0x0A, 0x42, 0x63, 0x12, 0x12, 0xBF, 0x1C, 0x1F, 0x41, 0xAB, 0x28, 0xC7, + 0x96, 0xDF, 0x2D, 0x07, 0xB0, 0x5D, 0xC7, 0x76, 0x49, 0x75, 0xF2, 0xF2, 0xFA, 0x4D, 0xA2, 0x63, 0x50, 0x15, 0x14, 0x63, 0xCF, 0xA7, 0x45, 0x56, 0x42, 0x79, + 0xCD, 0x76, 0xC6, 0xFD, 0xA6, 0xDF, 0xEB, 0xFD, 0x2D, 0x7B, 0x73, 0x46, 0x98, 0x99, 0x1A, 0xCB, 0xD0, 0xDB, 0xDE, 0x23, 0x32, 0x6E, 0x95, 0xE2, 0xE3, 0xBF, + 0xE6, 0xC4, 0xB2, 0x0D, 0xAD, 0x29, 0xB9, 0xF3, 0x49, 0x0F, 0x6C, 0xAA, 0xA5, 0x19, 0xAE, 0xA5, 0x35, 0x3D, 0xDF, 0x06, 0x47, 0x30, 0x68, 0xB8, 0x71, 0xE0, + 0x0A, 0x24, 0x8E, 0x05, 0x69, 0x29, 0x58, 0x2E, 0xF0, 0x19, 0x59, 0x22, 0x6A, 0xB7, 0xC1, 0x5F, 0x85, 0x90, 0x83, 0xBF, 0x52, 0x07, 0x52, 0xF0, 0x48, 0xD1, + 0x17, 0xE9, 0x4B, 0xA6, 0x30, 0x4F, 0x67, 0xF8, 0x9B, 0x1B, 0x37, 0x9D, 0x42, 0xDD, 0x09, 0x20, 0xA1, 0x43, 0x48, 0xB3, 0x66, 0x13, 0x40, 0xAF, 0x67, 0x5A, + 0x47, 0xC3, 0x28, 0xD9, 0x52, 0xB7, 0xE1, 0x48, 0xD5, 0x2A, 0xC7, 0x9F, 0x6C, 0x14, 0x35, 0xD8, 0x55, 0xB3, 0x1A, 0xC7, 0x0E, 0xF6, 0x4F, 0x65, 0x43, 0x8C, + 0x93, 0xDC, 0x28, 0x82, 0xBF, 0xEA, 0x91, 0x24, 0x46, 0x56, 0x1A, 0x4D, 0x14, 0x88, 0xF3, 0x23, 0x4A, 0x06, 0x6F, 0x9E, 0x77, 0x2B, 0xB0, 0x16, 0x93, 0x50, + 0x35, 0xBA, 0x28, 0x10, 0x17, 0xD1, 0x50, 0x1A, 0x65, 0xF0, 0x77, 0x5B, 0xA1, 0xDE, 0xF8, 0x6E, 0xBC, 0x0C, 0x43, 0xCF, 0x0D, 0xB6, 0x4A, 0x51, 0x79, 0x7E, + 0xF6, 0xC7, 0x32, 0x08, 0xED, 0xC9, 0xBA, 0xC3, 0x5D, 0x1A, 0xFC, 0x6C, 0x61, 0x40, 0x09, 0x39, 0x26, 0xE1, 0x8A, 0x90, 0xE2, 0x72, 0xC3, 0x35, 0xAE, 0x21, + 0xEE, 0x4C, 0xA7, 0x8E, 0xCA, 0xF6, 0xCC, 0xA5, 0x1F, 0x60, 0xDD, 0xB6, 0xF0, 0x6C, 0x40, 0xEC, 0x67, 0x3B, 0x4E, 0xFA, 0x60, 0xC5, 0x8E, 0x3A, 0xE6, 0x58, + 0xD1, 0x97, 0xB7, 0x0C, 0x51, 0xC6, 0x4A, 0x4D, 0x78, 0xC0, 0x8E, 0x1D, 0xAE, 0x95, 0xF7, 0xB8, 0x27, 0x2A, 0xEE, 0x08, 0x17, 0x2C, 0x4C, 0x0B, 0x49, 0xBA, + 0x4E, 0xCD, 0x19, 0x31, 0x3F, 0x13, 0xEB, 0x61, 0x69, 0x19, 0x56, 0x56, 0x1E, 0x76, 0x6D, 0x77, 0xB1, 0x0C, 0x3B, 0x58, 0x4E, 0x2D, 0xBE, 0x88, 0xCE, 0xA9, + 0x41, 0x0A, 0x16, 0x07, 0x83, 0xA2, 0xA2, 0xE2, 0x68, 0x71, 0x53, 0x2C, 0x04, 0x99, 0xD8, 0x91, 0x63, 0x8C, 0x89, 0x53, 0x44, 0x32, 0x77, 0x86, 0x9C, 0xB0, + 0xCB, 0x63, 0x55, 0x7E, 0xED, 0x46, 0x29, 0x8B, 0x93, 0xD7, 0xF0, 0xD1, 0xDF, 0x2A, 0xCB, 0x91, 0x1E, 0xB7, 0x13, 0x97, 0x02, 0xE2, 0x80, 0x83, 0xE5, 0x95, + 0xDE, 0x00, 0xB3, 0x02, 0x1A, 0x0A, 0x3B, 0xF0, 0x0D, 0x77, 0x4A, 0x20, 0x16, 0xDC, 0xB4, 0xC5, 0x61, 0xF1, 0xC0, 0xA0, 0x12, 0xFB, 0x18, 0xAA, 0x8F, 0x8A, + 0x07, 0x22, 0x2C, 0x20, 0xB4, 0xB5, 0x2E, 0x3B, 0xD8, 0xA0, 0x2A, 0x91, 0xF4, 0x5B, 0x48, 0x48, 0x5F, 0x69, 0x1D, 0xAC, 0x30, 0x51, 0x7A, 0x4E, 0xD2, 0xB6, + 0x94, 0x85, 0x7E, 0x69, 0x68, 0x10, 0x43, 0xBE, 0xC9, 0xA4, 0x6C, 0xD0, 0x38, 0x99, 0x1C, 0xF6, 0x0E, 0x87, 0xA5, 0x95, 0x93, 0x92, 0xCB, 0xD4, 0xC0, 0x51, + 0x11, 0x3A, 0xA2, 0xB0, 0x52, 0x68, 0x04, 0x81, 0x71, 0xAD, 0x2C, 0xDA, 0xBD, 0xC0, 0x66, 0x23, 0x37, 0x63, 0x1C, 0xC0, 0xD8, 0x2D, 0x54, 0x0C, 0xBD, 0xB8, + 0xA1, 0x0F, 0x94, 0xF4, 0xD1, 0x92, 0x4E, 0xE9, 0x02, 0x42, 0xBC, 0x6A, 0xB2, 0x13, 0x1A, 0x50, 0x83, 0x48, 0x0A, 0x56, 0x16, 0x95, 0x21, 0xB9, 0x09, 0x3B, + 0x16, 0x31, 0x3D, 0x9F, 0x55, 0x83, 0x39, 0x23, 0xC7, 0x94, 0x22, 0xCB, 0x2D, 0xF6, 0x74, 0xE6, 0x5D, 0x13, 0x5F, 0x21, 0xAC, 0x94, 0x52, 0x87, 0x8F, 0x87, + 0x56, 0x05, 0x6C, 0x06, 0xA4, 0x47, 0xA5, 0xEC, 0x93, 0xE8, 0x06, 0x7D, 0x73, 0x50, 0xE8, 0xC7, 0x0C, 0x5D, 0x17, 0x7C, 0xC6, 0x18, 0x3B, 0xC4, 0x2A, 0xC8, + 0x66, 0x16, 0x99, 0x18, 0x4B, 0x27, 0x2C, 0xB1, 0x4A, 0xA3, 0x87, 0xFF, 0x8A, 0x7A, 0xA4, 0x61, 0xE8, 0x77, 0x9C, 0x17, 0x3A, 0xA7, 0x81, 0xE3, 0x5F, 0x8A, + 0x3E, 0x45, 0xA9, 0x61, 0x2C, 0x16, 0xC4, 0x00, 0x28, 0x93, 0xE4, 0xE9, 0xA1, 0xD2, 0x10, 0x43, 0x1D, 0xE7, 0x2B, 0x8D, 0xDB, 0x4B, 0x1D, 0x36, 0x2A, 0x1E, + 0x6B, 0xF1, 0x7C, 0x3A, 0xF1, 0xCC, 0xA5, 0xAA, 0xAA, 0xA9, 0xE6, 0x78, 0x59, 0x7C, 0xA7, 0x42, 0x64, 0x81, 0x63, 0x53, 0xF7, 0x5F, 0xBA, 0x2E, 0x6A, 0xB4, + 0x13, 0xFA, 0xC0, 0xA6, 0xA2, 0xA3, 0x6A, 0x82, 0xDB, 0x28, 0x86, 0x25, 0x04, 0x9B, 0x37, 0x77, 0x95, 0x0A, 0x53, 0x8A, 0x70, 0x1A, 0x45, 0x5A, 0x0D, 0x62, + 0x88, 0x6D, 0x09, 0x54, 0xDB, 0xC9, 0x25, 0x9C, 0x2D, 0xE7, 0xAA, 0x3A, 0x4A, 0x74, 0xD6, 0x87, 0xA4, 0xCF, 0xBA, 0xF3, 0xA7, 0x63, 0xA3, 0xD9, 0x6B, 0xF7, + 0xDA, 0x87, 0xF0, 0x3F, 0xC5, 0x78, 0xA6, 0xD8, 0xB8, 0xB8, 0x78, 0x73, 0x2C, 0x2F, 0x15, 0xA2, 0xCB, 0xA7, 0x95, 0xF2, 0x82, 0x7D, 0xA9, 0x2E, 0xAA, 0x7B, + 0x52, 0x72, 0x7E, 0xA9, 0xDF, 0x2D, 0xC9, 0xC3, 0x39, 0x26, 0x5D, 0xDF, 0x10, 0x15, 0xD6, 0x52, 0x57, 0xC5, 0x73, 0xEF, 0xCF, 0x0E, 0x2B, 0x42, 0xFE, 0xCF, + 0x5B, 0xBB, 0x24, 0x8A, 0x6F, 0xDA, 0xD2, 0x6B, 0xCB, 0x25, 0xD8, 0xB7, 0x6D, 0xF4, 0xF2, 0xB5, 0xDE, 0xE1, 0x55, 0x1F, 0x50, 0xE8, 0xC2, 0x18, 0xD4, 0x87, + 0xC1, 0x68, 0x6E, 0x65, 0x28, 0xC1, 0x6C, 0x20, 0x83, 0x89, 0xED, 0x38, 0x1D, 0xC7, 0x5B, 0x95, 0x57, 0x22, 0xC5, 0x96, 0x9C, 0xB1, 0xD3, 0x72, 0x93, 0xDF, + 0x94, 0xDA, 0x25, 0x44, 0xAE, 0xFF, 0x08, 0x6A, 0xBF, 0x6D, 0x87, 0x2B, 0x74, 0x8D, 0xCD, 0x12, 0xC5, 0x06, 0xF6, 0xB8, 0x5D, 0x47, 0x95, 0x4C, 0x89, 0x55, + 0x82, 0xC5, 0xC3, 0x9E, 0x95, 0x1D, 0x9A, 0xB3, 0x0D, 0x86, 0x9E, 0xF1, 0xC0, 0xC8, 0x27, 0x8E, 0x81, 0x15, 0xFC, 0x46, 0x33, 0x14, 0xA5, 0xC3, 0x37, 0xB9, + 0x79, 0x15, 0x4E, 0xA8, 0xE8, 0xBE, 0x9E, 0xD9, 0xA5, 0x2E, 0xAB, 0x1D, 0xF2, 0x63, 0xB5, 0xDA, 0xAC, 0x4B, 0xCA, 0xFD, 0xA4, 0x67, 0xA8, 0x81, 0x6A, 0x44, + 0x74, 0x11, 0xB4, 0xA7, 0x3E, 0x59, 0x57, 0x60, 0xA6, 0xCD, 0xFF, 0x9E, 0xB2, 0xF9, 0xE3, 0xCD, 0xA7, 0x4A, 0x68, 0x02, 0xE0, 0x56, 0xD4, 0x1D, 0x06, 0x15, + 0xBA, 0xCE, 0xEF, 0xB2, 0x8A, 0x3D, 0x46, 0xB3, 0xA3, 0xBA, 0x5E, 0x21, 0xDC, 0x14, 0xA4, 0x50, 0xB5, 0xA9, 0x8A, 0xEC, 0xAB, 0x1E, 0xCF, 0x93, 0x49, 0x98, + 0xB3, 0xF8, 0x43, 0xEB, 0xD4, 0xC3, 0xE2, 0xE8, 0xD6, 0x91, 0x66, 0x53, 0x4A, 0x23, 0x47, 0x34, 0x89, 0x99, 0x6F, 0x7D, 0x4A, 0xCC, 0x18, 0x3D, 0x6B, 0x23, + 0xCF, 0x57, 0x89, 0x28, 0x9F, 0xA9, 0x9A, 0x01, 0x66, 0xCE, 0x53, 0x3E, 0xA8, 0x87, 0x7C, 0x68, 0x0E, 0x8E, 0x95, 0x6B, 0x2B, 0x05, 0xC0, 0x45, 0xA4, 0xE5, + 0xCE, 0x02, 0x66, 0x53, 0x56, 0xEE, 0x00, 0x59, 0x8E, 0x45, 0x4A, 0x45, 0x15, 0x7B, 0x65, 0x51, 0x84, 0xC9, 0xCE, 0x64, 0x15, 0x1A, 0xBB, 0x3D, 0x37, 0xA0, + 0xEC, 0x45, 0x73, 0x35, 0x00, 0xA3, 0x4A, 0x7F, 0x55, 0xCC, 0x5D, 0x9A, 0x63, 0xED, 0x1F, 0xF7, 0x4A, 0xBA, 0x34, 0x1D, 0x2F, 0xD8, 0x72, 0x02, 0x2C, 0x7F, + 0xFE, 0x4B, 0x79, 0xA7, 0x52, 0xEA, 0x2E, 0xF4, 0xA9, 0x62, 0x77, 0x4C, 0xC9, 0xBC, 0xDF, 0x53, 0x46, 0xDA, 0xC2, 0x59, 0x4A, 0x3A, 0x83, 0x46, 0xD7, 0x2F, + 0x4F, 0x35, 0x93, 0xA8, 0xC3, 0x68, 0x72, 0xA2, 0xAE, 0xCA, 0x54, 0x69, 0xA1, 0x1E, 0x66, 0xB6, 0x65, 0x91, 0xC2, 0xB9, 0x60, 0x1C, 0xF3, 0x56, 0x2C, 0x1E, + 0x90, 0x7E, 0xD5, 0xA4, 0xD4, 0x17, 0x71, 0x8A, 0xC2, 0xC7, 0x1A, 0xFA, 0x5F, 0xDA, 0x63, 0x78, 0xA2, 0xC9, 0x9B, 0x49, 0x4F, 0x96, 0x22, 0x85, 0xA4, 0x2A, + 0x9D, 0x3B, 0x9A, 0x6B, 0x45, 0x91, 0x81, 0x1C, 0x10, 0x2A, 0x1B, 0xCD, 0x53, 0x54, 0xD1, 0x85, 0x94, 0x2E, 0x5F, 0x5B, 0xE2, 0xCB, 0x80, 0x9D, 0xBC, 0xD5, + 0x95, 0x3B, 0x5C, 0x6A, 0xA3, 0x16, 0x90, 0xEE, 0x37, 0x57, 0x34, 0x7B, 0xAA, 0x8C, 0x0A, 0x88, 0x8C, 0x52, 0x8C, 0x78, 0xB8, 0x2A, 0x09, 0xB5, 0xA9, 0x73, + 0x9C, 0x1D, 0x48, 0x4F, 0xC3, 0x9D, 0x1D, 0xC4, 0x0F, 0xEE, 0x9D, 0xE1, 0x23, 0x71, 0xF2, 0x43, 0x73, 0xBC, 0x1F, 0xD3, 0x31, 0x82, 0xE0, 0x5C, 0xC7, 0x47, + 0xBB, 0xF4, 0xE4, 0x33, 0x74, 0x67, 0x96, 0x7D, 0xAD, 0xD9, 0xD6, 0xB9, 0xEE, 0x78, 0x53, 0x2F, 0x75, 0x8F, 0xDE, 0x67, 0x5A, 0x86, 0x3C, 0x76, 0xAE, 0x27, + 0xD6, 0x17, 0x75, 0xDA, 0x2A, 0xBE, 0xA4, 0x8F, 0x1E, 0x7C, 0xF7, 0xF8, 0xD1, 0xA3, 0xE3, 0x1F, 0x1E, 0xB8, 0xE3, 0x60, 0xC1, 0xFF, 0xFF, 0x0B, 0x5B, 0x8E, + 0xFD, 0xF9, 0xFD, 0xE0, 0x78, 0x08, 0xC3, 0x3D, 0x12, 0x86, 0x60, 0x7A, 0xC1, 0xD9, 0x01, 0x45, 0x9A, 0x22, 0xE4, 0x00, 0x28, 0xC9, 0xA1, 0x8D, 0x97, 0x3B, + 0x2A, 0xF2, 0x04, 0x48, 0x00, 0x19, 0x7C, 0x6C, 0xF8, 0x0A, 0x10, 0x0A, 0xC6, 0x8A, 0x69, 0x1A, 0x4A, 0x74, 0xAA, 0x93, 0xB1, 0x77, 0x93, 0xE6, 0x80, 0x32, + 0xC5, 0x15, 0xC6, 0xA1, 0x88, 0x95, 0x87, 0x10, 0x9A, 0xD1, 0xE6, 0xB8, 0xB8, 0x0A, 0x30, 0x4A, 0xA0, 0x84, 0x0A, 0x10, 0xF8, 0xC6, 0x74, 0x3E, 0x0B, 0xDD, + 0xEB, 0x42, 0x29, 0xAE, 0x17, 0xB2, 0x50, 0x99, 0xD3, 0x55, 0x82, 0x55, 0xDE, 0x46, 0x5A, 0x36, 0x64, 0x5C, 0x80, 0x68, 0x3B, 0x14, 0x3B, 0xBB, 0x56, 0x8C, + 0x89, 0x62, 0x93, 0xF4, 0x2A, 0x1A, 0xEB, 0xA3, 0x0F, 0x17, 0xAF, 0xFF, 0xAE, 0xBD, 0x79, 0xF9, 0xA7, 0x52, 0x43, 0x65, 0x44, 0x61, 0x8C, 0xAE, 0xD0, 0x33, + 0x6D, 0xC6, 0xF4, 0x21, 0x64, 0xA2, 0x73, 0xCD, 0x50, 0x0C, 0x98, 0xED, 0x1D, 0xE2, 0x4E, 0xC3, 0xD9, 0xB9, 0xDE, 0xD7, 0xF1, 0x91, 0x16, 0x71, 0x36, 0xD0, + 0x35, 0x8C, 0xDF, 0xF4, 0xE0, 0xDA, 0x70, 0x96, 0x78, 0xD4, 0xAB, 0xC2, 0x6B, 0xD6, 0xB4, 0x94, 0x60, 0x3C, 0xB0, 0x44, 0x32, 0x96, 0x02, 0x71, 0x52, 0xCA, + 0xFA, 0xE8, 0x8A, 0x84, 0x67, 0x07, 0xEC, 0x56, 0x89, 0xD6, 0x8A, 0xFB, 0x06, 0x4F, 0x66, 0xE6, 0x50, 0x64, 0x42, 0x45, 0x8A, 0x9F, 0xF8, 0xC6, 0x9C, 0xA0, + 0x54, 0x2A, 0x69, 0x5E, 0xD6, 0x7A, 0xD4, 0x52, 0x1F, 0xBD, 0x23, 0xB4, 0x20, 0x02, 0x32, 0x2A, 0x29, 0xFE, 0x8C, 0xD7, 0xA8, 0x89, 0xFE, 0x23, 0x7B, 0xE6, + 0x6B, 0x52, 0x1D, 0x83, 0x99, 0x79, 0x05, 0xB9, 0xDF, 0xEF, 0x74, 0xB4, 0xC1, 0x9B, 0xB7, 0x5A, 0xA7, 0x53, 0x01, 0xD8, 0x5B, 0x50, 0x77, 0xE2, 0xFA, 0xEF, + 0x1F, 0xE9, 0xA3, 0x5F, 0x3F, 0xBC, 0x78, 0xDA, 0x84, 0xBA, 0xB0, 0x77, 0xD3, 0x1F, 0xF4, 0x7A, 0xAD, 0xB3, 0x03, 0x06, 0x52, 0x1F, 0xD7, 0x10, 0xF4, 0x4A, + 0x71, 0x0D, 0x4E, 0x00, 0x57, 0x6F, 0x30, 0xDC, 0x02, 0xD7, 0xA1, 0x3E, 0x7A, 0xF9, 0x9C, 0x61, 0x7A, 0x34, 0xD8, 0x86, 0xA8, 0x01, 0x78, 0x25, 0xD2, 0x04, + 0xE4, 0xDC, 0x3C, 0x3A, 0x3E, 0xD9, 0x02, 0x53, 0x1F, 0xD8, 0x7B, 0x0F, 0xA8, 0x4E, 0x40, 0x52, 0xC7, 0x5B, 0x09, 0x0A, 0x9C, 0x0E, 0x11, 0x41, 0x4C, 0xBF, + 0x19, 0x9E, 0x6C, 0x81, 0xE8, 0x31, 0x08, 0x09, 0x11, 0x01, 0x92, 0x9B, 0xC3, 0x6D, 0xA4, 0x74, 0xA2, 0x8F, 0x2E, 0x5E, 0xFD, 0xD8, 0x1C, 0x02, 0x67, 0x83, + 0xC7, 0xC7, 0x75, 0xF0, 0x80, 0xED, 0x25, 0x51, 0x3D, 0xD2, 0x47, 0x40, 0x0A, 0x92, 0x23, 0xB0, 0x80, 0x59, 0x32, 0x1B, 0xFD, 0xD5, 0x0D, 0x96, 0x0B, 0x7C, + 0xD0, 0x9D, 0x58, 0x1A, 0x34, 0xF0, 0xAE, 0x69, 0x56, 0xDB, 0xC0, 0x6A, 0x8F, 0xF5, 0xD1, 0x3F, 0x90, 0x6F, 0xEC, 0x68, 0x30, 0xDC, 0x82, 0x6F, 0xB0, 0x7E, + 0x68, 0x8F, 0x38, 0x36, 0x46, 0x01, 0x46, 0xFF, 0x92, 0x12, 0x83, 0x88, 0xFA, 0x8F, 0x6A, 0x09, 0x2F, 0x89, 0x09, 0x4C, 0xFE, 0x1F, 0xA8, 0x05, 0x40, 0x72, + 0xD3, 0x1F, 0x6E, 0xE1, 0x3C, 0x60, 0xF2, 0xE0, 0x38, 0xE0, 0xCD, 0x27, 0x9B, 0x9B, 0x28, 0xD0, 0x42, 0xB9, 0x82, 0xB8, 0x80, 0x61, 0x61, 0x73, 0x62, 0xC0, + 0xD6, 0x1F, 0x1F, 0xDF, 0x3C, 0x3E, 0xAE, 0x86, 0x00, 0xE3, 0x39, 0xC6, 0xC6, 0xA2, 0x88, 0x5F, 0x9C, 0x10, 0x8A, 0x82, 0xFD, 0xBF, 0x97, 0x30, 0x84, 0x0B, + 0xD7, 0xB5, 0x43, 0x3D, 0x6F, 0x07, 0x32, 0x61, 0x07, 0xD5, 0xA2, 0xBC, 0x44, 0x49, 0xF4, 0x34, 0x91, 0x3E, 0x1A, 0x56, 0xC8, 0xA6, 0x89, 0x72, 0x8B, 0xB6, + 0x4D, 0xD0, 0x4F, 0x53, 0x3C, 0x5A, 0x1E, 0x26, 0x77, 0xF0, 0x86, 0x43, 0x5D, 0x8A, 0x2C, 0x1B, 0xA5, 0x11, 0x05, 0xAD, 0xC6, 0x8D, 0x3E, 0x3A, 0x3E, 0x2C, + 0x4D, 0xBF, 0x9B, 0x2B, 0x63, 0x4C, 0x27, 0x0B, 0x5C, 0x12, 0x04, 0xB5, 0xF5, 0x11, 0x37, 0xD5, 0x47, 0xCF, 0xA2, 0xE3, 0x6D, 0xB4, 0xD2, 0x19, 0x6C, 0xA1, + 0x16, 0x89, 0x1C, 0xA6, 0x99, 0xCE, 0x80, 0xAB, 0x26, 0x2E, 0xB4, 0xEE, 0x56, 0x31, 0x65, 0xD4, 0x6E, 0xA3, 0x17, 0x1C, 0x2C, 0xF8, 0x46, 0x10, 0xD6, 0xD6, + 0x8A, 0x68, 0x08, 0xB9, 0x84, 0x1F, 0xED, 0x4D, 0x23, 0x11, 0x29, 0xDF, 0x80, 0x3E, 0x02, 0x23, 0x5C, 0xB2, 0xE7, 0xB6, 0x6A, 0x6B, 0x24, 0x6E, 0x0A, 0xA5, + 0x4B, 0x74, 0xBC, 0x37, 0xAD, 0x48, 0xE4, 0x7C, 0x0B, 0x7A, 0x59, 0x10, 0xD3, 0x36, 0x9C, 0x8F, 0x64, 0x32, 0x81, 0x84, 0x55, 0x5F, 0x37, 0x89, 0xE6, 0xA0, + 0x1F, 0x76, 0xAE, 0x5D, 0xD2, 0xF3, 0xDA, 0xE3, 0x88, 0x14, 0xBA, 0xCD, 0x07, 0x13, 0xE9, 0xEC, 0xCD, 0x27, 0xD4, 0x09, 0x1D, 0xBE, 0xB1, 0x23, 0x7D, 0xF4, + 0x93, 0x17, 0xD1, 0xB9, 0x79, 0x81, 0xF1, 0x13, 0x99, 0xD2, 0xF9, 0xEA, 0x6D, 0xEA, 0x9C, 0x17, 0xBE, 0xB1, 0xA6, 0x1B, 0x22, 0xB7, 0xA9, 0xBA, 0xDE, 0x41, + 0x3D, 0xFA, 0x8B, 0xED, 0x6E, 0xCE, 0xCC, 0x10, 0x09, 0x21, 0xC4, 0xDD, 0x0E, 0x0B, 0x14, 0xA3, 0xCF, 0xE0, 0x60, 0x3B, 0x24, 0xC7, 0x38, 0xB6, 0x5E, 0xD8, + 0xC6, 0xD7, 0x50, 0x6E, 0x19, 0xAB, 0x71, 0x6D, 0xB7, 0x80, 0x36, 0xFA, 0xE8, 0xE9, 0x6F, 0xCF, 0x6A, 0x07, 0x29, 0xB6, 0xEA, 0x5B, 0xC5, 0xC2, 0xE3, 0xB9, + 0x13, 0xEC, 0x2C, 0x33, 0xA9, 0xA5, 0xF6, 0x9C, 0xAA, 0x13, 0x5B, 0x0A, 0xBE, 0x04, 0x81, 0x74, 0x91, 0x4C, 0x97, 0xD8, 0xAC, 0xC6, 0xE3, 0x97, 0x8B, 0x60, + 0x40, 0xC4, 0xC7, 0xA9, 0x61, 0xD7, 0xCF, 0x2B, 0xA2, 0x21, 0xD5, 0x94, 0xF6, 0x02, 0x8E, 0x76, 0xA5, 0x2E, 0xD6, 0xED, 0xDE, 0x74, 0xC6, 0xB9, 0xDE, 0xB7, + 0xE2, 0x80, 0x90, 0xB9, 0x67, 0xD5, 0x9F, 0xB2, 0xE2, 0xED, 0xF4, 0x11, 0x68, 0xED, 0x0D, 0x1C, 0xD4, 0xCE, 0x32, 0x02, 0xC1, 0x17, 0x4E, 0x2F, 0x4F, 0x97, + 0xA1, 0xB7, 0x4D, 0x66, 0xB9, 0x5A, 0xBA, 0xEE, 0x7A, 0x9B, 0xB4, 0x72, 0xE1, 0x78, 0x4B, 0x6B, 0x73, 0x0C, 0x90, 0x53, 0x7E, 0x9E, 0x4C, 0x6C, 0x73, 0xF3, + 0xAC, 0x84, 0xB3, 0x0A, 0xDE, 0xBC, 0x62, 0xFB, 0x2F, 0x1C, 0xC5, 0x89, 0x59, 0x3F, 0x40, 0x10, 0x13, 0xB4, 0x78, 0x79, 0xA1, 0x5D, 0x5D, 0xFE, 0x74, 0xF5, + 0xF3, 0xBB, 0xDD, 0x44, 0x07, 0xE8, 0x73, 0x4F, 0x81, 0x01, 0xB9, 0xDD, 0x77, 0x4C, 0x00, 0x22, 0x06, 0x9B, 0xE8, 0x69, 0xC0, 0x14, 0xF5, 0xFC, 0xEA, 0xED, + 0xAE, 0xB4, 0x34, 0xD8, 0x9F, 0x9A, 0x06, 0x5F, 0x83, 0x9E, 0x3E, 0x3A, 0xE4, 0x9A, 0x38, 0x1B, 0xE8, 0x8A, 0x35, 0x44, 0x7D, 0x69, 0xAF, 0xF1, 0x68, 0x6F, + 0x03, 0xB9, 0x88, 0x94, 0x6F, 0x60, 0x18, 0x07, 0x56, 0xF1, 0x91, 0x12, 0xBD, 0x89, 0xF3, 0xB0, 0x96, 0xFA, 0xE8, 0xF2, 0x66, 0xE1, 0x05, 0x4B, 0xBF, 0x62, + 0x42, 0x55, 0x6B, 0xA4, 0xB7, 0x95, 0x42, 0x04, 0x29, 0x4C, 0x23, 0x3D, 0xAE, 0x10, 0x5C, 0xD0, 0x91, 0xD6, 0xFA, 0x86, 0x77, 0xAA, 0x15, 0x44, 0xFE, 0x25, + 0x15, 0x33, 0xDD, 0x20, 0xEF, 0x4C, 0x31, 0xEF, 0xBC, 0xB8, 0xD8, 0x4D, 0x28, 0x9B, 0xEE, 0x2D, 0xE1, 0x4C, 0xF7, 0x9A, 0x70, 0x34, 0xBE, 0xDE, 0x2E, 0xA4, + 0xB0, 0xE1, 0x20, 0x82, 0x37, 0x84, 0xB1, 0xF3, 0x26, 0x03, 0x08, 0xC9, 0x73, 0xFA, 0x37, 0xDB, 0xB8, 0x8E, 0x20, 0x23, 0xE9, 0x39, 0x87, 0xB1, 0xDF, 0x1C, + 0xDD, 0xA9, 0xD7, 0x1C, 0x96, 0x52, 0xBB, 0x8D, 0xD3, 0x20, 0x27, 0x26, 0xB1, 0x1D, 0xDC, 0x76, 0x5D, 0x57, 0x21, 0x52, 0x5B, 0xA6, 0x13, 0xED, 0x82, 0x9D, + 0x6D, 0xA3, 0x9B, 0xC1, 0x36, 0xBA, 0x91, 0x29, 0x4A, 0xAA, 0xE7, 0xF8, 0x0B, 0x65, 0x1A, 0x5C, 0x37, 0xFB, 0x92, 0x6B, 0x1E, 0x8B, 0xFA, 0x31, 0x0D, 0xDA, + 0xE8, 0xA3, 0x67, 0x6F, 0x77, 0x13, 0xD3, 0xB0, 0xB3, 0x8A, 0x31, 0x6D, 0xAB, 0x08, 0x46, 0x99, 0xDA, 0x77, 0x29, 0xB6, 0xDA, 0x40, 0x1B, 0x2B, 0x24, 0xFC, + 0xB7, 0x1D, 0x69, 0x63, 0x55, 0x5D, 0x1B, 0x77, 0x9C, 0x61, 0x56, 0x5F, 0x83, 0x7E, 0x7C, 0x63, 0xF5, 0x71, 0x3A, 0x37, 0x6A, 0xEB, 0x88, 0xB7, 0xD3, 0x47, + 0xEF, 0x8C, 0x95, 0xF6, 0xE2, 0xCD, 0xD3, 0x9D, 0xE8, 0x4A, 0x74, 0xBA, 0x1F, 0x7D, 0x45, 0x2C, 0xEF, 0x5B, 0x67, 0x0E, 0x71, 0xEB, 0x3B, 0x15, 0x36, 0xD2, + 0x47, 0xAF, 0x89, 0x1B, 0x68, 0x17, 0x9E, 0xCF, 0x5F, 0x91, 0xB7, 0x13, 0xAD, 0xD1, 0x9E, 0xF7, 0xA3, 0x32, 0xC6, 0xF4, 0xBE, 0xF5, 0x35, 0x9B, 0xDB, 0xBE, + 0xEF, 0xF9, 0xB5, 0x55, 0xC6, 0xDB, 0xE9, 0xA3, 0x97, 0x9D, 0x37, 0xF4, 0x68, 0x27, 0xEA, 0x12, 0xBD, 0xEE, 0x47, 0x63, 0x11, 0xCF, 0xFB, 0x56, 0xDA, 0xF5, + 0xC4, 0xB1, 0x17, 0xB5, 0x55, 0x46, 0x5B, 0xE9, 0xA3, 0xF7, 0x9D, 0x1F, 0xE1, 0xEF, 0x4E, 0xD4, 0xC5, 0x7A, 0xDC, 0x8F, 0xB2, 0x38, 0xB7, 0xFB, 0x56, 0x95, + 0x65, 0xAE, 0x6A, 0x2B, 0x0A, 0xDA, 0xE8, 0xA3, 0xE7, 0x17, 0xBF, 0x69, 0xCD, 0xE7, 0xDE, 0xCA, 0xC5, 0x87, 0x43, 0xB5, 0xCB, 0x9F, 0x5A, 0x3B, 0xD1, 0x18, + 0x76, 0xBD, 0x1F, 0x7D, 0x51, 0xA6, 0xF7, 0xAD, 0x2D, 0xBA, 0x07, 0x68, 0x6C, 0xD4, 0x0F, 0x87, 0xA2, 0x21, 0x3E, 0xFB, 0x02, 0x47, 0xDA, 0x33, 0x63, 0x37, + 0x01, 0x31, 0xEA, 0x77, 0x17, 0x45, 0x7B, 0xCC, 0xE4, 0xBE, 0xF5, 0xE4, 0x10, 0xAB, 0x82, 0x8A, 0x92, 0x25, 0x86, 0xF5, 0x11, 0xB7, 0xD3, 0xE0, 0x36, 0xD3, + 0x35, 0xD4, 0x1A, 0x97, 0xCF, 0xB5, 0x57, 0xE2, 0xB4, 0x02, 0x37, 0x1B, 0xCF, 0xD9, 0xE5, 0x0D, 0x6D, 0x93, 0xF4, 0x24, 0x07, 0xB7, 0x83, 0xA3, 0xA3, 0xED, + 0x86, 0xB7, 0x79, 0xD3, 0xA8, 0x47, 0x47, 0x5B, 0xEA, 0x44, 0xDE, 0x8C, 0xC1, 0xDF, 0x62, 0x58, 0xE6, 0x24, 0x7C, 0x53, 0x00, 0x1D, 0xCE, 0x93, 0xB0, 0x13, + 0x84, 0xB6, 0xE3, 0xE8, 0xA3, 0x17, 0x24, 0xD4, 0xAE, 0xF0, 0xB0, 0xE2, 0x2E, 0x00, 0x09, 0x8B, 0xD8, 0x02, 0x14, 0xFA, 0xC4, 0x98, 0xEB, 0xA3, 0x2B, 0x7C, + 0xBF, 0x23, 0xE0, 0xC2, 0xB3, 0x72, 0x64, 0x95, 0xF7, 0x0B, 0xD0, 0x0D, 0x42, 0xB8, 0xE3, 0x27, 0xF9, 0x3A, 0x56, 0x30, 0x7D, 0xB6, 0xFD, 0x6F, 0x74, 0x16, + 0x2C, 0x0C, 0x57, 0x80, 0xD1, 0xBD, 0x71, 0x2B, 0xBE, 0xD9, 0x69, 0xEC, 0x39, 0x16, 0x00, 0x3E, 0xB5, 0xAE, 0xF1, 0xD5, 0x34, 0x96, 0x76, 0x15, 0x6D, 0xDB, + 0xC1, 0x26, 0xE0, 0x3B, 0x02, 0x43, 0x89, 0xB0, 0x67, 0xBE, 0x40, 0xCF, 0x36, 0x58, 0xE1, 0xCB, 0x3C, 0x0A, 0xA4, 0x9D, 0xB3, 0xD3, 0xC8, 0x27, 0xD3, 0xC8, + 0x84, 0x54, 0x1B, 0xD0, 0x94, 0xFB, 0x8E, 0xDE, 0x91, 0xA9, 0x1D, 0x00, 0x8D, 0x1A, 0xE8, 0xE9, 0x80, 0xEE, 0xD5, 0x60, 0x1E, 0x52, 0x6D, 0x1F, 0x90, 0xDC, + 0x25, 0xDF, 0xC5, 0xA8, 0xDC, 0xDD, 0x55, 0x2B, 0x85, 0xA4, 0xF7, 0x62, 0x25, 0x31, 0x96, 0x59, 0xE1, 0xFD, 0x4E, 0x67, 0x36, 0xC4, 0x5D, 0x27, 0x9A, 0x60, + 0xED, 0xEC, 0x60, 0x36, 0x2C, 0x7B, 0xF4, 0xBC, 0x74, 0xCB, 0x10, 0x70, 0xBA, 0xF1, 0x8E, 0x21, 0x94, 0xD2, 0x08, 0xA8, 0x69, 0x6B, 0x6F, 0x8C, 0xE0, 0x73, + 0x5B, 0x7B, 0x8F, 0x0E, 0xBF, 0xC3, 0x8D, 0x43, 0x48, 0xBB, 0x61, 0x59, 0x7E, 0xEE, 0xE6, 0xA1, 0x61, 0x62, 0xF3, 0xD0, 0xB1, 0xD8, 0x3C, 0x24, 0x4D, 0xBD, + 0xDD, 0xF4, 0xFB, 0xFD, 0x2A, 0x9C, 0x57, 0xDC, 0x3F, 0x74, 0x27, 0x2C, 0xCD, 0x41, 0x98, 0x15, 0x59, 0x1A, 0x0A, 0x96, 0x86, 0x12, 0x4B, 0x27, 0x77, 0xB9, + 0x23, 0xEA, 0x4E, 0x38, 0xE2, 0x0B, 0x3B, 0x5F, 0x09, 0x4B, 0x95, 0x36, 0x79, 0x51, 0xDB, 0xBE, 0xAB, 0x3D, 0x5E, 0x14, 0x24, 0x1D, 0x0C, 0x8F, 0x0A, 0x63, + 0x21, 0x6D, 0xC2, 0x7C, 0xFE, 0xC5, 0x5D, 0xFA, 0xFC, 0x74, 0x0B, 0x9F, 0x9F, 0x66, 0x7C, 0x7E, 0x87, 0xCE, 0x2E, 0x08, 0xFF, 0xC6, 0x1C, 0x5E, 0xB0, 0x55, + 0xC3, 0xE9, 0x95, 0x6C, 0xED, 0xD6, 0x43, 0x22, 0x4B, 0x78, 0x71, 0x97, 0x1E, 0x92, 0x63, 0xB7, 0x1B, 0x19, 0x29, 0x8F, 0x39, 0xA3, 0xDD, 0xE4, 0x24, 0x5A, + 0x49, 0xC9, 0xEA, 0xE4, 0xBD, 0xE3, 0xCE, 0xA3, 0xC3, 0x21, 0x2F, 0x9B, 0xEE, 0x42, 0x3D, 0xD5, 0x37, 0x93, 0xE6, 0x82, 0xDC, 0x4D, 0x51, 0x86, 0x1B, 0xDF, + 0x16, 0x50, 0x07, 0xD7, 0x2E, 0xCC, 0x2E, 0x5E, 0xFF, 0xBD, 0x5E, 0x2D, 0x96, 0xEE, 0x69, 0x77, 0xF5, 0xD8, 0x66, 0xD6, 0x2A, 0x0B, 0x8C, 0xD3, 0x0E, 0x11, + 0x07, 0xB7, 0x55, 0x0F, 0x3E, 0x44, 0x9C, 0x2B, 0x06, 0xCD, 0x52, 0x50, 0x88, 0x9A, 0xE5, 0x8D, 0x89, 0x69, 0x20, 0xE4, 0x93, 0x18, 0x70, 0x2C, 0xE2, 0x9A, + 0xE6, 0x4D, 0x26, 0xF4, 0x5B, 0x3D, 0x8F, 0x30, 0x60, 0x04, 0x9F, 0xF1, 0x7A, 0xAF, 0x1F, 0x91, 0xA4, 0x1A, 0x11, 0xC7, 0x14, 0x46, 0xB4, 0x51, 0x13, 0xE3, + 0x86, 0x76, 0x67, 0x22, 0x38, 0x64, 0x22, 0x78, 0xFE, 0xEA, 0xBD, 0x4A, 0x06, 0xCC, 0xD7, 0x7A, 0x59, 0x11, 0x1C, 0x6E, 0xBE, 0x31, 0xBC, 0x5F, 0x59, 0x5A, + 0xBD, 0x58, 0x5A, 0x87, 0x93, 0x78, 0xCF, 0xD8, 0x36, 0x21, 0x4B, 0x21, 0x81, 0x23, 0xF6, 0x54, 0xA8, 0xF6, 0x56, 0xF6, 0x80, 0x4A, 0x76, 0x70, 0x54, 0xC7, + 0x0E, 0xAC, 0xC3, 0x2D, 0xCC, 0xE0, 0x28, 0xC7, 0x0C, 0xEE, 0x4A, 0x06, 0x43, 0x7D, 0xF4, 0x76, 0x13, 0x33, 0x18, 0x56, 0x34, 0x83, 0x43, 0x61, 0x06, 0xF1, + 0x86, 0xC2, 0x61, 0x55, 0x61, 0x49, 0x56, 0xF0, 0x68, 0x82, 0xEB, 0xE8, 0x8F, 0xAA, 0x79, 0xC2, 0xEE, 0x62, 0xEE, 0xCA, 0x76, 0xEB, 0xC7, 0xDB, 0xDF, 0x6C, + 0xD7, 0xF2, 0x56, 0xF5, 0x42, 0xAE, 0xDC, 0xD1, 0xD7, 0x1E, 0x6E, 0xEB, 0x8D, 0x5A, 0x71, 0xAA, 0xA5, 0x73, 0x83, 0x95, 0xBD, 0x1B, 0x78, 0xBE, 0x96, 0x7D, + 0xED, 0x41, 0x62, 0x47, 0x92, 0x80, 0xAE, 0x56, 0x04, 0x64, 0x9F, 0xC1, 0x7E, 0xF5, 0xA3, 0xB6, 0xC1, 0x8E, 0x74, 0x05, 0x32, 0xBE, 0x71, 0x5F, 0xDB, 0x60, + 0xE7, 0xBE, 0x02, 0x5B, 0xCE, 0x33, 0xEB, 0xF8, 0x16, 0x05, 0x6D, 0xB3, 0xD7, 0x28, 0x94, 0x3E, 0xBE, 0xCD, 0xA0, 0x36, 0x4F, 0x29, 0xD1, 0xB8, 0x8C, 0x79, + 0x2B, 0xD4, 0x58, 0xD5, 0xF6, 0xDC, 0x52, 0x9C, 0x92, 0x01, 0xF0, 0xE6, 0x37, 0xF4, 0xF1, 0xF6, 0x80, 0x54, 0xDB, 0xA5, 0x96, 0x26, 0xAC, 0x46, 0x65, 0xF8, + 0xE1, 0x54, 0x0A, 0x66, 0x51, 0xE7, 0x35, 0x83, 0x59, 0x5C, 0xE7, 0x83, 0x31, 0xED, 0x7D, 0xF0, 0xF2, 0x4F, 0x05, 0x4B, 0xEB, 0xCD, 0x59, 0x3A, 0xBC, 0x2B, + 0x96, 0xB6, 0x48, 0x55, 0x91, 0x75, 0x85, 0x5E, 0x68, 0x38, 0x1B, 0x1B, 0x17, 0x6B, 0x0D, 0xB6, 0xC5, 0x62, 0xAE, 0x76, 0x05, 0xAC, 0xEE, 0xD4, 0xC0, 0x04, + 0x01, 0xD5, 0x94, 0x31, 0xCC, 0x2A, 0xE3, 0xE4, 0x6B, 0xB3, 0x2F, 0xC6, 0x51, 0x55, 0xF3, 0x52, 0x70, 0x74, 0xFC, 0x35, 0x99, 0x97, 0xB7, 0x0C, 0xF1, 0xEA, + 0xC6, 0xC1, 0x8B, 0x35, 0xC7, 0xE0, 0x45, 0x8F, 0x76, 0x6F, 0x60, 0x11, 0x05, 0x1B, 0xEB, 0xE3, 0xF0, 0x4E, 0xDF, 0xD7, 0x74, 0x17, 0x11, 0x8C, 0xB1, 0xB4, + 0x85, 0x89, 0x0D, 0x86, 0x3B, 0x34, 0x31, 0x69, 0x19, 0x89, 0xE7, 0x41, 0x5E, 0xC0, 0xE8, 0x7C, 0x6D, 0x20, 0x2E, 0x68, 0xEA, 0xAC, 0x24, 0xA9, 0xB3, 0xF2, + 0xD9, 0x01, 0x14, 0x85, 0x59, 0x04, 0x39, 0x74, 0x9E, 0xB1, 0xCF, 0xBE, 0xA9, 0x3B, 0x8C, 0x5F, 0xD3, 0x46, 0xD7, 0xB9, 0xE2, 0x17, 0x82, 0x46, 0x85, 0x66, + 0xFA, 0x45, 0xA1, 0xA5, 0xAF, 0x44, 0x3B, 0x33, 0xF8, 0x9E, 0xFC, 0x6B, 0xC2, 0x17, 0xE5, 0xB4, 0x99, 0x4F, 0x26, 0xE7, 0xFA, 0x77, 0x11, 0x4E, 0x2E, 0x2D, + 0x04, 0xD1, 0x35, 0x08, 0xC9, 0xAE, 0xE3, 0x19, 0x58, 0xAC, 0x1A, 0x8B, 0x10, 0x28, 0xED, 0xFE, 0xB1, 0xC0, 0x49, 0x5E, 0x03, 0x37, 0x70, 0x1B, 0xD5, 0xD6, + 0x71, 0xE9, 0xAB, 0x45, 0xF9, 0x4A, 0x3B, 0x1E, 0x46, 0x8B, 0x78, 0xFF, 0xF3, 0xDF, 0x65, 0x53, 0x33, 0xF8, 0xF1, 0xBF, 0x58, 0x00, 0x60, 0x46, 0xBE, 0x79, + 0xAE, 0x03, 0xA5, 0xBE, 0x17, 0x40, 0x29, 0x6A, 0x4F, 0xED, 0x1C, 0x55, 0xE5, 0x49, 0xFB, 0x40, 0x25, 0xEE, 0x14, 0xB0, 0x62, 0x6C, 0x72, 0x16, 0x98, 0xBE, + 0xBD, 0x80, 0x52, 0xCD, 0xF2, 0xCC, 0xE5, 0x9C, 0xB8, 0x61, 0xD7, 0xB0, 0xAC, 0xCB, 0x6B, 0x38, 0x78, 0x8D, 0x33, 0xCC, 0x20, 0xF9, 0x66, 0xE3, 0xF9, 0xCF, + 0x6F, 0x2E, 0xD8, 0x0B, 0xF7, 0x5E, 0x83, 0xBC, 0x88, 0xD5, 0x68, 0x6B, 0x93, 0xA5, 0xCB, 0xAA, 0xF7, 0x26, 0x41, 0x58, 0xF6, 0x11, 0xC6, 0x6B, 0xC3, 0xD7, + 0xC6, 0x46, 0x40, 0x5E, 0x7A, 0x41, 0xA8, 0x9D, 0x6B, 0x11, 0x46, 0xC7, 0x33, 0xE9, 0x4B, 0x12, 0xBA, 0x8C, 0x2F, 0x0E, 0xC9, 0x18, 0xFF, 0xD5, 0x77, 0x00, + 0x34, 0x6A, 0xF5, 0x50, 0x6B, 0x9C, 0x9E, 0xF4, 0x1B, 0x68, 0x7F, 0x51, 0x17, 0x13, 0xFC, 0xAC, 0x22, 0xC0, 0x35, 0x97, 0xBE, 0xD3, 0xD6, 0xCC, 0x71, 0x8B, + 0xBD, 0x24, 0x91, 0x5E, 0xC6, 0x6B, 0xE2, 0xED, 0xB9, 0xDD, 0x70, 0x46, 0xDC, 0x66, 0x4C, 0x19, 0x38, 0xC3, 0xC2, 0x73, 0x83, 0xC4, 0x17, 0x22, 0xED, 0x49, + 0x7C, 0xBD, 0x0B, 0x05, 0x7D, 0xB8, 0x0C, 0xB4, 0xFB, 0xE7, 0xE7, 0x1A, 0x16, 0xB8, 0x89, 0x97, 0x2F, 0x9A, 0xE3, 0x34, 0x5C, 0x5B, 0x4B, 0x5D, 0xF8, 0x05, + 0x42, 0x83, 0xF4, 0x9A, 0xDF, 0x5B, 0x8D, 0x38, 0xA9, 0xF7, 0xCC, 0x46, 0x0D, 0x30, 0x8A, 0x34, 0x5B, 0x49, 0x02, 0x9B, 0x96, 0x11, 0x1A, 0xAD, 0xE4, 0x0B, + 0x1F, 0xA1, 0x57, 0xA0, 0xA4, 0xAD, 0xD1, 0x5B, 0xF2, 0xDB, 0x27, 0x6F, 0x5B, 0x5D, 0x90, 0x21, 0xF0, 0x1B, 0xB5, 0x26, 0xBE, 0x9F, 0xFE, 0xF4, 0x25, 0xB4, + 0xEE, 0xF4, 0xDB, 0x1A, 0xDE, 0x49, 0xB6, 0x95, 0x88, 0xBC, 0x27, 0xAE, 0x09, 0xA1, 0x15, 0xA3, 0x55, 0xA0, 0x64, 0xE8, 0x6E, 0x13, 0x2A, 0x82, 0xD8, 0xF3, + 0x8E, 0x4C, 0x41, 0x62, 0xD3, 0x36, 0x1F, 0x40, 0xB7, 0xE9, 0xE8, 0xB9, 0xCD, 0x82, 0xA2, 0xA4, 0xB5, 0x83, 0x03, 0x70, 0x69, 0x08, 0x4A, 0x04, 0xAC, 0x62, + 0xDA, 0x6C, 0xF0, 0x05, 0x4C, 0xB0, 0xA8, 0x46, 0xEF, 0xA6, 0xF1, 0x10, 0x10, 0x74, 0x43, 0xEF, 0x2A, 0xF4, 0x6D, 0x77, 0x0A, 0x43, 0x8F, 0x56, 0x8C, 0x8D, + 0xDE, 0x46, 0x94, 0xA9, 0xFB, 0xF4, 0x3A, 0xED, 0x24, 0x7D, 0xA3, 0xC9, 0xAF, 0x3F, 0x6C, 0xB4, 0x1A, 0x9C, 0x78, 0x7A, 0x0E, 0xE6, 0xD6, 0x64, 0x07, 0x0F, + 0x28, 0x8D, 0x2D, 0xED, 0xEC, 0x8C, 0x77, 0xC3, 0xA0, 0xF0, 0x22, 0x00, 0xD1, 0x3F, 0xA9, 0x5B, 0x91, 0x29, 0x7E, 0xFA, 0xFE, 0x2F, 0x61, 0xB3, 0xB7, 0x07, + 0x40, 0xF5, 0x13, 0x9C, 0x41, 0xF8, 0xFE, 0x2F, 0xF8, 0xFF, 0xED, 0x03, 0x3A, 0x6D, 0xF0, 0xFD, 0x5F, 0xF8, 0xE7, 0xF6, 0x01, 0xF4, 0x04, 0xC7, 0xB4, 0xBF, + 0xDB, 0x4F, 0x54, 0x0E, 0x59, 0xE9, 0x4D, 0x73, 0xA5, 0x17, 0x89, 0xAD, 0x36, 0x4D, 0xD3, 0x02, 0xA2, 0x3E, 0xC5, 0xFE, 0xDB, 0x34, 0x3D, 0x0B, 0xD4, 0x13, + 0x82, 0x25, 0x0B, 0xA5, 0x3B, 0xA0, 0x12, 0x21, 0xA8, 0xE8, 0x0D, 0xA8, 0xF6, 0x84, 0x42, 0x6A, 0xDC, 0x55, 0x62, 0x03, 0x11, 0x90, 0x0B, 0xFC, 0x2C, 0xF8, + 0x2B, 0x37, 0x6C, 0x86, 0x09, 0xA7, 0xC8, 0x91, 0xF8, 0x68, 0x94, 0x60, 0x01, 0x7F, 0xD0, 0x0E, 0xE0, 0x1A, 0x5C, 0x69, 0x91, 0xB1, 0xDD, 0x8B, 0xEC, 0x30, + 0xA6, 0x94, 0xDD, 0xCC, 0xB1, 0xC3, 0x0F, 0xA6, 0xF3, 0xB9, 0x89, 0xEF, 0x64, 0x4C, 0x87, 0x8A, 0x8C, 0x88, 0x10, 0xE8, 0x09, 0xFE, 0x0F, 0xE4, 0x82, 0x7F, + 0x72, 0xF5, 0x03, 0x58, 0x59, 0x09, 0xDF, 0xA4, 0x53, 0x00, 0x1F, 0x6F, 0xDA, 0x1A, 0x3B, 0x58, 0x83, 0x67, 0xB8, 0x16, 0x9E, 0xE3, 0x9F, 0xB5, 0xD0, 0x1E, + 0x5E, 0xE0, 0x47, 0x70, 0x8D, 0xD6, 0xAC, 0x78, 0x89, 0x1D, 0x20, 0x14, 0xAD, 0x31, 0x28, 0x14, 0x3B, 0x82, 0x6B, 0xF8, 0xCE, 0x0F, 0xB0, 0xDD, 0xB6, 0x36, + 0xB6, 0x5D, 0x97, 0x1E, 0x94, 0x50, 0x1F, 0xA7, 0xFA, 0x27, 0xC1, 0x0D, 0x70, 0xC0, 0x49, 0xBB, 0x7D, 0x10, 0xAC, 0xA3, 0xB3, 0xF5, 0xED, 0x03, 0x82, 0xF7, + 0x28, 0x91, 0x70, 0xBC, 0xE6, 0xC7, 0x70, 0x1D, 0xE8, 0xC3, 0x3B, 0x82, 0x60, 0x7A, 0x61, 0x1D, 0x5F, 0x00, 0x88, 0x10, 0xEF, 0x73, 0xE2, 0xE1, 0x6C, 0x1D, + 0x9D, 0x61, 0x6B, 0xDA, 0x96, 0xB3, 0x01, 0xA7, 0xEB, 0xF8, 0x14, 0xEE, 0xB2, 0x0F, 0xBA, 0x03, 0x11, 0x8C, 0xA7, 0xDB, 0x07, 0x9C, 0x27, 0xB8, 0xC4, 0x8F, + 0xD2, 0xA2, 0xC6, 0x98, 0x10, 0xF2, 0x28, 0xF2, 0x8C, 0x25, 0x69, 0x29, 0x7F, 0x80, 0x7F, 0x5C, 0x3A, 0x04, 0x0F, 0x9F, 0xAD, 0x5F, 0x59, 0xCD, 0x06, 0x5F, + 0x90, 0x6D, 0x60, 0x0C, 0x93, 0xDB, 0x74, 0x3D, 0xD7, 0x74, 0x6C, 0x13, 0x1D, 0xA5, 0xD9, 0xD2, 0xCE, 0x47, 0x3C, 0x8E, 0xA1, 0x41, 0x03, 0xB8, 0x6C, 0xA4, + 0xB9, 0xA8, 0xC5, 0x92, 0x62, 0xA3, 0xD5, 0xA5, 0x76, 0xC8, 0x6D, 0x0D, 0x51, 0x70, 0x17, 0xAC, 0x86, 0x03, 0x81, 0x15, 0x38, 0x32, 0xDE, 0x52, 0x88, 0x84, + 0x42, 0x4B, 0x58, 0x28, 0x1A, 0x39, 0xD4, 0xF6, 0x52, 0x51, 0xB6, 0xC0, 0xAB, 0x85, 0x03, 0xDF, 0x4F, 0x3B, 0x30, 0xA8, 0xCA, 0x0F, 0x9B, 0x8D, 0x4B, 0x7C, + 0x10, 0xF8, 0xF7, 0xC6, 0x43, 0x04, 0x7A, 0xD8, 0xF8, 0xD7, 0xA9, 0xD6, 0x78, 0x28, 0x7B, 0xF2, 0x6D, 0xDA, 0xE5, 0x98, 0xC6, 0xA6, 0x15, 0x35, 0x36, 0x95, + 0x34, 0x36, 0xBD, 0x5B, 0x8D, 0xC9, 0x0B, 0xC1, 0xDB, 0x68, 0x4D, 0x5E, 0x79, 0x2D, 0xD0, 0x5C, 0x69, 0x7B, 0xAE, 0x34, 0xAE, 0xAD, 0xA9, 0x4A, 0x5B, 0x9B, + 0xA8, 0x89, 0xA5, 0x38, 0xF0, 0x1E, 0xE2, 0xBF, 0xFC, 0xE5, 0xCD, 0x6B, 0x0C, 0x95, 0x6A, 0x95, 0x45, 0x1A, 0x4B, 0x97, 0x23, 0x0A, 0x0C, 0x98, 0x3B, 0x13, + 0x81, 0x3B, 0x91, 0x43, 0x1F, 0x36, 0xB4, 0x26, 0x45, 0x89, 0x19, 0xB4, 0xC4, 0x10, 0x78, 0xE0, 0xAD, 0xE6, 0xBB, 0x18, 0x6C, 0x85, 0xF3, 0xC6, 0xAD, 0x0A, + 0x6C, 0x01, 0x1B, 0x54, 0x52, 0x22, 0xC3, 0x9C, 0x71, 0x18, 0x29, 0x27, 0xEC, 0xDC, 0x45, 0xA8, 0xBF, 0x06, 0x55, 0x83, 0x9A, 0x88, 0xE9, 0x71, 0x6C, 0x0B, + 0x4A, 0xA5, 0xC3, 0x23, 0x7F, 0x25, 0x01, 0xF1, 0x39, 0x6C, 0x85, 0x81, 0x8B, 0x4C, 0x50, 0x09, 0x8D, 0x98, 0xBA, 0xCC, 0xC7, 0xB3, 0xAE, 0x83, 0x67, 0xAD, + 0xC0, 0xC3, 0x33, 0x4F, 0x25, 0x34, 0x7C, 0xA2, 0x2B, 0x17, 0x4B, 0x35, 0x62, 0xF8, 0xE4, 0x92, 0x8A, 0x27, 0x9E, 0xE9, 0xAA, 0xF1, 0xC4, 0x27, 0x45, 0xF2, + 0xF1, 0x54, 0x94, 0x0D, 0x9F, 0x89, 0x50, 0xD8, 0x73, 0xBA, 0x1A, 0xE9, 0x89, 0xFF, 0x36, 0xAF, 0x3F, 0x26, 0x06, 0x44, 0x8B, 0xF8, 0xCF, 0x5E, 0xBC, 0x64, + 0xFA, 0x5E, 0x54, 0x8B, 0xC4, 0x51, 0x66, 0x03, 0xE2, 0x74, 0x8D, 0x10, 0xE2, 0x13, 0x8C, 0xE3, 0x49, 0xD0, 0xC5, 0x0A, 0x37, 0x12, 0x63, 0xE6, 0x56, 0xD7, + 0x05, 0x02, 0x28, 0xC2, 0xD6, 0x69, 0x2F, 0x6D, 0x9E, 0x19, 0x5C, 0xEC, 0x72, 0x1E, 0x3A, 0x76, 0x37, 0x07, 0x23, 0xCF, 0x30, 0xC9, 0x16, 0x78, 0x31, 0x0F, + 0x1B, 0x1D, 0xC5, 0x48, 0xB8, 0x06, 0x47, 0x47, 0xD9, 0x3C, 0xC3, 0x3B, 0xE0, 0x9F, 0x7E, 0x42, 0x0C, 0x38, 0x1F, 0x15, 0x0F, 0xCD, 0x4C, 0x28, 0x04, 0xB5, + 0x86, 0x58, 0xB2, 0x6B, 0x9C, 0x66, 0x2A, 0x6E, 0x68, 0xC1, 0x17, 0xE1, 0xB4, 0x27, 0x8C, 0xC6, 0xC4, 0x07, 0x0D, 0xC6, 0x30, 0xF8, 0x8E, 0xBE, 0x5B, 0xC4, + 0x90, 0xD1, 0x07, 0xAB, 0x23, 0x4C, 0xEC, 0x1A, 0x0E, 0x5C, 0x53, 0x97, 0xD8, 0xDA, 0x4E, 0xC7, 0x73, 0x89, 0xBA, 0xD7, 0x44, 0xFD, 0xCE, 0x3B, 0xE2, 0x67, + 0xFC, 0x89, 0xEF, 0xB8, 0x99, 0x4F, 0xC2, 0xA5, 0xEF, 0xF2, 0x7A, 0x3E, 0x5B, 0xDF, 0x28, 0x87, 0x92, 0x3B, 0xB4, 0xCD, 0x83, 0x03, 0xED, 0x69, 0x18, 0x1A, + 0xA0, 0x00, 0x5C, 0xA7, 0x9C, 0xA1, 0x7C, 0x34, 0x83, 0x4F, 0x4A, 0x78, 0x3E, 0x1A, 0x25, 0x7B, 0xA8, 0x98, 0x30, 0xBF, 0xC5, 0xCF, 0x3C, 0x09, 0x77, 0xA6, + 0xA8, 0xBA, 0xFF, 0x5E, 0x12, 0x7F, 0x7D, 0x45, 0x05, 0xE6, 0xF9, 0x4F, 0x1D, 0xA7, 0xD9, 0xE8, 0xC6, 0xCB, 0xCE, 0x0D, 0x36, 0x06, 0xEF, 0x02, 0xAA, 0x4B, + 0xE8, 0x03, 0x74, 0x1C, 0xDB, 0x3C, 0xE3, 0x26, 0xD2, 0x3B, 0x8C, 0xBB, 0xCE, 0xB9, 0x32, 0xD2, 0x83, 0x7E, 0x80, 0xF0, 0xDC, 0xCF, 0x64, 0xBD, 0x5C, 0x80, + 0xF8, 0xE3, 0x61, 0x7C, 0x6A, 0x62, 0x81, 0x4B, 0x87, 0x74, 0x01, 0xF2, 0x82, 0x0F, 0xE4, 0xFA, 0x87, 0x0A, 0xA0, 0x58, 0x05, 0xD4, 0x3A, 0xD1, 0x13, 0xB3, + 0x5F, 0xC1, 0xB8, 0xBD, 0xA7, 0x3E, 0x53, 0x4C, 0x81, 0x70, 0x02, 0xB9, 0xF0, 0x44, 0xF2, 0x4A, 0xF5, 0x90, 0x9A, 0x9E, 0xB8, 0x6D, 0xDD, 0x8B, 0x23, 0xC3, + 0x72, 0x61, 0x19, 0x21, 0x49, 0x06, 0x87, 0xC8, 0x16, 0xC4, 0xCD, 0xB9, 0x17, 0x92, 0x54, 0xC4, 0xB0, 0x5D, 0x3B, 0xB4, 0x0D, 0xE7, 0x7D, 0x6C, 0x8D, 0x5F, + 0xD4, 0xFD, 0x15, 0x3E, 0x5E, 0xC3, 0xFF, 0x33, 0x73, 0x10, 0xD5, 0xC6, 0xCD, 0x19, 0x0B, 0x89, 0xE2, 0x41, 0x6C, 0x25, 0xB2, 0x1C, 0x12, 0x61, 0x81, 0xDF, + 0x17, 0x3D, 0xDD, 0xBF, 0x4F, 0x8F, 0xEE, 0x45, 0x4A, 0x13, 0xD1, 0xE3, 0x5C, 0x8B, 0x6F, 0xA4, 0x14, 0x9C, 0xC5, 0x9D, 0xC2, 0x21, 0x90, 0x4B, 0x18, 0x98, + 0x6F, 0x45, 0xEA, 0x5D, 0x40, 0xB5, 0x89, 0xB6, 0xF0, 0xFF, 0x51, 0xFF, 0x2B, 0x8A, 0xFA, 0x5F, 0x2E, 0xC4, 0x17, 0xD8, 0x76, 0xCA, 0x03, 0x58, 0x3B, 0xF5, + 0xB4, 0xE0, 0xC3, 0x06, 0x54, 0x3B, 0xCA, 0x79, 0x3F, 0x1E, 0xBA, 0x63, 0xFB, 0x9A, 0xD9, 0x16, 0x23, 0x3A, 0xB6, 0x2C, 0x94, 0x11, 0x4E, 0xDF, 0xE3, 0x04, + 0x37, 0xCE, 0x76, 0x37, 0x1B, 0x6C, 0x6D, 0x81, 0xC6, 0xE3, 0xDB, 0xB8, 0x24, 0x99, 0x79, 0xAB, 0xA2, 0x96, 0x3E, 0x44, 0x9D, 0x6B, 0x92, 0x6A, 0x1C, 0xB5, + 0xE6, 0xDF, 0x6A, 0x2F, 0xED, 0x5A, 0x7C, 0xD3, 0x9D, 0x27, 0x03, 0x00, 0x88, 0xBE, 0xF2, 0x7E, 0xAE, 0x85, 0x3E, 0xF5, 0x1A, 0x09, 0x2D, 0x71, 0xCB, 0xB0, + 0x0A, 0xB2, 0x0A, 0x11, 0xD3, 0x32, 0x2F, 0x89, 0x99, 0x85, 0xD2, 0x1A, 0x41, 0x56, 0xBE, 0x0C, 0x2D, 0x92, 0xA7, 0xE7, 0x9A, 0xBB, 0x74, 0x1C, 0xB0, 0x41, + 0x64, 0x01, 0x6C, 0x50, 0xBE, 0xAB, 0x0C, 0xD1, 0xFF, 0xB9, 0xF1, 0x2C, 0xA2, 0x3C, 0x21, 0x81, 0x07, 0x0F, 0x92, 0xD8, 0x70, 0x91, 0x81, 0x95, 0xF1, 0x51, + 0x6F, 0x0C, 0xFE, 0xC2, 0x73, 0x27, 0xF6, 0x34, 0xCE, 0xB3, 0x9C, 0x24, 0x48, 0xD6, 0xF7, 0x13, 0x82, 0x97, 0x6A, 0x1C, 0x20, 0xC4, 0xB6, 0xA8, 0x80, 0xE8, + 0x9B, 0xFA, 0x32, 0xB3, 0xB1, 0x4F, 0xA8, 0xD5, 0x37, 0x09, 0x7F, 0x87, 0x57, 0x0B, 0xE4, 0x8F, 0xC6, 0x1C, 0x5F, 0x10, 0xF5, 0x4E, 0xD4, 0x95, 0x8C, 0x71, + 0x9A, 0xC0, 0x88, 0x8C, 0xA5, 0xE8, 0xC6, 0x1F, 0xC5, 0x87, 0x6F, 0xB3, 0xE1, 0x6F, 0xD4, 0x91, 0xBF, 0x60, 0x48, 0x3B, 0x07, 0x34, 0xF8, 0xC6, 0x1D, 0x29, + 0xB5, 0x67, 0x6B, 0x03, 0x0A, 0x98, 0x83, 0x84, 0x76, 0x90, 0x45, 0x52, 0x48, 0xB9, 0x78, 0x9D, 0xA9, 0x42, 0x20, 0x14, 0xDD, 0x6A, 0x8C, 0xA2, 0xA0, 0xBD, + 0xC2, 0x61, 0x2E, 0x2A, 0x2D, 0xB5, 0x97, 0x31, 0x83, 0x6E, 0xA4, 0x75, 0xFA, 0x02, 0x27, 0x80, 0xBE, 0xC0, 0xB5, 0xFB, 0x08, 0x73, 0x74, 0x21, 0x59, 0x54, + 0x0A, 0x67, 0x8B, 0x26, 0x95, 0x65, 0xED, 0xB3, 0xD4, 0x17, 0xE7, 0xBD, 0xD8, 0xBC, 0xEE, 0x28, 0x13, 0xF4, 0x35, 0xF9, 0x93, 0x65, 0x72, 0xBC, 0xDE, 0x32, + 0x09, 0x14, 0xE0, 0x64, 0x8B, 0xAD, 0x69, 0xA4, 0xCB, 0xF1, 0xDC, 0x0E, 0x15, 0x08, 0x1B, 0xFD, 0x46, 0x9D, 0x7C, 0x22, 0xFB, 0x1E, 0x8B, 0x5F, 0xB4, 0xD4, + 0x06, 0x44, 0x89, 0x49, 0x72, 0xFA, 0xDA, 0x7C, 0xCF, 0x79, 0x72, 0x6D, 0xF8, 0x38, 0xF5, 0x8D, 0x0A, 0x4E, 0x2D, 0xC9, 0x30, 0x14, 0x6C, 0x2D, 0x91, 0xA2, + 0x48, 0xAE, 0x26, 0x8A, 0x15, 0xBC, 0x64, 0x65, 0x2E, 0x2F, 0x61, 0x7D, 0xF2, 0x09, 0xB4, 0x0B, 0x70, 0xAA, 0x41, 0xFB, 0xFE, 0x2F, 0x8A, 0xE2, 0x56, 0x9B, + 0x80, 0xEF, 0x07, 0x33, 0x62, 0xD1, 0x85, 0x82, 0x10, 0xBF, 0xF2, 0x87, 0xCB, 0x30, 0x89, 0xD5, 0xC3, 0xDB, 0x4F, 0x91, 0x85, 0x44, 0xA9, 0xA3, 0x74, 0xF0, + 0x40, 0x17, 0x99, 0x8B, 0xC7, 0x0D, 0xAC, 0xDC, 0x56, 0x4C, 0x15, 0xE1, 0x8F, 0xC5, 0x05, 0xA7, 0xCB, 0x3E, 0x4D, 0xFE, 0x13, 0x54, 0x23, 0x29, 0x33, 0x6D, + 0xF1, 0x61, 0x0F, 0x68, 0xC0, 0x12, 0x01, 0x8C, 0xE9, 0x08, 0x07, 0x37, 0x4C, 0x4C, 0x09, 0x09, 0x33, 0x66, 0x38, 0x2F, 0xE5, 0x2B, 0xB0, 0x3C, 0xAB, 0x47, + 0xB2, 0xF8, 0x23, 0x80, 0xC1, 0x4A, 0xEB, 0x5E, 0x24, 0x86, 0x2C, 0x0E, 0xEC, 0x40, 0x42, 0x90, 0x10, 0x51, 0x9E, 0x98, 0x92, 0x3B, 0x8B, 0x1B, 0x71, 0xFC, + 0xC8, 0x1D, 0x6B, 0x69, 0x72, 0xFE, 0xA3, 0xC9, 0x8F, 0xF6, 0xFB, 0x3B, 0x35, 0x99, 0x7F, 0xF1, 0x79, 0x11, 0x29, 0x0E, 0xB5, 0xEA, 0x90, 0x93, 0x19, 0xF2, + 0x95, 0x90, 0x72, 0x87, 0xC5, 0xAF, 0xF8, 0x41, 0x78, 0xA3, 0xF8, 0xA0, 0xC4, 0xCC, 0x0C, 0xFA, 0xE4, 0x0A, 0x2D, 0x62, 0x30, 0x71, 0x96, 0x1C, 0x83, 0x49, + 0xE2, 0x51, 0x56, 0x67, 0xB9, 0xE2, 0x62, 0xD6, 0xC5, 0xDC, 0xF5, 0xDA, 0x26, 0xAB, 0xC2, 0xE9, 0x50, 0xFA, 0x74, 0x00, 0x95, 0x57, 0xDC, 0xE0, 0x22, 0x7A, + 0x1A, 0xA4, 0xB4, 0x65, 0xFC, 0xE4, 0x88, 0x84, 0x83, 0x3E, 0x16, 0x52, 0x6D, 0xB5, 0x82, 0x82, 0x26, 0x9A, 0x22, 0xD6, 0xF2, 0xB6, 0x89, 0xCD, 0xDC, 0x52, + 0x7B, 0xEA, 0xB9, 0xE5, 0xCD, 0xE5, 0xA7, 0x48, 0xE4, 0xDE, 0x8D, 0xEB, 0x0A, 0x8D, 0xE3, 0x47, 0x5F, 0xA4, 0xA6, 0x22, 0x1F, 0x15, 0x35, 0x8C, 0xDE, 0x3E, + 0xD0, 0x90, 0x34, 0x14, 0x84, 0xDE, 0x82, 0xED, 0x42, 0x4F, 0x05, 0x92, 0x15, 0x9D, 0x7D, 0xEC, 0xE2, 0xFD, 0x26, 0x2F, 0x5A, 0x64, 0xE9, 0x24, 0x97, 0x18, + 0xE4, 0xDD, 0xEC, 0x8D, 0x64, 0xC5, 0x49, 0xA7, 0x2F, 0x95, 0x3D, 0xA0, 0xAE, 0xBB, 0x81, 0x6F, 0xB2, 0x70, 0x1E, 0x3D, 0x28, 0x82, 0xD1, 0x06, 0x0F, 0x3F, + 0xB1, 0x3E, 0x31, 0xFD, 0x26, 0xAC, 0xA2, 0x55, 0x4A, 0x8B, 0xB7, 0x48, 0x93, 0x12, 0x4F, 0xF1, 0x30, 0x0F, 0x0D, 0x30, 0x8E, 0xF3, 0x37, 0x01, 0xDC, 0xD3, + 0x64, 0x8B, 0xC9, 0x09, 0xAB, 0xB1, 0x98, 0x78, 0x1C, 0x4B, 0x12, 0x2F, 0xE5, 0x22, 0xF6, 0x94, 0xD1, 0x93, 0x8F, 0xE6, 0x18, 0xD2, 0xCF, 0x73, 0x70, 0x1F, + 0xF0, 0xD7, 0x55, 0xB3, 0x75, 0x5B, 0xC4, 0x0E, 0x13, 0x57, 0x6C, 0x3B, 0x55, 0x89, 0xA0, 0x81, 0x5E, 0x8D, 0x2D, 0x21, 0x1F, 0x35, 0x3A, 0xD9, 0xE4, 0x2F, + 0x5D, 0x31, 0x68, 0xC8, 0x13, 0xEC, 0x79, 0x56, 0xB4, 0xAC, 0x6E, 0x4C, 0x20, 0x88, 0x43, 0x78, 0x86, 0xD8, 0x54, 0x69, 0x28, 0xD9, 0x85, 0x00, 0x88, 0x68, + 0x8F, 0xFC, 0x20, 0x87, 0x72, 0x7C, 0xB0, 0xC8, 0x34, 0xDC, 0x6B, 0x23, 0x90, 0xED, 0xDD, 0x04, 0x5C, 0x21, 0xE1, 0x26, 0xDF, 0xD4, 0x19, 0x80, 0xCE, 0x6D, + 0x97, 0x9D, 0x75, 0xE9, 0x4E, 0x0C, 0x2C, 0xED, 0x51, 0x7D, 0xF4, 0x24, 0x71, 0x9B, 0x7D, 0xF8, 0x55, 0xDC, 0x67, 0x67, 0x0C, 0x20, 0xEA, 0x05, 0x3F, 0xB5, + 0xDA, 0x35, 0x16, 0x0B, 0xE2, 0x5A, 0x17, 0x33, 0xDB, 0xB1, 0x9A, 0xAC, 0x69, 0xF4, 0xEC, 0x89, 0xCF, 0xBE, 0xD2, 0x4E, 0x9F, 0x73, 0xE0, 0x58, 0xC1, 0x11, + 0x2F, 0xD8, 0xB5, 0x66, 0x63, 0x60, 0x89, 0xC7, 0x54, 0x38, 0x58, 0xD7, 0xF2, 0x8D, 0xD5, 0x2B, 0x7C, 0x0C, 0x8E, 0x6A, 0xB2, 0xDD, 0x6B, 0xF7, 0x38, 0x40, + 0x08, 0x95, 0x8E, 0x90, 0x16, 0xE2, 0xC5, 0xC7, 0x85, 0x7E, 0x7D, 0xF7, 0x3A, 0xC6, 0x1B, 0x7A, 0xCF, 0xD9, 0xA5, 0x66, 0x83, 0x3E, 0x47, 0x77, 0xF0, 0xC7, + 0x02, 0x57, 0x5F, 0x45, 0x8C, 0x97, 0xC4, 0x88, 0x8F, 0xC8, 0xA1, 0xA8, 0x18, 0xF8, 0x0F, 0x32, 0x52, 0xB8, 0xEC, 0x42, 0x90, 0x46, 0x4B, 0x6D, 0xAA, 0x9A, + 0x8A, 0x07, 0xE8, 0xB0, 0x39, 0x72, 0xF2, 0x23, 0x8C, 0xF8, 0xFE, 0x49, 0x0C, 0x1F, 0xF4, 0xF1, 0x50, 0x6B, 0xEA, 0x3D, 0xFD, 0x61, 0x93, 0x5E, 0x7F, 0x03, + 0xEC, 0xCC, 0x9A, 0xAD, 0x87, 0xFD, 0x56, 0x0B, 0x3F, 0xAC, 0x6E, 0x92, 0x66, 0x67, 0x20, 0x40, 0xE0, 0x0F, 0x85, 0x61, 0x9D, 0xE4, 0xDF, 0x7F, 0xE9, 0x2D, + 0xFD, 0xA0, 0x08, 0xE0, 0x8D, 0xED, 0x62, 0x1A, 0x2C, 0x02, 0xB9, 0x22, 0x20, 0x58, 0x2B, 0x03, 0xA2, 0xD3, 0xE7, 0xFE, 0xC4, 0xE0, 0x8B, 0x3E, 0x0E, 0x05, + 0xF5, 0xB6, 0x54, 0x69, 0xF3, 0x62, 0x8F, 0xE0, 0xE4, 0x71, 0x53, 0x2C, 0xE7, 0xDC, 0xCA, 0xC6, 0x11, 0x97, 0x53, 0x7C, 0xF8, 0x9D, 0xD1, 0x7F, 0x2A, 0xD6, + 0xF0, 0x02, 0x25, 0x33, 0xAD, 0x5C, 0xA5, 0x06, 0x54, 0x16, 0x37, 0x85, 0xC5, 0x60, 0x72, 0xEE, 0x35, 0x3D, 0xEC, 0x4C, 0x16, 0x7E, 0x17, 0x4B, 0x70, 0xCF, + 0xB9, 0x08, 0x86, 0xEC, 0x1A, 0x8E, 0xC1, 0xA2, 0xA8, 0x0D, 0x63, 0xB2, 0xA2, 0x54, 0x02, 0xB7, 0xA5, 0xE4, 0xC3, 0x07, 0x70, 0x25, 0x0D, 0xA4, 0xD7, 0xED, + 0x4A, 0x6D, 0xA5, 0x81, 0x61, 0x61, 0xB2, 0x4E, 0xBF, 0x20, 0x96, 0xA2, 0x00, 0xAC, 0x59, 0xCE, 0xE5, 0x79, 0x0B, 0xCE, 0x3F, 0xC0, 0xB5, 0xA2, 0x78, 0x85, + 0x8D, 0xF8, 0x98, 0x49, 0x8A, 0x56, 0x39, 0x23, 0xDD, 0xEC, 0x28, 0x37, 0x15, 0xC6, 0xF2, 0x46, 0xB7, 0xD9, 0x91, 0xED, 0xAD, 0x64, 0x20, 0xE2, 0xC5, 0xDB, + 0xB1, 0x08, 0x49, 0xB1, 0xBC, 0x89, 0x2C, 0x6F, 0x31, 0xC2, 0x2F, 0x69, 0x21, 0xBF, 0x1F, 0x9C, 0x89, 0x8B, 0x54, 0x14, 0x17, 0xE1, 0xE2, 0xC2, 0x06, 0xF1, + 0xF0, 0xB2, 0x7C, 0xBA, 0x21, 0xB2, 0xFF, 0xDF, 0x9E, 0xC5, 0x9C, 0xAD, 0xC6, 0x85, 0x74, 0xF2, 0xE1, 0xBC, 0xC4, 0x5E, 0x71, 0x83, 0xC4, 0x47, 0x44, 0x18, + 0x5B, 0xAB, 0x71, 0x35, 0xB6, 0xC4, 0x74, 0x00, 0x36, 0x88, 0xD9, 0x52, 0x4F, 0x1A, 0x08, 0x56, 0x9E, 0x93, 0x90, 0xEF, 0x60, 0x33, 0x5C, 0x4B, 0x8B, 0x3E, + 0x7B, 0x1B, 0x11, 0x1B, 0x5D, 0x29, 0xA2, 0x39, 0x02, 0x62, 0x95, 0x57, 0x74, 0x5A, 0x89, 0xEC, 0x08, 0x3A, 0x36, 0xE1, 0x18, 0x81, 0x98, 0xAA, 0x38, 0x4A, + 0x4F, 0x38, 0xB1, 0x1A, 0xDE, 0xA2, 0xD4, 0xA7, 0x2A, 0x75, 0x19, 0xC0, 0x87, 0x68, 0x39, 0x75, 0x01, 0x53, 0x02, 0x86, 0x99, 0x2A, 0x8B, 0x16, 0xEC, 0x77, + 0x76, 0x20, 0x9E, 0x20, 0x66, 0x67, 0xEC, 0x83, 0xE3, 0x67, 0x07, 0xB3, 0x70, 0xEE, 0x8C, 0xEE, 0xFD, 0x2F, 0xFC, 0x34, 0x4E, 0xF9, 0x5F, 0xA4, 0x00, 0x00 }; -//File: index_ov3660.html.gz, Size: 8887 -#define index_ov3660_html_gz_len 8887 -const uint8_t index_ov3660_html_gz[] = { - 0x1F, 0x8B, 0x08, 0x08, 0xA3, 0xFA, 0x69, 0x5E, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x5F, 0x6F, 0x76, 0x33, 0x36, 0x36, 0x30, 0x2E, 0x68, 0x74, 0x6D, - 0x6C, 0x00, 0xED, 0x3D, 0x69, 0x73, 0xDB, 0x46, 0xB2, 0xDF, 0xFD, 0x2B, 0x60, 0x24, 0x6B, 0x51, 0x65, 0x91, 0xE2, 0xAD, 0x23, 0x12, 0xFD, 0x6C, 0x59, 0xB1, - 0x53, 0x1B, 0x67, 0xBD, 0x71, 0xE2, 0x24, 0xB5, 0xB5, 0xE5, 0x80, 0xC4, 0x90, 0x44, 0x0C, 0x02, 0x5C, 0x00, 0xD4, 0x91, 0x94, 0x7E, 0xC7, 0xFB, 0x41, 0xEF, - 0x8F, 0xBD, 0xEE, 0x39, 0x70, 0x71, 0x00, 0x0C, 0x00, 0x11, 0x52, 0xF2, 0x1E, 0x5D, 0x65, 0xE1, 0x98, 0xEE, 0xE9, 0x7B, 0x7A, 0x7A, 0x06, 0xC0, 0xD9, 0x53, - 0xD3, 0x9D, 0x05, 0xB7, 0x6B, 0xA2, 0x2D, 0x83, 0x95, 0x3D, 0x79, 0x72, 0xC6, 0xFE, 0x68, 0xF0, 0x3B, 0x5B, 0x12, 0xC3, 0x64, 0x87, 0xF4, 0x74, 0x45, 0x02, - 0x43, 0x9B, 0x2D, 0x0D, 0xCF, 0x27, 0xC1, 0xB9, 0xBE, 0x09, 0xE6, 0xED, 0x63, 0x3D, 0x7D, 0xDB, 0x31, 0x56, 0xE4, 0x5C, 0xBF, 0xB2, 0xC8, 0xF5, 0xDA, 0xF5, - 0x02, 0x5D, 0x9B, 0xB9, 0x4E, 0x40, 0x1C, 0x68, 0x7E, 0x6D, 0x99, 0xC1, 0xF2, 0xDC, 0x24, 0x57, 0xD6, 0x8C, 0xB4, 0xE9, 0xC9, 0x81, 0xE5, 0x58, 0x81, 0x65, - 0xD8, 0x6D, 0x7F, 0x66, 0xD8, 0xE4, 0xBC, 0x17, 0xC7, 0x15, 0x58, 0x81, 0x4D, 0x26, 0x97, 0x1F, 0xDE, 0x0F, 0xFA, 0xDA, 0x3F, 0x3E, 0x0E, 0xC6, 0xE3, 0xEE, - 0xD9, 0x21, 0xBB, 0x16, 0xB5, 0xF1, 0x83, 0xDB, 0xF8, 0x39, 0xFE, 0xA6, 0xAE, 0x79, 0xAB, 0xFD, 0x91, 0xB8, 0x84, 0xBF, 0x39, 0x10, 0xD1, 0x9E, 0x1B, 0x2B, - 0xCB, 0xBE, 0x3D, 0xD5, 0x5E, 0x7A, 0xD0, 0xE7, 0xC1, 0x5B, 0x62, 0x5F, 0x91, 0xC0, 0x9A, 0x19, 0x07, 0xBE, 0xE1, 0xF8, 0x6D, 0x9F, 0x78, 0xD6, 0xFC, 0xAB, - 0x2D, 0xC0, 0xA9, 0x31, 0xFB, 0xBC, 0xF0, 0xDC, 0x8D, 0x63, 0x9E, 0x6A, 0x5F, 0xF4, 0x8E, 0xF1, 0xDF, 0x76, 0xA3, 0x99, 0x6B, 0xBB, 0x1E, 0xDC, 0xBF, 0xFC, - 0x1A, 0xFF, 0x6D, 0xDF, 0xA7, 0xBD, 0xFB, 0xD6, 0xEF, 0xE4, 0x54, 0xEB, 0x8D, 0xD7, 0x37, 0x89, 0xFB, 0x77, 0x4F, 0x12, 0xA7, 0xCB, 0x7E, 0x16, 0xF5, 0x1C, - 0xFE, 0x38, 0x1F, 0xDE, 0x27, 0xB3, 0xC0, 0x72, 0x9D, 0xCE, 0xCA, 0xB0, 0x1C, 0x09, 0x26, 0xD3, 0xF2, 0xD7, 0xB6, 0x01, 0x32, 0x98, 0xDB, 0x24, 0x17, 0xCF, - 0x17, 0x2B, 0xE2, 0x6C, 0x0E, 0x0A, 0xB0, 0x21, 0x92, 0xB6, 0x69, 0x79, 0xAC, 0xD5, 0x29, 0xCA, 0x61, 0xB3, 0x72, 0x0A, 0xD1, 0xE6, 0xD1, 0xE5, 0xB8, 0x0E, - 0x91, 0x08, 0x10, 0x3B, 0xBA, 0xF6, 0x8C, 0x35, 0x36, 0xC0, 0xBF, 0xDB, 0x4D, 0x56, 0x96, 0xC3, 0x8C, 0xEA, 0x54, 0x1B, 0x0C, 0xBB, 0xEB, 0x9B, 0x02, 0x55, - 0x0E, 0xC6, 0xF8, 0x6F, 0xBB, 0xD1, 0xDA, 0x30, 0x4D, 0xCB, 0x59, 0x9C, 0x6A, 0xC7, 0x52, 0x14, 0xAE, 0x67, 0x12, 0xAF, 0xED, 0x19, 0xA6, 0xB5, 0xF1, 0x4F, - 0xB5, 0xA1, 0xAC, 0xCD, 0xCA, 0xF0, 0x16, 0x40, 0x4B, 0xE0, 0x02, 0xB1, 0xED, 0x9E, 0x94, 0x12, 0xDE, 0xC4, 0xB3, 0x16, 0xCB, 0x00, 0x54, 0xBA, 0xD5, 0x26, - 0x2D, 0x34, 0xEE, 0x42, 0x45, 0xFA, 0xCC, 0x95, 0x9B, 0x5C, 0x6A, 0x86, 0x6D, 0x2D, 0x9C, 0xB6, 0x15, 0x90, 0x15, 0xB0, 0xE3, 0x07, 0x1E, 0x09, 0x66, 0xCB, - 0x3C, 0x52, 0xE6, 0xD6, 0x62, 0xE3, 0x11, 0x09, 0x21, 0xA1, 0xDC, 0x72, 0x18, 0x86, 0x9B, 0xDB, 0xB7, 0xDA, 0xD7, 0x64, 0xFA, 0xD9, 0x0A, 0xDA, 0x5C, 0x26, - 0x53, 0x32, 0x77, 0x3D, 0x22, 0x6D, 0x29, 0x5A, 0xD8, 0xEE, 0xEC, 0x73, 0xDB, 0x0F, 0x0C, 0x2F, 0x50, 0x41, 0x68, 0xCC, 0x03, 0xE2, 0x15, 0xE3, 0x23, 0x68, - 0x15, 0xC5, 0xD8, 0xB2, 0xBB, 0xE5, 0x0D, 0x2C, 0xC7, 0xB6, 0x1C, 0xA2, 0x4E, 0x5E, 0x56, 0xBF, 0x49, 0x74, 0xAC, 0x95, 0x82, 0x62, 0xAC, 0xD5, 0x22, 0xCF, - 0x4A, 0x28, 0xAF, 0xDB, 0x9D, 0x71, 0xBF, 0xE9, 0x75, 0xBB, 0x7F, 0xDB, 0xBE, 0xB9, 0x24, 0xCC, 0x4C, 0x8D, 0x4D, 0xE0, 0xD6, 0xF7, 0x88, 0x2D, 0xB7, 0x4A, - 0xF1, 0xF1, 0x5F, 0x2B, 0x62, 0x5A, 0x86, 0xD6, 0x8A, 0xB9, 0xF3, 0x71, 0x17, 0x6C, 0x6A, 0x5F, 0x33, 0x1C, 0x53, 0x6B, 0xB9, 0x9E, 0x05, 0x8E, 0x60, 0xD0, - 0x70, 0x63, 0xC3, 0x15, 0x18, 0x38, 0xD6, 0x64, 0x5F, 0xC2, 0x72, 0x8E, 0xCF, 0xC4, 0x25, 0x22, 0x77, 0x1B, 0xFC, 0x29, 0x84, 0x1C, 0xFC, 0x15, 0x3A, 0x90, - 0x84, 0x47, 0x8A, 0x3E, 0x4F, 0x5F, 0x71, 0x0A, 0xB3, 0x74, 0x86, 0xBF, 0x95, 0x71, 0xD3, 0xCE, 0xD5, 0x9D, 0x68, 0x24, 0x74, 0x08, 0xC3, 0xEC, 0xAC, 0x05, - 0x4D, 0xAF, 0x96, 0x5A, 0x5B, 0xC3, 0x28, 0xB9, 0x2F, 0x87, 0xE1, 0x48, 0xE5, 0x2A, 0xC7, 0x5F, 0xDC, 0x28, 0x4A, 0xB0, 0x2B, 0x67, 0x35, 0x8A, 0x1D, 0xEC, - 0x9F, 0xCC, 0x86, 0x18, 0x27, 0x99, 0x51, 0x04, 0x7F, 0xEA, 0x91, 0x24, 0x42, 0x56, 0x18, 0x4D, 0x24, 0x88, 0xB3, 0x23, 0xCA, 0x16, 0xDE, 0x2C, 0xEF, 0x96, - 0x60, 0xCD, 0x27, 0x41, 0x35, 0xBA, 0x48, 0x10, 0xE7, 0xD1, 0x50, 0x18, 0x65, 0xF0, 0x77, 0xA7, 0x90, 0x6F, 0x7C, 0x31, 0xDD, 0x04, 0x81, 0xEB, 0xF8, 0xB5, - 0x86, 0xA8, 0x2C, 0x3F, 0xFB, 0x6D, 0xE3, 0x07, 0xD6, 0xFC, 0xB6, 0xCD, 0x5D, 0x1A, 0xFC, 0x6C, 0x6D, 0x40, 0x0A, 0x39, 0x25, 0xC1, 0x35, 0x21, 0xF9, 0xE9, - 0x86, 0x63, 0x5C, 0x41, 0xDC, 0x59, 0x2C, 0x6C, 0x99, 0xED, 0xCD, 0x36, 0x9E, 0x8F, 0x79, 0xDB, 0xDA, 0xB5, 0x00, 0xB1, 0xB7, 0xDD, 0x71, 0xD2, 0x07, 0x15, - 0x3B, 0x6A, 0xCF, 0xA6, 0x92, 0xBE, 0xDC, 0x4D, 0x80, 0x32, 0x96, 0x6A, 0xC2, 0x05, 0x76, 0xAC, 0xE0, 0x56, 0x7A, 0x8F, 0x7B, 0xA2, 0xE4, 0x8E, 0x70, 0xC1, - 0xDC, 0x61, 0x21, 0x49, 0xD7, 0xE9, 0x6C, 0x49, 0x66, 0x9F, 0x89, 0xF9, 0xBC, 0x30, 0x0D, 0x2B, 0x4A, 0x0F, 0x3B, 0x96, 0xB3, 0xDE, 0x04, 0x6D, 0x4C, 0xA7, - 0xD6, 0x3B, 0xD1, 0x39, 0x35, 0x48, 0xC1, 0x62, 0xBF, 0x9F, 0x97, 0x54, 0x8C, 0xD6, 0x37, 0xF9, 0x42, 0x88, 0x13, 0x3B, 0xB1, 0x8D, 0x29, 0xB1, 0xF3, 0x48, - 0xE6, 0xCE, 0x90, 0x11, 0x76, 0x79, 0xAC, 0xCA, 0xCE, 0xDD, 0x28, 0x65, 0xD1, 0xE0, 0x35, 0x3C, 0xFA, 0x9B, 0xB2, 0x1C, 0xE9, 0xF1, 0x41, 0xE2, 0x92, 0x4F, - 0x6C, 0x70, 0xB0, 0xAC, 0xD4, 0x1B, 0xDA, 0x5C, 0x03, 0x0D, 0xB9, 0x1D, 0x78, 0x86, 0xB3, 0x20, 0x10, 0x0B, 0x6E, 0x0E, 0xC4, 0x61, 0xFE, 0xC4, 0x40, 0x89, - 0x7D, 0x0C, 0xD5, 0xA3, 0xFC, 0x89, 0x08, 0x0B, 0x08, 0x07, 0x5A, 0x87, 0x1D, 0x54, 0xC8, 0x4A, 0x62, 0xFA, 0xCD, 0x25, 0xA4, 0x27, 0xB5, 0x0E, 0x96, 0x98, - 0x48, 0x3D, 0x27, 0x69, 0x5B, 0xD2, 0x44, 0xBF, 0x30, 0x34, 0x88, 0x29, 0xDF, 0x7C, 0x5E, 0x34, 0x69, 0x9C, 0xCF, 0x07, 0xDD, 0xC1, 0xB0, 0x30, 0x73, 0x92, - 0x72, 0x99, 0x9A, 0x38, 0x4A, 0x42, 0x47, 0x18, 0x56, 0x72, 0x8D, 0xC0, 0x37, 0xAE, 0xA4, 0x49, 0xBB, 0xEB, 0x5B, 0x6C, 0xE6, 0x66, 0x4C, 0x7D, 0x98, 0xBB, - 0x05, 0x92, 0xA9, 0x17, 0x37, 0xF4, 0xBE, 0x94, 0x3E, 0x9A, 0xD2, 0x49, 0x5D, 0x40, 0x88, 0x57, 0x4E, 0x76, 0x42, 0x03, 0xF2, 0x26, 0x31, 0x05, 0x4B, 0x93, - 0xCA, 0x80, 0xDC, 0x04, 0x6D, 0x93, 0xCC, 0x5C, 0x8F, 0x65, 0x83, 0x19, 0x33, 0xC7, 0x94, 0x22, 0x8B, 0x2D, 0xF6, 0x74, 0xE9, 0x5E, 0x11, 0x4F, 0x22, 0xAC, - 0x94, 0x52, 0x87, 0x27, 0x43, 0x53, 0x01, 0x9B, 0x01, 0xC3, 0xA3, 0x54, 0xF6, 0x49, 0x74, 0xFD, 0xDE, 0xAC, 0x9F, 0xEB, 0xC7, 0x0C, 0x5D, 0x07, 0x7C, 0xC6, - 0x98, 0xDA, 0xC4, 0xCC, 0x19, 0xCD, 0x4C, 0x32, 0x37, 0x36, 0x76, 0x50, 0x60, 0x95, 0x46, 0x17, 0xFF, 0xE5, 0xF5, 0x48, 0xC3, 0xD0, 0xBF, 0xB0, 0x2E, 0x74, - 0x4E, 0x03, 0xC7, 0xBF, 0x25, 0x7D, 0x8A, 0x54, 0xC3, 0x58, 0xAF, 0x89, 0x01, 0xAD, 0x66, 0x24, 0x4B, 0x0F, 0x4A, 0x53, 0x0C, 0x79, 0x9C, 0x57, 0x9A, 0xB7, - 0x17, 0x3A, 0x6C, 0x98, 0x3C, 0x96, 0xE2, 0xF9, 0x74, 0xEE, 0xCE, 0x36, 0xB2, 0xAC, 0x46, 0xCD, 0xF1, 0xB6, 0xF1, 0x9D, 0x0A, 0x91, 0xF9, 0xB6, 0x45, 0xDD, - 0x7F, 0xE3, 0x38, 0xA8, 0xD1, 0x76, 0xE0, 0x01, 0x9B, 0x92, 0x8E, 0xD4, 0x04, 0x57, 0x29, 0x86, 0x25, 0x04, 0x9B, 0x55, 0xBB, 0x4A, 0x85, 0x29, 0x49, 0x38, - 0x0D, 0x23, 0xAD, 0x06, 0x31, 0xC4, 0x32, 0x05, 0xAA, 0x7A, 0x72, 0x09, 0x96, 0x9B, 0x95, 0x2C, 0x8F, 0x12, 0x9D, 0xF5, 0x60, 0xD0, 0x67, 0xDD, 0x79, 0x8B, - 0xA9, 0xD1, 0xEA, 0x1E, 0x74, 0x0F, 0x06, 0xF0, 0x9F, 0x64, 0x3E, 0x93, 0x6F, 0x5C, 0x5C, 0xBC, 0x19, 0x96, 0x97, 0x0A, 0xD1, 0xC5, 0x65, 0xA5, 0xAC, 0x60, - 0x5F, 0xA8, 0x0B, 0x75, 0x4F, 0x4A, 0xD6, 0x97, 0x7A, 0x9D, 0x82, 0x71, 0x38, 0xC3, 0xA4, 0xCB, 0x1B, 0xA2, 0xC4, 0x5A, 0xCA, 0xAA, 0x78, 0xE5, 0xFE, 0xDE, - 0x66, 0x49, 0xC8, 0xFF, 0x79, 0x6B, 0x8F, 0x89, 0xE2, 0x2F, 0x6D, 0xE9, 0xA5, 0xE5, 0xE2, 0x3F, 0xB4, 0x6D, 0x74, 0xB3, 0xB5, 0xDE, 0xE6, 0x59, 0x1F, 0x50, - 0xE8, 0xC0, 0x1C, 0xD4, 0x83, 0xC9, 0x68, 0x66, 0x66, 0x18, 0x6B, 0x53, 0x41, 0x06, 0x73, 0xCB, 0xB6, 0xDB, 0xB6, 0x7B, 0x5D, 0x9C, 0x89, 0xE4, 0x5B, 0xF2, - 0x96, 0x9D, 0x16, 0x9B, 0x7C, 0x55, 0x6A, 0x37, 0x10, 0xB9, 0xFE, 0x14, 0xD4, 0xFE, 0xB5, 0x1D, 0x2E, 0xD7, 0x35, 0xAA, 0x0D, 0x14, 0x15, 0xEC, 0xB1, 0x5E, - 0x47, 0x4A, 0xA6, 0xC4, 0x32, 0xC1, 0xFC, 0x69, 0xCF, 0xB5, 0x15, 0xCC, 0x96, 0x15, 0xA6, 0x9E, 0xD1, 0xC4, 0xC8, 0x23, 0xB6, 0x81, 0x19, 0x7C, 0xA5, 0x0A, - 0x45, 0xE1, 0xF4, 0x2D, 0x0E, 0xAE, 0xC2, 0x09, 0x15, 0xDD, 0xE3, 0xA9, 0x2E, 0x75, 0x58, 0xEE, 0x90, 0x1D, 0xAB, 0xE5, 0x66, 0x5D, 0x90, 0xEE, 0x27, 0x3D, - 0x43, 0xDE, 0xA8, 0x44, 0x44, 0x17, 0x41, 0x7B, 0xE1, 0x91, 0x5B, 0x05, 0x66, 0x0E, 0xF8, 0xDF, 0x53, 0x56, 0x3F, 0xAE, 0x5E, 0x2A, 0xA1, 0x03, 0x00, 0xB7, - 0xA2, 0xCE, 0xD0, 0x57, 0xE8, 0x3A, 0xBB, 0x4B, 0x15, 0x7B, 0x0C, 0xAB, 0xA3, 0xBA, 0xAE, 0x10, 0x6E, 0x72, 0x86, 0x50, 0xB9, 0xA9, 0x8A, 0xD1, 0x57, 0x3E, - 0x9F, 0x27, 0xF3, 0x20, 0x63, 0xF1, 0x87, 0xE6, 0xA9, 0x83, 0xFC, 0xE8, 0xD6, 0x8E, 0x55, 0x53, 0x0A, 0x23, 0x47, 0x58, 0xC4, 0xCC, 0xB6, 0x3E, 0x29, 0x66, - 0x8C, 0x9E, 0xA5, 0x91, 0x67, 0xAB, 0x44, 0xA4, 0xCF, 0x54, 0xCD, 0xD0, 0x66, 0xC5, 0x87, 0x7C, 0x50, 0x0F, 0xF9, 0xB9, 0xD5, 0x1F, 0x4B, 0xD7, 0x56, 0x72, - 0x1A, 0xE7, 0x91, 0x96, 0x59, 0x05, 0xDC, 0x1E, 0xB2, 0x32, 0x27, 0xC8, 0xF1, 0x58, 0x24, 0x55, 0x54, 0xBE, 0x57, 0xE6, 0x45, 0x98, 0xED, 0x4A, 0x56, 0xAE, - 0xB1, 0x5B, 0x2B, 0x03, 0xD2, 0x5E, 0x34, 0x57, 0x03, 0x30, 0xCA, 0xF4, 0xA7, 0x62, 0xEE, 0xB1, 0x1A, 0x6B, 0x6F, 0xDC, 0x2D, 0xE8, 0x72, 0x66, 0xBB, 0x7E, - 0xCD, 0x02, 0x58, 0x76, 0xFD, 0x4B, 0x7A, 0x47, 0x69, 0xE8, 0xCE, 0xF5, 0xA9, 0x7C, 0x77, 0x4C, 0xC9, 0xBC, 0xD7, 0x95, 0x46, 0xDA, 0xDC, 0x2A, 0x25, 0xAD, - 0xA0, 0xD1, 0xF5, 0xCB, 0x53, 0x6D, 0x46, 0xE4, 0x61, 0x34, 0x59, 0xA8, 0x53, 0x29, 0x95, 0xE6, 0xEA, 0x61, 0x69, 0x99, 0x26, 0xC9, 0xAD, 0x05, 0xE3, 0x9C, - 0x57, 0x31, 0x79, 0x40, 0xFA, 0x65, 0x45, 0xA9, 0x9D, 0x38, 0x45, 0xEE, 0xB6, 0x86, 0xDE, 0xAE, 0x3D, 0x86, 0x0F, 0x34, 0x59, 0x95, 0xF4, 0x64, 0x2A, 0x92, - 0x4B, 0xAA, 0xD4, 0xB9, 0xC3, 0x5A, 0x2B, 0x8A, 0x0C, 0xE4, 0x80, 0xAD, 0xB6, 0xA3, 0x79, 0x8A, 0x2A, 0xBA, 0x90, 0xD2, 0xE1, 0x6B, 0x4B, 0x7C, 0x19, 0xB0, - 0x9D, 0xB5, 0xBA, 0x72, 0x8F, 0x4B, 0x6D, 0xD4, 0x02, 0xD2, 0xFD, 0x66, 0x8A, 0xE6, 0x81, 0x32, 0xA3, 0x1C, 0x22, 0xC3, 0x21, 0x46, 0x6C, 0xAE, 0x4A, 0xB6, - 0x2A, 0xEB, 0x1C, 0xE1, 0xF9, 0xD9, 0x61, 0x6C, 0x3B, 0xDC, 0xD9, 0x61, 0xB4, 0x73, 0xEF, 0x0C, 0xF7, 0xC4, 0xC5, 0x77, 0xCD, 0xF1, 0x8E, 0x66, 0xB6, 0xE1, - 0xFB, 0xE7, 0x3A, 0xEE, 0xED, 0xD2, 0x93, 0x9B, 0xE8, 0xCE, 0x4C, 0xEB, 0x4A, 0xB3, 0xCC, 0x73, 0xDD, 0x76, 0x17, 0x6E, 0xEA, 0x1E, 0xBD, 0xCF, 0xD4, 0x0C, - 0x03, 0xD9, 0xB9, 0x9E, 0x58, 0x60, 0xD4, 0x29, 0x54, 0x74, 0x49, 0x9F, 0x3C, 0xFB, 0xE2, 0xE4, 0xE8, 0x68, 0xFC, 0xD5, 0x33, 0x67, 0xEA, 0xAF, 0xF9, 0xFF, - 0x3F, 0xB0, 0xF5, 0x58, 0xB6, 0xA9, 0x0F, 0xC6, 0xB6, 0x20, 0x00, 0xDB, 0xF3, 0xCF, 0x0E, 0x29, 0xD2, 0x14, 0x21, 0x87, 0x40, 0x49, 0x06, 0x6D, 0x3C, 0xDF, - 0x91, 0x91, 0x27, 0x9A, 0xF8, 0x30, 0x84, 0x4F, 0x0D, 0x4F, 0xD2, 0x84, 0x36, 0x63, 0xD9, 0x34, 0x8D, 0x25, 0x3A, 0x55, 0xCA, 0xD4, 0xBD, 0x49, 0x73, 0x40, - 0x99, 0xE2, 0x1A, 0xE3, 0xAD, 0x88, 0x99, 0x85, 0x10, 0xC0, 0x28, 0x38, 0xAE, 0xAE, 0x42, 0x1B, 0x69, 0xA3, 0x84, 0x0A, 0xB0, 0xF1, 0xCD, 0xCC, 0xFE, 0x2C, - 0x94, 0xAF, 0x0B, 0xA5, 0x38, 0x6E, 0xC0, 0x62, 0x65, 0x46, 0x57, 0x09, 0x56, 0x39, 0x4C, 0x6C, 0xDD, 0x90, 0x71, 0x01, 0xA2, 0x6D, 0x53, 0xEC, 0xEC, 0x5A, - 0x3E, 0x26, 0x8A, 0x2D, 0xA6, 0x57, 0x01, 0xAC, 0x4F, 0x7E, 0xBE, 0xF8, 0xF6, 0xEF, 0xDA, 0xBB, 0xB7, 0xBF, 0x4B, 0x35, 0x54, 0x44, 0x14, 0x06, 0x69, 0x85, - 0x9E, 0x29, 0x18, 0xD3, 0x87, 0x90, 0x89, 0xCE, 0x35, 0x43, 0x31, 0xE0, 0x70, 0x6F, 0x13, 0x67, 0x11, 0x2C, 0xCF, 0xF5, 0x9E, 0x8E, 0x7B, 0x5A, 0xC4, 0x59, - 0x5F, 0xD7, 0x30, 0x80, 0xD3, 0x83, 0x2B, 0xC3, 0xDE, 0xE0, 0x51, 0x57, 0x85, 0xD7, 0x6D, 0xD3, 0x92, 0x36, 0xE3, 0x91, 0x25, 0x94, 0x71, 0x2C, 0x12, 0x27, - 0xA5, 0xAC, 0x4F, 0x3E, 0x90, 0xE0, 0xEC, 0x90, 0xDD, 0x2A, 0xD0, 0x5A, 0x7E, 0xDF, 0xE0, 0xC9, 0xCC, 0x1C, 0xF2, 0x4C, 0x28, 0x4F, 0xF1, 0x73, 0xCF, 0x58, - 0x11, 0x94, 0x8A, 0x92, 0xE6, 0xE3, 0x5A, 0x0F, 0x21, 0xF5, 0xC9, 0xF7, 0x84, 0x66, 0x44, 0x40, 0x86, 0x92, 0xE2, 0xCF, 0x78, 0x92, 0x9A, 0xE8, 0x3F, 0xB4, - 0x67, 0xBE, 0x28, 0xD5, 0x36, 0x98, 0x99, 0x2B, 0xC8, 0xFD, 0x69, 0xBB, 0xAD, 0x0D, 0xDE, 0xBD, 0xD7, 0xDA, 0x6D, 0x85, 0xC6, 0xEE, 0x9A, 0xBA, 0x13, 0xD7, - 0x7F, 0xEF, 0x48, 0x9F, 0xFC, 0xF3, 0xE7, 0x37, 0x2F, 0x5B, 0xFD, 0xEE, 0xF0, 0xF8, 0xA6, 0x37, 0x1A, 0x0F, 0xF7, 0xCF, 0x0E, 0x59, 0x93, 0xF2, 0xB8, 0xC6, - 0xFA, 0xE4, 0x3D, 0x12, 0xD2, 0x3A, 0x1E, 0x0F, 0xEB, 0xE2, 0x1A, 0x21, 0xAE, 0xB7, 0xAF, 0x5B, 0x47, 0xFD, 0xEE, 0x4D, 0xAF, 0x7F, 0xDC, 0xAD, 0x81, 0x6A, - 0xA8, 0x4F, 0xBE, 0x06, 0x4C, 0xBD, 0x13, 0x44, 0xD5, 0x2D, 0x87, 0x0A, 0x45, 0xDB, 0xAF, 0x28, 0xDA, 0x81, 0x3E, 0xF9, 0x11, 0x45, 0x0B, 0x39, 0x37, 0xF2, - 0xD0, 0xAD, 0xC3, 0x43, 0x1F, 0x5C, 0x86, 0xE2, 0x02, 0x51, 0x00, 0x13, 0xFD, 0x3A, 0xA2, 0xED, 0xE9, 0x13, 0x14, 0x07, 0x62, 0x02, 0xE9, 0xD6, 0x40, 0x04, - 0xB1, 0x83, 0xD2, 0x04, 0xE4, 0xDC, 0x1C, 0x8D, 0x8F, 0xAB, 0x63, 0x3A, 0x01, 0xEE, 0x3E, 0x02, 0xA6, 0x63, 0x10, 0xD4, 0xB8, 0x8E, 0x9C, 0x8E, 0xF5, 0x09, - 0xE2, 0x19, 0x0F, 0xBB, 0x37, 0xC3, 0x3A, 0x36, 0x03, 0x5E, 0xF1, 0x16, 0x11, 0x01, 0x92, 0x9B, 0x41, 0x1D, 0x19, 0x81, 0x4B, 0x5C, 0x7C, 0xF3, 0x75, 0x6B, - 0x08, 0x8C, 0xF5, 0x4F, 0xC6, 0xD5, 0xF1, 0x80, 0x3B, 0xFC, 0x13, 0x09, 0x02, 0x62, 0x6E, 0xFA, 0xC3, 0x1A, 0x04, 0x81, 0x33, 0x00, 0x3C, 0xE2, 0xA8, 0x8C, - 0x02, 0xEC, 0xFA, 0x2D, 0x25, 0x06, 0x11, 0xF5, 0x8E, 0x6A, 0x70, 0x05, 0x56, 0xFD, 0x4F, 0x14, 0x0F, 0x20, 0xB9, 0xE9, 0x0D, 0xEB, 0xD8, 0x34, 0x20, 0xA2, - 0x24, 0x81, 0xAF, 0xA1, 0xAB, 0x55, 0xC7, 0x04, 0x36, 0x7D, 0x32, 0xBE, 0x39, 0x19, 0xAB, 0x21, 0xC0, 0xE1, 0x07, 0x43, 0x79, 0xDE, 0x00, 0x95, 0x3F, 0x7E, - 0xE5, 0x8D, 0x4D, 0xFF, 0xD9, 0xC0, 0x94, 0x33, 0xB8, 0x2D, 0x3D, 0x32, 0x71, 0x38, 0x90, 0x09, 0x3B, 0x50, 0x1B, 0x94, 0x62, 0x94, 0x84, 0xBB, 0x9F, 0xF4, - 0xC9, 0x50, 0x61, 0xF0, 0x4F, 0x64, 0x87, 0x14, 0x36, 0x41, 0x3F, 0xCD, 0x48, 0xD0, 0xF2, 0x30, 0x17, 0x01, 0x97, 0x18, 0xE8, 0xB1, 0x08, 0x52, 0x69, 0xD4, - 0x93, 0xD0, 0x6A, 0xDC, 0xE8, 0x93, 0xF1, 0xA0, 0x30, 0x5B, 0xA8, 0xAE, 0x8C, 0x29, 0x2D, 0x6E, 0x38, 0xC4, 0xF7, 0x4B, 0xEB, 0x23, 0x02, 0xD5, 0x27, 0xAF, - 0xC2, 0xE3, 0x3A, 0x5A, 0x69, 0x17, 0x71, 0x4A, 0x61, 0x33, 0xD4, 0x12, 0x23, 0x87, 0x69, 0xA6, 0x3D, 0xE0, 0xAA, 0x89, 0x34, 0x73, 0xBF, 0x8A, 0xD9, 0xA5, - 0x5E, 0x70, 0x6E, 0xE3, 0x19, 0x7E, 0x50, 0x5A, 0x2B, 0x02, 0x10, 0x22, 0x34, 0x3F, 0x7A, 0x30, 0x8D, 0x84, 0xA4, 0xFC, 0x05, 0xF4, 0xE1, 0x1B, 0xC1, 0x86, - 0xED, 0x33, 0x2B, 0xAD, 0x91, 0x08, 0x14, 0xF2, 0x81, 0xF0, 0xB8, 0x96, 0x56, 0xEA, 0x84, 0xAF, 0x18, 0x39, 0x5C, 0x2F, 0x22, 0x84, 0x0D, 0x77, 0xA4, 0x97, - 0x22, 0x6A, 0x6B, 0xE9, 0x65, 0x69, 0x78, 0xEB, 0x4A, 0xE1, 0x2B, 0x84, 0x04, 0xAD, 0x88, 0xC3, 0x07, 0x73, 0x95, 0x88, 0x98, 0xBF, 0x80, 0xAF, 0x98, 0xC4, - 0x71, 0x2D, 0xBF, 0xFC, 0xD4, 0x93, 0xC3, 0xE9, 0x93, 0xD7, 0xA4, 0xFD, 0x1D, 0x1E, 0xD5, 0x51, 0xC7, 0xCB, 0x4D, 0xE0, 0xD6, 0x50, 0x88, 0xA0, 0x85, 0xA9, - 0xA3, 0xCB, 0xB5, 0x71, 0xBC, 0x23, 0x6D, 0x1C, 0xEF, 0x50, 0x1B, 0x06, 0xF9, 0x64, 0x93, 0x2B, 0x62, 0x97, 0x56, 0x87, 0x00, 0xD4, 0x27, 0x97, 0x37, 0x6B, - 0xD7, 0xC7, 0xA7, 0x77, 0xBE, 0xC5, 0xF3, 0x5A, 0x4E, 0x32, 0xAA, 0xA1, 0x93, 0x90, 0x20, 0xEE, 0x23, 0x23, 0xAE, 0x95, 0xD1, 0x8E, 0xB4, 0x52, 0x44, 0x6B, - 0x1D, 0xAD, 0x2C, 0x0C, 0xCB, 0x99, 0x11, 0xCB, 0xC6, 0x27, 0x09, 0xCA, 0x2A, 0x26, 0x06, 0xAB, 0x4F, 0xDE, 0x44, 0x27, 0x75, 0x14, 0xD3, 0xAD, 0xA1, 0x97, - 0x38, 0x3D, 0x49, 0x7F, 0x19, 0xC1, 0xAC, 0x7C, 0x47, 0xBA, 0xE9, 0xF5, 0x76, 0x39, 0xAA, 0xAC, 0xC9, 0xCC, 0x32, 0xEC, 0x4F, 0x64, 0x3E, 0x87, 0x69, 0x50, - 0xF9, 0xA1, 0x25, 0x01, 0x0E, 0xE3, 0x0B, 0x3B, 0xD7, 0x2E, 0xE9, 0x79, 0xE9, 0x62, 0x5A, 0x0A, 0x5D, 0xF5, 0x8A, 0x5A, 0x7A, 0x4E, 0xC8, 0x97, 0x95, 0x09, - 0xAD, 0x61, 0xB2, 0x23, 0x7D, 0xF2, 0x9D, 0x1B, 0xD2, 0x59, 0x7D, 0xDA, 0xFA, 0x1D, 0x59, 0xD0, 0x55, 0xDB, 0x3A, 0x73, 0xE8, 0x37, 0x9E, 0x71, 0x4B, 0x5F, - 0x0B, 0x50, 0x67, 0x4A, 0xFF, 0x3D, 0x31, 0xB5, 0x1F, 0x2C, 0xA7, 0x3A, 0x33, 0x43, 0x24, 0x84, 0x10, 0xA7, 0x1E, 0x96, 0x11, 0x4C, 0x91, 0xE0, 0xA0, 0x1E, - 0x92, 0x31, 0x16, 0x98, 0xD7, 0x96, 0xF1, 0x18, 0x26, 0xF1, 0xC6, 0xF5, 0xB4, 0xFC, 0x80, 0x72, 0x3D, 0x85, 0x71, 0xF9, 0xA7, 0x57, 0xDA, 0x25, 0xDD, 0x67, - 0x5C, 0x3A, 0x5C, 0xB1, 0x2D, 0x50, 0x2A, 0x86, 0x1E, 0xAD, 0x23, 0x60, 0x9F, 0x5B, 0x0B, 0x3C, 0x72, 0x07, 0x52, 0x5D, 0xE4, 0x91, 0xB0, 0x27, 0x08, 0xA4, - 0x3B, 0x46, 0xF4, 0x18, 0xB7, 0x6A, 0x3C, 0xEE, 0x30, 0x15, 0x9B, 0x5D, 0x97, 0x4F, 0xC3, 0x66, 0xD7, 0xA0, 0x26, 0xF3, 0x0A, 0xB7, 0xA0, 0x9B, 0x1A, 0xE8, - 0xAB, 0x11, 0x45, 0x61, 0xAF, 0x0F, 0xA3, 0x28, 0xCA, 0xEF, 0x43, 0x2B, 0x0A, 0xAC, 0xE5, 0x13, 0x8E, 0xA3, 0x55, 0x9C, 0x8A, 0x02, 0xEA, 0x93, 0x77, 0x86, - 0xB3, 0x81, 0x41, 0xA6, 0x29, 0x85, 0x85, 0x1D, 0x3F, 0x98, 0x7B, 0x71, 0xBE, 0x1F, 0x5A, 0x75, 0x40, 0xC8, 0xCA, 0x35, 0xCB, 0x4F, 0x77, 0x38, 0x1C, 0x0B, - 0x89, 0xEF, 0xE0, 0xA8, 0x74, 0x62, 0x20, 0x30, 0xEC, 0x38, 0x23, 0x60, 0x53, 0xA9, 0xEA, 0xC9, 0xC0, 0x87, 0x8D, 0xE3, 0xDC, 0xD6, 0xC9, 0x04, 0x2E, 0x6C, - 0x77, 0x63, 0x56, 0xC7, 0x00, 0x69, 0xC0, 0x3F, 0xE6, 0x73, 0x6B, 0x56, 0x3D, 0x91, 0x80, 0x24, 0xE0, 0xAD, 0xBB, 0x52, 0x84, 0xDF, 0xF1, 0xC0, 0x4B, 0x66, - 0x15, 0x66, 0x72, 0x33, 0xD0, 0xE2, 0xE5, 0x45, 0xA3, 0x03, 0x2F, 0xF4, 0xF9, 0x40, 0x91, 0x01, 0xB9, 0x7D, 0xE8, 0xA0, 0x00, 0x44, 0x7C, 0xA2, 0xC6, 0x53, - 0x45, 0x59, 0x0C, 0x32, 0x8C, 0xE8, 0x62, 0xFA, 0xFD, 0x50, 0xF3, 0xBB, 0x88, 0xA2, 0xE4, 0xEC, 0xAE, 0x37, 0x1A, 0x8C, 0xC3, 0xE9, 0xDD, 0xA0, 0x7F, 0xBF, - 0x13, 0x3C, 0x44, 0xBE, 0x5B, 0xFD, 0xF4, 0xAB, 0xA8, 0x06, 0xA2, 0xD1, 0x77, 0xB8, 0xCE, 0x50, 0x22, 0x60, 0xD7, 0x77, 0xA4, 0xFE, 0xC3, 0x79, 0x52, 0xFF, - 0x11, 0xB8, 0xD2, 0xA2, 0x42, 0xC4, 0x5B, 0x60, 0xC4, 0x7B, 0x73, 0xD1, 0x8C, 0x86, 0x16, 0x0F, 0x16, 0xEA, 0x16, 0x0F, 0x1A, 0xEA, 0x34, 0xBE, 0x43, 0x4D, - 0x48, 0xA1, 0x62, 0x06, 0xCB, 0x01, 0x59, 0x2D, 0xAB, 0x4E, 0x90, 0xEB, 0xDD, 0xD4, 0x89, 0x72, 0x82, 0x8C, 0x64, 0x90, 0x1B, 0x47, 0xAB, 0x22, 0xA3, 0xFB, - 0x5D, 0xD6, 0x1D, 0x16, 0x51, 0x5B, 0xC7, 0x69, 0x3C, 0xE3, 0xFA, 0xD3, 0x62, 0x65, 0x94, 0x56, 0x06, 0x87, 0x03, 0x5D, 0xBC, 0x7B, 0xD9, 0x64, 0xBA, 0x20, - 0xFA, 0x7D, 0x18, 0x3F, 0x0A, 0xB9, 0x7E, 0xE8, 0x58, 0x67, 0x13, 0xA7, 0x7C, 0xB0, 0x43, 0x20, 0x7D, 0xF2, 0x2D, 0x71, 0x7C, 0xED, 0xC2, 0xF5, 0xF8, 0xBB, - 0x18, 0x1B, 0xD1, 0x1A, 0xED, 0xF9, 0x61, 0x54, 0xC6, 0x98, 0x7E, 0x68, 0x7D, 0x2D, 0x57, 0x96, 0xE7, 0xB9, 0x5E, 0x69, 0x95, 0x71, 0x38, 0x98, 0x56, 0xB4, - 0xDF, 0xD1, 0xA3, 0x46, 0xD4, 0x25, 0x7A, 0x7D, 0x18, 0x8D, 0x85, 0x3C, 0x3F, 0xB4, 0xD2, 0xAE, 0xE6, 0xB6, 0xB5, 0x2E, 0xAD, 0x32, 0x0A, 0xA5, 0x4F, 0x3E, - 0xB6, 0xBF, 0x86, 0xBF, 0x8D, 0xA8, 0x8B, 0xF5, 0xF8, 0x30, 0xCA, 0xE2, 0xDC, 0x3E, 0xB4, 0xAA, 0xA6, 0xEB, 0xF2, 0xE1, 0x10, 0x60, 0xF4, 0xC9, 0xAB, 0xF7, - 0xCD, 0xE4, 0x7E, 0xD8, 0x99, 0xA2, 0x86, 0x6A, 0xE9, 0x83, 0x32, 0xF5, 0xD0, 0xDA, 0xB8, 0xAE, 0xA0, 0x8D, 0x6B, 0x24, 0xFC, 0xA7, 0x86, 0xB4, 0x71, 0xAD, - 0xAE, 0x8D, 0x7B, 0xF6, 0x97, 0xEB, 0xC7, 0xA0, 0x1F, 0xFA, 0xB0, 0xDF, 0xD4, 0x28, 0x3F, 0x1C, 0x09, 0x40, 0xDC, 0x34, 0x06, 0x47, 0xDA, 0x2B, 0xA3, 0x99, - 0x01, 0x29, 0xEC, 0xB7, 0x09, 0x17, 0x8A, 0x98, 0x7C, 0x68, 0x3D, 0xD9, 0xC4, 0xAC, 0x90, 0xE4, 0x99, 0x9F, 0xF0, 0xC9, 0x39, 0x7C, 0xA2, 0xFC, 0x16, 0xB2, - 0xBD, 0xCB, 0xD7, 0xDA, 0x37, 0xE2, 0xF4, 0xA1, 0x0A, 0x43, 0x49, 0x9A, 0x92, 0xF3, 0xA6, 0xFE, 0x68, 0x57, 0xDB, 0x32, 0x00, 0xF3, 0x0E, 0x75, 0x33, 0x37, - 0x66, 0xE4, 0x93, 0x49, 0x82, 0x2A, 0xEB, 0xFE, 0x31, 0x58, 0x7D, 0xF2, 0x35, 0x9C, 0x68, 0xAF, 0xE9, 0x49, 0x53, 0xE9, 0x78, 0xBC, 0xFF, 0x26, 0x3C, 0x2A, - 0xC1, 0xEF, 0x43, 0x3B, 0x15, 0x25, 0x06, 0x26, 0x3F, 0xEE, 0xC2, 0xA9, 0xF4, 0xDC, 0x53, 0x02, 0x9C, 0xAB, 0xEF, 0x7B, 0x76, 0xDE, 0xAC, 0x02, 0x23, 0x22, - 0x1A, 0xD3, 0x61, 0x8C, 0xEF, 0x26, 0xD4, 0x18, 0x7F, 0xF8, 0x91, 0xBF, 0x36, 0xB8, 0x48, 0x53, 0xFC, 0x21, 0x3C, 0xBA, 0xDD, 0x88, 0x04, 0x6D, 0x3F, 0xB0, - 0x6C, 0x5B, 0x9F, 0xBC, 0x21, 0x81, 0xF6, 0x01, 0x0F, 0x15, 0x9F, 0xBA, 0x8B, 0x61, 0x11, 0xCF, 0xDC, 0x06, 0x1E, 0x31, 0x56, 0xFA, 0xE4, 0x03, 0xBE, 0x50, - 0x19, 0x70, 0xE1, 0x59, 0x79, 0x64, 0x54, 0x88, 0xC4, 0xF1, 0x5C, 0x20, 0x2A, 0x54, 0x12, 0x7F, 0x51, 0xA3, 0xAE, 0x89, 0xA3, 0xD8, 0xB5, 0xC9, 0x25, 0x6D, - 0xAC, 0xA1, 0x95, 0x15, 0x77, 0x17, 0x7F, 0x1C, 0x30, 0xDF, 0x39, 0xE8, 0x03, 0xC0, 0xF8, 0x44, 0x6F, 0xF2, 0x7D, 0xEB, 0xA0, 0x56, 0xF6, 0x7C, 0xFF, 0xE4, - 0xCC, 0x5F, 0x1B, 0x8E, 0x68, 0x46, 0x1F, 0x7E, 0xBF, 0xE6, 0x4F, 0x33, 0x4F, 0x5D, 0xDB, 0xFC, 0x2A, 0xB6, 0xF0, 0xFF, 0x21, 0x7C, 0x2C, 0x17, 0x41, 0xC0, - 0x2E, 0x04, 0x86, 0x02, 0xE5, 0x2E, 0x3D, 0x81, 0x9E, 0x3D, 0x41, 0x8D, 0x6F, 0xEB, 0xCA, 0xD1, 0x6E, 0xC6, 0x93, 0xC4, 0x1E, 0x59, 0x84, 0x92, 0x94, 0x3D, - 0x61, 0x2E, 0x7D, 0xAE, 0xF8, 0x7B, 0xB2, 0xB0, 0x7C, 0xA0, 0x51, 0x03, 0xBB, 0x38, 0xA4, 0xCF, 0x62, 0x32, 0x5B, 0x56, 0x7B, 0xCE, 0x37, 0xDE, 0x25, 0x7F, - 0x4D, 0x81, 0xF4, 0xF1, 0xED, 0x52, 0xA9, 0x63, 0xFA, 0x59, 0xEB, 0x24, 0xC6, 0x22, 0xAB, 0x7F, 0xDA, 0x6E, 0x2F, 0x87, 0xF8, 0x54, 0xA9, 0x26, 0x58, 0x3B, - 0x3B, 0x5C, 0x0E, 0x8B, 0x9E, 0xDA, 0x2B, 0x7C, 0x24, 0x18, 0x38, 0xAD, 0xFC, 0x44, 0x30, 0x4A, 0x69, 0x02, 0xD4, 0x1C, 0x68, 0xEF, 0x0C, 0xFF, 0xF3, 0x81, - 0xF6, 0x11, 0x87, 0xF8, 0x06, 0x1F, 0x0C, 0x46, 0xDA, 0x0D, 0xD3, 0xF4, 0x32, 0x1F, 0x0E, 0x1E, 0x26, 0x1E, 0x0E, 0x1E, 0x8B, 0x87, 0x83, 0xA3, 0x95, 0xAA, - 0xEE, 0xCD, 0xA0, 0xDB, 0x3D, 0x56, 0x61, 0x5D, 0xF1, 0x01, 0xE1, 0x7B, 0xE1, 0x69, 0x05, 0xD2, 0x54, 0xE4, 0x69, 0x28, 0x78, 0x8A, 0x6D, 0xD8, 0xBF, 0x99, - 0xCF, 0x1F, 0x1B, 0x47, 0x7C, 0xC9, 0xB0, 0x3A, 0x4B, 0xDD, 0x7E, 0xD3, 0x4F, 0x71, 0x53, 0xE3, 0xBE, 0xAF, 0x87, 0xB8, 0x69, 0x93, 0x74, 0x34, 0x1C, 0xE5, - 0x06, 0x43, 0x0A, 0xC2, 0x9C, 0xFE, 0xCD, 0x7D, 0x3A, 0xFD, 0xA2, 0x86, 0xD3, 0x2F, 0xB6, 0x9C, 0xBE, 0x41, 0x6F, 0x17, 0x84, 0xFF, 0xD5, 0x3C, 0x5E, 0xF0, - 0x55, 0xC2, 0xEB, 0xA5, 0x7C, 0x75, 0xBB, 0xF7, 0xEA, 0xF7, 0x85, 0x4E, 0x12, 0x1A, 0xC3, 0x9B, 0xFB, 0x74, 0x92, 0x0C, 0xD3, 0xAD, 0x64, 0xA7, 0x3C, 0xEC, - 0x4C, 0x9A, 0x19, 0x97, 0x68, 0x36, 0x15, 0x57, 0x28, 0xEF, 0x1D, 0x1F, 0xD7, 0x1D, 0x0C, 0x79, 0xEA, 0x74, 0x1F, 0xEA, 0x51, 0x7F, 0x61, 0x44, 0x66, 0x93, - 0xFB, 0x49, 0xCC, 0xD6, 0xB1, 0x14, 0x57, 0x39, 0x31, 0x7B, 0xFF, 0xED, 0xB7, 0xE5, 0x72, 0xB1, 0x78, 0x2F, 0x8F, 0x24, 0x17, 0xCB, 0x2D, 0x53, 0xDF, 0xAE, - 0xE1, 0x06, 0x52, 0x5D, 0xC9, 0x74, 0x23, 0x70, 0x7D, 0xF2, 0x8A, 0x1E, 0x6B, 0x31, 0x89, 0x95, 0x32, 0x5E, 0xE5, 0x59, 0x27, 0x05, 0x8C, 0xD5, 0xB1, 0x23, - 0x12, 0xD2, 0xBA, 0x51, 0xC4, 0x95, 0x53, 0xBB, 0x8E, 0xB1, 0xA7, 0xCE, 0x54, 0x6D, 0x9F, 0xA0, 0x4D, 0x8A, 0x52, 0xE1, 0xD5, 0xC6, 0xAE, 0xAC, 0x36, 0x0E, - 0xAB, 0x4F, 0xDE, 0xC1, 0x64, 0xDC, 0x5A, 0xDB, 0x16, 0xCC, 0x3C, 0x5A, 0x5D, 0xAD, 0xAD, 0x0D, 0x7A, 0xFB, 0x0D, 0x8E, 0x91, 0x82, 0x8C, 0x92, 0x6F, 0xCB, - 0xE9, 0x45, 0x0F, 0xB3, 0x0D, 0xEE, 0xE9, 0x75, 0x39, 0x75, 0x15, 0xE2, 0xB9, 0x6E, 0x50, 0x59, 0x1B, 0x02, 0x18, 0x12, 0x15, 0x38, 0xD2, 0x22, 0x9D, 0xA8, - 0xAB, 0x22, 0xB6, 0xB5, 0x36, 0xC2, 0xA6, 0xA6, 0x0E, 0xA5, 0x8D, 0xB4, 0xB8, 0x3F, 0x45, 0x75, 0x07, 0xAA, 0x04, 0x6B, 0x4F, 0x9F, 0xF4, 0x4B, 0x60, 0x28, - 0xDE, 0x87, 0xCA, 0x5A, 0xD5, 0x77, 0x22, 0xFF, 0xB6, 0x7A, 0xEC, 0xE3, 0xB0, 0x90, 0x76, 0xDF, 0x42, 0xAA, 0xBB, 0xD2, 0x5E, 0x43, 0x5F, 0xD4, 0x89, 0x7A, - 0xA3, 0x26, 0x9D, 0x48, 0x90, 0x51, 0xDD, 0x89, 0x7A, 0x8F, 0xC3, 0x87, 0x50, 0x1F, 0x6B, 0x8F, 0x54, 0xD6, 0x07, 0x87, 0xD5, 0x27, 0xEF, 0x3D, 0x82, 0xCA, - 0xA8, 0xE4, 0x3D, 0x21, 0x92, 0x6A, 0xCE, 0x73, 0x0F, 0x8E, 0xD2, 0xEB, 0x8C, 0xEA, 0xE1, 0xE8, 0x97, 0x73, 0x36, 0x09, 0x86, 0x81, 0x3C, 0x08, 0x0C, 0x1E, - 0xA7, 0x0B, 0x13, 0xDB, 0x1C, 0x55, 0x77, 0x62, 0x01, 0x8D, 0xB3, 0x67, 0x38, 0xAC, 0x6C, 0x38, 0x31, 0x44, 0x8F, 0x2A, 0xEE, 0xD6, 0xC4, 0x70, 0x1F, 0xC6, - 0x34, 0xE9, 0x97, 0x32, 0xE9, 0x66, 0x4C, 0x67, 0x8D, 0x2F, 0x17, 0x24, 0x6A, 0x7B, 0x3E, 0x29, 0xB2, 0x78, 0xA4, 0x61, 0xB0, 0x10, 0x69, 0xE8, 0xEB, 0x05, - 0xE9, 0x5E, 0xF7, 0x46, 0x73, 0x5E, 0x41, 0xC0, 0xF6, 0x32, 0x4B, 0xF9, 0xAD, 0x01, 0x31, 0xE6, 0x64, 0x29, 0x70, 0xC8, 0xEB, 0x63, 0xCB, 0x7F, 0x29, 0x61, - 0x95, 0xC7, 0x0A, 0x0E, 0xCC, 0x55, 0x18, 0x0E, 0xDD, 0xCD, 0xE6, 0xBF, 0x21, 0x15, 0x35, 0xC6, 0xEE, 0x06, 0x13, 0xE0, 0xD8, 0xB2, 0x11, 0x55, 0x00, 0x0B, - 0x9A, 0x01, 0x9B, 0xF1, 0x95, 0x58, 0x09, 0xCA, 0x6C, 0x72, 0x3F, 0xF3, 0xFC, 0x6B, 0xCB, 0x29, 0x3F, 0xCF, 0xFF, 0xC9, 0x72, 0x4C, 0xF7, 0xBA, 0xDC, 0x54, - 0x3F, 0xDE, 0xD1, 0x9F, 0x60, 0xAA, 0x4F, 0x07, 0x4B, 0x5C, 0x2C, 0x6C, 0x7B, 0x44, 0xED, 0xA5, 0x33, 0x69, 0x21, 0x33, 0xE8, 0x1B, 0x5C, 0x6A, 0x03, 0x14, - 0xBE, 0x46, 0x97, 0x1E, 0x77, 0xED, 0x2F, 0x3F, 0x9F, 0xC6, 0x93, 0x5D, 0x4E, 0x81, 0x9A, 0xC3, 0x0C, 0x25, 0x85, 0xC7, 0x07, 0xAF, 0xA5, 0xFE, 0xB2, 0xCD, - 0xCF, 0xED, 0x83, 0xF3, 0x73, 0x1F, 0x01, 0x99, 0x38, 0x66, 0x65, 0xCB, 0x42, 0xD8, 0xC8, 0xAE, 0x2E, 0x1D, 0xB3, 0x51, 0xAB, 0x62, 0xBD, 0x57, 0xD6, 0x41, - 0xBF, 0x7B, 0x74, 0xF2, 0xB8, 0xCC, 0x0A, 0x19, 0xAA, 0x61, 0x54, 0xBD, 0xD1, 0xF0, 0xE8, 0xF1, 0xD8, 0x95, 0x3B, 0x9F, 0xB3, 0x15, 0xAE, 0x6A, 0xA6, 0xC5, - 0xC1, 0x6F, 0xE8, 0xA3, 0xB4, 0x3E, 0x69, 0x36, 0x5E, 0x85, 0x9D, 0xAB, 0xE9, 0x62, 0x20, 0xD1, 0xC5, 0xF8, 0x71, 0x99, 0x16, 0xE7, 0x48, 0xD5, 0xBA, 0x24, - 0x1C, 0xDD, 0x13, 0x43, 0xF7, 0x61, 0x5A, 0x81, 0x1B, 0x18, 0x76, 0x65, 0xCB, 0x62, 0xD0, 0x60, 0x58, 0x3F, 0xE0, 0x81, 0xF6, 0x01, 0xF8, 0x6C, 0xD4, 0xB8, - 0x44, 0xFF, 0xD5, 0x03, 0xD7, 0xA0, 0xFB, 0xC8, 0xC6, 0x43, 0xC6, 0x52, 0xAD, 0xD0, 0x35, 0x1E, 0x3E, 0x1E, 0xFB, 0x72, 0x37, 0x01, 0x5E, 0xAD, 0x1C, 0xBA, - 0x18, 0x38, 0x86, 0x2E, 0x7A, 0xD4, 0xBC, 0x89, 0x85, 0x14, 0xD4, 0x18, 0x1C, 0x87, 0x0F, 0xBF, 0x7E, 0xFD, 0x8B, 0x84, 0xA7, 0x5A, 0x46, 0x36, 0x78, 0x2C, - 0x41, 0x6C, 0x66, 0x28, 0xBF, 0x88, 0x8D, 0x22, 0x8B, 0x67, 0xF3, 0x0C, 0x16, 0xE6, 0x70, 0xEC, 0xA0, 0xD1, 0x0A, 0x86, 0xE8, 0xFC, 0xDE, 0x97, 0xEC, 0x42, - 0xAE, 0x1E, 0x53, 0xBD, 0x62, 0x6A, 0x39, 0x4E, 0x55, 0x35, 0x71, 0x58, 0x7D, 0xF2, 0x8A, 0x1D, 0x34, 0xBB, 0xB8, 0xCA, 0x3B, 0xBF, 0xFF, 0x95, 0x55, 0xC1, - 0x55, 0xD3, 0x6A, 0x4A, 0x15, 0x31, 0xBC, 0xF0, 0x4B, 0x11, 0x3A, 0xDF, 0xAD, 0x18, 0x7D, 0x39, 0xE2, 0xF1, 0x94, 0x34, 0x16, 0xC6, 0x0A, 0x9F, 0x30, 0x2E, - 0x5B, 0xD4, 0x78, 0x83, 0x60, 0xE5, 0x6A, 0x1A, 0xC9, 0x9E, 0x1E, 0x77, 0x55, 0x63, 0x92, 0x7C, 0xB5, 0x24, 0x10, 0xDE, 0x9E, 0x5A, 0x86, 0x8F, 0x4F, 0xE3, - 0xC3, 0xB1, 0xF6, 0x0A, 0x8E, 0xB5, 0xF7, 0xF6, 0x26, 0x7C, 0x37, 0xAE, 0xCC, 0x21, 0xE2, 0x3B, 0x9B, 0x22, 0x0C, 0x59, 0xDB, 0xD7, 0xE9, 0x86, 0x2E, 0xFE, - 0x14, 0x16, 0x1C, 0xE3, 0x3E, 0xA6, 0xD1, 0xF0, 0xB8, 0xAB, 0x6B, 0x2C, 0x2B, 0xE6, 0xCF, 0x90, 0xF8, 0x9F, 0xE9, 0x06, 0xA7, 0x5E, 0x48, 0xA0, 0xCC, 0x01, - 0xE2, 0xF4, 0x86, 0x04, 0x52, 0xFB, 0xAD, 0xB3, 0xEF, 0x68, 0x5B, 0x22, 0x3D, 0x21, 0x8E, 0xAE, 0xD4, 0x10, 0x12, 0x2F, 0xC3, 0x64, 0xED, 0x55, 0x9E, 0x86, - 0x91, 0x0B, 0xA2, 0x27, 0x15, 0x04, 0xEE, 0xF3, 0xBA, 0x5F, 0x9E, 0xFA, 0x82, 0xA7, 0x9E, 0x1A, 0x4F, 0xFD, 0x1A, 0x3C, 0xF5, 0x1B, 0xE2, 0x69, 0x20, 0x78, - 0xEA, 0xAB, 0xF1, 0x34, 0xA8, 0xC1, 0xD3, 0xA0, 0x21, 0x9E, 0x86, 0x82, 0xA7, 0x81, 0x1A, 0x4F, 0xC3, 0x1A, 0x3C, 0x0D, 0x1B, 0xE2, 0x69, 0x24, 0x78, 0x1A, - 0xAA, 0xF1, 0x34, 0xAA, 0xC1, 0xD3, 0xA8, 0x21, 0x9E, 0xC6, 0x82, 0xA7, 0x91, 0x1A, 0x4F, 0xE3, 0x1A, 0x3C, 0x8D, 0x1B, 0xE2, 0xE9, 0x48, 0xF0, 0x34, 0x56, - 0xE3, 0xE9, 0xA8, 0x06, 0x4F, 0x47, 0x0D, 0xF1, 0x74, 0x2C, 0x78, 0x3A, 0x52, 0xE3, 0xE9, 0xB8, 0x06, 0x4F, 0xC7, 0x0D, 0xF1, 0x74, 0x22, 0x78, 0x3A, 0x56, - 0xE3, 0xE9, 0xA4, 0x06, 0x4F, 0x27, 0x0D, 0xF1, 0x84, 0x8B, 0x72, 0x8C, 0xA9, 0x13, 0xC5, 0x41, 0xB7, 0x5B, 0x83, 0x2B, 0xA3, 0x29, 0xAE, 0xC2, 0x54, 0xA2, - 0xA7, 0x9A, 0x4B, 0xD4, 0x49, 0x26, 0xA6, 0x4D, 0xB1, 0x15, 0x65, 0x13, 0x8A, 0xE9, 0x44, 0xAF, 0x4E, 0x3E, 0x31, 0x6B, 0x8A, 0xAD, 0x30, 0xA1, 0xE8, 0x29, - 0x66, 0x14, 0xBD, 0x3A, 0x29, 0x85, 0xD9, 0x14, 0x5B, 0x61, 0x4E, 0xD1, 0x53, 0x4C, 0x2A, 0x7A, 0x75, 0xB2, 0x0A, 0xD2, 0x14, 0x5B, 0x61, 0x5A, 0xD1, 0x53, - 0xCC, 0x2B, 0x7A, 0x75, 0x12, 0x8B, 0x79, 0x53, 0x6C, 0x85, 0x99, 0x45, 0x4F, 0x31, 0xB5, 0xE8, 0xD5, 0xC8, 0x2D, 0x4E, 0xE4, 0x13, 0xB1, 0x7B, 0x65, 0x8B, - 0x04, 0x7C, 0x8A, 0x1C, 0x4D, 0xDA, 0x94, 0x1E, 0x3D, 0xE1, 0x40, 0xF8, 0x6C, 0x14, 0x13, 0xC8, 0x85, 0xEB, 0xCC, 0xAD, 0x45, 0x58, 0x64, 0x78, 0x34, 0x4F, - 0x49, 0xF8, 0xB1, 0xB7, 0xF2, 0x2A, 0x17, 0x1A, 0x3E, 0xBC, 0xBE, 0x2C, 0x57, 0x66, 0x88, 0xF7, 0xF2, 0x27, 0x2A, 0x32, 0x00, 0xD9, 0xFD, 0xF8, 0x27, 0x02, - 0x94, 0xEA, 0x0A, 0x14, 0xA8, 0x4C, 0x45, 0x61, 0x14, 0xAF, 0x28, 0x8C, 0x95, 0x2B, 0x0A, 0x8C, 0xB8, 0xDD, 0xD4, 0x12, 0x00, 0xF7, 0x80, 0x7D, 0xD7, 0x40, - 0x9D, 0xE9, 0x41, 0x75, 0xA6, 0x47, 0x65, 0x98, 0x1E, 0x54, 0x61, 0xBA, 0xC2, 0xD3, 0x8D, 0x8A, 0x72, 0x02, 0x7A, 0xBF, 0xB6, 0x6E, 0x88, 0xA9, 0xFD, 0xA2, - 0x2E, 0xAA, 0x5E, 0x75, 0x51, 0x1D, 0x95, 0x11, 0x55, 0x6F, 0x87, 0xF6, 0x31, 0x12, 0x7C, 0xFF, 0xA8, 0xCE, 0xF7, 0xA8, 0x3A, 0xDF, 0x83, 0x32, 0x7C, 0x8F, - 0x76, 0xC8, 0xF7, 0x50, 0xF0, 0xFD, 0x51, 0x9D, 0xEF, 0x61, 0x75, 0xBE, 0x87, 0x65, 0xF8, 0x1E, 0xEE, 0x90, 0xEF, 0x3E, 0x04, 0x9B, 0x1F, 0x3F, 0x6A, 0x3F, - 0x2C, 0x3D, 0xE2, 0x2F, 0x8B, 0x2B, 0x71, 0x0C, 0xA2, 0xEA, 0xD8, 0x3E, 0x6A, 0x60, 0xEE, 0x86, 0x14, 0x0E, 0xE2, 0x3C, 0x15, 0xE6, 0xCD, 0x0C, 0x42, 0xE5, - 0xC3, 0x41, 0x72, 0x9E, 0xE4, 0x33, 0xB7, 0x9E, 0x2A, 0x53, 0xBB, 0x8B, 0x61, 0xC7, 0xFA, 0xE4, 0xED, 0xA6, 0xC4, 0xF8, 0x76, 0x5C, 0xDD, 0x9E, 0xD5, 0x2B, - 0xE6, 0x8C, 0xAE, 0x9D, 0xD9, 0xF3, 0x09, 0xE5, 0x19, 0xF2, 0x32, 0x5F, 0x41, 0xED, 0xD5, 0xAB, 0x10, 0xA3, 0x06, 0xAA, 0xE4, 0x18, 0xE9, 0x8F, 0x18, 0x3B, - 0x3F, 0x22, 0x43, 0x1A, 0x64, 0x2C, 0x25, 0x06, 0xA3, 0xA3, 0x92, 0xDA, 0x3C, 0xAE, 0x18, 0x9D, 0x90, 0xC6, 0x9D, 0xA9, 0x13, 0xA7, 0x1E, 0x28, 0x80, 0x8F, - 0x15, 0x04, 0x30, 0xAE, 0x2E, 0x80, 0x52, 0x99, 0x0B, 0xD2, 0xB8, 0x3B, 0x01, 0x74, 0x99, 0x00, 0x3E, 0x44, 0x6F, 0xA6, 0xCE, 0x31, 0xE8, 0x1A, 0x15, 0xA8, - 0x51, 0x03, 0x6B, 0x24, 0x18, 0x69, 0x7B, 0xC2, 0xA2, 0x81, 0xA3, 0x72, 0x0A, 0xED, 0x97, 0xCD, 0xAF, 0xE4, 0xC5, 0x4F, 0x85, 0xFC, 0x7B, 0x97, 0x09, 0x56, - 0xBF, 0x2B, 0x2C, 0xBA, 0xBC, 0x00, 0xBA, 0xD5, 0x05, 0xD0, 0x2B, 0x25, 0x80, 0xEE, 0xE3, 0x4A, 0xC6, 0xC7, 0xDB, 0x1F, 0x13, 0x2E, 0x96, 0x56, 0x59, 0xF7, - 0x8F, 0x8D, 0x66, 0xFD, 0x32, 0xC2, 0xDA, 0xA9, 0xF7, 0x0F, 0x22, 0xCE, 0xB5, 0x5F, 0xB4, 0xE4, 0xD6, 0xD7, 0xBC, 0x38, 0x50, 0xBD, 0x08, 0x38, 0x6A, 0x60, - 0xBD, 0x0A, 0x29, 0x3C, 0x91, 0x70, 0x56, 0x32, 0xC0, 0x9F, 0x54, 0x77, 0x87, 0x52, 0x1A, 0x46, 0x5A, 0x77, 0xA7, 0xE2, 0x51, 0x42, 0x10, 0xEC, 0x43, 0xE6, - 0x2A, 0x2A, 0xAE, 0x5E, 0x39, 0x1C, 0x35, 0xB0, 0xD4, 0x85, 0x14, 0x1E, 0x4B, 0x38, 0x2B, 0xA9, 0xE2, 0xB2, 0x29, 0xE9, 0x71, 0xC5, 0xA9, 0x65, 0x6F, 0x97, - 0x39, 0x29, 0x56, 0xBB, 0x63, 0x82, 0x88, 0x7F, 0x65, 0x22, 0x4F, 0xC1, 0xD5, 0x2B, 0xDE, 0xA3, 0x9A, 0xEB, 0xB3, 0xBB, 0x8B, 0xE4, 0x47, 0xB2, 0x4F, 0x90, - 0x17, 0xDB, 0x41, 0xD9, 0x5C, 0xB6, 0x5B, 0x71, 0xE0, 0xDB, 0x69, 0x2A, 0x0B, 0xBD, 0x43, 0xD6, 0xB3, 0xCD, 0x7D, 0x8E, 0x09, 0x54, 0x5F, 0x79, 0x1B, 0x35, - 0xB0, 0x3D, 0x04, 0x29, 0xEC, 0xEB, 0x93, 0x8F, 0x25, 0x99, 0xAA, 0x53, 0x3F, 0xA8, 0xBC, 0x3F, 0xA4, 0xB9, 0xD2, 0xFB, 0x6C, 0x75, 0x53, 0xBE, 0xF4, 0x7E, - 0xF1, 0xEE, 0xE7, 0x72, 0xA5, 0xF7, 0x78, 0x2F, 0xCD, 0x95, 0xDE, 0xAB, 0xD9, 0x4C, 0xA9, 0x8D, 0xB2, 0xC0, 0x18, 0xBE, 0x3F, 0x62, 0x66, 0xF9, 0xB4, 0x4B, - 0x10, 0x8C, 0xF6, 0x5E, 0x9C, 0x86, 0x22, 0x8A, 0x3D, 0xB1, 0x9F, 0x6C, 0x9F, 0x67, 0x3D, 0x83, 0x9C, 0xB0, 0xA0, 0xB6, 0x11, 0x76, 0xFB, 0x75, 0x28, 0x9D, - 0x31, 0xFF, 0x10, 0x57, 0x8D, 0x47, 0xEB, 0xB3, 0x5E, 0x1A, 0xD0, 0x39, 0x2A, 0x89, 0x7B, 0xE7, 0x8F, 0xDC, 0x4F, 0x52, 0x8A, 0xEA, 0x51, 0xFD, 0xF4, 0xF0, - 0x5C, 0xB9, 0x4E, 0x4E, 0xC1, 0xCA, 0x44, 0xF3, 0x41, 0xBC, 0xD4, 0xA2, 0x1E, 0xCD, 0x19, 0x79, 0xBB, 0x89, 0xE6, 0x88, 0x3B, 0xC1, 0x7B, 0x89, 0xAC, 0x86, - 0xC1, 0x96, 0x13, 0x80, 0x7C, 0x13, 0x85, 0x82, 0x00, 0xB2, 0x24, 0x70, 0x2F, 0x22, 0xE8, 0x53, 0x09, 0xF4, 0x53, 0xDA, 0xCF, 0x08, 0xFC, 0xB4, 0x7D, 0xD5, - 0xB8, 0x3F, 0x68, 0xA0, 0x36, 0x81, 0xE2, 0x4A, 0x70, 0x54, 0x52, 0xA7, 0xE5, 0x16, 0x07, 0x13, 0x3A, 0x2D, 0x67, 0xD4, 0x3B, 0x5B, 0x1D, 0x04, 0xE4, 0x03, - 0x2A, 0x80, 0x81, 0xB2, 0x4A, 0xAB, 0x4F, 0x33, 0x07, 0x0D, 0xE4, 0x27, 0x28, 0xAD, 0x04, 0x47, 0x25, 0x55, 0x5A, 0x6E, 0xE9, 0x33, 0xA1, 0x52, 0xF5, 0xF9, - 0x25, 0x27, 0x72, 0x67, 0x2A, 0x1D, 0x52, 0x01, 0x0C, 0x95, 0x55, 0x5A, 0x7D, 0xD6, 0x31, 0x68, 0x60, 0xF7, 0x2E, 0x4A, 0x2B, 0xC1, 0x51, 0x49, 0x95, 0x96, - 0x5B, 0xB2, 0x4B, 0xA8, 0x54, 0x7D, 0x3E, 0xC9, 0x89, 0xDC, 0x99, 0x4A, 0x47, 0x54, 0x00, 0x23, 0x65, 0x95, 0x56, 0xAF, 0x14, 0x0C, 0x1A, 0x28, 0x06, 0xA1, - 0xB4, 0x12, 0x1C, 0x95, 0x54, 0x69, 0xB9, 0xD5, 0xE7, 0x84, 0x4A, 0xD5, 0xD7, 0x39, 0x38, 0x91, 0x3B, 0x53, 0xE9, 0x98, 0x0A, 0x60, 0xAC, 0xAC, 0xD2, 0xEA, - 0xFB, 0xAB, 0x06, 0x0D, 0xEC, 0xDD, 0x46, 0x69, 0x25, 0x38, 0x2A, 0xA9, 0xD2, 0x72, 0xA5, 0xDB, 0x84, 0x4A, 0xD5, 0x57, 0x6E, 0x38, 0x91, 0x3B, 0x53, 0xE9, - 0x11, 0x15, 0xC0, 0x91, 0xB2, 0x4A, 0xAB, 0x6F, 0x5D, 0x1F, 0x34, 0x50, 0xCF, 0x43, 0x69, 0x25, 0x38, 0x2A, 0xA9, 0xD2, 0x72, 0x15, 0x9C, 0x84, 0x4A, 0xD5, - 0xF7, 0x4E, 0x71, 0x22, 0x77, 0xA6, 0xD2, 0x63, 0x2A, 0x80, 0x63, 0x65, 0x95, 0x56, 0xDF, 0xB9, 0x3F, 0x68, 0x60, 0xE7, 0x3E, 0x4A, 0x2B, 0xC1, 0x51, 0x49, - 0x95, 0x96, 0xAB, 0xCD, 0x26, 0x54, 0xAA, 0xBE, 0xDD, 0x89, 0x13, 0xB9, 0x33, 0x95, 0x9E, 0x50, 0x01, 0x9C, 0x28, 0xAB, 0xB4, 0xFA, 0x96, 0x81, 0x41, 0x03, - 0x9B, 0x5F, 0x50, 0x5A, 0xDD, 0x38, 0x47, 0x25, 0x55, 0x5A, 0x6E, 0x81, 0x71, 0x90, 0xB1, 0xF5, 0x45, 0x41, 0xA5, 0x59, 0x0B, 0x8C, 0x8F, 0xA0, 0x7E, 0x67, - 0x5C, 0x4F, 0x2B, 0x7C, 0xFA, 0xE5, 0xE5, 0x4F, 0xAF, 0xB2, 0x0B, 0xFB, 0x99, 0x55, 0xBC, 0x44, 0x5F, 0x8F, 0xBD, 0x8C, 0x17, 0x97, 0x17, 0x12, 0x0E, 0x5A, - 0x66, 0x2F, 0x4D, 0xD4, 0xB6, 0x98, 0xCF, 0xB7, 0x34, 0x06, 0x5C, 0xC2, 0xD2, 0x06, 0xC3, 0xAE, 0x3C, 0x69, 0x29, 0xB0, 0x34, 0x4E, 0xE5, 0x6E, 0x82, 0x07, - 0x22, 0x87, 0xB9, 0x38, 0xF2, 0xFE, 0xBD, 0xD2, 0x9A, 0x0E, 0x03, 0x48, 0x86, 0x8F, 0x61, 0xF7, 0x44, 0x31, 0x7E, 0x80, 0x0C, 0xB2, 0x36, 0xC6, 0xDF, 0x63, - 0x00, 0x41, 0x1A, 0x07, 0x8C, 0xA9, 0x37, 0xCA, 0x4C, 0xA5, 0xAB, 0x00, 0xA5, 0x98, 0xCA, 0xAA, 0xEC, 0xDC, 0x33, 0x53, 0x43, 0xC6, 0x54, 0x8E, 0x93, 0xA6, - 0x98, 0x4A, 0xCF, 0x83, 0x4B, 0x31, 0x95, 0x35, 0x11, 0x8E, 0x98, 0x7A, 0x0C, 0x81, 0x8E, 0xCC, 0x8C, 0xC5, 0xAC, 0x42, 0xA8, 0xBB, 0xBC, 0x38, 0x7C, 0xF9, - 0xE6, 0x42, 0xA3, 0x4B, 0x9A, 0xAE, 0x5D, 0x32, 0xE2, 0x25, 0x3B, 0xFD, 0x53, 0xC5, 0x3C, 0x4A, 0x7A, 0x2C, 0xEA, 0xBD, 0xB9, 0x50, 0x0D, 0x78, 0x1C, 0xB2, - 0x4C, 0xC8, 0x1B, 0x75, 0x07, 0x55, 0x2A, 0x84, 0x21, 0x91, 0x3B, 0x0A, 0x7A, 0x14, 0x7D, 0x3F, 0x92, 0xC1, 0x65, 0x39, 0x19, 0x94, 0xAA, 0x92, 0x26, 0x65, - 0x50, 0x22, 0xEC, 0x0B, 0x22, 0x77, 0x29, 0x03, 0x8C, 0x92, 0x97, 0x17, 0xDA, 0xFB, 0xBF, 0x6B, 0x97, 0x37, 0x6B, 0xD7, 0xDF, 0x78, 0xA4, 0x30, 0xAA, 0x70, - 0xB8, 0x64, 0x5C, 0x19, 0x8F, 0x46, 0x03, 0xD5, 0xC0, 0x32, 0xCA, 0x1E, 0x02, 0xE6, 0xDD, 0x7B, 0x8C, 0x97, 0x94, 0xD0, 0x61, 0xC8, 0xE0, 0xF7, 0x04, 0x34, - 0xAD, 0x14, 0x37, 0x39, 0x60, 0x92, 0xC3, 0x5E, 0x17, 0xB7, 0x57, 0x2B, 0x32, 0x28, 0xCF, 0x28, 0x07, 0xF7, 0x3A, 0x1C, 0x50, 0x2A, 0x47, 0x21, 0x7B, 0x1F, - 0x7F, 0xF8, 0xA0, 0xC6, 0x58, 0xBA, 0x8E, 0x56, 0x4E, 0x75, 0x59, 0x8F, 0x8C, 0xDE, 0xD3, 0xA0, 0x20, 0xBD, 0x71, 0x76, 0x08, 0xA1, 0x77, 0x1B, 0x26, 0x43, - 0x92, 0x67, 0x73, 0x6B, 0x01, 0x76, 0x2C, 0xEF, 0x83, 0x8A, 0x96, 0xBD, 0xEC, 0x14, 0xBF, 0x51, 0xD9, 0x9E, 0x41, 0xF4, 0x07, 0x93, 0x40, 0xA7, 0x13, 0x02, - 0x5F, 0x19, 0x0B, 0x12, 0x5D, 0xD7, 0x58, 0x6C, 0xCF, 0x8B, 0xD9, 0x06, 0x43, 0x68, 0x5C, 0x11, 0xFE, 0x41, 0x4D, 0x6D, 0xE9, 0x91, 0xF9, 0xB9, 0xFE, 0x45, - 0x88, 0x93, 0x3F, 0x95, 0x87, 0x4D, 0x74, 0xCD, 0x74, 0xAF, 0x1D, 0xDB, 0x35, 0x70, 0x3C, 0x30, 0xD6, 0x01, 0x50, 0xDA, 0xF9, 0x6D, 0x8D, 0x2F, 0xBE, 0x32, - 0xF0, 0x21, 0x2E, 0x23, 0xA7, 0x9F, 0x98, 0x55, 0xCC, 0x6C, 0xD7, 0x17, 0xB3, 0x39, 0x3C, 0x0C, 0x3F, 0xC0, 0xF9, 0x3F, 0xFF, 0x5D, 0xB4, 0x83, 0xC0, 0x5A, - 0x2D, 0x62, 0x02, 0xD0, 0x35, 0xDF, 0x9B, 0x9D, 0xEB, 0x40, 0xA9, 0xE7, 0xFA, 0xBE, 0xEB, 0x59, 0x0B, 0x2B, 0x43, 0x3B, 0x59, 0xD2, 0x3E, 0x94, 0x89, 0x3B, - 0xD5, 0x58, 0xA2, 0xF8, 0x33, 0x7F, 0xE6, 0x59, 0xEB, 0x60, 0xF2, 0xC4, 0x74, 0x67, 0x9B, 0x15, 0x71, 0x82, 0x8E, 0x61, 0x9A, 0x97, 0x57, 0x70, 0xF0, 0x2D, - 0x7E, 0xAC, 0x0D, 0x24, 0xDF, 0xDA, 0x7B, 0xFD, 0x8F, 0x77, 0x38, 0x3A, 0xE3, 0x35, 0x90, 0x17, 0x31, 0xF7, 0x0E, 0xB4, 0xF9, 0xC6, 0x61, 0x03, 0x64, 0x8B, - 0x60, 0xDB, 0x7D, 0xED, 0x0F, 0xC0, 0x78, 0x65, 0x78, 0xDA, 0xD4, 0xF0, 0xC9, 0x5B, 0xD7, 0x0F, 0xB4, 0x73, 0x2D, 0xC4, 0x68, 0xBB, 0x33, 0xBA, 0x9D, 0xA3, - 0xC3, 0xF8, 0xE2, 0x2D, 0x19, 0xE3, 0x3F, 0x7A, 0x36, 0x34, 0x0D, 0xA1, 0x9E, 0x6B, 0x7B, 0xA7, 0xC7, 0xBD, 0x3D, 0xB4, 0xDD, 0xB0, 0x8B, 0x39, 0x81, 0xE8, - 0x0F, 0xED, 0x5A, 0x1B, 0xCF, 0x3E, 0xD0, 0x66, 0xD3, 0xFD, 0x3F, 0x28, 0xF5, 0xF4, 0x32, 0x5E, 0xDB, 0xE7, 0xCC, 0x74, 0x82, 0x25, 0x71, 0x5A, 0x11, 0x65, - 0x1E, 0xF1, 0xD7, 0xAE, 0xE3, 0x13, 0x46, 0x1C, 0xFB, 0x59, 0xF3, 0xE8, 0x7A, 0xC7, 0x0F, 0x8C, 0x60, 0xE3, 0x6B, 0x4F, 0xCF, 0xCF, 0xB5, 0x7E, 0xB7, 0x1B, - 0x6F, 0xA6, 0x41, 0x37, 0xE9, 0x76, 0x07, 0x5A, 0xEA, 0xC2, 0x0F, 0xE4, 0x26, 0xD8, 0xFF, 0x2A, 0x84, 0xB9, 0xD3, 0x88, 0xED, 0x93, 0x04, 0x92, 0x10, 0x00, - 0x5F, 0x27, 0xD7, 0xDA, 0x4F, 0x12, 0xD8, 0x32, 0x8D, 0xC0, 0xD8, 0xFF, 0x23, 0xA1, 0x2F, 0xE8, 0x15, 0x28, 0x39, 0xD0, 0xE8, 0xAD, 0xAF, 0x62, 0xB7, 0xEE, - 0xF6, 0x3B, 0x20, 0x43, 0xE0, 0x37, 0x84, 0x26, 0x9E, 0x97, 0xA4, 0x98, 0x42, 0xB7, 0x7B, 0x07, 0x1A, 0xDE, 0x49, 0xC2, 0xC6, 0x88, 0x7C, 0x22, 0xAE, 0x09, - 0xA1, 0xE5, 0xA3, 0x95, 0xA0, 0x64, 0xE8, 0xEE, 0x12, 0x2A, 0x82, 0x38, 0xF4, 0x3D, 0x59, 0x80, 0xC4, 0x16, 0x07, 0x3C, 0x2C, 0x1D, 0xD0, 0x98, 0x74, 0xC0, - 0xC2, 0x59, 0x4C, 0x6B, 0xE0, 0xD0, 0xBE, 0x6B, 0x13, 0xB0, 0x89, 0x45, 0x6B, 0x8F, 0x7F, 0x0A, 0x14, 0xEC, 0x69, 0xAF, 0x7B, 0xB3, 0xF7, 0x1C, 0xC0, 0x3B, - 0x81, 0xFB, 0x21, 0xF0, 0x2C, 0x67, 0xD1, 0xEA, 0x8D, 0xF7, 0x23, 0x5C, 0xF4, 0x36, 0x22, 0x4C, 0xDD, 0xA7, 0xD7, 0x69, 0x17, 0xE9, 0x1B, 0x2D, 0x7E, 0xFD, - 0xF9, 0xDE, 0xFE, 0x1E, 0x27, 0x9D, 0x9E, 0x83, 0xB1, 0xB5, 0xD8, 0xC1, 0x33, 0x4A, 0xE1, 0xBE, 0x76, 0x76, 0xC6, 0xBB, 0x61, 0xAD, 0xF0, 0x22, 0x34, 0xA2, - 0x7F, 0x52, 0xB7, 0x42, 0x43, 0xFC, 0xF5, 0xCB, 0x3F, 0x84, 0xC5, 0xDE, 0x1D, 0x02, 0xD5, 0x2F, 0x30, 0x2E, 0x7F, 0xF9, 0x07, 0xFC, 0x7F, 0xF7, 0x8C, 0x86, - 0xE2, 0x2F, 0xFF, 0xC0, 0x3F, 0x77, 0xCF, 0xA0, 0x27, 0x38, 0xA6, 0xFD, 0xDD, 0xFD, 0x4A, 0xA5, 0xB0, 0x2D, 0xBB, 0x45, 0xA6, 0xEC, 0x42, 0xA1, 0x95, 0xA6, - 0x69, 0x91, 0x43, 0xD4, 0xAF, 0x91, 0xF7, 0xB6, 0x66, 0xAE, 0x09, 0xCA, 0x09, 0xC0, 0x8E, 0x85, 0xCA, 0x6D, 0x50, 0x89, 0x10, 0x54, 0x57, 0xA8, 0xDC, 0x9A, - 0xD3, 0x96, 0x1A, 0x77, 0x94, 0xC8, 0x3C, 0x44, 0xCB, 0xB5, 0xE1, 0xF9, 0xE4, 0x1B, 0x27, 0x68, 0x05, 0x09, 0x97, 0xC8, 0x90, 0xF8, 0x64, 0x92, 0x60, 0x01, - 0x7F, 0x00, 0x07, 0xED, 0xF6, 0xB8, 0xD2, 0x42, 0x53, 0x7B, 0x12, 0x5A, 0x61, 0x44, 0x29, 0xBB, 0x99, 0x61, 0x85, 0x3F, 0xCF, 0xEC, 0xCF, 0xAD, 0x1B, 0xF8, - 0x2F, 0x1D, 0x28, 0xB6, 0x44, 0x84, 0x8D, 0x5E, 0xE0, 0x7F, 0x20, 0x17, 0xFC, 0x93, 0xA9, 0x1F, 0xC0, 0xFA, 0xDE, 0xB6, 0x5B, 0xEC, 0xB3, 0x5F, 0xA0, 0x9A, - 0x0D, 0x04, 0x21, 0xFF, 0x16, 0xC3, 0x81, 0xEB, 0x06, 0x9F, 0x0E, 0xB4, 0xB5, 0x07, 0x84, 0xD1, 0x2F, 0x7D, 0xC0, 0x31, 0x20, 0x22, 0x0E, 0xFB, 0x5B, 0x48, - 0xC1, 0xDA, 0xB6, 0x5F, 0x30, 0xAC, 0x40, 0x02, 0x3B, 0x00, 0x4D, 0x6D, 0xD0, 0x62, 0xE0, 0xFF, 0xBB, 0x67, 0xD0, 0x09, 0x1C, 0xC2, 0xFF, 0x77, 0xCF, 0xB0, - 0x2B, 0xD4, 0x25, 0xF6, 0x78, 0xF7, 0x0C, 0x7A, 0x84, 0x13, 0xF8, 0x1F, 0xDA, 0x60, 0xBF, 0xD8, 0x0A, 0xFF, 0xC2, 0x1D, 0xDA, 0x3F, 0xDE, 0xA4, 0x07, 0xEC, - 0x02, 0x3F, 0xCD, 0x63, 0x90, 0xBD, 0xE9, 0xBE, 0x45, 0xDF, 0x3C, 0xFE, 0xE9, 0x06, 0xD8, 0xA1, 0x07, 0xB7, 0xE0, 0xF8, 0x8E, 0x89, 0xE7, 0xF8, 0xE7, 0x56, - 0x98, 0x27, 0x5E, 0xE0, 0x47, 0x70, 0x8D, 0xBE, 0x9D, 0x15, 0x2F, 0xB1, 0x03, 0x6C, 0x45, 0xDF, 0xA5, 0x49, 0x5B, 0xB1, 0x23, 0xB8, 0xC6, 0xDF, 0xC0, 0x78, - 0xA0, 0xF1, 0x77, 0xFC, 0x15, 0x0A, 0x27, 0x7A, 0x07, 0xDF, 0x0B, 0xFF, 0x06, 0x19, 0x64, 0xA4, 0xA1, 0x54, 0xC2, 0xB3, 0xDB, 0xBB, 0x67, 0x04, 0xEF, 0x51, - 0x22, 0xE1, 0xF8, 0x96, 0x1F, 0xC3, 0x75, 0xA0, 0x0F, 0xEF, 0x08, 0x82, 0xE9, 0x85, 0xDB, 0xE8, 0x02, 0xB4, 0x08, 0xF0, 0x3E, 0x27, 0x1E, 0xCE, 0x6E, 0xC3, - 0x33, 0x84, 0xA6, 0xB0, 0x9C, 0x0D, 0x38, 0xBD, 0x8D, 0x4E, 0xE1, 0x2E, 0xF2, 0x82, 0x0A, 0xE0, 0x3C, 0xDD, 0x3D, 0xE3, 0x3C, 0xA1, 0x16, 0xD9, 0x51, 0x5A, - 0xD4, 0x18, 0xF4, 0x02, 0x1E, 0x24, 0x5F, 0xB1, 0x1C, 0x24, 0x36, 0x3C, 0x42, 0x00, 0xB8, 0xB4, 0x09, 0x1E, 0xBE, 0xBA, 0xFD, 0xC6, 0x6C, 0xED, 0xF1, 0x4F, - 0xB7, 0xEE, 0x61, 0x88, 0x8E, 0xC3, 0x74, 0x5C, 0x67, 0x66, 0x5B, 0x33, 0x8C, 0x04, 0xAD, 0x7D, 0xED, 0x7C, 0xC2, 0xC3, 0x34, 0x7A, 0x2C, 0x34, 0x8F, 0x7B, - 0x61, 0x26, 0x6A, 0x8F, 0x7F, 0x7C, 0x74, 0x6F, 0xBF, 0x43, 0x1D, 0x8D, 0x3B, 0x13, 0xA2, 0xE0, 0x31, 0x46, 0x0D, 0x07, 0x36, 0x96, 0xE0, 0xD8, 0x0A, 0x07, - 0xB9, 0x48, 0x68, 0xEB, 0x18, 0x16, 0x8A, 0x26, 0x3E, 0x92, 0x74, 0x53, 0x83, 0x48, 0x4E, 0xD8, 0x12, 0x11, 0xEA, 0x69, 0x3A, 0x42, 0x81, 0xAA, 0xBC, 0xA0, - 0xB5, 0x77, 0xE9, 0x79, 0xAE, 0xF7, 0xAF, 0xBD, 0xE7, 0xD8, 0xE8, 0xF9, 0xDE, 0xBF, 0x4F, 0xB5, 0xBD, 0xE7, 0xF1, 0x50, 0x75, 0x97, 0x8E, 0x29, 0x4C, 0x63, - 0x0B, 0x45, 0x8D, 0x2D, 0x62, 0x1A, 0x5B, 0xDC, 0xAF, 0xC6, 0xE2, 0x9F, 0x8C, 0xAD, 0xA3, 0xB5, 0xF8, 0x27, 0x5A, 0x73, 0x34, 0x57, 0x08, 0xCF, 0x95, 0xC6, - 0xB5, 0xB5, 0x90, 0x69, 0xAB, 0x8A, 0x9A, 0xD8, 0x18, 0x0E, 0xDE, 0x43, 0xBC, 0xB7, 0x3F, 0xBC, 0xFB, 0x16, 0xC7, 0x02, 0xB9, 0xCA, 0x42, 0x8D, 0xA5, 0xB3, - 0x2D, 0x09, 0x06, 0x4C, 0x0E, 0x12, 0x23, 0x53, 0x22, 0x49, 0x78, 0xBE, 0xA7, 0xB5, 0x28, 0x4A, 0x4C, 0x11, 0x0A, 0x0C, 0x81, 0x8F, 0x2C, 0x6A, 0xBE, 0x8B, - 0xA3, 0x89, 0x70, 0xDE, 0x08, 0x2A, 0xC7, 0x16, 0x10, 0x40, 0x49, 0x89, 0x0C, 0xF3, 0x96, 0xC3, 0xC4, 0x06, 0xBD, 0xC6, 0x5D, 0x84, 0xFA, 0xAB, 0xAF, 0x1A, - 0xD4, 0x44, 0x4C, 0x8F, 0x62, 0x9B, 0x5F, 0x28, 0x1D, 0x1E, 0xF9, 0x95, 0x04, 0xC4, 0x3F, 0x05, 0x22, 0x31, 0x70, 0x3E, 0x62, 0x94, 0xC0, 0x72, 0x2B, 0xC1, - 0x42, 0x47, 0x1A, 0x25, 0x1C, 0xF4, 0xF3, 0x11, 0x19, 0x18, 0xD4, 0xA8, 0xA0, 0xDF, 0x6B, 0x90, 0x60, 0x10, 0x63, 0x9A, 0x12, 0x12, 0xF1, 0xAD, 0x81, 0x6C, - 0x3C, 0x6A, 0xC4, 0x88, 0x37, 0xFC, 0x4B, 0xF0, 0xF0, 0x31, 0x54, 0x09, 0x0D, 0x7F, 0x3B, 0x7D, 0x26, 0x16, 0x35, 0x62, 0xF8, 0x0B, 0xE1, 0x65, 0x3C, 0xF1, - 0x31, 0x5B, 0x8D, 0x27, 0xFE, 0x1E, 0xF3, 0x6C, 0x3C, 0x8A, 0xB2, 0xE1, 0xEF, 0x0E, 0x97, 0x59, 0x1D, 0x4B, 0x11, 0x72, 0x1D, 0x83, 0x35, 0x01, 0x60, 0x5E, - 0x96, 0x7E, 0xD1, 0x3B, 0xED, 0x46, 0x18, 0x78, 0x46, 0x91, 0x87, 0x81, 0x37, 0x49, 0x63, 0x10, 0xD1, 0xE1, 0x01, 0x72, 0xBB, 0x87, 0x88, 0x42, 0x90, 0xA3, - 0xAB, 0x45, 0x21, 0x48, 0xBB, 0x45, 0xF8, 0x09, 0x61, 0x32, 0xC2, 0x0F, 0x2D, 0x68, 0xB0, 0x2F, 0x18, 0xE7, 0xC9, 0x3F, 0xFC, 0x20, 0xB0, 0x4C, 0x89, 0x88, - 0x03, 0xD2, 0x79, 0x25, 0x4B, 0xE2, 0xDF, 0xBE, 0x4D, 0x19, 0x12, 0x2D, 0x96, 0xDC, 0xFA, 0x6A, 0xA1, 0xEB, 0xD6, 0xCF, 0xC0, 0x40, 0xE7, 0x0E, 0x6A, 0xB9, - 0x19, 0xFF, 0x58, 0xAC, 0x04, 0x09, 0xCC, 0x39, 0x94, 0x50, 0xF0, 0x2F, 0x66, 0xCA, 0x18, 0xA1, 0x1F, 0x54, 0x54, 0x62, 0x45, 0x7C, 0x3C, 0x51, 0x46, 0x07, - 0x9D, 0xDE, 0xE4, 0x29, 0x85, 0x7F, 0xA2, 0x2E, 0x4B, 0x23, 0x6B, 0xD5, 0x21, 0x57, 0x7C, 0x8E, 0x4D, 0x32, 0xEC, 0x56, 0x9C, 0x15, 0x3E, 0xCC, 0x10, 0xBD, - 0xF8, 0x28, 0xE6, 0xE2, 0xC4, 0x96, 0xA6, 0xA2, 0xC4, 0xEE, 0x18, 0x01, 0x24, 0x47, 0xD3, 0x4D, 0x40, 0xFC, 0x0E, 0xD6, 0x0F, 0x42, 0xE1, 0x6C, 0xDD, 0xEA, - 0x38, 0x40, 0x00, 0x45, 0xB8, 0x1F, 0x8F, 0x55, 0x2C, 0x70, 0x6C, 0xE1, 0x62, 0x97, 0xB3, 0xD0, 0xB1, 0xBB, 0x19, 0x18, 0x79, 0x7A, 0x9B, 0x84, 0xC0, 0x8B, - 0x59, 0xD8, 0x68, 0x8D, 0x28, 0x86, 0xAB, 0x3F, 0x1A, 0x6D, 0x27, 0xB9, 0xBC, 0x03, 0xB6, 0xAC, 0x84, 0x02, 0xE9, 0x60, 0x89, 0x3E, 0x2A, 0x7B, 0xCD, 0x60, - 0x16, 0xAA, 0xED, 0x89, 0x35, 0xA5, 0xBD, 0xD3, 0xAD, 0x7A, 0x06, 0x40, 0x70, 0xAB, 0xD2, 0x5E, 0x30, 0x1A, 0x4F, 0xA3, 0x62, 0x89, 0xA6, 0x4D, 0x3D, 0x62, - 0x7C, 0xFE, 0x2A, 0x81, 0x8C, 0x56, 0xFF, 0x43, 0x4C, 0xEC, 0x1A, 0x16, 0x05, 0x53, 0x97, 0xD8, 0x13, 0x37, 0x6D, 0xD7, 0x21, 0xF2, 0x5E, 0x13, 0xD5, 0x11, - 0xDE, 0x11, 0x3F, 0x33, 0xC9, 0xDC, 0xD8, 0xD8, 0x41, 0x04, 0xE6, 0x91, 0x60, 0xE3, 0x39, 0xBC, 0x5A, 0xB2, 0x3D, 0xB9, 0x92, 0x96, 0xE9, 0x1A, 0xB4, 0xCD, - 0xC3, 0x43, 0xED, 0x65, 0x10, 0x18, 0xA0, 0x00, 0x5C, 0x66, 0x5D, 0xA2, 0x7C, 0x34, 0x83, 0x17, 0x7C, 0x5D, 0x0F, 0x8D, 0x12, 0xEB, 0xCF, 0x1E, 0x70, 0x4D, - 0xBD, 0xD1, 0x07, 0x10, 0xE1, 0xA4, 0x14, 0x55, 0xE7, 0x3F, 0x1B, 0xE2, 0xDD, 0x7E, 0xA0, 0x02, 0x73, 0xBD, 0x97, 0xE0, 0x8B, 0x7B, 0x9D, 0x68, 0xA9, 0x64, - 0x8F, 0xD5, 0x37, 0x3B, 0x80, 0xEA, 0x12, 0xFA, 0x00, 0x1D, 0x47, 0x36, 0xCF, 0xB8, 0x09, 0xF5, 0xAE, 0x9D, 0x9F, 0x9F, 0x73, 0x65, 0xA4, 0x0B, 0xAA, 0xD0, - 0xC2, 0x75, 0x3E, 0x93, 0xDB, 0xCD, 0x1A, 0xC4, 0x1F, 0x95, 0x48, 0x53, 0x45, 0x5B, 0x2E, 0x1D, 0xD2, 0x81, 0x96, 0x17, 0xBC, 0x4C, 0xD6, 0x1B, 0x48, 0x1A, - 0x45, 0x2A, 0xA0, 0xD6, 0x89, 0x9E, 0xF8, 0xD5, 0x56, 0xA3, 0xBB, 0x27, 0xF2, 0x33, 0x49, 0x79, 0x99, 0x13, 0xC8, 0x85, 0x27, 0x86, 0xAE, 0x54, 0x0F, 0x4F, - 0x92, 0xA8, 0xEE, 0xF6, 0x9F, 0x44, 0x91, 0x61, 0xB3, 0x36, 0x8D, 0x80, 0x24, 0x83, 0x43, 0x68, 0x0B, 0xE2, 0xE6, 0xCA, 0x0D, 0x48, 0x2A, 0x62, 0x58, 0x8E, - 0x15, 0x58, 0x86, 0xFD, 0x31, 0xB2, 0xC6, 0x9D, 0xBA, 0xBF, 0xC4, 0xC7, 0x4B, 0xF8, 0xFF, 0x56, 0x85, 0x57, 0xAD, 0x2A, 0xB9, 0x65, 0x21, 0x61, 0x3C, 0x88, - 0xAC, 0x24, 0x2E, 0x87, 0x44, 0x58, 0xE0, 0xF7, 0x45, 0x4F, 0x4F, 0x9F, 0xD2, 0xA3, 0x27, 0xA1, 0xD2, 0x44, 0xF4, 0x38, 0xD7, 0xA2, 0x1B, 0x29, 0x05, 0x6F, - 0xE3, 0x4E, 0xE1, 0x10, 0xC8, 0x63, 0x18, 0x98, 0x6F, 0x85, 0xEA, 0x5D, 0xC3, 0x54, 0x17, 0x6D, 0xE1, 0xFF, 0xA3, 0xFE, 0x23, 0x8A, 0xFA, 0xBB, 0x0B, 0xF1, - 0x39, 0xB6, 0x9D, 0xF2, 0x00, 0x06, 0x27, 0x5F, 0x74, 0x79, 0xBE, 0x77, 0xA0, 0xC9, 0x57, 0x55, 0x52, 0x69, 0xC5, 0xD2, 0x32, 0x19, 0xC9, 0x91, 0x5D, 0xA1, - 0x84, 0x70, 0x61, 0x14, 0x97, 0x0E, 0x71, 0x1D, 0xB1, 0xB5, 0xC7, 0x56, 0x6D, 0x69, 0x34, 0xBE, 0x8B, 0x12, 0x92, 0xA5, 0x7B, 0x9D, 0x07, 0xE9, 0x41, 0xCC, - 0xB9, 0x22, 0x29, 0xE0, 0x10, 0xDA, 0xB4, 0x7C, 0x63, 0x6A, 0x17, 0x77, 0xCD, 0xDB, 0x99, 0x7C, 0x28, 0x80, 0x06, 0xE2, 0x0A, 0x80, 0x06, 0x1E, 0xF5, 0x99, - 0x18, 0x5A, 0xE2, 0x14, 0x61, 0x15, 0x64, 0xE5, 0x22, 0x9E, 0x1B, 0xE0, 0xC4, 0x49, 0xCC, 0x2C, 0x90, 0x96, 0x08, 0xB1, 0xF1, 0xCB, 0x00, 0x91, 0x3C, 0x3D, - 0xD7, 0x9C, 0x8D, 0x6D, 0x83, 0x05, 0x22, 0x0B, 0x60, 0x81, 0xF1, 0xBB, 0xD2, 0x00, 0xFD, 0xE7, 0x8D, 0x66, 0x21, 0xE5, 0x09, 0x09, 0x3C, 0x7B, 0x96, 0xC4, - 0x86, 0xCB, 0xB7, 0x2C, 0x35, 0x0F, 0x7B, 0x63, 0xED, 0xD9, 0xDB, 0x74, 0xA3, 0x51, 0x96, 0x93, 0x04, 0x43, 0xF5, 0xD3, 0x84, 0xE0, 0x63, 0x19, 0x0E, 0x10, - 0x62, 0x99, 0x54, 0x40, 0xB8, 0x49, 0x43, 0xDF, 0x5A, 0xE9, 0x7A, 0x41, 0xAD, 0xBE, 0x45, 0xF8, 0x1E, 0x9D, 0x7D, 0x90, 0x3F, 0x1A, 0x73, 0x74, 0x41, 0x64, - 0x3B, 0x61, 0x57, 0x71, 0x8C, 0x8B, 0x04, 0x46, 0x64, 0x2C, 0x45, 0x37, 0xFE, 0x68, 0x07, 0xD0, 0x14, 0x77, 0xC8, 0xC4, 0x06, 0xEF, 0xED, 0xD1, 0x9F, 0x76, - 0xBC, 0xDD, 0x30, 0x97, 0x82, 0xEB, 0xE9, 0xA7, 0x05, 0x34, 0x97, 0x31, 0x46, 0xD1, 0x5D, 0x4F, 0x91, 0x25, 0x4A, 0x02, 0x1C, 0xE6, 0xA1, 0x9A, 0x1B, 0x33, - 0xF2, 0xC9, 0x23, 0x33, 0x77, 0xE1, 0x58, 0xBF, 0x13, 0x19, 0x42, 0xE6, 0x50, 0x2D, 0xE2, 0x78, 0xAE, 0x98, 0x66, 0x23, 0x72, 0xEE, 0x2B, 0xC9, 0xEB, 0x99, - 0x3D, 0x69, 0x3A, 0xB8, 0xD5, 0x27, 0x0B, 0x37, 0x1F, 0xF8, 0x56, 0x70, 0xBB, 0xDD, 0xCF, 0x44, 0x6B, 0xF7, 0x04, 0xF5, 0xD0, 0xF4, 0x0D, 0x6E, 0xD0, 0x09, - 0x79, 0x08, 0x2F, 0x24, 0x93, 0x50, 0xE1, 0x9E, 0xE1, 0x0A, 0x58, 0xDC, 0x5E, 0xD8, 0x50, 0x19, 0x8D, 0x93, 0x91, 0x41, 0xDE, 0xD3, 0xC8, 0xD1, 0xC3, 0x61, - 0x43, 0x1A, 0xDF, 0x6B, 0x0E, 0x1A, 0x39, 0x38, 0xD9, 0xC6, 0x97, 0x34, 0xD2, 0xCD, 0x74, 0x65, 0x05, 0x12, 0x84, 0x7B, 0xBD, 0xBD, 0x32, 0xE3, 0x4F, 0xDC, - 0x5B, 0x59, 0xC4, 0xA3, 0xA9, 0x39, 0x20, 0x4A, 0xAC, 0xE8, 0xCD, 0xD8, 0x06, 0xCF, 0x17, 0x30, 0xFD, 0xC6, 0x75, 0x3A, 0x54, 0x70, 0x6A, 0x81, 0x9C, 0xA1, - 0x60, 0xFB, 0x3A, 0x28, 0x8A, 0xE4, 0xCE, 0x0E, 0xB1, 0x9B, 0x22, 0x99, 0xC9, 0xC7, 0x37, 0x14, 0xFC, 0xEA, 0x11, 0x80, 0xF3, 0xB1, 0x9A, 0xA8, 0x7D, 0xF9, - 0x07, 0x45, 0x71, 0xA7, 0xCD, 0x21, 0x5A, 0xF8, 0x4B, 0x62, 0xD2, 0xCA, 0x57, 0xB0, 0xF1, 0x4F, 0x35, 0x5C, 0x14, 0x4F, 0xEC, 0xE4, 0xB8, 0xFB, 0x35, 0xB4, - 0x90, 0x70, 0xB0, 0x29, 0x9C, 0x6C, 0xD0, 0x0D, 0x3F, 0xF9, 0xF3, 0x0C, 0x96, 0x9E, 0x4B, 0x0A, 0x4B, 0xF8, 0x63, 0x91, 0xC4, 0xEE, 0x40, 0x4E, 0x03, 0xDD, - 0x7C, 0x07, 0xD9, 0x4B, 0xCA, 0x4C, 0xF7, 0xF9, 0x34, 0x09, 0x34, 0x60, 0x8A, 0x90, 0xC7, 0x74, 0x84, 0x93, 0x21, 0x26, 0xA6, 0x84, 0x84, 0x19, 0x33, 0x9C, - 0x97, 0xE2, 0xDD, 0x30, 0x3C, 0x0B, 0x08, 0x65, 0xF1, 0x9B, 0x0F, 0x93, 0x9B, 0xFD, 0x27, 0xA1, 0x18, 0xB6, 0x71, 0x60, 0x07, 0x31, 0x04, 0x09, 0x11, 0x65, - 0x89, 0x89, 0x1B, 0x4D, 0x72, 0x5E, 0x96, 0x23, 0x33, 0xF6, 0x8B, 0x8D, 0x99, 0x74, 0xC0, 0xA4, 0x3D, 0xFF, 0x8B, 0x1A, 0xCD, 0xBF, 0x0F, 0xD8, 0x20, 0x1B, - 0x8B, 0x79, 0xFB, 0x65, 0x08, 0xDA, 0x9A, 0x24, 0x16, 0x12, 0x73, 0x6F, 0xE9, 0xB2, 0xF8, 0x41, 0x80, 0xA3, 0xF8, 0x20, 0x29, 0xDD, 0x9A, 0x26, 0xC6, 0x73, - 0xBA, 0x90, 0x41, 0x89, 0x6C, 0x62, 0x73, 0x3C, 0x21, 0x1E, 0x69, 0x3E, 0x97, 0x29, 0x2E, 0x66, 0x5F, 0xCC, 0x61, 0xAF, 0x2C, 0x72, 0x9D, 0x5B, 0x37, 0xA5, - 0x7B, 0xB5, 0xA8, 0xBC, 0x22, 0x80, 0x8B, 0x70, 0x6F, 0x5E, 0x21, 0x64, 0xB4, 0x8F, 0x2F, 0x86, 0x83, 0x6E, 0xD2, 0x53, 0x5B, 0x5C, 0xA5, 0x4D, 0x13, 0xA0, - 0x88, 0xB5, 0x18, 0x56, 0xEC, 0xDB, 0x4E, 0x93, 0x1F, 0x1F, 0x7C, 0xF2, 0xE0, 0xE9, 0x28, 0xC7, 0x1A, 0xC7, 0xA0, 0xA9, 0xE7, 0x17, 0x03, 0xC7, 0x77, 0x04, - 0xC6, 0x69, 0x37, 0xAE, 0x14, 0x80, 0xA3, 0x6D, 0x8C, 0x31, 0x50, 0x31, 0x9E, 0xE5, 0x01, 0x42, 0x1B, 0xB6, 0x4D, 0x75, 0x2F, 0xA6, 0x5F, 0x3F, 0x70, 0xD7, - 0x1F, 0x28, 0x21, 0xA9, 0x40, 0x74, 0x4D, 0x17, 0x07, 0x3A, 0x78, 0xBF, 0xC5, 0xD3, 0xA4, 0xB8, 0x6C, 0x93, 0xEB, 0xA9, 0x1F, 0x70, 0xE5, 0x40, 0x63, 0x78, - 0xF6, 0x92, 0x39, 0x2E, 0x5D, 0x54, 0x90, 0xF6, 0x80, 0x96, 0xD2, 0xF1, 0xBD, 0x19, 0x1B, 0x0E, 0xC2, 0x4D, 0x7F, 0x18, 0xAD, 0xF0, 0xF0, 0x57, 0xD6, 0x27, - 0x0E, 0xDF, 0x09, 0x9B, 0xDA, 0x2F, 0xA4, 0xC5, 0x5D, 0xA7, 0x49, 0x89, 0x4A, 0x4A, 0xCC, 0xBF, 0x7D, 0x1C, 0x07, 0xD8, 0xD0, 0x87, 0x11, 0x33, 0x66, 0x6F, - 0x19, 0x61, 0x39, 0x12, 0x13, 0x8F, 0x83, 0x49, 0xE2, 0x63, 0x63, 0x19, 0xDB, 0x31, 0xFA, 0xE2, 0xD3, 0x6C, 0x0A, 0xC3, 0xD7, 0x6B, 0x70, 0x3E, 0xF0, 0xF6, - 0xEB, 0xD6, 0xFE, 0x5D, 0x1E, 0x3B, 0x4C, 0x5C, 0x91, 0xED, 0xA8, 0x12, 0x41, 0x07, 0x0A, 0x39, 0xB6, 0x84, 0x7C, 0xE4, 0xE8, 0xE2, 0x0E, 0x73, 0xE9, 0x88, - 0x69, 0x4A, 0x96, 0x60, 0xCF, 0xB7, 0x45, 0xCB, 0x32, 0xD5, 0x04, 0x82, 0x68, 0x08, 0xD8, 0x22, 0x36, 0x95, 0xA8, 0xC6, 0xEC, 0x42, 0x34, 0x10, 0xB4, 0xC7, - 0x7D, 0x30, 0x83, 0xF6, 0x64, 0x1E, 0x9F, 0x4A, 0x18, 0x99, 0x00, 0x42, 0x67, 0xCA, 0x59, 0xC2, 0x99, 0x19, 0xCE, 0x95, 0x91, 0x58, 0xC2, 0x99, 0x01, 0x41, - 0x01, 0xE1, 0x7E, 0xD3, 0xD2, 0x59, 0x03, 0x9D, 0x3B, 0x00, 0x3B, 0xEB, 0xD0, 0x87, 0x61, 0x70, 0x46, 0x82, 0x36, 0x40, 0x4F, 0x12, 0xB7, 0x97, 0x84, 0xBE, - 0x80, 0x90, 0xDF, 0x67, 0x67, 0xAC, 0x41, 0xD8, 0xCB, 0xD4, 0x35, 0x6F, 0x3B, 0xC6, 0x7A, 0x4D, 0x1C, 0xF3, 0x62, 0x69, 0xD9, 0x66, 0x8B, 0x81, 0xC6, 0xD6, - 0x31, 0x30, 0x2C, 0x12, 0xBA, 0xF5, 0x8D, 0x63, 0x05, 0x6F, 0xBE, 0x60, 0xD7, 0x5A, 0x7B, 0x7D, 0x53, 0xEC, 0x5C, 0xE4, 0xCD, 0x3A, 0xA6, 0x67, 0x5C, 0x7F, - 0x83, 0xFB, 0xA2, 0xA9, 0x39, 0x1C, 0x74, 0x0F, 0xBA, 0xBC, 0x41, 0x00, 0xE9, 0x96, 0x10, 0x39, 0xE2, 0xC5, 0xFD, 0xA3, 0x3F, 0x7E, 0xFF, 0x6D, 0x84, 0x37, - 0x70, 0x5F, 0xB3, 0x4B, 0xAD, 0x3D, 0xBA, 0xB1, 0xFA, 0xF0, 0xB7, 0x35, 0xEE, 0x57, 0x11, 0xC3, 0x4C, 0x4C, 0x8C, 0xB8, 0x67, 0x1A, 0x45, 0xC5, 0x9A, 0x7F, - 0x15, 0x47, 0x0A, 0x97, 0x1D, 0x18, 0x27, 0xD0, 0xDC, 0x5B, 0x32, 0x50, 0xB1, 0xA3, 0x1A, 0xC1, 0x91, 0x93, 0xAF, 0x61, 0xA2, 0xFA, 0x0B, 0x31, 0x3C, 0xD0, - 0xC7, 0x73, 0xAD, 0xA5, 0x77, 0xF5, 0xE7, 0x2D, 0x7A, 0xFD, 0x1D, 0xB0, 0xB3, 0x6C, 0xED, 0x3F, 0xEF, 0xED, 0xEF, 0x77, 0x7C, 0xD0, 0x19, 0x69, 0xB5, 0xFB, - 0xA2, 0x09, 0xFC, 0xA1, 0x6D, 0x58, 0x27, 0xD9, 0xF7, 0xDF, 0xBA, 0x1B, 0xCF, 0xCF, 0x6B, 0xF0, 0xCE, 0x72, 0x70, 0x24, 0xCE, 0x6B, 0xF2, 0x01, 0xA6, 0x2F, - 0x8E, 0xB9, 0xD5, 0x44, 0xA7, 0x1B, 0xC1, 0xC5, 0x9C, 0x91, 0xEE, 0x8F, 0x85, 0xA4, 0x3F, 0x96, 0xEE, 0xF3, 0x8C, 0x93, 0x60, 0xC5, 0xBB, 0x25, 0x96, 0xA5, - 0xEE, 0xE2, 0xC6, 0x11, 0xE5, 0x74, 0xBC, 0x6A, 0xB0, 0xA5, 0xFF, 0x54, 0xC0, 0xE2, 0x59, 0xD2, 0x56, 0x2D, 0x5C, 0x25, 0x11, 0x95, 0x66, 0x58, 0xB9, 0x19, - 0x69, 0xB2, 0x60, 0x9C, 0x9E, 0x2D, 0x27, 0xB3, 0xCF, 0x8B, 0x0D, 0xF8, 0xF8, 0x4A, 0x44, 0x54, 0x76, 0x0D, 0xA7, 0x9C, 0x61, 0xE8, 0x87, 0x29, 0x68, 0xDE, - 0x78, 0x04, 0xB7, 0x63, 0x23, 0x18, 0x9F, 0xAF, 0x16, 0x00, 0xD0, 0x49, 0x6A, 0x38, 0x8A, 0x69, 0x08, 0xB5, 0x4D, 0xB6, 0x24, 0x44, 0x40, 0xBB, 0xFD, 0x30, - 0x62, 0x21, 0x10, 0x9F, 0x75, 0x45, 0xBA, 0xDB, 0x9E, 0x5D, 0xA7, 0x03, 0xD6, 0xD6, 0xAC, 0xFA, 0x2E, 0xA6, 0x2D, 0xF1, 0x70, 0x4E, 0xC4, 0x0F, 0xC9, 0x67, - 0x9E, 0xC4, 0x99, 0x17, 0x55, 0x82, 0x02, 0x88, 0x4F, 0x34, 0xC7, 0x8F, 0xB3, 0x4F, 0x14, 0xD9, 0x27, 0x9C, 0x7D, 0x04, 0x88, 0x26, 0x9C, 0xC5, 0x25, 0x8B, - 0xD0, 0x18, 0x7F, 0x7A, 0x15, 0x71, 0x76, 0x3D, 0xCD, 0xA5, 0x93, 0x97, 0x12, 0x62, 0xEC, 0xE5, 0x03, 0x40, 0xFB, 0x15, 0xF8, 0x43, 0x9C, 0xAD, 0xEB, 0xA9, - 0x1A, 0x5B, 0xA2, 0x14, 0x81, 0x00, 0x11, 0x5B, 0xF2, 0x82, 0x85, 0x60, 0xE5, 0x35, 0x09, 0xF8, 0x23, 0x7C, 0x86, 0x63, 0x6A, 0x73, 0xCF, 0x58, 0x11, 0xFC, - 0x62, 0x7B, 0x48, 0xAC, 0x49, 0xEF, 0x17, 0xE6, 0x7E, 0xAC, 0x59, 0x8C, 0xC9, 0xB0, 0xE4, 0x51, 0x08, 0x1A, 0xB6, 0x8C, 0x41, 0x87, 0x74, 0xE4, 0x42, 0x8B, - 0x46, 0x2C, 0x83, 0x0B, 0x4F, 0x95, 0x84, 0x15, 0xB6, 0x8E, 0x1C, 0x21, 0x42, 0x20, 0x4A, 0x26, 0xA3, 0x74, 0xA9, 0x8C, 0xCD, 0x24, 0x18, 0xB3, 0xA9, 0xF9, - 0x42, 0xBC, 0x41, 0xC8, 0x52, 0xA2, 0x4D, 0xE8, 0x20, 0x0C, 0x3E, 0x8B, 0xCC, 0x42, 0x52, 0xD8, 0x42, 0xA2, 0xFE, 0xDE, 0x26, 0x58, 0x9E, 0xE0, 0x2F, 0x65, - 0xBC, 0xF8, 0xE6, 0x6B, 0xCD, 0xF5, 0x34, 0xDB, 0xBD, 0x26, 0xB8, 0x28, 0x28, 0x36, 0x90, 0x69, 0x53, 0x02, 0x01, 0x8E, 0xB0, 0x22, 0x13, 0xEE, 0x8F, 0x09, - 0x96, 0x96, 0x0F, 0x73, 0x62, 0x7C, 0x75, 0x28, 0x79, 0xAA, 0x87, 0xA3, 0x53, 0x21, 0x7B, 0xDB, 0x25, 0xF4, 0x84, 0x38, 0x19, 0x4C, 0x24, 0xCB, 0xA7, 0x9C, - 0xC7, 0xAD, 0xC0, 0x92, 0x57, 0xD6, 0x2A, 0x21, 0xC2, 0xF0, 0xF6, 0xA3, 0x95, 0xA2, 0x9C, 0x81, 0x42, 0x41, 0x86, 0x60, 0x91, 0x2C, 0x23, 0x5E, 0xB7, 0xA4, - 0x29, 0xAB, 0x1D, 0xE6, 0x68, 0x14, 0x4B, 0xE1, 0xD2, 0x68, 0x9E, 0xAD, 0x15, 0x26, 0x71, 0x36, 0xCA, 0xB1, 0xDF, 0xD9, 0xA1, 0x78, 0x14, 0x8A, 0x9D, 0x61, - 0xF6, 0x36, 0x79, 0x72, 0x76, 0xB8, 0x0C, 0x56, 0xF6, 0xE4, 0xC9, 0xFF, 0x02, 0x49, 0x60, 0xC8, 0xA8, 0x55, 0x0C, 0x01, 0x00 +//File: index_ov3660.html.gz, Size: 8636 +#define index_ov3660_html_gz_len 8636 +const unsigned char index_ov3660_html_gz[] = { + 0x1F, 0x8B, 0x08, 0x08, 0xD3, 0xA3, 0x7B, 0x67, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x5F, 0x6F, 0x76, 0x33, 0x36, 0x36, 0x30, 0x2E, 0x68, 0x74, 0x6D, + 0x6C, 0x00, 0xED, 0x3D, 0x69, 0x73, 0xDB, 0x46, 0xB2, 0xDF, 0xFD, 0x2B, 0x60, 0x66, 0xD7, 0xA2, 0xCA, 0x22, 0x45, 0xF0, 0xD2, 0x61, 0x89, 0x7E, 0xB6, 0xAC, + 0xD8, 0xA9, 0xB5, 0xB3, 0xDE, 0x28, 0x71, 0x92, 0xDA, 0xDA, 0x72, 0x40, 0x62, 0x48, 0x22, 0x06, 0x01, 0x2E, 0x00, 0xEA, 0x58, 0x97, 0x7E, 0xC7, 0xFB, 0x41, + 0xEF, 0x8F, 0xBD, 0xEE, 0x39, 0x70, 0x71, 0x00, 0x0C, 0x00, 0x92, 0x52, 0xF2, 0x1E, 0x5D, 0x65, 0xE1, 0x98, 0xEE, 0xE9, 0x7B, 0x7A, 0x7A, 0x06, 0xC0, 0xD9, + 0x53, 0xD3, 0x9D, 0x04, 0x77, 0x4B, 0xA2, 0xCD, 0x83, 0x85, 0x3D, 0x7A, 0x72, 0xC6, 0xFE, 0x68, 0xF0, 0x3B, 0x9B, 0x13, 0xC3, 0x64, 0x87, 0xF4, 0x74, 0x41, + 0x02, 0x43, 0x9B, 0xCC, 0x0D, 0xCF, 0x27, 0xC1, 0x79, 0x63, 0x15, 0x4C, 0x5B, 0xC7, 0x8D, 0xF4, 0x6D, 0xC7, 0x58, 0x90, 0xF3, 0xC6, 0xB5, 0x45, 0x6E, 0x96, + 0xAE, 0x17, 0x34, 0xB4, 0x89, 0xEB, 0x04, 0xC4, 0x81, 0xE6, 0x37, 0x96, 0x19, 0xCC, 0xCF, 0x4D, 0x72, 0x6D, 0x4D, 0x48, 0x8B, 0x9E, 0x1C, 0x58, 0x8E, 0x15, + 0x58, 0x86, 0xDD, 0xF2, 0x27, 0x86, 0x4D, 0xCE, 0xF5, 0x38, 0xAE, 0xC0, 0x0A, 0x6C, 0x32, 0xBA, 0xBC, 0xFA, 0xD8, 0xEB, 0x6A, 0x7F, 0xFF, 0xD4, 0x1B, 0x0E, + 0x3B, 0x67, 0x87, 0xEC, 0x5A, 0xD4, 0xC6, 0x0F, 0xEE, 0xE2, 0xE7, 0xF8, 0x1B, 0xBB, 0xE6, 0x9D, 0xF6, 0x35, 0x71, 0x09, 0x7F, 0x53, 0x20, 0xA2, 0x35, 0x35, + 0x16, 0x96, 0x7D, 0x77, 0xAA, 0xBD, 0xF2, 0xA0, 0xCF, 0x83, 0x77, 0xC4, 0xBE, 0x26, 0x81, 0x35, 0x31, 0x0E, 0x7C, 0xC3, 0xF1, 0x5B, 0x3E, 0xF1, 0xAC, 0xE9, + 0x8B, 0x35, 0xC0, 0xB1, 0x31, 0xF9, 0x32, 0xF3, 0xDC, 0x95, 0x63, 0x9E, 0x6A, 0xDF, 0xE8, 0xC7, 0xF8, 0x6F, 0xBD, 0xD1, 0xC4, 0xB5, 0x5D, 0x0F, 0xEE, 0x5F, + 0x7E, 0x8B, 0xFF, 0xD6, 0xEF, 0xD3, 0xDE, 0x7D, 0xEB, 0x3F, 0xE4, 0x54, 0xD3, 0x87, 0xCB, 0xDB, 0xC4, 0xFD, 0xFB, 0x27, 0x89, 0xD3, 0x79, 0x37, 0x8B, 0x7A, + 0x0E, 0x7F, 0x9C, 0x0F, 0xEF, 0x93, 0x49, 0x60, 0xB9, 0x4E, 0x7B, 0x61, 0x58, 0x8E, 0x04, 0x93, 0x69, 0xF9, 0x4B, 0xDB, 0x00, 0x19, 0x4C, 0x6D, 0x92, 0x8B, + 0xE7, 0x9B, 0x05, 0x71, 0x56, 0x07, 0x05, 0xD8, 0x10, 0x49, 0xCB, 0xB4, 0x3C, 0xD6, 0xEA, 0x14, 0xE5, 0xB0, 0x5A, 0x38, 0x85, 0x68, 0xF3, 0xE8, 0x72, 0x5C, + 0x87, 0x48, 0x04, 0x88, 0x1D, 0xDD, 0x78, 0xC6, 0x12, 0x1B, 0xE0, 0xDF, 0xF5, 0x26, 0x0B, 0xCB, 0x61, 0x46, 0x75, 0xAA, 0xF5, 0xFA, 0x9D, 0xE5, 0x6D, 0x81, + 0x2A, 0x7B, 0x43, 0xFC, 0xB7, 0xDE, 0x68, 0x69, 0x98, 0xA6, 0xE5, 0xCC, 0x4E, 0xB5, 0x63, 0x29, 0x0A, 0xD7, 0x33, 0x89, 0xD7, 0xF2, 0x0C, 0xD3, 0x5A, 0xF9, + 0xA7, 0x5A, 0x5F, 0xD6, 0x66, 0x61, 0x78, 0x33, 0xA0, 0x25, 0x70, 0x81, 0xD8, 0x96, 0x2E, 0xA5, 0x84, 0x37, 0xF1, 0xAC, 0xD9, 0x3C, 0x00, 0x95, 0xAE, 0xB5, + 0x49, 0x0B, 0x8D, 0xBB, 0x50, 0x91, 0x3E, 0x73, 0xE5, 0x26, 0x97, 0x9A, 0x61, 0x5B, 0x33, 0xA7, 0x65, 0x05, 0x64, 0x01, 0xEC, 0xF8, 0x81, 0x47, 0x82, 0xC9, + 0x3C, 0x8F, 0x94, 0xA9, 0x35, 0x5B, 0x79, 0x44, 0x42, 0x48, 0x28, 0xB7, 0x1C, 0x86, 0xE1, 0xE6, 0xFA, 0xAD, 0xD6, 0x0D, 0x19, 0x7F, 0xB1, 0x82, 0x16, 0x97, + 0xC9, 0x98, 0x4C, 0x5D, 0x8F, 0x48, 0x5B, 0x8A, 0x16, 0xB6, 0x3B, 0xF9, 0xD2, 0xF2, 0x03, 0xC3, 0x0B, 0x54, 0x10, 0x1A, 0xD3, 0x80, 0x78, 0xC5, 0xF8, 0x08, + 0x5A, 0x45, 0x31, 0xB6, 0xEC, 0x6E, 0x79, 0x03, 0xCB, 0xB1, 0x2D, 0x87, 0xA8, 0x93, 0x97, 0xD5, 0x6F, 0x12, 0x1D, 0x6B, 0xA5, 0xA0, 0x18, 0x6B, 0x31, 0xCB, + 0xB3, 0x12, 0xCA, 0xEB, 0x7A, 0x67, 0xDC, 0x6F, 0xF4, 0x4E, 0xE7, 0xAF, 0xEB, 0x37, 0xE7, 0x84, 0x99, 0xA9, 0xB1, 0x0A, 0xDC, 0xFA, 0x1E, 0xB1, 0xE6, 0x56, + 0x29, 0x3E, 0xFE, 0x6B, 0x41, 0x4C, 0xCB, 0xD0, 0x9A, 0x31, 0x77, 0x3E, 0xEE, 0x80, 0x4D, 0xED, 0x6B, 0x86, 0x63, 0x6A, 0x4D, 0xD7, 0xB3, 0xC0, 0x11, 0x0C, + 0x1A, 0x6E, 0x6C, 0xB8, 0x02, 0x03, 0xC7, 0x92, 0xEC, 0x4B, 0x58, 0xCE, 0xF1, 0x99, 0xB8, 0x44, 0xE4, 0x6E, 0x83, 0x3F, 0x85, 0x90, 0x83, 0xBF, 0x42, 0x07, + 0x92, 0xF0, 0x48, 0xD1, 0xE7, 0xE9, 0x2B, 0x4E, 0x61, 0x96, 0xCE, 0xF0, 0xB7, 0x30, 0x6E, 0x5B, 0xB9, 0xBA, 0x13, 0x8D, 0x84, 0x0E, 0x61, 0x98, 0x9D, 0x34, + 0xA1, 0xE9, 0xF5, 0x5C, 0x6B, 0x69, 0x18, 0x25, 0xF7, 0xE5, 0x30, 0x1C, 0xA9, 0x5C, 0xE5, 0xF8, 0x8B, 0x1B, 0x45, 0x09, 0x76, 0xE5, 0xAC, 0x46, 0xB1, 0x83, + 0xFD, 0x93, 0xD9, 0x10, 0xE3, 0x24, 0x33, 0x8A, 0xE0, 0x4F, 0x3D, 0x92, 0x44, 0xC8, 0x0A, 0xA3, 0x89, 0x04, 0x71, 0x76, 0x44, 0x59, 0xC3, 0x9B, 0xE5, 0xDD, + 0x12, 0xAC, 0xF9, 0x24, 0xA8, 0x46, 0x17, 0x09, 0xE2, 0x3C, 0x1A, 0x0A, 0xA3, 0x0C, 0xFE, 0xEE, 0x15, 0xF2, 0x8D, 0x6F, 0xC6, 0xAB, 0x20, 0x70, 0x1D, 0xBF, + 0xD6, 0x10, 0x95, 0xE5, 0x67, 0xBF, 0xAF, 0xFC, 0xC0, 0x9A, 0xDE, 0xB5, 0xB8, 0x4B, 0x83, 0x9F, 0x2D, 0x0D, 0x48, 0x21, 0xC7, 0x24, 0xB8, 0x21, 0x24, 0x3F, + 0xDD, 0x70, 0x8C, 0x6B, 0x88, 0x3B, 0xB3, 0x99, 0x2D, 0xB3, 0xBD, 0xC9, 0xCA, 0xF3, 0x31, 0x6F, 0x5B, 0xBA, 0x16, 0x20, 0xF6, 0xD6, 0x3B, 0x4E, 0xFA, 0xA0, + 0x62, 0x47, 0xAD, 0xC9, 0x58, 0xD2, 0x97, 0xBB, 0x0A, 0x50, 0xC6, 0x52, 0x4D, 0xB8, 0xC0, 0x8E, 0x15, 0xDC, 0x49, 0xEF, 0x71, 0x4F, 0x94, 0xDC, 0x11, 0x2E, + 0x98, 0x3B, 0x2C, 0x24, 0xE9, 0x3A, 0x9D, 0xCC, 0xC9, 0xE4, 0x0B, 0x31, 0x9F, 0x17, 0xA6, 0x61, 0x45, 0xE9, 0x61, 0xDB, 0x72, 0x96, 0xAB, 0xA0, 0x85, 0xE9, + 0xD4, 0x72, 0x2B, 0x3A, 0xA7, 0x06, 0x29, 0x58, 0xEC, 0x76, 0xF3, 0x92, 0x8A, 0xC1, 0xF2, 0x36, 0x5F, 0x08, 0x71, 0x62, 0x47, 0xB6, 0x31, 0x26, 0x76, 0x1E, + 0xC9, 0xDC, 0x19, 0x32, 0xC2, 0x2E, 0x8F, 0x55, 0xD9, 0xB9, 0x1B, 0xA5, 0x2C, 0x1A, 0xBC, 0xFA, 0x47, 0x7F, 0x55, 0x96, 0x23, 0x3D, 0x3E, 0x48, 0x5C, 0xF2, + 0x89, 0x0D, 0x0E, 0x96, 0x95, 0x7A, 0x43, 0x9B, 0x1B, 0xA0, 0x21, 0xB7, 0x03, 0xCF, 0x70, 0x66, 0x04, 0x62, 0xC1, 0xED, 0x81, 0x38, 0xCC, 0x9F, 0x18, 0x28, + 0xB1, 0x8F, 0xA1, 0x7A, 0x90, 0x3F, 0x11, 0x61, 0x01, 0xE1, 0x40, 0x6B, 0xB3, 0x83, 0x0A, 0x59, 0x49, 0x4C, 0xBF, 0xB9, 0x84, 0xE8, 0x52, 0xEB, 0x60, 0x89, + 0x89, 0xD4, 0x73, 0x92, 0xB6, 0x25, 0x4D, 0xF4, 0x0B, 0x43, 0x83, 0x98, 0xF2, 0x4D, 0xA7, 0x45, 0x93, 0xC6, 0xE9, 0xB4, 0xD7, 0xE9, 0xF5, 0x0B, 0x33, 0x27, + 0x29, 0x97, 0xA9, 0x89, 0xA3, 0x24, 0x74, 0x84, 0x61, 0x25, 0xD7, 0x08, 0x7C, 0xE3, 0x5A, 0x9A, 0xB4, 0xBB, 0xBE, 0xC5, 0x66, 0x6E, 0xC6, 0xD8, 0x87, 0xB9, + 0x5B, 0x20, 0x99, 0x7A, 0x71, 0x43, 0xEF, 0x4A, 0xE9, 0xA3, 0x29, 0x9D, 0xD4, 0x05, 0x84, 0x78, 0xE5, 0x64, 0x27, 0x34, 0x20, 0x6F, 0x12, 0x53, 0xB0, 0x34, + 0xA9, 0x0C, 0xC8, 0x6D, 0xD0, 0x32, 0xC9, 0xC4, 0xF5, 0x58, 0x36, 0x98, 0x31, 0x73, 0x4C, 0x29, 0xB2, 0xD8, 0x62, 0x4F, 0xE7, 0xEE, 0x35, 0xF1, 0x24, 0xC2, + 0x4A, 0x29, 0xB5, 0x7F, 0xD2, 0x37, 0x15, 0xB0, 0x19, 0x30, 0x3C, 0x4A, 0x65, 0x9F, 0x44, 0xD7, 0xD5, 0x27, 0xDD, 0x5C, 0x3F, 0x66, 0xE8, 0xDA, 0xE0, 0x33, + 0xC6, 0xD8, 0x26, 0x66, 0xCE, 0x68, 0x66, 0x92, 0xA9, 0xB1, 0xB2, 0x83, 0x02, 0xAB, 0x34, 0x3A, 0xF8, 0x2F, 0xAF, 0x47, 0x1A, 0x86, 0xFE, 0x89, 0x75, 0xA1, + 0x73, 0x1A, 0x38, 0xFE, 0x25, 0xE9, 0x53, 0xA4, 0x1A, 0xC6, 0x72, 0x49, 0x0C, 0x68, 0x35, 0x21, 0x59, 0x7A, 0x50, 0x9A, 0x62, 0xC8, 0xE3, 0xBC, 0xD2, 0xBC, + 0xBD, 0xD0, 0x61, 0xC3, 0xE4, 0xB1, 0x14, 0xCF, 0xA7, 0x53, 0x77, 0xB2, 0x92, 0x65, 0x35, 0x6A, 0x8E, 0xB7, 0x8E, 0xEF, 0x54, 0x88, 0xCC, 0xB7, 0x2D, 0xEA, + 0xFE, 0x2B, 0xC7, 0x41, 0x8D, 0xB6, 0x02, 0x0F, 0xD8, 0x94, 0x74, 0xA4, 0x26, 0xB8, 0x4A, 0x31, 0x2C, 0x21, 0xD8, 0xAC, 0xDA, 0x55, 0x2A, 0x4C, 0x49, 0xC2, + 0x69, 0x18, 0x69, 0x35, 0x88, 0x21, 0x96, 0x29, 0x50, 0xD5, 0x93, 0x4B, 0x30, 0x5F, 0x2D, 0x64, 0x79, 0x94, 0xE8, 0x4C, 0x87, 0x41, 0x9F, 0x75, 0xE7, 0xCD, + 0xC6, 0x46, 0xB3, 0x73, 0xD0, 0x39, 0xE8, 0xC1, 0x7F, 0x92, 0xF9, 0x4C, 0xBE, 0x71, 0x71, 0xF1, 0x66, 0x58, 0x5E, 0x2A, 0x44, 0x17, 0x97, 0x95, 0xB2, 0x82, + 0x7D, 0xA1, 0x2E, 0xD4, 0x3D, 0x29, 0x59, 0x5F, 0xD2, 0xDB, 0x05, 0xE3, 0x70, 0x86, 0x49, 0x97, 0x37, 0x44, 0x89, 0xB5, 0x94, 0x55, 0xF1, 0xC2, 0xFD, 0x4F, + 0x8B, 0x25, 0x21, 0xFF, 0xE7, 0xAD, 0x3D, 0x26, 0x8A, 0x3F, 0xB5, 0xA5, 0x97, 0x96, 0x8B, 0xFF, 0xD0, 0xB6, 0xD1, 0xC9, 0xD6, 0x7A, 0x8B, 0x67, 0x7D, 0x40, + 0xA1, 0x03, 0x73, 0x50, 0x0F, 0x26, 0xA3, 0x99, 0x99, 0x61, 0xAC, 0x4D, 0x05, 0x19, 0x4C, 0x2D, 0xDB, 0x6E, 0xD9, 0xEE, 0x4D, 0x71, 0x26, 0x92, 0x6F, 0xC9, + 0x6B, 0x76, 0x5A, 0x6C, 0xF2, 0x55, 0xA9, 0x5D, 0x41, 0xE4, 0xFA, 0x43, 0x50, 0xFB, 0xE7, 0x76, 0xB8, 0x5C, 0xD7, 0xA8, 0x36, 0x50, 0x54, 0xB0, 0xC7, 0x7A, + 0x1D, 0x29, 0x99, 0x12, 0xCB, 0x04, 0xF3, 0xA7, 0x3D, 0x37, 0x56, 0x30, 0x99, 0x57, 0x98, 0x7A, 0x46, 0x13, 0x23, 0x8F, 0xD8, 0x06, 0x66, 0xF0, 0x95, 0x2A, + 0x14, 0x85, 0xD3, 0xB7, 0x38, 0xB8, 0x0A, 0x27, 0x54, 0x74, 0x8F, 0xA7, 0xBA, 0xD4, 0x66, 0xB9, 0x43, 0x76, 0xAC, 0x96, 0x9B, 0x75, 0x41, 0xBA, 0x9F, 0xF4, + 0x0C, 0x79, 0xA3, 0x12, 0x11, 0x5D, 0x04, 0xED, 0x99, 0x47, 0xEE, 0x14, 0x98, 0x39, 0xE0, 0x7F, 0x4F, 0x59, 0xFD, 0xB8, 0x7A, 0xA9, 0x84, 0x0E, 0x00, 0xDC, + 0x8A, 0xDA, 0x7D, 0x5F, 0xA1, 0xEB, 0xEC, 0x2E, 0x55, 0xEC, 0x31, 0xAC, 0x8E, 0x36, 0x1A, 0x0A, 0xE1, 0x26, 0x67, 0x08, 0x95, 0x9B, 0xAA, 0x18, 0x7D, 0xE5, + 0xF3, 0x79, 0x32, 0x0D, 0x32, 0x16, 0x7F, 0x68, 0x9E, 0xDA, 0xCB, 0x8F, 0x6E, 0xAD, 0x58, 0x35, 0xA5, 0x30, 0x72, 0x84, 0x45, 0xCC, 0x6C, 0xEB, 0x93, 0x62, + 0xC6, 0xE8, 0x59, 0x1A, 0x79, 0xB6, 0x4A, 0x44, 0xFA, 0x4C, 0xD5, 0x0C, 0x6D, 0x16, 0x7C, 0xC8, 0x07, 0xF5, 0x90, 0x5F, 0x9A, 0xDD, 0xA1, 0x74, 0x6D, 0x25, + 0xA7, 0x71, 0x1E, 0x69, 0x99, 0x55, 0xC0, 0xF5, 0x21, 0x2B, 0x73, 0x82, 0x1C, 0x8F, 0x45, 0x52, 0x45, 0xE5, 0x7B, 0x65, 0x5E, 0x84, 0x59, 0xAF, 0x64, 0xE5, + 0x1A, 0xBB, 0xB5, 0x30, 0x20, 0xED, 0x45, 0x73, 0x35, 0x00, 0xA3, 0x4C, 0x7F, 0x2A, 0xE6, 0x1E, 0xAB, 0xB1, 0xEA, 0xC3, 0x4E, 0x41, 0x97, 0x13, 0xDB, 0xF5, + 0x6B, 0x16, 0xC0, 0xB2, 0xEB, 0x5F, 0xD2, 0x3B, 0x4A, 0x43, 0x77, 0xAE, 0x4F, 0xE5, 0xBB, 0x63, 0x4A, 0xE6, 0x7A, 0x47, 0x1A, 0x69, 0x73, 0xAB, 0x94, 0xB4, + 0x82, 0x46, 0xD7, 0x2F, 0x4F, 0xB5, 0x09, 0x91, 0x87, 0xD1, 0x64, 0xA1, 0x4E, 0xA5, 0x54, 0x9A, 0xAB, 0x87, 0xB9, 0x65, 0x9A, 0x24, 0xB7, 0x16, 0x8C, 0x73, + 0x5E, 0xC5, 0xE4, 0x01, 0xE9, 0x97, 0x15, 0xA5, 0xB6, 0xE2, 0x14, 0xB9, 0xDB, 0x1A, 0xF4, 0x6D, 0x7B, 0x0C, 0x1F, 0x68, 0xB2, 0x2A, 0xE9, 0xC9, 0x54, 0x24, + 0x97, 0x54, 0xA9, 0x73, 0x87, 0xB5, 0x56, 0x14, 0x19, 0xC8, 0x01, 0x5B, 0xAD, 0x47, 0xF3, 0x14, 0x55, 0x74, 0x21, 0xA5, 0xCD, 0xD7, 0x96, 0xF8, 0x32, 0x60, + 0x2B, 0x6B, 0x75, 0x65, 0x83, 0x4B, 0x6D, 0xD4, 0x02, 0xD2, 0xFD, 0x66, 0x8A, 0xE6, 0x81, 0x32, 0xA3, 0x1C, 0x22, 0xC3, 0x21, 0x46, 0x6C, 0xAE, 0x4A, 0xB6, + 0x2A, 0xEB, 0x1C, 0xE1, 0xF9, 0xD9, 0x61, 0x6C, 0x3B, 0xDC, 0xD9, 0x61, 0xB4, 0x73, 0xEF, 0x0C, 0xF7, 0xC4, 0xC5, 0x77, 0xCD, 0xF1, 0x8E, 0x26, 0xB6, 0xE1, + 0xFB, 0xE7, 0x0D, 0xDC, 0xDB, 0xD5, 0x48, 0x6E, 0xA2, 0x3B, 0x33, 0xAD, 0x6B, 0xCD, 0x32, 0xCF, 0x1B, 0xB6, 0x3B, 0x73, 0x53, 0xF7, 0xE8, 0x7D, 0xA6, 0x66, + 0x18, 0xC8, 0xCE, 0x1B, 0x89, 0x05, 0xC6, 0x06, 0x85, 0x8A, 0x2E, 0x35, 0x46, 0xCF, 0xBE, 0x39, 0x39, 0x3A, 0x1A, 0xBE, 0x78, 0xE6, 0x8C, 0xFD, 0x25, 0xFF, + 0xFF, 0x47, 0xB6, 0x1E, 0xCB, 0x36, 0xF5, 0xC1, 0xD8, 0x16, 0x04, 0x60, 0x7B, 0xFE, 0xD9, 0x21, 0x45, 0x9A, 0x22, 0xE4, 0x10, 0x28, 0xC9, 0xA0, 0x8D, 0xE7, + 0x3B, 0x32, 0xF2, 0x44, 0x13, 0x1F, 0x86, 0xF0, 0xB1, 0xE1, 0x49, 0x9A, 0xD0, 0x66, 0x2C, 0x9B, 0xA6, 0xB1, 0xA4, 0x41, 0x95, 0x32, 0x76, 0x6F, 0xD3, 0x1C, + 0x50, 0xA6, 0xB8, 0xC6, 0x78, 0x2B, 0x62, 0x66, 0x21, 0x04, 0x30, 0x0A, 0x8E, 0xAB, 0xAB, 0xD0, 0x46, 0xDA, 0x28, 0xA1, 0x02, 0x6C, 0x7C, 0x3B, 0xB1, 0xBF, + 0x08, 0xE5, 0x37, 0x84, 0x52, 0x1C, 0x37, 0x60, 0xB1, 0x32, 0xA3, 0xAB, 0x04, 0xAB, 0x1C, 0x26, 0xB6, 0x6E, 0xC8, 0xB8, 0x00, 0xD1, 0xB6, 0x28, 0x76, 0x76, + 0x2D, 0x1F, 0x13, 0xC5, 0x16, 0xD3, 0xAB, 0x00, 0x6E, 0x8C, 0x7E, 0xB9, 0x78, 0xFF, 0x37, 0xED, 0xC3, 0xBB, 0xFF, 0x48, 0x35, 0x54, 0x44, 0x14, 0x06, 0x69, + 0x85, 0x9E, 0x29, 0x18, 0xD3, 0x87, 0x90, 0x49, 0x83, 0x6B, 0x86, 0x62, 0xC0, 0xE1, 0xDE, 0x26, 0xCE, 0x2C, 0x98, 0x9F, 0x37, 0xF4, 0x06, 0xEE, 0x69, 0x11, + 0x67, 0xDD, 0x86, 0x86, 0x01, 0x9C, 0x1E, 0x5C, 0x1B, 0xF6, 0x0A, 0x8F, 0x3A, 0x2A, 0xBC, 0xAE, 0x9B, 0x96, 0xB4, 0x19, 0x8F, 0x2C, 0xA1, 0x8C, 0x63, 0x91, + 0x38, 0x29, 0xE5, 0xC6, 0xE8, 0x8A, 0x04, 0x67, 0x87, 0xEC, 0x56, 0x81, 0xD6, 0xF2, 0xFB, 0x06, 0x4F, 0x66, 0xE6, 0x90, 0x67, 0x42, 0x79, 0x8A, 0x9F, 0x7A, + 0xC6, 0x82, 0xA0, 0x54, 0x94, 0x34, 0x1F, 0xD7, 0x7A, 0x08, 0xD9, 0x18, 0xFD, 0x40, 0x68, 0x46, 0x04, 0x64, 0x28, 0x29, 0xFE, 0x8C, 0x27, 0xA9, 0x89, 0xFE, + 0x43, 0x7B, 0xE6, 0x8B, 0x52, 0x2D, 0x83, 0x99, 0xB9, 0x82, 0xDC, 0x9F, 0xB6, 0x5A, 0x5A, 0xEF, 0xC3, 0x47, 0xAD, 0xD5, 0x52, 0x68, 0xEC, 0x2E, 0xA9, 0x3B, + 0x71, 0xFD, 0xEB, 0x27, 0x8D, 0xD1, 0x3F, 0x7E, 0x79, 0xFB, 0xAA, 0xD9, 0xED, 0xF4, 0x8F, 0x6F, 0xF5, 0xC1, 0xB0, 0xBF, 0x7F, 0x76, 0xC8, 0x9A, 0x94, 0xC7, + 0x75, 0xDC, 0x18, 0x7D, 0x44, 0x42, 0x9A, 0xC7, 0xC3, 0x7E, 0x5D, 0x5C, 0x47, 0x88, 0xEB, 0xDD, 0x9B, 0xE6, 0x51, 0xB7, 0x73, 0xAB, 0x77, 0x8F, 0x3B, 0x35, + 0x50, 0x0D, 0x1B, 0xA3, 0x6F, 0x01, 0x93, 0x7E, 0x82, 0xA8, 0x3A, 0xE5, 0x50, 0xA1, 0x68, 0xBB, 0x15, 0x45, 0x3B, 0x68, 0x8C, 0x7E, 0x42, 0xD1, 0x42, 0xCE, + 0x8D, 0x3C, 0x74, 0xEA, 0xF0, 0xD0, 0x07, 0x97, 0xA1, 0xB8, 0x40, 0x14, 0xC0, 0x44, 0xB7, 0x8E, 0x68, 0x7B, 0x8D, 0x11, 0x8A, 0x03, 0x31, 0x81, 0x74, 0x6B, + 0x20, 0xEA, 0x42, 0xC0, 0x43, 0x9A, 0x80, 0x9C, 0xDB, 0xA3, 0xE1, 0x71, 0x0D, 0x4C, 0x3A, 0xB0, 0xF7, 0x09, 0x50, 0x1D, 0x83, 0xA4, 0x86, 0xB5, 0x04, 0x05, + 0xF1, 0x0C, 0x11, 0x0D, 0xFB, 0x9D, 0xDB, 0x7E, 0x1D, 0xAB, 0x01, 0xBF, 0x78, 0x87, 0x88, 0x00, 0xC9, 0x6D, 0xAF, 0x8E, 0x94, 0xC0, 0x29, 0x2E, 0xBE, 0xFB, + 0xB6, 0xD9, 0x07, 0xCE, 0xBA, 0x27, 0xC3, 0xEA, 0x78, 0xC0, 0x21, 0x80, 0x0E, 0xA4, 0xA5, 0x32, 0x0A, 0x70, 0x84, 0x7F, 0x20, 0x4F, 0x88, 0xA7, 0xDB, 0xAF, + 0xC1, 0x13, 0x58, 0x36, 0xC0, 0x23, 0x8E, 0xCA, 0x28, 0xC0, 0xA0, 0xDF, 0x51, 0x62, 0x10, 0x91, 0x7E, 0x54, 0x43, 0x30, 0x60, 0xCE, 0xFF, 0x40, 0x09, 0x03, + 0x92, 0x5B, 0xBD, 0x5F, 0xC3, 0x31, 0xC0, 0x9C, 0xC1, 0x29, 0x30, 0xDA, 0x54, 0x37, 0x3F, 0xA0, 0x85, 0x72, 0x05, 0x3E, 0x8F, 0x2E, 0x5F, 0x9D, 0x18, 0xB0, + 0xE3, 0x93, 0xE1, 0xED, 0xC9, 0x50, 0x0D, 0x01, 0x0E, 0x83, 0x38, 0xA4, 0xE4, 0x0D, 0x94, 0xF9, 0xE3, 0x68, 0xDE, 0x18, 0xF9, 0xEF, 0x15, 0x4C, 0x7D, 0x83, + 0xBB, 0xD2, 0x23, 0x24, 0x87, 0x03, 0x99, 0xB0, 0x03, 0xB5, 0xC1, 0x31, 0x46, 0x49, 0xB8, 0x0B, 0xAB, 0x31, 0xEA, 0x2B, 0x24, 0x21, 0x89, 0x2C, 0x95, 0xC2, + 0x26, 0xE8, 0xA7, 0x99, 0x11, 0x5A, 0x1E, 0xE6, 0x44, 0xE0, 0x0D, 0xBD, 0x46, 0x2C, 0x6A, 0x54, 0x1A, 0x7D, 0x25, 0xB4, 0x1A, 0xB7, 0x8D, 0xD1, 0xB0, 0x57, + 0x98, 0xB5, 0x54, 0x57, 0xC6, 0x98, 0x16, 0x59, 0x1C, 0xE2, 0xFB, 0xA5, 0xF5, 0x11, 0x81, 0x36, 0x46, 0xAF, 0xC3, 0xE3, 0x3A, 0x5A, 0x69, 0x15, 0x71, 0x4A, + 0x61, 0x33, 0xD4, 0x12, 0x23, 0x87, 0x69, 0xA6, 0xD5, 0xE3, 0xAA, 0x89, 0x34, 0xB3, 0x59, 0xC5, 0x6C, 0x53, 0x2F, 0x38, 0xC7, 0xF2, 0x0C, 0x3F, 0x28, 0xAD, + 0x15, 0x01, 0x08, 0xE3, 0x04, 0x3F, 0x7A, 0x30, 0x8D, 0x84, 0xA4, 0xFC, 0x09, 0xF4, 0xE1, 0x1B, 0xC1, 0x8A, 0xED, 0x77, 0x2B, 0xAD, 0x91, 0x08, 0x14, 0xD2, + 0x92, 0xF0, 0xB8, 0x96, 0x56, 0xEA, 0x84, 0xAF, 0x18, 0x39, 0x5C, 0x2F, 0x22, 0x84, 0xF5, 0xB7, 0xA4, 0x97, 0x22, 0x6A, 0x6B, 0xE9, 0x65, 0x6E, 0x78, 0xCB, + 0x4A, 0xE1, 0x2B, 0x84, 0x04, 0xAD, 0x88, 0xC3, 0x07, 0x73, 0x95, 0x88, 0x98, 0x3F, 0x81, 0xAF, 0x98, 0xC4, 0x71, 0x2D, 0xBF, 0xFC, 0x14, 0x98, 0xC3, 0x35, + 0x46, 0x6F, 0x48, 0xEB, 0x7B, 0x3C, 0xAA, 0xA3, 0x8E, 0x57, 0xAB, 0xC0, 0xAD, 0xA1, 0x10, 0x41, 0x0B, 0x53, 0x47, 0x87, 0x6B, 0xE3, 0x78, 0x4B, 0xDA, 0x38, + 0xDE, 0xA2, 0x36, 0x0C, 0xF2, 0xD9, 0x26, 0xD7, 0xC4, 0x2E, 0xAD, 0x0E, 0x01, 0xD8, 0x18, 0x5D, 0xDE, 0x2E, 0x5D, 0x1F, 0x9F, 0x22, 0x7A, 0x8F, 0xE7, 0xB5, + 0x9C, 0x64, 0x50, 0x43, 0x27, 0x21, 0x41, 0xDC, 0x47, 0x06, 0x5C, 0x2B, 0x83, 0x2D, 0x69, 0xA5, 0x88, 0xD6, 0x3A, 0x5A, 0x99, 0x19, 0x96, 0x33, 0x21, 0x96, + 0x8D, 0x4F, 0x34, 0x94, 0x55, 0x4C, 0x0C, 0xB6, 0x31, 0x7A, 0x1B, 0x9D, 0xD4, 0x51, 0x4C, 0xA7, 0x86, 0x5E, 0xE2, 0xF4, 0x24, 0xFD, 0x65, 0x00, 0x53, 0xF1, + 0x2D, 0xE9, 0x46, 0xD7, 0xB7, 0x39, 0xAA, 0x2C, 0xC9, 0xC4, 0x32, 0xEC, 0xCF, 0x64, 0x3A, 0x85, 0x69, 0x50, 0xF9, 0xA1, 0x25, 0x01, 0x0E, 0xE3, 0x0B, 0x3B, + 0xD7, 0x2E, 0xE9, 0x79, 0xE9, 0xA2, 0x5E, 0x0A, 0x5D, 0xF5, 0xCA, 0x5E, 0x7A, 0x4E, 0xC8, 0x97, 0xB7, 0x09, 0xAD, 0xA5, 0xB2, 0xA3, 0xC6, 0xE8, 0x7B, 0x37, + 0xA4, 0xB3, 0xFA, 0xB4, 0xF5, 0x7B, 0x32, 0xA3, 0xAB, 0xC7, 0x75, 0x66, 0xCF, 0x6F, 0x3D, 0xE3, 0x8E, 0xBE, 0x9E, 0xA0, 0xCE, 0x5C, 0xFE, 0x07, 0x62, 0x6A, + 0x3F, 0x5A, 0x4E, 0x75, 0x66, 0xFA, 0x48, 0x08, 0x21, 0x4E, 0x3D, 0x2C, 0x03, 0x98, 0x22, 0xC1, 0x41, 0x3D, 0x24, 0x43, 0x2C, 0x74, 0x2F, 0x2D, 0xE3, 0x31, + 0x4C, 0xE2, 0x8D, 0x9B, 0x71, 0xF9, 0x01, 0xE5, 0x66, 0x0C, 0xE3, 0xF2, 0xCF, 0xAF, 0xB5, 0x4B, 0xBA, 0xDF, 0xB9, 0x74, 0xB8, 0x62, 0x5B, 0xB1, 0x54, 0x0C, + 0x3D, 0x5A, 0xCF, 0xC0, 0x3E, 0xD7, 0x16, 0x9A, 0xE4, 0x0E, 0xA4, 0xBA, 0xD8, 0x24, 0x61, 0x4F, 0x10, 0x48, 0x77, 0xAE, 0x34, 0x62, 0xDC, 0xAA, 0xF1, 0xB8, + 0xC5, 0x54, 0x6C, 0x72, 0x53, 0x3E, 0x0D, 0x9B, 0xDC, 0x80, 0x9A, 0xCC, 0x6B, 0xDC, 0x0A, 0x6F, 0x6A, 0xA0, 0xAF, 0x9D, 0x28, 0x0A, 0x7B, 0x7D, 0x18, 0x45, + 0x51, 0x7E, 0x1F, 0x5A, 0x51, 0x60, 0x2D, 0x9F, 0x71, 0x1C, 0xAD, 0xE2, 0x54, 0x14, 0xB0, 0x31, 0xFA, 0x60, 0x38, 0x2B, 0x18, 0x64, 0x76, 0xA5, 0xB0, 0xB0, + 0xE3, 0x07, 0x73, 0x2F, 0xCE, 0xF7, 0x43, 0xAB, 0x0E, 0x08, 0x59, 0xB8, 0x66, 0xF9, 0xE9, 0x0E, 0x87, 0x63, 0x21, 0xF1, 0x03, 0x1C, 0x95, 0x4E, 0x0C, 0x04, + 0x86, 0x2D, 0x67, 0x04, 0x6C, 0x2A, 0x55, 0x3D, 0x19, 0xB8, 0x5A, 0x39, 0xCE, 0x5D, 0x9D, 0x4C, 0xE0, 0xC2, 0x76, 0x57, 0x66, 0x75, 0x0C, 0x90, 0x06, 0xFC, + 0x7D, 0x3A, 0xB5, 0x26, 0xD5, 0x13, 0x09, 0x5C, 0x5E, 0x70, 0x17, 0x8A, 0xF0, 0x5B, 0x1E, 0x78, 0xC9, 0xA4, 0xC2, 0x4C, 0x6E, 0x02, 0x5A, 0xBC, 0xBC, 0xD8, + 0xE9, 0xC0, 0x0B, 0x7D, 0x3E, 0x50, 0x64, 0x40, 0x6E, 0x1F, 0x3A, 0x28, 0x00, 0x11, 0x9F, 0xA9, 0xF1, 0x54, 0x51, 0x16, 0x83, 0x0C, 0x23, 0xBA, 0x98, 0x7E, + 0x3F, 0xD4, 0xFC, 0x2E, 0xA2, 0x28, 0x39, 0xBB, 0xD3, 0x07, 0xBD, 0x61, 0x38, 0xBD, 0xEB, 0x75, 0x37, 0x3B, 0xC1, 0x43, 0xE4, 0xDB, 0xD5, 0x4F, 0xB7, 0x8A, + 0x6A, 0x20, 0x1A, 0x7D, 0x8F, 0xEB, 0x0C, 0x25, 0x02, 0x76, 0x7D, 0x47, 0xEA, 0x3E, 0x9C, 0x27, 0x75, 0x1F, 0x81, 0x2B, 0xCD, 0x2A, 0x44, 0xBC, 0x19, 0x46, + 0xBC, 0xB7, 0x17, 0xBB, 0xD1, 0xD0, 0xEC, 0xC1, 0x42, 0xDD, 0xEC, 0x41, 0x43, 0x9D, 0xC6, 0x77, 0xCA, 0x09, 0x29, 0x54, 0xCC, 0x60, 0x39, 0x20, 0xAB, 0x65, + 0xD5, 0x09, 0x72, 0xFA, 0x6D, 0x9D, 0x28, 0x27, 0xC8, 0x48, 0x06, 0xB9, 0x61, 0xB4, 0x2A, 0x32, 0xD8, 0xEC, 0xB2, 0x6E, 0xBF, 0x88, 0xDA, 0x3A, 0x4E, 0xE3, + 0x19, 0x37, 0x9F, 0x67, 0x0B, 0xA3, 0xB4, 0x32, 0x38, 0x1C, 0xE8, 0xE2, 0xC3, 0xAB, 0x5D, 0xA6, 0x0B, 0xA2, 0xDF, 0x87, 0xF1, 0xA3, 0x90, 0xEB, 0x87, 0x8E, + 0x75, 0x36, 0x71, 0xCA, 0x07, 0x3B, 0x04, 0x6A, 0x8C, 0xDE, 0x13, 0xC7, 0xD7, 0x2E, 0x5C, 0x8F, 0xBF, 0x13, 0x72, 0x27, 0x5A, 0xA3, 0x3D, 0x3F, 0x8C, 0xCA, + 0x18, 0xD3, 0x0F, 0xAD, 0xAF, 0xF9, 0xC2, 0xF2, 0x3C, 0xD7, 0x2B, 0xAD, 0x32, 0x0E, 0x07, 0xD3, 0x8A, 0xD6, 0x07, 0x7A, 0xB4, 0x13, 0x75, 0x89, 0x5E, 0x1F, + 0x46, 0x63, 0x21, 0xCF, 0x0F, 0xAD, 0xB4, 0xEB, 0xA9, 0x6D, 0x2D, 0x4B, 0xAB, 0x8C, 0x42, 0x35, 0x46, 0x9F, 0x5A, 0xDF, 0xC2, 0xDF, 0x9D, 0xA8, 0x8B, 0xF5, + 0xF8, 0x30, 0xCA, 0xE2, 0xDC, 0x3E, 0xB4, 0xAA, 0xC6, 0xCB, 0xF2, 0xE1, 0x10, 0x60, 0x1A, 0xA3, 0xD7, 0x1F, 0x77, 0x93, 0xFB, 0x61, 0x67, 0x8A, 0x1A, 0xAA, + 0xA5, 0x0F, 0xCA, 0xD4, 0x43, 0x6B, 0xE3, 0xA6, 0x82, 0x36, 0x6E, 0x90, 0xF0, 0x9F, 0x77, 0xA4, 0x8D, 0x1B, 0x75, 0x6D, 0x6C, 0xD8, 0x5F, 0x6E, 0x1E, 0x83, + 0x7E, 0xE8, 0x43, 0x87, 0x63, 0xA3, 0xFC, 0x70, 0x24, 0x00, 0x71, 0xD3, 0x18, 0x1C, 0x69, 0xAF, 0x8D, 0xDD, 0x0C, 0x48, 0x61, 0xBF, 0xBB, 0x70, 0xA1, 0x88, + 0xC9, 0x87, 0xD6, 0x93, 0x4D, 0xCC, 0x0A, 0x49, 0x9E, 0xF9, 0x19, 0x9F, 0xE0, 0xC3, 0x27, 0xDB, 0xEF, 0x20, 0xDB, 0xBB, 0x7C, 0xA3, 0x7D, 0x27, 0x4E, 0x1F, + 0xAA, 0x30, 0x94, 0xA4, 0x29, 0x39, 0x6F, 0xEA, 0x0E, 0xB6, 0xB5, 0x2D, 0x03, 0x30, 0xD7, 0xD4, 0x4D, 0xFC, 0x21, 0x30, 0xFE, 0xFA, 0xD4, 0x22, 0x52, 0xF8, + 0xC3, 0x48, 0x74, 0xBB, 0x03, 0x09, 0x5A, 0x7E, 0x60, 0xD9, 0x36, 0x4C, 0x92, 0x48, 0xA0, 0x5D, 0xE1, 0xA1, 0xE2, 0xD3, 0x47, 0x31, 0x2C, 0xE2, 0xD9, 0xC3, + 0xC0, 0x23, 0xC6, 0xA2, 0x31, 0xBA, 0xC2, 0x17, 0xCB, 0x02, 0x2E, 0x3C, 0x2B, 0x46, 0x16, 0x7F, 0x4E, 0x29, 0xDF, 0x04, 0xE9, 0x93, 0x89, 0xF8, 0xA8, 0x61, + 0xF2, 0x45, 0xD0, 0xE0, 0x03, 0xEC, 0xC1, 0xE3, 0xD1, 0x99, 0xBF, 0x34, 0x1C, 0xD1, 0x8C, 0x3E, 0x95, 0x7B, 0xC3, 0x1F, 0xB3, 0x1C, 0xBB, 0xB6, 0xF9, 0x22, + 0xB6, 0x12, 0x78, 0x15, 0x3E, 0x2F, 0x88, 0x20, 0xE0, 0x44, 0x02, 0x43, 0x81, 0xB4, 0xE7, 0x9E, 0x40, 0xCF, 0x1E, 0xED, 0xC4, 0xD7, 0x08, 0xE5, 0x88, 0x3B, + 0xE3, 0x11, 0x47, 0x8F, 0xCC, 0x42, 0x2B, 0x92, 0x3D, 0xFA, 0x2A, 0x7D, 0xE0, 0xF1, 0x07, 0x32, 0xB3, 0x7C, 0xA0, 0x51, 0x03, 0x45, 0x1D, 0xD2, 0x87, 0xC4, + 0x98, 0xA3, 0xA8, 0x3D, 0x80, 0x18, 0xEF, 0x92, 0x3F, 0x3F, 0x2D, 0x7D, 0xAE, 0xB4, 0xD4, 0x58, 0x92, 0x7E, 0x08, 0x34, 0x89, 0xB1, 0xC8, 0x0C, 0x9F, 0xB6, + 0x5A, 0xF3, 0x3E, 0x3E, 0xEE, 0xA6, 0x09, 0xD6, 0xCE, 0x0E, 0xE7, 0xFD, 0xA2, 0xC7, 0x89, 0x0A, 0x9F, 0x55, 0x04, 0x4E, 0x2B, 0x3F, 0xAA, 0x88, 0x52, 0x1A, + 0x01, 0x35, 0x07, 0xDA, 0x07, 0xC3, 0xFF, 0x72, 0xA0, 0x7D, 0x42, 0x9F, 0xDF, 0xE1, 0x13, 0x8B, 0x48, 0xBB, 0x61, 0x9A, 0x5E, 0xE6, 0x53, 0x8B, 0xFD, 0xC4, + 0x53, 0x8B, 0x43, 0xF1, 0xD4, 0x62, 0x54, 0xBA, 0xEE, 0xDC, 0xF6, 0x3A, 0x9D, 0x63, 0x15, 0xD6, 0x15, 0x9F, 0x5C, 0xDC, 0x08, 0x4F, 0x0B, 0x90, 0xA6, 0x22, + 0x4F, 0x7D, 0xC1, 0x53, 0x6C, 0x07, 0xEF, 0xED, 0x74, 0xFA, 0xD8, 0x38, 0xE2, 0x6B, 0x08, 0xD5, 0x59, 0xEA, 0x74, 0x77, 0xFD, 0x78, 0x29, 0x35, 0xEE, 0x4D, + 0x3D, 0x5D, 0x4A, 0x9B, 0xA4, 0xA3, 0xE1, 0x20, 0x37, 0x18, 0x52, 0x10, 0xE6, 0xF4, 0x6F, 0x37, 0xE9, 0xF4, 0xB3, 0x1A, 0x4E, 0x3F, 0x5B, 0x73, 0xFA, 0x1D, + 0x7A, 0xBB, 0x20, 0xFC, 0xCF, 0xE6, 0xF1, 0x82, 0xAF, 0x12, 0x5E, 0x2F, 0xE5, 0xAB, 0xD3, 0xD9, 0xA8, 0xDF, 0x17, 0x3A, 0x49, 0x68, 0x0C, 0x6F, 0x37, 0xE9, + 0x24, 0x19, 0xA6, 0x5B, 0xC9, 0x4E, 0x79, 0xD8, 0x19, 0xED, 0x66, 0x5C, 0xA2, 0xD9, 0x54, 0x5C, 0xA1, 0xBC, 0x77, 0x7C, 0x7E, 0xAF, 0xD7, 0xE7, 0xA9, 0xD3, + 0x26, 0xD4, 0xA3, 0xFE, 0x24, 0x7B, 0x66, 0x93, 0xCD, 0x24, 0x66, 0x4B, 0x48, 0x84, 0x4B, 0x27, 0x66, 0x1F, 0xDF, 0xBF, 0x2F, 0x97, 0x8B, 0xC5, 0x7B, 0x79, + 0x24, 0xB9, 0x58, 0x6E, 0xDD, 0xEA, 0x6E, 0x09, 0x37, 0x90, 0xEA, 0x4A, 0xA6, 0x1B, 0x81, 0x37, 0x46, 0xAF, 0xE9, 0xB1, 0x16, 0x93, 0x58, 0x29, 0xE3, 0x55, + 0x9E, 0x96, 0x53, 0xC0, 0x58, 0x61, 0x2B, 0x22, 0x21, 0xAD, 0x1B, 0x45, 0x5C, 0x39, 0xC5, 0xAC, 0x18, 0x7B, 0xEA, 0x4C, 0xD5, 0xF6, 0x09, 0xDA, 0xA4, 0x28, + 0x15, 0x5E, 0xAC, 0xEC, 0xCA, 0x6A, 0xE3, 0xB0, 0x8D, 0xD1, 0x07, 0x98, 0xE3, 0x5A, 0x4B, 0xDB, 0x82, 0x99, 0x47, 0xB3, 0xA3, 0xB5, 0xB4, 0x9E, 0xBE, 0xBF, + 0xC3, 0x31, 0x52, 0x90, 0x51, 0xF2, 0x35, 0x1E, 0x7A, 0xF4, 0x74, 0x4B, 0x6F, 0x43, 0xEF, 0xF1, 0xA8, 0xAB, 0x10, 0xCF, 0x75, 0x83, 0xCA, 0xDA, 0x10, 0xC0, + 0x90, 0xA8, 0xC0, 0x91, 0x16, 0xE9, 0x44, 0x5D, 0x15, 0xB1, 0xBD, 0x76, 0x11, 0x36, 0x35, 0x75, 0x28, 0xED, 0xAC, 0xC3, 0x05, 0x6B, 0xD5, 0x2D, 0x69, 0x12, + 0xAC, 0x7A, 0x63, 0xD4, 0x2D, 0x81, 0xA1, 0x78, 0x63, 0x1A, 0x6B, 0x55, 0xDF, 0x89, 0xFC, 0xBB, 0xEA, 0xB1, 0x8F, 0xC3, 0x42, 0xDA, 0x7D, 0x07, 0xA9, 0xEE, + 0x42, 0x7B, 0x03, 0x7D, 0x51, 0x27, 0xD2, 0x07, 0xBB, 0x74, 0x22, 0x41, 0x46, 0x75, 0x27, 0xD2, 0x1F, 0x87, 0x0F, 0xA1, 0x3E, 0x96, 0x1E, 0xA9, 0xAC, 0x0F, + 0x0E, 0xDB, 0x18, 0x7D, 0xF4, 0x08, 0x2A, 0xA3, 0x92, 0xF7, 0x84, 0x48, 0xAA, 0x39, 0xCF, 0x06, 0x1C, 0x45, 0x6F, 0x0F, 0xEA, 0xE1, 0xE8, 0x96, 0x73, 0x36, + 0x09, 0x86, 0x9E, 0x3C, 0x08, 0xF4, 0x1E, 0xA7, 0x0B, 0x13, 0xDB, 0x1C, 0x54, 0x77, 0x62, 0x01, 0x8D, 0xB3, 0x67, 0x38, 0xAC, 0x6C, 0x38, 0x31, 0x44, 0x8F, + 0x2A, 0xEE, 0xD6, 0xC4, 0xB0, 0x09, 0x63, 0x1A, 0x75, 0x4B, 0x99, 0xF4, 0x6E, 0x4C, 0x67, 0x89, 0x6F, 0x3D, 0x23, 0x6A, 0x9B, 0xC0, 0x28, 0xB2, 0x78, 0xA4, + 0x61, 0xB0, 0x10, 0x69, 0xE8, 0x7B, 0xCF, 0xE8, 0xE6, 0xD7, 0x9D, 0xE6, 0xBC, 0x82, 0x80, 0xF5, 0xD5, 0xA8, 0xF2, 0x6B, 0x85, 0x31, 0xE6, 0x64, 0x29, 0x70, + 0xC8, 0xEB, 0x63, 0xCB, 0x7F, 0x29, 0x61, 0x95, 0xC7, 0x0A, 0x0E, 0xCC, 0x55, 0x18, 0x0E, 0xDD, 0xBB, 0xCD, 0x7F, 0x43, 0x2A, 0x6A, 0x8C, 0xDD, 0x3B, 0x4C, + 0x80, 0x63, 0x8B, 0x42, 0x54, 0x01, 0x2C, 0x68, 0x06, 0x6C, 0xC6, 0x57, 0x62, 0x25, 0x28, 0xB3, 0xC9, 0x66, 0xE6, 0xF9, 0x37, 0x96, 0x53, 0x7E, 0x9E, 0xFF, + 0xB3, 0xE5, 0x98, 0xEE, 0x4D, 0xB9, 0xA9, 0x7E, 0xBC, 0xA3, 0x3F, 0xC0, 0x54, 0x9F, 0x0E, 0x96, 0xB8, 0x7A, 0xD7, 0xF2, 0x88, 0xDA, 0x5B, 0x28, 0xD2, 0x42, + 0x66, 0xD0, 0xB7, 0xB8, 0xD4, 0x06, 0x28, 0x7C, 0x8D, 0xAE, 0x05, 0x6E, 0xDB, 0x5F, 0x7E, 0x39, 0x8D, 0x27, 0xBB, 0x9C, 0x02, 0x35, 0x87, 0xE9, 0x4B, 0x0A, + 0x8F, 0x0F, 0x5E, 0x4B, 0xFD, 0x75, 0x9D, 0x9F, 0xBB, 0x07, 0xE7, 0x67, 0x13, 0x01, 0x99, 0x38, 0x66, 0x65, 0xCB, 0x42, 0xD8, 0xC8, 0xAE, 0x2E, 0x1D, 0x73, + 0xA7, 0x56, 0xC5, 0x7A, 0xAF, 0xAC, 0x83, 0x6E, 0xE7, 0xE8, 0xE4, 0x71, 0x99, 0x15, 0x32, 0x54, 0xC3, 0xA8, 0xF4, 0x41, 0xFF, 0xE8, 0xF1, 0xD8, 0x95, 0x3B, + 0x9D, 0xB2, 0x15, 0xAE, 0x6A, 0xA6, 0xC5, 0xC1, 0x6F, 0xE9, 0xB3, 0x75, 0x3E, 0xD9, 0x6D, 0xBC, 0x0A, 0x3B, 0x57, 0xD3, 0x45, 0x4F, 0xA2, 0x8B, 0xE1, 0xE3, + 0x32, 0x2D, 0xCE, 0x91, 0xAA, 0x75, 0x49, 0x38, 0xDA, 0x10, 0x43, 0x9B, 0x30, 0xAD, 0xC0, 0x0D, 0x0C, 0xBB, 0xB2, 0x65, 0x31, 0x68, 0x30, 0xAC, 0x1F, 0xF1, + 0x40, 0xBB, 0x02, 0x3E, 0x77, 0x6A, 0x5C, 0xA2, 0xFF, 0xEA, 0x81, 0xAB, 0xD7, 0x79, 0x64, 0xE3, 0x21, 0x63, 0xA9, 0x56, 0xE8, 0x1A, 0xF6, 0x1F, 0x8F, 0x7D, + 0xB9, 0xAB, 0x00, 0xAF, 0x56, 0x0E, 0x5D, 0x0C, 0x1C, 0x43, 0x17, 0x3D, 0xDA, 0xBD, 0x89, 0x85, 0x14, 0xD4, 0x18, 0x1C, 0xFB, 0x0F, 0xBF, 0x7E, 0xFD, 0xAB, + 0x84, 0xA7, 0x5A, 0x46, 0xD6, 0x7B, 0x2C, 0x41, 0x6C, 0x62, 0x28, 0xBF, 0x99, 0x89, 0x22, 0x8B, 0x67, 0xF3, 0x0C, 0x16, 0xE6, 0x70, 0xEC, 0x60, 0xA7, 0x15, + 0x0C, 0xD1, 0xF9, 0xC6, 0x97, 0xEC, 0x42, 0xAE, 0x1E, 0x53, 0xBD, 0x62, 0x6C, 0x39, 0x4E, 0x55, 0x35, 0x71, 0xD8, 0xC6, 0xE8, 0x35, 0x3B, 0xD8, 0xED, 0xE2, + 0x2A, 0xEF, 0x7C, 0xF3, 0x2B, 0xAB, 0x82, 0xAB, 0x5D, 0xAB, 0x29, 0x55, 0xC4, 0xF0, 0xC2, 0x57, 0xD8, 0x37, 0xF8, 0x6E, 0xC5, 0xE8, 0x95, 0xF6, 0x8F, 0xA7, + 0xA4, 0x31, 0x33, 0x16, 0xF8, 0xC8, 0x61, 0xD9, 0xA2, 0xC6, 0x5B, 0x04, 0x2B, 0x57, 0xD3, 0x48, 0xF6, 0xF4, 0xB8, 0xAB, 0x1A, 0xA3, 0xE4, 0xBB, 0xE6, 0x80, + 0xF0, 0xD6, 0xD8, 0x32, 0x7C, 0x7C, 0x3C, 0x17, 0x8E, 0xB5, 0xD7, 0x70, 0xAC, 0x7D, 0xB4, 0x57, 0xE1, 0xCB, 0x32, 0x65, 0x0E, 0x11, 0xDF, 0xD9, 0x14, 0x61, + 0xC8, 0xDA, 0xE5, 0x4F, 0x37, 0x74, 0xF1, 0xC7, 0x32, 0xE0, 0x18, 0xF7, 0x31, 0x0D, 0xFA, 0xC7, 0x9D, 0x86, 0xC6, 0xB2, 0x62, 0xBE, 0xA9, 0xDC, 0xFF, 0x42, + 0x37, 0x38, 0xE9, 0x21, 0x81, 0x32, 0x07, 0x88, 0xD3, 0x1B, 0x12, 0x48, 0xED, 0xB7, 0xCE, 0xBE, 0xA3, 0x75, 0x89, 0xE8, 0x42, 0x1C, 0x1D, 0xA9, 0x21, 0x24, + 0xDE, 0x8E, 0xC7, 0xDA, 0xAB, 0x6C, 0x8F, 0x97, 0x0B, 0x42, 0x97, 0x0A, 0x02, 0xF7, 0x79, 0x6D, 0x96, 0xA7, 0xAE, 0xE0, 0x49, 0x57, 0xE3, 0xA9, 0x5B, 0x83, + 0xA7, 0xEE, 0x8E, 0x78, 0xEA, 0x09, 0x9E, 0xBA, 0x6A, 0x3C, 0xF5, 0x6A, 0xF0, 0xD4, 0xDB, 0x11, 0x4F, 0x7D, 0xC1, 0x53, 0x4F, 0x8D, 0xA7, 0x7E, 0x0D, 0x9E, + 0xFA, 0x3B, 0xE2, 0x69, 0x20, 0x78, 0xEA, 0xAB, 0xF1, 0x34, 0xA8, 0xC1, 0xD3, 0x60, 0x47, 0x3C, 0x0D, 0x05, 0x4F, 0x03, 0x35, 0x9E, 0x86, 0x35, 0x78, 0x1A, + 0xEE, 0x88, 0xA7, 0x23, 0xC1, 0xD3, 0x50, 0x8D, 0xA7, 0xA3, 0x1A, 0x3C, 0x1D, 0xED, 0x88, 0xA7, 0x63, 0xC1, 0xD3, 0x91, 0x1A, 0x4F, 0xC7, 0x35, 0x78, 0x3A, + 0xDE, 0x11, 0x4F, 0x27, 0x82, 0xA7, 0x63, 0x35, 0x9E, 0x4E, 0x6A, 0xF0, 0x74, 0xB2, 0x23, 0x9E, 0x70, 0x51, 0x8E, 0x31, 0x75, 0xA2, 0x38, 0xE8, 0x76, 0x6A, + 0x70, 0x65, 0xEC, 0x8A, 0xAB, 0x30, 0x95, 0xD0, 0x55, 0x73, 0x89, 0x3A, 0xC9, 0xC4, 0x78, 0x57, 0x6C, 0x45, 0xD9, 0x84, 0x62, 0x3A, 0xA1, 0xD7, 0xC9, 0x27, + 0x26, 0xBB, 0x62, 0x2B, 0x4C, 0x28, 0x74, 0xC5, 0x8C, 0x42, 0xAF, 0x93, 0x52, 0x98, 0xBB, 0x62, 0x2B, 0xCC, 0x29, 0x74, 0xC5, 0xA4, 0x42, 0xAF, 0x93, 0x55, + 0x90, 0x5D, 0xB1, 0x15, 0xA6, 0x15, 0xBA, 0x62, 0x5E, 0xA1, 0xD7, 0x49, 0x2C, 0xA6, 0xBB, 0x62, 0x2B, 0xCC, 0x2C, 0x74, 0xC5, 0xD4, 0x42, 0xAF, 0x91, 0x5B, + 0x9C, 0xC8, 0x27, 0x62, 0x1B, 0x65, 0x8B, 0x04, 0x7C, 0x8A, 0x1C, 0x4D, 0xDA, 0x94, 0x1E, 0x3D, 0xE1, 0x40, 0xF8, 0x6C, 0x14, 0x13, 0xC8, 0x85, 0xEB, 0x4C, + 0xAD, 0x59, 0x58, 0x64, 0x78, 0x34, 0x4F, 0x49, 0xF8, 0xB1, 0xD7, 0x74, 0x2A, 0x17, 0x1A, 0xAE, 0xDE, 0x5C, 0x96, 0x2B, 0x33, 0xC4, 0x7B, 0xF9, 0x03, 0x15, + 0x19, 0x80, 0xEC, 0x6E, 0xFC, 0x9D, 0xE1, 0x4A, 0x75, 0x05, 0x0A, 0x54, 0xA6, 0xA2, 0x30, 0x88, 0x57, 0x14, 0x86, 0xCA, 0x15, 0x05, 0x46, 0xDC, 0x76, 0x6A, + 0x09, 0x80, 0xBB, 0xC7, 0x5E, 0x74, 0xAE, 0xCE, 0x74, 0xAF, 0x3A, 0xD3, 0x83, 0x32, 0x4C, 0xF7, 0xAA, 0x30, 0x5D, 0xE1, 0xE9, 0x46, 0x45, 0x39, 0x01, 0xBD, + 0xDF, 0x5A, 0xB7, 0xC4, 0xD4, 0x7E, 0x55, 0x17, 0x95, 0x5E, 0x5D, 0x54, 0x47, 0x65, 0x44, 0xA5, 0x6F, 0xD1, 0x3E, 0x06, 0x82, 0xEF, 0x9F, 0xD4, 0xF9, 0x1E, + 0x54, 0xE7, 0xBB, 0x57, 0x86, 0xEF, 0xC1, 0x16, 0xF9, 0xEE, 0x0B, 0xBE, 0x3F, 0xA9, 0xF3, 0xDD, 0xAF, 0xCE, 0x77, 0xBF, 0x0C, 0xDF, 0xFD, 0x2D, 0xF2, 0xDD, + 0x85, 0x60, 0xF3, 0xD3, 0x27, 0xED, 0xC7, 0xB9, 0x47, 0xFC, 0x79, 0x71, 0x25, 0x8E, 0x41, 0x54, 0x1D, 0xDB, 0x07, 0x3B, 0x98, 0xBB, 0x21, 0x85, 0xBD, 0x38, + 0x4F, 0x85, 0x79, 0x33, 0x83, 0x50, 0xF9, 0x92, 0x88, 0x9C, 0x27, 0xF9, 0xCC, 0x4D, 0x57, 0x65, 0x6A, 0x7B, 0x31, 0xEC, 0xB8, 0x31, 0x7A, 0xB7, 0x2A, 0x31, + 0xBE, 0x1D, 0x57, 0xB7, 0x67, 0xF5, 0x8A, 0x39, 0xA3, 0x6B, 0x6B, 0xF6, 0x7C, 0x42, 0x79, 0x86, 0xBC, 0xCC, 0x57, 0x50, 0x7B, 0xF5, 0x2A, 0xC4, 0x60, 0x07, + 0x55, 0x72, 0x8C, 0xF4, 0x47, 0x8C, 0x9D, 0x9F, 0x90, 0x21, 0x0D, 0x32, 0x96, 0x12, 0x83, 0xD1, 0x51, 0x49, 0x6D, 0x1E, 0x57, 0x8C, 0x4E, 0x48, 0xE3, 0xD6, + 0xD4, 0x89, 0x53, 0x0F, 0x14, 0xC0, 0xA7, 0x0A, 0x02, 0x18, 0x56, 0x17, 0x40, 0xA9, 0xCC, 0x05, 0x69, 0xDC, 0x9E, 0x00, 0x3A, 0x4C, 0x00, 0x57, 0xD1, 0xAB, + 0x6A, 0x73, 0x0C, 0xBA, 0x46, 0x05, 0x6A, 0xB0, 0x83, 0x35, 0x12, 0x8C, 0xB4, 0xBA, 0xB0, 0x68, 0xE0, 0xA8, 0x9C, 0x42, 0xBB, 0x65, 0xF3, 0x2B, 0x79, 0xF1, + 0x53, 0x21, 0xFF, 0xDE, 0x66, 0x82, 0xD5, 0xED, 0x08, 0x8B, 0x2E, 0x2F, 0x80, 0x4E, 0x75, 0x01, 0xE8, 0xA5, 0x04, 0xD0, 0x79, 0x5C, 0xC9, 0xF8, 0x70, 0xFD, + 0xEB, 0xA2, 0xC5, 0xD2, 0x2A, 0xEB, 0xFE, 0xB1, 0xD1, 0xAC, 0x5B, 0x46, 0x58, 0x5B, 0xF5, 0xFE, 0x5E, 0xC4, 0xB9, 0xF6, 0xAB, 0x96, 0xDC, 0xFA, 0x9A, 0x17, + 0x07, 0xAA, 0x17, 0x01, 0x07, 0x3B, 0x58, 0xAF, 0x42, 0x0A, 0x4F, 0x24, 0x9C, 0x95, 0x0C, 0xF0, 0x27, 0xD5, 0xDD, 0xA1, 0x94, 0x86, 0x91, 0xD6, 0xED, 0xA9, + 0x78, 0x90, 0x10, 0x04, 0xFB, 0xB2, 0xB1, 0x8A, 0x8A, 0xAB, 0x57, 0x0E, 0x07, 0x3B, 0x58, 0xEA, 0x42, 0x0A, 0x8F, 0x25, 0x9C, 0x95, 0x54, 0x71, 0xD9, 0x94, + 0xF4, 0xB8, 0xE2, 0xD4, 0x52, 0xDF, 0x66, 0x4E, 0x8A, 0xD5, 0xEE, 0x98, 0x20, 0xE2, 0xAF, 0x9D, 0xCF, 0x53, 0x70, 0xF5, 0x8A, 0xF7, 0xA0, 0xE6, 0xFA, 0xEC, + 0xF6, 0x22, 0xF9, 0x91, 0xEC, 0x9B, 0xC4, 0xC5, 0x76, 0x50, 0x36, 0x97, 0xED, 0x54, 0x1C, 0xF8, 0xB6, 0x9A, 0xCA, 0x42, 0xEF, 0x90, 0xF5, 0xAC, 0x73, 0x9F, + 0x63, 0x02, 0xD5, 0x57, 0xDE, 0x06, 0x3B, 0xD8, 0x1E, 0x82, 0x14, 0x76, 0x1B, 0xA3, 0x4F, 0x25, 0x99, 0xAA, 0x53, 0x3F, 0xA8, 0xBC, 0x3F, 0x64, 0x77, 0xA5, + 0xF7, 0xC9, 0xE2, 0xB6, 0x7C, 0xE9, 0xFD, 0xE2, 0xC3, 0x2F, 0xE5, 0x4A, 0xEF, 0xF1, 0x5E, 0x76, 0x57, 0x7A, 0xAF, 0x66, 0x33, 0xA5, 0x36, 0xCA, 0x02, 0x63, + 0xF8, 0xFE, 0x88, 0x89, 0xE5, 0xD3, 0x2E, 0x41, 0x30, 0xDA, 0x47, 0x71, 0x1A, 0x8A, 0x28, 0xF6, 0xC4, 0x7E, 0xB2, 0x7D, 0x9E, 0xF5, 0xF4, 0x72, 0xC2, 0x82, + 0xDA, 0x46, 0xD8, 0xF5, 0xD7, 0xA1, 0xB4, 0x87, 0xFC, 0xCB, 0x3C, 0x35, 0x1E, 0xAD, 0xCF, 0x7A, 0x69, 0x40, 0xFB, 0xA8, 0x24, 0xEE, 0xAD, 0x3F, 0x72, 0x3F, + 0x4A, 0x29, 0x4A, 0xA7, 0xFA, 0xD1, 0xF1, 0x5C, 0xB9, 0x4E, 0x4E, 0xC1, 0xCA, 0x44, 0xF3, 0x5E, 0xBC, 0xD4, 0xA2, 0x1E, 0xCD, 0x19, 0x79, 0xDB, 0x89, 0xE6, + 0x88, 0x3B, 0xC1, 0x7B, 0x89, 0xAC, 0x86, 0xC1, 0x96, 0x13, 0x80, 0x7C, 0x13, 0x85, 0x82, 0x00, 0xB2, 0x24, 0xB0, 0x11, 0x11, 0x74, 0xA9, 0x04, 0xBA, 0x29, + 0xED, 0x67, 0x04, 0x7E, 0xDA, 0xBE, 0x6A, 0xDC, 0xEF, 0xED, 0xA0, 0x36, 0x81, 0xE2, 0x4A, 0x70, 0x54, 0x52, 0xA7, 0xE5, 0x16, 0x07, 0x13, 0x3A, 0x2D, 0x67, + 0xD4, 0x5B, 0x5B, 0x1D, 0x04, 0xE4, 0x3D, 0x2A, 0x80, 0x9E, 0xB2, 0x4A, 0xAB, 0x4F, 0x33, 0x7B, 0x3B, 0xC8, 0x4F, 0x50, 0x5A, 0x09, 0x8E, 0x4A, 0xAA, 0xB4, + 0xDC, 0xD2, 0x67, 0x42, 0xA5, 0xEA, 0xF3, 0x4B, 0x4E, 0xE4, 0xD6, 0x54, 0xDA, 0xA7, 0x02, 0xE8, 0x2B, 0xAB, 0xB4, 0xFA, 0xAC, 0xA3, 0xB7, 0x83, 0xDD, 0xBB, + 0x28, 0xAD, 0x04, 0x47, 0x25, 0x55, 0x5A, 0x6E, 0xC9, 0x2E, 0xA1, 0x52, 0xF5, 0xF9, 0x24, 0x27, 0x72, 0x6B, 0x2A, 0x1D, 0x50, 0x01, 0x0C, 0x94, 0x55, 0x5A, + 0xBD, 0x52, 0xD0, 0xDB, 0x41, 0x31, 0x08, 0xA5, 0x95, 0xE0, 0xA8, 0xA4, 0x4A, 0xCB, 0xAD, 0x3E, 0x27, 0x54, 0xAA, 0xBE, 0xCE, 0xC1, 0x89, 0xDC, 0x9A, 0x4A, + 0x87, 0x54, 0x00, 0x43, 0x65, 0x95, 0x56, 0xDF, 0x5F, 0xD5, 0xDB, 0xC1, 0xDE, 0x6D, 0x94, 0x56, 0x82, 0xA3, 0x92, 0x2A, 0x2D, 0x57, 0xBA, 0x4D, 0xA8, 0x54, + 0x7D, 0xE5, 0x86, 0x13, 0xB9, 0x35, 0x95, 0x1E, 0x51, 0x01, 0x1C, 0x29, 0xAB, 0xB4, 0xFA, 0xD6, 0xF5, 0xDE, 0x0E, 0xEA, 0x79, 0x28, 0xAD, 0x04, 0x47, 0x25, + 0x55, 0x5A, 0xAE, 0x82, 0x93, 0x50, 0xA9, 0xFA, 0xDE, 0x29, 0x4E, 0xE4, 0xD6, 0x54, 0x7A, 0x4C, 0x05, 0x70, 0xAC, 0xAC, 0xD2, 0xEA, 0x3B, 0xF7, 0x7B, 0x3B, + 0xD8, 0xB9, 0x8F, 0xD2, 0x4A, 0x70, 0x54, 0x52, 0xA5, 0xE5, 0x6A, 0xB3, 0x09, 0x95, 0xAA, 0x6F, 0x77, 0xE2, 0x44, 0x6E, 0x4D, 0xA5, 0x27, 0x54, 0x00, 0x27, + 0xCA, 0x2A, 0xAD, 0xBE, 0x65, 0xA0, 0xB7, 0x83, 0xCD, 0x2F, 0x28, 0xAD, 0x4E, 0x9C, 0xA3, 0x92, 0x2A, 0x2D, 0xB7, 0xC0, 0xD8, 0xCB, 0xD8, 0xFA, 0xA2, 0xA0, + 0xD2, 0xAC, 0x05, 0xC6, 0x47, 0x50, 0xBF, 0x33, 0x6E, 0xC6, 0x15, 0x3E, 0xFD, 0xF2, 0xEA, 0xE7, 0xD7, 0xD9, 0x85, 0xFD, 0xCC, 0x2A, 0x5E, 0xA2, 0xAF, 0xC7, + 0x5E, 0xC6, 0x8B, 0xCB, 0x0B, 0x09, 0xD7, 0xC3, 0x2F, 0x86, 0xAF, 0x31, 0x9F, 0x6F, 0x69, 0x0C, 0xB8, 0x84, 0xA5, 0xF5, 0xFA, 0x1D, 0x79, 0xD2, 0x52, 0x60, + 0x69, 0x9C, 0xCA, 0xED, 0x04, 0x0F, 0x44, 0x0E, 0x73, 0x71, 0xE4, 0xFD, 0x07, 0xA5, 0x35, 0x1D, 0x06, 0x90, 0x0C, 0x1F, 0xFD, 0xCE, 0x89, 0x62, 0xFC, 0x00, + 0x19, 0x64, 0x6D, 0x8C, 0xDF, 0x60, 0x00, 0x41, 0x1A, 0x7B, 0x8C, 0xA9, 0xB7, 0xCA, 0x4C, 0xA5, 0xAB, 0x00, 0xA5, 0x98, 0xCA, 0xAA, 0xEC, 0x6C, 0x98, 0xA9, + 0x3E, 0x63, 0x2A, 0xC7, 0x49, 0x53, 0x4C, 0xA5, 0xE7, 0xC1, 0xA5, 0x98, 0xCA, 0x9A, 0x08, 0x47, 0x4C, 0x3D, 0x86, 0x40, 0x47, 0x26, 0xF4, 0x53, 0xE2, 0xA5, + 0x43, 0xDD, 0xE5, 0xC5, 0xE1, 0xAB, 0xB7, 0x17, 0x1A, 0x5D, 0xD2, 0x74, 0xED, 0x92, 0x11, 0x2F, 0xD9, 0xE9, 0x1F, 0x2A, 0xE6, 0x51, 0xD2, 0x63, 0x51, 0x2F, + 0xFA, 0xDE, 0x7B, 0x51, 0xC0, 0xE3, 0x90, 0x65, 0x42, 0xDE, 0xA0, 0xD3, 0xAB, 0x52, 0x21, 0x0C, 0x89, 0xDC, 0x52, 0xD0, 0xA3, 0xE8, 0xBB, 0x91, 0x0C, 0x2E, + 0xCB, 0xC9, 0xA0, 0x54, 0x95, 0x34, 0x29, 0x83, 0x12, 0x61, 0x5F, 0x10, 0xB9, 0x4D, 0x19, 0x60, 0x94, 0xBC, 0xBC, 0xD0, 0x3E, 0xFE, 0x4D, 0xBB, 0xBC, 0x5D, + 0xBA, 0xFE, 0xCA, 0x23, 0x85, 0x51, 0x85, 0xC3, 0xA5, 0x3E, 0xF8, 0x3E, 0x18, 0xF4, 0x54, 0x03, 0xCB, 0x20, 0x7B, 0x08, 0x98, 0x76, 0x36, 0x18, 0x2F, 0x29, + 0xA1, 0xFD, 0x90, 0xC1, 0x1F, 0x08, 0x68, 0x5A, 0x29, 0x6E, 0x72, 0xC0, 0x24, 0x87, 0x7A, 0x07, 0xB7, 0x57, 0x2B, 0x32, 0x28, 0xCF, 0x28, 0x7B, 0x1B, 0x1D, + 0x0E, 0x28, 0x95, 0x83, 0x90, 0xBD, 0x4F, 0x3F, 0x5E, 0xA9, 0x31, 0x96, 0xAE, 0xA3, 0x95, 0x53, 0x5D, 0xD6, 0x23, 0xA3, 0x1B, 0x1A, 0x14, 0xA4, 0x37, 0xCE, + 0x0E, 0x21, 0xF4, 0xAE, 0xC3, 0x64, 0x48, 0xF2, 0x6C, 0x6A, 0xCD, 0xC0, 0x8E, 0xE5, 0x7D, 0x50, 0xD1, 0xB2, 0x97, 0x9D, 0xE2, 0x47, 0x23, 0x5B, 0x13, 0x88, + 0xFE, 0x60, 0x12, 0xE8, 0x74, 0x42, 0xE0, 0x0B, 0x63, 0x46, 0xA2, 0xEB, 0x1A, 0x8B, 0xED, 0x79, 0x31, 0xDB, 0x60, 0x08, 0x8D, 0x6B, 0xC2, 0xBF, 0x70, 0xA9, + 0xCD, 0x3D, 0x32, 0x3D, 0x6F, 0x7C, 0x13, 0xE2, 0xE4, 0x4F, 0xE5, 0x61, 0x93, 0x86, 0x66, 0xBA, 0x37, 0x8E, 0xED, 0x1A, 0x38, 0x1E, 0x18, 0xCB, 0x00, 0x28, + 0x6D, 0xFF, 0xBE, 0xC4, 0x17, 0x5F, 0x19, 0xF8, 0x10, 0x97, 0x91, 0xD3, 0x4F, 0xCC, 0x2A, 0x26, 0xB6, 0xEB, 0x8B, 0xD9, 0x1C, 0x1E, 0x86, 0x5F, 0xC4, 0xFC, + 0x9F, 0xFF, 0x2E, 0xDA, 0x41, 0x60, 0x2D, 0x66, 0x31, 0x01, 0x34, 0x34, 0xDF, 0x9B, 0x9C, 0x37, 0x80, 0x52, 0xCF, 0xF5, 0x7D, 0xD7, 0xB3, 0x66, 0x56, 0x86, + 0x76, 0xB2, 0xA4, 0x7D, 0x28, 0x13, 0x77, 0xAA, 0xB1, 0x44, 0xF1, 0x67, 0xFE, 0xC4, 0xB3, 0x96, 0xC1, 0xE8, 0x89, 0xE9, 0x4E, 0x56, 0x0B, 0xE2, 0x04, 0x6D, + 0xC3, 0x34, 0x2F, 0xAF, 0xE1, 0xE0, 0x3D, 0x7E, 0xAC, 0x0D, 0x24, 0xDF, 0xDC, 0x7B, 0xF3, 0xF7, 0x0F, 0x38, 0x3A, 0xE3, 0x35, 0x90, 0x17, 0x31, 0xF7, 0x0E, + 0xB4, 0xE9, 0xCA, 0x61, 0x03, 0x64, 0x93, 0x60, 0xDB, 0x7D, 0xED, 0x2B, 0x60, 0xBC, 0x36, 0x3C, 0x6D, 0x6C, 0xF8, 0xE4, 0x9D, 0xEB, 0x07, 0xDA, 0xB9, 0x16, + 0x62, 0xB4, 0xDD, 0x09, 0xDD, 0xCE, 0xD1, 0x66, 0x7C, 0xF1, 0x96, 0x8C, 0xF1, 0x9F, 0x3C, 0x1B, 0x9A, 0x86, 0x50, 0xCF, 0xB5, 0xBD, 0xD3, 0x63, 0x7D, 0x0F, + 0x6D, 0x37, 0xEC, 0x62, 0x4A, 0x20, 0xFA, 0x43, 0xBB, 0xE6, 0xCA, 0xB3, 0x0F, 0xB4, 0xC9, 0x78, 0xFF, 0x2B, 0xA5, 0x9E, 0x5E, 0xC6, 0x6B, 0xFB, 0x9C, 0x99, + 0x76, 0x30, 0x27, 0x4E, 0x33, 0xA2, 0xCC, 0x23, 0xFE, 0xD2, 0x75, 0x7C, 0xC2, 0x88, 0x63, 0x3F, 0x6B, 0x1A, 0x5D, 0x6F, 0xFB, 0x81, 0x11, 0xAC, 0x7C, 0xED, + 0xE9, 0xF9, 0xB9, 0xD6, 0xED, 0x74, 0xE2, 0xCD, 0x34, 0xE8, 0x26, 0xDD, 0xEE, 0x40, 0x4B, 0x5D, 0xF8, 0x91, 0xDC, 0x06, 0xFB, 0x2F, 0x42, 0x98, 0x7B, 0x8D, + 0xD8, 0x3E, 0x49, 0x20, 0x09, 0x01, 0xF0, 0x75, 0x72, 0xCD, 0xFD, 0x24, 0x81, 0x4D, 0xD3, 0x08, 0x8C, 0xFD, 0xAF, 0x09, 0x7D, 0x41, 0xAF, 0x40, 0xC9, 0x81, + 0x46, 0x6F, 0xBD, 0x88, 0xDD, 0xBA, 0xDF, 0x6F, 0x83, 0x0C, 0x81, 0xDF, 0x10, 0x9A, 0x78, 0x5E, 0x92, 0x62, 0x0A, 0xDD, 0xD2, 0x0F, 0x34, 0xBC, 0x93, 0x84, + 0x8D, 0x11, 0xF9, 0x44, 0x5C, 0x13, 0x42, 0xCB, 0x47, 0x2B, 0x41, 0xC9, 0xD0, 0xDD, 0x27, 0x54, 0x04, 0x71, 0xE8, 0x07, 0x32, 0x03, 0x89, 0xCD, 0x0E, 0x78, + 0x58, 0x3A, 0xA0, 0x31, 0xE9, 0x80, 0x85, 0xB3, 0x98, 0xD6, 0xC0, 0xA1, 0x7D, 0xD7, 0x26, 0x60, 0x13, 0xB3, 0xE6, 0x1E, 0xFF, 0x14, 0x28, 0xD8, 0xD3, 0x5E, + 0xE7, 0x76, 0xEF, 0x39, 0x80, 0xB7, 0x03, 0xF7, 0x2A, 0xF0, 0x2C, 0x67, 0xD6, 0xD4, 0x87, 0xFB, 0x11, 0x2E, 0x7A, 0x1B, 0x11, 0xA6, 0xEE, 0xD3, 0xEB, 0xB4, + 0x8B, 0xF4, 0x8D, 0x26, 0xBF, 0xFE, 0x7C, 0x6F, 0x7F, 0x8F, 0x93, 0x4E, 0xCF, 0xC1, 0xD8, 0x9A, 0xEC, 0xE0, 0x19, 0xA5, 0x70, 0x5F, 0x3B, 0x3B, 0xE3, 0xDD, + 0xB0, 0x56, 0x78, 0x11, 0x1A, 0xD1, 0x3F, 0xA9, 0x5B, 0xA1, 0x21, 0xFE, 0xF6, 0x97, 0xAF, 0xC2, 0x62, 0xEF, 0x0F, 0x81, 0xEA, 0x97, 0x18, 0x97, 0xFF, 0xF2, + 0x15, 0xFE, 0xBF, 0x7F, 0x46, 0x43, 0xF1, 0x5F, 0xBE, 0xE2, 0x9F, 0xFB, 0x67, 0xD0, 0x13, 0x1C, 0xD3, 0xFE, 0xEE, 0x7F, 0xA3, 0x52, 0x58, 0x97, 0xDD, 0x2C, + 0x53, 0x76, 0xA1, 0xD0, 0x4A, 0xD3, 0x34, 0xCB, 0x21, 0xEA, 0xB7, 0xC8, 0x7B, 0x9B, 0x13, 0xD7, 0x04, 0xE5, 0x04, 0x60, 0xC7, 0x42, 0xE5, 0x36, 0xA8, 0x44, + 0x08, 0xAA, 0x23, 0x54, 0x6E, 0x4D, 0x69, 0x4B, 0x8D, 0x3B, 0x4A, 0x64, 0x1E, 0xA2, 0xE5, 0xD2, 0xF0, 0x7C, 0xF2, 0x9D, 0x13, 0x34, 0x83, 0x84, 0x4B, 0x64, + 0x48, 0x7C, 0x34, 0x4A, 0xB0, 0x80, 0x3F, 0x80, 0x83, 0x76, 0x7B, 0x5C, 0x69, 0xA1, 0xA9, 0x3D, 0x09, 0xAD, 0x30, 0xA2, 0x94, 0xDD, 0xCC, 0xB0, 0xC2, 0x5F, + 0x26, 0xF6, 0x97, 0xE6, 0x2D, 0xFC, 0x97, 0x0E, 0x14, 0x6B, 0x22, 0xC2, 0x46, 0x2F, 0xF1, 0x3F, 0x90, 0x0B, 0xFE, 0xC9, 0xD4, 0x0F, 0x60, 0xFD, 0x68, 0xDB, + 0x4D, 0xF6, 0xD9, 0x2F, 0x50, 0xCD, 0x0A, 0x82, 0x90, 0x7F, 0x87, 0xE1, 0xC0, 0x75, 0x83, 0xCF, 0x07, 0xDA, 0xD2, 0x03, 0xC2, 0xE8, 0x97, 0x3E, 0xE0, 0x18, + 0x10, 0x11, 0x87, 0xFD, 0x2D, 0xA4, 0x60, 0x69, 0xDB, 0x2F, 0x19, 0x56, 0x20, 0x81, 0x1D, 0x80, 0xA6, 0x56, 0x68, 0x31, 0xF0, 0xFF, 0xFD, 0x33, 0xE8, 0x04, + 0x0E, 0xE1, 0xFF, 0xFB, 0x67, 0xD8, 0x15, 0xEA, 0x12, 0x7B, 0xBC, 0x7F, 0x06, 0x3D, 0xC2, 0x09, 0xFC, 0x0F, 0x6D, 0xB0, 0x5F, 0x6C, 0x85, 0x7F, 0xE1, 0x0E, + 0xED, 0x1F, 0x6F, 0xD2, 0x03, 0x76, 0x81, 0x9F, 0xE6, 0x31, 0xC8, 0xDE, 0x74, 0xDF, 0xA4, 0x6F, 0x1E, 0xFF, 0x7C, 0x0B, 0xEC, 0xD0, 0x83, 0x3B, 0x70, 0x7C, + 0xC7, 0xC4, 0x73, 0xFC, 0x73, 0x27, 0xCC, 0x13, 0x2F, 0xF0, 0x23, 0xB8, 0x46, 0xDF, 0xCE, 0x8A, 0x97, 0xD8, 0x01, 0xB6, 0xA2, 0xEF, 0xD2, 0xA4, 0xAD, 0xD8, + 0x11, 0x5C, 0xE3, 0x6F, 0x60, 0x3C, 0xD0, 0xF8, 0x3B, 0xFE, 0x0A, 0x85, 0x13, 0xBD, 0x83, 0xEF, 0xA5, 0x7F, 0x8B, 0x0C, 0x32, 0xD2, 0x50, 0x2A, 0xE1, 0xD9, + 0xDD, 0xFD, 0x33, 0x82, 0xF7, 0x28, 0x91, 0x70, 0x7C, 0xC7, 0x8F, 0xE1, 0x3A, 0xD0, 0x87, 0x77, 0x04, 0xC1, 0xF4, 0xC2, 0x5D, 0x74, 0x01, 0x5A, 0x04, 0x78, + 0x9F, 0x13, 0x0F, 0x67, 0x77, 0xE1, 0x19, 0x42, 0x53, 0x58, 0xCE, 0x06, 0x9C, 0xDE, 0x45, 0xA7, 0x70, 0x17, 0x79, 0x41, 0x05, 0x70, 0x9E, 0xEE, 0x9F, 0x71, + 0x9E, 0x50, 0x8B, 0xEC, 0x28, 0x2D, 0x6A, 0x0C, 0x7A, 0x01, 0x0F, 0x92, 0xAF, 0x59, 0x0E, 0x12, 0x1B, 0x1E, 0x21, 0x00, 0x5C, 0xDA, 0x04, 0x0F, 0x5F, 0xDF, + 0x7D, 0x67, 0x36, 0xF7, 0xF8, 0xA7, 0x5B, 0xF7, 0x30, 0x44, 0xC7, 0x61, 0xDA, 0xAE, 0x33, 0xB1, 0xAD, 0x09, 0x46, 0x82, 0xE6, 0xBE, 0x76, 0x3E, 0xE2, 0x61, + 0x1A, 0x3D, 0x16, 0x9A, 0xC7, 0xBD, 0x30, 0x13, 0xB5, 0xC7, 0x3F, 0x3E, 0xBA, 0xB7, 0xDF, 0xA6, 0x8E, 0xC6, 0x9D, 0x09, 0x51, 0xF0, 0x18, 0xA3, 0x86, 0x03, + 0x1B, 0x4B, 0x70, 0xAC, 0x85, 0x83, 0x5C, 0x24, 0xB4, 0x75, 0x0C, 0x0B, 0x45, 0x13, 0x1F, 0x49, 0x3A, 0xA9, 0x41, 0x24, 0x27, 0x6C, 0x89, 0x08, 0xF5, 0x34, + 0x1D, 0xA1, 0x40, 0x55, 0x5E, 0xD0, 0xDC, 0xBB, 0xF4, 0x3C, 0xD7, 0xFB, 0xE7, 0xDE, 0x73, 0x6C, 0xF4, 0x7C, 0xEF, 0x5F, 0xA7, 0xDA, 0xDE, 0xF3, 0x78, 0xA8, + 0xBA, 0x4F, 0xC7, 0x14, 0xA6, 0xB1, 0x99, 0xA2, 0xC6, 0x66, 0x31, 0x8D, 0xCD, 0x36, 0xAB, 0xB1, 0xF8, 0x27, 0x63, 0xEB, 0x68, 0x2D, 0xFE, 0x89, 0xD6, 0x1C, + 0xCD, 0x15, 0xC2, 0x73, 0xA5, 0x71, 0x6D, 0xCD, 0x64, 0xDA, 0xAA, 0xA2, 0x26, 0x36, 0x86, 0x83, 0xF7, 0x10, 0xEF, 0xDD, 0x8F, 0x1F, 0xDE, 0xE3, 0x58, 0x20, + 0x57, 0x59, 0xA8, 0xB1, 0x74, 0xB6, 0x25, 0xC1, 0x80, 0xC9, 0x41, 0x62, 0x64, 0x4A, 0x24, 0x09, 0xCF, 0xF7, 0xB4, 0x26, 0x45, 0x89, 0x29, 0x42, 0x81, 0x21, + 0xF0, 0x91, 0x45, 0xCD, 0x77, 0x71, 0x34, 0x11, 0xCE, 0x1B, 0x41, 0xE5, 0xD8, 0x02, 0x02, 0x28, 0x29, 0x91, 0x61, 0x5E, 0x73, 0x98, 0xD8, 0xA0, 0xB7, 0x73, + 0x17, 0xA1, 0xFE, 0xEA, 0xAB, 0x06, 0x35, 0x11, 0xD3, 0xA3, 0xD8, 0xE6, 0x17, 0x4A, 0x87, 0x47, 0x7E, 0x25, 0x01, 0xF1, 0x4F, 0x81, 0x48, 0x0C, 0x9C, 0x8F, + 0x18, 0x25, 0xB0, 0xDC, 0x49, 0xB0, 0xD0, 0x91, 0x46, 0x09, 0x07, 0xFD, 0x7C, 0x44, 0x06, 0x06, 0x35, 0x2A, 0xE8, 0xF7, 0x1A, 0x24, 0x18, 0xC4, 0x98, 0xA6, + 0x84, 0x44, 0x7C, 0x6B, 0x20, 0x1B, 0x8F, 0x1A, 0x31, 0xE2, 0x0D, 0xFF, 0x12, 0x3C, 0x7C, 0x0C, 0x55, 0x42, 0xC3, 0xDF, 0x4E, 0x9F, 0x89, 0x45, 0x8D, 0x18, + 0xFE, 0x42, 0x78, 0x19, 0x4F, 0x7C, 0xCC, 0x56, 0xE3, 0x89, 0xBF, 0xC7, 0x3C, 0x1B, 0x8F, 0xA2, 0x6C, 0xF8, 0xBB, 0xC3, 0x65, 0x56, 0xC7, 0x52, 0x84, 0x5C, + 0xC7, 0x60, 0x4D, 0x00, 0x98, 0x97, 0xA5, 0x5F, 0xEA, 0xA7, 0x9D, 0x08, 0x03, 0xCF, 0x28, 0xF2, 0x30, 0xF0, 0x26, 0x69, 0x0C, 0x22, 0x3A, 0x3C, 0x40, 0x6E, + 0xF7, 0x10, 0x51, 0x08, 0x72, 0x74, 0xB5, 0x28, 0x04, 0x69, 0xB7, 0x08, 0x3F, 0x21, 0x4C, 0x46, 0xF8, 0xA1, 0x05, 0x0D, 0xF6, 0x05, 0xE3, 0x3C, 0xF9, 0x87, + 0x1F, 0x04, 0x96, 0x29, 0x11, 0x71, 0x40, 0x3A, 0xAF, 0x64, 0x49, 0xFC, 0xDB, 0xB7, 0x29, 0x43, 0xA2, 0xC5, 0x92, 0x3B, 0x5F, 0x2D, 0x74, 0xDD, 0xF9, 0x19, + 0x18, 0xE8, 0xDC, 0x41, 0x2D, 0x37, 0xE3, 0x1F, 0x8B, 0x95, 0x20, 0x81, 0x39, 0x87, 0x12, 0x0A, 0xFE, 0xC5, 0x4C, 0x19, 0x23, 0xF4, 0x83, 0x8A, 0x4A, 0xAC, + 0x88, 0x8F, 0x27, 0xCA, 0xE8, 0xA0, 0xD3, 0x9B, 0x3C, 0xA5, 0xF0, 0x4F, 0xD4, 0x65, 0x69, 0x64, 0xA9, 0x3A, 0xE4, 0x8A, 0xCF, 0xB1, 0x49, 0x86, 0xDD, 0x8A, + 0xB3, 0xC2, 0x87, 0x19, 0xA2, 0x67, 0x9F, 0xC4, 0x5C, 0x9C, 0xD8, 0xD2, 0x54, 0x94, 0xD8, 0x6D, 0x23, 0x80, 0xE4, 0x68, 0xBC, 0x0A, 0x88, 0xDF, 0xC6, 0xFA, + 0x41, 0x28, 0x9C, 0xB5, 0x5B, 0x6D, 0x07, 0x08, 0xA0, 0x08, 0xF7, 0xE3, 0xB1, 0x8A, 0x05, 0x8E, 0x35, 0x5C, 0xEC, 0x72, 0x16, 0x3A, 0x76, 0x37, 0x03, 0x23, + 0x4F, 0x6F, 0x93, 0x10, 0x78, 0x31, 0x0B, 0x1B, 0xAD, 0x11, 0xC5, 0x70, 0x75, 0x07, 0x83, 0xF5, 0x24, 0x97, 0x77, 0xC0, 0x96, 0x95, 0x50, 0x20, 0x6D, 0x2C, + 0xD1, 0x47, 0x65, 0xAF, 0x09, 0xCC, 0x42, 0xB5, 0x3D, 0xB1, 0xA6, 0xB4, 0x77, 0xBA, 0x56, 0xCF, 0x00, 0x08, 0x6E, 0x55, 0xDA, 0x4B, 0x46, 0xE3, 0x69, 0x54, + 0x2C, 0xD1, 0xB4, 0xB1, 0x47, 0x8C, 0x2F, 0x2F, 0x12, 0xC8, 0x68, 0xF5, 0x3F, 0xC4, 0xC4, 0xAE, 0x61, 0x51, 0x30, 0x75, 0x89, 0x3D, 0x71, 0xD3, 0x72, 0x1D, + 0x22, 0xEF, 0x35, 0x51, 0x1D, 0xE1, 0x1D, 0xF1, 0x33, 0x93, 0x4C, 0x8D, 0x95, 0x1D, 0x44, 0x60, 0x1E, 0x09, 0x56, 0x9E, 0xC3, 0xAB, 0x25, 0xEB, 0x93, 0x2B, + 0x69, 0x99, 0x6E, 0x87, 0xB6, 0x79, 0x78, 0xA8, 0xBD, 0x0A, 0x02, 0x03, 0x14, 0x80, 0xCB, 0xAC, 0x73, 0x94, 0x8F, 0x66, 0xF0, 0x82, 0xAF, 0xEB, 0xA1, 0x51, + 0x62, 0xFD, 0xD9, 0x03, 0xAE, 0xA9, 0x37, 0xFA, 0x00, 0x22, 0x9C, 0x94, 0xA2, 0x6A, 0xFF, 0x7B, 0x45, 0xBC, 0xBB, 0x2B, 0x2A, 0x30, 0xD7, 0x7B, 0x05, 0xBE, + 0xB8, 0xD7, 0x8E, 0x96, 0x4A, 0xF6, 0x58, 0x7D, 0xB3, 0x0D, 0xA8, 0x2E, 0xA1, 0x0F, 0xD0, 0x71, 0x64, 0xF3, 0x8C, 0x9B, 0x50, 0xEF, 0xDA, 0xF9, 0xF9, 0x39, + 0x57, 0x46, 0xBA, 0xA0, 0x0A, 0x2D, 0x5C, 0xE7, 0x0B, 0xB9, 0x5B, 0x2D, 0x41, 0xFC, 0x51, 0x89, 0x34, 0x55, 0xB4, 0xE5, 0xD2, 0x21, 0x6D, 0x68, 0x79, 0xC1, + 0xCB, 0x64, 0x7A, 0x4F, 0xD2, 0x28, 0x52, 0x01, 0xB5, 0x4E, 0xF4, 0xC4, 0x17, 0x6B, 0x8D, 0xEE, 0x9F, 0xC8, 0xCF, 0x24, 0xE5, 0x65, 0x4E, 0x20, 0x17, 0x9E, + 0x18, 0xBA, 0x52, 0x3D, 0x3C, 0x49, 0xA2, 0xBA, 0xDF, 0x7F, 0x12, 0x45, 0x86, 0xD5, 0xD2, 0x34, 0x02, 0x92, 0x0C, 0x0E, 0xA1, 0x2D, 0x88, 0x9B, 0x0B, 0x37, + 0x20, 0xA9, 0x88, 0x61, 0x39, 0x56, 0x60, 0x19, 0xF6, 0xA7, 0xC8, 0x1A, 0xB7, 0xEA, 0xFE, 0x12, 0x1F, 0x2F, 0xE1, 0xFF, 0x6B, 0x15, 0x5E, 0xB5, 0xAA, 0xE4, + 0x9A, 0x85, 0x84, 0xF1, 0x20, 0xB2, 0x92, 0xB8, 0x1C, 0x12, 0x61, 0x81, 0xDF, 0x17, 0x3D, 0x3D, 0x7D, 0x4A, 0x8F, 0x9E, 0x84, 0x4A, 0x13, 0xD1, 0xE3, 0x5C, + 0x8B, 0x6E, 0xA4, 0x14, 0xBC, 0x8E, 0x3B, 0x85, 0x43, 0x20, 0x8F, 0x61, 0x60, 0xBE, 0x15, 0xAA, 0x77, 0x09, 0x53, 0x5D, 0xB4, 0x85, 0xFF, 0x8F, 0xFA, 0x8F, + 0x28, 0xEA, 0x6F, 0x2F, 0xC4, 0xE7, 0xD8, 0x76, 0xCA, 0x03, 0x18, 0x9C, 0x7C, 0xD1, 0xE5, 0xF9, 0xDE, 0x81, 0x26, 0x5F, 0x55, 0x49, 0xA5, 0x15, 0x73, 0xCB, + 0x64, 0x24, 0x47, 0x76, 0x85, 0x12, 0xC2, 0x85, 0x51, 0x5C, 0x3A, 0xC4, 0x75, 0xC4, 0xE6, 0x1E, 0x5B, 0xB5, 0xA5, 0xD1, 0xF8, 0x3E, 0x4A, 0x48, 0xE6, 0xEE, + 0x4D, 0x1E, 0xA4, 0x07, 0x31, 0xE7, 0x9A, 0xA4, 0x80, 0x43, 0x68, 0xD3, 0xF2, 0x8D, 0xB1, 0x5D, 0xDC, 0x35, 0x6F, 0x67, 0xF2, 0xA1, 0x00, 0x1A, 0x88, 0x2B, + 0x00, 0x1A, 0x78, 0xD4, 0x67, 0x62, 0x68, 0x89, 0x53, 0x84, 0x55, 0x90, 0x95, 0x8B, 0x78, 0x6A, 0x80, 0x13, 0x27, 0x31, 0xB3, 0x40, 0x5A, 0x22, 0xC4, 0xC6, + 0x2F, 0x03, 0x44, 0xF2, 0xF4, 0x5C, 0x73, 0x56, 0xB6, 0x0D, 0x16, 0x88, 0x2C, 0x80, 0x05, 0xC6, 0xEF, 0x4A, 0x03, 0xF4, 0x1F, 0x37, 0x9A, 0x85, 0x94, 0x27, + 0x24, 0xF0, 0xEC, 0x59, 0x12, 0x1B, 0x2E, 0xDF, 0xB2, 0xD4, 0x3C, 0xEC, 0x8D, 0xB5, 0x67, 0x6F, 0xD3, 0x8D, 0x46, 0x59, 0x4E, 0x12, 0x0C, 0xD5, 0x4F, 0x13, + 0x82, 0x8F, 0x65, 0x38, 0x40, 0x88, 0x65, 0x52, 0x01, 0xE1, 0x26, 0x8D, 0xC6, 0xDA, 0x4A, 0xD7, 0x4B, 0x6A, 0xF5, 0x4D, 0xC2, 0xF7, 0xE8, 0xEC, 0x83, 0xFC, + 0xD1, 0x98, 0xA3, 0x0B, 0x22, 0xDB, 0x09, 0xBB, 0x8A, 0x63, 0x9C, 0x25, 0x30, 0x22, 0x63, 0x29, 0xBA, 0xF1, 0x47, 0x3B, 0x80, 0xA6, 0xB8, 0x43, 0x26, 0x36, + 0x78, 0xAF, 0x8F, 0xFE, 0xB4, 0xE3, 0xF5, 0x86, 0xB9, 0x14, 0xDC, 0x8C, 0x3F, 0xCF, 0xA0, 0xB9, 0x8C, 0x31, 0x8A, 0xEE, 0x66, 0x8C, 0x2C, 0x51, 0x12, 0xE0, + 0x30, 0x13, 0x95, 0xD6, 0x00, 0x63, 0xFF, 0x6C, 0xE1, 0x96, 0x00, 0xDF, 0x0A, 0xEE, 0xD6, 0xD1, 0x8D, 0xB4, 0x96, 0x2E, 0x70, 0x42, 0xD3, 0xB7, 0xB8, 0x6D, + 0x26, 0xC4, 0x1C, 0x5E, 0x48, 0xA6, 0x86, 0xC2, 0x69, 0xC2, 0x75, 0xA9, 0xB8, 0x16, 0xD9, 0x00, 0x16, 0x8D, 0x5E, 0x91, 0x99, 0x6C, 0x28, 0x9E, 0xEB, 0x18, + 0xCC, 0xA5, 0x51, 0xB7, 0x66, 0x28, 0xCF, 0xC1, 0xC9, 0xB6, 0xA3, 0xA4, 0x91, 0xAE, 0xC6, 0x0B, 0x2B, 0x90, 0x20, 0xDC, 0xD3, 0xF7, 0xCA, 0x8C, 0x0A, 0x71, + 0x1F, 0x62, 0x71, 0x88, 0x26, 0xCC, 0x80, 0x28, 0xB1, 0xCE, 0x36, 0x61, 0xDB, 0x2E, 0x5F, 0xC2, 0xA4, 0x18, 0x57, 0xCF, 0x50, 0xC1, 0xA9, 0x65, 0x6B, 0x86, + 0x82, 0xED, 0xB6, 0xA0, 0x28, 0x92, 0xFB, 0x2D, 0xC4, 0x1E, 0x87, 0x64, 0x7E, 0x1D, 0x5F, 0xE6, 0xFF, 0xCD, 0x23, 0x00, 0xE7, 0x63, 0x8D, 0x4F, 0xFB, 0xCB, + 0x57, 0x8A, 0xE2, 0x5E, 0x9B, 0x82, 0x0F, 0xFB, 0x73, 0x62, 0xD2, 0x7A, 0x54, 0xB0, 0xF2, 0x4F, 0x35, 0x5C, 0xAA, 0x4E, 0xEC, 0xAF, 0xB8, 0xFF, 0x2D, 0xB4, + 0x90, 0x70, 0x08, 0x28, 0x9C, 0x02, 0xD0, 0x6D, 0x38, 0xF9, 0xD9, 0x3F, 0x4B, 0x9A, 0x25, 0xE5, 0x1E, 0xFC, 0x31, 0xFF, 0xB6, 0xDB, 0x90, 0x69, 0x40, 0x37, + 0xDF, 0x43, 0x4E, 0x91, 0x32, 0xD3, 0x7D, 0x3E, 0x79, 0x01, 0x0D, 0x98, 0x22, 0x10, 0x31, 0x1D, 0xE1, 0x14, 0x85, 0x89, 0x29, 0x21, 0x61, 0xC6, 0x0C, 0xE7, + 0xA5, 0x78, 0x8F, 0x0A, 0x1F, 0x9B, 0x43, 0x59, 0xFC, 0xEE, 0xC3, 0x94, 0x63, 0xFF, 0x49, 0x28, 0x86, 0x75, 0x1C, 0xD8, 0x41, 0x0C, 0x41, 0x42, 0x44, 0x59, + 0x62, 0xE2, 0x46, 0x93, 0x9C, 0x2D, 0xE5, 0xC8, 0x8C, 0xFD, 0x62, 0x23, 0x19, 0x1D, 0xC6, 0x68, 0xCF, 0xFF, 0xA4, 0x46, 0xF3, 0xAF, 0x03, 0x36, 0xF4, 0xC5, + 0x22, 0xD1, 0x7E, 0x19, 0x82, 0xD6, 0xA6, 0x6E, 0x85, 0xC4, 0x6C, 0x2C, 0x89, 0x15, 0x3F, 0x08, 0x70, 0x14, 0x1F, 0xA4, 0x8A, 0x6B, 0x93, 0xB7, 0x78, 0xA6, + 0x15, 0x32, 0x28, 0x91, 0x4D, 0x6C, 0xE6, 0x25, 0xC4, 0x23, 0xCD, 0xB2, 0x32, 0xC5, 0xC5, 0xEC, 0x8B, 0x39, 0xEC, 0xB5, 0x45, 0x6E, 0x72, 0xAB, 0x99, 0x74, + 0x07, 0x15, 0x95, 0x57, 0x04, 0x70, 0x11, 0xEE, 0x98, 0x2B, 0x84, 0x8C, 0x76, 0xD7, 0xC5, 0x70, 0xD0, 0xAD, 0x73, 0x6A, 0x4B, 0x9E, 0xB4, 0x69, 0x02, 0x14, + 0xB1, 0x16, 0xC3, 0x8A, 0xDD, 0xD4, 0x69, 0xF2, 0xA9, 0xEF, 0x16, 0x83, 0xC7, 0x77, 0xDA, 0xC5, 0x7B, 0x37, 0xAE, 0x15, 0x80, 0xA3, 0xED, 0x81, 0x31, 0x50, + 0x31, 0x22, 0xE5, 0x01, 0x42, 0x1B, 0xB6, 0xFD, 0x73, 0x2F, 0xA6, 0x21, 0x3F, 0x70, 0x97, 0x57, 0x94, 0x90, 0x54, 0x28, 0xB9, 0xA1, 0x45, 0xF7, 0x36, 0xDE, + 0x6F, 0xF2, 0xF4, 0x23, 0x2E, 0x9D, 0xE4, 0x3A, 0xE5, 0x15, 0x56, 0xE4, 0x35, 0x86, 0x67, 0x2F, 0x99, 0x3B, 0xD2, 0x62, 0xBD, 0xB4, 0x07, 0xD4, 0x75, 0xDB, + 0xF7, 0x26, 0x2C, 0xA0, 0x87, 0x9B, 0xE9, 0x30, 0xDE, 0xE0, 0xE1, 0x6F, 0xAC, 0x4F, 0x1C, 0x80, 0x13, 0x56, 0xB1, 0x5F, 0x48, 0x8B, 0xBB, 0x4C, 0x93, 0x12, + 0x95, 0x6A, 0x98, 0x87, 0xFA, 0x18, 0xC9, 0xD9, 0xE0, 0x85, 0x31, 0x2F, 0x66, 0x31, 0x19, 0x81, 0x35, 0x12, 0x13, 0x8F, 0x64, 0x49, 0xE2, 0x63, 0xA3, 0x11, + 0xDB, 0x89, 0xF9, 0xF2, 0xF3, 0x64, 0x0C, 0x03, 0xD0, 0x1B, 0x70, 0x1F, 0xF0, 0xD7, 0x9B, 0xE6, 0xFE, 0x7D, 0x1E, 0x3B, 0x4C, 0x5C, 0x91, 0xED, 0xA8, 0x12, + 0x41, 0x43, 0xBD, 0x1C, 0x5B, 0x42, 0x3E, 0x72, 0x74, 0x71, 0x93, 0xBF, 0x74, 0x44, 0xFA, 0x9F, 0x25, 0xD8, 0xF3, 0x75, 0xD1, 0xB2, 0x0C, 0x30, 0x81, 0x20, + 0x0A, 0xE2, 0x6B, 0xC4, 0xA6, 0x12, 0xC0, 0x98, 0x5D, 0x88, 0x06, 0x21, 0xED, 0xA1, 0x1F, 0xE4, 0xAC, 0x6A, 0x4C, 0x0C, 0xE7, 0xDA, 0x48, 0xAC, 0x6A, 0x4C, + 0x00, 0x57, 0x40, 0xB8, 0xC9, 0x37, 0x1B, 0xAC, 0x41, 0x83, 0xDB, 0x2E, 0x3B, 0x6B, 0xD3, 0xE7, 0x43, 0x30, 0x49, 0x47, 0xF5, 0xD1, 0x93, 0xC4, 0xED, 0x39, + 0xA1, 0xEF, 0xE4, 0xE3, 0xF7, 0xD9, 0x19, 0x6B, 0x10, 0xF6, 0x32, 0x76, 0xCD, 0xBB, 0xB6, 0xB1, 0x5C, 0x12, 0xC7, 0xBC, 0x98, 0x5B, 0xB6, 0xD9, 0x64, 0xA0, + 0xB1, 0xD2, 0x3E, 0xC6, 0x24, 0x42, 0x77, 0x83, 0x71, 0xAC, 0xE0, 0x88, 0x17, 0xEC, 0x5A, 0x73, 0xAF, 0x6B, 0x8A, 0xCD, 0x7C, 0xBC, 0x59, 0xDB, 0xF4, 0x8C, + 0x9B, 0xEF, 0x70, 0xAB, 0x30, 0xD5, 0xE4, 0x41, 0xE7, 0xA0, 0xC3, 0x1B, 0x04, 0x90, 0xEB, 0x08, 0x69, 0x21, 0x5E, 0xDC, 0x52, 0xF9, 0xD3, 0x0F, 0xEF, 0x23, + 0xBC, 0x81, 0xFB, 0x86, 0x5D, 0x6A, 0xEE, 0xD1, 0xBD, 0xC6, 0x87, 0xBF, 0x2F, 0x71, 0x0B, 0x87, 0x88, 0xF1, 0x31, 0x31, 0xE2, 0x36, 0x62, 0x14, 0x15, 0x6B, + 0xFE, 0x22, 0x8E, 0x14, 0x2E, 0x3B, 0x10, 0xA4, 0xD1, 0x52, 0x9B, 0x32, 0x50, 0xB1, 0xC9, 0x18, 0xC1, 0x91, 0x93, 0x6F, 0x61, 0xEE, 0xF6, 0x2B, 0x31, 0x3C, + 0xD0, 0xC7, 0x73, 0xAD, 0xD9, 0xE8, 0x34, 0x9E, 0x37, 0xE9, 0xF5, 0x0F, 0xC0, 0xCE, 0xBC, 0xB9, 0xFF, 0x5C, 0xDF, 0xDF, 0x6F, 0xFB, 0xA0, 0x33, 0xD2, 0x6C, + 0x75, 0x45, 0x13, 0xF8, 0x43, 0xDB, 0xB0, 0x4E, 0xB2, 0xEF, 0xBF, 0x73, 0x57, 0x9E, 0x9F, 0xD7, 0xE0, 0x83, 0xE5, 0xE0, 0x30, 0x98, 0xD7, 0xE4, 0x8A, 0x80, + 0x60, 0xCD, 0xB5, 0x26, 0x0D, 0xBA, 0x37, 0x5A, 0x4C, 0xA3, 0xE8, 0x96, 0x51, 0xC8, 0xB8, 0x63, 0xB9, 0x36, 0x4F, 0xF7, 0x08, 0x16, 0x81, 0x9B, 0x62, 0xA5, + 0xE6, 0x3E, 0x6E, 0x1C, 0x51, 0x42, 0xC5, 0x27, 0xD2, 0x6B, 0xFA, 0x4F, 0xC5, 0x1A, 0x9E, 0xA2, 0xAC, 0x95, 0x87, 0x55, 0xB2, 0x40, 0x69, 0x7A, 0x93, 0x9B, + 0x0E, 0x26, 0x6B, 0xA8, 0xE9, 0x09, 0x64, 0x32, 0xF5, 0xBB, 0x58, 0x81, 0x7B, 0x2E, 0x44, 0x30, 0x64, 0xD7, 0x70, 0x16, 0x16, 0x46, 0x6D, 0x98, 0x95, 0xE5, + 0x0D, 0x25, 0x70, 0x3B, 0x36, 0xF8, 0xF0, 0x29, 0x5C, 0x01, 0x00, 0x9D, 0xB7, 0x85, 0x03, 0x90, 0x86, 0x50, 0xEB, 0x64, 0xC7, 0xCB, 0x07, 0x9C, 0x78, 0x68, + 0xB7, 0x1F, 0x06, 0x1B, 0x04, 0xE2, 0x53, 0x9E, 0x48, 0x77, 0xEB, 0x13, 0xCE, 0x74, 0xAC, 0x59, 0x9B, 0x68, 0xDE, 0xC7, 0xB4, 0x25, 0x9E, 0x57, 0x89, 0xF8, + 0x21, 0xF9, 0xCC, 0x93, 0x38, 0xF3, 0x62, 0xE2, 0x5C, 0x00, 0xF1, 0x99, 0x26, 0xD8, 0x71, 0xF6, 0x89, 0x22, 0xFB, 0x84, 0xB3, 0x8F, 0x00, 0xD1, 0x6C, 0xAF, + 0x78, 0x16, 0x1F, 0x1A, 0xE3, 0xCF, 0xAF, 0x23, 0xCE, 0x6E, 0xC6, 0xB9, 0x74, 0xF2, 0xD9, 0x75, 0x8C, 0xBD, 0x7C, 0x00, 0x68, 0xBF, 0x00, 0x7F, 0x88, 0xB3, + 0x75, 0x33, 0x56, 0x63, 0x4B, 0xCC, 0xCE, 0x11, 0x20, 0x62, 0x4B, 0x3E, 0x87, 0x17, 0xAC, 0xBC, 0x21, 0x01, 0x7F, 0xAA, 0xCD, 0x70, 0x4C, 0x6D, 0xEA, 0x19, + 0x0B, 0x82, 0x1F, 0x31, 0x0F, 0x89, 0x0D, 0xAF, 0xE4, 0xD1, 0x1C, 0x36, 0x62, 0x69, 0x50, 0x78, 0xAA, 0x44, 0x76, 0xD8, 0x3A, 0x32, 0xC9, 0x08, 0x81, 0xA8, + 0x1C, 0x0C, 0xD2, 0x75, 0x1C, 0x96, 0x50, 0x9B, 0x94, 0xFA, 0x54, 0xDA, 0x1C, 0x6F, 0xE0, 0x41, 0xE8, 0x9A, 0x39, 0x80, 0x29, 0xD1, 0x86, 0x99, 0x2A, 0x73, + 0x5D, 0xF6, 0x3B, 0x3B, 0x14, 0x8F, 0x3C, 0xB0, 0x33, 0x1C, 0x92, 0x46, 0x4F, 0xCE, 0x0E, 0xE7, 0xC1, 0xC2, 0x1E, 0x3D, 0xF9, 0x5F, 0x0C, 0x79, 0xF5, 0x60, + 0xD6, 0x04, 0x01, 0x00 }; -//File: index_ov5640.html.gz, Size: 9124 -#define index_ov5640_html_gz_len 9124 -const uint8_t index_ov5640_html_gz[] = { - 0x1F, 0x8B, 0x08, 0x08, 0xD9, 0x6C, 0x6A, 0x5E, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x5F, 0x6F, 0x76, 0x35, 0x36, 0x34, 0x30, 0x2E, 0x68, 0x74, 0x6D, - 0x6C, 0x00, 0xED, 0x3D, 0x6B, 0x77, 0xDB, 0xB6, 0x92, 0xDF, 0xF3, 0x2B, 0x18, 0xF5, 0x6E, 0x24, 0x9F, 0x58, 0xB6, 0xA8, 0x97, 0x1F, 0xB1, 0x95, 0x4D, 0x1C, - 0x27, 0xE9, 0xB9, 0x4D, 0x6F, 0x1A, 0xA7, 0x69, 0x7B, 0xBA, 0x3D, 0x29, 0x25, 0x41, 0x12, 0x1B, 0x8A, 0xD4, 0x25, 0x29, 0xCB, 0x6E, 0x8E, 0x7F, 0xC7, 0xFE, - 0xA0, 0xFD, 0x63, 0x3B, 0x03, 0x80, 0x24, 0x48, 0x81, 0x24, 0x48, 0x4A, 0xB2, 0xDB, 0x5D, 0xE5, 0x9C, 0x98, 0x0F, 0xCC, 0x60, 0xDE, 0x18, 0x0C, 0x40, 0xF2, - 0xEC, 0xF1, 0xD8, 0x19, 0xF9, 0xB7, 0x0B, 0xA2, 0xCD, 0xFC, 0xB9, 0x35, 0x78, 0x74, 0xC6, 0xFE, 0x68, 0xF0, 0x3B, 0x9B, 0x11, 0x63, 0xCC, 0x0E, 0xE9, 0xE9, - 0x9C, 0xF8, 0x86, 0x36, 0x9A, 0x19, 0xAE, 0x47, 0xFC, 0xF3, 0xDA, 0xD2, 0x9F, 0x34, 0x8F, 0x6B, 0xC9, 0xDB, 0xB6, 0x31, 0x27, 0xE7, 0xB5, 0x6B, 0x93, 0xAC, - 0x16, 0x8E, 0xEB, 0xD7, 0xB4, 0x91, 0x63, 0xFB, 0xC4, 0x86, 0xE6, 0x2B, 0x73, 0xEC, 0xCF, 0xCE, 0xC7, 0xE4, 0xDA, 0x1C, 0x91, 0x26, 0x3D, 0xD9, 0x37, 0x6D, - 0xD3, 0x37, 0x0D, 0xAB, 0xE9, 0x8D, 0x0C, 0x8B, 0x9C, 0xEB, 0x22, 0x2E, 0xDF, 0xF4, 0x2D, 0x32, 0xB8, 0xBC, 0x7A, 0xDF, 0x69, 0x6B, 0xFF, 0xFA, 0xD4, 0xEB, - 0x77, 0x5B, 0x67, 0x87, 0xEC, 0x5A, 0xD4, 0xC6, 0xF3, 0x6F, 0xC5, 0x73, 0xFC, 0x0D, 0x9D, 0xF1, 0xAD, 0xF6, 0x35, 0x76, 0x09, 0x7F, 0x13, 0x20, 0xA2, 0x39, - 0x31, 0xE6, 0xA6, 0x75, 0x7B, 0xAA, 0xBD, 0x70, 0xA1, 0xCF, 0xFD, 0xB7, 0xC4, 0xBA, 0x26, 0xBE, 0x39, 0x32, 0xF6, 0x3D, 0xC3, 0xF6, 0x9A, 0x1E, 0x71, 0xCD, - 0xC9, 0xB3, 0x35, 0xC0, 0xA1, 0x31, 0xFA, 0x32, 0x75, 0x9D, 0xA5, 0x3D, 0x3E, 0xD5, 0xBE, 0xD1, 0x8F, 0xF1, 0xDF, 0x7A, 0xA3, 0x91, 0x63, 0x39, 0x2E, 0xDC, - 0xBF, 0x7C, 0x8D, 0xFF, 0xD6, 0xEF, 0xD3, 0xDE, 0x3D, 0xF3, 0x4F, 0x72, 0xAA, 0xE9, 0xFD, 0xC5, 0x4D, 0xEC, 0xFE, 0xDD, 0xA3, 0xD8, 0xE9, 0xAC, 0x9D, 0x46, - 0x3D, 0x87, 0x3F, 0xCE, 0x86, 0xF7, 0xC8, 0xC8, 0x37, 0x1D, 0xFB, 0x60, 0x6E, 0x98, 0xB6, 0x04, 0xD3, 0xD8, 0xF4, 0x16, 0x96, 0x01, 0x32, 0x98, 0x58, 0x24, - 0x13, 0xCF, 0x37, 0x73, 0x62, 0x2F, 0xF7, 0x73, 0xB0, 0x21, 0x92, 0xE6, 0xD8, 0x74, 0x59, 0xAB, 0x53, 0x94, 0xC3, 0x72, 0x6E, 0xE7, 0xA2, 0xCD, 0xA2, 0xCB, - 0x76, 0x6C, 0x22, 0x11, 0x20, 0x76, 0xB4, 0x72, 0x8D, 0x05, 0x36, 0xC0, 0xBF, 0xEB, 0x4D, 0xE6, 0xA6, 0xCD, 0x8C, 0xEA, 0x54, 0xEB, 0x74, 0x5B, 0x8B, 0x9B, - 0x1C, 0x55, 0x76, 0xFA, 0xF8, 0x6F, 0xBD, 0xD1, 0xC2, 0x18, 0x8F, 0x4D, 0x7B, 0x7A, 0xAA, 0x1D, 0x4B, 0x51, 0x38, 0xEE, 0x98, 0xB8, 0x4D, 0xD7, 0x18, 0x9B, - 0x4B, 0xEF, 0x54, 0xEB, 0xCA, 0xDA, 0xCC, 0x0D, 0x77, 0x0A, 0xB4, 0xF8, 0x0E, 0x10, 0xDB, 0xD4, 0xA5, 0x94, 0xF0, 0x26, 0xAE, 0x39, 0x9D, 0xF9, 0xA0, 0xD2, - 0xB5, 0x36, 0x49, 0xA1, 0x71, 0x17, 0xCA, 0xD3, 0x67, 0xA6, 0xDC, 0xE4, 0x52, 0x33, 0x2C, 0x73, 0x6A, 0x37, 0x4D, 0x9F, 0xCC, 0x81, 0x1D, 0xCF, 0x77, 0x89, - 0x3F, 0x9A, 0x65, 0x91, 0x32, 0x31, 0xA7, 0x4B, 0x97, 0x48, 0x08, 0x09, 0xE5, 0x96, 0xC1, 0x30, 0xDC, 0x5C, 0xBF, 0xD5, 0x5C, 0x91, 0xE1, 0x17, 0xD3, 0x6F, - 0x72, 0x99, 0x0C, 0xC9, 0xC4, 0x71, 0x89, 0xB4, 0x65, 0xD0, 0xC2, 0x72, 0x46, 0x5F, 0x9A, 0x9E, 0x6F, 0xB8, 0xBE, 0x0A, 0x42, 0x63, 0xE2, 0x13, 0x37, 0x1F, - 0x1F, 0x41, 0xAB, 0xC8, 0xC7, 0x96, 0xDE, 0x2D, 0x6F, 0x60, 0xDA, 0x96, 0x69, 0x13, 0x75, 0xF2, 0xD2, 0xFA, 0x8D, 0xA3, 0x63, 0xAD, 0x14, 0x14, 0x63, 0xCE, - 0xA7, 0x59, 0x56, 0x42, 0x79, 0x5D, 0xEF, 0x8C, 0xFB, 0x8D, 0xDE, 0x6A, 0xFD, 0xC7, 0xFA, 0xCD, 0x19, 0x61, 0x66, 0x6A, 0x2C, 0x7D, 0xA7, 0xBA, 0x47, 0xAC, - 0xB9, 0x55, 0x82, 0x8F, 0xFF, 0x9C, 0x93, 0xB1, 0x69, 0x68, 0x0D, 0xC1, 0x9D, 0x8F, 0x5B, 0x60, 0x53, 0x7B, 0x9A, 0x61, 0x8F, 0xB5, 0x86, 0xE3, 0x9A, 0xE0, - 0x08, 0x06, 0x0D, 0x37, 0x16, 0x5C, 0x81, 0x81, 0x63, 0x41, 0xF6, 0x24, 0x2C, 0x67, 0xF8, 0x8C, 0x28, 0x11, 0xB9, 0xDB, 0xE0, 0x4F, 0x21, 0xE4, 0xE0, 0x2F, - 0xD7, 0x81, 0x24, 0x3C, 0x52, 0xF4, 0x59, 0xFA, 0x12, 0x29, 0x4C, 0xD3, 0x19, 0xFE, 0xE6, 0xC6, 0x4D, 0x33, 0x53, 0x77, 0x41, 0xA3, 0x40, 0x87, 0x30, 0xCC, - 0x8E, 0x1A, 0xD0, 0xF4, 0x7A, 0xA6, 0x35, 0x35, 0x8C, 0x92, 0x7B, 0x72, 0x18, 0x8E, 0x54, 0xAE, 0x72, 0xFC, 0x89, 0x46, 0x51, 0x80, 0x5D, 0x39, 0xAB, 0x51, - 0xEC, 0x60, 0xFF, 0x64, 0x36, 0xC4, 0x38, 0x49, 0x8D, 0x22, 0xF8, 0x53, 0x8F, 0x24, 0x11, 0xB2, 0xDC, 0x68, 0x22, 0x41, 0x9C, 0x1E, 0x51, 0xD6, 0xF0, 0xA6, - 0x79, 0xB7, 0x04, 0x6B, 0x36, 0x09, 0xAA, 0xD1, 0x45, 0x82, 0x38, 0x8B, 0x86, 0xDC, 0x28, 0x83, 0xBF, 0x3B, 0x85, 0x7C, 0xE3, 0x9B, 0xE1, 0xD2, 0xF7, 0x1D, - 0xDB, 0xAB, 0x34, 0x44, 0xA5, 0xF9, 0xD9, 0x1F, 0x4B, 0xCF, 0x37, 0x27, 0xB7, 0x4D, 0xEE, 0xD2, 0xE0, 0x67, 0x0B, 0x03, 0x52, 0xC8, 0x21, 0xF1, 0x57, 0x84, - 0x64, 0xA7, 0x1B, 0xB6, 0x71, 0x0D, 0x71, 0x67, 0x3A, 0xB5, 0x64, 0xB6, 0x37, 0x5A, 0xBA, 0x1E, 0xE6, 0x6D, 0x0B, 0xC7, 0x04, 0xC4, 0xEE, 0x7A, 0xC7, 0x71, - 0x1F, 0x54, 0xEC, 0xA8, 0x39, 0x1A, 0x4A, 0xFA, 0x72, 0x96, 0x3E, 0xCA, 0x58, 0xAA, 0x09, 0x07, 0xD8, 0x31, 0xFD, 0x5B, 0xE9, 0x3D, 0xEE, 0x89, 0x92, 0x3B, - 0x81, 0x0B, 0x66, 0x0E, 0x0B, 0x71, 0xBA, 0x4E, 0x47, 0x33, 0x32, 0xFA, 0x42, 0xC6, 0x4F, 0x73, 0xD3, 0xB0, 0xBC, 0xF4, 0xF0, 0xC0, 0xB4, 0x17, 0x4B, 0xBF, - 0x89, 0xE9, 0xD4, 0x62, 0x2B, 0x3A, 0xA7, 0x06, 0x19, 0xB0, 0xD8, 0x6E, 0x67, 0x25, 0x15, 0xBD, 0xC5, 0x4D, 0xB6, 0x10, 0x44, 0x62, 0x07, 0x96, 0x31, 0x24, - 0x56, 0x16, 0xC9, 0xDC, 0x19, 0x52, 0xC2, 0x2E, 0x8F, 0x55, 0xE9, 0xB9, 0x1B, 0xA5, 0x2C, 0x1A, 0xBC, 0xBA, 0x47, 0xFF, 0xA1, 0x2C, 0x47, 0x7A, 0xBC, 0x1F, - 0xBB, 0xE4, 0x11, 0x0B, 0x1C, 0x2C, 0x71, 0x6D, 0x61, 0xA4, 0x26, 0xE3, 0xD0, 0x62, 0x05, 0x54, 0x65, 0x76, 0xE9, 0x1A, 0xF6, 0x94, 0x40, 0x74, 0xB8, 0xD9, - 0x0F, 0x0E, 0xB3, 0xA7, 0x0A, 0x4A, 0x02, 0xC1, 0xE0, 0xDD, 0xCB, 0x9E, 0x9A, 0xB0, 0x10, 0xB1, 0xAF, 0x1D, 0xB0, 0x83, 0x12, 0x79, 0x8A, 0xA0, 0xF1, 0x4C, - 0x42, 0x74, 0xA9, 0xBD, 0xB0, 0x54, 0x45, 0xEA, 0x4B, 0x71, 0x6B, 0x93, 0xA6, 0xFE, 0xB9, 0xC1, 0x22, 0x98, 0x04, 0x4E, 0x26, 0x79, 0xD3, 0xC8, 0xC9, 0xA4, - 0xD3, 0xEA, 0x74, 0x73, 0x73, 0x29, 0x29, 0x97, 0x89, 0xA9, 0xA4, 0x24, 0x98, 0x84, 0x81, 0x26, 0x5F, 0x17, 0xA7, 0x33, 0xE7, 0x9A, 0xB8, 0x12, 0x45, 0x24, - 0xC8, 0xED, 0x9E, 0x74, 0xC7, 0x0A, 0xD8, 0x0C, 0x18, 0x0A, 0xAE, 0x65, 0x81, 0x36, 0x8E, 0xAE, 0xAD, 0x8F, 0xDA, 0x99, 0x16, 0xCA, 0xD0, 0x1D, 0x80, 0x35, - 0x18, 0x43, 0x8B, 0x8C, 0x33, 0x22, 0xF7, 0x98, 0x4C, 0x8C, 0xA5, 0xE5, 0xE7, 0xC8, 0xDB, 0x68, 0xE1, 0xBF, 0xAC, 0x1E, 0xA9, 0x7B, 0xFD, 0x8A, 0x35, 0x90, - 0x73, 0xEA, 0x12, 0xBF, 0x49, 0xFA, 0x0C, 0x86, 0x55, 0x63, 0xB1, 0x20, 0x06, 0xB4, 0x1A, 0x91, 0xB4, 0xD9, 0xAA, 0x52, 0x3A, 0x2D, 0x8F, 0x69, 0x4A, 0x73, - 0xD4, 0x5C, 0x53, 0x0C, 0x13, 0xA5, 0x42, 0x3C, 0x9F, 0x4E, 0x9C, 0xD1, 0x52, 0x36, 0x82, 0xAB, 0x99, 0xD4, 0x3A, 0xBE, 0xD3, 0x40, 0x64, 0x9E, 0x65, 0x52, - 0xC3, 0x5E, 0xDA, 0x36, 0x6A, 0xB4, 0xE9, 0xBB, 0xC0, 0xA6, 0xA4, 0x23, 0x35, 0xC1, 0x95, 0xF2, 0xCE, 0x98, 0x60, 0xD3, 0xEA, 0x34, 0x09, 0x07, 0x94, 0x04, - 0x8A, 0x30, 0x86, 0x68, 0x9E, 0x03, 0x4C, 0x05, 0xA8, 0xAA, 0xC9, 0xC5, 0x9F, 0x2D, 0xE7, 0xB2, 0x9C, 0x21, 0xE8, 0x4C, 0x87, 0x01, 0x8E, 0x75, 0xE7, 0x4E, - 0x87, 0x46, 0xA3, 0xB5, 0xDF, 0xDA, 0xEF, 0xC0, 0x7F, 0x92, 0xDC, 0x3D, 0xDB, 0xB8, 0xB8, 0x78, 0x53, 0x2C, 0x2F, 0x11, 0x7C, 0xF2, 0x4B, 0x28, 0x69, 0x61, - 0x2C, 0x57, 0x17, 0xEA, 0x9E, 0x14, 0xAF, 0xA5, 0xE8, 0x07, 0x39, 0x23, 0x4C, 0x8A, 0x49, 0x17, 0x37, 0x44, 0x89, 0xB5, 0x14, 0x55, 0xF1, 0xDC, 0xF9, 0xB3, - 0xC9, 0x86, 0xD7, 0xFF, 0xF3, 0xD6, 0x2E, 0x88, 0xE2, 0x6F, 0x6D, 0xE9, 0x85, 0xE5, 0xE2, 0xDD, 0xB7, 0x6D, 0xB4, 0xD2, 0xB5, 0xDE, 0xE4, 0xF9, 0x0C, 0x50, - 0x68, 0x43, 0xC6, 0xE9, 0xC2, 0xC4, 0x2B, 0x35, 0xE7, 0x11, 0xDA, 0x94, 0x90, 0xC1, 0xC4, 0xB4, 0xAC, 0xA6, 0xE5, 0xAC, 0xF2, 0x33, 0x91, 0x6C, 0x4B, 0x5E, - 0xB3, 0xD3, 0x7C, 0x93, 0x2F, 0x4B, 0xED, 0x12, 0x22, 0xD7, 0x5F, 0x82, 0xDA, 0xBF, 0xB7, 0xC3, 0x65, 0xBA, 0x46, 0xB9, 0x81, 0xA2, 0x84, 0x3D, 0x56, 0xEB, - 0x48, 0xC9, 0x94, 0x58, 0x26, 0x98, 0x39, 0xAB, 0xF3, 0x56, 0xA6, 0x3F, 0x9A, 0x95, 0x98, 0x54, 0x2D, 0x1C, 0xCF, 0x64, 0xCB, 0x37, 0x2E, 0xB1, 0x0C, 0xCC, - 0xE0, 0x4B, 0xCD, 0xC6, 0x73, 0x27, 0x26, 0x22, 0xB8, 0x0A, 0x27, 0x54, 0x74, 0x0F, 0xA7, 0x92, 0x72, 0xC0, 0x72, 0x87, 0xF4, 0x58, 0x2D, 0x37, 0xEB, 0x9C, - 0x74, 0x3F, 0xEE, 0x19, 0xF2, 0x46, 0x05, 0x22, 0x7A, 0x10, 0xB4, 0xA7, 0x2E, 0xB9, 0x55, 0x60, 0x66, 0x9F, 0xFF, 0x3D, 0x65, 0xB5, 0xD2, 0xF2, 0x45, 0x00, - 0x3A, 0x00, 0x70, 0x2B, 0x3A, 0xE8, 0x7A, 0x0A, 0x5D, 0xA7, 0x77, 0xA9, 0x62, 0x8F, 0x61, 0x25, 0xB0, 0x56, 0x53, 0x08, 0x37, 0x19, 0x43, 0xA8, 0xDC, 0x54, - 0x83, 0xD1, 0x57, 0x7A, 0xD3, 0x22, 0x13, 0x3F, 0x65, 0xA1, 0x83, 0xE6, 0xA9, 0x9D, 0xEC, 0xE8, 0xD6, 0x14, 0xEA, 0x04, 0xB9, 0x91, 0x23, 0x2C, 0xD8, 0xA5, - 0x5B, 0x9F, 0x14, 0x33, 0x46, 0xCF, 0xC2, 0xC8, 0xD3, 0x55, 0x12, 0xA4, 0xCF, 0x54, 0xCD, 0xD0, 0x66, 0xCE, 0x87, 0x7C, 0x50, 0x0F, 0xF9, 0xB9, 0xD1, 0xEE, - 0x4B, 0xD7, 0x11, 0x32, 0x1A, 0x67, 0x91, 0xC6, 0x2A, 0x5E, 0x4A, 0x43, 0x56, 0xEA, 0x04, 0x59, 0x8C, 0x45, 0x52, 0x45, 0x65, 0x7B, 0x65, 0x56, 0x84, 0x59, - 0xAF, 0xD1, 0x64, 0x1A, 0xBB, 0x39, 0x37, 0x20, 0xED, 0x45, 0x73, 0x35, 0x00, 0xA3, 0x4C, 0x7F, 0x2A, 0xE6, 0x2E, 0xD4, 0x13, 0xF5, 0x7E, 0x2B, 0xA7, 0xCB, - 0x91, 0xE5, 0x78, 0xD9, 0x7E, 0x65, 0x0C, 0x41, 0x7E, 0x4B, 0x5F, 0xD2, 0x11, 0xAF, 0x6A, 0x4A, 0x2B, 0x4F, 0xD4, 0xB8, 0xA5, 0x77, 0x94, 0x86, 0xEE, 0x4C, - 0x9F, 0xCA, 0x76, 0xC7, 0x84, 0xCC, 0xF5, 0x96, 0x34, 0xD2, 0x66, 0xD6, 0xDF, 0x7C, 0x72, 0x03, 0xF3, 0x4D, 0x5C, 0xAB, 0x3B, 0xD5, 0x46, 0x44, 0x1E, 0x46, - 0x63, 0x83, 0x9C, 0xAE, 0x52, 0x04, 0xCC, 0xD4, 0xC3, 0xCC, 0x1C, 0x8F, 0x49, 0x66, 0x95, 0x13, 0xE7, 0xBC, 0xD9, 0xA1, 0xD2, 0x90, 0x96, 0xD3, 0x0A, 0x68, - 0xB2, 0x9D, 0xAE, 0xCA, 0xCC, 0xE1, 0x2A, 0x25, 0xF4, 0xC5, 0x24, 0x24, 0x6D, 0x22, 0x54, 0x61, 0xE5, 0x21, 0x12, 0x15, 0x31, 0x26, 0x23, 0xC7, 0x65, 0x8B, - 0xB8, 0x29, 0x13, 0xFF, 0x72, 0x33, 0x2B, 0x44, 0x2E, 0x2B, 0xDD, 0x6D, 0x25, 0x74, 0x64, 0x6E, 0x74, 0xD0, 0xB7, 0x1D, 0x57, 0xF8, 0x70, 0x9C, 0x56, 0x49, - 0x8F, 0x27, 0x6C, 0x99, 0xA4, 0x4A, 0x43, 0x60, 0xA8, 0x46, 0x14, 0x19, 0xC8, 0x01, 0x5B, 0xAD, 0x2B, 0x34, 0x41, 0x15, 0x5D, 0x5A, 0x39, 0xE0, 0xAB, 0x4D, - 0x7C, 0x61, 0xB0, 0x99, 0xB6, 0xDE, 0xB2, 0xC1, 0xC5, 0x37, 0x6A, 0x01, 0xC9, 0x7E, 0x53, 0x45, 0x73, 0x4F, 0xF9, 0x63, 0x06, 0x91, 0xE1, 0x40, 0x1C, 0x6C, - 0xB7, 0x8A, 0xB7, 0x2A, 0x1B, 0x42, 0xCE, 0x0E, 0x85, 0xFD, 0x71, 0x67, 0x87, 0xD1, 0x56, 0xBE, 0x33, 0xDC, 0x24, 0x27, 0x6E, 0xA3, 0xE3, 0xFD, 0x8C, 0x2C, - 0xC3, 0xF3, 0xCE, 0x6B, 0xB8, 0xD9, 0xAB, 0x16, 0xDF, 0x55, 0x77, 0x36, 0x36, 0xAF, 0x35, 0x73, 0x7C, 0x5E, 0xB3, 0x9C, 0xA9, 0x93, 0xB8, 0x47, 0xEF, 0x33, - 0x2D, 0xC3, 0x68, 0x7F, 0x5E, 0x8B, 0xAD, 0x38, 0xD6, 0x28, 0x54, 0x74, 0xA9, 0x36, 0x78, 0xF2, 0xCD, 0xC9, 0xD1, 0x51, 0xFF, 0xD9, 0x13, 0x7B, 0xE8, 0x2D, - 0xF8, 0xFF, 0x1F, 0xD9, 0x02, 0xAD, 0x47, 0x7C, 0x1F, 0x6C, 0xCE, 0x3B, 0x3B, 0xA4, 0xD8, 0x12, 0x14, 0x1C, 0x02, 0x09, 0x29, 0x44, 0xF1, 0x6C, 0x50, 0x46, - 0x57, 0xD0, 0xC4, 0x83, 0x04, 0x67, 0x68, 0xB8, 0x92, 0x26, 0xB4, 0x19, 0x9B, 0x6B, 0xD0, 0x18, 0x52, 0xA3, 0xCA, 0x18, 0x3A, 0x37, 0x49, 0xD2, 0x29, 0x37, - 0x5C, 0x53, 0xBC, 0x15, 0x19, 0xA7, 0x21, 0x04, 0x30, 0x0A, 0x8E, 0xEB, 0xAC, 0xD0, 0x46, 0xDA, 0x28, 0x26, 0x7B, 0x6C, 0x7C, 0x33, 0xB2, 0xBE, 0x04, 0x4A, - 0xAF, 0x05, 0xDA, 0xB0, 0x1D, 0x9F, 0x8D, 0x24, 0x29, 0x5D, 0xC5, 0x58, 0xE5, 0x30, 0xC2, 0x6A, 0x21, 0xE3, 0x02, 0x44, 0xDB, 0xA4, 0xD8, 0xD9, 0xB5, 0x6C, - 0x4C, 0x14, 0x9B, 0xA0, 0xD0, 0x00, 0xB8, 0x36, 0xF8, 0xF9, 0xE2, 0xBB, 0x7F, 0x6A, 0xEF, 0xDE, 0xFE, 0x29, 0xD5, 0x50, 0x1E, 0x51, 0x18, 0x9C, 0x15, 0x7A, - 0xA6, 0x60, 0x4C, 0x1F, 0x81, 0x4C, 0x6A, 0x5C, 0x33, 0x14, 0x03, 0x26, 0x43, 0x16, 0xB1, 0xA7, 0xFE, 0xEC, 0xBC, 0xA6, 0xD7, 0x70, 0x77, 0x4B, 0x70, 0xD6, - 0xAE, 0x69, 0x18, 0xB8, 0xE9, 0xC1, 0xB5, 0x61, 0x2D, 0xF1, 0xA8, 0xA5, 0xC2, 0xEB, 0xBA, 0x69, 0x49, 0x9B, 0xF1, 0x88, 0x12, 0xCA, 0x58, 0x88, 0xC0, 0x71, - 0x29, 0xD7, 0x06, 0x57, 0xC4, 0x3F, 0x3B, 0x64, 0xB7, 0x72, 0xB4, 0x96, 0xDD, 0x37, 0xB8, 0x30, 0x33, 0x87, 0x2C, 0x13, 0xCA, 0x52, 0xFC, 0xC4, 0x35, 0xE6, - 0x04, 0xA5, 0xA2, 0xA4, 0x79, 0x51, 0xEB, 0x21, 0x64, 0x6D, 0xF0, 0x81, 0xD0, 0x2C, 0x03, 0xC8, 0x50, 0x52, 0xFC, 0x19, 0x4F, 0xE1, 0x63, 0xFD, 0x87, 0xF6, - 0xCC, 0x97, 0xEC, 0x9A, 0x06, 0x33, 0x73, 0x05, 0xB9, 0x3F, 0x6E, 0x36, 0xB5, 0xDE, 0xBB, 0xF7, 0x5A, 0xB3, 0xA9, 0xD0, 0xD8, 0x59, 0x50, 0x77, 0x0A, 0xF4, - 0x0F, 0x16, 0xC2, 0xA8, 0x21, 0x54, 0x3F, 0xEC, 0xA8, 0x36, 0xF8, 0xE1, 0xEA, 0xE7, 0x37, 0x2F, 0x1A, 0xED, 0x5E, 0xBF, 0x75, 0xA3, 0x9F, 0xB4, 0x5B, 0x7B, - 0x67, 0x87, 0x0C, 0xAE, 0x78, 0x07, 0x60, 0x60, 0xEF, 0xB5, 0xD7, 0x6F, 0x5F, 0x35, 0xF4, 0xD6, 0x71, 0x55, 0x64, 0xFA, 0x49, 0x6D, 0xF0, 0xD3, 0x0F, 0x11, - 0x65, 0xFD, 0x56, 0x15, 0x64, 0xC7, 0xC0, 0x26, 0xD0, 0xC5, 0x50, 0x75, 0xBB, 0x85, 0x50, 0xA1, 0xC8, 0x3B, 0xE5, 0x44, 0xAE, 0x1F, 0x41, 0xBF, 0x94, 0x87, - 0x56, 0xF7, 0xF8, 0x46, 0xEF, 0xF5, 0xBB, 0x15, 0x78, 0xE8, 0xA3, 0x74, 0x81, 0x90, 0xC6, 0x71, 0xBF, 0x5B, 0x15, 0x57, 0x0F, 0x71, 0x81, 0x40, 0x8E, 0xDA, - 0x20, 0x8F, 0xF6, 0x71, 0x15, 0xD1, 0x76, 0x6B, 0x03, 0xAA, 0xF2, 0x13, 0x44, 0xD5, 0x2A, 0x86, 0x0A, 0x45, 0xDB, 0x2E, 0x29, 0xDA, 0x4E, 0x6D, 0xF0, 0x23, - 0x8A, 0x16, 0x2D, 0x03, 0x78, 0xA8, 0x64, 0x1E, 0x6D, 0x88, 0x52, 0x14, 0x57, 0x1B, 0xED, 0xB6, 0xD5, 0xAE, 0x22, 0x5A, 0xBD, 0x36, 0x40, 0x71, 0x20, 0xA6, - 0xA3, 0x4A, 0x0E, 0x00, 0xDE, 0x44, 0x69, 0x02, 0x72, 0x6E, 0x8E, 0xFA, 0xC7, 0xE5, 0x31, 0x81, 0x27, 0x5D, 0x7D, 0x02, 0x4C, 0xC7, 0x20, 0xA8, 0x4A, 0x6E, - 0x04, 0x5E, 0x84, 0x78, 0xFA, 0xDD, 0xD6, 0x4D, 0xB7, 0x8A, 0xCD, 0x80, 0x57, 0xBC, 0x45, 0x44, 0x80, 0xE4, 0xA6, 0x53, 0x45, 0x46, 0xE0, 0x12, 0x17, 0xDF, - 0xBE, 0x6E, 0x74, 0x81, 0xB1, 0xF6, 0x49, 0xBF, 0x3C, 0x1E, 0x70, 0x87, 0x1F, 0x90, 0x20, 0x20, 0xE6, 0xA6, 0x5D, 0x2C, 0x3A, 0xC4, 0x11, 0x81, 0x33, 0x00, - 0x3C, 0xE2, 0x28, 0x8D, 0x02, 0xEC, 0xFA, 0x2D, 0x25, 0x06, 0x11, 0xE9, 0x47, 0x15, 0xB8, 0x02, 0xAB, 0xFE, 0x01, 0xC5, 0x03, 0x48, 0x30, 0xE8, 0x55, 0x30, - 0x45, 0x40, 0x44, 0x49, 0xD2, 0xFB, 0xD4, 0xD5, 0xCA, 0x63, 0x02, 0x9B, 0x3E, 0xE9, 0xDF, 0x9C, 0xF4, 0xD5, 0x10, 0xE0, 0x88, 0x8F, 0xA3, 0x54, 0x56, 0x4E, - 0x90, 0x9D, 0x32, 0x64, 0xA5, 0x03, 0xFF, 0x5E, 0x1A, 0x16, 0xCC, 0x6F, 0x0A, 0x27, 0x03, 0x1C, 0x0E, 0x64, 0xC2, 0x0E, 0xD4, 0xF2, 0x00, 0x81, 0x92, 0x70, - 0xA3, 0x59, 0x6D, 0xD0, 0x55, 0xC8, 0xB7, 0x62, 0x09, 0x39, 0x85, 0x8D, 0xD1, 0x4F, 0x93, 0x40, 0xB4, 0x3C, 0x4C, 0xFF, 0xC0, 0x25, 0x3A, 0x35, 0x21, 0x82, - 0x94, 0x4A, 0x34, 0x24, 0xB4, 0x1A, 0x37, 0xB5, 0x41, 0xBF, 0x93, 0x9B, 0xA0, 0x95, 0x57, 0xC6, 0x90, 0xD6, 0x68, 0x6C, 0xE2, 0x79, 0x85, 0xF5, 0x11, 0x81, - 0xD6, 0x06, 0x2F, 0xC3, 0xE3, 0x2A, 0x5A, 0x69, 0xE6, 0x71, 0x4A, 0x61, 0x53, 0xD4, 0x22, 0x90, 0xC3, 0x34, 0xD3, 0xEC, 0x70, 0xD5, 0x44, 0x9A, 0xD9, 0xAC, - 0x62, 0xB6, 0xA9, 0x17, 0x9C, 0x4E, 0xBA, 0x86, 0xE7, 0x17, 0xD6, 0x4A, 0x00, 0x08, 0x11, 0x9A, 0x1F, 0xDD, 0x9B, 0x46, 0x42, 0x52, 0xFE, 0x06, 0xFA, 0xF0, - 0x0C, 0x7F, 0xC9, 0xAA, 0x85, 0x85, 0x35, 0x12, 0x81, 0x42, 0x3E, 0x10, 0x1E, 0x57, 0xD2, 0x4A, 0x95, 0xF0, 0x25, 0x90, 0xC3, 0xF5, 0x12, 0x84, 0xB0, 0xEE, - 0x96, 0xF4, 0x92, 0x47, 0x6D, 0x25, 0xBD, 0xCC, 0x0C, 0x77, 0x51, 0x2A, 0x7C, 0x85, 0x90, 0xA0, 0x95, 0xE0, 0xF0, 0xDE, 0x5C, 0x25, 0x22, 0xE6, 0x6F, 0xE0, - 0x2B, 0x63, 0x62, 0x3B, 0xA6, 0x57, 0x7C, 0xB6, 0xCF, 0xE1, 0x6A, 0x83, 0x57, 0xA4, 0xF9, 0x3D, 0x1E, 0x55, 0x51, 0xC7, 0x8B, 0xA5, 0xEF, 0x54, 0x50, 0x48, - 0x40, 0x0B, 0x53, 0x47, 0x8B, 0x6B, 0xE3, 0x78, 0x4B, 0xDA, 0x38, 0xDE, 0xA2, 0x36, 0x0C, 0xF2, 0xD9, 0x22, 0xD7, 0xC4, 0x2A, 0xAC, 0x8E, 0x00, 0xB0, 0x36, - 0xB8, 0xBC, 0x59, 0x38, 0x1E, 0x3E, 0x3A, 0xF5, 0x1D, 0x9E, 0x57, 0x72, 0x92, 0x5E, 0x05, 0x9D, 0x84, 0x04, 0x71, 0x1F, 0xE9, 0x71, 0xAD, 0xF4, 0xB6, 0xA4, - 0x95, 0x3C, 0x5A, 0xAB, 0x68, 0x65, 0x6A, 0x98, 0xF6, 0x88, 0x98, 0x16, 0x3E, 0xC6, 0x51, 0x54, 0x31, 0x02, 0x6C, 0x6D, 0xF0, 0x26, 0x3A, 0xA9, 0xA2, 0x98, - 0x56, 0x05, 0xBD, 0x88, 0xF4, 0xC4, 0xFD, 0xA5, 0x07, 0xB3, 0xF2, 0x2D, 0xE9, 0x46, 0xD7, 0xB7, 0x39, 0xAA, 0x2C, 0xC8, 0xC8, 0x34, 0xAC, 0xCF, 0x64, 0x32, - 0x81, 0x69, 0x50, 0xF1, 0xA1, 0x25, 0x06, 0x0E, 0xE3, 0x0B, 0x3B, 0xD7, 0x2E, 0xE9, 0x79, 0xE1, 0xFA, 0x65, 0x02, 0x5D, 0xF9, 0x22, 0x66, 0x72, 0x4E, 0x28, - 0x2D, 0x4B, 0x7E, 0xEF, 0x84, 0x74, 0x96, 0x9F, 0xB6, 0x7E, 0x4F, 0xA6, 0x74, 0x1B, 0x41, 0x95, 0x39, 0xF4, 0x1B, 0xD7, 0xB8, 0xA5, 0xEF, 0x64, 0xA8, 0x32, - 0xA5, 0xFF, 0x40, 0xC6, 0xDA, 0x47, 0xD3, 0x2E, 0xCF, 0x4C, 0x17, 0x09, 0x21, 0xC4, 0xAE, 0x86, 0xA5, 0x07, 0x53, 0x24, 0x38, 0xA8, 0x86, 0xA4, 0x8F, 0x35, - 0xFD, 0x85, 0x69, 0x3C, 0x84, 0x49, 0xBC, 0xB1, 0x1A, 0x16, 0x1F, 0x50, 0x56, 0x43, 0x18, 0x97, 0x7F, 0x7A, 0xA9, 0x5D, 0xD2, 0x8D, 0xEF, 0x85, 0xC3, 0x15, - 0xDB, 0x93, 0xA7, 0x62, 0xE8, 0xD1, 0xD2, 0x0D, 0xF6, 0xB9, 0xB6, 0xA6, 0x26, 0x77, 0x20, 0xD5, 0x75, 0x35, 0x09, 0x7B, 0x01, 0x81, 0x74, 0x0B, 0x53, 0x4D, - 0xE0, 0x56, 0x8D, 0xC7, 0x2D, 0xA6, 0x62, 0xA3, 0x55, 0xF1, 0x34, 0x6C, 0xB4, 0x02, 0x35, 0x8D, 0xAF, 0xF1, 0x99, 0x88, 0xB1, 0x06, 0xFA, 0xDA, 0x89, 0xA2, - 0xB0, 0xD7, 0xFB, 0x51, 0x14, 0xE5, 0xF7, 0xBE, 0x15, 0x05, 0xD6, 0xF2, 0x19, 0xC7, 0xD1, 0x32, 0x4E, 0x45, 0x01, 0x6B, 0x83, 0x77, 0x86, 0xBD, 0x84, 0x41, - 0x66, 0x57, 0x0A, 0x0B, 0x3B, 0xBE, 0x37, 0xF7, 0xE2, 0x7C, 0xDF, 0xB7, 0xEA, 0x80, 0x90, 0xB9, 0x33, 0x2E, 0x3E, 0xDD, 0xE1, 0x70, 0x2C, 0x24, 0xBE, 0x83, - 0xA3, 0xC2, 0x89, 0x41, 0x80, 0x61, 0xCB, 0x19, 0x01, 0x9B, 0x4A, 0x95, 0x4F, 0x06, 0xAE, 0x96, 0xB6, 0x7D, 0x5B, 0x25, 0x13, 0xB8, 0xB0, 0x9C, 0xE5, 0xB8, - 0x3C, 0x06, 0x48, 0x03, 0xFE, 0x35, 0x99, 0x98, 0xA3, 0xF2, 0x89, 0x04, 0x24, 0x01, 0x6F, 0x9D, 0xB9, 0x22, 0xFC, 0x96, 0x07, 0x5E, 0x32, 0x2A, 0x31, 0x93, - 0x1B, 0x81, 0x16, 0x2F, 0x2F, 0x76, 0x3A, 0xF0, 0x42, 0x9F, 0xF7, 0x14, 0x19, 0x90, 0xDB, 0xFB, 0x0E, 0x0A, 0x40, 0xC4, 0x67, 0x6A, 0x3C, 0x65, 0x94, 0xC5, - 0x20, 0xC3, 0x88, 0x1E, 0x4C, 0xBF, 0xEF, 0x6B, 0x7E, 0x17, 0x51, 0x14, 0x9F, 0xDD, 0xE1, 0xD2, 0x73, 0x38, 0xBD, 0xEB, 0xB4, 0x37, 0x3B, 0xC1, 0x43, 0xE4, - 0xDB, 0xD5, 0x4F, 0xBB, 0x8C, 0x6A, 0x20, 0x1A, 0x7D, 0x8F, 0xEB, 0x0C, 0x05, 0x02, 0x76, 0x75, 0x47, 0x6A, 0xDF, 0x9F, 0x27, 0xB5, 0x1F, 0x80, 0x2B, 0x4D, - 0x4B, 0x44, 0xBC, 0x29, 0x46, 0xBC, 0x37, 0x17, 0xBB, 0xD1, 0xD0, 0xF4, 0xDE, 0x42, 0xDD, 0xF4, 0x5E, 0x43, 0x9D, 0xC6, 0x37, 0x05, 0x06, 0x52, 0x28, 0x99, - 0xC1, 0x72, 0x40, 0x56, 0xCB, 0xAA, 0x12, 0xE4, 0xF4, 0x9B, 0x2A, 0x51, 0x2E, 0x20, 0x23, 0x1E, 0xE4, 0xFA, 0xD1, 0xAA, 0x48, 0x6F, 0xB3, 0xCB, 0xBA, 0xDD, - 0x3C, 0x6A, 0xAB, 0x38, 0x8D, 0x6B, 0xAC, 0x3E, 0x4F, 0xE7, 0x46, 0x61, 0x65, 0x70, 0x38, 0xD0, 0xC5, 0xBB, 0x17, 0xBB, 0x4C, 0x17, 0x82, 0x7E, 0xEF, 0xC7, - 0x8F, 0x42, 0xAE, 0xEF, 0x3B, 0xD6, 0x59, 0xC4, 0x2E, 0x1E, 0xEC, 0x10, 0xA8, 0x36, 0xF8, 0x8E, 0xD8, 0x9E, 0x76, 0xE1, 0xB8, 0xFC, 0x45, 0x98, 0x3B, 0xD1, - 0x1A, 0xED, 0xF9, 0x7E, 0x54, 0xC6, 0x98, 0xBE, 0x6F, 0x7D, 0xCD, 0xE6, 0xA6, 0xEB, 0x3A, 0x6E, 0x61, 0x95, 0x71, 0x38, 0x98, 0x56, 0x34, 0xDF, 0xD1, 0xA3, - 0x9D, 0xA8, 0x2B, 0xE8, 0xF5, 0x7E, 0x34, 0x16, 0xF2, 0x7C, 0xDF, 0x4A, 0xBB, 0x9E, 0x58, 0xE6, 0xA2, 0xB0, 0xCA, 0x28, 0x54, 0x6D, 0xF0, 0xA9, 0xF9, 0x1A, - 0xFE, 0xEE, 0x44, 0x5D, 0xAC, 0xC7, 0xFB, 0x51, 0x16, 0xE7, 0xF6, 0xBE, 0x55, 0x35, 0x5C, 0x14, 0x0F, 0x87, 0x00, 0x53, 0x1B, 0xBC, 0x7C, 0xBF, 0x9B, 0xDC, - 0x0F, 0x3B, 0x53, 0xD4, 0x50, 0x25, 0x7D, 0x50, 0xA6, 0xEE, 0x5B, 0x1B, 0xAB, 0x12, 0xDA, 0x58, 0x21, 0xE1, 0x3F, 0xED, 0x48, 0x1B, 0x2B, 0x75, 0x6D, 0x6C, - 0xD8, 0x5F, 0x56, 0x0F, 0x41, 0x3F, 0xF4, 0xE9, 0xD3, 0xA1, 0x51, 0x7C, 0x38, 0x0A, 0x00, 0x71, 0xD3, 0x18, 0x1C, 0x69, 0x2F, 0x8D, 0xDD, 0x0C, 0x48, 0x61, - 0xBF, 0xBB, 0x70, 0xA1, 0x88, 0xC9, 0xFB, 0xD6, 0xD3, 0xC4, 0x18, 0x91, 0xCF, 0x63, 0xE2, 0x97, 0x59, 0x5B, 0x16, 0x60, 0x6B, 0x83, 0xD7, 0x70, 0xA2, 0xBD, - 0xA2, 0x27, 0xBB, 0x4A, 0xF9, 0xC4, 0xFE, 0x77, 0xA1, 0xB5, 0x18, 0xBF, 0x0F, 0x42, 0x71, 0x90, 0x60, 0x3B, 0x53, 0xBB, 0xD4, 0xE3, 0x4C, 0x31, 0x70, 0xAE, - 0xBE, 0x0F, 0xEC, 0x7C, 0xB7, 0x0A, 0x8C, 0x88, 0xD8, 0x99, 0x0E, 0x05, 0xBE, 0x37, 0xA8, 0x46, 0xC5, 0xA7, 0x1A, 0xF9, 0x9B, 0x81, 0xF3, 0x74, 0xC5, 0x9F, - 0xAE, 0xA3, 0x9B, 0x5A, 0x88, 0xDF, 0xF4, 0x7C, 0xD3, 0xB2, 0x60, 0x2A, 0x4C, 0x7C, 0xED, 0x0A, 0x0F, 0x15, 0x1F, 0xA7, 0x13, 0xB0, 0x04, 0x0F, 0xD1, 0xFA, - 0x2E, 0x31, 0xE6, 0xB5, 0xC1, 0x15, 0xBE, 0x33, 0x19, 0x70, 0xE1, 0x59, 0x71, 0x64, 0x54, 0x8C, 0xC4, 0x76, 0x1D, 0x20, 0x2A, 0x54, 0x13, 0x7F, 0x3F, 0x65, - 0x4D, 0x0B, 0x8E, 0x84, 0x6B, 0x83, 0x4B, 0xDA, 0x58, 0x43, 0x3B, 0xCB, 0xEF, 0x4E, 0xF9, 0x39, 0x3F, 0xFA, 0x44, 0x2F, 0x3E, 0xA2, 0x1B, 0x7F, 0xA3, 0x3A, - 0xE8, 0x95, 0xBD, 0xD5, 0x60, 0x70, 0x46, 0xDF, 0x0E, 0xCB, 0x9B, 0xD1, 0x87, 0xD9, 0x57, 0xFC, 0xE9, 0xE4, 0xA1, 0x63, 0x8D, 0x9F, 0x09, 0xAB, 0xCB, 0x57, - 0xE1, 0xE3, 0xB6, 0x08, 0x02, 0x86, 0x11, 0x60, 0xC8, 0x51, 0xFE, 0xCC, 0x0D, 0xD0, 0xB3, 0x27, 0xA2, 0xF1, 0x1D, 0x65, 0x19, 0xCA, 0x4D, 0x79, 0x34, 0xD8, - 0x25, 0xD3, 0x50, 0x90, 0xB2, 0x27, 0xC6, 0xA5, 0x0F, 0x0A, 0x7F, 0x20, 0x53, 0xD3, 0x03, 0x1A, 0x35, 0x30, 0x8B, 0x43, 0xFA, 0x8C, 0x25, 0x33, 0x66, 0xB5, - 0xE7, 0x77, 0xC5, 0x2E, 0xF9, 0xCB, 0x19, 0xA4, 0x8F, 0x63, 0x17, 0xCA, 0x4F, 0x92, 0x0F, 0x4F, 0xC7, 0x31, 0xE6, 0x19, 0xFD, 0xE3, 0x66, 0x73, 0xD6, 0xC5, - 0xA7, 0x45, 0xB5, 0x80, 0xB5, 0xB3, 0xC3, 0x59, 0x37, 0xEF, 0xD1, 0xB0, 0xDC, 0x47, 0x7D, 0x81, 0xD3, 0xD2, 0x4F, 0xFA, 0xA2, 0x94, 0x06, 0x40, 0xCD, 0xBE, - 0xF6, 0xCE, 0xF0, 0xBE, 0xEC, 0x6B, 0x9F, 0xB0, 0x00, 0xB7, 0xC3, 0x07, 0x7E, 0x91, 0x76, 0x63, 0x3C, 0x76, 0x53, 0x1F, 0xFA, 0xED, 0xC6, 0x1E, 0xFA, 0xED, - 0x07, 0x0F, 0xFD, 0xF6, 0xA3, 0xDD, 0x6E, 0x37, 0x9D, 0x56, 0xEB, 0x58, 0x85, 0x75, 0xC5, 0x07, 0x7F, 0x37, 0xC2, 0xD3, 0x1C, 0xA4, 0xA9, 0xC8, 0x53, 0x37, - 0xE0, 0x49, 0xD8, 0x15, 0x7E, 0x33, 0x99, 0x3C, 0x34, 0x8E, 0xF8, 0xBA, 0x54, 0x79, 0x96, 0x5A, 0xED, 0x5D, 0x3F, 0x9D, 0x4D, 0x8D, 0x7B, 0x53, 0x0F, 0x67, - 0xD3, 0x26, 0xC9, 0x68, 0xD8, 0xCB, 0x0C, 0x86, 0x14, 0x84, 0x39, 0xFD, 0x9B, 0x4D, 0x3A, 0xFD, 0xB4, 0x82, 0xD3, 0x4F, 0xD7, 0x9C, 0x7E, 0x87, 0xDE, 0x1E, - 0x10, 0xFE, 0x77, 0xF3, 0xF8, 0x80, 0xAF, 0x02, 0x5E, 0x2F, 0xE5, 0xAB, 0xD5, 0xDA, 0xA8, 0xDF, 0xE7, 0x3A, 0x49, 0x68, 0x0C, 0x6F, 0x36, 0xE9, 0x24, 0x29, - 0xA6, 0x5B, 0xCA, 0x4E, 0x79, 0xD8, 0x19, 0xEC, 0x66, 0x5C, 0xA2, 0xD9, 0x94, 0xA8, 0x50, 0xDE, 0x3B, 0x3E, 0x13, 0xDA, 0xE9, 0xF2, 0xD4, 0x69, 0x13, 0xEA, - 0x51, 0x7F, 0x11, 0x44, 0x6A, 0x93, 0xCD, 0x24, 0x66, 0x0B, 0x21, 0xC3, 0x55, 0x4E, 0xCC, 0xDE, 0x7F, 0xF7, 0x5D, 0xB1, 0x5C, 0x4C, 0xEC, 0xE5, 0x81, 0xE4, - 0x62, 0x99, 0xB5, 0xD0, 0xDB, 0x05, 0xDC, 0x40, 0xAA, 0x4B, 0x99, 0x6E, 0x04, 0x5E, 0x1B, 0xBC, 0xA4, 0xC7, 0x9A, 0x20, 0xB1, 0x42, 0xC6, 0xAB, 0x3C, 0xED, - 0xA4, 0x80, 0x42, 0xB1, 0x34, 0x22, 0x21, 0xA9, 0x1B, 0x45, 0x5C, 0x19, 0x05, 0x52, 0x81, 0x3D, 0x75, 0xA6, 0x2A, 0xFB, 0x04, 0x6D, 0x92, 0x97, 0x0A, 0x2F, - 0x5C, 0x52, 0x5A, 0x6D, 0x1C, 0xB6, 0x36, 0x78, 0xEF, 0x12, 0xED, 0x95, 0x79, 0xAD, 0xCE, 0x9B, 0xB0, 0x51, 0x30, 0x44, 0xA2, 0x26, 0xE5, 0xE4, 0x0E, 0x3E, - 0xE9, 0xAE, 0x40, 0x5C, 0x6C, 0x57, 0xDD, 0x4E, 0x27, 0xC1, 0x0A, 0x69, 0x57, 0xBB, 0x1A, 0x86, 0x4E, 0x6D, 0xD0, 0xA9, 0x86, 0xA1, 0x5B, 0x1B, 0x74, 0xAB, - 0x61, 0xE8, 0x81, 0x1C, 0x0E, 0x7A, 0xD5, 0x70, 0xF4, 0x6B, 0x83, 0x7E, 0x35, 0x0C, 0x47, 0x20, 0xCB, 0xAA, 0x54, 0x40, 0xE6, 0x72, 0x5C, 0x00, 0x43, 0xFE, - 0x26, 0x47, 0xD6, 0xAA, 0xBA, 0xF3, 0xCC, 0x97, 0x56, 0x69, 0xE7, 0xE1, 0xB0, 0xB5, 0xC1, 0xBB, 0xA5, 0xE5, 0x9B, 0x0B, 0xCB, 0x84, 0x69, 0x7B, 0xA3, 0xAB, - 0x35, 0xB5, 0x76, 0xAF, 0xBD, 0xB7, 0xC3, 0x0C, 0x33, 0xA0, 0x43, 0xED, 0x1D, 0x52, 0x9D, 0x20, 0x09, 0xD3, 0x8F, 0xC5, 0x77, 0x0A, 0x3C, 0x88, 0x70, 0xE6, - 0x3A, 0x8E, 0x5F, 0x5A, 0x1D, 0x01, 0x30, 0xA4, 0xF9, 0x70, 0x54, 0x3A, 0x9A, 0x45, 0x68, 0xCA, 0x18, 0x7A, 0xCA, 0x26, 0xE7, 0x8A, 0xE1, 0x4C, 0x2F, 0x16, - 0xCE, 0x76, 0xE7, 0x3E, 0xDE, 0x6D, 0xF9, 0x94, 0x81, 0xC3, 0xC2, 0x6C, 0xF5, 0x16, 0x66, 0x88, 0x73, 0x54, 0x98, 0xD6, 0x68, 0x81, 0xFB, 0xE8, 0xBD, 0x5D, - 0x7A, 0x4F, 0x40, 0x46, 0xC1, 0x37, 0xB0, 0x89, 0xDE, 0xF3, 0x30, 0x9C, 0x87, 0xEA, 0x83, 0x58, 0xE3, 0x5E, 0x79, 0x8D, 0x04, 0xD0, 0x90, 0x0F, 0xE0, 0x7B, - 0xF0, 0x2A, 0xF9, 0x91, 0x80, 0xAC, 0x9C, 0x23, 0x55, 0x77, 0x1A, 0xA9, 0x2B, 0x56, 0xCC, 0x0B, 0xDA, 0x95, 0x47, 0xF5, 0xCE, 0x43, 0x1C, 0x0B, 0x17, 0xF8, - 0xEA, 0x44, 0xA2, 0xB6, 0xBD, 0x92, 0x22, 0x13, 0x93, 0x48, 0x06, 0xCB, 0x8D, 0x86, 0x6D, 0x2B, 0xDF, 0x69, 0xE6, 0x1F, 0x10, 0xB0, 0xBE, 0xDA, 0x54, 0x7C, - 0x15, 0x5E, 0x60, 0x4E, 0x36, 0x11, 0x08, 0x79, 0x7D, 0x70, 0xB3, 0x00, 0x24, 0xAC, 0xF4, 0x34, 0x80, 0x03, 0x73, 0x15, 0x86, 0x91, 0xB8, 0xA3, 0x17, 0x88, - 0xC4, 0xE2, 0x8C, 0x20, 0xC4, 0x57, 0x72, 0xB4, 0xBB, 0xF7, 0xF4, 0xBF, 0x2B, 0x0F, 0x1E, 0x15, 0x5D, 0xBF, 0x60, 0x1A, 0x2C, 0xC1, 0x80, 0xEF, 0x0B, 0xD4, - 0x8B, 0x24, 0xF4, 0x9B, 0x0B, 0x1F, 0xC2, 0x5A, 0x21, 0x35, 0x38, 0x3A, 0x74, 0x13, 0x9F, 0xCD, 0xF3, 0x0B, 0x2C, 0xFF, 0xA5, 0x36, 0xD9, 0x4C, 0x75, 0x67, - 0x65, 0xDA, 0xC5, 0xAB, 0x3B, 0x3F, 0x99, 0xF6, 0xD8, 0x59, 0x15, 0x2B, 0xF0, 0x88, 0x1D, 0xFD, 0x05, 0x0A, 0x3C, 0x34, 0x3D, 0xC0, 0x15, 0xE2, 0xA6, 0x4B, - 0xD4, 0xDE, 0x67, 0x93, 0x14, 0x32, 0x83, 0xBE, 0xC1, 0x05, 0x56, 0x40, 0xE1, 0x69, 0x74, 0xBD, 0x79, 0xDB, 0x99, 0xDA, 0xCF, 0xA7, 0x62, 0xAE, 0xC6, 0x29, - 0x50, 0xCB, 0xD5, 0xBA, 0x92, 0x72, 0xF3, 0xBD, 0x57, 0xD0, 0x7F, 0x59, 0xE7, 0xE7, 0xF6, 0xDE, 0xF9, 0xD9, 0xC4, 0x00, 0x44, 0xEC, 0x71, 0x69, 0xCB, 0x42, - 0xD8, 0xC8, 0xAE, 0x2E, 0xED, 0xF1, 0x4E, 0xAD, 0x8A, 0xF5, 0x5E, 0x5A, 0x07, 0xED, 0x7E, 0xBB, 0xF3, 0xB0, 0xCC, 0x0A, 0x19, 0xAA, 0x60, 0x54, 0xFA, 0x49, - 0xEF, 0x01, 0x4D, 0x69, 0x9C, 0xC9, 0x84, 0xAD, 0x6B, 0x96, 0x33, 0x2D, 0x0E, 0x7E, 0x43, 0x9F, 0xD2, 0xF5, 0xC8, 0x6E, 0xE3, 0x55, 0xD8, 0x79, 0xC1, 0xD2, - 0x8C, 0xA0, 0x8B, 0xFE, 0xC3, 0x32, 0x2D, 0xCE, 0x91, 0xAA, 0x75, 0x49, 0x38, 0xEA, 0x3E, 0x1C, 0xD3, 0xF2, 0x1D, 0xDF, 0xB0, 0x4A, 0x5B, 0x16, 0x83, 0x06, - 0xC3, 0xFA, 0x88, 0x07, 0xDA, 0x15, 0xF0, 0xB9, 0x53, 0xE3, 0x0A, 0xFA, 0x2F, 0x1F, 0xB8, 0x8E, 0xBB, 0x1B, 0x52, 0x46, 0x05, 0x96, 0x7E, 0x59, 0x67, 0xA9, - 0x52, 0xE8, 0xEA, 0x6F, 0x68, 0x91, 0x7C, 0x23, 0xA1, 0x6B, 0xE9, 0xE3, 0xD5, 0xD2, 0xA1, 0x8B, 0x81, 0x63, 0xE8, 0xA2, 0x47, 0xBB, 0x37, 0xB1, 0x90, 0x82, - 0xF2, 0x36, 0xD6, 0x3B, 0xD9, 0xE4, 0x16, 0x98, 0x4D, 0x44, 0x30, 0xC6, 0x53, 0x25, 0x23, 0xDB, 0x94, 0xDF, 0x54, 0x36, 0xB2, 0x91, 0xA1, 0xFC, 0x8E, 0x37, - 0x8A, 0x4C, 0xCC, 0xE6, 0x19, 0x2C, 0xCC, 0xE1, 0xD8, 0xC1, 0x4E, 0x2B, 0x36, 0x41, 0xE7, 0x1B, 0x5F, 0xA8, 0x0D, 0xB9, 0x7A, 0x48, 0xF5, 0x99, 0xA1, 0x69, - 0xDB, 0x65, 0xD5, 0xC4, 0x61, 0x6B, 0x83, 0x97, 0xEC, 0x60, 0xB7, 0x4B, 0xEA, 0xBC, 0xF3, 0xCD, 0xAF, 0xA7, 0x07, 0x5C, 0xED, 0x5A, 0x4D, 0x89, 0x22, 0x86, - 0x1B, 0x7E, 0xF7, 0xA3, 0xC6, 0xF7, 0xA8, 0x46, 0xDF, 0x01, 0x79, 0x38, 0x25, 0x8D, 0xA9, 0x31, 0xC7, 0x87, 0x97, 0x8B, 0x16, 0x35, 0xDE, 0x20, 0x58, 0xB1, - 0x9A, 0x46, 0xBC, 0xA7, 0x87, 0x5D, 0xD5, 0x18, 0xC4, 0xDF, 0x5A, 0x09, 0x84, 0x37, 0x87, 0xA6, 0xE1, 0xE1, 0x83, 0xFE, 0x70, 0xAC, 0xBD, 0x84, 0x63, 0xED, - 0xBD, 0xB5, 0x0C, 0x5F, 0xBB, 0x2B, 0x73, 0x08, 0x71, 0x3F, 0x5B, 0x84, 0x21, 0xED, 0xA9, 0x05, 0xBA, 0x8D, 0x8F, 0x3F, 0xE0, 0x05, 0xC7, 0xB8, 0x7B, 0xAD, - 0xD7, 0x3D, 0x6E, 0xD5, 0x34, 0x96, 0x15, 0xF3, 0xC7, 0xFA, 0xBD, 0x2F, 0x74, 0x5B, 0x9B, 0x1E, 0x12, 0x28, 0x73, 0x00, 0x91, 0xDE, 0x90, 0x40, 0x6A, 0xBF, - 0x55, 0x76, 0x9B, 0xAD, 0x4B, 0x44, 0x0F, 0xC4, 0xD1, 0x92, 0x1A, 0x42, 0xEC, 0x3D, 0x9B, 0xAC, 0x7D, 0xFC, 0x05, 0x05, 0xED, 0x9E, 0xEC, 0xFD, 0xA7, 0x72, - 0x41, 0xE8, 0x52, 0x41, 0xE0, 0xEE, 0xBE, 0xCD, 0xF2, 0xD4, 0x0E, 0x78, 0xD2, 0xD5, 0x78, 0x6A, 0x57, 0xE0, 0xA9, 0xBD, 0x23, 0x9E, 0x3A, 0x01, 0x4F, 0x6D, - 0x35, 0x9E, 0x3A, 0x15, 0x78, 0xEA, 0xEC, 0x88, 0xA7, 0x6E, 0xC0, 0x53, 0x47, 0x8D, 0xA7, 0x6E, 0x05, 0x9E, 0xBA, 0x3B, 0xE2, 0xA9, 0x17, 0xF0, 0xD4, 0x55, - 0xE3, 0xA9, 0x57, 0x81, 0xA7, 0xDE, 0x8E, 0x78, 0xEA, 0x07, 0x3C, 0xF5, 0xD4, 0x78, 0xEA, 0x57, 0xE0, 0xA9, 0xBF, 0x23, 0x9E, 0x8E, 0x02, 0x9E, 0xFA, 0x6A, - 0x3C, 0x1D, 0x55, 0xE0, 0xE9, 0x68, 0x47, 0x3C, 0x1D, 0x07, 0x3C, 0x1D, 0xA9, 0xF1, 0x74, 0x5C, 0x81, 0xA7, 0xE3, 0x1D, 0xF1, 0x74, 0x12, 0xF0, 0x74, 0xAC, - 0xC6, 0xD3, 0x49, 0x05, 0x9E, 0x4E, 0x76, 0xC4, 0x13, 0xEE, 0xA6, 0x62, 0x4C, 0x9D, 0x28, 0x0E, 0xBA, 0xAD, 0x0A, 0x5C, 0x19, 0xBB, 0xE2, 0x2A, 0x4C, 0x25, - 0x74, 0xD5, 0x5C, 0xA2, 0x4A, 0x32, 0x31, 0xDC, 0x15, 0x5B, 0x51, 0x36, 0xA1, 0x98, 0x4E, 0xE8, 0x55, 0xF2, 0x89, 0xD1, 0xAE, 0xD8, 0x0A, 0x13, 0x0A, 0x5D, - 0x31, 0xA3, 0xD0, 0xAB, 0xA4, 0x14, 0xE3, 0x5D, 0xB1, 0x15, 0xE6, 0x14, 0xBA, 0x62, 0x52, 0xA1, 0x57, 0xC9, 0x2A, 0xC8, 0xAE, 0xD8, 0x0A, 0xD3, 0x0A, 0x5D, - 0x31, 0xAF, 0xD0, 0xAB, 0x24, 0x16, 0x93, 0x5D, 0xB1, 0x15, 0x66, 0x16, 0xBA, 0x62, 0x6A, 0xA1, 0x57, 0xC8, 0x2D, 0x4E, 0xE4, 0x13, 0xB1, 0x8D, 0xB2, 0x45, - 0x7C, 0x3E, 0x45, 0x8E, 0x26, 0x6D, 0x4A, 0x0F, 0x1C, 0x71, 0x20, 0x7C, 0x22, 0x8E, 0x09, 0xE4, 0xC2, 0xB1, 0x27, 0xE6, 0x34, 0x2C, 0x32, 0x3C, 0x98, 0x67, - 0x63, 0x3C, 0xE1, 0x85, 0xBF, 0xCA, 0x85, 0x86, 0xAB, 0x57, 0x97, 0xC5, 0xCA, 0x0C, 0x62, 0x2F, 0x7F, 0xA1, 0x22, 0x03, 0x90, 0xDD, 0x16, 0xBF, 0x3E, 0xA0, - 0x54, 0x57, 0xA0, 0x40, 0x45, 0x2A, 0x0A, 0x3D, 0xB1, 0xA2, 0xD0, 0x57, 0xAE, 0x28, 0x30, 0xE2, 0xB6, 0x53, 0x4B, 0x00, 0xDC, 0x1D, 0xF6, 0xC9, 0x04, 0x75, - 0xA6, 0x3B, 0xE5, 0x99, 0xEE, 0x15, 0x61, 0xBA, 0x53, 0x86, 0xE9, 0x12, 0xCF, 0xB4, 0x2A, 0xCA, 0x09, 0xE8, 0x7D, 0x6D, 0xDE, 0x90, 0xB1, 0xF6, 0x8B, 0xBA, - 0xA8, 0xF4, 0xF2, 0xA2, 0x3A, 0x2A, 0x22, 0x2A, 0x7D, 0x8B, 0xF6, 0xD1, 0x0B, 0xF8, 0xFE, 0x51, 0x9D, 0xEF, 0x5E, 0x79, 0xBE, 0x3B, 0x45, 0xF8, 0xEE, 0x6D, - 0x91, 0xEF, 0x6E, 0xC0, 0xF7, 0x27, 0x75, 0xBE, 0xBB, 0xE5, 0xF9, 0xEE, 0x16, 0xE1, 0xBB, 0xBB, 0x45, 0xBE, 0xDB, 0x10, 0x6C, 0x7E, 0xFC, 0xA4, 0x7D, 0x9C, - 0xB9, 0xC4, 0x9B, 0xE5, 0x57, 0xE2, 0x18, 0x44, 0xD9, 0xB1, 0xBD, 0xB7, 0x83, 0xB9, 0x1B, 0x52, 0xD8, 0x11, 0x79, 0xCA, 0xCD, 0x9B, 0x19, 0x84, 0xCA, 0x37, - 0x89, 0xE4, 0x3C, 0xC9, 0x67, 0x6E, 0xBA, 0x2A, 0x53, 0xDB, 0x8B, 0x61, 0xC7, 0xB5, 0xC1, 0xDB, 0x65, 0x81, 0xF1, 0xED, 0xB8, 0xBC, 0x3D, 0xAB, 0x57, 0xCC, - 0x19, 0x5D, 0x5B, 0xB3, 0xE7, 0x13, 0xCA, 0x33, 0xE4, 0x65, 0x9E, 0x82, 0xDA, 0xCB, 0x57, 0x21, 0x7A, 0x3B, 0xA8, 0x92, 0x63, 0xA4, 0x3F, 0x62, 0xEC, 0xFC, - 0x88, 0x0C, 0x69, 0x90, 0xB1, 0x14, 0x18, 0x8C, 0x8E, 0x0A, 0x6A, 0xF3, 0xB8, 0x64, 0x74, 0x42, 0x1A, 0xB7, 0xA6, 0x4E, 0x9C, 0x7A, 0xA0, 0x00, 0x3E, 0x95, - 0x10, 0x40, 0xBF, 0xBC, 0x00, 0x0A, 0x65, 0x2E, 0x48, 0xE3, 0xF6, 0x04, 0xD0, 0x62, 0x02, 0xB8, 0x8A, 0x5E, 0x7A, 0x9D, 0x61, 0xD0, 0x15, 0x2A, 0x50, 0xBD, - 0x1D, 0xAC, 0x91, 0x60, 0xA4, 0xD5, 0x03, 0x8B, 0x06, 0x8E, 0x8A, 0x29, 0xB4, 0x5D, 0x34, 0xBF, 0x92, 0x17, 0x3F, 0x15, 0xF2, 0xEF, 0x6D, 0x26, 0x58, 0xED, - 0x56, 0x60, 0xD1, 0xC5, 0x05, 0xD0, 0x2A, 0x2F, 0x00, 0xBD, 0x90, 0x00, 0x5A, 0x0F, 0x2B, 0x19, 0xEF, 0xAF, 0x7F, 0xA7, 0x38, 0x5F, 0x5A, 0x45, 0xDD, 0x5F, - 0x18, 0xCD, 0xDA, 0x45, 0x84, 0xB5, 0x55, 0xEF, 0xEF, 0x44, 0x9C, 0x6B, 0xBF, 0x68, 0xF1, 0xAD, 0xAF, 0x59, 0x71, 0xA0, 0x7C, 0x11, 0xB0, 0xB7, 0x83, 0xF5, - 0x2A, 0xA4, 0xF0, 0x44, 0xC2, 0x59, 0xC1, 0x00, 0x7F, 0x52, 0xDE, 0x1D, 0x0A, 0x69, 0x18, 0x69, 0xDD, 0x9E, 0x8A, 0x7B, 0x31, 0x41, 0xB0, 0x6F, 0xA4, 0xAB, - 0xA8, 0xB8, 0x7C, 0xE5, 0xB0, 0xB7, 0x83, 0xA5, 0x2E, 0xA4, 0xF0, 0x58, 0xC2, 0x59, 0x41, 0x15, 0x17, 0x4D, 0x49, 0x8F, 0x4B, 0x4E, 0x2D, 0xF5, 0x6D, 0xE6, - 0xA4, 0x58, 0xED, 0x16, 0x04, 0x21, 0x7E, 0xC0, 0x22, 0x4B, 0xC1, 0xE5, 0x2B, 0xDE, 0xBD, 0x8A, 0xEB, 0xB3, 0xDB, 0x8B, 0xE4, 0x47, 0xB2, 0xAF, 0x9B, 0xE7, - 0xDB, 0x41, 0xD1, 0x5C, 0xB6, 0x55, 0x72, 0xE0, 0xDB, 0x6A, 0x2A, 0x0B, 0xBD, 0x43, 0xD6, 0xB3, 0xCE, 0x7D, 0x86, 0x09, 0x94, 0x5F, 0x79, 0xEB, 0xED, 0x60, - 0x7B, 0x08, 0x52, 0xD8, 0xAE, 0x0D, 0x3E, 0x15, 0x64, 0xAA, 0x4A, 0xFD, 0xA0, 0xF4, 0xFE, 0x90, 0xDD, 0x95, 0xDE, 0x47, 0xF3, 0x9B, 0xE2, 0xA5, 0xF7, 0x8B, - 0x77, 0x3F, 0x17, 0x2B, 0xBD, 0x8B, 0xBD, 0xEC, 0xAE, 0xF4, 0x5E, 0xCE, 0x66, 0x0A, 0x6D, 0x94, 0x05, 0xC6, 0xF0, 0x55, 0x48, 0x23, 0xD3, 0xA3, 0x5D, 0x82, - 0x60, 0xB4, 0xF7, 0xC1, 0x69, 0x28, 0x22, 0xE1, 0x19, 0xE5, 0x78, 0xFB, 0x2C, 0xEB, 0xE9, 0x64, 0x84, 0x85, 0x52, 0xCF, 0xF0, 0xE2, 0x0B, 0x75, 0xFA, 0xFC, - 0x1B, 0x5F, 0x15, 0x9E, 0x05, 0x4E, 0x7B, 0xD7, 0xC8, 0xC1, 0x51, 0x41, 0xDC, 0x5B, 0x7F, 0xC5, 0xC0, 0x20, 0xA1, 0x28, 0x9D, 0xEA, 0x47, 0xC7, 0x73, 0xE5, - 0x3A, 0x39, 0x05, 0x2B, 0x12, 0xCD, 0x3B, 0x62, 0xA9, 0x45, 0x3D, 0x9A, 0x33, 0xF2, 0xB6, 0x13, 0xCD, 0x11, 0x77, 0x8C, 0xF7, 0x02, 0x59, 0x0D, 0x83, 0x2D, - 0x26, 0x00, 0xF9, 0x26, 0x0A, 0x05, 0x01, 0xA4, 0x49, 0x60, 0x23, 0x22, 0x68, 0x53, 0x09, 0xB4, 0x13, 0xDA, 0x4F, 0x09, 0xFC, 0xB4, 0x7D, 0xD9, 0xB8, 0xDF, - 0xD9, 0x41, 0x6D, 0x02, 0xC5, 0x15, 0xE3, 0xA8, 0xA0, 0x4E, 0x8B, 0x2D, 0x0E, 0xC6, 0x74, 0x5A, 0xCC, 0xA8, 0xB7, 0xB6, 0x3A, 0x08, 0xC8, 0x3B, 0x54, 0x00, - 0x1D, 0x65, 0x95, 0x96, 0x9F, 0x66, 0x76, 0x76, 0x90, 0x9F, 0xA0, 0xB4, 0x62, 0x1C, 0x15, 0x54, 0x69, 0xB1, 0xA5, 0xCF, 0x98, 0x4A, 0xD5, 0xE7, 0x97, 0x9C, - 0xC8, 0xAD, 0xA9, 0xB4, 0x4B, 0x05, 0xD0, 0x55, 0x56, 0x69, 0xF9, 0x59, 0x47, 0x67, 0x07, 0xBB, 0x77, 0x51, 0x5A, 0x31, 0x8E, 0x0A, 0xAA, 0xB4, 0xD8, 0x92, - 0x5D, 0x4C, 0xA5, 0xEA, 0xF3, 0x49, 0x4E, 0xE4, 0xD6, 0x54, 0xDA, 0xA3, 0x02, 0xE8, 0x29, 0xAB, 0xB4, 0x7C, 0xA5, 0xA0, 0xB3, 0x83, 0x62, 0x10, 0x4A, 0x2B, - 0xC6, 0x51, 0x41, 0x95, 0x16, 0x5B, 0x7D, 0x8E, 0xA9, 0x54, 0x7D, 0x9D, 0x83, 0x13, 0xB9, 0x35, 0x95, 0xF6, 0xA9, 0x00, 0xFA, 0xCA, 0x2A, 0x2D, 0xBF, 0xBF, - 0xAA, 0xB3, 0x83, 0xBD, 0xDB, 0x28, 0xAD, 0x18, 0x47, 0x05, 0x55, 0x5A, 0xAC, 0x74, 0x1B, 0x53, 0xA9, 0xFA, 0xCA, 0x0D, 0x27, 0x72, 0x6B, 0x2A, 0x3D, 0xA2, - 0x02, 0x38, 0x52, 0x56, 0x69, 0xF9, 0xAD, 0xEB, 0x9D, 0x1D, 0xD4, 0xF3, 0x50, 0x5A, 0x31, 0x8E, 0x0A, 0xAA, 0xB4, 0x58, 0x05, 0x27, 0xA6, 0x52, 0xF5, 0xBD, - 0x53, 0x9C, 0xC8, 0xAD, 0xA9, 0xF4, 0x98, 0x0A, 0xE0, 0x58, 0x59, 0xA5, 0xE5, 0x77, 0xEE, 0x77, 0x76, 0xB0, 0x73, 0x1F, 0xA5, 0x15, 0xE3, 0xA8, 0xA0, 0x4A, - 0x8B, 0xD5, 0x66, 0x63, 0x2A, 0x55, 0xDF, 0xEE, 0xC4, 0x89, 0xDC, 0x9A, 0x4A, 0x4F, 0xA8, 0x00, 0x4E, 0x94, 0x55, 0x5A, 0x7E, 0xCB, 0x40, 0x67, 0x07, 0x9B, - 0x5F, 0x50, 0x5A, 0x2D, 0x91, 0xA3, 0x82, 0x2A, 0x2D, 0xB6, 0xC0, 0xD8, 0x49, 0xD9, 0xFA, 0xA2, 0xA0, 0xD2, 0xB4, 0x05, 0xC6, 0x07, 0x50, 0xBF, 0x33, 0x56, - 0xC3, 0x12, 0x1F, 0xFC, 0x79, 0xF1, 0xD3, 0xCB, 0xF4, 0xC2, 0x7E, 0x6A, 0x15, 0x2F, 0xD6, 0xD7, 0x43, 0x2F, 0xE3, 0x89, 0xF2, 0x42, 0xC2, 0x41, 0xCB, 0xEC, - 0x25, 0x91, 0xDA, 0x1A, 0xF3, 0xD9, 0x96, 0xC6, 0x80, 0x0B, 0x58, 0x5A, 0xA7, 0xDB, 0x92, 0x27, 0x2D, 0x39, 0x96, 0xC6, 0xA9, 0xDC, 0x4E, 0xF0, 0x40, 0xE4, - 0x30, 0x17, 0x47, 0xDE, 0x3F, 0x28, 0xAD, 0xE9, 0x30, 0x80, 0x78, 0xF8, 0xE8, 0xB6, 0x4E, 0x14, 0xE3, 0x07, 0xC8, 0x20, 0x6D, 0x63, 0xFC, 0x06, 0x03, 0x08, - 0xD2, 0xD8, 0x61, 0x4C, 0xBD, 0x51, 0x66, 0x2A, 0x59, 0x05, 0x28, 0xC4, 0x54, 0x5A, 0x65, 0x67, 0xC3, 0x4C, 0x75, 0x19, 0x53, 0x19, 0x4E, 0x9A, 0x60, 0x2A, - 0x39, 0x0F, 0x2E, 0xC4, 0x54, 0xDA, 0x44, 0x38, 0x62, 0xEA, 0x21, 0x04, 0x3A, 0x32, 0x32, 0xA6, 0xA3, 0x12, 0xA1, 0xEE, 0xF2, 0xE2, 0xF0, 0xC5, 0x9B, 0x0B, - 0x8D, 0x2E, 0x69, 0x3A, 0x56, 0xC1, 0x88, 0x17, 0xEF, 0xF4, 0x2F, 0x15, 0xF3, 0x28, 0xE9, 0x42, 0xD4, 0x7B, 0x73, 0xA1, 0x1A, 0xF0, 0x38, 0x64, 0x91, 0x90, - 0xD7, 0x6B, 0x75, 0xCA, 0x54, 0x08, 0x43, 0x22, 0xB7, 0x14, 0xF4, 0x28, 0xFA, 0x76, 0x24, 0x83, 0xCB, 0x62, 0x32, 0x28, 0x54, 0x25, 0x8D, 0xCB, 0xA0, 0x40, - 0xD8, 0x0F, 0x88, 0xDC, 0xA6, 0x0C, 0x30, 0x4A, 0x5E, 0x5E, 0x68, 0xEF, 0xFF, 0xA9, 0x5D, 0xDE, 0x2C, 0x1C, 0x6F, 0xE9, 0x92, 0xDC, 0xA8, 0xC2, 0xE1, 0xE2, - 0x71, 0xA5, 0xDF, 0xEB, 0x75, 0x54, 0x03, 0x4B, 0x2F, 0x7D, 0x08, 0x98, 0xB4, 0x36, 0x18, 0x2F, 0x29, 0xA1, 0xDD, 0x90, 0xC1, 0x0F, 0x04, 0x34, 0xAD, 0x14, - 0x37, 0x39, 0x60, 0x9C, 0x43, 0xBD, 0x85, 0xDB, 0xAB, 0x15, 0x19, 0x94, 0x67, 0x94, 0x9D, 0x8D, 0x0E, 0x07, 0x94, 0xCA, 0x5E, 0xC8, 0xDE, 0xA7, 0x8F, 0x57, - 0x6A, 0x8C, 0x25, 0xEB, 0x68, 0xC5, 0x54, 0x97, 0xF6, 0xC8, 0x68, 0xC1, 0x41, 0x41, 0xDE, 0xE8, 0xEC, 0x10, 0x62, 0xEC, 0xBA, 0x6C, 0x52, 0x44, 0x76, 0x36, - 0x31, 0xA7, 0x60, 0xB0, 0x72, 0x59, 0x52, 0x19, 0xB2, 0xB7, 0x9A, 0xE2, 0x17, 0x48, 0x9B, 0x23, 0x08, 0xF3, 0xA0, 0x7B, 0xF4, 0xAE, 0x40, 0xB2, 0x73, 0x63, - 0x4A, 0xA2, 0xEB, 0x1A, 0x0B, 0xE2, 0x59, 0xC1, 0xD9, 0x60, 0x08, 0x8D, 0x6B, 0xC2, 0x3F, 0x97, 0xAA, 0xCD, 0x5C, 0x32, 0x39, 0xAF, 0x7D, 0x13, 0xE2, 0xE4, - 0x8F, 0xDF, 0x61, 0x93, 0x9A, 0x36, 0x76, 0x56, 0xB6, 0xE5, 0x18, 0x18, 0xF8, 0x8D, 0x85, 0x0F, 0x94, 0x1E, 0xFC, 0xB1, 0xC0, 0x37, 0x5C, 0x19, 0xF8, 0xB4, - 0x96, 0x91, 0xD1, 0x8F, 0xA0, 0xFE, 0x91, 0xE5, 0x78, 0xC1, 0xB4, 0x0D, 0x0F, 0xC3, 0xCF, 0xAB, 0xFE, 0xCF, 0x7F, 0xE7, 0x6D, 0x15, 0x30, 0xE7, 0x53, 0x41, - 0x00, 0x35, 0xCD, 0x73, 0x47, 0xE7, 0x35, 0xA0, 0xD4, 0x75, 0x3C, 0xCF, 0x71, 0xCD, 0xA9, 0x99, 0x32, 0x36, 0xA7, 0x49, 0xFB, 0x50, 0x26, 0xEE, 0x44, 0x63, - 0xC9, 0xB0, 0x7F, 0xE6, 0x8D, 0x5C, 0x73, 0xE1, 0x0F, 0x1E, 0x8D, 0x9D, 0xD1, 0x72, 0x4E, 0x6C, 0xFF, 0xC0, 0x18, 0x8F, 0x2F, 0xAF, 0xE1, 0xE0, 0x3B, 0xFC, - 0x16, 0x1F, 0x48, 0xBE, 0x51, 0x7F, 0xF5, 0xAF, 0x77, 0x38, 0x0C, 0xE3, 0x35, 0x90, 0x17, 0x19, 0xD7, 0xF7, 0xB5, 0xC9, 0xD2, 0x66, 0x23, 0x61, 0x83, 0x60, - 0xDB, 0x3D, 0xED, 0x2B, 0x60, 0xBC, 0x36, 0x5C, 0x6D, 0x68, 0x78, 0xE4, 0xAD, 0xE3, 0xF9, 0xDA, 0xB9, 0x16, 0x62, 0xB4, 0x9C, 0x11, 0xDD, 0xB7, 0x71, 0xC0, - 0xF8, 0xE2, 0x2D, 0x19, 0xE3, 0x3F, 0xBA, 0x16, 0x34, 0x0D, 0xA1, 0x9E, 0x6A, 0xF5, 0xD3, 0x63, 0xBD, 0x8E, 0xF6, 0x17, 0x76, 0x31, 0x21, 0x10, 0xE6, 0xA1, - 0x5D, 0x63, 0xE9, 0x5A, 0xFB, 0xDA, 0x68, 0xB8, 0xF7, 0x95, 0x52, 0x4F, 0x2F, 0xE3, 0xB5, 0x3D, 0xCE, 0xCC, 0x81, 0x3F, 0x23, 0x76, 0x23, 0xA2, 0xCC, 0x25, - 0xDE, 0xC2, 0xB1, 0x3D, 0xC2, 0x88, 0x63, 0x3F, 0x73, 0x12, 0x5D, 0x3F, 0xF0, 0x7C, 0xC3, 0x5F, 0x7A, 0xDA, 0xE3, 0xF3, 0x73, 0xAD, 0xDD, 0x6A, 0x89, 0xCD, - 0x34, 0xE8, 0x26, 0xD9, 0x6E, 0x5F, 0x4B, 0x5C, 0xF8, 0x48, 0x6E, 0xFC, 0xBD, 0x67, 0x21, 0xCC, 0x9D, 0x46, 0x2C, 0x8F, 0xC4, 0x90, 0x84, 0x00, 0xF8, 0xDE, - 0xB8, 0xC6, 0x5E, 0x9C, 0xC0, 0xC6, 0xD8, 0xF0, 0x8D, 0xBD, 0xAF, 0x31, 0x7D, 0x41, 0xAF, 0x40, 0xC9, 0xBE, 0x46, 0x6F, 0x3D, 0x13, 0x6E, 0xDD, 0xED, 0x1D, - 0x80, 0x0C, 0x81, 0xDF, 0x10, 0x9A, 0xB8, 0x6E, 0x9C, 0x62, 0x0A, 0xDD, 0xD4, 0xF7, 0x35, 0xBC, 0x13, 0x87, 0x15, 0x88, 0x7C, 0x14, 0x5C, 0x0B, 0x84, 0x96, - 0x8D, 0x56, 0x82, 0x92, 0xA1, 0xBB, 0x8B, 0xA9, 0x08, 0x02, 0xCE, 0x07, 0x32, 0x05, 0x89, 0x4D, 0xF7, 0x79, 0xFC, 0xD9, 0xA7, 0xC1, 0x67, 0x9F, 0xC5, 0x2D, - 0x41, 0x6B, 0x87, 0x87, 0xE0, 0xD2, 0x9E, 0x63, 0x11, 0xB0, 0x8A, 0x69, 0xA3, 0xCE, 0xBF, 0xF5, 0x0A, 0x16, 0x55, 0x6F, 0xDD, 0xD4, 0x9F, 0x02, 0x82, 0x03, - 0xDF, 0xB9, 0xF2, 0x5D, 0xD3, 0x9E, 0x36, 0xF4, 0xFE, 0x5E, 0x84, 0x8D, 0xDE, 0x46, 0x94, 0x89, 0xFB, 0xF4, 0x3A, 0xED, 0x24, 0x79, 0xA3, 0xC1, 0xAF, 0x3F, - 0xAD, 0xEF, 0xD5, 0x39, 0xF1, 0xF4, 0x1C, 0xCC, 0xAD, 0xC1, 0x0E, 0x9E, 0x50, 0x1A, 0xF7, 0xB4, 0xB3, 0x33, 0xDE, 0x0D, 0x6B, 0x85, 0x17, 0xA1, 0x11, 0xFD, - 0x93, 0xB8, 0x15, 0x9A, 0xE2, 0xEF, 0xFF, 0xF8, 0x1A, 0xD8, 0xEC, 0xDD, 0x21, 0x50, 0xFD, 0x1C, 0x43, 0xF0, 0x3F, 0xBE, 0xC2, 0xFF, 0x77, 0x4F, 0x68, 0xD4, - 0xFD, 0xC7, 0x57, 0xFC, 0x73, 0xF7, 0x04, 0x7A, 0x82, 0x63, 0xDA, 0xDF, 0xDD, 0xEF, 0x54, 0x0E, 0xEB, 0xD2, 0x9B, 0xA6, 0x4A, 0x2F, 0x14, 0x5B, 0x61, 0x9A, - 0xA6, 0x19, 0x44, 0xFD, 0x1E, 0xF9, 0x6F, 0x63, 0xE4, 0x8C, 0x41, 0x3D, 0x3E, 0x58, 0x72, 0xA0, 0x74, 0x0B, 0x54, 0x12, 0x08, 0xAA, 0x15, 0x28, 0xDD, 0x9C, - 0xD0, 0x96, 0x1A, 0x77, 0x95, 0xC8, 0x40, 0x82, 0x96, 0x0B, 0xC3, 0xF5, 0xC8, 0xB7, 0xB6, 0xDF, 0xF0, 0x63, 0x4E, 0x91, 0x22, 0xF1, 0xC1, 0x20, 0xC6, 0x02, - 0xFE, 0x00, 0x0E, 0xDA, 0xD5, 0xB9, 0xD2, 0x42, 0x63, 0xE3, 0x7F, 0x13, 0x66, 0xF3, 0xA6, 0x90, 0xD9, 0x34, 0xA8, 0xD8, 0xC2, 0x3E, 0xF7, 0x8A, 0x98, 0x10, - 0x90, 0x25, 0x18, 0x10, 0x75, 0x88, 0x48, 0x64, 0xEC, 0x62, 0x8A, 0x43, 0xFC, 0x3C, 0xB2, 0xBE, 0x34, 0x6E, 0xE0, 0xBF, 0x64, 0xCC, 0x5A, 0xD3, 0x15, 0x36, - 0x7A, 0x8E, 0xFF, 0x81, 0x82, 0xF0, 0x4F, 0xAA, 0xA1, 0x00, 0xD6, 0xF7, 0x96, 0xD5, 0x60, 0x1F, 0x98, 0x03, 0x1B, 0x59, 0x42, 0x3C, 0xF4, 0x6E, 0x31, 0x32, - 0x39, 0x8E, 0xFF, 0x79, 0x5F, 0x5B, 0xB8, 0x40, 0x18, 0xFD, 0x96, 0x0A, 0x1C, 0x03, 0x22, 0x62, 0xB3, 0xBF, 0xB9, 0x14, 0x2C, 0x2C, 0xEB, 0x39, 0xC3, 0x0A, - 0x24, 0xB0, 0x03, 0x30, 0x99, 0x25, 0x9A, 0x2E, 0xFC, 0x7F, 0xF7, 0x04, 0x3A, 0x81, 0x43, 0xF8, 0xFF, 0xEE, 0x09, 0x76, 0x85, 0x46, 0x85, 0x3D, 0xDE, 0x3D, - 0x81, 0x1E, 0xE1, 0x04, 0xFE, 0x87, 0x36, 0xD8, 0x2F, 0xB6, 0xC2, 0xBF, 0x70, 0x87, 0xF6, 0x8F, 0x37, 0xE9, 0x01, 0xBB, 0xC0, 0x4F, 0xB3, 0x18, 0x64, 0x6F, - 0xD7, 0x6F, 0xD0, 0xB7, 0x9D, 0x7F, 0xBE, 0x01, 0x76, 0xE8, 0xC1, 0x2D, 0xC4, 0x20, 0x7B, 0x8C, 0xE7, 0xF8, 0xE7, 0x36, 0x50, 0x30, 0x5E, 0xE0, 0x47, 0x70, - 0x8D, 0xBE, 0x11, 0x16, 0x2F, 0xB1, 0x03, 0x6C, 0x45, 0xDF, 0xDF, 0x49, 0x5B, 0xB1, 0x23, 0xB8, 0xC6, 0xDF, 0xFA, 0xB8, 0xAF, 0xF1, 0xF7, 0x0A, 0xE6, 0x0A, - 0x27, 0x7A, 0xEF, 0xDF, 0x73, 0xEF, 0x06, 0x19, 0x64, 0xA4, 0xA1, 0x54, 0xC2, 0xB3, 0xDB, 0xBB, 0x27, 0x04, 0xEF, 0x51, 0x22, 0xE1, 0xF8, 0x96, 0x1F, 0xC3, - 0x75, 0xA0, 0x0F, 0xEF, 0x04, 0x04, 0xD3, 0x0B, 0xB7, 0xD1, 0x05, 0x68, 0xE1, 0xE3, 0x7D, 0x4E, 0x3C, 0x9C, 0xDD, 0x86, 0x67, 0x08, 0x4D, 0x61, 0x39, 0x1B, - 0x70, 0x7A, 0x1B, 0x9D, 0xC2, 0x5D, 0xE4, 0x05, 0x15, 0xC0, 0x79, 0xBA, 0x7B, 0xC2, 0x79, 0x42, 0x2D, 0xB2, 0xA3, 0xB8, 0xA8, 0xE1, 0x7F, 0xF4, 0x23, 0x9F, - 0x07, 0xEC, 0x4F, 0x81, 0x77, 0x12, 0x6B, 0x4F, 0x3B, 0x1F, 0xF0, 0xB8, 0x8F, 0x01, 0x00, 0x3C, 0x0A, 0xAE, 0x13, 0xEB, 0xC0, 0xF0, 0xC1, 0x21, 0x20, 0x6F, - 0x22, 0xDE, 0x01, 0x46, 0x94, 0xD0, 0xCD, 0xD7, 0x6E, 0x1D, 0xD8, 0xE0, 0x16, 0x14, 0xE1, 0xDE, 0x29, 0x0F, 0x1B, 0x88, 0x88, 0x71, 0xB9, 0x86, 0x8B, 0x5D, - 0x4E, 0x43, 0xC7, 0xEE, 0xA6, 0x60, 0xE4, 0xA1, 0x30, 0x0E, 0x81, 0x17, 0xD3, 0xB0, 0xD1, 0x51, 0x43, 0xC0, 0xD5, 0xEE, 0xF5, 0x22, 0x6C, 0x89, 0x48, 0xC7, - 0xE6, 0x94, 0x28, 0x90, 0x03, 0xCC, 0xCF, 0xA3, 0xA1, 0x70, 0x04, 0xE6, 0xA0, 0xD5, 0x83, 0x09, 0x65, 0xFD, 0x74, 0x2D, 0xC2, 0x01, 0x04, 0x2F, 0x20, 0x68, - 0xCF, 0x19, 0x8D, 0xA7, 0x51, 0xF8, 0xD4, 0xB4, 0x21, 0x24, 0x3B, 0x5F, 0x9E, 0xC5, 0x90, 0xD1, 0xD4, 0x3F, 0xC4, 0xC4, 0xAE, 0x61, 0xA2, 0x90, 0xB8, 0xC4, - 0xB6, 0xDB, 0x35, 0x1D, 0x9B, 0xC8, 0x7B, 0x8D, 0xC5, 0x4B, 0xDE, 0x11, 0x3F, 0x1B, 0x93, 0x89, 0xB1, 0xB4, 0xFC, 0x08, 0xCC, 0x25, 0x90, 0xE8, 0xDA, 0x3C, - 0x6C, 0xB1, 0x24, 0x3F, 0x77, 0xE8, 0xCE, 0x18, 0x2A, 0x82, 0x51, 0xE1, 0x71, 0x72, 0x54, 0x00, 0xAB, 0x74, 0xFD, 0x46, 0xFD, 0xD2, 0x75, 0x1D, 0xF7, 0xD7, - 0xFA, 0x53, 0x6C, 0xF4, 0xB4, 0xFE, 0xDB, 0xA9, 0x46, 0xE3, 0xE9, 0x5E, 0x3C, 0xB8, 0x0B, 0xE1, 0xF3, 0xF0, 0x50, 0x7B, 0xE1, 0xFB, 0x06, 0x28, 0x00, 0x6B, - 0x2C, 0x33, 0x94, 0x8F, 0x66, 0xF0, 0x24, 0xD0, 0x71, 0xD1, 0x28, 0xD9, 0xF7, 0xEE, 0x41, 0x22, 0x98, 0x58, 0x7A, 0x00, 0x12, 0x24, 0x99, 0x14, 0xD5, 0xC1, - 0xBF, 0x97, 0xC4, 0xBD, 0xBD, 0xA2, 0x02, 0x73, 0xDC, 0x17, 0x10, 0x2A, 0xEB, 0x07, 0xD1, 0x3C, 0xA9, 0xCE, 0x72, 0x9E, 0x03, 0x40, 0x75, 0x09, 0x7D, 0x80, - 0x8E, 0x23, 0x9B, 0x67, 0xDC, 0x84, 0x7A, 0x87, 0x71, 0xEE, 0x9C, 0x2B, 0x23, 0x99, 0x64, 0x41, 0x0B, 0xC7, 0xFE, 0x42, 0x6E, 0x97, 0x0B, 0x10, 0x7F, 0x94, - 0x36, 0x25, 0x12, 0x39, 0x2E, 0x1D, 0x72, 0x00, 0x2D, 0x2F, 0xF8, 0xC0, 0xA9, 0x77, 0x24, 0x8D, 0x22, 0x15, 0x50, 0xEB, 0x44, 0x4F, 0x7C, 0xB6, 0xD6, 0xE8, - 0xEE, 0x91, 0xFC, 0x4C, 0x92, 0x72, 0x72, 0x02, 0xB9, 0xF0, 0xC0, 0xB5, 0xA9, 0x63, 0x27, 0x7A, 0x48, 0xA4, 0x83, 0x90, 0x0C, 0x46, 0x91, 0x61, 0xB9, 0x80, - 0xE4, 0x93, 0xC4, 0x83, 0x43, 0x68, 0x0B, 0xC1, 0xCD, 0xB9, 0xE3, 0x93, 0x44, 0xC4, 0x30, 0x6D, 0xD3, 0x37, 0x0D, 0xEB, 0x53, 0x64, 0x8D, 0x5B, 0x75, 0x7F, - 0x89, 0x8F, 0x17, 0xF0, 0xFF, 0xB5, 0x9C, 0x4F, 0x2D, 0x4F, 0x59, 0xB3, 0x90, 0x30, 0x1E, 0x44, 0x56, 0x22, 0xCA, 0x21, 0x16, 0x16, 0xF8, 0xFD, 0xA0, 0xA7, - 0xC7, 0x8F, 0xE9, 0xD1, 0xA3, 0x50, 0x69, 0x41, 0xF4, 0x38, 0xD7, 0xA2, 0x1B, 0x09, 0x05, 0xAF, 0xE3, 0x4E, 0xE0, 0x08, 0x90, 0x0B, 0x18, 0x12, 0x81, 0x7F, - 0x01, 0xE9, 0x0D, 0xDA, 0xC2, 0xFF, 0x47, 0xFD, 0x07, 0x14, 0xF5, 0xB7, 0x17, 0xE2, 0x33, 0x6C, 0x3B, 0xE1, 0x01, 0x0C, 0x4E, 0x9E, 0x4F, 0x3F, 0x85, 0x44, - 0x5B, 0x9E, 0x24, 0x87, 0xA1, 0x3B, 0x9C, 0xEC, 0xC3, 0x64, 0xE6, 0x92, 0x85, 0xE7, 0x97, 0xB7, 0xDF, 0x8E, 0x1B, 0xF5, 0xF0, 0x8D, 0x46, 0xF5, 0x3D, 0x8C, - 0x4B, 0x96, 0x39, 0xFA, 0x12, 0x86, 0xA5, 0xC8, 0xF2, 0x20, 0xA5, 0xC1, 0xEC, 0x1F, 0x27, 0xD6, 0xE6, 0x88, 0x9B, 0xEA, 0xAB, 0x0F, 0x2F, 0xDE, 0x7D, 0x7E, - 0xF1, 0xF1, 0xE3, 0x07, 0x6D, 0x09, 0x36, 0xAB, 0xF7, 0x3F, 0x63, 0xDA, 0x02, 0x93, 0x00, 0xF7, 0x33, 0xD0, 0xE7, 0x7D, 0xA6, 0x48, 0x5B, 0xBF, 0xFE, 0xF6, - 0x6B, 0xFB, 0x37, 0x00, 0xFD, 0xFA, 0x5F, 0x76, 0x9D, 0x31, 0x82, 0xA8, 0x9E, 0x02, 0x2E, 0x3C, 0xFE, 0x5A, 0x7F, 0x1A, 0x18, 0x7C, 0x23, 0x9D, 0xC2, 0xF0, - 0xF5, 0xBA, 0xF5, 0x3D, 0x60, 0xF5, 0x6E, 0x1F, 0x50, 0xB1, 0x74, 0x10, 0xC6, 0x9C, 0x06, 0x96, 0x2A, 0x4C, 0xE8, 0x40, 0x7F, 0x06, 0x7F, 0xCE, 0x34, 0xFD, - 0x08, 0xFE, 0x3E, 0x7D, 0x1A, 0x99, 0x48, 0xC9, 0xEE, 0xEA, 0x4F, 0x4D, 0xDA, 0x19, 0xCC, 0x4E, 0x1A, 0xE6, 0x19, 0x48, 0xF2, 0x79, 0x7D, 0xBF, 0x7E, 0x5A, - 0xAF, 0xC3, 0xB5, 0xA0, 0xFB, 0xBB, 0x18, 0x3B, 0x77, 0xCF, 0x42, 0x0E, 0xD9, 0xE8, 0x0A, 0x37, 0x22, 0xF1, 0x8B, 0x59, 0xDD, 0x4B, 0x56, 0xE5, 0x3A, 0x4F, - 0xD7, 0x09, 0x7B, 0x9B, 0xF5, 0x94, 0x0E, 0x88, 0x22, 0x4C, 0x86, 0x82, 0x58, 0x68, 0x08, 0x7D, 0x2D, 0x15, 0x35, 0x1D, 0x6E, 0xC7, 0x63, 0x17, 0xB4, 0x4D, - 0xAD, 0x65, 0x6F, 0xCD, 0x85, 0xD5, 0x70, 0x60, 0x63, 0x09, 0x8E, 0xB5, 0xE9, 0x66, 0x26, 0x12, 0xDA, 0x5A, 0xC0, 0xB2, 0x96, 0xF0, 0xB4, 0xEE, 0x2F, 0xD7, - 0x61, 0x1A, 0x9B, 0x2A, 0x6A, 0x6C, 0x2A, 0x68, 0x6C, 0xBA, 0x59, 0x8D, 0x71, 0xD4, 0x95, 0xB5, 0x16, 0xE0, 0xC9, 0xD1, 0x5C, 0x2E, 0x3C, 0x57, 0x1A, 0xD7, - 0xD6, 0x54, 0xA6, 0xAD, 0x32, 0x6A, 0x62, 0xB1, 0x0B, 0x26, 0x45, 0xC4, 0x7D, 0xFB, 0xF1, 0xDD, 0x77, 0x18, 0x6D, 0xE4, 0x2A, 0x0B, 0x35, 0x96, 0x4C, 0xAE, - 0x24, 0x18, 0x30, 0x28, 0xC6, 0x2A, 0x1F, 0x89, 0xB0, 0xA9, 0x45, 0x15, 0x84, 0x1C, 0x43, 0xE0, 0x05, 0x03, 0x35, 0xDF, 0xC5, 0x22, 0x41, 0xE0, 0xBC, 0x11, - 0x54, 0x86, 0x2D, 0x20, 0x80, 0x92, 0x12, 0x19, 0xE6, 0x35, 0x87, 0x11, 0x6A, 0x19, 0x3B, 0x77, 0x11, 0xEA, 0xAF, 0x9E, 0x6A, 0x50, 0x0B, 0xA6, 0xEA, 0x51, - 0x6C, 0xF3, 0x72, 0xA5, 0xC3, 0x27, 0xF4, 0x4A, 0x02, 0xE2, 0x5F, 0x95, 0x93, 0x18, 0x38, 0x2F, 0x04, 0x14, 0xC0, 0x72, 0x2B, 0xC1, 0x42, 0x0B, 0x08, 0x4A, - 0x38, 0xE8, 0x97, 0xC8, 0x52, 0x30, 0xA8, 0x51, 0x41, 0x3F, 0xFD, 0x25, 0xC1, 0x10, 0x94, 0x2A, 0x94, 0x90, 0x04, 0x9F, 0xAD, 0x4A, 0xC7, 0xA3, 0x46, 0x4C, - 0xF0, 0xB1, 0x28, 0x09, 0x1E, 0x5E, 0x1A, 0x51, 0x42, 0xC3, 0x3F, 0x74, 0x94, 0x8A, 0x45, 0x8D, 0x18, 0xFE, 0x6D, 0x21, 0x19, 0x4F, 0xBC, 0x14, 0xA3, 0xC6, - 0x13, 0xFF, 0x24, 0x4E, 0x3A, 0x1E, 0x45, 0xD9, 0xF0, 0xCF, 0xD0, 0xC8, 0xAC, 0x8E, 0x55, 0x7E, 0x32, 0x1D, 0x83, 0x35, 0x01, 0x60, 0x9E, 0xAA, 0x3E, 0xD7, - 0xC5, 0xCC, 0x9A, 0x17, 0x8A, 0xB2, 0x30, 0xF0, 0x26, 0x49, 0x0C, 0x41, 0x74, 0xB8, 0x87, 0x92, 0xDD, 0x7D, 0x44, 0xA1, 0xF7, 0x96, 0xA5, 0x16, 0x85, 0x16, - 0x96, 0x15, 0x84, 0x9F, 0x10, 0x26, 0x25, 0xFC, 0xD0, 0x25, 0x33, 0x5A, 0x6F, 0xCD, 0x94, 0x3F, 0x6D, 0xC1, 0xF0, 0xAE, 0x2B, 0x11, 0x71, 0xCC, 0x97, 0x96, - 0x92, 0x25, 0x41, 0x3B, 0x8E, 0x46, 0x34, 0x24, 0xBA, 0x1C, 0x77, 0xEB, 0xA9, 0x85, 0xAE, 0x5B, 0x2F, 0x05, 0x03, 0x2D, 0x09, 0xAB, 0xE5, 0x66, 0xD0, 0x32, - 0x05, 0xC9, 0xC2, 0x55, 0x4B, 0xEF, 0xA0, 0x5D, 0x1A, 0x23, 0x58, 0x7F, 0x56, 0x63, 0x25, 0xF8, 0xEA, 0xB8, 0x8C, 0x0E, 0x5A, 0xB5, 0xCE, 0x52, 0x0A, 0xFF, - 0xBA, 0x73, 0x9A, 0x46, 0x16, 0xAA, 0x43, 0x6E, 0xF0, 0xFD, 0x63, 0xC9, 0xB0, 0x5B, 0xB2, 0xD8, 0xBF, 0x7B, 0xE7, 0x30, 0xAE, 0x89, 0x82, 0x6B, 0x84, 0x2B, - 0xF3, 0x3C, 0xBB, 0x8B, 0xC0, 0x32, 0xBC, 0x63, 0x64, 0xD8, 0xD7, 0x46, 0xCC, 0x3B, 0x46, 0x30, 0xFD, 0xF5, 0x09, 0x47, 0xDD, 0xA8, 0xB1, 0x06, 0x35, 0x4E, - 0x23, 0x3B, 0x3B, 0xA0, 0x5B, 0xD6, 0xB0, 0x10, 0x62, 0x92, 0x15, 0x3B, 0x89, 0xDD, 0x9E, 0x11, 0xFA, 0x9A, 0x10, 0x7E, 0x9F, 0x9D, 0xB1, 0x06, 0x61, 0x2F, - 0x43, 0x67, 0x7C, 0x7B, 0x60, 0x2C, 0x16, 0x10, 0xBC, 0x2E, 0x66, 0xA6, 0x35, 0x6E, 0x30, 0x50, 0xC1, 0x44, 0x70, 0x6F, 0x02, 0xA1, 0xAB, 0x56, 0x1C, 0x2B, - 0x30, 0x7C, 0xC1, 0xAE, 0x35, 0xEA, 0xED, 0x71, 0xB0, 0x66, 0xC4, 0x9B, 0x1D, 0x8C, 0x5D, 0x63, 0xF5, 0x2D, 0x6E, 0x6A, 0x68, 0x60, 0xA7, 0xFB, 0xAD, 0xFD, - 0x16, 0x6F, 0xE0, 0xBB, 0xB7, 0x61, 0x96, 0x89, 0x78, 0x71, 0xF1, 0xF7, 0xC7, 0x0F, 0xDF, 0x45, 0x78, 0x7D, 0xE7, 0x15, 0xBB, 0xD4, 0xA8, 0xD3, 0x5D, 0x11, - 0x87, 0x7F, 0x2C, 0x70, 0x2A, 0x10, 0x28, 0x45, 0x10, 0x23, 0x6E, 0x78, 0x40, 0x51, 0xB1, 0xE6, 0xCF, 0x44, 0xA4, 0x70, 0xD9, 0x26, 0x2B, 0x0D, 0x30, 0x91, - 0x86, 0x0C, 0x34, 0xD8, 0x0E, 0x81, 0xE0, 0xC8, 0xC9, 0xEB, 0xA5, 0x65, 0xFD, 0x42, 0x0C, 0x17, 0xF4, 0xF1, 0x54, 0x6B, 0xD4, 0x5A, 0xB5, 0xA7, 0x0D, 0x7A, - 0xFD, 0x1D, 0xB0, 0x33, 0x6B, 0xEC, 0x3D, 0xD5, 0xF7, 0xF6, 0x0E, 0x3C, 0xD0, 0x19, 0x69, 0x34, 0xDB, 0x41, 0x13, 0xF8, 0x43, 0xDB, 0xB0, 0x4E, 0xD2, 0xEF, - 0xBF, 0x75, 0x96, 0xAE, 0x97, 0xD5, 0xE0, 0x9D, 0x69, 0x63, 0x11, 0x27, 0xAB, 0xC9, 0x15, 0x01, 0xC1, 0x8E, 0xD7, 0x9A, 0xD4, 0xE8, 0x2E, 0x0E, 0x5E, 0xFE, - 0xD0, 0xE8, 0xE2, 0xB6, 0xD6, 0x10, 0x2B, 0x3A, 0x7C, 0x19, 0x91, 0xA0, 0xA1, 0x37, 0x02, 0x8F, 0xBF, 0x13, 0x8D, 0x03, 0x5C, 0x16, 0x0C, 0xE0, 0x7B, 0xF0, - 0x80, 0x03, 0x97, 0xCC, 0x9D, 0x6B, 0xB2, 0xA6, 0x7F, 0x6C, 0x1E, 0x1A, 0xFF, 0xCC, 0x1C, 0xB3, 0x32, 0x4D, 0x64, 0xB7, 0x58, 0x15, 0xC2, 0x0D, 0x22, 0xB8, - 0x85, 0x02, 0xF7, 0x53, 0x34, 0xEA, 0x6C, 0xF7, 0x0A, 0x1D, 0x15, 0xEE, 0x22, 0xB7, 0x99, 0x39, 0xAB, 0x2C, 0x48, 0xD6, 0x7B, 0x02, 0x38, 0x84, 0x1E, 0x9B, - 0x9E, 0x31, 0xB4, 0xF2, 0xBB, 0xE6, 0xED, 0xC6, 0xBC, 0xFC, 0x0D, 0x0D, 0x82, 0x2B, 0x00, 0xEA, 0xBB, 0xB4, 0x4E, 0x28, 0xA0, 0x25, 0x76, 0x1E, 0xD6, 0x80, - 0xAC, 0x4C, 0xC4, 0x13, 0x03, 0x26, 0x4F, 0x71, 0xCC, 0xAC, 0x78, 0x5C, 0xA0, 0xAC, 0x2C, 0x5E, 0x06, 0x88, 0xF8, 0x29, 0x98, 0x33, 0x58, 0xA8, 0xF6, 0x9C, - 0xB2, 0xA0, 0x9D, 0xC6, 0xEE, 0x86, 0xB9, 0x8D, 0x58, 0x30, 0x7D, 0xC4, 0xE2, 0xDF, 0x5F, 0xB0, 0x82, 0x1B, 0x52, 0x1E, 0x93, 0xC0, 0x93, 0x27, 0x71, 0x6C, - 0xB8, 0x8D, 0x85, 0x0D, 0x20, 0x61, 0x6F, 0xAC, 0x3D, 0x7B, 0x7D, 0x78, 0xB4, 0xB2, 0xC0, 0x49, 0x82, 0xA1, 0xE0, 0x71, 0x4C, 0xF0, 0xC2, 0x18, 0x01, 0x84, - 0x98, 0x63, 0x2A, 0x20, 0xDC, 0x95, 0x56, 0x5B, 0x5B, 0xEF, 0x7F, 0x4E, 0xAD, 0xBE, 0x41, 0xF8, 0xA6, 0xC4, 0x3D, 0x90, 0x3F, 0x1A, 0x73, 0x74, 0x21, 0x3E, - 0x87, 0x4E, 0x60, 0x9C, 0xC6, 0x30, 0x22, 0x63, 0x09, 0xBA, 0xF1, 0x77, 0x78, 0x48, 0x31, 0x4E, 0x0D, 0xD3, 0xBE, 0x20, 0x26, 0xA6, 0x7F, 0x7B, 0xC2, 0x5D, - 0xDA, 0x3D, 0x20, 0xC2, 0x0D, 0x83, 0xC2, 0x72, 0xC6, 0xFA, 0x7A, 0xC8, 0xE1, 0x21, 0x6D, 0x9A, 0x82, 0x86, 0x76, 0xB1, 0x8E, 0x26, 0x93, 0xFA, 0xD5, 0xF0, - 0x33, 0x62, 0x93, 0x09, 0x85, 0xA2, 0x5B, 0x0D, 0x51, 0x1C, 0xB4, 0x57, 0x38, 0xCC, 0x42, 0x35, 0x31, 0x46, 0xE4, 0xB3, 0x0B, 0x71, 0x6C, 0x6A, 0x9B, 0x7F, - 0x12, 0x19, 0x42, 0xE6, 0x8C, 0x0D, 0x62, 0xBB, 0x4E, 0x90, 0x48, 0x22, 0x72, 0xEE, 0x67, 0xF1, 0xEB, 0xF1, 0x21, 0x3A, 0x70, 0xBD, 0x70, 0x69, 0x5D, 0xB4, - 0x05, 0x56, 0xFA, 0x8F, 0x26, 0xC0, 0x91, 0xB1, 0x6D, 0xA8, 0x12, 0xAE, 0x63, 0x19, 0x3C, 0x6C, 0x22, 0xD6, 0xAB, 0x2B, 0x16, 0xC1, 0x33, 0x70, 0xB2, 0xCD, - 0x7D, 0x49, 0xA4, 0xCB, 0xE1, 0xDC, 0xF4, 0x25, 0x08, 0xEB, 0x7A, 0x5D, 0x8A, 0x2B, 0xA5, 0x9E, 0x2E, 0x7A, 0x22, 0x8B, 0x66, 0x74, 0xA9, 0x11, 0x10, 0xC5, - 0xB6, 0x0A, 0x8C, 0xD8, 0x6E, 0xF5, 0xE7, 0x30, 0xE2, 0xE2, 0x06, 0x00, 0x54, 0x75, 0x62, 0x0B, 0x10, 0x43, 0xC1, 0xF6, 0xAE, 0x51, 0x14, 0xF1, 0xDD, 0x6B, - 0xC1, 0x8E, 0xB1, 0xF8, 0xCA, 0xA4, 0xB8, 0xF7, 0xE5, 0x77, 0x97, 0x00, 0x9C, 0x87, 0xF3, 0x59, 0xED, 0x1F, 0x5F, 0x29, 0x8A, 0x3B, 0x6D, 0x02, 0x91, 0xC0, - 0x9B, 0x91, 0x31, 0x9D, 0x7B, 0xF9, 0x4B, 0xEF, 0x54, 0xC3, 0x6D, 0x3F, 0xB1, 0xDD, 0x6A, 0x77, 0xBF, 0x87, 0x16, 0x12, 0x0E, 0x24, 0xD1, 0x7A, 0x2B, 0x67, - 0x7B, 0x6D, 0xDD, 0xF5, 0x91, 0xC2, 0x0A, 0x2B, 0x87, 0x55, 0x5A, 0x65, 0x95, 0x2D, 0x4E, 0x26, 0xA3, 0x14, 0xCF, 0x31, 0x1F, 0xA9, 0xF4, 0x4D, 0x77, 0x5D, - 0xAA, 0x74, 0x29, 0xC9, 0x2E, 0xF1, 0xC7, 0xC2, 0x98, 0x25, 0x8C, 0xF9, 0x09, 0x3F, 0xDA, 0xE3, 0x72, 0x02, 0x13, 0x19, 0x07, 0xF1, 0x96, 0x19, 0x11, 0xAE, - 0x3E, 0x33, 0x3D, 0xC6, 0x4C, 0x80, 0x49, 0x9B, 0x0B, 0x3B, 0x7F, 0x4B, 0x22, 0x5F, 0x76, 0x09, 0x95, 0xF5, 0x87, 0x07, 0x79, 0x7B, 0x28, 0x02, 0x19, 0x0E, - 0xEC, 0x40, 0x40, 0x10, 0x13, 0x51, 0x21, 0x15, 0x65, 0xC8, 0x8C, 0xFD, 0x84, 0x01, 0x9B, 0x8E, 0xD6, 0xB4, 0xE7, 0x5F, 0xA9, 0x55, 0xFF, 0xB6, 0xCF, 0x46, - 0x78, 0x21, 0x68, 0xEE, 0x15, 0x21, 0x68, 0x6D, 0x55, 0x3E, 0x97, 0x98, 0x8D, 0xAD, 0x4F, 0x06, 0x3F, 0x88, 0xC5, 0x14, 0xDF, 0xB9, 0xD6, 0x5A, 0x5B, 0x97, - 0x17, 0x17, 0xD1, 0x42, 0x06, 0x25, 0xB2, 0x11, 0x16, 0xD5, 0x03, 0xF1, 0x48, 0x17, 0xD0, 0x52, 0xC5, 0xC5, 0xEC, 0x8B, 0x45, 0x14, 0x9C, 0x16, 0x64, 0xCE, - 0x9F, 0xE8, 0x86, 0x59, 0x2A, 0xAF, 0x08, 0xE0, 0x22, 0xDC, 0x20, 0x9D, 0x0B, 0x19, 0x6D, 0xA6, 0x16, 0x70, 0xD0, 0xF9, 0x98, 0xDA, 0xFA, 0x03, 0x9F, 0xBA, - 0x09, 0xA0, 0x88, 0x35, 0x1F, 0x36, 0x78, 0x4A, 0x26, 0x49, 0xBE, 0x38, 0x7A, 0x65, 0xC1, 0xD3, 0x61, 0x92, 0x35, 0x16, 0xA0, 0xA9, 0xE7, 0xE7, 0x03, 0x8B, - 0xDB, 0xB2, 0xEB, 0x82, 0xB0, 0x3D, 0xDF, 0x59, 0x5C, 0xD1, 0xAB, 0x89, 0xA8, 0xB0, 0xA2, 0xC5, 0xAC, 0x03, 0xBC, 0x1F, 0xCC, 0x93, 0x44, 0x46, 0xE3, 0xF5, - 0xFF, 0x2B, 0xAC, 0x74, 0x69, 0x0C, 0x4F, 0x3D, 0x9E, 0xED, 0xD2, 0x22, 0x98, 0xB4, 0x07, 0x3A, 0xE7, 0xF4, 0xDC, 0x11, 0x1B, 0x3C, 0xC2, 0x6D, 0xD0, 0x18, - 0x3A, 0xF0, 0xF0, 0x77, 0xD6, 0x27, 0xA6, 0x12, 0x31, 0x05, 0xEF, 0xE5, 0xD2, 0xE2, 0x2C, 0x92, 0xA4, 0x44, 0x01, 0x9E, 0x39, 0x9B, 0x87, 0xA3, 0x06, 0x1B, - 0x28, 0x31, 0x7C, 0x09, 0xCA, 0x4F, 0x89, 0x91, 0x91, 0x98, 0x78, 0x50, 0x8A, 0x13, 0x2F, 0x8C, 0x7C, 0x6C, 0x0F, 0xFD, 0xF3, 0xCF, 0xA3, 0x21, 0x0C, 0x76, - 0x38, 0x01, 0x04, 0xD7, 0x5B, 0x35, 0xF6, 0xEE, 0xB2, 0xD8, 0x61, 0xE2, 0x8A, 0x14, 0xA9, 0x4A, 0x04, 0x8D, 0xDA, 0x72, 0x6C, 0x31, 0xF9, 0xC8, 0xD1, 0x89, - 0xD6, 0x7B, 0x69, 0x07, 0x13, 0x96, 0x34, 0xC1, 0x9E, 0xAF, 0x8B, 0x96, 0xE5, 0xAC, 0x31, 0x04, 0x51, 0x3C, 0x5E, 0x23, 0x36, 0x91, 0x94, 0x0A, 0x76, 0x11, - 0x34, 0x08, 0x68, 0x17, 0x1D, 0x22, 0x85, 0xF6, 0xF8, 0x58, 0x99, 0x48, 0xFF, 0x02, 0x95, 0x5F, 0x2C, 0x81, 0x88, 0x79, 0xA0, 0x72, 0x76, 0x0D, 0x33, 0xDC, - 0xD0, 0x36, 0x21, 0xE3, 0xCD, 0xF2, 0x19, 0xB8, 0x2D, 0x38, 0x1A, 0x4F, 0x8F, 0x73, 0x00, 0x68, 0x4E, 0xCC, 0x1E, 0x84, 0xA1, 0xB0, 0x6C, 0xC3, 0xAE, 0xAF, - 0x09, 0x89, 0x77, 0x66, 0x7C, 0x81, 0x66, 0x23, 0xD6, 0x4C, 0x40, 0x02, 0x78, 0xD7, 0xD3, 0x05, 0x89, 0x20, 0xA0, 0xDD, 0x5E, 0xA8, 0x17, 0x04, 0xE2, 0x99, - 0x68, 0xA4, 0x95, 0xF4, 0xD9, 0xC4, 0xFA, 0x4C, 0x22, 0xA1, 0xB0, 0xF4, 0x19, 0xC4, 0xFA, 0xEC, 0xE1, 0x4E, 0xD0, 0x42, 0xF0, 0xC4, 0x56, 0x24, 0x48, 0x92, - 0x2D, 0x75, 0x22, 0x4A, 0x3D, 0x98, 0x49, 0xE5, 0x40, 0x7C, 0xA6, 0xA9, 0x88, 0x28, 0x32, 0xA2, 0x28, 0x32, 0xC2, 0x45, 0x86, 0x00, 0x51, 0xE2, 0x9E, 0x3F, - 0xAD, 0x0B, 0xE3, 0xCA, 0x4F, 0x2F, 0x23, 0xCE, 0x56, 0xC3, 0x4C, 0x3A, 0xF9, 0x94, 0x49, 0x60, 0x2F, 0x1B, 0x00, 0xDA, 0xCF, 0x61, 0xDC, 0x16, 0xD9, 0x5A, - 0x0D, 0xD5, 0xD8, 0x0A, 0xA6, 0x5C, 0x08, 0x10, 0xB1, 0x25, 0x9F, 0x98, 0x05, 0xAC, 0xBC, 0x22, 0x3E, 0x7F, 0xAE, 0xD3, 0xB0, 0xC7, 0xDA, 0xC4, 0x35, 0xE6, - 0xC4, 0x83, 0x09, 0x59, 0x48, 0xEC, 0x98, 0xDE, 0xCF, 0x1D, 0xA2, 0x58, 0x33, 0x81, 0xC9, 0x70, 0x6A, 0x97, 0x0B, 0x1A, 0xB6, 0x14, 0xA0, 0x43, 0x3A, 0x32, - 0xA1, 0x83, 0x46, 0x6C, 0x6C, 0x0B, 0x4F, 0x95, 0x84, 0x15, 0xB6, 0x8E, 0x9C, 0x27, 0x42, 0xC0, 0x26, 0x4A, 0x03, 0xAD, 0x97, 0x2C, 0x27, 0xB0, 0x84, 0x87, - 0x31, 0x9B, 0x48, 0x6B, 0xC4, 0x06, 0x21, 0x4B, 0xB1, 0x36, 0xA1, 0x83, 0x30, 0xF8, 0x34, 0x32, 0x73, 0x49, 0x61, 0xE5, 0xEA, 0xDA, 0x7B, 0x8B, 0xE0, 0x34, - 0x8F, 0xBF, 0xA9, 0xF3, 0xE2, 0xDB, 0xD7, 0x9A, 0xE3, 0x6A, 0x96, 0xB3, 0x22, 0xB8, 0x59, 0x34, 0x58, 0x0A, 0xD6, 0x86, 0x04, 0x12, 0x4B, 0xC2, 0x26, 0xD3, - 0x18, 0x87, 0xFC, 0x99, 0xE9, 0x41, 0xEA, 0x8E, 0xEF, 0x93, 0x25, 0x8F, 0x6B, 0x61, 0x31, 0x34, 0x97, 0xBD, 0xF5, 0xAD, 0x55, 0x31, 0x71, 0x32, 0x98, 0x48, - 0x96, 0x8F, 0x39, 0x8F, 0x6B, 0xC1, 0x28, 0x6B, 0xFA, 0x5E, 0x40, 0x84, 0xE1, 0xED, 0x07, 0x2B, 0x45, 0x39, 0x03, 0xB9, 0x82, 0x0C, 0xC1, 0x22, 0x59, 0x46, - 0xBC, 0xAE, 0x49, 0x53, 0x56, 0x23, 0xC9, 0xD0, 0x28, 0x96, 0x0B, 0xA5, 0x71, 0x3E, 0x5D, 0x2B, 0x4C, 0xE2, 0x2C, 0x55, 0x67, 0xBF, 0xB3, 0xC3, 0xE0, 0xB1, - 0x39, 0x76, 0x86, 0x8B, 0x05, 0x83, 0x47, 0x67, 0x87, 0x33, 0x7F, 0x6E, 0x0D, 0x1E, 0xFD, 0x2F, 0x5E, 0x72, 0x0B, 0x89, 0x42, 0x10, 0x01, 0x00 +//File: index_ov5640.html.gz, Size: 8880 +#define index_ov5640_html_gz_len 8880 +const unsigned char index_ov5640_html_gz[] = { + 0x1F, 0x8B, 0x08, 0x08, 0x5B, 0xA3, 0x7B, 0x67, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x5F, 0x6F, 0x76, 0x35, 0x36, 0x34, 0x30, 0x2E, 0x68, 0x74, 0x6D, + 0x6C, 0x00, 0xED, 0x3D, 0xDB, 0x72, 0xDB, 0xC6, 0x92, 0xEF, 0xFE, 0x0A, 0x98, 0xC9, 0x9A, 0x64, 0x59, 0xA4, 0x08, 0xDE, 0x74, 0xB1, 0x44, 0xAF, 0x2D, 0x2B, + 0x76, 0xEA, 0xD8, 0x39, 0x8E, 0xE5, 0x38, 0x49, 0x65, 0x53, 0x0E, 0x48, 0x0C, 0x49, 0xC4, 0x20, 0xC0, 0x03, 0x80, 0xA2, 0x74, 0x5C, 0xFA, 0x8E, 0xFD, 0xA0, + 0xFD, 0xB1, 0xED, 0x9E, 0x19, 0x5C, 0x39, 0x00, 0x06, 0x00, 0x49, 0x29, 0xD9, 0xA5, 0xAB, 0x2C, 0x5C, 0xA6, 0x7B, 0xFA, 0x3E, 0x3D, 0x3D, 0x03, 0xE0, 0xEC, + 0xB1, 0x6E, 0x4F, 0xBC, 0xDB, 0x25, 0x51, 0xE6, 0xDE, 0xC2, 0x1C, 0x3D, 0x3A, 0x63, 0x7F, 0x14, 0xF8, 0x9D, 0xCD, 0x89, 0xA6, 0xB3, 0x43, 0x7A, 0xBA, 0x20, + 0x9E, 0xA6, 0x4C, 0xE6, 0x9A, 0xE3, 0x12, 0xEF, 0xBC, 0xB6, 0xF2, 0xA6, 0xAD, 0xE3, 0x5A, 0xF2, 0xB6, 0xA5, 0x2D, 0xC8, 0x79, 0xED, 0xDA, 0x20, 0xEB, 0xA5, + 0xED, 0x78, 0x35, 0x65, 0x62, 0x5B, 0x1E, 0xB1, 0xA0, 0xF9, 0xDA, 0xD0, 0xBD, 0xF9, 0xB9, 0x4E, 0xAE, 0x8D, 0x09, 0x69, 0xD1, 0x93, 0x03, 0xC3, 0x32, 0x3C, + 0x43, 0x33, 0x5B, 0xEE, 0x44, 0x33, 0xC9, 0xB9, 0x1A, 0xC5, 0xE5, 0x19, 0x9E, 0x49, 0x46, 0x97, 0x57, 0xEF, 0x7B, 0x5D, 0xE5, 0x9F, 0x9F, 0x06, 0xC3, 0x7E, + 0xE7, 0xEC, 0x90, 0x5D, 0x0B, 0xDB, 0xB8, 0xDE, 0x6D, 0xF4, 0x1C, 0x7F, 0x63, 0x5B, 0xBF, 0x55, 0xBE, 0xC6, 0x2E, 0xE1, 0x6F, 0x0A, 0x44, 0xB4, 0xA6, 0xDA, + 0xC2, 0x30, 0x6F, 0x4F, 0x95, 0x17, 0x0E, 0xF4, 0x79, 0xF0, 0x86, 0x98, 0xD7, 0xC4, 0x33, 0x26, 0xDA, 0x81, 0xAB, 0x59, 0x6E, 0xCB, 0x25, 0x8E, 0x31, 0x7D, + 0xB6, 0x01, 0x38, 0xD6, 0x26, 0x5F, 0x66, 0x8E, 0xBD, 0xB2, 0xF4, 0x53, 0xE5, 0x1B, 0xF5, 0x18, 0xFF, 0x6D, 0x36, 0x9A, 0xD8, 0xA6, 0xED, 0xC0, 0xFD, 0xCB, + 0xEF, 0xF0, 0xDF, 0xE6, 0x7D, 0xDA, 0xBB, 0x6B, 0xFC, 0x9B, 0x9C, 0x2A, 0xEA, 0x70, 0x79, 0x13, 0xBB, 0x7F, 0xF7, 0x28, 0x76, 0x3A, 0xEF, 0xA6, 0x51, 0xCF, + 0xE1, 0x8F, 0xB3, 0xE1, 0x5D, 0x32, 0xF1, 0x0C, 0xDB, 0x6A, 0x2F, 0x34, 0xC3, 0x12, 0x60, 0xD2, 0x0D, 0x77, 0x69, 0x6A, 0x20, 0x83, 0xA9, 0x49, 0x32, 0xF1, + 0x7C, 0xB3, 0x20, 0xD6, 0xEA, 0x20, 0x07, 0x1B, 0x22, 0x69, 0xE9, 0x86, 0xC3, 0x5A, 0x9D, 0xA2, 0x1C, 0x56, 0x0B, 0x2B, 0x17, 0x6D, 0x16, 0x5D, 0x96, 0x6D, + 0x11, 0x81, 0x00, 0xB1, 0xA3, 0xB5, 0xA3, 0x2D, 0xB1, 0x01, 0xFE, 0xDD, 0x6C, 0xB2, 0x30, 0x2C, 0x66, 0x54, 0xA7, 0x4A, 0xAF, 0xDF, 0x59, 0xDE, 0xE4, 0xA8, + 0xB2, 0x37, 0xC4, 0x7F, 0x9B, 0x8D, 0x96, 0x9A, 0xAE, 0x1B, 0xD6, 0xEC, 0x54, 0x39, 0x16, 0xA2, 0xB0, 0x1D, 0x9D, 0x38, 0x2D, 0x47, 0xD3, 0x8D, 0x95, 0x7B, + 0xAA, 0xF4, 0x45, 0x6D, 0x16, 0x9A, 0x33, 0x03, 0x5A, 0x3C, 0x1B, 0x88, 0x6D, 0xA9, 0x42, 0x4A, 0x78, 0x13, 0xC7, 0x98, 0xCD, 0x3D, 0x50, 0xE9, 0x46, 0x9B, + 0xA4, 0xD0, 0xB8, 0x0B, 0xE5, 0xE9, 0x33, 0x53, 0x6E, 0x62, 0xA9, 0x69, 0xA6, 0x31, 0xB3, 0x5A, 0x86, 0x47, 0x16, 0xC0, 0x8E, 0xEB, 0x39, 0xC4, 0x9B, 0xCC, + 0xB3, 0x48, 0x99, 0x1A, 0xB3, 0x95, 0x43, 0x04, 0x84, 0x04, 0x72, 0xCB, 0x60, 0x18, 0x6E, 0x6E, 0xDE, 0x6A, 0xAD, 0xC9, 0xF8, 0x8B, 0xE1, 0xB5, 0xB8, 0x4C, + 0xC6, 0x64, 0x6A, 0x3B, 0x44, 0xD8, 0xD2, 0x6F, 0x61, 0xDA, 0x93, 0x2F, 0x2D, 0xD7, 0xD3, 0x1C, 0x4F, 0x06, 0xA1, 0x36, 0xF5, 0x88, 0x93, 0x8F, 0x8F, 0xA0, + 0x55, 0xE4, 0x63, 0x4B, 0xEF, 0x96, 0x37, 0x30, 0x2C, 0xD3, 0xB0, 0x88, 0x3C, 0x79, 0x69, 0xFD, 0xC6, 0xD1, 0xB1, 0x56, 0x12, 0x8A, 0x31, 0x16, 0xB3, 0x2C, + 0x2B, 0xA1, 0xBC, 0x6E, 0x76, 0xC6, 0xFD, 0x46, 0xED, 0x74, 0xFE, 0x63, 0xF3, 0xE6, 0x9C, 0x30, 0x33, 0xD5, 0x56, 0x9E, 0x5D, 0xDD, 0x23, 0x36, 0xDC, 0x2A, + 0xC1, 0xC7, 0x7F, 0x2E, 0x88, 0x6E, 0x68, 0x4A, 0x23, 0xE2, 0xCE, 0xC7, 0x1D, 0xB0, 0xA9, 0xA6, 0xA2, 0x59, 0xBA, 0xD2, 0xB0, 0x1D, 0x03, 0x1C, 0x41, 0xA3, + 0xE1, 0xC6, 0x84, 0x2B, 0x30, 0x70, 0x2C, 0x49, 0x53, 0xC0, 0x72, 0x86, 0xCF, 0x44, 0x25, 0x22, 0x76, 0x1B, 0xFC, 0x49, 0x84, 0x1C, 0xFC, 0xE5, 0x3A, 0x90, + 0x80, 0x47, 0x8A, 0x3E, 0x4B, 0x5F, 0x51, 0x0A, 0xD3, 0x74, 0x86, 0xBF, 0x85, 0x76, 0xD3, 0xCA, 0xD4, 0x9D, 0xDF, 0xC8, 0xD7, 0x21, 0x0C, 0xB3, 0x93, 0x06, + 0x34, 0xBD, 0x9E, 0x2B, 0x2D, 0x05, 0xA3, 0x64, 0x53, 0x0C, 0xC3, 0x91, 0x8A, 0x55, 0x8E, 0xBF, 0xA8, 0x51, 0x14, 0x60, 0x57, 0xCC, 0x6A, 0x18, 0x3B, 0xD8, + 0x3F, 0x91, 0x0D, 0x31, 0x4E, 0x52, 0xA3, 0x08, 0xFE, 0xE4, 0x23, 0x49, 0x88, 0x2C, 0x37, 0x9A, 0x08, 0x10, 0xA7, 0x47, 0x94, 0x0D, 0xBC, 0x69, 0xDE, 0x2D, + 0xC0, 0x9A, 0x4D, 0x82, 0x6C, 0x74, 0x11, 0x20, 0xCE, 0xA2, 0x21, 0x37, 0xCA, 0xE0, 0xEF, 0x4E, 0x22, 0xDF, 0xF8, 0x66, 0xBC, 0xF2, 0x3C, 0xDB, 0x72, 0x2B, + 0x0D, 0x51, 0x69, 0x7E, 0xF6, 0xE7, 0xCA, 0xF5, 0x8C, 0xE9, 0x6D, 0x8B, 0xBB, 0x34, 0xF8, 0xD9, 0x52, 0x83, 0x14, 0x72, 0x4C, 0xBC, 0x35, 0x21, 0xD9, 0xE9, + 0x86, 0xA5, 0x5D, 0x43, 0xDC, 0x99, 0xCD, 0x4C, 0x91, 0xED, 0x4D, 0x56, 0x8E, 0x8B, 0x79, 0xDB, 0xD2, 0x36, 0x00, 0xB1, 0xB3, 0xD9, 0x71, 0xDC, 0x07, 0x25, + 0x3B, 0x6A, 0x4D, 0xC6, 0x82, 0xBE, 0xEC, 0x95, 0x87, 0x32, 0x16, 0x6A, 0xC2, 0x06, 0x76, 0x0C, 0xEF, 0x56, 0x78, 0x8F, 0x7B, 0xA2, 0xE0, 0x8E, 0xEF, 0x82, + 0x99, 0xC3, 0x42, 0x9C, 0xAE, 0xD3, 0xC9, 0x9C, 0x4C, 0xBE, 0x10, 0xFD, 0x69, 0x6E, 0x1A, 0x96, 0x97, 0x1E, 0xB6, 0x0D, 0x6B, 0xB9, 0xF2, 0x5A, 0x98, 0x4E, + 0x2D, 0x77, 0xA2, 0x73, 0x6A, 0x90, 0x3E, 0x8B, 0xDD, 0x6E, 0x56, 0x52, 0x31, 0x58, 0xDE, 0x64, 0x0B, 0x21, 0x4A, 0xEC, 0xC8, 0xD4, 0xC6, 0xC4, 0xCC, 0x22, + 0x99, 0x3B, 0x43, 0x4A, 0xD8, 0xE5, 0xB1, 0x2A, 0x3D, 0x77, 0xA3, 0x94, 0x85, 0x83, 0x57, 0xFF, 0xE8, 0x3F, 0xA4, 0xE5, 0x48, 0x8F, 0x0F, 0x62, 0x97, 0x5C, + 0x62, 0x82, 0x83, 0x25, 0xAE, 0x2D, 0xB5, 0xD4, 0x64, 0x1C, 0x5A, 0xAC, 0x81, 0xAA, 0xCC, 0x2E, 0x1D, 0xCD, 0x9A, 0x11, 0x88, 0x0E, 0x37, 0x07, 0xFE, 0x61, + 0xF6, 0x54, 0x41, 0x4A, 0x20, 0x18, 0xBC, 0x07, 0xD9, 0x53, 0x13, 0x16, 0x22, 0x0E, 0x94, 0x36, 0x3B, 0x28, 0x91, 0xA7, 0x44, 0x34, 0x9E, 0x49, 0x88, 0x2A, + 0xB4, 0x17, 0x96, 0xAA, 0x08, 0x7D, 0x29, 0x6E, 0x6D, 0xC2, 0xD4, 0x3F, 0x37, 0x58, 0xF8, 0x93, 0xC0, 0xE9, 0x34, 0x6F, 0x1A, 0x39, 0x9D, 0xF6, 0x3A, 0xBD, + 0x7E, 0x6E, 0x2E, 0x25, 0xE4, 0x32, 0x31, 0x95, 0x14, 0x04, 0x93, 0x20, 0xD0, 0xE4, 0xEB, 0xE2, 0x74, 0x6E, 0x5F, 0x13, 0x47, 0xA0, 0x88, 0x04, 0xB9, 0xFD, + 0x93, 0xBE, 0x2E, 0x81, 0x4D, 0x83, 0xA1, 0xE0, 0x5A, 0x14, 0x68, 0xE3, 0xE8, 0xBA, 0xEA, 0xA4, 0x9B, 0x69, 0xA1, 0x0C, 0x5D, 0x1B, 0xAC, 0x41, 0x1B, 0x9B, + 0x44, 0xCF, 0x88, 0xDC, 0x3A, 0x99, 0x6A, 0x2B, 0xD3, 0xCB, 0x91, 0xB7, 0xD6, 0xC1, 0x7F, 0x59, 0x3D, 0x52, 0xF7, 0xFA, 0x0D, 0x6B, 0x20, 0xE7, 0xD4, 0x25, + 0x7E, 0x17, 0xF4, 0xE9, 0x0F, 0xAB, 0xDA, 0x72, 0x49, 0x34, 0x68, 0x35, 0x21, 0x69, 0xB3, 0x55, 0xA9, 0x74, 0x5A, 0x1C, 0xD3, 0xA4, 0xE6, 0xA8, 0xB9, 0xA6, + 0x18, 0x24, 0x4A, 0x85, 0x78, 0x3E, 0x9D, 0xDA, 0x93, 0x95, 0x68, 0x04, 0x97, 0x33, 0xA9, 0x4D, 0x7C, 0xA7, 0xBE, 0xC8, 0x5C, 0xD3, 0xA0, 0x86, 0xBD, 0xB2, + 0x2C, 0xD4, 0x68, 0xCB, 0x73, 0x80, 0x4D, 0x41, 0x47, 0x72, 0x82, 0x2B, 0xE5, 0x9D, 0x31, 0xC1, 0xA6, 0xD5, 0x69, 0x12, 0x0E, 0x28, 0x08, 0x14, 0x41, 0x0C, + 0x51, 0x5C, 0x1B, 0x98, 0xF2, 0x51, 0x55, 0x93, 0x8B, 0x37, 0x5F, 0x2D, 0x44, 0x39, 0x83, 0xDF, 0x99, 0x0A, 0x03, 0x1C, 0xEB, 0xCE, 0x99, 0x8D, 0xB5, 0x46, + 0xE7, 0xA0, 0x73, 0xD0, 0x83, 0xFF, 0x04, 0xB9, 0x7B, 0xB6, 0x71, 0x71, 0xF1, 0xA6, 0x58, 0x5E, 0x22, 0xF8, 0xE4, 0x97, 0x50, 0xD2, 0xC2, 0x58, 0xAE, 0x2E, + 0xE4, 0x3D, 0x29, 0x5E, 0x4B, 0x51, 0xDB, 0x39, 0x23, 0x4C, 0x8A, 0x49, 0x17, 0x37, 0x44, 0x81, 0xB5, 0x14, 0x55, 0xF1, 0xC2, 0xFE, 0x77, 0x8B, 0x0D, 0xAF, + 0xFF, 0xE7, 0xAD, 0x3D, 0x22, 0x8A, 0xBF, 0xB5, 0xA5, 0x17, 0x96, 0x8B, 0x7B, 0xDF, 0xB6, 0xD1, 0x49, 0xD7, 0x7A, 0x8B, 0xE7, 0x33, 0x40, 0xA1, 0x05, 0x19, + 0xA7, 0x03, 0x13, 0xAF, 0xD4, 0x9C, 0x27, 0xD2, 0xA6, 0x84, 0x0C, 0xA6, 0x86, 0x69, 0xB6, 0x4C, 0x7B, 0x9D, 0x9F, 0x89, 0x64, 0x5B, 0xF2, 0x86, 0x9D, 0xE6, + 0x9B, 0x7C, 0x59, 0x6A, 0x57, 0x10, 0xB9, 0xFE, 0x12, 0xD4, 0xFE, 0xBD, 0x1D, 0x2E, 0xD3, 0x35, 0xCA, 0x0D, 0x14, 0x25, 0xEC, 0xB1, 0x5A, 0x47, 0x52, 0xA6, + 0xC4, 0x32, 0xC1, 0xCC, 0x59, 0x9D, 0xBB, 0x36, 0xBC, 0xC9, 0xBC, 0xC4, 0xA4, 0x6A, 0x69, 0xBB, 0x06, 0x5B, 0xBE, 0x71, 0x88, 0xA9, 0x61, 0x06, 0x5F, 0x6A, + 0x36, 0x9E, 0x3B, 0x31, 0x89, 0x82, 0xCB, 0x70, 0x42, 0x45, 0xF7, 0x70, 0x2A, 0x29, 0x6D, 0x96, 0x3B, 0xA4, 0xC7, 0x6A, 0xB1, 0x59, 0xE7, 0xA4, 0xFB, 0x71, + 0xCF, 0x10, 0x37, 0x2A, 0x10, 0xD1, 0xFD, 0xA0, 0x3D, 0x73, 0xC8, 0xAD, 0x04, 0x33, 0x07, 0xFC, 0xEF, 0x29, 0xAB, 0x95, 0x96, 0x2F, 0x02, 0xD0, 0x01, 0x80, + 0x5B, 0x51, 0xBB, 0xEF, 0x4A, 0x74, 0x9D, 0xDE, 0xA5, 0x8C, 0x3D, 0x06, 0x95, 0xC0, 0x5A, 0x4D, 0x22, 0xDC, 0x64, 0x0C, 0xA1, 0x62, 0x53, 0xF5, 0x47, 0x5F, + 0xE1, 0x4D, 0x93, 0x4C, 0xBD, 0x94, 0x85, 0x0E, 0x9A, 0xA7, 0xF6, 0xB2, 0xA3, 0x5B, 0x2B, 0x52, 0x27, 0xC8, 0x8D, 0x1C, 0x41, 0xC1, 0x2E, 0xDD, 0xFA, 0x84, + 0x98, 0x31, 0x7A, 0x16, 0x46, 0x9E, 0xAE, 0x12, 0x3F, 0x7D, 0xA6, 0x6A, 0x86, 0x36, 0x0B, 0x3E, 0xE4, 0x83, 0x7A, 0xC8, 0x2F, 0x8D, 0xEE, 0x50, 0xB8, 0x8E, + 0x90, 0xD1, 0x38, 0x8B, 0x34, 0x56, 0xF1, 0x92, 0x1A, 0xB2, 0x52, 0x27, 0xC8, 0xD1, 0x58, 0x24, 0x54, 0x54, 0xB6, 0x57, 0x66, 0x45, 0x98, 0xCD, 0x1A, 0x4D, + 0xA6, 0xB1, 0x1B, 0x0B, 0x0D, 0xD2, 0x5E, 0x34, 0x57, 0x0D, 0x30, 0x8A, 0xF4, 0x27, 0x63, 0xEE, 0x91, 0x7A, 0xA2, 0x3A, 0xEC, 0xE4, 0x74, 0x39, 0x31, 0x6D, + 0x37, 0xDB, 0xAF, 0xB4, 0x31, 0xC8, 0x6F, 0xE5, 0x09, 0x3A, 0xE2, 0x55, 0x4D, 0x61, 0xE5, 0x89, 0x1A, 0xB7, 0xF0, 0x8E, 0xD4, 0xD0, 0x9D, 0xE9, 0x53, 0xD9, + 0xEE, 0x98, 0x90, 0xB9, 0xDA, 0x11, 0x46, 0xDA, 0xCC, 0xFA, 0x9B, 0x47, 0x6E, 0x60, 0xBE, 0x89, 0x6B, 0x75, 0xA7, 0xCA, 0x84, 0x88, 0xC3, 0x68, 0x6C, 0x90, + 0x53, 0x65, 0x8A, 0x80, 0x99, 0x7A, 0x98, 0x1B, 0xBA, 0x4E, 0x32, 0xAB, 0x9C, 0x38, 0xE7, 0xCD, 0x0E, 0x95, 0x9A, 0xB0, 0x9C, 0x56, 0x40, 0x93, 0xDD, 0x74, + 0x55, 0x66, 0x0E, 0x57, 0x29, 0xA1, 0x2F, 0x26, 0x21, 0x61, 0x93, 0x48, 0x15, 0x56, 0x1C, 0x22, 0x51, 0x11, 0x3A, 0x99, 0xD8, 0x0E, 0x5B, 0xC4, 0x4D, 0x99, + 0xF8, 0x97, 0x9B, 0x59, 0x21, 0x72, 0x51, 0xE9, 0x6E, 0x27, 0xA1, 0x23, 0x73, 0xA3, 0x83, 0xBA, 0xEB, 0xB8, 0xC2, 0x87, 0xE3, 0xB4, 0x4A, 0x7A, 0x3C, 0x61, + 0xCB, 0x24, 0x55, 0x18, 0x02, 0x03, 0x35, 0xA2, 0xC8, 0x40, 0x0E, 0xD8, 0x6A, 0x53, 0xA1, 0x09, 0xAA, 0xE8, 0xD2, 0x4A, 0x9B, 0xAF, 0x36, 0xF1, 0x85, 0xC1, + 0x56, 0xDA, 0x7A, 0xCB, 0x16, 0x17, 0xDF, 0xA8, 0x05, 0x24, 0xFB, 0x4D, 0x15, 0xCD, 0x3D, 0xE5, 0x8F, 0x19, 0x44, 0x06, 0x03, 0xB1, 0xBF, 0xDD, 0x2A, 0xDE, + 0xAA, 0x6C, 0x08, 0x39, 0x3B, 0x8C, 0xEC, 0x8F, 0x3B, 0x3B, 0x0C, 0xB7, 0xF2, 0x9D, 0xE1, 0x26, 0xB9, 0xE8, 0x36, 0x3A, 0xDE, 0xCF, 0xC4, 0xD4, 0x5C, 0xF7, + 0xBC, 0x86, 0x9B, 0xBD, 0x6A, 0xF1, 0x5D, 0x75, 0x67, 0xBA, 0x71, 0xAD, 0x18, 0xFA, 0x79, 0xCD, 0xB4, 0x67, 0x76, 0xE2, 0x1E, 0xBD, 0xCF, 0xB4, 0x0C, 0xA3, + 0xFD, 0x79, 0x2D, 0xB6, 0xE2, 0x58, 0xA3, 0x50, 0xE1, 0xA5, 0xDA, 0xE8, 0xC9, 0x37, 0x27, 0x47, 0x47, 0xC3, 0x67, 0x4F, 0xAC, 0xB1, 0xBB, 0xE4, 0xFF, 0x7F, + 0x64, 0x0B, 0xB4, 0x2E, 0xF1, 0x3C, 0xB0, 0x39, 0xF7, 0xEC, 0x90, 0x62, 0x4B, 0x50, 0x70, 0x08, 0x24, 0xA4, 0x10, 0xC5, 0xB3, 0x41, 0x11, 0x5D, 0x7E, 0x13, + 0x17, 0x12, 0x9C, 0xB1, 0xE6, 0x08, 0x9A, 0xD0, 0x66, 0x6C, 0xAE, 0x41, 0x63, 0x48, 0x8D, 0x2A, 0x63, 0x6C, 0xDF, 0x24, 0x49, 0xA7, 0xDC, 0x70, 0x4D, 0xF1, + 0x56, 0x44, 0x4F, 0x43, 0x08, 0x60, 0x14, 0x1C, 0xD7, 0x59, 0xA1, 0x8D, 0xB0, 0x51, 0x4C, 0xF6, 0xD8, 0xF8, 0x66, 0x62, 0x7E, 0xF1, 0x95, 0x5E, 0xF3, 0xB5, + 0x61, 0xD9, 0x1E, 0x1B, 0x49, 0x52, 0xBA, 0x8A, 0xB1, 0xCA, 0x61, 0x22, 0xAB, 0x85, 0x8C, 0x0B, 0x10, 0x6D, 0x8B, 0x62, 0x67, 0xD7, 0xB2, 0x31, 0x51, 0x6C, + 0x11, 0x85, 0xFA, 0xC0, 0xB5, 0xD1, 0x2F, 0x17, 0x6F, 0xFF, 0xA1, 0xBC, 0x7B, 0xF3, 0x6F, 0xA1, 0x86, 0xF2, 0x88, 0xC2, 0xE0, 0x2C, 0xD1, 0x33, 0x05, 0x63, + 0xFA, 0xF0, 0x65, 0x52, 0xE3, 0x9A, 0xA1, 0x18, 0x30, 0x19, 0x32, 0x89, 0x35, 0xF3, 0xE6, 0xE7, 0x35, 0xB5, 0x86, 0xBB, 0x5B, 0xFC, 0xB3, 0x6E, 0x4D, 0xC1, + 0xC0, 0x4D, 0x0F, 0xAE, 0x35, 0x73, 0x85, 0x47, 0x1D, 0x19, 0x5E, 0x37, 0x4D, 0x4B, 0xD8, 0x8C, 0x47, 0x94, 0x40, 0xC6, 0x91, 0x08, 0x1C, 0x97, 0x72, 0x6D, + 0x74, 0x45, 0xBC, 0xB3, 0x43, 0x76, 0x2B, 0x47, 0x6B, 0xD9, 0x7D, 0x83, 0x0B, 0x33, 0x73, 0xC8, 0x32, 0xA1, 0x2C, 0xC5, 0x4F, 0x1D, 0x6D, 0x41, 0x50, 0x2A, + 0x52, 0x9A, 0x8F, 0x6A, 0x3D, 0x80, 0xAC, 0x8D, 0x3E, 0x10, 0x9A, 0x65, 0x00, 0x19, 0x52, 0x8A, 0x3F, 0xE3, 0x29, 0x7C, 0xAC, 0xFF, 0xC0, 0x9E, 0xF9, 0x92, + 0x5D, 0x4B, 0x63, 0x66, 0x2E, 0x21, 0xF7, 0xC7, 0xAD, 0x96, 0x32, 0x78, 0xF7, 0x5E, 0x69, 0xB5, 0x24, 0x1A, 0xDB, 0x4B, 0xEA, 0x4E, 0xBE, 0xFE, 0x7B, 0x35, + 0x3E, 0xA1, 0x20, 0x54, 0x3F, 0xEC, 0xA8, 0x36, 0xFA, 0xF1, 0xEA, 0x97, 0xD7, 0x2F, 0x1A, 0xDD, 0xC1, 0xB0, 0x73, 0xA3, 0x9E, 0x74, 0x3B, 0xCD, 0xB3, 0x43, + 0x06, 0x57, 0xBC, 0x83, 0x6E, 0x6D, 0xF4, 0x5E, 0xF9, 0xEE, 0xCD, 0xAB, 0x86, 0xDA, 0x39, 0xAE, 0x8C, 0x4C, 0xAD, 0x8D, 0x7E, 0xFE, 0x31, 0xA4, 0x6C, 0xD8, + 0xA9, 0x82, 0x0C, 0x4C, 0xFF, 0x47, 0xA0, 0x8B, 0xA1, 0xEA, 0xF7, 0x0B, 0xA1, 0x42, 0x91, 0xF7, 0xCA, 0x89, 0x5C, 0x3D, 0x81, 0x7E, 0x29, 0x0F, 0x9D, 0xFE, + 0xF1, 0x8D, 0x3A, 0x18, 0xF6, 0xCB, 0xF3, 0xA0, 0x1E, 0xA3, 0x74, 0x81, 0x90, 0xC6, 0xF1, 0xB0, 0x5F, 0x15, 0xD7, 0x11, 0xE2, 0x02, 0x81, 0x1C, 0x75, 0x41, + 0x1E, 0xDD, 0xE3, 0x0A, 0xA2, 0x55, 0x87, 0xB5, 0x11, 0x55, 0xF9, 0x09, 0xA2, 0xEA, 0x14, 0x43, 0x85, 0xA2, 0xED, 0x96, 0x14, 0xED, 0xA0, 0x36, 0xFA, 0x09, + 0x45, 0x8B, 0x96, 0x01, 0x3C, 0x54, 0x31, 0x0F, 0xB5, 0x0F, 0x51, 0x8A, 0xE2, 0xEA, 0xA2, 0xDD, 0x76, 0xBA, 0x55, 0x44, 0xDB, 0xAB, 0x8D, 0x50, 0x1C, 0x88, + 0xE9, 0xA8, 0x8A, 0x03, 0xA8, 0xE0, 0x4D, 0x94, 0x26, 0x20, 0xE7, 0xE6, 0x68, 0x78, 0x5C, 0x01, 0x13, 0xB8, 0xD2, 0xD5, 0x27, 0x40, 0x75, 0x0C, 0x92, 0xAA, + 0xE4, 0x47, 0x2A, 0xF8, 0x11, 0x22, 0x1A, 0xF6, 0x3B, 0x37, 0xFD, 0x2A, 0x56, 0x03, 0x7E, 0xF1, 0x06, 0x11, 0x01, 0x92, 0x9B, 0x5E, 0x15, 0x29, 0x81, 0x53, + 0x5C, 0x7C, 0xFF, 0x5D, 0xA3, 0x0F, 0x9C, 0x75, 0x4F, 0x86, 0xE5, 0xF1, 0x80, 0x43, 0x00, 0x1D, 0x48, 0x4B, 0x69, 0x14, 0xE0, 0x08, 0x3F, 0x22, 0x4F, 0x88, + 0xA7, 0x5B, 0x2C, 0xC4, 0xC4, 0x11, 0x81, 0x65, 0x03, 0x3C, 0xE2, 0x28, 0x8D, 0x02, 0x0C, 0xFA, 0x0D, 0x25, 0x06, 0x11, 0xA9, 0x47, 0x15, 0x04, 0x03, 0xE6, + 0xFC, 0x23, 0x4A, 0x18, 0x90, 0x60, 0xE4, 0xAC, 0x10, 0x83, 0x6B, 0x23, 0x70, 0x0A, 0x8C, 0x36, 0xE5, 0xCD, 0x0F, 0x68, 0xA1, 0x5C, 0xA9, 0x43, 0xEA, 0xF2, + 0xE5, 0x89, 0x01, 0x3B, 0x3E, 0x19, 0xDE, 0x9C, 0x0C, 0xE5, 0x10, 0x60, 0xE6, 0x81, 0xA3, 0x65, 0x56, 0x6E, 0x92, 0x9D, 0xBA, 0x64, 0xA5, 0x25, 0xFF, 0x5A, + 0x69, 0x26, 0xCC, 0xB3, 0x0A, 0x27, 0x25, 0x1C, 0x0E, 0x64, 0xC2, 0x0E, 0xE4, 0xF2, 0x91, 0x08, 0x25, 0xC1, 0x86, 0xB7, 0xDA, 0xA8, 0x2F, 0x91, 0xF7, 0xC5, + 0x26, 0x06, 0x14, 0x36, 0x46, 0x3F, 0x4D, 0x46, 0xD1, 0xF2, 0x30, 0x0D, 0x05, 0x6F, 0xE8, 0xD5, 0x22, 0x51, 0xA3, 0x54, 0xC2, 0x23, 0xA0, 0x55, 0xBB, 0xA9, + 0x8D, 0x86, 0xBD, 0xDC, 0x44, 0xB1, 0xBC, 0x32, 0xC6, 0xB4, 0x56, 0x64, 0x11, 0xD7, 0x2D, 0xAC, 0x8F, 0x10, 0xB4, 0x36, 0x7A, 0x19, 0x1C, 0x57, 0xD1, 0x4A, + 0x2B, 0x8F, 0x53, 0x0A, 0x9B, 0xA2, 0x96, 0x08, 0x39, 0x4C, 0x33, 0xAD, 0x1E, 0x57, 0x4D, 0xA8, 0x99, 0xED, 0x2A, 0x66, 0x97, 0x7A, 0xC1, 0x69, 0xAD, 0xA3, + 0xB9, 0x5E, 0x61, 0xAD, 0xF8, 0x80, 0x30, 0x4E, 0xF0, 0xA3, 0x7B, 0xD3, 0x48, 0x40, 0xCA, 0xDF, 0x40, 0x1F, 0xAE, 0xE6, 0xAD, 0x58, 0xD5, 0xB2, 0xB0, 0x46, + 0x42, 0x50, 0x48, 0x4B, 0x82, 0xE3, 0x4A, 0x5A, 0xA9, 0x12, 0xBE, 0x22, 0xE4, 0x70, 0xBD, 0xF8, 0x21, 0xAC, 0xBF, 0x23, 0xBD, 0xE4, 0x51, 0x5B, 0x49, 0x2F, + 0x73, 0xCD, 0x59, 0x96, 0x0A, 0x5F, 0x01, 0x24, 0x68, 0xC5, 0x3F, 0xBC, 0x37, 0x57, 0x09, 0x89, 0xF9, 0x1B, 0xF8, 0x8A, 0x4E, 0x2C, 0xDB, 0x70, 0x8B, 0x57, + 0x1D, 0x38, 0x5C, 0x6D, 0xF4, 0x8A, 0xB4, 0x7E, 0xC0, 0xA3, 0x2A, 0xEA, 0x78, 0xB1, 0xF2, 0xEC, 0x0A, 0x0A, 0xF1, 0x69, 0x61, 0xEA, 0xE8, 0x70, 0x6D, 0x1C, + 0xEF, 0x48, 0x1B, 0xC7, 0x3B, 0xD4, 0x86, 0x46, 0x3E, 0x9B, 0xE4, 0x9A, 0x98, 0x85, 0xD5, 0xE1, 0x03, 0xD6, 0x46, 0x97, 0x37, 0x4B, 0xDB, 0xC5, 0x47, 0xB8, + 0xDE, 0xE2, 0x79, 0x25, 0x27, 0x19, 0x54, 0xD0, 0x49, 0x40, 0x10, 0xF7, 0x91, 0x01, 0xD7, 0xCA, 0x60, 0x47, 0x5A, 0xC9, 0xA3, 0xB5, 0x8A, 0x56, 0x66, 0x9A, + 0x61, 0x4D, 0x88, 0x61, 0xE2, 0xE3, 0x24, 0x45, 0x15, 0x13, 0x81, 0xAD, 0x8D, 0x5E, 0x87, 0x27, 0x55, 0x14, 0xD3, 0xA9, 0xA0, 0x97, 0x28, 0x3D, 0x71, 0x7F, + 0x19, 0xC0, 0x54, 0x7C, 0x47, 0xBA, 0x51, 0xD5, 0x5D, 0x8E, 0x2A, 0x4B, 0x32, 0x31, 0x34, 0xF3, 0x33, 0x99, 0x4E, 0x61, 0x1A, 0x54, 0x7C, 0x68, 0x89, 0x81, + 0xC3, 0xF8, 0xC2, 0xCE, 0x95, 0x4B, 0x7A, 0x5E, 0xB8, 0x8E, 0x9A, 0x40, 0x57, 0xBE, 0x98, 0x9A, 0x9C, 0x13, 0x0A, 0xCB, 0xA3, 0x3F, 0xD8, 0x01, 0x9D, 0xE5, + 0xA7, 0xAD, 0x3F, 0x90, 0x19, 0xDD, 0xCE, 0x50, 0x65, 0xF6, 0xFC, 0xDA, 0xD1, 0x6E, 0xE9, 0xBB, 0x21, 0xAA, 0xCC, 0xE5, 0x3F, 0x10, 0x5D, 0xF9, 0x68, 0x58, + 0xE5, 0x99, 0xE9, 0x23, 0x21, 0x84, 0x58, 0xD5, 0xB0, 0x0C, 0x60, 0x8A, 0x04, 0x07, 0xD5, 0x90, 0x0C, 0x71, 0x6D, 0x61, 0x69, 0x68, 0x0F, 0x61, 0x12, 0xAF, + 0xAD, 0xC7, 0xC5, 0x07, 0x94, 0xF5, 0x18, 0xC6, 0xE5, 0x9F, 0x5F, 0x2A, 0x97, 0x74, 0x03, 0x7E, 0xE1, 0x70, 0xC5, 0xF6, 0x06, 0xCA, 0x18, 0x7A, 0xB8, 0x84, + 0x84, 0x7D, 0x6E, 0xAC, 0xED, 0x89, 0x1D, 0x48, 0x76, 0x7D, 0x4F, 0xC0, 0x9E, 0x4F, 0x20, 0xDD, 0x4A, 0x55, 0x8B, 0x70, 0x2B, 0xC7, 0xE3, 0x0E, 0x53, 0xB1, + 0xC9, 0xBA, 0x78, 0x1A, 0x36, 0x59, 0x83, 0x9A, 0xF4, 0x6B, 0x7C, 0x36, 0x43, 0x57, 0x40, 0x5F, 0x7B, 0x51, 0x14, 0xF6, 0x7A, 0x3F, 0x8A, 0xA2, 0xFC, 0xDE, + 0xB7, 0xA2, 0xC0, 0x5A, 0x3E, 0xE3, 0x38, 0x5A, 0xC6, 0xA9, 0x28, 0x60, 0x6D, 0xF4, 0x4E, 0xB3, 0x56, 0x30, 0xC8, 0xEC, 0x4B, 0x61, 0x41, 0xC7, 0xF7, 0xE6, + 0x5E, 0x9C, 0xEF, 0xFB, 0x56, 0x1D, 0x10, 0xB2, 0xB0, 0xF5, 0xE2, 0xD3, 0x1D, 0x0E, 0xC7, 0x42, 0xE2, 0x3B, 0x38, 0x2A, 0x9C, 0x18, 0xF8, 0x18, 0x76, 0x9C, + 0x11, 0xB0, 0xA9, 0x54, 0xF9, 0x64, 0xE0, 0x6A, 0x65, 0x59, 0xB7, 0x55, 0x32, 0x81, 0x0B, 0xD3, 0x5E, 0xE9, 0xE5, 0x31, 0x40, 0x1A, 0xF0, 0xCF, 0xE9, 0xD4, + 0x98, 0x94, 0x4F, 0x24, 0x70, 0x79, 0xC1, 0x5E, 0x48, 0xC2, 0xEF, 0x78, 0xE0, 0x25, 0x93, 0x12, 0x33, 0xB9, 0x09, 0x68, 0xF1, 0xF2, 0x62, 0xAF, 0x03, 0x2F, + 0xF4, 0x79, 0x4F, 0x91, 0x01, 0xB9, 0xBD, 0xEF, 0xA0, 0x00, 0x44, 0x7C, 0xA6, 0xC6, 0x53, 0x46, 0x59, 0x0C, 0x32, 0x88, 0xE8, 0xFE, 0xF4, 0xFB, 0xBE, 0xE6, + 0x77, 0x21, 0x45, 0xF1, 0xD9, 0x1D, 0x2E, 0x81, 0x07, 0xD3, 0xBB, 0x5E, 0x77, 0xBB, 0x13, 0x3C, 0x44, 0xBE, 0x5B, 0xFD, 0x74, 0xCB, 0xA8, 0x06, 0xA2, 0xD1, + 0x0F, 0xB8, 0xCE, 0x50, 0x20, 0x60, 0x57, 0x77, 0xA4, 0xEE, 0xFD, 0x79, 0x52, 0xF7, 0x01, 0xB8, 0xD2, 0xAC, 0x44, 0xC4, 0x9B, 0x61, 0xC4, 0x7B, 0x7D, 0xB1, + 0x1F, 0x0D, 0xCD, 0xEE, 0x2D, 0xD4, 0xCD, 0xEE, 0x35, 0xD4, 0x29, 0x7C, 0x73, 0xA2, 0x2F, 0x85, 0x92, 0x19, 0x2C, 0x07, 0x64, 0xB5, 0xAC, 0x2A, 0x41, 0x4E, + 0xBD, 0xA9, 0x12, 0xE5, 0x7C, 0x32, 0xE2, 0x41, 0x6E, 0x18, 0xAE, 0x8A, 0x0C, 0xB6, 0xBB, 0xAC, 0xDB, 0xCF, 0xA3, 0xB6, 0x8A, 0xD3, 0x38, 0xDA, 0xFA, 0xF3, + 0x6C, 0xA1, 0x15, 0x56, 0x06, 0x87, 0x03, 0x5D, 0xBC, 0x7B, 0xB1, 0xCF, 0x74, 0xC1, 0xEF, 0xF7, 0x7E, 0xFC, 0x28, 0xE0, 0xFA, 0xBE, 0x63, 0x9D, 0x49, 0xAC, + 0xE2, 0xC1, 0x0E, 0x81, 0x6A, 0xA3, 0xB7, 0xC4, 0x72, 0x95, 0x0B, 0xDB, 0xE1, 0x2F, 0xE4, 0xDC, 0x8B, 0xD6, 0x68, 0xCF, 0xF7, 0xA3, 0x32, 0xC6, 0xF4, 0x7D, + 0xEB, 0x6B, 0xBE, 0x30, 0x1C, 0xC7, 0x76, 0x0A, 0xAB, 0x8C, 0xC3, 0xC1, 0xB4, 0xA2, 0xF5, 0x8E, 0x1E, 0xED, 0x45, 0x5D, 0x7E, 0xAF, 0xF7, 0xA3, 0xB1, 0x80, + 0xE7, 0xFB, 0x56, 0xDA, 0xF5, 0xD4, 0x34, 0x96, 0x85, 0x55, 0x46, 0xA1, 0x6A, 0xA3, 0x4F, 0xAD, 0xEF, 0xE0, 0xEF, 0x5E, 0xD4, 0xC5, 0x7A, 0xBC, 0x1F, 0x65, + 0x71, 0x6E, 0xEF, 0x5B, 0x55, 0xE3, 0x65, 0xF1, 0x70, 0x08, 0x30, 0xB5, 0xD1, 0xCB, 0xF7, 0xFB, 0xC9, 0xFD, 0xB0, 0x33, 0x49, 0x0D, 0x55, 0xD2, 0x07, 0x65, + 0xEA, 0xBE, 0xB5, 0xB1, 0x2E, 0xA1, 0x8D, 0x35, 0x12, 0xFE, 0xF3, 0x9E, 0xB4, 0xB1, 0x96, 0xD7, 0xC6, 0x96, 0xFD, 0x65, 0xFD, 0x10, 0xF4, 0x43, 0x9F, 0x82, + 0x1D, 0x6B, 0xC5, 0x87, 0x23, 0x1F, 0x10, 0x37, 0x8D, 0xC1, 0x91, 0xF2, 0x52, 0xDB, 0xCF, 0x80, 0x14, 0xF4, 0xBB, 0x0F, 0x17, 0x0A, 0x99, 0xDC, 0x87, 0x9E, + 0xA2, 0xCF, 0x76, 0xF1, 0xF7, 0xA3, 0xE6, 0x29, 0x84, 0x3F, 0x63, 0x44, 0x97, 0xD4, 0x89, 0xD7, 0x72, 0x3D, 0xC3, 0x34, 0x21, 0x11, 0x27, 0x9E, 0x72, 0x85, + 0x87, 0x92, 0x0F, 0x15, 0x45, 0xB0, 0xF8, 0x8F, 0x12, 0x7A, 0x0E, 0xD1, 0x16, 0xB5, 0xD1, 0x15, 0xBE, 0x39, 0x16, 0x70, 0xE1, 0x59, 0x3E, 0x32, 0xE9, 0xC7, + 0x8F, 0xE8, 0x83, 0x86, 0xF8, 0xE4, 0x60, 0xFC, 0x45, 0xCF, 0x20, 0x66, 0xF6, 0xB0, 0xF5, 0xE8, 0x8C, 0xBE, 0xB4, 0x92, 0x37, 0xA3, 0xCF, 0xD8, 0xAE, 0xF9, + 0x43, 0x93, 0x63, 0xDB, 0xD4, 0x9F, 0x45, 0x16, 0x9B, 0xAE, 0x82, 0xA7, 0x00, 0x11, 0x04, 0xF4, 0xE4, 0x63, 0xC8, 0x11, 0xF6, 0xDC, 0xF1, 0xD1, 0xB3, 0x07, + 0x35, 0xF1, 0xD5, 0x49, 0x19, 0xD2, 0x4E, 0x79, 0x62, 0xD1, 0x21, 0xB3, 0xC0, 0xF0, 0x44, 0x0F, 0xB2, 0x0A, 0x9F, 0x5F, 0xFC, 0x40, 0x66, 0x86, 0x0B, 0x34, + 0x2A, 0xA0, 0xA7, 0x43, 0xFA, 0xE8, 0x17, 0xB3, 0x2D, 0xB9, 0xC7, 0x0A, 0xA3, 0x5D, 0xF2, 0x67, 0xC6, 0x85, 0x4F, 0x89, 0x16, 0x0A, 0x57, 0xC9, 0x67, 0x3A, + 0xE3, 0x18, 0xF3, 0xAC, 0xF0, 0x71, 0xAB, 0x35, 0xEF, 0xE3, 0x43, 0x6C, 0x8A, 0xCF, 0xDA, 0xD9, 0xE1, 0xBC, 0x9F, 0xF7, 0xC4, 0x4A, 0xEE, 0x13, 0x88, 0xC0, + 0x69, 0xE9, 0x07, 0x10, 0x51, 0x4A, 0x23, 0xA0, 0xE6, 0x40, 0x79, 0xA7, 0xB9, 0x5F, 0x0E, 0x94, 0x4F, 0x38, 0x1F, 0xDF, 0xE3, 0x73, 0x88, 0x48, 0xBB, 0xA6, + 0xEB, 0x4E, 0xEA, 0xB3, 0x88, 0xFD, 0xD8, 0xB3, 0x88, 0x43, 0xFF, 0x59, 0xC4, 0x61, 0xB8, 0xF9, 0xE5, 0xA6, 0xD7, 0xE9, 0x1C, 0xCB, 0xB0, 0x2E, 0xF9, 0x3C, + 0xE2, 0x56, 0x78, 0x5A, 0x80, 0x34, 0x25, 0x79, 0xEA, 0xFB, 0x3C, 0x45, 0x36, 0x89, 0xDE, 0x4C, 0xA7, 0x0F, 0x8D, 0x23, 0x5E, 0xA6, 0x2E, 0xCF, 0x52, 0xA7, + 0xBB, 0xEF, 0x87, 0x46, 0xA9, 0x71, 0x6F, 0xEB, 0x99, 0x51, 0xDA, 0x24, 0x19, 0x0D, 0x07, 0x99, 0xC1, 0x90, 0x82, 0x30, 0xA7, 0x7F, 0xBD, 0x4D, 0xA7, 0x9F, + 0x55, 0x70, 0xFA, 0xD9, 0x86, 0xD3, 0xEF, 0xD1, 0xDB, 0x7D, 0xC2, 0xFF, 0x6E, 0x1E, 0xEF, 0xF3, 0x55, 0xC0, 0xEB, 0x85, 0x7C, 0x75, 0x3A, 0x5B, 0xF5, 0xFB, + 0x5C, 0x27, 0x09, 0x8C, 0xE1, 0xF5, 0x36, 0x9D, 0x24, 0xC5, 0x74, 0x4B, 0xD9, 0x29, 0x0F, 0x3B, 0xA3, 0xFD, 0x8C, 0x4B, 0x34, 0x9B, 0x8A, 0x2A, 0x94, 0xF7, + 0x8E, 0x8F, 0x88, 0xF5, 0xFA, 0x3C, 0x75, 0xDA, 0x86, 0x7A, 0xE4, 0x9F, 0x4F, 0x4F, 0x6D, 0xB2, 0x9D, 0xC4, 0x6C, 0x09, 0x79, 0x70, 0xE1, 0xC4, 0xEC, 0xFD, + 0xDB, 0xB7, 0xC5, 0x72, 0xB1, 0x68, 0x2F, 0x0F, 0x24, 0x17, 0xCB, 0x2C, 0x8D, 0xDC, 0x2E, 0xE1, 0x06, 0x52, 0x5D, 0xCA, 0x74, 0x43, 0xF0, 0xDA, 0xE8, 0x25, + 0x3D, 0x56, 0x22, 0x12, 0x2B, 0x64, 0xBC, 0xD2, 0x33, 0x3F, 0x0A, 0x18, 0xA9, 0x9D, 0x84, 0x24, 0x24, 0x75, 0x23, 0x89, 0x2B, 0xA3, 0x5E, 0x12, 0x61, 0x4F, + 0x9E, 0xA9, 0xCA, 0x3E, 0x41, 0x9B, 0xE4, 0xA5, 0xC2, 0x4B, 0x87, 0x94, 0x56, 0x1B, 0x87, 0xAD, 0x8D, 0xDE, 0x3B, 0x44, 0x79, 0x65, 0x5C, 0xCB, 0xF3, 0x16, + 0xD9, 0x37, 0x14, 0x20, 0x91, 0x93, 0x72, 0x72, 0x43, 0x8F, 0x70, 0x93, 0x10, 0xAE, 0xBD, 0xC9, 0xEE, 0xAE, 0x11, 0x60, 0x85, 0xB4, 0xAB, 0x5B, 0x0D, 0x43, + 0xAF, 0x36, 0xEA, 0x55, 0xC3, 0xD0, 0xAF, 0x8D, 0xFA, 0xD5, 0x30, 0x0C, 0x40, 0x0E, 0xED, 0x41, 0x35, 0x1C, 0xC3, 0xDA, 0x68, 0x58, 0x0D, 0xC3, 0x11, 0xC8, + 0xB2, 0x2A, 0x15, 0x90, 0xB9, 0x1C, 0x17, 0xC0, 0x90, 0xBF, 0xE7, 0x89, 0xB5, 0xAA, 0xEE, 0x3C, 0x8B, 0x95, 0x59, 0xDA, 0x79, 0x38, 0x6C, 0x6D, 0xF4, 0x6E, + 0x65, 0x7A, 0xC6, 0xD2, 0x34, 0x60, 0xDA, 0xDE, 0xE8, 0x2B, 0x2D, 0xA5, 0x3B, 0xE8, 0x36, 0xF7, 0x98, 0x61, 0xFA, 0x74, 0xC8, 0xBD, 0xDA, 0xA6, 0xE7, 0x27, + 0x61, 0xEA, 0x71, 0xF4, 0x11, 0xE3, 0x07, 0x11, 0xCE, 0x1C, 0xDB, 0xF6, 0x4A, 0xAB, 0xC3, 0x07, 0x86, 0x34, 0x1F, 0x8E, 0x4A, 0x47, 0xB3, 0x10, 0x4D, 0x19, + 0x43, 0x4F, 0xD9, 0xF3, 0x58, 0x31, 0x9C, 0xA9, 0xC5, 0xC2, 0xD9, 0xFE, 0xDC, 0xC7, 0xBD, 0x2D, 0x9F, 0x32, 0x70, 0x58, 0x98, 0xAD, 0xDE, 0xC2, 0x0C, 0x71, + 0x81, 0x0A, 0x53, 0x1A, 0x1D, 0x70, 0x1F, 0x75, 0xB0, 0x4F, 0xEF, 0xF1, 0xC9, 0x28, 0xF8, 0x62, 0xA8, 0xA8, 0xF7, 0x3C, 0x0C, 0xE7, 0xA1, 0xFA, 0x20, 0xA6, + 0x3E, 0x28, 0xAF, 0x11, 0x1F, 0x1A, 0xF2, 0x01, 0x7C, 0x3D, 0x57, 0x25, 0x3F, 0x8A, 0x20, 0x2B, 0xE7, 0x48, 0xD5, 0x9D, 0x46, 0xE8, 0x8A, 0x15, 0xF3, 0x82, + 0x6E, 0xE5, 0x51, 0xBD, 0xF7, 0x10, 0xC7, 0xC2, 0x25, 0xBE, 0xD1, 0x8D, 0xC8, 0xED, 0xB6, 0xA2, 0xC8, 0xA2, 0x49, 0x24, 0x83, 0xE5, 0x46, 0xC3, 0x76, 0x99, + 0xEE, 0x35, 0xF3, 0xF7, 0x09, 0xD8, 0x5C, 0xF6, 0x29, 0xBE, 0x28, 0x17, 0x61, 0x4E, 0x34, 0x11, 0x08, 0x78, 0x7D, 0x70, 0xB3, 0x00, 0x24, 0xAC, 0xF4, 0x34, + 0x80, 0x03, 0x73, 0x15, 0x06, 0x91, 0xB8, 0xA7, 0x16, 0x88, 0xC4, 0xD1, 0x19, 0x41, 0x80, 0xAF, 0xE4, 0x68, 0x77, 0xEF, 0xE9, 0x7F, 0x5F, 0x1C, 0x3C, 0x2A, + 0xBA, 0x7E, 0xC1, 0x34, 0x58, 0x80, 0x01, 0xDF, 0x17, 0xA6, 0x16, 0x49, 0xE8, 0xB7, 0x17, 0x3E, 0x22, 0x2B, 0x81, 0xD4, 0xE0, 0xE8, 0xD0, 0x4D, 0x3C, 0x36, + 0xCF, 0x2F, 0xB0, 0xFC, 0x97, 0xDA, 0x64, 0x3B, 0xD5, 0x9D, 0xB5, 0x61, 0x15, 0xAF, 0xEE, 0xFC, 0x6C, 0x58, 0xBA, 0xBD, 0x2E, 0x56, 0xE0, 0x89, 0x76, 0xF4, + 0x17, 0x28, 0xF0, 0xD0, 0xF4, 0x00, 0x97, 0x6C, 0x5B, 0x0E, 0x91, 0x7B, 0xBD, 0x45, 0x52, 0xC8, 0x0C, 0xFA, 0x06, 0x17, 0x58, 0x01, 0x85, 0xAB, 0xD0, 0x05, + 0xE0, 0x5D, 0x67, 0x6A, 0xBF, 0x9C, 0x46, 0x73, 0x35, 0x4E, 0x81, 0x5C, 0xAE, 0xD6, 0x17, 0x94, 0x9B, 0xEF, 0xBD, 0x82, 0xFE, 0xEB, 0x26, 0x3F, 0xB7, 0xF7, + 0xCE, 0xCF, 0x36, 0x06, 0x20, 0x62, 0xE9, 0xA5, 0x2D, 0x0B, 0x61, 0x43, 0xBB, 0xBA, 0xB4, 0xF4, 0xBD, 0x5A, 0x15, 0xEB, 0xBD, 0xB4, 0x0E, 0xBA, 0xC3, 0x6E, + 0xEF, 0x61, 0x99, 0x15, 0x32, 0x54, 0xC1, 0xA8, 0xD4, 0x93, 0xC1, 0x03, 0x9A, 0xD2, 0xD8, 0xD3, 0x29, 0x5B, 0xD7, 0x2C, 0x67, 0x5A, 0x1C, 0xFC, 0x86, 0x3E, + 0xB4, 0xE7, 0x92, 0xFD, 0xC6, 0xAB, 0xA0, 0xF3, 0x82, 0xA5, 0x99, 0x88, 0x2E, 0x86, 0x0F, 0xCB, 0xB4, 0x38, 0x47, 0xB2, 0xD6, 0x25, 0xE0, 0xA8, 0xFF, 0x70, + 0x4C, 0xCB, 0xB3, 0x3D, 0xCD, 0x2C, 0x6D, 0x59, 0x0C, 0x1A, 0x0C, 0xEB, 0x23, 0x1E, 0x28, 0x57, 0xC0, 0xE7, 0x5E, 0x8D, 0xCB, 0xEF, 0xBF, 0x7C, 0xE0, 0x3A, + 0xEE, 0x6F, 0x49, 0x19, 0x15, 0x58, 0xFA, 0x75, 0x93, 0xA5, 0x4A, 0xA1, 0x6B, 0xB8, 0xA5, 0x45, 0xF2, 0xAD, 0x84, 0xAE, 0x95, 0x87, 0x57, 0x4B, 0x87, 0x2E, + 0x06, 0x8E, 0xA1, 0x8B, 0x1E, 0xED, 0xDF, 0xC4, 0x02, 0x0A, 0xCA, 0xDB, 0xD8, 0xE0, 0x64, 0x9B, 0x5B, 0x60, 0xB6, 0x11, 0xC1, 0x18, 0x4F, 0x95, 0x8C, 0x6C, + 0x5B, 0x7E, 0x53, 0xD9, 0xC8, 0x26, 0x9A, 0xF4, 0x2B, 0x9F, 0x28, 0xB2, 0x68, 0x36, 0xCF, 0x60, 0x61, 0x0E, 0xC7, 0x0E, 0xF6, 0x5A, 0xB1, 0xF1, 0x3B, 0xDF, + 0xFA, 0x42, 0x6D, 0xC0, 0xD5, 0x43, 0xAA, 0xCF, 0x8C, 0x0D, 0xCB, 0x2A, 0xAB, 0x26, 0x0E, 0x5B, 0x1B, 0xBD, 0x64, 0x07, 0xFB, 0x5D, 0x52, 0xE7, 0x9D, 0x6F, + 0x7F, 0x3D, 0xDD, 0xE7, 0x6A, 0xDF, 0x6A, 0x4A, 0x14, 0x31, 0x9C, 0xE0, 0x73, 0x04, 0x35, 0xBE, 0x47, 0x35, 0xFC, 0x3C, 0xC1, 0xC3, 0x29, 0x69, 0xCC, 0xB4, + 0x05, 0x3E, 0xCB, 0x58, 0xB4, 0xA8, 0xF1, 0x1A, 0xC1, 0x8A, 0xD5, 0x34, 0xE2, 0x3D, 0x3D, 0xEC, 0xAA, 0xC6, 0x28, 0xFE, 0x12, 0x3B, 0x20, 0xBC, 0x35, 0x36, + 0x34, 0x17, 0x9F, 0xFB, 0x85, 0x63, 0xE5, 0x25, 0x1C, 0x2B, 0xEF, 0xCD, 0x55, 0xF0, 0x16, 0x4E, 0x91, 0x43, 0x44, 0xF7, 0xB3, 0x85, 0x18, 0xD2, 0x1E, 0x1F, + 0xA0, 0xDB, 0xF8, 0xF8, 0xF3, 0x1E, 0x70, 0x8C, 0xBB, 0xD7, 0x06, 0xFD, 0xE3, 0x4E, 0x4D, 0x61, 0x59, 0x31, 0x7F, 0xCA, 0xD7, 0xFD, 0x42, 0xB7, 0xB5, 0xA9, + 0x01, 0x81, 0x22, 0x07, 0x88, 0xD2, 0x1B, 0x10, 0x48, 0xED, 0xB7, 0xCA, 0x6E, 0xB3, 0x4D, 0x89, 0xA8, 0xBE, 0x38, 0x3A, 0x42, 0x43, 0x88, 0xBD, 0x76, 0x8F, + 0xB5, 0x8F, 0x3F, 0xAF, 0xDC, 0x1D, 0x88, 0x5E, 0x87, 0x28, 0x16, 0x84, 0x2A, 0x14, 0x04, 0xEE, 0xEE, 0xDB, 0x2E, 0x4F, 0x5D, 0x9F, 0x27, 0x55, 0x8E, 0xA7, + 0x6E, 0x05, 0x9E, 0xBA, 0x7B, 0xE2, 0xA9, 0xE7, 0xF3, 0xD4, 0x95, 0xE3, 0xA9, 0x57, 0x81, 0xA7, 0xDE, 0x9E, 0x78, 0xEA, 0xFB, 0x3C, 0xF5, 0xE4, 0x78, 0xEA, + 0x57, 0xE0, 0xA9, 0xBF, 0x27, 0x9E, 0x06, 0x3E, 0x4F, 0x7D, 0x39, 0x9E, 0x06, 0x15, 0x78, 0x1A, 0xEC, 0x89, 0xA7, 0xA1, 0xCF, 0xD3, 0x40, 0x8E, 0xA7, 0x61, + 0x05, 0x9E, 0x86, 0x7B, 0xE2, 0xE9, 0xC8, 0xE7, 0x69, 0x28, 0xC7, 0xD3, 0x51, 0x05, 0x9E, 0x8E, 0xF6, 0xC4, 0xD3, 0xB1, 0xCF, 0xD3, 0x91, 0x1C, 0x4F, 0xC7, + 0x15, 0x78, 0x3A, 0xDE, 0x13, 0x4F, 0x27, 0x3E, 0x4F, 0xC7, 0x72, 0x3C, 0x9D, 0x54, 0xE0, 0xE9, 0x64, 0x4F, 0x3C, 0xE1, 0x6E, 0x2A, 0xC6, 0xD4, 0x89, 0xE4, + 0xA0, 0xDB, 0xA9, 0xC0, 0x95, 0xB6, 0x2F, 0xAE, 0x82, 0x54, 0x42, 0x95, 0xCD, 0x25, 0xAA, 0x24, 0x13, 0xE3, 0x7D, 0xB1, 0x15, 0x66, 0x13, 0x92, 0xE9, 0x84, + 0x5A, 0x25, 0x9F, 0x98, 0xEC, 0x8B, 0xAD, 0x20, 0xA1, 0x50, 0x25, 0x33, 0x0A, 0xB5, 0x4A, 0x4A, 0xA1, 0xEF, 0x8B, 0xAD, 0x20, 0xA7, 0x50, 0x25, 0x93, 0x0A, + 0xB5, 0x4A, 0x56, 0x41, 0xF6, 0xC5, 0x56, 0x90, 0x56, 0xA8, 0x92, 0x79, 0x85, 0x5A, 0x25, 0xB1, 0x98, 0xEE, 0x8B, 0xAD, 0x20, 0xB3, 0x50, 0x25, 0x53, 0x0B, + 0xB5, 0x42, 0x6E, 0x71, 0x22, 0x9E, 0x88, 0x6D, 0x95, 0x2D, 0xE2, 0xF1, 0x29, 0x72, 0x38, 0x69, 0x93, 0x7A, 0xE0, 0x88, 0x03, 0xE1, 0x13, 0x71, 0x4C, 0x20, + 0x17, 0xB6, 0x35, 0x35, 0x66, 0x41, 0x91, 0xE1, 0xC1, 0x3C, 0x1B, 0xE3, 0x46, 0xDE, 0xFF, 0x29, 0x5D, 0x68, 0xB8, 0x7A, 0x75, 0x59, 0xAC, 0xCC, 0x10, 0xED, + 0xE5, 0x2F, 0x54, 0x64, 0x00, 0xB2, 0xBB, 0xD1, 0x97, 0x91, 0x4B, 0xD5, 0x15, 0x28, 0x50, 0x91, 0x8A, 0xC2, 0x20, 0x5A, 0x51, 0x18, 0x4A, 0x57, 0x14, 0x18, + 0x71, 0xBB, 0xA9, 0x25, 0x00, 0xEE, 0x1E, 0x7B, 0x83, 0xBA, 0x3C, 0xD3, 0xBD, 0xF2, 0x4C, 0x0F, 0x8A, 0x30, 0xDD, 0x2B, 0xC3, 0x74, 0x89, 0x67, 0x5A, 0x25, + 0xE5, 0x04, 0xF4, 0x7E, 0x67, 0xDC, 0x10, 0x5D, 0xF9, 0x55, 0x5E, 0x54, 0x6A, 0x79, 0x51, 0x1D, 0x15, 0x11, 0x95, 0xBA, 0x43, 0xFB, 0x18, 0xF8, 0x7C, 0xFF, + 0x24, 0xCF, 0xF7, 0xA0, 0x3C, 0xDF, 0xBD, 0x22, 0x7C, 0x0F, 0x76, 0xC8, 0x77, 0xDF, 0xE7, 0xFB, 0x93, 0x3C, 0xDF, 0xFD, 0xF2, 0x7C, 0xF7, 0x8B, 0xF0, 0xDD, + 0xDF, 0x21, 0xDF, 0xF8, 0xB5, 0xDA, 0x9F, 0x3E, 0x29, 0x1F, 0xE7, 0x0E, 0x71, 0xE7, 0xF9, 0x95, 0x38, 0x06, 0x51, 0x76, 0x6C, 0x1F, 0xEC, 0x61, 0xEE, 0x86, + 0x14, 0xF6, 0xA2, 0x3C, 0xE5, 0xE6, 0xCD, 0x0C, 0x42, 0xE6, 0x13, 0x25, 0x62, 0x9E, 0xC4, 0x33, 0x37, 0x55, 0x96, 0xA9, 0xDD, 0xC5, 0xB0, 0xE3, 0xDA, 0xE8, + 0xCD, 0xAA, 0xC0, 0xF8, 0x76, 0x5C, 0xDE, 0x9E, 0xE5, 0x2B, 0xE6, 0x8C, 0xAE, 0x9D, 0xD9, 0xF3, 0x09, 0xE5, 0x19, 0xF2, 0x32, 0x57, 0x42, 0xED, 0xE5, 0xAB, + 0x10, 0x83, 0x3D, 0x54, 0xC9, 0x31, 0xD2, 0x1F, 0x31, 0x76, 0x7E, 0x42, 0x86, 0x14, 0xC8, 0x58, 0x0A, 0x0C, 0x46, 0x47, 0x05, 0xB5, 0x79, 0x5C, 0x32, 0x3A, + 0x21, 0x8D, 0x3B, 0x53, 0x27, 0x4E, 0x3D, 0x50, 0x00, 0x9F, 0x4A, 0x08, 0x60, 0x58, 0x5E, 0x00, 0x85, 0x32, 0x17, 0xA4, 0x71, 0x77, 0x02, 0xE8, 0x30, 0x01, + 0x5C, 0x85, 0xEF, 0xC0, 0xCD, 0x30, 0xE8, 0x0A, 0x15, 0xA8, 0xC1, 0x1E, 0xD6, 0x48, 0x30, 0xD2, 0xAA, 0xBE, 0x45, 0x03, 0x47, 0xC5, 0x14, 0xDA, 0x2D, 0x9A, + 0x5F, 0x89, 0x8B, 0x9F, 0x12, 0xF9, 0xF7, 0x2E, 0x13, 0xAC, 0x6E, 0xC7, 0xB7, 0xE8, 0xE2, 0x02, 0xE8, 0x94, 0x17, 0x80, 0x5A, 0x48, 0x00, 0x9D, 0x87, 0x95, + 0x8C, 0x0F, 0x37, 0x3F, 0x5B, 0x9A, 0x2F, 0xAD, 0xA2, 0xEE, 0x1F, 0x19, 0xCD, 0xBA, 0x45, 0x84, 0xB5, 0x53, 0xEF, 0xEF, 0x85, 0x9C, 0x2B, 0xBF, 0x2A, 0xF1, + 0xAD, 0xAF, 0x59, 0x71, 0xA0, 0x7C, 0x11, 0x70, 0xB0, 0x87, 0xF5, 0x2A, 0xA4, 0xF0, 0x44, 0xC0, 0x59, 0xC1, 0x00, 0x7F, 0x52, 0xDE, 0x1D, 0x0A, 0x69, 0x18, + 0x69, 0xDD, 0x9D, 0x8A, 0x07, 0x31, 0x41, 0xB0, 0x4F, 0x26, 0xCB, 0xA8, 0xB8, 0x7C, 0xE5, 0x70, 0xB0, 0x87, 0xA5, 0x2E, 0xA4, 0xF0, 0x58, 0xC0, 0x59, 0x41, + 0x15, 0x17, 0x4D, 0x49, 0x8F, 0x4B, 0x4E, 0x2D, 0xD5, 0x5D, 0xE6, 0xA4, 0x58, 0xED, 0x8E, 0x08, 0x22, 0xFA, 0x3E, 0xFB, 0x2C, 0x05, 0x97, 0xAF, 0x78, 0x0F, + 0x2A, 0xAE, 0xCF, 0xEE, 0x2E, 0x92, 0x1F, 0x89, 0x3E, 0x76, 0x9C, 0x6F, 0x07, 0x45, 0x73, 0xD9, 0x4E, 0xC9, 0x81, 0x6F, 0xA7, 0xA9, 0x2C, 0xF4, 0x0E, 0x59, + 0xCF, 0x26, 0xF7, 0x19, 0x26, 0x50, 0x7E, 0xE5, 0x6D, 0xB0, 0x87, 0xED, 0x21, 0x48, 0x61, 0xB7, 0x36, 0xFA, 0x54, 0x90, 0xA9, 0x2A, 0xF5, 0x83, 0xD2, 0xFB, + 0x43, 0xF6, 0x57, 0x7A, 0x9F, 0x2C, 0x6E, 0x8A, 0x97, 0xDE, 0x2F, 0xDE, 0xFD, 0x52, 0xAC, 0xF4, 0x1E, 0xED, 0x65, 0x7F, 0xA5, 0xF7, 0x72, 0x36, 0x53, 0x68, + 0xA3, 0x2C, 0x30, 0x86, 0xAF, 0x42, 0x9A, 0x18, 0x2E, 0xED, 0x12, 0x04, 0xA3, 0xBC, 0xF7, 0x4F, 0x03, 0x11, 0x45, 0x9E, 0x51, 0x8E, 0xB7, 0xCF, 0xB2, 0x9E, + 0x5E, 0x46, 0x58, 0x28, 0xF5, 0x0C, 0x2F, 0xBE, 0x50, 0x67, 0xC8, 0x3F, 0xF9, 0x53, 0xE1, 0x59, 0xE0, 0xB4, 0x77, 0x8D, 0xB4, 0x8F, 0x0A, 0xE2, 0xDE, 0xF9, + 0x2B, 0x06, 0x46, 0x09, 0x45, 0xA9, 0x54, 0x3F, 0x2A, 0x9E, 0x4B, 0xD7, 0xC9, 0x29, 0x58, 0x91, 0x68, 0xDE, 0x8B, 0x96, 0x5A, 0xE4, 0xA3, 0x39, 0x23, 0x6F, + 0x37, 0xD1, 0x1C, 0x71, 0xC7, 0x78, 0x2F, 0x90, 0xD5, 0x30, 0xD8, 0x62, 0x02, 0x10, 0x6F, 0xA2, 0x90, 0x10, 0x40, 0x9A, 0x04, 0xB6, 0x22, 0x82, 0x2E, 0x95, + 0x40, 0x37, 0xA1, 0xFD, 0x94, 0xC0, 0x4F, 0xDB, 0x97, 0x8D, 0xFB, 0xBD, 0x3D, 0xD4, 0x26, 0x50, 0x5C, 0x31, 0x8E, 0x0A, 0xEA, 0xB4, 0xD8, 0xE2, 0x60, 0x4C, + 0xA7, 0xC5, 0x8C, 0x7A, 0x67, 0xAB, 0x83, 0x80, 0xBC, 0x47, 0x05, 0xD0, 0x93, 0x56, 0x69, 0xF9, 0x69, 0x66, 0x6F, 0x0F, 0xF9, 0x09, 0x4A, 0x2B, 0xC6, 0x51, + 0x41, 0x95, 0x16, 0x5B, 0xFA, 0x8C, 0xA9, 0x54, 0x7E, 0x7E, 0xC9, 0x89, 0xDC, 0x99, 0x4A, 0xFB, 0x54, 0x00, 0x7D, 0x69, 0x95, 0x96, 0x9F, 0x75, 0xF4, 0xF6, + 0xB0, 0x7B, 0x17, 0xA5, 0x15, 0xE3, 0xA8, 0xA0, 0x4A, 0x8B, 0x2D, 0xD9, 0xC5, 0x54, 0x2A, 0x3F, 0x9F, 0xE4, 0x44, 0xEE, 0x4C, 0xA5, 0x03, 0x2A, 0x80, 0x81, + 0xB4, 0x4A, 0xCB, 0x57, 0x0A, 0x7A, 0x7B, 0x28, 0x06, 0xA1, 0xB4, 0x62, 0x1C, 0x15, 0x54, 0x69, 0xB1, 0xD5, 0xE7, 0x98, 0x4A, 0xE5, 0xD7, 0x39, 0x38, 0x91, + 0x3B, 0x53, 0xE9, 0x90, 0x0A, 0x60, 0x28, 0xAD, 0xD2, 0xF2, 0xFB, 0xAB, 0x7A, 0x7B, 0xD8, 0xBB, 0x8D, 0xD2, 0x8A, 0x71, 0x54, 0x50, 0xA5, 0xC5, 0x4A, 0xB7, + 0x31, 0x95, 0xCA, 0xAF, 0xDC, 0x70, 0x22, 0x77, 0xA6, 0xD2, 0x23, 0x2A, 0x80, 0x23, 0x69, 0x95, 0x96, 0xDF, 0xBA, 0xDE, 0xDB, 0x43, 0x3D, 0x0F, 0xA5, 0x15, + 0xE3, 0xA8, 0xA0, 0x4A, 0x8B, 0x55, 0x70, 0x62, 0x2A, 0x95, 0xDF, 0x3B, 0xC5, 0x89, 0xDC, 0x99, 0x4A, 0x8F, 0xA9, 0x00, 0x8E, 0xA5, 0x55, 0x5A, 0x7E, 0xE7, + 0x7E, 0x6F, 0x0F, 0x3B, 0xF7, 0x51, 0x5A, 0x31, 0x8E, 0x0A, 0xAA, 0xB4, 0x58, 0x6D, 0x36, 0xA6, 0x52, 0xF9, 0xED, 0x4E, 0x9C, 0xC8, 0x9D, 0xA9, 0xF4, 0x84, + 0x0A, 0xE0, 0x44, 0x5A, 0xA5, 0xE5, 0xB7, 0x0C, 0xF4, 0xF6, 0xB0, 0xF9, 0x05, 0xA5, 0xD5, 0x89, 0x72, 0x54, 0x50, 0xA5, 0xC5, 0x16, 0x18, 0x7B, 0x29, 0x5B, + 0x5F, 0x24, 0x54, 0x9A, 0xB6, 0xC0, 0xF8, 0x00, 0xEA, 0x77, 0xDA, 0x7A, 0x5C, 0xE2, 0x83, 0x3F, 0x2F, 0x7E, 0x7E, 0x99, 0x5E, 0xD8, 0x4F, 0xAD, 0xE2, 0xC5, + 0xFA, 0x7A, 0xE8, 0x65, 0xBC, 0xA8, 0xBC, 0x90, 0x70, 0x35, 0xF8, 0x14, 0xF9, 0x06, 0xF3, 0xD9, 0x96, 0xC6, 0x80, 0x0B, 0x58, 0x5A, 0xAF, 0xDF, 0x11, 0x27, + 0x2D, 0x39, 0x96, 0xC6, 0xA9, 0xDC, 0x4D, 0xF0, 0x40, 0xE4, 0x30, 0x17, 0x47, 0xDE, 0x3F, 0x48, 0xAD, 0xE9, 0x30, 0x80, 0x78, 0xF8, 0xE8, 0x77, 0x4E, 0x24, + 0xE3, 0x07, 0xC8, 0x20, 0x6D, 0x63, 0xFC, 0x16, 0x03, 0x08, 0xD2, 0xD8, 0x63, 0x4C, 0xBD, 0x96, 0x66, 0x2A, 0x59, 0x05, 0x28, 0xC4, 0x54, 0x5A, 0x65, 0x67, + 0xCB, 0x4C, 0xF5, 0x19, 0x53, 0x19, 0x4E, 0x9A, 0x60, 0x2A, 0x39, 0x0F, 0x2E, 0xC4, 0x54, 0xDA, 0x44, 0x38, 0x64, 0xEA, 0x21, 0x04, 0x3A, 0x32, 0xA1, 0xDF, + 0x28, 0x2F, 0x1C, 0xEA, 0x2E, 0x2F, 0x0E, 0x5F, 0xBC, 0xBE, 0x50, 0xE8, 0x92, 0xA6, 0x6D, 0x16, 0x8C, 0x78, 0xF1, 0x4E, 0xFF, 0x52, 0x31, 0x8F, 0x92, 0x1E, + 0x89, 0x7A, 0xE1, 0x87, 0xE4, 0xF3, 0x02, 0x1E, 0x87, 0x2C, 0x12, 0xF2, 0x06, 0x9D, 0x5E, 0x99, 0x0A, 0x61, 0x40, 0xE4, 0x8E, 0x82, 0x1E, 0x45, 0xDF, 0x0D, + 0x65, 0x70, 0x59, 0x4C, 0x06, 0x85, 0xAA, 0xA4, 0x71, 0x19, 0x14, 0x08, 0xFB, 0x3E, 0x91, 0xBB, 0x94, 0x01, 0x46, 0xC9, 0xCB, 0x0B, 0xE5, 0xFD, 0x3F, 0x94, + 0xCB, 0x9B, 0xA5, 0xED, 0xAE, 0x1C, 0x92, 0x1B, 0x55, 0x38, 0x5C, 0xE2, 0x4B, 0xF2, 0x83, 0x41, 0x4F, 0x36, 0xB0, 0x0C, 0xD2, 0x87, 0x80, 0x69, 0x67, 0x8B, + 0xF1, 0x92, 0x12, 0xDA, 0x0F, 0x18, 0xFC, 0x40, 0x40, 0xD3, 0x52, 0x71, 0x93, 0x03, 0xC6, 0x39, 0x54, 0x3B, 0xB8, 0xBD, 0x5A, 0x92, 0x41, 0x71, 0x46, 0xD9, + 0xDB, 0xEA, 0x70, 0x40, 0xA9, 0x1C, 0x04, 0xEC, 0x7D, 0xFA, 0x78, 0x25, 0xC7, 0x58, 0xB2, 0x8E, 0x56, 0x4C, 0x75, 0x69, 0x8F, 0x8C, 0x16, 0x1C, 0x14, 0xC4, + 0x8D, 0xCE, 0x0E, 0x21, 0xC6, 0x6E, 0xCA, 0x26, 0x45, 0x64, 0x67, 0x53, 0x63, 0x06, 0x06, 0x2B, 0x96, 0x25, 0x95, 0x21, 0x7B, 0xAB, 0x29, 0x7E, 0x12, 0xB4, + 0x35, 0x81, 0x30, 0x0F, 0xBA, 0x47, 0xEF, 0xF2, 0x25, 0xBB, 0xD0, 0x66, 0x24, 0xBC, 0xAE, 0xB0, 0x20, 0x9E, 0x15, 0x9C, 0x35, 0x86, 0x50, 0xBB, 0x26, 0xFC, + 0xFB, 0xA5, 0xCA, 0xDC, 0x21, 0xD3, 0xF3, 0xDA, 0x37, 0x01, 0x4E, 0xFE, 0xF8, 0x1D, 0x36, 0xA9, 0x29, 0xBA, 0xBD, 0xB6, 0x4C, 0x5B, 0xC3, 0xC0, 0xAF, 0x2D, + 0x3D, 0xA0, 0xB4, 0xFD, 0xE7, 0x12, 0xDF, 0x70, 0xA5, 0xE1, 0xD3, 0x5A, 0x5A, 0x46, 0x3F, 0x11, 0xF5, 0x4F, 0x4C, 0xDB, 0xF5, 0xA7, 0x6D, 0x78, 0x18, 0x7C, + 0xEF, 0xF4, 0x7F, 0xFE, 0x3B, 0x6F, 0xAB, 0x80, 0xB1, 0x98, 0x45, 0x04, 0x50, 0x53, 0x5C, 0x67, 0x72, 0x5E, 0x03, 0x4A, 0x1D, 0xDB, 0x75, 0x6D, 0xC7, 0x98, + 0x19, 0x29, 0x63, 0x73, 0x9A, 0xB4, 0x0F, 0x45, 0xE2, 0x4E, 0x34, 0x16, 0x0C, 0xFB, 0x67, 0xEE, 0xC4, 0x31, 0x96, 0xDE, 0xE8, 0x91, 0x6E, 0x4F, 0x56, 0x0B, + 0x62, 0x79, 0x6D, 0x4D, 0xD7, 0x2F, 0xAF, 0xE1, 0xE0, 0x2D, 0x7E, 0x8B, 0x0F, 0x24, 0xDF, 0xA8, 0xBF, 0xFA, 0xE7, 0x3B, 0x1C, 0x86, 0xF1, 0x1A, 0xC8, 0x8B, + 0xE8, 0xF5, 0x03, 0x65, 0xBA, 0xB2, 0xD8, 0x48, 0xD8, 0x20, 0xD8, 0xB6, 0xA9, 0x7C, 0x05, 0x8C, 0xD7, 0x9A, 0xA3, 0x8C, 0x35, 0x97, 0xBC, 0xB1, 0x5D, 0x4F, + 0x39, 0x57, 0x02, 0x8C, 0xA6, 0x3D, 0xA1, 0xFB, 0x36, 0xDA, 0x8C, 0x2F, 0xDE, 0x92, 0x31, 0xFE, 0x93, 0x63, 0x42, 0xD3, 0x00, 0xEA, 0xA9, 0x52, 0x3F, 0x3D, + 0x56, 0xEB, 0x68, 0x7F, 0x41, 0x17, 0x53, 0x02, 0x61, 0x1E, 0xDA, 0x35, 0x56, 0x8E, 0x79, 0xA0, 0x4C, 0xC6, 0xCD, 0xAF, 0x94, 0x7A, 0x7A, 0x19, 0xAF, 0x35, + 0x39, 0x33, 0x6D, 0x6F, 0x4E, 0xAC, 0x46, 0x48, 0x99, 0x43, 0xDC, 0xA5, 0x6D, 0xB9, 0x84, 0x11, 0xC7, 0x7E, 0xC6, 0x34, 0xBC, 0xDE, 0x76, 0x3D, 0xCD, 0x5B, + 0xB9, 0xCA, 0xE3, 0xF3, 0x73, 0xA5, 0xDB, 0xE9, 0x44, 0x9B, 0x29, 0xD0, 0x4D, 0xB2, 0xDD, 0x81, 0x92, 0xB8, 0xF0, 0x91, 0xDC, 0x78, 0xCD, 0x67, 0x01, 0xCC, + 0x9D, 0x42, 0x4C, 0x97, 0xC4, 0x90, 0x04, 0x00, 0xF8, 0xDE, 0xB8, 0x46, 0x33, 0x4E, 0x60, 0x43, 0xD7, 0x3C, 0xAD, 0xF9, 0x35, 0xA6, 0x2F, 0xE8, 0x15, 0x28, + 0x39, 0x50, 0xE8, 0xAD, 0x67, 0x91, 0x5B, 0x77, 0xCD, 0x36, 0xC8, 0x10, 0xF8, 0x0D, 0xA0, 0x89, 0xE3, 0xC4, 0x29, 0xA6, 0xD0, 0x2D, 0xF5, 0x40, 0xC1, 0x3B, + 0x71, 0xD8, 0x08, 0x91, 0x8F, 0xFC, 0x6B, 0xBE, 0xD0, 0xB2, 0xD1, 0x0A, 0x50, 0x32, 0x74, 0x77, 0x31, 0x15, 0x41, 0xC0, 0xF9, 0x40, 0x66, 0x20, 0xB1, 0xD9, + 0x01, 0x8F, 0x3F, 0x07, 0x34, 0xF8, 0x1C, 0xB0, 0xB8, 0x15, 0xD1, 0xDA, 0xE1, 0x21, 0xB8, 0xB4, 0x6B, 0x9B, 0x04, 0xAC, 0x62, 0xD6, 0xA8, 0xF3, 0x6F, 0xBD, + 0x82, 0x45, 0xD5, 0x3B, 0x37, 0xF5, 0xA7, 0x80, 0xA0, 0xED, 0xD9, 0x57, 0x9E, 0x63, 0x58, 0xB3, 0x86, 0x3A, 0x6C, 0x86, 0xD8, 0xE8, 0x6D, 0x44, 0x99, 0xB8, + 0x4F, 0xAF, 0xD3, 0x4E, 0x92, 0x37, 0x1A, 0xFC, 0xFA, 0xD3, 0x7A, 0xB3, 0xCE, 0x89, 0xA7, 0xE7, 0x60, 0x6E, 0x0D, 0x76, 0xF0, 0x84, 0xD2, 0xD8, 0x54, 0xCE, + 0xCE, 0x78, 0x37, 0xAC, 0x15, 0x5E, 0x84, 0x46, 0xF4, 0x4F, 0xE2, 0x56, 0x60, 0x8A, 0x7F, 0x7C, 0xFB, 0xD5, 0xB7, 0xD9, 0xBB, 0x43, 0xA0, 0xFA, 0x39, 0x86, + 0xE0, 0x6F, 0xBF, 0xC2, 0xFF, 0x77, 0x4F, 0x68, 0xD4, 0xFD, 0xF6, 0x2B, 0xFE, 0xB9, 0x7B, 0x02, 0x3D, 0xC1, 0x31, 0xED, 0xEF, 0xEE, 0x0F, 0x2A, 0x87, 0x4D, + 0xE9, 0xCD, 0x52, 0xA5, 0x17, 0x88, 0xAD, 0x30, 0x4D, 0xB3, 0x0C, 0xA2, 0xFE, 0x08, 0xFD, 0xB7, 0x31, 0xB1, 0x75, 0x50, 0x8F, 0x07, 0x96, 0xEC, 0x2B, 0xDD, + 0x04, 0x95, 0xF8, 0x82, 0xEA, 0xF8, 0x4A, 0x37, 0xA6, 0xB4, 0xA5, 0xC2, 0x5D, 0x25, 0x34, 0x10, 0xBF, 0xE5, 0x52, 0x73, 0x5C, 0xF2, 0xBD, 0xE5, 0x35, 0xBC, + 0x98, 0x53, 0xA4, 0x48, 0x7C, 0x34, 0x8A, 0xB1, 0x80, 0x3F, 0x80, 0x83, 0x76, 0x75, 0xAE, 0xB4, 0xC0, 0xD8, 0xF8, 0xDF, 0x84, 0xD9, 0xBC, 0x2E, 0x64, 0x36, + 0x0D, 0x2A, 0xB6, 0xA0, 0xCF, 0x66, 0x11, 0x13, 0x02, 0xB2, 0x22, 0x06, 0x44, 0x1D, 0x22, 0x14, 0x19, 0xBB, 0x98, 0xE2, 0x10, 0xBF, 0x4C, 0xCC, 0x2F, 0x8D, + 0x1B, 0xF8, 0x2F, 0x19, 0xB3, 0x36, 0x74, 0x85, 0x8D, 0x9E, 0xE3, 0x7F, 0xA0, 0x20, 0xFC, 0x93, 0x6A, 0x28, 0x80, 0xF5, 0xBD, 0x69, 0x36, 0xD8, 0x07, 0xE6, + 0xC0, 0x46, 0x56, 0x10, 0x0F, 0xDD, 0x5B, 0x8C, 0x4C, 0xB6, 0xED, 0x7D, 0x3E, 0x50, 0x96, 0x0E, 0x10, 0x46, 0xBF, 0xA5, 0x02, 0xC7, 0x80, 0x88, 0x58, 0xEC, + 0x6F, 0x2E, 0x05, 0x4B, 0xD3, 0x7C, 0xCE, 0xB0, 0x02, 0x09, 0xEC, 0x00, 0x4C, 0x66, 0x85, 0xA6, 0x0B, 0xFF, 0xDF, 0x3D, 0x81, 0x4E, 0xE0, 0x10, 0xFE, 0xBF, + 0x7B, 0x82, 0x5D, 0xA1, 0x51, 0x61, 0x8F, 0x77, 0x4F, 0xA0, 0x47, 0x38, 0x81, 0xFF, 0xA1, 0x0D, 0xF6, 0x8B, 0xAD, 0xF0, 0x2F, 0xDC, 0xA1, 0xFD, 0xE3, 0x4D, + 0x7A, 0xC0, 0x2E, 0xF0, 0xD3, 0x2C, 0x06, 0xD9, 0xDB, 0xF5, 0x1B, 0xF4, 0x6D, 0xE7, 0x9F, 0x6F, 0x80, 0x1D, 0x7A, 0x70, 0x0B, 0x31, 0xC8, 0xD2, 0xF1, 0x1C, + 0xFF, 0xDC, 0xFA, 0x0A, 0xC6, 0x0B, 0xFC, 0x08, 0xAE, 0xD1, 0x37, 0xC2, 0xE2, 0x25, 0x76, 0x80, 0xAD, 0xE8, 0xFB, 0x3B, 0x69, 0x2B, 0x76, 0x04, 0xD7, 0xF8, + 0x5B, 0x1F, 0x0F, 0x14, 0xFE, 0x5E, 0xC1, 0x5C, 0xE1, 0x84, 0xEF, 0xFD, 0x7B, 0xEE, 0xDE, 0x20, 0x83, 0x8C, 0x34, 0x94, 0x4A, 0x70, 0x76, 0x7B, 0xF7, 0x84, + 0xE0, 0x3D, 0x4A, 0x24, 0x1C, 0xDF, 0xF2, 0x63, 0xB8, 0x0E, 0xF4, 0xE1, 0x1D, 0x9F, 0x60, 0x7A, 0xE1, 0x36, 0xBC, 0x00, 0x2D, 0x3C, 0xBC, 0xCF, 0x89, 0x87, + 0xB3, 0xDB, 0xE0, 0x0C, 0xA1, 0x29, 0x2C, 0x67, 0x03, 0x4E, 0x6F, 0xC3, 0x53, 0xB8, 0x8B, 0xBC, 0xA0, 0x02, 0x38, 0x4F, 0x77, 0x4F, 0x38, 0x4F, 0xA8, 0x45, + 0x76, 0x14, 0x17, 0x35, 0xFC, 0x8F, 0x7E, 0xE4, 0xF1, 0x80, 0xFD, 0xC9, 0xF7, 0x4E, 0x62, 0x36, 0x95, 0xF3, 0x11, 0x8F, 0xFB, 0x18, 0x00, 0xC0, 0xA3, 0xE0, + 0x3A, 0x31, 0xDB, 0x9A, 0x07, 0x0E, 0x01, 0x79, 0x13, 0x71, 0xDB, 0x18, 0x51, 0x02, 0x37, 0xDF, 0xB8, 0xD5, 0xB6, 0xC0, 0x2D, 0x28, 0xC2, 0xE6, 0x29, 0x0F, + 0x1B, 0x88, 0x88, 0x71, 0xB9, 0x81, 0x8B, 0x5D, 0x4E, 0x43, 0xC7, 0xEE, 0xA6, 0x60, 0xE4, 0xA1, 0x30, 0x0E, 0x81, 0x17, 0xD3, 0xB0, 0xD1, 0x51, 0x23, 0x82, + 0xAB, 0x3B, 0x18, 0x84, 0xD8, 0x12, 0x91, 0x8E, 0xCD, 0x29, 0x51, 0x20, 0x6D, 0xCC, 0xCF, 0xC3, 0xA1, 0x70, 0x02, 0xE6, 0xA0, 0xD4, 0xFD, 0x09, 0x65, 0xFD, + 0x74, 0x23, 0xC2, 0x01, 0x04, 0x2F, 0x20, 0x28, 0xCF, 0x19, 0x8D, 0xA7, 0x61, 0xF8, 0x54, 0x94, 0x31, 0x24, 0x3B, 0x5F, 0x9E, 0xC5, 0x90, 0xD1, 0xD4, 0x3F, + 0xC0, 0xC4, 0xAE, 0x61, 0xA2, 0x90, 0xB8, 0xC4, 0xB6, 0xDB, 0xB5, 0x6C, 0x8B, 0x88, 0x7B, 0x8D, 0xC5, 0x4B, 0xDE, 0x11, 0x3F, 0xD3, 0xC9, 0x54, 0x5B, 0x99, + 0x5E, 0x08, 0xE6, 0x10, 0x48, 0x74, 0x2D, 0x1E, 0xB6, 0x58, 0x92, 0x9F, 0x3B, 0x74, 0x67, 0x0C, 0x15, 0xFE, 0xA8, 0xF0, 0x38, 0x39, 0x2A, 0x80, 0x55, 0x3A, + 0x5E, 0xA3, 0x7E, 0xE9, 0x38, 0xB6, 0xF3, 0x5B, 0xFD, 0x29, 0x36, 0x7A, 0x5A, 0xFF, 0xFD, 0x54, 0xA1, 0xF1, 0xB4, 0x19, 0x0F, 0xEE, 0x91, 0xF0, 0x79, 0x78, + 0xA8, 0xBC, 0xF0, 0x3C, 0x0D, 0x14, 0x80, 0x35, 0x96, 0x39, 0xCA, 0x47, 0xD1, 0x78, 0x12, 0x68, 0x3B, 0x68, 0x94, 0xEC, 0x7B, 0xF7, 0x20, 0x11, 0x4C, 0x2C, + 0x5D, 0x00, 0xF1, 0x93, 0x4C, 0x8A, 0xAA, 0xFD, 0xAF, 0x15, 0x71, 0x6E, 0xAF, 0xA8, 0xC0, 0x6C, 0xE7, 0x05, 0x84, 0xCA, 0x7A, 0x3B, 0x9C, 0x27, 0xD5, 0x59, + 0xCE, 0xD3, 0x06, 0x54, 0x97, 0xD0, 0x07, 0xE8, 0x38, 0xB4, 0x79, 0xC6, 0x4D, 0xA0, 0x77, 0x18, 0xE7, 0xCE, 0xB9, 0x32, 0x92, 0x49, 0x16, 0xB4, 0xB0, 0xAD, + 0x2F, 0xE4, 0x76, 0xB5, 0x04, 0xF1, 0x87, 0x69, 0x53, 0x22, 0x91, 0xE3, 0xD2, 0x21, 0x6D, 0x68, 0x79, 0xC1, 0x07, 0x4E, 0xB5, 0x27, 0x68, 0x14, 0xAA, 0x80, + 0x5A, 0x27, 0x7A, 0xE2, 0xB3, 0x8D, 0x46, 0x77, 0x8F, 0xC4, 0x67, 0x82, 0x94, 0x93, 0x13, 0xC8, 0x85, 0x07, 0xAE, 0x4D, 0x1D, 0x3B, 0xD1, 0x43, 0x22, 0x1D, + 0x84, 0x64, 0x30, 0x8C, 0x0C, 0xAB, 0x25, 0x24, 0x9F, 0x24, 0x1E, 0x1C, 0x02, 0x5B, 0xF0, 0x6F, 0x2E, 0x6C, 0x8F, 0x24, 0x22, 0x86, 0x61, 0x19, 0x9E, 0xA1, + 0x99, 0x9F, 0x42, 0x6B, 0xDC, 0xA9, 0xFB, 0x0B, 0x7C, 0xBC, 0x80, 0xFF, 0x6F, 0xE4, 0x7C, 0x72, 0x79, 0xCA, 0x86, 0x85, 0x04, 0xF1, 0x20, 0xB4, 0x92, 0xA8, + 0x1C, 0x62, 0x61, 0x81, 0xDF, 0xF7, 0x7B, 0x7A, 0xFC, 0x98, 0x1E, 0x3D, 0x0A, 0x94, 0xE6, 0x47, 0x8F, 0x73, 0x25, 0xBC, 0x91, 0x50, 0xF0, 0x26, 0xEE, 0x04, + 0x0E, 0x1F, 0x79, 0x04, 0x43, 0x22, 0xF0, 0x2F, 0x21, 0xBD, 0x41, 0x5B, 0xF8, 0xFF, 0xA8, 0xFF, 0x80, 0xA2, 0xFE, 0xEE, 0x42, 0x7C, 0x86, 0x6D, 0x27, 0x3C, + 0x80, 0xC1, 0x89, 0xF3, 0xE9, 0xA7, 0x90, 0x68, 0x8B, 0x93, 0xE4, 0x20, 0x74, 0x07, 0x93, 0x7D, 0x98, 0xCC, 0x5C, 0xB2, 0xF0, 0xFC, 0xF2, 0xF6, 0x7B, 0xBD, + 0x51, 0x0F, 0xDE, 0x68, 0x54, 0x6F, 0x62, 0x5C, 0x32, 0x8D, 0xC9, 0x97, 0x20, 0x2C, 0x85, 0x96, 0x07, 0x29, 0x0D, 0x66, 0xFF, 0x38, 0xB1, 0x36, 0x26, 0xDC, + 0x54, 0x5F, 0x7D, 0x78, 0xF1, 0xEE, 0xF3, 0x8B, 0x8F, 0x1F, 0x3F, 0x28, 0x2B, 0xB0, 0x59, 0x75, 0xF8, 0x19, 0xD3, 0x16, 0x98, 0x04, 0x38, 0x9F, 0x81, 0x3E, + 0xF7, 0x33, 0x45, 0xDA, 0xF9, 0xED, 0xF7, 0xDF, 0xBA, 0xBF, 0x03, 0xE8, 0xD7, 0xFF, 0xB2, 0xEA, 0x8C, 0x11, 0x44, 0xF5, 0x14, 0x70, 0xE1, 0xF1, 0xD7, 0xFA, + 0x53, 0xDF, 0xE0, 0x1B, 0xE9, 0x14, 0x06, 0xAF, 0xD7, 0xAD, 0x37, 0x81, 0xD5, 0xBB, 0x03, 0x40, 0xC5, 0xD2, 0x41, 0x18, 0x73, 0x1A, 0x58, 0xAA, 0x30, 0xA0, + 0x03, 0xF5, 0x19, 0xFC, 0x39, 0x53, 0xD4, 0x23, 0xF8, 0xFB, 0xF4, 0x69, 0x68, 0x22, 0x25, 0xBB, 0xAB, 0x3F, 0x35, 0x68, 0x67, 0x30, 0x3B, 0x69, 0x18, 0x67, + 0x20, 0xC9, 0xE7, 0xF5, 0x83, 0xFA, 0x69, 0xBD, 0x0E, 0xD7, 0xFC, 0xEE, 0xEF, 0x62, 0xEC, 0xDC, 0x3D, 0x0B, 0x38, 0x64, 0xA3, 0x2B, 0xDC, 0x08, 0xC5, 0x1F, + 0xCD, 0xEA, 0x5E, 0xB2, 0x2A, 0xD7, 0x79, 0xBA, 0x4E, 0xD8, 0xDB, 0xAC, 0x67, 0x74, 0x40, 0x8C, 0xC2, 0x64, 0x28, 0x88, 0x85, 0x86, 0xC0, 0xD7, 0x52, 0x51, + 0xD3, 0xE1, 0x56, 0xD7, 0x1D, 0xD0, 0x36, 0xB5, 0x96, 0xE6, 0x86, 0x0B, 0xCB, 0xE1, 0xC0, 0xC6, 0x02, 0x1C, 0x1B, 0xD3, 0xCD, 0x4C, 0x24, 0xB4, 0x75, 0x04, + 0xCB, 0x46, 0xC2, 0xD3, 0xB9, 0xBF, 0x5C, 0x87, 0x69, 0x6C, 0x26, 0xA9, 0xB1, 0x59, 0x44, 0x63, 0xB3, 0xED, 0x6A, 0x8C, 0xA3, 0xAE, 0xAC, 0x35, 0x1F, 0x4F, + 0x8E, 0xE6, 0x72, 0xE1, 0xB9, 0xD2, 0xB8, 0xB6, 0x66, 0x22, 0x6D, 0x95, 0x51, 0x13, 0x8B, 0x5D, 0x30, 0x29, 0x22, 0xCE, 0x9B, 0x8F, 0xEF, 0xDE, 0x62, 0xB4, + 0x11, 0xAB, 0x2C, 0xD0, 0x58, 0x32, 0xB9, 0x12, 0x60, 0xC0, 0xA0, 0x18, 0xAB, 0x7C, 0x24, 0xC2, 0xA6, 0x12, 0x56, 0x10, 0x72, 0x0C, 0x81, 0x17, 0x0C, 0xE4, + 0x7C, 0x17, 0x8B, 0x04, 0xBE, 0xF3, 0x86, 0x50, 0x19, 0xB6, 0x80, 0x00, 0x52, 0x4A, 0x64, 0x98, 0x37, 0x1C, 0x26, 0x52, 0xCB, 0xD8, 0xBB, 0x8B, 0x50, 0x7F, + 0x75, 0x65, 0x83, 0x9A, 0x3F, 0x55, 0x0F, 0x63, 0x9B, 0x9B, 0x2B, 0x1D, 0x3E, 0xA1, 0x97, 0x12, 0x10, 0xFF, 0xAA, 0x9C, 0xC0, 0xC0, 0x79, 0x21, 0xA0, 0x00, + 0x96, 0x5B, 0x01, 0x16, 0x5A, 0x40, 0x90, 0xC2, 0x41, 0xBF, 0x44, 0x96, 0x82, 0x41, 0x8E, 0x0A, 0xFA, 0xE9, 0x2F, 0x01, 0x06, 0xBF, 0x54, 0x21, 0x85, 0xC4, + 0xFF, 0x6C, 0x55, 0x3A, 0x1E, 0x39, 0x62, 0xFC, 0x8F, 0x45, 0x09, 0xF0, 0xF0, 0xD2, 0x88, 0x14, 0x1A, 0xFE, 0xA1, 0xA3, 0x54, 0x2C, 0x72, 0xC4, 0xF0, 0x6F, + 0x0B, 0x89, 0x78, 0xE2, 0xA5, 0x18, 0x39, 0x9E, 0xF8, 0x27, 0x71, 0xD2, 0xF1, 0x48, 0xCA, 0x86, 0x7F, 0x86, 0x46, 0x64, 0x75, 0xAC, 0xF2, 0x93, 0xE9, 0x18, + 0xAC, 0x09, 0x00, 0xF3, 0x54, 0xF5, 0xB9, 0x1A, 0xCD, 0xAC, 0x79, 0xA1, 0x28, 0x0B, 0x03, 0x6F, 0x92, 0xC4, 0xE0, 0x47, 0x87, 0x7B, 0x28, 0xD9, 0xDD, 0x47, + 0x14, 0x7A, 0x6F, 0x9A, 0x72, 0x51, 0x68, 0x69, 0x9A, 0x7E, 0xF8, 0x09, 0x60, 0x52, 0xC2, 0x0F, 0x5D, 0x32, 0xA3, 0xF5, 0xD6, 0x4C, 0xF9, 0xD3, 0x16, 0x0C, + 0xEF, 0xA6, 0x12, 0x11, 0xC7, 0x62, 0x65, 0x4A, 0x59, 0x12, 0xB4, 0xE3, 0x68, 0xA2, 0x86, 0x44, 0x97, 0xE3, 0x6E, 0x5D, 0xB9, 0xD0, 0x75, 0xEB, 0xA6, 0x60, + 0xA0, 0x25, 0x61, 0xB9, 0xDC, 0x0C, 0x5A, 0xA6, 0x20, 0x59, 0x3A, 0x72, 0xE9, 0x1D, 0xB4, 0x4B, 0x63, 0x04, 0xEB, 0xCF, 0x72, 0xAC, 0xF8, 0x5F, 0x1D, 0x17, + 0xD1, 0x41, 0xAB, 0xD6, 0x59, 0x4A, 0xE1, 0x5F, 0x77, 0x4E, 0xD3, 0xC8, 0x52, 0x76, 0xC8, 0xF5, 0xBF, 0x7F, 0x2C, 0x18, 0x76, 0x4B, 0x16, 0xFB, 0xF7, 0xEF, + 0x1C, 0xDA, 0x35, 0x91, 0x70, 0x8D, 0x60, 0x65, 0x9E, 0x67, 0x77, 0x21, 0x58, 0x86, 0x77, 0x4C, 0x34, 0xEB, 0x5A, 0x8B, 0x79, 0xC7, 0x04, 0xA6, 0xBF, 0x1E, + 0xE1, 0xA8, 0x1B, 0x35, 0xD6, 0xA0, 0xC6, 0x69, 0x64, 0x67, 0x6D, 0xBA, 0x65, 0x0D, 0x0B, 0x21, 0x06, 0x59, 0xB3, 0x93, 0xD8, 0xED, 0x39, 0xA1, 0xAF, 0x09, + 0xE1, 0xF7, 0xD9, 0x19, 0x6B, 0x10, 0xF4, 0x32, 0xB6, 0xF5, 0xDB, 0xB6, 0xB6, 0x5C, 0x42, 0xF0, 0xBA, 0x98, 0x1B, 0xA6, 0xDE, 0x60, 0xA0, 0x11, 0x13, 0xC1, + 0xBD, 0x09, 0x84, 0xAE, 0x5A, 0x71, 0xAC, 0xC0, 0xF0, 0x05, 0xBB, 0xD6, 0xA8, 0x77, 0x75, 0x7F, 0xCD, 0x88, 0x37, 0x6B, 0xEB, 0x8E, 0xB6, 0xFE, 0x1E, 0x37, + 0x35, 0x34, 0xB0, 0xD3, 0x83, 0xCE, 0x41, 0x87, 0x37, 0xF0, 0x9C, 0xDB, 0x20, 0xCB, 0x44, 0xBC, 0xB8, 0xF8, 0xFB, 0xD3, 0x87, 0xB7, 0x21, 0x5E, 0xCF, 0x7E, + 0xC5, 0x2E, 0x35, 0xEA, 0x74, 0x57, 0xC4, 0xE1, 0x9F, 0x4B, 0x9C, 0x0A, 0xF8, 0x4A, 0x89, 0x88, 0x11, 0x37, 0x3C, 0xA0, 0xA8, 0x58, 0xF3, 0x67, 0x51, 0xA4, + 0x70, 0xD9, 0x22, 0x6B, 0x05, 0x30, 0x91, 0x86, 0x08, 0xD4, 0xDF, 0x0E, 0x81, 0xE0, 0xC8, 0xC9, 0x77, 0x2B, 0xD3, 0xFC, 0x95, 0x68, 0x0E, 0xE8, 0xE3, 0xA9, + 0xD2, 0xA8, 0x75, 0x6A, 0x4F, 0x1B, 0xF4, 0xFA, 0x3B, 0x60, 0x67, 0xDE, 0x68, 0x3E, 0x55, 0x9B, 0xCD, 0xB6, 0x0B, 0x3A, 0x23, 0x8D, 0x56, 0xD7, 0x6F, 0x02, + 0x7F, 0x68, 0x1B, 0xD6, 0x49, 0xFA, 0xFD, 0x37, 0xF6, 0xCA, 0x71, 0xB3, 0x1A, 0xBC, 0x33, 0x2C, 0x2C, 0xE2, 0x64, 0x35, 0xB9, 0x22, 0x20, 0x58, 0x7D, 0xA3, + 0x49, 0x8D, 0xEE, 0xE2, 0xE0, 0xE5, 0x0F, 0x85, 0x2E, 0x6E, 0x2B, 0x8D, 0x68, 0x45, 0x87, 0x2F, 0x23, 0x12, 0x34, 0xF4, 0x86, 0xEF, 0xF1, 0x77, 0x51, 0xE3, + 0x00, 0x97, 0x05, 0x03, 0xF8, 0x01, 0x3C, 0xA0, 0xED, 0x90, 0x85, 0x7D, 0x4D, 0x36, 0xF4, 0x8F, 0xCD, 0x03, 0xE3, 0x9F, 0x1B, 0x3A, 0x2B, 0xD3, 0x84, 0x76, + 0x8B, 0x55, 0x21, 0xDC, 0x20, 0x82, 0x5B, 0x28, 0x70, 0x3F, 0x45, 0xA3, 0xCE, 0x76, 0xAF, 0xD0, 0x51, 0xE1, 0x2E, 0x74, 0x9B, 0xB9, 0xBD, 0xCE, 0x82, 0x64, + 0xBD, 0x27, 0x80, 0x03, 0x68, 0xDD, 0x70, 0xB5, 0xB1, 0x99, 0xDF, 0x35, 0x6F, 0xA7, 0xF3, 0xF2, 0x37, 0x34, 0xF0, 0xAF, 0x00, 0xA8, 0xE7, 0xD0, 0x3A, 0x61, + 0x04, 0x2D, 0xB1, 0xF2, 0xB0, 0xFA, 0x64, 0x65, 0x22, 0x9E, 0x6A, 0x30, 0x79, 0x8A, 0x63, 0x66, 0xC5, 0xE3, 0x02, 0x65, 0xE5, 0xE8, 0x65, 0x80, 0x88, 0x9F, + 0x82, 0x39, 0x83, 0x85, 0x2A, 0xCF, 0x29, 0x0B, 0xCA, 0x69, 0xEC, 0x6E, 0x90, 0xDB, 0x44, 0x0B, 0xA6, 0x8F, 0x58, 0xFC, 0xFB, 0x0B, 0x56, 0x70, 0x03, 0xCA, + 0x63, 0x12, 0x78, 0xF2, 0x24, 0x8E, 0x0D, 0xB7, 0xB1, 0xB0, 0x01, 0x24, 0xE8, 0x8D, 0xB5, 0x67, 0xAF, 0x0F, 0x0F, 0x57, 0x16, 0x38, 0x49, 0x30, 0x14, 0x3C, + 0x8E, 0x09, 0x3E, 0x32, 0x46, 0x00, 0x21, 0x86, 0x4E, 0x05, 0x84, 0xBB, 0xD2, 0x6A, 0x1B, 0xEB, 0xFD, 0xCF, 0xA9, 0xD5, 0x37, 0x08, 0xDF, 0x94, 0xD8, 0x04, + 0xF9, 0xA3, 0x31, 0x87, 0x17, 0xE2, 0x73, 0xE8, 0x04, 0xC6, 0x59, 0x0C, 0x23, 0x32, 0x96, 0xA0, 0x1B, 0x7F, 0x87, 0x87, 0x14, 0xE3, 0x4C, 0x33, 0xAC, 0x0B, + 0x62, 0x60, 0xFA, 0xD7, 0x8C, 0xDC, 0xA5, 0xDD, 0x03, 0x22, 0xDC, 0x30, 0x18, 0x59, 0xCE, 0xD8, 0x5C, 0x0F, 0x39, 0x3C, 0xA4, 0x4D, 0x53, 0xD0, 0xD0, 0x2E, + 0x36, 0xD1, 0x64, 0x52, 0xBF, 0x1E, 0x7F, 0x46, 0x6C, 0x22, 0xA1, 0x50, 0x74, 0xEB, 0x31, 0x8A, 0x83, 0xF6, 0x0A, 0x87, 0xF1, 0x81, 0xD3, 0x77, 0x88, 0x60, + 0xC1, 0x3B, 0xAA, 0x21, 0x56, 0x90, 0x0F, 0xA7, 0xA5, 0xA1, 0x09, 0x6C, 0xA9, 0x3E, 0xAD, 0x62, 0x71, 0x3A, 0x68, 0x12, 0xAD, 0x22, 0x57, 0x2C, 0x4D, 0x67, + 0xE0, 0x64, 0x5B, 0xEE, 0x92, 0x48, 0x57, 0xE3, 0x85, 0xE1, 0x09, 0x10, 0xD6, 0xD5, 0xBA, 0x10, 0x57, 0x4A, 0x95, 0x3B, 0xEA, 0x1F, 0x2C, 0xC6, 0xD0, 0x05, + 0x40, 0x40, 0x14, 0x5B, 0xC0, 0x9F, 0xB0, 0x3D, 0xE4, 0xCF, 0x61, 0x1C, 0xC4, 0x65, 0x79, 0xD4, 0x65, 0x62, 0x63, 0x0E, 0x43, 0xC1, 0x76, 0x94, 0x51, 0x14, + 0xF1, 0x3D, 0x65, 0xFE, 0x3E, 0xAE, 0xF8, 0x7A, 0x61, 0x74, 0x47, 0xCA, 0x1F, 0x0E, 0x01, 0x38, 0x17, 0x67, 0x99, 0xCA, 0xB7, 0x5F, 0x29, 0x8A, 0x3B, 0x65, + 0x0A, 0xFE, 0xE9, 0xCE, 0x89, 0x4E, 0x67, 0x44, 0xDE, 0xCA, 0x3D, 0x55, 0x70, 0x33, 0x4E, 0x6C, 0x0F, 0xD9, 0xDD, 0x1F, 0x81, 0x85, 0x04, 0xE1, 0x3D, 0x5C, + 0x05, 0xE5, 0x6C, 0x6F, 0xAC, 0x86, 0x3E, 0x92, 0x58, 0xF7, 0xE4, 0xB0, 0x52, 0x6B, 0x9F, 0xA2, 0x25, 0xC3, 0x64, 0xEC, 0xE0, 0x99, 0xDF, 0x23, 0x99, 0xBE, + 0xE9, 0x5E, 0x48, 0x99, 0x2E, 0x05, 0x39, 0x1F, 0xFE, 0x58, 0x70, 0x31, 0x23, 0x23, 0x71, 0xC2, 0x8F, 0x9A, 0x5C, 0x4E, 0x60, 0x22, 0xBA, 0x1F, 0x05, 0x99, + 0x11, 0xE1, 0x9A, 0x30, 0xD3, 0x63, 0xCC, 0x04, 0x98, 0xB4, 0xB9, 0xB0, 0xF3, 0x37, 0x0A, 0xF2, 0xC5, 0x90, 0x40, 0x59, 0x7F, 0xBA, 0x90, 0x4D, 0x07, 0x22, + 0x10, 0xE1, 0xC0, 0x0E, 0x22, 0x08, 0x62, 0x22, 0x2A, 0xA4, 0xA2, 0x0C, 0x99, 0xB1, 0x5F, 0x64, 0x18, 0xA5, 0x63, 0x28, 0xED, 0xF9, 0x37, 0x6A, 0xD5, 0xBF, + 0x1F, 0xB0, 0x71, 0x37, 0x12, 0xCA, 0x9A, 0x45, 0x08, 0xDA, 0x58, 0x2B, 0xCF, 0x25, 0x66, 0x6B, 0xAB, 0x86, 0xFE, 0x0F, 0x82, 0x2D, 0xC5, 0x77, 0xAE, 0x74, + 0x36, 0x56, 0xCB, 0xA3, 0x4B, 0x5B, 0x01, 0x83, 0x02, 0xD9, 0x44, 0x96, 0xBA, 0x7D, 0xF1, 0x08, 0x97, 0xB5, 0x52, 0xC5, 0xC5, 0xEC, 0x8B, 0x45, 0x14, 0x4C, + 0xD6, 0x33, 0x67, 0x35, 0x74, 0x1B, 0x2B, 0x95, 0x57, 0x08, 0x70, 0x11, 0x6C, 0x5B, 0xCE, 0x85, 0x0C, 0xB7, 0x38, 0x47, 0x70, 0xD0, 0x59, 0x92, 0xDC, 0xAA, + 0x00, 0x9F, 0x50, 0x45, 0x40, 0x11, 0x6B, 0x3E, 0xAC, 0xFF, 0xEC, 0x4A, 0x92, 0x7C, 0xEA, 0xBB, 0xF9, 0xE0, 0xD1, 0xED, 0xCE, 0xF5, 0x88, 0xB8, 0x5C, 0xCF, + 0x5E, 0x5E, 0xD1, 0xAB, 0x09, 0xBF, 0x5E, 0xD3, 0x22, 0x51, 0x1B, 0xEF, 0xFB, 0xF3, 0x8F, 0x28, 0xA9, 0xF1, 0xBA, 0xFA, 0x15, 0x56, 0x90, 0x14, 0x86, 0xA7, + 0x9E, 0x98, 0x6B, 0xE2, 0x2D, 0x61, 0x0F, 0x74, 0x2E, 0xE7, 0x3A, 0x13, 0x16, 0xFE, 0x83, 0xED, 0xC5, 0xE8, 0xFC, 0x78, 0xF8, 0x07, 0xEB, 0x13, 0x87, 0xE8, + 0x98, 0x8A, 0x9A, 0xB9, 0xB4, 0xD8, 0xCB, 0x24, 0x29, 0x61, 0x88, 0x66, 0xEE, 0xE2, 0x62, 0xDC, 0x67, 0x43, 0x1D, 0x06, 0xA0, 0x88, 0xFA, 0x52, 0xA2, 0x5C, + 0x28, 0x26, 0x1E, 0x56, 0xE2, 0xC4, 0x47, 0xC6, 0x2E, 0xB6, 0x37, 0xFD, 0xF9, 0xE7, 0xC9, 0x18, 0x86, 0x2B, 0x9C, 0x58, 0x81, 0xF3, 0xAC, 0x1B, 0xCD, 0xBB, + 0x2C, 0x76, 0x98, 0xB8, 0x42, 0x45, 0xCA, 0x12, 0x41, 0xE3, 0xAE, 0x18, 0x5B, 0x4C, 0x3E, 0x62, 0x74, 0x51, 0xFB, 0xBB, 0xB4, 0xFC, 0x89, 0x40, 0x9A, 0x60, + 0xCF, 0x37, 0x45, 0xCB, 0x72, 0xC1, 0x18, 0x82, 0x30, 0xA2, 0x6E, 0x10, 0x9B, 0x48, 0xF6, 0x22, 0x76, 0xE1, 0x37, 0x88, 0x68, 0xEB, 0x62, 0x05, 0xF0, 0x0B, + 0x5F, 0x5B, 0xEC, 0x1A, 0x26, 0x7D, 0x81, 0x59, 0x41, 0x12, 0x98, 0x65, 0xEE, 0x70, 0x3B, 0xE2, 0x23, 0x3C, 0x63, 0xCC, 0x01, 0xA0, 0x69, 0x22, 0x7B, 0x36, + 0x84, 0xC2, 0xB2, 0x3D, 0xAC, 0x9E, 0x12, 0xC9, 0x45, 0x33, 0x9D, 0x1B, 0x9A, 0x4D, 0x58, 0xB3, 0x08, 0x12, 0xC0, 0xBB, 0x39, 0x56, 0x47, 0xA7, 0x4B, 0x7C, + 0xC4, 0x86, 0x76, 0xCD, 0x40, 0xA4, 0x08, 0xC4, 0xD3, 0xC0, 0x50, 0xA0, 0xE9, 0x09, 0xF6, 0x66, 0x72, 0x9D, 0x90, 0x75, 0x7A, 0x52, 0xBD, 0x99, 0x50, 0x47, + 0xB5, 0xE0, 0x3F, 0xC4, 0x14, 0x0A, 0x92, 0x64, 0x4B, 0x9D, 0x44, 0xA5, 0xEE, 0x4F, 0x2E, 0x72, 0x20, 0x3E, 0xD3, 0x3C, 0x20, 0x2A, 0x32, 0x22, 0x29, 0x32, + 0xC2, 0x45, 0x86, 0x00, 0x61, 0xD6, 0x9C, 0x3F, 0xD3, 0x09, 0x42, 0xC2, 0xCF, 0x2F, 0x43, 0xCE, 0xD6, 0xE3, 0x4C, 0x3A, 0xF9, 0x2C, 0x22, 0xC2, 0x5E, 0x36, + 0x00, 0xB4, 0x5F, 0xC0, 0xA0, 0x19, 0x65, 0x6B, 0x3D, 0x96, 0x63, 0xCB, 0x9F, 0x85, 0x20, 0x40, 0xC8, 0x96, 0x78, 0xAE, 0xE2, 0xB3, 0xF2, 0x8A, 0x78, 0xFC, + 0x51, 0x47, 0xCD, 0xD2, 0x95, 0xA9, 0xA3, 0x2D, 0x08, 0x7E, 0xD9, 0x3E, 0x20, 0x36, 0xB8, 0x92, 0x45, 0x73, 0xD0, 0x88, 0x0D, 0x10, 0xC1, 0xA9, 0x14, 0xD9, + 0x41, 0xEB, 0xD0, 0x8C, 0x43, 0x04, 0x6C, 0xBE, 0x30, 0x52, 0x06, 0xC9, 0xB9, 0x2E, 0x1B, 0xF7, 0x75, 0x4A, 0x7D, 0x62, 0x74, 0x8F, 0x36, 0x70, 0xC8, 0xC4, + 0x9E, 0x59, 0x80, 0x29, 0xD6, 0x86, 0x99, 0x2A, 0x1B, 0xFC, 0xD9, 0xEF, 0xEC, 0xD0, 0x7F, 0x3C, 0x86, 0x9D, 0x61, 0x51, 0x70, 0xF4, 0xE8, 0xEC, 0x70, 0xEE, + 0x2D, 0xCC, 0xD1, 0xA3, 0xFF, 0x05, 0xDF, 0x19, 0xEB, 0xA3, 0xC1, 0x08, 0x01, 0x00 + }; From efb3393aa1355f83d5ae29950d308c1838e7a1a3 Mon Sep 17 00:00:00 2001 From: "Limor \"Ladyada\" Fried" Date: Tue, 7 Jan 2025 05:05:19 -0500 Subject: [PATCH 141/183] Add two more Adafruit Boards (Sparkle Motion & Sparkle Motion mini) (#10809) * add sparkle motion board (w/esp32 mini module) * add mini version! --- boards.txt | 268 ++++++++++++++++++ .../pins_arduino.h | 42 +++ .../pins_arduino.h | 42 +++ 3 files changed, 352 insertions(+) create mode 100644 variants/adafruit_sparklemotion_esp32/pins_arduino.h create mode 100644 variants/adafruit_sparklemotionmini_esp32/pins_arduino.h diff --git a/boards.txt b/boards.txt index 26ec251ecfe..df8a4f3fe38 100644 --- a/boards.txt +++ b/boards.txt @@ -16900,6 +16900,274 @@ adafruit_qualia_s3_rgb666.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_qualia_s3_rgb666.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR adafruit_qualia_s3_rgb666.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +############################################################## +# Adafruit Sparkle Motion w/ESP32 + +sparklemotion.name=Adafruit Sparkle Motion (ESP32) + +sparklemotion.bootloader.tool=esptool_py +sparklemotion.bootloader.tool.default=esptool_py + +sparklemotion.upload.tool=esptool_py +sparklemotion.upload.tool.default=esptool_py +sparklemotion.upload.tool.network=esp_ota + +sparklemotion.upload.maximum_size=1310720 +sparklemotion.upload.maximum_data_size=327680 +sparklemotion.upload.flags= +sparklemotion.upload.extra_flags= + +sparklemotion.serial.disableDTR=true +sparklemotion.serial.disableRTS=true + +sparklemotion.build.tarch=xtensa +sparklemotion.build.bootloader_addr=0x1000 +sparklemotion.build.target=esp32 +sparklemotion.build.mcu=esp32 +sparklemotion.build.core=esp32 +sparklemotion.build.variant=adafruit_sparklemotion_esp32 +sparklemotion.build.board=SPARKLEMOTION_ESP32 + +sparklemotion.build.f_cpu=240000000L +sparklemotion.build.flash_size=4MB +sparklemotion.build.flash_freq=80m +sparklemotion.build.flash_mode=dio +sparklemotion.build.boot=dio +sparklemotion.build.partitions=default +sparklemotion.build.defines= +sparklemotion.build.loop_core= +sparklemotion.build.event_core= + +sparklemotion.menu.LoopCore.1=Core 1 +sparklemotion.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +sparklemotion.menu.LoopCore.0=Core 0 +sparklemotion.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +sparklemotion.menu.EventsCore.1=Core 1 +sparklemotion.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +sparklemotion.menu.EventsCore.0=Core 0 +sparklemotion.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +sparklemotion.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +sparklemotion.menu.PartitionScheme.default.build.partitions=default +sparklemotion.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +sparklemotion.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +sparklemotion.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +sparklemotion.menu.PartitionScheme.minimal.build.partitions=minimal +sparklemotion.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +sparklemotion.menu.PartitionScheme.no_ota.build.partitions=no_ota +sparklemotion.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +sparklemotion.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +sparklemotion.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +sparklemotion.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +sparklemotion.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +sparklemotion.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +sparklemotion.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +sparklemotion.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +sparklemotion.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +sparklemotion.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +sparklemotion.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +sparklemotion.menu.PartitionScheme.huge_app.build.partitions=huge_app +sparklemotion.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +sparklemotion.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +sparklemotion.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +sparklemotion.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 + +sparklemotion.menu.CPUFreq.240=240MHz (WiFi/BT) +sparklemotion.menu.CPUFreq.240.build.f_cpu=240000000L +sparklemotion.menu.CPUFreq.160=160MHz (WiFi/BT) +sparklemotion.menu.CPUFreq.160.build.f_cpu=160000000L +sparklemotion.menu.CPUFreq.80=80MHz (WiFi/BT) +sparklemotion.menu.CPUFreq.80.build.f_cpu=80000000L +sparklemotion.menu.CPUFreq.40=40MHz +sparklemotion.menu.CPUFreq.40.build.f_cpu=40000000L +sparklemotion.menu.CPUFreq.20=20MHz +sparklemotion.menu.CPUFreq.20.build.f_cpu=20000000L +sparklemotion.menu.CPUFreq.10=10MHz +sparklemotion.menu.CPUFreq.10.build.f_cpu=10000000L + +sparklemotion.menu.FlashFreq.80=80MHz +sparklemotion.menu.FlashFreq.80.build.flash_freq=80m +sparklemotion.menu.FlashFreq.40=40MHz +sparklemotion.menu.FlashFreq.40.build.flash_freq=40m + +sparklemotion.menu.FlashSize.4M=4MB (32Mb) +sparklemotion.menu.FlashSize.4M.build.flash_size=4MB + +sparklemotion.menu.UploadSpeed.921600=921600 +sparklemotion.menu.UploadSpeed.921600.upload.speed=921600 +sparklemotion.menu.UploadSpeed.115200=115200 +sparklemotion.menu.UploadSpeed.115200.upload.speed=115200 +sparklemotion.menu.UploadSpeed.256000.windows=256000 +sparklemotion.menu.UploadSpeed.256000.upload.speed=256000 +sparklemotion.menu.UploadSpeed.230400.windows.upload.speed=256000 +sparklemotion.menu.UploadSpeed.230400=230400 +sparklemotion.menu.UploadSpeed.230400.upload.speed=230400 +sparklemotion.menu.UploadSpeed.460800.linux=460800 +sparklemotion.menu.UploadSpeed.460800.macosx=460800 +sparklemotion.menu.UploadSpeed.460800.upload.speed=460800 +sparklemotion.menu.UploadSpeed.512000.windows=512000 +sparklemotion.menu.UploadSpeed.512000.upload.speed=512000 + +sparklemotion.menu.DebugLevel.none=None +sparklemotion.menu.DebugLevel.none.build.code_debug=0 +sparklemotion.menu.DebugLevel.error=Error +sparklemotion.menu.DebugLevel.error.build.code_debug=1 +sparklemotion.menu.DebugLevel.warn=Warn +sparklemotion.menu.DebugLevel.warn.build.code_debug=2 +sparklemotion.menu.DebugLevel.info=Info +sparklemotion.menu.DebugLevel.info.build.code_debug=3 +sparklemotion.menu.DebugLevel.debug=Debug +sparklemotion.menu.DebugLevel.debug.build.code_debug=4 +sparklemotion.menu.DebugLevel.verbose=Verbose +sparklemotion.menu.DebugLevel.verbose.build.code_debug=5 + +sparklemotion.menu.EraseFlash.none=Disabled +sparklemotion.menu.EraseFlash.none.upload.erase_cmd= +sparklemotion.menu.EraseFlash.all=Enabled +sparklemotion.menu.EraseFlash.all.upload.erase_cmd=-e + +sparklemotion.menu.ZigbeeMode.default=Disabled +sparklemotion.menu.ZigbeeMode.default.build.zigbee_mode= +sparklemotion.menu.ZigbeeMode.default.build.zigbee_libs= +sparklemotion.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) +sparklemotion.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +sparklemotion.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port + +############################################################## +# Adafruit Sparkle Motion Mini w/ESP32 + +sparklemotionmini.name=Adafruit Sparkle Motion Mini (ESP32) + +sparklemotionmini.bootloader.tool=esptool_py +sparklemotionmini.bootloader.tool.default=esptool_py + +sparklemotionmini.upload.tool=esptool_py +sparklemotionmini.upload.tool.default=esptool_py +sparklemotionmini.upload.tool.network=esp_ota + +sparklemotionmini.upload.maximum_size=1310720 +sparklemotionmini.upload.maximum_data_size=327680 +sparklemotionmini.upload.flags= +sparklemotionmini.upload.extra_flags= + +sparklemotionmini.serial.disableDTR=true +sparklemotionmini.serial.disableRTS=true + +sparklemotionmini.build.tarch=xtensa +sparklemotionmini.build.bootloader_addr=0x1000 +sparklemotionmini.build.target=esp32 +sparklemotionmini.build.mcu=esp32 +sparklemotionmini.build.core=esp32 +sparklemotionmini.build.variant=adafruit_sparklemotionmini_esp32 +sparklemotionmini.build.board=SPARKLEMOTIONMINI_ESP32 + +sparklemotionmini.build.f_cpu=240000000L +sparklemotionmini.build.flash_size=4MB +sparklemotionmini.build.flash_freq=80m +sparklemotionmini.build.flash_mode=dio +sparklemotionmini.build.boot=dio +sparklemotionmini.build.partitions=default +sparklemotionmini.build.defines= +sparklemotionmini.build.loop_core= +sparklemotionmini.build.event_core= + +sparklemotionmini.menu.LoopCore.1=Core 1 +sparklemotionmini.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +sparklemotionmini.menu.LoopCore.0=Core 0 +sparklemotionmini.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +sparklemotionmini.menu.EventsCore.1=Core 1 +sparklemotionmini.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +sparklemotionmini.menu.EventsCore.0=Core 0 +sparklemotionmini.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +sparklemotionmini.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +sparklemotionmini.menu.PartitionScheme.default.build.partitions=default +sparklemotionmini.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +sparklemotionmini.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +sparklemotionmini.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +sparklemotionmini.menu.PartitionScheme.minimal.build.partitions=minimal +sparklemotionmini.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +sparklemotionmini.menu.PartitionScheme.no_ota.build.partitions=no_ota +sparklemotionmini.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +sparklemotionmini.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +sparklemotionmini.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +sparklemotionmini.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +sparklemotionmini.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +sparklemotionmini.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +sparklemotionmini.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +sparklemotionmini.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +sparklemotionmini.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +sparklemotionmini.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +sparklemotionmini.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +sparklemotionmini.menu.PartitionScheme.huge_app.build.partitions=huge_app +sparklemotionmini.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +sparklemotionmini.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +sparklemotionmini.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +sparklemotionmini.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 + +sparklemotionmini.menu.CPUFreq.240=240MHz (WiFi/BT) +sparklemotionmini.menu.CPUFreq.240.build.f_cpu=240000000L +sparklemotionmini.menu.CPUFreq.160=160MHz (WiFi/BT) +sparklemotionmini.menu.CPUFreq.160.build.f_cpu=160000000L +sparklemotionmini.menu.CPUFreq.80=80MHz (WiFi/BT) +sparklemotionmini.menu.CPUFreq.80.build.f_cpu=80000000L +sparklemotionmini.menu.CPUFreq.40=40MHz +sparklemotionmini.menu.CPUFreq.40.build.f_cpu=40000000L +sparklemotionmini.menu.CPUFreq.20=20MHz +sparklemotionmini.menu.CPUFreq.20.build.f_cpu=20000000L +sparklemotionmini.menu.CPUFreq.10=10MHz +sparklemotionmini.menu.CPUFreq.10.build.f_cpu=10000000L + +sparklemotionmini.menu.FlashFreq.80=80MHz +sparklemotionmini.menu.FlashFreq.80.build.flash_freq=80m +sparklemotionmini.menu.FlashFreq.40=40MHz +sparklemotionmini.menu.FlashFreq.40.build.flash_freq=40m + +sparklemotionmini.menu.FlashSize.4M=4MB (32Mb) +sparklemotionmini.menu.FlashSize.4M.build.flash_size=4MB + +sparklemotionmini.menu.UploadSpeed.921600=921600 +sparklemotionmini.menu.UploadSpeed.921600.upload.speed=921600 +sparklemotionmini.menu.UploadSpeed.115200=115200 +sparklemotionmini.menu.UploadSpeed.115200.upload.speed=115200 +sparklemotionmini.menu.UploadSpeed.256000.windows=256000 +sparklemotionmini.menu.UploadSpeed.256000.upload.speed=256000 +sparklemotionmini.menu.UploadSpeed.230400.windows.upload.speed=256000 +sparklemotionmini.menu.UploadSpeed.230400=230400 +sparklemotionmini.menu.UploadSpeed.230400.upload.speed=230400 +sparklemotionmini.menu.UploadSpeed.460800.linux=460800 +sparklemotionmini.menu.UploadSpeed.460800.macosx=460800 +sparklemotionmini.menu.UploadSpeed.460800.upload.speed=460800 +sparklemotionmini.menu.UploadSpeed.512000.windows=512000 +sparklemotionmini.menu.UploadSpeed.512000.upload.speed=512000 + +sparklemotionmini.menu.DebugLevel.none=None +sparklemotionmini.menu.DebugLevel.none.build.code_debug=0 +sparklemotionmini.menu.DebugLevel.error=Error +sparklemotionmini.menu.DebugLevel.error.build.code_debug=1 +sparklemotionmini.menu.DebugLevel.warn=Warn +sparklemotionmini.menu.DebugLevel.warn.build.code_debug=2 +sparklemotionmini.menu.DebugLevel.info=Info +sparklemotionmini.menu.DebugLevel.info.build.code_debug=3 +sparklemotionmini.menu.DebugLevel.debug=Debug +sparklemotionmini.menu.DebugLevel.debug.build.code_debug=4 +sparklemotionmini.menu.DebugLevel.verbose=Verbose +sparklemotionmini.menu.DebugLevel.verbose.build.code_debug=5 + +sparklemotionmini.menu.EraseFlash.none=Disabled +sparklemotionmini.menu.EraseFlash.none.upload.erase_cmd= +sparklemotionmini.menu.EraseFlash.all=Enabled +sparklemotionmini.menu.EraseFlash.all.upload.erase_cmd=-e + +sparklemotionmini.menu.ZigbeeMode.default=Disabled +sparklemotionmini.menu.ZigbeeMode.default.build.zigbee_mode= +sparklemotionmini.menu.ZigbeeMode.default.build.zigbee_libs= +sparklemotionmini.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) +sparklemotionmini.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +sparklemotionmini.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port + ############################################################## nodemcu-32s.name=NodeMCU-32S diff --git a/variants/adafruit_sparklemotion_esp32/pins_arduino.h b/variants/adafruit_sparklemotion_esp32/pins_arduino.h new file mode 100644 index 00000000000..99043a9758c --- /dev/null +++ b/variants/adafruit_sparklemotion_esp32/pins_arduino.h @@ -0,0 +1,42 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include +#include "soc/soc_caps.h" + +// User LED +static const uint8_t LED_BUILTIN = 4; +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN + +// Neopixel +static const uint8_t PIN_NEOPIXEL = 2; +// RGB_BUILTIN and RGB_BRIGHTNESS can be used in new Arduino API rgbLedWrite() and digitalWrite() for blinking +#define RGB_BUILTIN (PIN_NEOPIXEL + SOC_GPIO_PIN_COUNT) +#define RGB_BRIGHTNESS 64 + +static const uint8_t TX = 9; +static const uint8_t RX = 10; + +#define TX1 TX +#define RX1 RX + +static const uint8_t SDA = 14; +static const uint8_t SCL = 13; + +static const uint8_t SS = 23; +static const uint8_t MOSI = 9; +static const uint8_t MISO = 10; +static const uint8_t SCK = 18; + +static const uint8_t A0 = 27; + +// internal switch +static const uint8_t BUTTON = 0; + +static const uint8_t T0 = 27; + +static const uint8_t DAC1 = 25; +static const uint8_t DAC2 = 26; + +#endif /* Pins_Arduino_h */ diff --git a/variants/adafruit_sparklemotionmini_esp32/pins_arduino.h b/variants/adafruit_sparklemotionmini_esp32/pins_arduino.h new file mode 100644 index 00000000000..2af307de209 --- /dev/null +++ b/variants/adafruit_sparklemotionmini_esp32/pins_arduino.h @@ -0,0 +1,42 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include +#include "soc/soc_caps.h" + +// User LED +static const uint8_t LED_BUILTIN = 12; +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN + +// Neopixel +static const uint8_t PIN_NEOPIXEL = 18; +// RGB_BUILTIN and RGB_BRIGHTNESS can be used in new Arduino API rgbLedWrite() and digitalWrite() for blinking +#define RGB_BUILTIN (PIN_NEOPIXEL + SOC_GPIO_PIN_COUNT) +#define RGB_BRIGHTNESS 64 + +static const uint8_t TX = 25; +static const uint8_t RX = 26; + +#define TX1 TX +#define RX1 RX + +static const uint8_t SDA = 19; +static const uint8_t SCL = 22; + +static const uint8_t SS = 14; +static const uint8_t MOSI = 25; +static const uint8_t MISO = 26; +static const uint8_t SCK = 27; + +static const uint8_t A0 = 13; + +// internal switch +static const uint8_t BUTTON = 0; + +static const uint8_t T0 = 13; + +static const uint8_t DAC1 = 25; +static const uint8_t DAC2 = 26; + +#endif /* Pins_Arduino_h */ From 7cfe0adc871f2f1a221a86710d61d25730315bf5 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 7 Jan 2025 15:50:38 +0200 Subject: [PATCH 142/183] IDF release/v5.3 (#10816) * IDF release/v5.3 cfea4f7c * Update core version --- cores/esp32/esp_arduino_version.h | 2 +- libraries/ArduinoOTA/library.properties | 2 +- libraries/AsyncUDP/library.properties | 2 +- libraries/BLE/library.properties | 2 +- libraries/BluetoothSerial/library.properties | 2 +- libraries/DNSServer/library.properties | 2 +- libraries/EEPROM/library.properties | 2 +- libraries/ESP32/library.properties | 2 +- libraries/ESP_I2S/library.properties | 2 +- libraries/ESP_NOW/library.properties | 2 +- libraries/ESP_SR/library.properties | 2 +- libraries/ESPmDNS/library.properties | 2 +- libraries/Ethernet/library.properties | 2 +- libraries/FFat/library.properties | 2 +- libraries/FS/library.properties | 2 +- libraries/HTTPClient/library.properties | 2 +- libraries/HTTPUpdate/library.properties | 2 +- libraries/HTTPUpdateServer/library.properties | 2 +- libraries/Insights/library.properties | 2 +- libraries/LittleFS/library.properties | 2 +- libraries/Matter/library.properties | 2 +- libraries/NetBIOS/library.properties | 2 +- libraries/Network/library.properties | 2 +- .../NetworkClientSecure/library.properties | 2 +- libraries/OpenThread/library.properties | 2 +- libraries/PPP/library.properties | 2 +- libraries/Preferences/library.properties | 2 +- libraries/RainMaker/library.properties | 2 +- libraries/SD/library.properties | 2 +- libraries/SD_MMC/library.properties | 2 +- libraries/SPI/library.properties | 2 +- libraries/SPIFFS/library.properties | 2 +- libraries/SimpleBLE/library.properties | 2 +- libraries/TFLiteMicro/library.properties | 2 +- libraries/Ticker/library.properties | 2 +- libraries/USB/library.properties | 2 +- libraries/Update/library.properties | 2 +- libraries/WebServer/library.properties | 2 +- libraries/WiFi/library.properties | 2 +- libraries/WiFiProv/library.properties | 2 +- libraries/Wire/library.properties | 2 +- libraries/Zigbee/library.properties | 2 +- package.json | 2 +- package/package_esp32_index.template.json | 68 +++++++++---------- platform.txt | 2 +- 45 files changed, 78 insertions(+), 78 deletions(-) diff --git a/cores/esp32/esp_arduino_version.h b/cores/esp32/esp_arduino_version.h index c2921b95fb8..dece36df1b8 100644 --- a/cores/esp32/esp_arduino_version.h +++ b/cores/esp32/esp_arduino_version.h @@ -23,7 +23,7 @@ extern "C" { /** Minor version number (x.X.x) */ #define ESP_ARDUINO_VERSION_MINOR 1 /** Patch version number (x.x.X) */ -#define ESP_ARDUINO_VERSION_PATCH 0 +#define ESP_ARDUINO_VERSION_PATCH 1 /** * Macro to convert ARDUINO version number into an integer diff --git a/libraries/ArduinoOTA/library.properties b/libraries/ArduinoOTA/library.properties index 54ad6eafb21..524564ff699 100644 --- a/libraries/ArduinoOTA/library.properties +++ b/libraries/ArduinoOTA/library.properties @@ -1,5 +1,5 @@ name=ArduinoOTA -version=3.1.0 +version=3.1.1 author=Ivan Grokhotkov and Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables Over The Air upgrades, via wifi and espota.py UDP request/TCP download. diff --git a/libraries/AsyncUDP/library.properties b/libraries/AsyncUDP/library.properties index 24457a39b90..5b1afd68273 100644 --- a/libraries/AsyncUDP/library.properties +++ b/libraries/AsyncUDP/library.properties @@ -1,5 +1,5 @@ name=ESP32 Async UDP -version=3.1.0 +version=3.1.1 author=Me-No-Dev maintainer=Me-No-Dev sentence=Async UDP Library for ESP32 diff --git a/libraries/BLE/library.properties b/libraries/BLE/library.properties index 32ad36b5f44..afda29db686 100644 --- a/libraries/BLE/library.properties +++ b/libraries/BLE/library.properties @@ -1,5 +1,5 @@ name=BLE -version=3.1.0 +version=3.1.1 author=Neil Kolban maintainer=Dariusz Krempa sentence=BLE functions for ESP32 diff --git a/libraries/BluetoothSerial/library.properties b/libraries/BluetoothSerial/library.properties index 6db3a01bb19..cf0dab07aa7 100644 --- a/libraries/BluetoothSerial/library.properties +++ b/libraries/BluetoothSerial/library.properties @@ -1,5 +1,5 @@ name=BluetoothSerial -version=3.1.0 +version=3.1.1 author=Evandro Copercini maintainer=Evandro Copercini sentence=Simple UART to Classical Bluetooth bridge for ESP32 diff --git a/libraries/DNSServer/library.properties b/libraries/DNSServer/library.properties index 077d9237f21..8a6d1786625 100644 --- a/libraries/DNSServer/library.properties +++ b/libraries/DNSServer/library.properties @@ -1,5 +1,5 @@ name=DNSServer -version=3.1.0 +version=3.1.1 author=Kristijan Novoselić maintainer=Kristijan Novoselić, sentence=A simple DNS server for ESP32. diff --git a/libraries/EEPROM/library.properties b/libraries/EEPROM/library.properties index bf75d618898..d66116947c7 100644 --- a/libraries/EEPROM/library.properties +++ b/libraries/EEPROM/library.properties @@ -1,5 +1,5 @@ name=EEPROM -version=3.1.0 +version=3.1.1 author=Ivan Grokhotkov maintainer=Paolo Becchi sentence=Enables reading and writing data a sequential, addressable FLASH storage diff --git a/libraries/ESP32/library.properties b/libraries/ESP32/library.properties index 1bb1ed21750..160b392f39e 100644 --- a/libraries/ESP32/library.properties +++ b/libraries/ESP32/library.properties @@ -1,5 +1,5 @@ name=ESP32 -version=3.1.0 +version=3.1.1 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 sketches examples diff --git a/libraries/ESP_I2S/library.properties b/libraries/ESP_I2S/library.properties index 807f7daeb9d..3105266d708 100644 --- a/libraries/ESP_I2S/library.properties +++ b/libraries/ESP_I2S/library.properties @@ -1,5 +1,5 @@ name=ESP_I2S -version=3.1.0 +version=3.1.1 author=me-no-dev maintainer=me-no-dev sentence=Library for ESP I2S communication diff --git a/libraries/ESP_NOW/library.properties b/libraries/ESP_NOW/library.properties index 42876f47f95..ba52e080046 100644 --- a/libraries/ESP_NOW/library.properties +++ b/libraries/ESP_NOW/library.properties @@ -1,5 +1,5 @@ name=ESP_NOW -version=3.1.0 +version=3.1.1 author=me-no-dev maintainer=P-R-O-C-H-Y sentence=Library for ESP_NOW diff --git a/libraries/ESP_SR/library.properties b/libraries/ESP_SR/library.properties index a81cff2fe9d..b52c0552cbb 100644 --- a/libraries/ESP_SR/library.properties +++ b/libraries/ESP_SR/library.properties @@ -1,5 +1,5 @@ name=ESP_SR -version=3.1.0 +version=3.1.1 author=me-no-dev maintainer=me-no-dev sentence=Library for ESP Sound Recognition diff --git a/libraries/ESPmDNS/library.properties b/libraries/ESPmDNS/library.properties index 4f65114fd0b..fe06ddb6851 100644 --- a/libraries/ESPmDNS/library.properties +++ b/libraries/ESPmDNS/library.properties @@ -1,5 +1,5 @@ name=ESPmDNS -version=3.1.0 +version=3.1.1 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 mDNS Library diff --git a/libraries/Ethernet/library.properties b/libraries/Ethernet/library.properties index 70aa24ec4aa..e8075d15f11 100644 --- a/libraries/Ethernet/library.properties +++ b/libraries/Ethernet/library.properties @@ -1,5 +1,5 @@ name=Ethernet -version=3.1.0 +version=3.1.1 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables network connection (local and Internet) using the ESP32 Ethernet. diff --git a/libraries/FFat/library.properties b/libraries/FFat/library.properties index dae11e43aaf..e75ef4206a6 100644 --- a/libraries/FFat/library.properties +++ b/libraries/FFat/library.properties @@ -1,5 +1,5 @@ name=FFat -version=3.1.0 +version=3.1.1 author=Hristo Gochkov, Ivan Grokhtkov, Larry Bernstone maintainer=Hristo Gochkov sentence=ESP32 FAT on Flash File System diff --git a/libraries/FS/library.properties b/libraries/FS/library.properties index 009383ab0c8..b339f57356f 100644 --- a/libraries/FS/library.properties +++ b/libraries/FS/library.properties @@ -1,5 +1,5 @@ name=FS -version=3.1.0 +version=3.1.1 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 File System diff --git a/libraries/HTTPClient/library.properties b/libraries/HTTPClient/library.properties index 203b8929d30..df11cb033b8 100644 --- a/libraries/HTTPClient/library.properties +++ b/libraries/HTTPClient/library.properties @@ -1,5 +1,5 @@ name=HTTPClient -version=3.1.0 +version=3.1.1 author=Markus Sattler maintainer=Markus Sattler sentence=HTTP Client for ESP32 diff --git a/libraries/HTTPUpdate/library.properties b/libraries/HTTPUpdate/library.properties index ac903dd71cf..dc02780c8d2 100644 --- a/libraries/HTTPUpdate/library.properties +++ b/libraries/HTTPUpdate/library.properties @@ -1,5 +1,5 @@ name=HTTPUpdate -version=3.1.0 +version=3.1.1 author=Markus Sattler maintainer=Markus Sattler sentence=Http Update for ESP32 diff --git a/libraries/HTTPUpdateServer/library.properties b/libraries/HTTPUpdateServer/library.properties index b26bd2cad7b..6cdcc1b34ea 100644 --- a/libraries/HTTPUpdateServer/library.properties +++ b/libraries/HTTPUpdateServer/library.properties @@ -1,5 +1,5 @@ name=HTTPUpdateServer -version=3.1.0 +version=3.1.1 author=Hristo Kapanakov maintainer= sentence=Simple HTTP Update server based on the WebServer diff --git a/libraries/Insights/library.properties b/libraries/Insights/library.properties index af213a1e70d..39b1f80c876 100644 --- a/libraries/Insights/library.properties +++ b/libraries/Insights/library.properties @@ -1,5 +1,5 @@ name=ESP Insights -version=3.1.0 +version=3.1.1 author=Sanket Wadekar maintainer=Sanket Wadekar sentence=ESP Insights diff --git a/libraries/LittleFS/library.properties b/libraries/LittleFS/library.properties index 86c4c43eeca..9f665385dce 100644 --- a/libraries/LittleFS/library.properties +++ b/libraries/LittleFS/library.properties @@ -1,5 +1,5 @@ name=LittleFS -version=3.1.0 +version=3.1.1 author= maintainer= sentence=LittleFS for esp32 diff --git a/libraries/Matter/library.properties b/libraries/Matter/library.properties index e08c750fb59..14a7f48c6de 100644 --- a/libraries/Matter/library.properties +++ b/libraries/Matter/library.properties @@ -1,5 +1,5 @@ name=Matter -version=3.1.0 +version=3.1.1 author=Rodrigo Garcia | GitHub @SuGlider maintainer=Rodrigo Garcia sentence=Library for supporting Matter environment on ESP32. diff --git a/libraries/NetBIOS/library.properties b/libraries/NetBIOS/library.properties index 42555781f75..f28405b7f64 100644 --- a/libraries/NetBIOS/library.properties +++ b/libraries/NetBIOS/library.properties @@ -1,5 +1,5 @@ name=NetBIOS -version=3.1.0 +version=3.1.1 author=Pablo@xpablo.cz maintainer=Hristo Gochkov sentence=Enables NBNS (NetBIOS) name resolution. diff --git a/libraries/Network/library.properties b/libraries/Network/library.properties index 8a1567e68a9..d3a9f329306 100644 --- a/libraries/Network/library.properties +++ b/libraries/Network/library.properties @@ -1,5 +1,5 @@ name=Networking -version=3.1.0 +version=3.1.1 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=General network management library. diff --git a/libraries/NetworkClientSecure/library.properties b/libraries/NetworkClientSecure/library.properties index d810e852524..6d79dc61095 100644 --- a/libraries/NetworkClientSecure/library.properties +++ b/libraries/NetworkClientSecure/library.properties @@ -1,5 +1,5 @@ name=NetworkClientSecure -version=3.1.0 +version=3.1.1 author=Evandro Luis Copercini maintainer=Github Community sentence=Enables secure network connection (local and Internet) using the ESP32 built-in WiFi. diff --git a/libraries/OpenThread/library.properties b/libraries/OpenThread/library.properties index 19d37749a92..a50a803dfa6 100644 --- a/libraries/OpenThread/library.properties +++ b/libraries/OpenThread/library.properties @@ -1,5 +1,5 @@ name=OpenThread -version=3.1.0 +version=3.1.1 author=Rodrigo Garcia | GitHub @SuGlider maintainer=Rodrigo Garcia sentence=Library for OpenThread Network on ESP32. diff --git a/libraries/PPP/library.properties b/libraries/PPP/library.properties index e2b290cc893..fefd89d4904 100644 --- a/libraries/PPP/library.properties +++ b/libraries/PPP/library.properties @@ -1,5 +1,5 @@ name=PPP -version=3.1.0 +version=3.1.1 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables network connection using GSM Modem. diff --git a/libraries/Preferences/library.properties b/libraries/Preferences/library.properties index 90cd20d75c3..842ade94003 100644 --- a/libraries/Preferences/library.properties +++ b/libraries/Preferences/library.properties @@ -1,5 +1,5 @@ name=Preferences -version=3.1.0 +version=3.1.1 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Provides friendly access to ESP32's Non-Volatile Storage diff --git a/libraries/RainMaker/library.properties b/libraries/RainMaker/library.properties index 0c3e6e26697..2f49258e78d 100644 --- a/libraries/RainMaker/library.properties +++ b/libraries/RainMaker/library.properties @@ -1,5 +1,5 @@ name=ESP RainMaker -version=3.1.0 +version=3.1.1 author=Sweety Mhaiske maintainer=Hristo Gochkov sentence=ESP RainMaker Support diff --git a/libraries/SD/library.properties b/libraries/SD/library.properties index 3fd1a3f8a3e..117de77ca36 100644 --- a/libraries/SD/library.properties +++ b/libraries/SD/library.properties @@ -1,5 +1,5 @@ name=SD -version=3.1.0 +version=3.1.1 author=Arduino, SparkFun maintainer=Arduino sentence=Enables reading and writing on SD cards. For all Arduino boards. diff --git a/libraries/SD_MMC/library.properties b/libraries/SD_MMC/library.properties index 94586e8e1ec..72c12c61d5c 100644 --- a/libraries/SD_MMC/library.properties +++ b/libraries/SD_MMC/library.properties @@ -1,5 +1,5 @@ name=SD_MMC -version=3.1.0 +version=3.1.1 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 SDMMC File System diff --git a/libraries/SPI/library.properties b/libraries/SPI/library.properties index a7a7204db62..8c567f00d40 100644 --- a/libraries/SPI/library.properties +++ b/libraries/SPI/library.properties @@ -1,5 +1,5 @@ name=SPI -version=3.1.0 +version=3.1.1 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables the communication with devices that use the Serial Peripheral Interface (SPI) Bus. For all Arduino boards, BUT Arduino DUE. diff --git a/libraries/SPIFFS/library.properties b/libraries/SPIFFS/library.properties index 132ff5fb7f1..68cb55ca124 100644 --- a/libraries/SPIFFS/library.properties +++ b/libraries/SPIFFS/library.properties @@ -1,5 +1,5 @@ name=SPIFFS -version=3.1.0 +version=3.1.1 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 SPIFFS File System diff --git a/libraries/SimpleBLE/library.properties b/libraries/SimpleBLE/library.properties index ae28a21c0df..a5541dd9750 100644 --- a/libraries/SimpleBLE/library.properties +++ b/libraries/SimpleBLE/library.properties @@ -1,5 +1,5 @@ name=SimpleBLE -version=3.1.0 +version=3.1.1 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Provides really simple BLE advertizer with just on and off diff --git a/libraries/TFLiteMicro/library.properties b/libraries/TFLiteMicro/library.properties index cde7d21bec1..ef9b474611f 100644 --- a/libraries/TFLiteMicro/library.properties +++ b/libraries/TFLiteMicro/library.properties @@ -1,5 +1,5 @@ name=TFLite Micro -version=3.1.0 +version=3.1.1 author=Sanket Wadekar maintainer=Sanket Wadekar sentence=TensorFlow Lite for Microcontrollers diff --git a/libraries/Ticker/library.properties b/libraries/Ticker/library.properties index d6e9829c6ef..8d123806109 100644 --- a/libraries/Ticker/library.properties +++ b/libraries/Ticker/library.properties @@ -1,5 +1,5 @@ name=Ticker -version=3.1.0 +version=3.1.1 author=Bert Melis maintainer=Hristo Gochkov sentence=Allows to call functions with a given interval. diff --git a/libraries/USB/library.properties b/libraries/USB/library.properties index 752acf3a803..17d4e25cae2 100644 --- a/libraries/USB/library.properties +++ b/libraries/USB/library.properties @@ -1,5 +1,5 @@ name=USB -version=3.1.0 +version=3.1.1 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=ESP32S2 USB Library diff --git a/libraries/Update/library.properties b/libraries/Update/library.properties index 9d480986b1e..5af58e380e1 100644 --- a/libraries/Update/library.properties +++ b/libraries/Update/library.properties @@ -1,5 +1,5 @@ name=Update -version=3.1.0 +version=3.1.1 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=ESP32 Sketch Update Library diff --git a/libraries/WebServer/library.properties b/libraries/WebServer/library.properties index 89e35e4713d..c225d6ebd95 100644 --- a/libraries/WebServer/library.properties +++ b/libraries/WebServer/library.properties @@ -1,5 +1,5 @@ name=WebServer -version=3.1.0 +version=3.1.1 author=Ivan Grokhotkov maintainer=Ivan Grokhtkov sentence=Simple web server library diff --git a/libraries/WiFi/library.properties b/libraries/WiFi/library.properties index 925616ea561..a82ae45a2d2 100644 --- a/libraries/WiFi/library.properties +++ b/libraries/WiFi/library.properties @@ -1,5 +1,5 @@ name=WiFi -version=3.1.0 +version=3.1.1 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables network connection (local and Internet) using the ESP32 built-in WiFi. diff --git a/libraries/WiFiProv/library.properties b/libraries/WiFiProv/library.properties index 20e27fc5097..4cf8aa56b39 100644 --- a/libraries/WiFiProv/library.properties +++ b/libraries/WiFiProv/library.properties @@ -1,5 +1,5 @@ name=WiFiProv -version=3.1.0 +version=3.1.1 author=Switi Mhaiske maintainer=Hristo Gochkov sentence=Enables provisioning. diff --git a/libraries/Wire/library.properties b/libraries/Wire/library.properties index a2d79eee81b..04beb2053bb 100644 --- a/libraries/Wire/library.properties +++ b/libraries/Wire/library.properties @@ -1,5 +1,5 @@ name=Wire -version=3.1.0 +version=3.1.1 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Allows the communication between devices or sensors connected via Two Wire Interface Bus. For esp8266 boards. diff --git a/libraries/Zigbee/library.properties b/libraries/Zigbee/library.properties index 2b1f041fc94..87e0cd63e9f 100644 --- a/libraries/Zigbee/library.properties +++ b/libraries/Zigbee/library.properties @@ -1,5 +1,5 @@ name=Zigbee -version=3.1.0 +version=3.1.1 author=P-R-O-C-H-Y maintainer=Jan Procházka sentence=Enables zigbee connection with the ESP32 diff --git a/package.json b/package.json index e13a446bd98..742b1154d63 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "framework-arduinoespressif32", - "version": "3.1.0", + "version": "3.1.1", "description": "Arduino Wiring-based Framework for the Espressif ESP32, ESP32-P4, ESP32-S and ESP32-C series of SoCs", "keywords": [ "framework", diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 310c28fad7d..ad031a4d155 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -42,7 +42,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.3-083aad99-v2" + "version": "idf-release_v5.3-cfea4f7c-v1" }, { "packager": "esp32", @@ -95,63 +95,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.3-083aad99-v2", + "version": "idf-release_v5.3-cfea4f7c-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", - "size": "341175680" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", + "size": "341118284" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", - "size": "341175680" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", + "size": "341118284" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", - "size": "341175680" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", + "size": "341118284" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", - "size": "341175680" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", + "size": "341118284" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", - "size": "341175680" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", + "size": "341118284" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", - "size": "341175680" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", + "size": "341118284" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", - "size": "341175680" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", + "size": "341118284" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-083aad99-v2.zip", - "checksum": "SHA-256:4c6cae2e34df7e85a149615a6c18169777faf9460f708fc51d93616a117973c2", - "size": "341175680" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", + "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", + "size": "341118284" } ] }, diff --git a/platform.txt b/platform.txt index 44353ab3bf4..db4ab69dfd5 100644 --- a/platform.txt +++ b/platform.txt @@ -1,5 +1,5 @@ name=ESP32 Arduino -version=3.1.0 +version=3.1.1 tools.esp32-arduino-libs.path={runtime.platform.path}/tools/esp32-arduino-libs tools.esp32-arduino-libs.path.windows={runtime.platform.path}\tools\esp32-arduino-libs From e305a483b05a1fa50fe24565b1755c7c886a8677 Mon Sep 17 00:00:00 2001 From: vortigont Date: Tue, 7 Jan 2025 22:51:14 +0900 Subject: [PATCH 143/183] feat(board): Add custom board Huidu HD-WF2/HD-WF4 - esp32-s3 HUB75 driver boards (#10779) * feat(board): Add custom boards Huidu HD-WF2/HD-WF4 - esp32-s3 HUB75 driver boards * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Me No Dev --- boards.txt | 306 +++++++++++++++++++++++++++ variants/huidu_hd_wf2/pins_arduino.h | 76 +++++++ variants/huidu_hd_wf4/pins_arduino.h | 106 ++++++++++ 3 files changed, 488 insertions(+) create mode 100644 variants/huidu_hd_wf2/pins_arduino.h create mode 100644 variants/huidu_hd_wf4/pins_arduino.h diff --git a/boards.txt b/boards.txt index df8a4f3fe38..6f9b0a2ddf6 100644 --- a/boards.txt +++ b/boards.txt @@ -48615,3 +48615,309 @@ yb_esp32s3_eth.menu.EraseFlash.all=Enabled yb_esp32s3_eth.menu.EraseFlash.all.upload.erase_cmd=-e ############################################################## +# Huidu HD-WF2 - esp32-s3 HUB75 driver board +# https://www.hdwell.com/Product/index46.html + +huidu_hd_wf2.name=Huidu HD-WF2 + +huidu_hd_wf2.bootloader.tool=esptool_py +huidu_hd_wf2.bootloader.tool.default=esptool_py + +huidu_hd_wf2.upload.tool=esptool_py +huidu_hd_wf2.upload.tool.default=esptool_py +huidu_hd_wf2.upload.tool.network=esp_ota + +huidu_hd_wf2.upload.maximum_size=1310720 +huidu_hd_wf2.upload.maximum_data_size=327680 +huidu_hd_wf2.upload.flags= +huidu_hd_wf2.upload.extra_flags= +huidu_hd_wf2.upload.use_1200bps_touch=true +huidu_hd_wf2.upload.wait_for_upload_port=true + +huidu_hd_wf2.serial.disableDTR=false +huidu_hd_wf2.serial.disableRTS=false + +huidu_hd_wf2.build.tarch=xtensa +huidu_hd_wf2.build.bootloader_addr=0x0 +huidu_hd_wf2.build.target=esp32s3 +huidu_hd_wf2.build.mcu=esp32s3 +huidu_hd_wf2.build.core=esp32 +huidu_hd_wf2.build.variant=huidu_hd_wf2 +huidu_hd_wf2.build.board=HUIDU_HD_WF2 + +huidu_hd_wf2.build.usb_mode=0 +huidu_hd_wf2.build.cdc_on_boot=1 +huidu_hd_wf2.build.msc_on_boot=0 +huidu_hd_wf2.build.dfu_on_boot=0 +huidu_hd_wf2.build.f_cpu=240000000L +huidu_hd_wf2.build.flash_size=8MB +huidu_hd_wf2.build.flash_freq=80m +huidu_hd_wf2.build.flash_mode=qio +huidu_hd_wf2.build.boot=qio +huidu_hd_wf2.build.partitions=default +huidu_hd_wf2.build.defines= +huidu_hd_wf2.build.loop_core= +huidu_hd_wf2.build.event_core= +huidu_hd_wf2.build.flash_type=qio +huidu_hd_wf2.build.psram_type=qspi +huidu_hd_wf2.build.memory_type={build.flash_type}_{build.psram_type} + +huidu_hd_wf2.menu.FlashSize.8M=8MB (64Mb) +huidu_hd_wf2.menu.FlashSize.8M.build.flash_size=8MB + +huidu_hd_wf2.menu.LoopCore.1=Core 1 +huidu_hd_wf2.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +huidu_hd_wf2.menu.LoopCore.0=Core 0 +huidu_hd_wf2.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +huidu_hd_wf2.menu.EventsCore.1=Core 1 +huidu_hd_wf2.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +huidu_hd_wf2.menu.EventsCore.0=Core 0 +huidu_hd_wf2.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +huidu_hd_wf2.menu.USBMode.hwcdc=Hardware CDC and JTAG +huidu_hd_wf2.menu.USBMode.hwcdc.build.usb_mode=1 +huidu_hd_wf2.menu.USBMode.default=USB-OTG (TinyUSB) +huidu_hd_wf2.menu.USBMode.default.build.usb_mode=0 + +huidu_hd_wf2.menu.CDCOnBoot.default=Enabled +huidu_hd_wf2.menu.CDCOnBoot.default.build.cdc_on_boot=1 +huidu_hd_wf2.menu.CDCOnBoot.cdc=Disabled +huidu_hd_wf2.menu.CDCOnBoot.cdc.build.cdc_on_boot=0 + +huidu_hd_wf2.menu.MSCOnBoot.default=Disabled +huidu_hd_wf2.menu.MSCOnBoot.default.build.msc_on_boot=0 +huidu_hd_wf2.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +huidu_hd_wf2.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +huidu_hd_wf2.menu.DFUOnBoot.default=Disabled +huidu_hd_wf2.menu.DFUOnBoot.default.build.dfu_on_boot=0 +huidu_hd_wf2.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +huidu_hd_wf2.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +huidu_hd_wf2.menu.UploadMode.default=UART0 / Hardware CDC +huidu_hd_wf2.menu.UploadMode.default.upload.use_1200bps_touch=false +huidu_hd_wf2.menu.UploadMode.default.upload.wait_for_upload_port=false +huidu_hd_wf2.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +huidu_hd_wf2.menu.UploadMode.cdc.upload.use_1200bps_touch=true +huidu_hd_wf2.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +huidu_hd_wf2.menu.PartitionScheme.default_8MB=8M with spiffs (3MB APP/1.5MB SPIFFS) +huidu_hd_wf2.menu.PartitionScheme.default_8MB.build.partitions=default_8MB +huidu_hd_wf2.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 +huidu_hd_wf2.menu.PartitionScheme.large_spiffs_8MB=Large SPIFFS (1.3MB APP/5.5MiB SPIFFS) +huidu_hd_wf2.menu.PartitionScheme.large_spiffs_8MB.build.partitions=large_spiffs_8MB +huidu_hd_wf2.menu.PartitionScheme.large_spiffs_8MB.upload.maximum_size=1310720 +huidu_hd_wf2.menu.PartitionScheme.default_ffat_8MB=8MiB fatfs (3MB APP/1.5MB FATFS) +huidu_hd_wf2.menu.PartitionScheme.default_ffat_8MB.build.partitions=default_ffat_8MB +huidu_hd_wf2.menu.PartitionScheme.default_ffat_8MB.upload.maximum_size=3342336 + +huidu_hd_wf2.menu.CPUFreq.240=240MHz (WiFi) +huidu_hd_wf2.menu.CPUFreq.240.build.f_cpu=240000000L +huidu_hd_wf2.menu.CPUFreq.160=160MHz (WiFi) +huidu_hd_wf2.menu.CPUFreq.160.build.f_cpu=160000000L +huidu_hd_wf2.menu.CPUFreq.80=80MHz (WiFi) +huidu_hd_wf2.menu.CPUFreq.80.build.f_cpu=80000000L +huidu_hd_wf2.menu.CPUFreq.40=40MHz +huidu_hd_wf2.menu.CPUFreq.40.build.f_cpu=40000000L + +huidu_hd_wf2.menu.PSRAM.enabled=QSPI Flash fix +huidu_hd_wf2.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM +huidu_hd_wf2.menu.PSRAM.enabled.build.psram_type=qspi + +huidu_hd_wf2.menu.FlashMode.qio=QIO 80MHz +huidu_hd_wf2.menu.FlashMode.qio.build.flash_mode=dio +huidu_hd_wf2.menu.FlashMode.qio.build.boot=qio +huidu_hd_wf2.menu.FlashMode.qio.build.boot_freq=80m +huidu_hd_wf2.menu.FlashMode.qio.build.flash_freq=80m +huidu_hd_wf2.menu.FlashMode.qio120=QIO 120MHz +huidu_hd_wf2.menu.FlashMode.qio120.build.flash_mode=dio +huidu_hd_wf2.menu.FlashMode.qio120.build.boot=qio +huidu_hd_wf2.menu.FlashMode.qio120.build.boot_freq=120m +huidu_hd_wf2.menu.FlashMode.qio120.build.flash_freq=80m +huidu_hd_wf2.menu.FlashMode.dio=DIO 80MHz +huidu_hd_wf2.menu.FlashMode.dio.build.flash_mode=dio +huidu_hd_wf2.menu.FlashMode.dio.build.boot=dio +huidu_hd_wf2.menu.FlashMode.dio.build.boot_freq=80m +huidu_hd_wf2.menu.FlashMode.dio.build.flash_freq=80m + +huidu_hd_wf2.menu.UploadSpeed.921600=921600 +huidu_hd_wf2.menu.UploadSpeed.921600.upload.speed=921600 +huidu_hd_wf2.menu.UploadSpeed.115200=115200 +huidu_hd_wf2.menu.UploadSpeed.115200.upload.speed=115200 +huidu_hd_wf2.menu.UploadSpeed.460800.linux=460800 +huidu_hd_wf2.menu.UploadSpeed.460800.macosx=460800 +huidu_hd_wf2.menu.UploadSpeed.460800.upload.speed=460800 + +huidu_hd_wf2.menu.DebugLevel.none=None +huidu_hd_wf2.menu.DebugLevel.none.build.code_debug=0 +huidu_hd_wf2.menu.DebugLevel.error=Error +huidu_hd_wf2.menu.DebugLevel.error.build.code_debug=1 +huidu_hd_wf2.menu.DebugLevel.warn=Warn +huidu_hd_wf2.menu.DebugLevel.warn.build.code_debug=2 +huidu_hd_wf2.menu.DebugLevel.info=Info +huidu_hd_wf2.menu.DebugLevel.info.build.code_debug=3 +huidu_hd_wf2.menu.DebugLevel.debug=Debug +huidu_hd_wf2.menu.DebugLevel.debug.build.code_debug=4 +huidu_hd_wf2.menu.DebugLevel.verbose=Verbose +huidu_hd_wf2.menu.DebugLevel.verbose.build.code_debug=5 + +huidu_hd_wf2.menu.EraseFlash.none=Disabled +huidu_hd_wf2.menu.EraseFlash.none.upload.erase_cmd= +huidu_hd_wf2.menu.EraseFlash.all=Enabled +huidu_hd_wf2.menu.EraseFlash.all.upload.erase_cmd=-e + +############################################################## +# Huidu HD-WF4 - esp32-s3 HUB75 driver board +# https://www.hdwell.com/Product/index46.html + +huidu_hd_wf4.name=Huidu HD-WF4 + +huidu_hd_wf4.bootloader.tool=esptool_py +huidu_hd_wf4.bootloader.tool.default=esptool_py + +huidu_hd_wf4.upload.tool=esptool_py +huidu_hd_wf4.upload.tool.default=esptool_py +huidu_hd_wf4.upload.tool.network=esp_ota + +huidu_hd_wf4.upload.maximum_size=1310720 +huidu_hd_wf4.upload.maximum_data_size=327680 +huidu_hd_wf4.upload.flags= +huidu_hd_wf4.upload.extra_flags= +huidu_hd_wf4.upload.use_1200bps_touch=true +huidu_hd_wf4.upload.wait_for_upload_port=true + +huidu_hd_wf4.serial.disableDTR=false +huidu_hd_wf4.serial.disableRTS=false + +huidu_hd_wf4.build.tarch=xtensa +huidu_hd_wf4.build.bootloader_addr=0x0 +huidu_hd_wf4.build.target=esp32s3 +huidu_hd_wf4.build.mcu=esp32s3 +huidu_hd_wf4.build.core=esp32 +huidu_hd_wf4.build.variant=huidu_hd_wf4 +huidu_hd_wf4.build.board=HUIDU_HD_WF4 + +huidu_hd_wf4.build.usb_mode=0 +huidu_hd_wf4.build.cdc_on_boot=1 +huidu_hd_wf4.build.msc_on_boot=0 +huidu_hd_wf4.build.dfu_on_boot=0 +huidu_hd_wf4.build.f_cpu=240000000L +huidu_hd_wf4.build.flash_size=8MB +huidu_hd_wf4.build.flash_freq=80m +huidu_hd_wf4.build.flash_mode=qio +huidu_hd_wf4.build.boot=qio +huidu_hd_wf4.build.partitions=default +huidu_hd_wf4.build.defines= +huidu_hd_wf4.build.loop_core= +huidu_hd_wf4.build.event_core= +huidu_hd_wf4.build.flash_type=qio +huidu_hd_wf4.build.psram_type=qspi +huidu_hd_wf4.build.memory_type={build.flash_type}_{build.psram_type} + +huidu_hd_wf4.menu.FlashSize.8M=8MB (64Mb) +huidu_hd_wf4.menu.FlashSize.8M.build.flash_size=8MB + +huidu_hd_wf4.menu.LoopCore.1=Core 1 +huidu_hd_wf4.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +huidu_hd_wf4.menu.LoopCore.0=Core 0 +huidu_hd_wf4.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +huidu_hd_wf4.menu.EventsCore.1=Core 1 +huidu_hd_wf4.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +huidu_hd_wf4.menu.EventsCore.0=Core 0 +huidu_hd_wf4.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +huidu_hd_wf4.menu.USBMode.hwcdc=Hardware CDC and JTAG +huidu_hd_wf4.menu.USBMode.hwcdc.build.usb_mode=1 +huidu_hd_wf4.menu.USBMode.default=USB-OTG (TinyUSB) +huidu_hd_wf4.menu.USBMode.default.build.usb_mode=0 + +huidu_hd_wf4.menu.CDCOnBoot.default=Enabled +huidu_hd_wf4.menu.CDCOnBoot.default.build.cdc_on_boot=1 +huidu_hd_wf4.menu.CDCOnBoot.cdc=Disabled +huidu_hd_wf4.menu.CDCOnBoot.cdc.build.cdc_on_boot=0 + +huidu_hd_wf4.menu.MSCOnBoot.default=Disabled +huidu_hd_wf4.menu.MSCOnBoot.default.build.msc_on_boot=0 +huidu_hd_wf4.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +huidu_hd_wf4.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +huidu_hd_wf4.menu.DFUOnBoot.default=Disabled +huidu_hd_wf4.menu.DFUOnBoot.default.build.dfu_on_boot=0 +huidu_hd_wf4.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +huidu_hd_wf4.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +huidu_hd_wf4.menu.UploadMode.default=UART0 / Hardware CDC +huidu_hd_wf4.menu.UploadMode.default.upload.use_1200bps_touch=false +huidu_hd_wf4.menu.UploadMode.default.upload.wait_for_upload_port=false +huidu_hd_wf4.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +huidu_hd_wf4.menu.UploadMode.cdc.upload.use_1200bps_touch=true +huidu_hd_wf4.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +huidu_hd_wf4.menu.PartitionScheme.default_8MB=8M with spiffs (3MB APP/1.5MB SPIFFS) +huidu_hd_wf4.menu.PartitionScheme.default_8MB.build.partitions=default_8MB +huidu_hd_wf4.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 +huidu_hd_wf4.menu.PartitionScheme.large_spiffs_8MB=Large SPIFFS (1.3MB APP/5.5MiB SPIFFS) +huidu_hd_wf4.menu.PartitionScheme.large_spiffs_8MB.build.partitions=large_spiffs_8MB +huidu_hd_wf4.menu.PartitionScheme.large_spiffs_8MB.upload.maximum_size=1310720 +huidu_hd_wf4.menu.PartitionScheme.default_ffat_8MB=8MiB fatfs (3MB APP/1.5MB FATFS) +huidu_hd_wf4.menu.PartitionScheme.default_ffat_8MB.build.partitions=default_ffat_8MB +huidu_hd_wf4.menu.PartitionScheme.default_ffat_8MB.upload.maximum_size=3342336 + +huidu_hd_wf4.menu.CPUFreq.240=240MHz (WiFi) +huidu_hd_wf4.menu.CPUFreq.240.build.f_cpu=240000000L +huidu_hd_wf4.menu.CPUFreq.160=160MHz (WiFi) +huidu_hd_wf4.menu.CPUFreq.160.build.f_cpu=160000000L +huidu_hd_wf4.menu.CPUFreq.80=80MHz (WiFi) +huidu_hd_wf4.menu.CPUFreq.80.build.f_cpu=80000000L +huidu_hd_wf4.menu.CPUFreq.40=40MHz +huidu_hd_wf4.menu.CPUFreq.40.build.f_cpu=40000000L + +huidu_hd_wf4.menu.PSRAM.enabled=QSPI Flash fix +huidu_hd_wf4.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM +huidu_hd_wf4.menu.PSRAM.enabled.build.psram_type=qspi + +huidu_hd_wf4.menu.FlashMode.qio=QIO 80MHz +huidu_hd_wf4.menu.FlashMode.qio.build.flash_mode=dio +huidu_hd_wf4.menu.FlashMode.qio.build.boot=qio +huidu_hd_wf4.menu.FlashMode.qio.build.boot_freq=80m +huidu_hd_wf4.menu.FlashMode.qio.build.flash_freq=80m +huidu_hd_wf4.menu.FlashMode.qio120=QIO 120MHz +huidu_hd_wf4.menu.FlashMode.qio120.build.flash_mode=dio +huidu_hd_wf4.menu.FlashMode.qio120.build.boot=qio +huidu_hd_wf4.menu.FlashMode.qio120.build.boot_freq=120m +huidu_hd_wf4.menu.FlashMode.qio120.build.flash_freq=80m +huidu_hd_wf4.menu.FlashMode.dio=DIO 80MHz +huidu_hd_wf4.menu.FlashMode.dio.build.flash_mode=dio +huidu_hd_wf4.menu.FlashMode.dio.build.boot=dio +huidu_hd_wf4.menu.FlashMode.dio.build.boot_freq=80m +huidu_hd_wf4.menu.FlashMode.dio.build.flash_freq=80m + +huidu_hd_wf4.menu.UploadSpeed.921600=921600 +huidu_hd_wf4.menu.UploadSpeed.921600.upload.speed=921600 +huidu_hd_wf4.menu.UploadSpeed.115200=115200 +huidu_hd_wf4.menu.UploadSpeed.115200.upload.speed=115200 +huidu_hd_wf4.menu.UploadSpeed.460800.linux=460800 +huidu_hd_wf4.menu.UploadSpeed.460800.macosx=460800 +huidu_hd_wf4.menu.UploadSpeed.460800.upload.speed=460800 + +huidu_hd_wf4.menu.DebugLevel.none=None +huidu_hd_wf4.menu.DebugLevel.none.build.code_debug=0 +huidu_hd_wf4.menu.DebugLevel.error=Error +huidu_hd_wf4.menu.DebugLevel.error.build.code_debug=1 +huidu_hd_wf4.menu.DebugLevel.warn=Warn +huidu_hd_wf4.menu.DebugLevel.warn.build.code_debug=2 +huidu_hd_wf4.menu.DebugLevel.info=Info +huidu_hd_wf4.menu.DebugLevel.info.build.code_debug=3 +huidu_hd_wf4.menu.DebugLevel.debug=Debug +huidu_hd_wf4.menu.DebugLevel.debug.build.code_debug=4 +huidu_hd_wf4.menu.DebugLevel.verbose=Verbose +huidu_hd_wf4.menu.DebugLevel.verbose.build.code_debug=5 + +huidu_hd_wf4.menu.EraseFlash.none=Disabled +huidu_hd_wf4.menu.EraseFlash.none.upload.erase_cmd= +huidu_hd_wf4.menu.EraseFlash.all=Enabled +huidu_hd_wf4.menu.EraseFlash.all.upload.erase_cmd=-e + +############################################################## diff --git a/variants/huidu_hd_wf2/pins_arduino.h b/variants/huidu_hd_wf2/pins_arduino.h new file mode 100644 index 00000000000..97d72dcc0f3 --- /dev/null +++ b/variants/huidu_hd_wf2/pins_arduino.h @@ -0,0 +1,76 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +// Huidu HD-WF2 - esp32-s3 HUB75 driver board +// https://www.hdwell.com/Product/index46.html +// https://github.com/mrcodetastic/ESP32-HUB75-MatrixPanel-DMA/discussions/667 + +#define USB_VID 0x303a +#define USB_PID 0x1001 + +#define WF2_X1_R1_PIN 2 +#define WF2_X1_R2_PIN 3 +#define WF2_X1_G1_PIN 6 +#define WF2_X1_G2_PIN 7 +#define WF2_X1_B1_PIN 10 +#define WF2_X1_B2_PIN 11 +#define WF2_X1_E_PIN 21 + +#define WF2_X2_R1_PIN 4 +#define WF2_X2_R2_PIN 5 +#define WF2_X2_G1_PIN 8 +#define WF2_X2_G2_PIN 9 +#define WF2_X2_B1_PIN 12 +#define WF2_X2_B2_PIN 13 +#define WF2_X2_E_PIN -1 // Currently unknown, so X2 port will not work (yet) with 1/32 scan panels + +#define WF2_A_PIN 39 +#define WF2_B_PIN 38 +#define WF2_C_PIN 37 +#define WF2_D_PIN 36 +#define WF2_OE_PIN 35 +#define WF2_CLK_PIN 34 +#define WF2_LAT_PIN 33 + +#define WF2_BUTTON_TEST 17 // Test key button on PCB, 1=normal, 0=pressed +#define WF2_LED_RUN_PIN 40 // Status LED on PCB +#define WF2_BM8563_I2C_SDA 41 // RTC BM8563 I2C port +#define WF2_BM8563_I2C_SCL 42 +#define WF2_USB_DN_PIN 19 // USB D- +#define WF2_USB_DP_PIN 20 // USB D+ + +#define WF2_PCB1_PIN 45 // open pad on PCB +#define WF2_PCB2_PIN 46 // open pad on PCB + +#define LED_BUILTIN WF2_LED_RUN_PIN +#define BUILTIN_LED LED_BUILTIN // backward compatibility + +static const uint8_t TX = 43; +static const uint8_t RX = 44; + +static const uint8_t SDA = WF2_BM8563_I2C_SDA; +static const uint8_t SCL = WF2_BM8563_I2C_SCL; + +static const uint8_t SS = 10; +static const uint8_t MOSI = 11; +static const uint8_t MISO = 13; +static const uint8_t SCK = 12; + +static const uint8_t T1 = WF2_X1_R1_PIN; +static const uint8_t T2 = WF2_X1_R2_PIN; +static const uint8_t T3 = WF2_X1_G1_PIN; +static const uint8_t T4 = WF2_X1_G2_PIN; +static const uint8_t T5 = WF2_X1_B1_PIN; +static const uint8_t T6 = WF2_X1_B2_PIN; +static const uint8_t T7 = WF2_A_PIN; +static const uint8_t T8 = WF2_B_PIN; +static const uint8_t T9 = WF2_C_PIN; +static const uint8_t T10 = WF2_D_PIN; +static const uint8_t T11 = WF2_X1_E_PIN; +static const uint8_t T12 = WF2_OE_PIN; +static const uint8_t T13 = WF2_CLK_PIN; +static const uint8_t T14 = WF2_LAT_PIN; + +#endif /* Pins_Arduino_h */ diff --git a/variants/huidu_hd_wf4/pins_arduino.h b/variants/huidu_hd_wf4/pins_arduino.h new file mode 100644 index 00000000000..cd96db6c445 --- /dev/null +++ b/variants/huidu_hd_wf4/pins_arduino.h @@ -0,0 +1,106 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +// Huidu HD-WF4 - esp32-s3 HUB75 driver board +// https://www.hdwell.com/Product/index46.html +// https://github.com/mrcodetastic/ESP32-HUB75-MatrixPanel-DMA/discussions/667 + +#define USB_VID 0x303a +#define USB_PID 0x1001 + +#define WF4_A_PIN 39 +#define WF4_B_PIN 38 +#define WF4_C_PIN 37 +#define WF4_D_PIN 36 +#define WF4_E_PIN 21 +#define WF4_OE_PIN 35 +#define WF4_CLK_PIN 34 +#define WF4_LAT_PIN 33 + +// X1 +#define WF4_X1_R1_PIN 2 +#define WF4_X1_R2_PIN 3 +#define WF4_X1_G1_PIN 6 +#define WF4_X1_G2_PIN 7 +#define WF4_X1_B1_PIN 10 +#define WF4_X1_B2_PIN 11 +#define WF4_X1_CS_PIN 45 // CS gpio must be set HIGH to enable X1 output + +// X2 +#define WF4_X2_R1_PIN 4 +#define WF4_X2_R2_PIN 5 +#define WF4_X2_G1_PIN 8 +#define WF4_X2_G2_PIN 9 +#define WF4_X2_B1_PIN 12 +#define WF4_X2_B2_PIN 13 +#define WF4_X2_CS_PIN WF4_X1_CS_PIN // CS gpio must be set HIGH to enable X2 output + +// X3 +#define WF4_X3_R1_PIN 2 +#define WF4_X3_R2_PIN 3 +#define WF4_X3_G1_PIN 6 +#define WF4_X3_G2_PIN 7 +#define WF4_X3_B1_PIN 10 +#define WF4_X3_B2_PIN 11 +#define WF4_X3_CS_PIN 14 // CS gpio must be set HIGH to enable X3 output + +// X4 +#define WF4_X4_R1_PIN 4 +#define WF4_X4_R2_PIN 5 +#define WF4_X4_G1_PIN 8 +#define WF4_X4_G2_PIN 9 +#define WF4_X4_B1_PIN 12 +#define WF4_X4_B2_PIN 13 +#define WF4_X4_CS_PIN WF4_X3_CS_PIN // CS gpio must be set HIGH to enable X4 output + +//#define WF4_P1_PIN UART +#define WF4_P2_DATA_PIN 0 // GPIO0 boot +#define WF4_P5_DATA_PIN 16 // temperature +//#define WF4_P7_PIN VCC/GND +#define WF4_P11_DATA_PIN 15 // IR +#define WF4_P12_DATA1_PIN 47 +#define WF4_P12_DATA2_PIN 18 +#define WF4_S1_DATA_PIN 17 // Button +#define WF4_S2_DATA_PIN 48 +#define WF4_S3_DATA_PIN 26 +#define WF4_S4_DATA_PIN 46 + +#define WF4_BUTTON_TEST WF4_S1_PIN // Test key button on PCB, 1=normal, 0=pressed +#define WF4_LED_RUN_PIN 40 // Status LED on PCB +#define WF4_BM8563_I2C_SDA 41 // RTC BM8563 I2C port +#define WF4_BM8563_I2C_SCL 42 +#define WF4_USB_DM_PIN 19 +#define WF4_USB_DP_PIN 20 + +#define LED_BUILTIN WF4_LED_RUN_PIN +#define BUILTIN_LED LED_BUILTIN // backward compatibility + +static const uint8_t TX = 43; +static const uint8_t RX = 44; + +static const uint8_t SDA = WF4_BM8563_I2C_SDA; +static const uint8_t SCL = WF4_BM8563_I2C_SCL; + +static const uint8_t SS = 10; +static const uint8_t MOSI = 11; +static const uint8_t MISO = 13; +static const uint8_t SCK = 12; + +static const uint8_t T1 = WF4_X1_R1_PIN; +static const uint8_t T2 = WF4_X1_R2_PIN; +static const uint8_t T3 = WF4_X1_G1_PIN; +static const uint8_t T4 = WF4_X1_G2_PIN; +static const uint8_t T5 = WF4_X1_B1_PIN; +static const uint8_t T6 = WF4_X1_B2_PIN; +static const uint8_t T7 = WF4_A_PIN; +static const uint8_t T8 = WF4_B_PIN; +static const uint8_t T9 = WF4_C_PIN; +static const uint8_t T10 = WF4_D_PIN; +static const uint8_t T11 = WF4_E_PIN; +static const uint8_t T12 = WF4_OE_PIN; +static const uint8_t T13 = WF4_CLK_PIN; +static const uint8_t T14 = WF4_LAT_PIN; + +#endif /* Pins_Arduino_h */ From 51ef2a1d29c738d5e826deca1248d71bf30c829e Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 7 Jan 2025 18:01:12 +0200 Subject: [PATCH 144/183] fix(platform): Improve firmware size calculation (#10820) * fix(platform): Improve firmware size calculation It will still have a couple of hundred of bytes difference * fix(build): Change partition used for UploadHugeFile --- libraries/WebServer/examples/UploadHugeFile/ci.json | 1 + platform.txt | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/WebServer/examples/UploadHugeFile/ci.json b/libraries/WebServer/examples/UploadHugeFile/ci.json index 618e46bd244..cbdd28f773d 100644 --- a/libraries/WebServer/examples/UploadHugeFile/ci.json +++ b/libraries/WebServer/examples/UploadHugeFile/ci.json @@ -1,4 +1,5 @@ { + "fqbn_append": "PartitionScheme=huge_app", "requires_any": [ "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_WIFI_REMOTE_ENABLED=y" diff --git a/platform.txt b/platform.txt index db4ab69dfd5..cc9608a4f9d 100644 --- a/platform.txt +++ b/platform.txt @@ -185,8 +185,8 @@ recipe.output.save_file={build.project_name}.{build.variant}.bin ## Compute size recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf" -recipe.size.regex=^(?:\.iram0\.text|\.iram0\.vectors|\.dram0\.data|\.flash\.text|\.flash\.rodata|)\s+([0-9]+).* -recipe.size.regex.data=^(?:\.dram0\.data|\.dram0\.bss|\.noinit)\s+([0-9]+).* +recipe.size.regex=^(?:\.iram0\.text|\.iram0\.vectors|\.dram0\.data|\.dram1\.data|\.flash\.text|\.flash\.rodata|\.flash\.appdesc|\.flash\.init_array|\.eh_frame|)\s+([0-9]+).* +recipe.size.regex.data=^(?:\.dram0\.data|\.dram0\.bss|\.dram1\.data|\.dram1\.bss|\.noinit)\s+([0-9]+).* ## Required discoveries and monitors ## --------------------------------- From c23c78674995079a1c49ceae3b1e6ab9fdafb454 Mon Sep 17 00:00:00 2001 From: stefan-sherwood Date: Tue, 7 Jan 2025 16:53:43 -0500 Subject: [PATCH 145/183] ESPmDNS: Add method for querying discovered service name (#10819) * Add method for querying service name * Added implementation for getting service name * Update mDNS-SD_Extended example to include service name * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../examples/mDNS-SD_Extended/mDNS-SD_Extended.ino | 2 ++ libraries/ESPmDNS/src/ESPmDNS.cpp | 9 +++++++++ libraries/ESPmDNS/src/ESPmDNS.h | 1 + 3 files changed, 12 insertions(+) diff --git a/libraries/ESPmDNS/examples/mDNS-SD_Extended/mDNS-SD_Extended.ino b/libraries/ESPmDNS/examples/mDNS-SD_Extended/mDNS-SD_Extended.ino index d2e48c0580c..e630d668cea 100644 --- a/libraries/ESPmDNS/examples/mDNS-SD_Extended/mDNS-SD_Extended.ino +++ b/libraries/ESPmDNS/examples/mDNS-SD_Extended/mDNS-SD_Extended.ino @@ -68,6 +68,8 @@ void browseService(const char *service, const char *proto) { Serial.print(" "); Serial.print(i + 1); Serial.print(": "); + Serial.print(MDNS.instanceName(i)); + Serial.print(" - "); Serial.print(MDNS.hostname(i)); Serial.print(" ("); Serial.print(MDNS.address(i)); diff --git a/libraries/ESPmDNS/src/ESPmDNS.cpp b/libraries/ESPmDNS/src/ESPmDNS.cpp index 4c15ed3a5dd..5d422513bbd 100644 --- a/libraries/ESPmDNS/src/ESPmDNS.cpp +++ b/libraries/ESPmDNS/src/ESPmDNS.cpp @@ -299,6 +299,15 @@ String MDNSResponder::hostname(int idx) { return String(result->hostname); } +String MDNSResponder::instanceName(int idx) { + mdns_result_t *result = _getResult(idx); + if (!result) { + log_e("Result %d not found", idx); + return String(); + } + return String(result->instance_name); +} + IPAddress MDNSResponder::address(int idx) { mdns_result_t *result = _getResult(idx); if (!result) { diff --git a/libraries/ESPmDNS/src/ESPmDNS.h b/libraries/ESPmDNS/src/ESPmDNS.h index 0336f476efe..1fb90bbf454 100644 --- a/libraries/ESPmDNS/src/ESPmDNS.h +++ b/libraries/ESPmDNS/src/ESPmDNS.h @@ -110,6 +110,7 @@ class MDNSResponder { } String hostname(int idx); + String instanceName(int idx); IPAddress address(int idx); IPAddress addressV6(int idx); uint16_t port(int idx); From 2f423afc4eb481bcc1e31c795643f009d184bf4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Wed, 8 Jan 2025 14:31:51 +0100 Subject: [PATCH 146/183] fix(zigbee): Fixes of timeout, example, warnings and bounding + add a 2MB part scheme for Zigbee ED (#10817) * feat(zigbee): Add 2MB partition scheme for ED * fix(example): Check if readings are not null * fix(zigbee): Add a 10s timeout for temp sensor settings read * fix(example): Remove duplicated read * fix(zigbee): Check if device is not bound before bounding again * fix(zigbee): Revert zigbee partitions name * fix(zigbee): Fix warnings of missing initializer for member * fix(zigbee): Fix typo in the comment Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- boards.txt | 6 ++ .../Zigbee_On_Off_Switch.ino | 10 ++- libraries/Zigbee/src/ZigbeeCore.cpp | 15 +++- libraries/Zigbee/src/ZigbeeEP.cpp | 2 - libraries/Zigbee/src/ZigbeeEP.h | 2 + .../src/ep/ZigbeeCarbonDioxideSensor.cpp | 42 ++++------ libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp | 42 ++++------ .../Zigbee/src/ep/ZigbeePressureSensor.cpp | 42 ++++------ libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp | 81 +++++++------------ libraries/Zigbee/src/ep/ZigbeeThermostat.cpp | 2 +- tools/partitions/zigbee_2MB.csv | 7 ++ 11 files changed, 108 insertions(+), 143 deletions(-) create mode 100644 tools/partitions/zigbee_2MB.csv diff --git a/boards.txt b/boards.txt index 6f9b0a2ddf6..909874fc6d4 100644 --- a/boards.txt +++ b/boards.txt @@ -453,6 +453,9 @@ esp32h2.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 esp32h2.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs esp32h2.menu.PartitionScheme.zigbee.build.partitions=zigbee esp32h2.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 +esp32h2.menu.PartitionScheme.zigbee_2MB=Zigbee 2MB with spiffs +esp32h2.menu.PartitionScheme.zigbee_2MB.build.partitions=zigbee_2MB +esp32h2.menu.PartitionScheme.zigbee_2MB.upload.maximum_size=1310720 esp32h2.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32h2.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32h2.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 @@ -645,6 +648,9 @@ esp32c6.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 esp32c6.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs esp32c6.menu.PartitionScheme.zigbee.build.partitions=zigbee esp32c6.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 +esp32c6.menu.PartitionScheme.zigbee_2MB=Zigbee 2MB with spiffs +esp32c6.menu.PartitionScheme.zigbee_2MB.build.partitions=zigbee_2MB +esp32c6.menu.PartitionScheme.zigbee_2MB.upload.maximum_size=1310720 esp32c6.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32c6.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32c6.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino b/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino index 56d23cdc95f..0721371ce0e 100644 --- a/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino +++ b/libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino @@ -143,8 +143,14 @@ void setup() { "IEEE Address: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\r\n", device->ieee_addr[7], device->ieee_addr[6], device->ieee_addr[5], device->ieee_addr[4], device->ieee_addr[3], device->ieee_addr[2], device->ieee_addr[1], device->ieee_addr[0] ); - Serial.printf("Light manufacturer: %s\r\n", zbSwitch.readManufacturer(device->endpoint, device->short_addr, device->ieee_addr)); - Serial.printf("Light model: %s\r\n", zbSwitch.readModel(device->endpoint, device->short_addr, device->ieee_addr)); + char *manufacturer = zbSwitch.readManufacturer(device->endpoint, device->short_addr, device->ieee_addr); + char *model = zbSwitch.readModel(device->endpoint, device->short_addr, device->ieee_addr); + if (manufacturer != nullptr) { + Serial.printf("Light manufacturer: %s\r\n", manufacturer); + } + if (model != nullptr) { + Serial.printf("Light model: %s\r\n", model); + } } Serial.println(); diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index cc0111f2644..0a3177919da 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -314,7 +314,20 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { // for each endpoint in the list call the findEndpoint function if not bounded or allowed to bind multiple devices for (std::list::iterator it = Zigbee.ep_objects.begin(); it != Zigbee.ep_objects.end(); ++it) { if (!(*it)->bound() || (*it)->epAllowMultipleBinding()) { - (*it)->findEndpoint(&cmd_req); + // Check if the device is already bound + bool found = false; + // Get the list of devices bound to the EP + std::list bound_devices = (*it)->getBoundDevices(); + for (std::list::iterator device = bound_devices.begin(); device != bound_devices.end(); ++device) { + if (((*device)->short_addr == dev_annce_params->device_short_addr) || (memcmp((*device)->ieee_addr, dev_annce_params->ieee_addr, 8) == 0)) { + found = true; + log_d("Device already bound to endpoint %d", (*it)->getEndpoint()); + break; + } + } + if (!found) { + (*it)->findEndpoint(&cmd_req); + } } } } diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index dbfe8596268..61f2fa8d2de 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -7,8 +7,6 @@ #include "esp_zigbee_cluster.h" #include "zcl/esp_zigbee_zcl_power_config.h" -#define ZB_CMD_TIMEOUT 10000 // 10 seconds - bool ZigbeeEP::_is_bound = false; bool ZigbeeEP::_allow_multiple_binding = false; diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index 522c84620ff..a5e9efa4283 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -8,6 +8,8 @@ #include /* Useful defines */ +#define ZB_CMD_TIMEOUT 10000 // 10 seconds + #define ZB_ARRAY_LENTH(arr) (sizeof(arr) / sizeof(arr[0])) #define XYZ_TO_RGB(X, Y, Z, r, g, b) \ { \ diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp index 89454c057e3..eabc3c7c194 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp @@ -45,34 +45,20 @@ void ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max if (delta > 0) { log_e("Delta reporting is currently not supported by the carbon dioxide sensor"); } - // clang-format off - esp_zb_zcl_reporting_info_t reporting_info = { - .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, - .ep = _endpoint, - .cluster_id = ESP_ZB_ZCL_CLUSTER_ID_CARBON_DIOXIDE_MEASUREMENT, - .cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, - .attr_id = ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MEASURED_VALUE_ID, - .u = - { - .send_info = - { - .min_interval = min_interval, - .max_interval = max_interval, - .delta = - { - .u16 = delta, - }, - .def_min_interval = min_interval, - .def_max_interval = max_interval, - }, - }, - .dst = - { - .profile_id = ESP_ZB_AF_HA_PROFILE_ID, - }, - .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, - }; - // clang-format on + esp_zb_zcl_reporting_info_t reporting_info; + memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t)); + reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV; + reporting_info.ep = _endpoint; + reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_CARBON_DIOXIDE_MEASUREMENT; + reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; + reporting_info.attr_id = ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MEASURED_VALUE_ID; + reporting_info.u.send_info.min_interval = min_interval; + reporting_info.u.send_info.max_interval = max_interval; + reporting_info.u.send_info.def_min_interval = min_interval; + reporting_info.u.send_info.def_max_interval = max_interval; + reporting_info.u.send_info.delta.u16 = delta; + reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID; + reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp index 6adf8172194..75196e78543 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp @@ -41,34 +41,20 @@ void ZigbeeFlowSensor::setTolerance(float tolerance) { } void ZigbeeFlowSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { - // clang-format off - esp_zb_zcl_reporting_info_t reporting_info = { - .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, - .ep = _endpoint, - .cluster_id = ESP_ZB_ZCL_CLUSTER_ID_FLOW_MEASUREMENT, - .cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, - .attr_id = ESP_ZB_ZCL_ATTR_FLOW_MEASUREMENT_VALUE_ID, - .u = - { - .send_info = - { - .min_interval = min_interval, - .max_interval = max_interval, - .delta = - { - .u16 = (uint16_t)(delta * 10), // Convert delta to ZCL uint16_t - }, - .def_min_interval = min_interval, - .def_max_interval = max_interval, - }, - }, - .dst = - { - .profile_id = ESP_ZB_AF_HA_PROFILE_ID, - }, - .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, - }; - // clang-format on + esp_zb_zcl_reporting_info_t reporting_info; + memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t)); + reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV; + reporting_info.ep = _endpoint; + reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_FLOW_MEASUREMENT; + reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; + reporting_info.attr_id = ESP_ZB_ZCL_ATTR_FLOW_MEASUREMENT_VALUE_ID; + reporting_info.u.send_info.min_interval = min_interval; + reporting_info.u.send_info.max_interval = max_interval; + reporting_info.u.send_info.def_min_interval = min_interval; + reporting_info.u.send_info.def_max_interval = max_interval; + reporting_info.u.send_info.delta.u16 = (uint16_t)(delta * 10); // Convert delta to ZCL uint16_t + reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID; + reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp index 9415502215d..24b4efb127e 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp @@ -38,34 +38,20 @@ void ZigbeePressureSensor::setTolerance(uint16_t tolerance) { } void ZigbeePressureSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) { - // clang-format off - esp_zb_zcl_reporting_info_t reporting_info = { - .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, - .ep = _endpoint, - .cluster_id = ESP_ZB_ZCL_CLUSTER_ID_PRESSURE_MEASUREMENT, - .cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, - .attr_id = ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_VALUE_ID, - .u = - { - .send_info = - { - .min_interval = min_interval, - .max_interval = max_interval, - .delta = - { - .u16 = delta, // x hPa - }, - .def_min_interval = min_interval, - .def_max_interval = max_interval, - }, - }, - .dst = - { - .profile_id = ESP_ZB_AF_HA_PROFILE_ID, - }, - .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, - }; - // clang-format on + esp_zb_zcl_reporting_info_t reporting_info; + memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t)); + reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV; + reporting_info.ep = _endpoint; + reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_PRESSURE_MEASUREMENT; + reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; + reporting_info.attr_id = ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_VALUE_ID; + reporting_info.u.send_info.min_interval = min_interval; + reporting_info.u.send_info.max_interval = max_interval; + reporting_info.u.send_info.def_min_interval = min_interval; + reporting_info.u.send_info.def_max_interval = max_interval; + reporting_info.u.send_info.delta.u16 = delta; // x hPa + reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID; + reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp index 98a3793fbad..d419fb14adc 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp @@ -35,33 +35,20 @@ void ZigbeeTempSensor::setTolerance(float tolerance) { } void ZigbeeTempSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { - esp_zb_zcl_reporting_info_t reporting_info = { - .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, - .ep = _endpoint, - .cluster_id = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, - .cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, - .attr_id = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, - .u = - { - .send_info = - { - .min_interval = min_interval, - .max_interval = max_interval, - .delta = - { - .u16 = (uint16_t)(delta * 100), // Convert delta to ZCL uint16_t - }, - .def_min_interval = min_interval, - .def_max_interval = max_interval, - }, - }, - .dst = - { - .profile_id = ESP_ZB_AF_HA_PROFILE_ID, - }, - .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, - }; - esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_reporting_info_t reporting_info; + memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t)); + reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV; + reporting_info.ep = _endpoint; + reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; + reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; + reporting_info.attr_id = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID; + reporting_info.u.send_info.min_interval = min_interval; + reporting_info.u.send_info.max_interval = max_interval; + reporting_info.u.send_info.def_min_interval = min_interval; + reporting_info.u.send_info.def_max_interval = max_interval; + reporting_info.u.send_info.delta.u16 = (uint16_t)(delta * 100); // Convert delta to ZCL uint16_t + reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID; + reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); } @@ -136,32 +123,20 @@ void ZigbeeTempSensor::reportHumidity() { } void ZigbeeTempSensor::setHumidityReporting(uint16_t min_interval, uint16_t max_interval, float delta) { - esp_zb_zcl_reporting_info_t reporting_info = { - .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, - .ep = _endpoint, - .cluster_id = ESP_ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, - .cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, - .attr_id = ESP_ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID, - .u = - { - .send_info = - { - .min_interval = min_interval, - .max_interval = max_interval, - .delta = - { - .u16 = (uint16_t)(delta * 100), // Convert delta to ZCL uint16_t - }, - .def_min_interval = min_interval, - .def_max_interval = max_interval, - }, - }, - .dst = - { - .profile_id = ESP_ZB_AF_HA_PROFILE_ID, - }, - .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, - }; + esp_zb_zcl_reporting_info_t reporting_info; + memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t)); + reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV; + reporting_info.ep = _endpoint; + reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT; + reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; + reporting_info.attr_id = ESP_ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID; + reporting_info.u.send_info.min_interval = min_interval; + reporting_info.u.send_info.max_interval = max_interval; + reporting_info.u.send_info.def_min_interval = min_interval; + reporting_info.u.send_info.def_max_interval = max_interval; + reporting_info.u.send_info.delta.u16 = (uint16_t)(delta * 100); // Convert delta to ZCL uint16_t + reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID; + reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); diff --git a/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp b/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp index 4610e087563..f8957f073a5 100644 --- a/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp @@ -166,7 +166,7 @@ void ZigbeeThermostat::getSensorSettings() { esp_zb_lock_release(); //Take semaphore to wait for response of all attributes - if (xSemaphoreTake(lock, portMAX_DELAY) != pdTRUE) { + if (xSemaphoreTake(lock, ZB_CMD_TIMEOUT) != pdTRUE) { log_e("Error while reading attributes"); return; } else { diff --git a/tools/partitions/zigbee_2MB.csv b/tools/partitions/zigbee_2MB.csv new file mode 100644 index 00000000000..18adb6358bd --- /dev/null +++ b/tools/partitions/zigbee_2MB.csv @@ -0,0 +1,7 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +factory, app, factory, 0x10000, 0x140000, +spiffs, data, spiffs, 0x150000,0x9B000, +zb_storage, data, fat, 0x1EB000,0x4000, +zb_fct, data, fat, 0x1EF000,0x1000, +coredump, data, coredump,0x1F0000,0x10000, From 814371726d15c059062473d293672f56b3905680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Fri, 10 Jan 2025 13:04:39 +0100 Subject: [PATCH 147/183] fix(zigbee): Fixes in handlers, destructors and co2 sensor delta reporting (#10834) * fix(zigbee): Fix co2 sensor delta in reporting * fix(zigbee): Declare default empty destructors * fix(zigbee): Return on error in zigbee handlers --- libraries/Zigbee/src/ZigbeeCore.cpp | 1 - libraries/Zigbee/src/ZigbeeCore.h | 2 +- libraries/Zigbee/src/ZigbeeEP.cpp | 2 -- libraries/Zigbee/src/ZigbeeEP.h | 2 +- libraries/Zigbee/src/ZigbeeHandlers.cpp | 10 ++++++++++ libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp | 4 +++- libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h | 2 +- libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h | 2 +- libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h | 2 +- libraries/Zigbee/src/ep/ZigbeeDimmableLight.h | 2 +- libraries/Zigbee/src/ep/ZigbeeFlowSensor.h | 2 +- libraries/Zigbee/src/ep/ZigbeeLight.h | 2 +- libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h | 2 +- libraries/Zigbee/src/ep/ZigbeePressureSensor.h | 2 +- libraries/Zigbee/src/ep/ZigbeeSwitch.h | 2 +- libraries/Zigbee/src/ep/ZigbeeTempSensor.h | 2 +- libraries/Zigbee/src/ep/ZigbeeThermostat.h | 2 +- 17 files changed, 26 insertions(+), 17 deletions(-) diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index 0a3177919da..19f4d0872b8 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -29,7 +29,6 @@ ZigbeeCore::ZigbeeCore() { } } } -ZigbeeCore::~ZigbeeCore() {} //forward declaration static esp_err_t zb_action_handler(esp_zb_core_action_callback_id_t callback_id, const void *message); diff --git a/libraries/Zigbee/src/ZigbeeCore.h b/libraries/Zigbee/src/ZigbeeCore.h index c72a60d81c4..02dce54e5ff 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -86,7 +86,7 @@ class ZigbeeCore { public: ZigbeeCore(); - ~ZigbeeCore(); + ~ZigbeeCore() {} std::list ep_objects; diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index 61f2fa8d2de..adc87540b83 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -27,8 +27,6 @@ ZigbeeEP::ZigbeeEP(uint8_t endpoint) { } } -ZigbeeEP::~ZigbeeEP() {} - void ZigbeeEP::setVersion(uint8_t version) { _ep_config.app_device_version = version; } diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index a5e9efa4283..d8ed900a7e6 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -55,7 +55,7 @@ typedef enum { class ZigbeeEP { public: ZigbeeEP(uint8_t endpoint = 10); - ~ZigbeeEP(); + ~ZigbeeEP() {} // Set ep config and cluster list void setEpConfig(esp_zb_endpoint_config_t ep_config, esp_zb_cluster_list_t *cluster_list) { diff --git a/libraries/Zigbee/src/ZigbeeHandlers.cpp b/libraries/Zigbee/src/ZigbeeHandlers.cpp index 881d7ca0c37..e387b7ce432 100644 --- a/libraries/Zigbee/src/ZigbeeHandlers.cpp +++ b/libraries/Zigbee/src/ZigbeeHandlers.cpp @@ -29,9 +29,11 @@ static esp_err_t zb_action_handler(esp_zb_core_action_callback_id_t callback_id, static esp_err_t zb_attribute_set_handler(const esp_zb_zcl_set_attr_value_message_t *message) { if (!message) { log_e("Empty message"); + return ESP_FAIL; } if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) { log_e("Received message: error status(%d)", message->info.status); + return ESP_ERR_INVALID_ARG; } log_v( @@ -55,9 +57,11 @@ static esp_err_t zb_attribute_set_handler(const esp_zb_zcl_set_attr_value_messag static esp_err_t zb_attribute_reporting_handler(const esp_zb_zcl_report_attr_message_t *message) { if (!message) { log_e("Empty message"); + return ESP_FAIL; } if (message->status != ESP_ZB_ZCL_STATUS_SUCCESS) { log_e("Received message: error status(%d)", message->status); + return ESP_ERR_INVALID_ARG; } log_v( "Received report from address(0x%x) src endpoint(%d) to dst endpoint(%d) cluster(0x%x)", message->src_address.u.short_addr, message->src_endpoint, @@ -75,9 +79,11 @@ static esp_err_t zb_attribute_reporting_handler(const esp_zb_zcl_report_attr_mes static esp_err_t zb_cmd_read_attr_resp_handler(const esp_zb_zcl_cmd_read_attr_resp_message_t *message) { if (!message) { log_e("Empty message"); + return ESP_FAIL; } if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) { log_e("Received message: error status(%d)", message->info.status); + return ESP_ERR_INVALID_ARG; } log_v( "Read attribute response: from address(0x%x) src endpoint(%d) to dst endpoint(%d) cluster(0x%x)", message->info.src_address.u.short_addr, @@ -109,9 +115,11 @@ static esp_err_t zb_cmd_read_attr_resp_handler(const esp_zb_zcl_cmd_read_attr_re static esp_err_t zb_configure_report_resp_handler(const esp_zb_zcl_cmd_config_report_resp_message_t *message) { if (!message) { log_e("Empty message"); + return ESP_FAIL; } if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) { log_e("Received message: error status(%d)", message->info.status); + return ESP_ERR_INVALID_ARG; } esp_zb_zcl_config_report_resp_variable_t *variable = message->variables; while (variable) { @@ -127,9 +135,11 @@ static esp_err_t zb_configure_report_resp_handler(const esp_zb_zcl_cmd_config_re static esp_err_t zb_cmd_default_resp_handler(const esp_zb_zcl_cmd_default_resp_message_t *message) { if (!message) { log_e("Empty message"); + return ESP_FAIL; } if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) { log_e("Received message: error status(%d)", message->info.status); + return ESP_ERR_INVALID_ARG; } log_v( "Received default response: from address(0x%x), src_endpoint(%d) to dst_endpoint(%d), cluster(0x%x) with status 0x%x", diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp index eabc3c7c194..5def43f4199 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp @@ -56,9 +56,11 @@ void ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max reporting_info.u.send_info.max_interval = max_interval; reporting_info.u.send_info.def_min_interval = min_interval; reporting_info.u.send_info.def_max_interval = max_interval; - reporting_info.u.send_info.delta.u16 = delta; reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID; reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; + float delta_f = delta / 1000000.0f; + memcpy(&reporting_info.u.send_info.delta.s32, &delta_f, sizeof(float)); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h index 71c353d4695..7744fd02f00 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h @@ -39,7 +39,7 @@ typedef struct zigbee_carbon_dioxide_sensor_cfg_s { class ZigbeeCarbonDioxideSensor : public ZigbeeEP { public: ZigbeeCarbonDioxideSensor(uint8_t endpoint); - ~ZigbeeCarbonDioxideSensor(); + ~ZigbeeCarbonDioxideSensor() {} // Set the carbon dioxide value in ppm void setCarbonDioxide(float carbon_dioxide); diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h index 9fa59dcfffc..dad267c7b39 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h @@ -12,7 +12,7 @@ class ZigbeeColorDimmableLight : public ZigbeeEP { public: ZigbeeColorDimmableLight(uint8_t endpoint); - ~ZigbeeColorDimmableLight(); + ~ZigbeeColorDimmableLight() {} void onLightChange(void (*callback)(bool, uint8_t, uint8_t, uint8_t, uint8_t)) { _on_light_change = callback; diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h index 8e2a4d9e1a3..ca67fb4ba62 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h @@ -12,7 +12,7 @@ class ZigbeeColorDimmerSwitch : public ZigbeeEP { public: ZigbeeColorDimmerSwitch(uint8_t endpoint); - ~ZigbeeColorDimmerSwitch(); + ~ZigbeeColorDimmerSwitch() {} // methods to control the color dimmable light void lightToggle(); diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h index 034c34899b4..6f92c3315e4 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h @@ -67,7 +67,7 @@ typedef struct zigbee_dimmable_light_cfg_s { class ZigbeeDimmableLight : public ZigbeeEP { public: ZigbeeDimmableLight(uint8_t endpoint); - ~ZigbeeDimmableLight(); + ~ZigbeeDimmableLight() {} void onLightChange(void (*callback)(bool, uint8_t)) { _on_light_change = callback; diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h index 3514e2fcc1b..7d5ec26f7ec 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h @@ -39,7 +39,7 @@ typedef struct zigbee_flow_sensor_cfg_s { class ZigbeeFlowSensor : public ZigbeeEP { public: ZigbeeFlowSensor(uint8_t endpoint); - ~ZigbeeFlowSensor(); + ~ZigbeeFlowSensor() {} // Set the flow value in 0,1 m3/h void setFlow(float value); diff --git a/libraries/Zigbee/src/ep/ZigbeeLight.h b/libraries/Zigbee/src/ep/ZigbeeLight.h index 9b8fc409d4a..8cf8c35f781 100644 --- a/libraries/Zigbee/src/ep/ZigbeeLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeLight.h @@ -12,7 +12,7 @@ class ZigbeeLight : public ZigbeeEP { public: ZigbeeLight(uint8_t endpoint); - ~ZigbeeLight(); + ~ZigbeeLight() {} // Use to set a cb function to be called on light change void onLightChange(void (*callback)(bool)) { diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h index e4b25c063e5..40c5eddbbdd 100644 --- a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h @@ -39,7 +39,7 @@ typedef struct zigbee_occupancy_sensor_cfg_s { class ZigbeeOccupancySensor : public ZigbeeEP { public: ZigbeeOccupancySensor(uint8_t endpoint); - ~ZigbeeOccupancySensor(); + ~ZigbeeOccupancySensor() {} // Set the occupancy value. True for occupied, false for unoccupied void setOccupancy(bool occupied); diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h index f088c033bb9..2d72ef04c06 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h @@ -39,7 +39,7 @@ typedef struct zigbee_pressure_sensor_cfg_s { class ZigbeePressureSensor : public ZigbeeEP { public: ZigbeePressureSensor(uint8_t endpoint); - ~ZigbeePressureSensor(); + ~ZigbeePressureSensor() {} // Set the pressure value in 1 hPa void setPressure(int16_t value); diff --git a/libraries/Zigbee/src/ep/ZigbeeSwitch.h b/libraries/Zigbee/src/ep/ZigbeeSwitch.h index 62264641378..b638bfe823a 100644 --- a/libraries/Zigbee/src/ep/ZigbeeSwitch.h +++ b/libraries/Zigbee/src/ep/ZigbeeSwitch.h @@ -12,7 +12,7 @@ class ZigbeeSwitch : public ZigbeeEP { public: ZigbeeSwitch(uint8_t endpoint); - ~ZigbeeSwitch(); + ~ZigbeeSwitch() {} // methods to control the on/off light void lightToggle(); diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.h b/libraries/Zigbee/src/ep/ZigbeeTempSensor.h index 2951d4b7628..e610ff8d356 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.h @@ -12,7 +12,7 @@ class ZigbeeTempSensor : public ZigbeeEP { public: ZigbeeTempSensor(uint8_t endpoint); - ~ZigbeeTempSensor(); + ~ZigbeeTempSensor() {} // Set the temperature value in 0,01°C void setTemperature(float value); diff --git a/libraries/Zigbee/src/ep/ZigbeeThermostat.h b/libraries/Zigbee/src/ep/ZigbeeThermostat.h index fe797ffd7b6..669ed9ab50a 100644 --- a/libraries/Zigbee/src/ep/ZigbeeThermostat.h +++ b/libraries/Zigbee/src/ep/ZigbeeThermostat.h @@ -32,7 +32,7 @@ class ZigbeeThermostat : public ZigbeeEP { public: ZigbeeThermostat(uint8_t endpoint); - ~ZigbeeThermostat(); + ~ZigbeeThermostat() {} void onTempRecieve(void (*callback)(float)) { _on_temp_recieve = callback; From a81e2d48f57c0a4c0b90c4a06596904d0905805a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Fri, 10 Jan 2025 13:05:16 +0100 Subject: [PATCH 148/183] fix(i2s): Check if pin is used before clearing bus (#10833) * fix(i2s): Check if pin is used before clearing bus * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- libraries/ESP_I2S/src/ESP_I2S.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libraries/ESP_I2S/src/ESP_I2S.cpp b/libraries/ESP_I2S/src/ESP_I2S.cpp index 0ac1e176dc8..d0ceb0c4b4c 100644 --- a/libraries/ESP_I2S/src/ESP_I2S.cpp +++ b/libraries/ESP_I2S/src/ESP_I2S.cpp @@ -719,9 +719,15 @@ bool I2SClass::end() { #if SOC_I2S_SUPPORTS_TDM case I2S_MODE_TDM: #endif - perimanClearPinBus(_mclk); - perimanClearPinBus(_bclk); - perimanClearPinBus(_ws); + if (_mclk >= 0) { + perimanClearPinBus(_mclk); + } + if (_bclk >= 0) { + perimanClearPinBus(_bclk); + } + if (_ws >= 0) { + perimanClearPinBus(_ws); + } if (_dout >= 0) { perimanClearPinBus(_dout); } From 4c36c897686ddca4dc6c0778c48cd368713e4f00 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 13 Jan 2025 07:36:03 -0300 Subject: [PATCH 149/183] fix(matter): serial print instead of log_i (#10842) * fix(matter): serial print instead of log_i * fix(example): adds a white space to the message --- .../examples/MatterMinimum/MatterMinimum.ino | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino b/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino index fa2599df6dd..db591ee2226 100644 --- a/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino +++ b/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino @@ -55,6 +55,8 @@ bool onOffLightCallback(bool state) { } void setup() { + Serial.begin(115200); + // Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node pinMode(buttonPin, INPUT_PULLUP); // Initialize the LED GPIO @@ -63,9 +65,14 @@ void setup() { // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection + Serial.println(); + Serial.print("Connecting to "); + Serial.println(ssid); while (WiFi.status() != WL_CONNECTED) { + Serial.print('.'); delay(500); } + Serial.println(); // Initialize at least one Matter EndPoint OnOffLight.begin(); @@ -77,11 +84,11 @@ void setup() { Matter.begin(); if (!Matter.isDeviceCommissioned()) { - log_i("Matter Node is not commissioned yet."); - log_i("Initiate the device discovery in your Matter environment."); - log_i("Commission it to your Matter hub with the manual pairing code or QR code"); - log_i("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); - log_i("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); + Serial.println("Matter Node is not commissioned yet."); + Serial.println("Initiate the device discovery in your Matter environment."); + Serial.println("Commission it to your Matter hub with the manual pairing code or QR code"); + Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str()); + Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str()); } } From 0773dd7619b1117bd59a068b69a76cdb22484f7c Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 13 Jan 2025 07:40:14 -0300 Subject: [PATCH 150/183] Bugfix/include order (#10841) * fix(arduino): include order pins_arduino first * fix(arduino): include order pins_arduino first * fix(arduino): include order pins_arduino first --- cores/esp32/Arduino.h | 9 ++++----- cores/esp32/FirmwareMSC.cpp | 2 +- cores/esp32/esp32-hal-gpio.h | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/cores/esp32/Arduino.h b/cores/esp32/Arduino.h index ab7e497dcf6..d21089cc3fe 100644 --- a/cores/esp32/Arduino.h +++ b/cores/esp32/Arduino.h @@ -33,7 +33,6 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" -#include "esp32-hal.h" #include "esp8266-compat.h" #include "soc/gpio_reg.h" @@ -41,6 +40,10 @@ #include "binary.h" #include "extra_attr.h" +#include "pins_arduino.h" +#include "io_pin_remap.h" +#include "esp32-hal.h" + #define PI 3.1415926535897932384626433832795 #define HALF_PI 1.5707963267948966192313216916398 #define TWO_PI 6.283185307179586476925286766559 @@ -248,8 +251,4 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); void noTone(uint8_t _pin); #endif /* __cplusplus */ - -#include "pins_arduino.h" -#include "io_pin_remap.h" - #endif /* _ESP32_CORE_ARDUINO_H_ */ diff --git a/cores/esp32/FirmwareMSC.cpp b/cores/esp32/FirmwareMSC.cpp index c408f52fcdb..2e944ad4df3 100644 --- a/cores/esp32/FirmwareMSC.cpp +++ b/cores/esp32/FirmwareMSC.cpp @@ -19,8 +19,8 @@ #include "esp_partition.h" #include "esp_ota_ops.h" #include "esp_image_format.h" -#include "esp32-hal.h" #include "pins_arduino.h" +#include "esp32-hal.h" #include "firmware_msc_fat.h" #include "spi_flash_mmap.h" diff --git a/cores/esp32/esp32-hal-gpio.h b/cores/esp32/esp32-hal-gpio.h index 4547d90cc56..9fce4368c22 100644 --- a/cores/esp32/esp32-hal-gpio.h +++ b/cores/esp32/esp32-hal-gpio.h @@ -24,9 +24,9 @@ extern "C" { #endif +#include "pins_arduino.h" #include "esp32-hal.h" #include "soc/soc_caps.h" -#include "pins_arduino.h" #include "driver/gpio.h" #if (CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3) From fcce93a02949c50ce7ab565884b933fb474b3437 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 13 Jan 2025 19:14:41 -0300 Subject: [PATCH 151/183] fix(example): Fix partition for PathArgServer --- libraries/WebServer/examples/PathArgServer/ci.json | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/WebServer/examples/PathArgServer/ci.json b/libraries/WebServer/examples/PathArgServer/ci.json index 618e46bd244..cbdd28f773d 100644 --- a/libraries/WebServer/examples/PathArgServer/ci.json +++ b/libraries/WebServer/examples/PathArgServer/ci.json @@ -1,4 +1,5 @@ { + "fqbn_append": "PartitionScheme=huge_app", "requires_any": [ "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_WIFI_REMOTE_ENABLED=y" From 01d9726609cbb1425431dd26f5dda2ca4418b4e6 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 14 Jan 2025 20:46:31 -0300 Subject: [PATCH 152/183] docs(discord): Replace Gitter links with Discord (#10852) * docs(discord): Replace Gitter links with Discord * docs(links): Add Developer Portal link --- .github/ISSUE_TEMPLATE/config.yml | 6 +++--- README.md | 4 +++- docs/en/getting_started.rst | 8 +++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 03b3a76df1e..e879b09bec2 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,8 @@ blank_issues_enabled: false contact_links: - - name: Arduino ESP32 Gitter Channel - url: https://gitter.im/espressif/arduino-esp32 - about: Community channel for questions and help + - name: Arduino Core for Espressif Discord Server + url: https://discord.gg/8xY6e9crwv + about: Community Discord server for questions and help - name: ESP32 Forum - Arduino url: https://esp32.com/viewforum.php?f=19 about: Official Forum for questions diff --git a/README.md b/README.md index e610229fc60..0a9a6d0440c 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,9 @@ [![External Libraries Test](https://img.shields.io/github/actions/workflow/status/espressif/arduino-esp32/lib.yml?branch=master&event=schedule&label=External%20Libraries%20Test)](https://github.com/espressif/arduino-esp32/blob/gh-pages/LIBRARIES_TEST.md) [![Runtime Tests](https://github.com/espressif/arduino-esp32/blob/gh-pages/runtime-tests-results/badge.svg)](https://github.com/espressif/arduino-esp32/actions/workflows/tests_results.yml) -### Need help or have a question? Join the chat at [Gitter](https://gitter.im/espressif/arduino-esp32) or [open a new Discussion](https://github.com/espressif/arduino-esp32/discussions) +### Need help or have a question? Join the chat at [Discord](https://discord.gg/8xY6e9crwv) or [open a new Discussion](https://github.com/espressif/arduino-esp32/discussions) + +[![Discord invite](https://img.shields.io/discord/1327272229427216425?logo=discord&logoColor=white&logoSize=auto&label=Discord)](https://discord.gg/8xY6e9crwv) ## Contents diff --git a/docs/en/getting_started.rst b/docs/en/getting_started.rst index 8d312317bdf..cabb2ddc805 100644 --- a/docs/en/getting_started.rst +++ b/docs/en/getting_started.rst @@ -102,7 +102,8 @@ Here are some community channels where you may find information and ask for some - `ESP32 Forum`_: Official Espressif Forum. - `ESP32 Forum - Arduino`_: Official Espressif Forum for Arduino related discussions. - `ESP32 Forum - Hardware`_: Official Espressif Forum for Hardware related discussions. -- `Gitter`_ +- `Espressif Developer Portal`_: Official Espressif Developer Portal with tutorials, examples, workshops, and more. +- `Arduino Core for Espressif (Discord)`_: Official Espressif Discord channel for the Arduino Core. - `Espressif MCUs (Discord)`_ - `ESP32 on Reddit`_ @@ -148,12 +149,13 @@ Resources .. _Espressif Systems: https://www.espressif.com .. _Espressif Product Selector: https://products.espressif.com/ +.. _Espressif Developer Portal: https://developer.espressif.com/ .. _Arduino.cc: https://www.arduino.cc/en/Main/Software .. _Arduino Reference: https://www.arduino.cc/reference/en/ .. _ESP32 Forum: https://esp32.com .. _ESP32 Forum - Arduino: https://esp32.com/viewforum.php?f=19 .. _ESP32 Forum - Hardware: https://esp32.com/viewforum.php?f=12 -.. _Gitter: https://gitter.im/espressif/arduino-esp32 +.. _Arduino Core for Espressif (Discord): https://discord.gg/8xY6e9crwv .. _Adafruit (Discord): https://discord.gg/adafruit -.. _Espressif MCUs (Discord): https://discord.gg/nKxMTnkD +.. _Espressif MCUs (Discord): https://discord.com/invite/XqnZPbF .. _ESP32 on Reddit: https://www.reddit.com/r/esp32 From 2a2b81ad6fe6318badbe8751fae7b64df484711b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:35:27 +0100 Subject: [PATCH 153/183] feat(zigbee): Add 2MB + 8MB partitions (#10864) --- boards.txt | 30 ++++++++++++++++++++++------ tools/partitions/zigbee_2MB.csv | 2 +- tools/partitions/zigbee_8MB.csv | 9 +++++++++ tools/partitions/zigbee_zczr_2MB.csv | 8 ++++++++ tools/partitions/zigbee_zczr_8MB.csv | 10 ++++++++++ 5 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 tools/partitions/zigbee_8MB.csv create mode 100644 tools/partitions/zigbee_zczr_2MB.csv create mode 100644 tools/partitions/zigbee_zczr_8MB.csv diff --git a/boards.txt b/boards.txt index 909874fc6d4..8e9655cda48 100644 --- a/boards.txt +++ b/boards.txt @@ -450,15 +450,24 @@ esp32h2.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 #esp32h2.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB #esp32h2.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB #esp32h2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 -esp32h2.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs -esp32h2.menu.PartitionScheme.zigbee.build.partitions=zigbee -esp32h2.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 esp32h2.menu.PartitionScheme.zigbee_2MB=Zigbee 2MB with spiffs esp32h2.menu.PartitionScheme.zigbee_2MB.build.partitions=zigbee_2MB esp32h2.menu.PartitionScheme.zigbee_2MB.upload.maximum_size=1310720 +esp32h2.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs +esp32h2.menu.PartitionScheme.zigbee.build.partitions=zigbee +esp32h2.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 +esp32h2.menu.PartitionScheme.zigbee_8MB=Zigbee 8MB with spiffs +esp32h2.menu.PartitionScheme.zigbee_8MB.build.partitions=zigbee_8MB +esp32h2.menu.PartitionScheme.zigbee_8MB.upload.maximum_size=3407872 +esp32h2.menu.PartitionScheme.zigbee_zczr_2MB=Zigbee ZCZR 2MB with spiffs +esp32h2.menu.PartitionScheme.zigbee_zczr_2MB.build.partitions=zigbee_zczr_2MB +esp32h2.menu.PartitionScheme.zigbee_zczr_2MB.upload.maximum_size=1310720 esp32h2.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32h2.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32h2.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 +esp32h2.menu.PartitionScheme.zigbee_zczr_8MB=Zigbee ZCZR 8MB with spiffs +esp32h2.menu.PartitionScheme.zigbee_zczr_8MB.build.partitions=zigbee_zczr_8MB +esp32h2.menu.PartitionScheme.zigbee_zczr_8MB.upload.maximum_size=3407872 esp32h2.menu.PartitionScheme.custom=Custom esp32h2.menu.PartitionScheme.custom.build.partitions= esp32h2.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -645,15 +654,24 @@ esp32c6.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32c6.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32c6.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB esp32c6.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 -esp32c6.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs -esp32c6.menu.PartitionScheme.zigbee.build.partitions=zigbee -esp32c6.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 esp32c6.menu.PartitionScheme.zigbee_2MB=Zigbee 2MB with spiffs esp32c6.menu.PartitionScheme.zigbee_2MB.build.partitions=zigbee_2MB esp32c6.menu.PartitionScheme.zigbee_2MB.upload.maximum_size=1310720 +esp32c6.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs +esp32c6.menu.PartitionScheme.zigbee.build.partitions=zigbee +esp32c6.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 +esp32c6.menu.PartitionScheme.zigbee_8MB=Zigbee 8MB with spiffs +esp32c6.menu.PartitionScheme.zigbee_8MB.build.partitions=zigbee_8MB +esp32c6.menu.PartitionScheme.zigbee_8MB.upload.maximum_size=3407872 +esp32c6.menu.PartitionScheme.zigbee_zczr_2MB=Zigbee ZCZR 2MB with spiffs +esp32c6.menu.PartitionScheme.zigbee_zczr_2MB.build.partitions=zigbee_zczr_2MB +esp32c6.menu.PartitionScheme.zigbee_zczr_2MB.upload.maximum_size=1310720 esp32c6.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32c6.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32c6.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 +esp32c6.menu.PartitionScheme.zigbee_zczr_8MB=Zigbee ZCZR 8MB with spiffs +esp32c6.menu.PartitionScheme.zigbee_zczr_8MB.build.partitions=zigbee_zczr_8MB +esp32c6.menu.PartitionScheme.zigbee_zczr_8MB.upload.maximum_size=3407872 esp32c6.menu.PartitionScheme.custom=Custom esp32c6.menu.PartitionScheme.custom.build.partitions= esp32c6.menu.PartitionScheme.custom.upload.maximum_size=16777216 diff --git a/tools/partitions/zigbee_2MB.csv b/tools/partitions/zigbee_2MB.csv index 18adb6358bd..7034f9bd49b 100644 --- a/tools/partitions/zigbee_2MB.csv +++ b/tools/partitions/zigbee_2MB.csv @@ -1,6 +1,6 @@ # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, -factory, app, factory, 0x10000, 0x140000, +factory, app, factory, 0x10000, 0x140000, spiffs, data, spiffs, 0x150000,0x9B000, zb_storage, data, fat, 0x1EB000,0x4000, zb_fct, data, fat, 0x1EF000,0x1000, diff --git a/tools/partitions/zigbee_8MB.csv b/tools/partitions/zigbee_8MB.csv new file mode 100644 index 00000000000..fdf46fb59d1 --- /dev/null +++ b/tools/partitions/zigbee_8MB.csv @@ -0,0 +1,9 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x340000, +app1, app, ota_1, 0x350000,0x340000, +spiffs, data, spiffs, 0x690000,0x15B000, +zb_storage, data, fat, 0x7EB000,0x4000, +zb_fct, data, fat, 0x7EF000,0x1000, +coredump, data, coredump,0x7F0000,0x10000, diff --git a/tools/partitions/zigbee_zczr_2MB.csv b/tools/partitions/zigbee_zczr_2MB.csv new file mode 100644 index 00000000000..10484eeed87 --- /dev/null +++ b/tools/partitions/zigbee_zczr_2MB.csv @@ -0,0 +1,8 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +factory, app, factory, 0x10000, 0x140000, +spiffs, data, spiffs, 0x150000,0x9A000, +zb_storage, data, fat, 0x1EA000,0x4000, +zb_fct, data, fat, 0x1EE000,0x1000, +rcp_fw, data, spiffs, 0x1EF000,0x1000, +coredump, data, coredump,0x1F0000,0x10000, diff --git a/tools/partitions/zigbee_zczr_8MB.csv b/tools/partitions/zigbee_zczr_8MB.csv new file mode 100644 index 00000000000..70dd680dc1a --- /dev/null +++ b/tools/partitions/zigbee_zczr_8MB.csv @@ -0,0 +1,10 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x340000, +app1, app, ota_1, 0x350000,0x340000, +spiffs, data, spiffs, 0x690000,0x15A000, +zb_storage, data, fat, 0x7EA000,0x4000, +zb_fct, data, fat, 0x7EE000,0x1000, +rcp_fw, data, spiffs, 0x7EF000,0x1000, +coredump, data, coredump,0x7F0000,0x10000, From 496b8411773243e1ad88a68652d6982ba2366d6b Mon Sep 17 00:00:00 2001 From: is-qian <2716275834@qq.com> Date: Tue, 21 Jan 2025 19:24:00 +0800 Subject: [PATCH 154/183] feat(esp32): Added a new device(xiao esp32s3 plus) (#10768) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(esp32): Added a new device(xiao esp32s3 plus) * Update boards.txt * Apply suggestions from code review * Fix filename error. * Fix filename error. * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- boards.txt | 178 ++++++++++++++++++ .../XIAO_ESP32S3_Plus/bootloader-tinyuf2.bin | Bin 0 -> 21408 bytes variants/XIAO_ESP32S3_Plus/partitions-8MB.csv | 10 + variants/XIAO_ESP32S3_Plus/pins_arduino.h | 90 +++++++++ variants/XIAO_ESP32S3_Plus/tinyuf2.bin | Bin 0 -> 141936 bytes 5 files changed, 278 insertions(+) create mode 100644 variants/XIAO_ESP32S3_Plus/bootloader-tinyuf2.bin create mode 100644 variants/XIAO_ESP32S3_Plus/partitions-8MB.csv create mode 100644 variants/XIAO_ESP32S3_Plus/pins_arduino.h create mode 100644 variants/XIAO_ESP32S3_Plus/tinyuf2.bin diff --git a/boards.txt b/boards.txt index 8e9655cda48..9ecd6359759 100644 --- a/boards.txt +++ b/boards.txt @@ -35211,6 +35211,184 @@ XIAO_ESP32S3.menu.EraseFlash.all.upload.erase_cmd=-e ############################################################## +XIAO_ESP32S3_Plus.name=XIAO_ESP32S3_PLUS +XIAO_ESP32S3_Plus.vid.0=0x2886 +XIAO_ESP32S3_Plus.pid.0=0x0063 +XIAO_ESP32S3_Plus.vid.1=0x2886 +XIAO_ESP32S3_Plus.pid.1=0x8063 + +XIAO_ESP32S3_Plus.bootloader.tool=esptool_py +XIAO_ESP32S3_Plus.bootloader.tool.default=esptool_py + +XIAO_ESP32S3_Plus.upload.tool=esptool_py +XIAO_ESP32S3_Plus.upload.tool.default=esptool_py +XIAO_ESP32S3_Plus.upload.tool.network=esp_ota + +XIAO_ESP32S3_Plus.upload.maximum_size=1310720 +XIAO_ESP32S3_Plus.upload.maximum_data_size=327680 +XIAO_ESP32S3_Plus.upload.flags= +XIAO_ESP32S3_Plus.upload.extra_flags= +XIAO_ESP32S3_Plus.upload.use_1200bps_touch=false +XIAO_ESP32S3_Plus.upload.wait_for_upload_port=false + +XIAO_ESP32S3_Plus.serial.disableDTR=false +XIAO_ESP32S3_Plus.serial.disableRTS=false + +XIAO_ESP32S3_Plus.build.tarch=xtensa +XIAO_ESP32S3_Plus.build.bootloader_addr=0x0 +XIAO_ESP32S3_Plus.build.target=esp32s3 +XIAO_ESP32S3_Plus.build.mcu=esp32s3 +XIAO_ESP32S3_Plus.build.core=esp32 +XIAO_ESP32S3_Plus.build.variant=XIAO_ESP32S3_Plus +XIAO_ESP32S3_Plus.build.board=XIAO_ESP32S3_PLUS + +XIAO_ESP32S3_Plus.build.usb_mode=0 +XIAO_ESP32S3_Plus.build.cdc_on_boot=1 +XIAO_ESP32S3_Plus.build.msc_on_boot=0 +XIAO_ESP32S3_Plus.build.dfu_on_boot=0 +XIAO_ESP32S3_Plus.build.f_cpu=240000000L +XIAO_ESP32S3_Plus.build.flash_size=8MB +XIAO_ESP32S3_Plus.build.flash_freq=80m +XIAO_ESP32S3_Plus.build.flash_mode=dio +XIAO_ESP32S3_Plus.build.boot=qio +XIAO_ESP32S3_Plus.build.boot_freq=80m +XIAO_ESP32S3_Plus.build.partitions=default_8MB +XIAO_ESP32S3_Plus.build.defines= +XIAO_ESP32S3_Plus.build.loop_core= +XIAO_ESP32S3_Plus.build.event_core= +XIAO_ESP32S3_Plus.build.psram_type=qspi +XIAO_ESP32S3_Plus.build.memory_type={build.boot}_{build.psram_type} + +XIAO_ESP32S3_Plus.menu.JTAGAdapter.default=Disabled +XIAO_ESP32S3_Plus.menu.JTAGAdapter.default.build.copy_jtag_files=0 +XIAO_ESP32S3_Plus.menu.JTAGAdapter.builtin=Integrated USB JTAG +XIAO_ESP32S3_Plus.menu.JTAGAdapter.builtin.build.openocdscript=esp32s3-builtin.cfg +XIAO_ESP32S3_Plus.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 +XIAO_ESP32S3_Plus.menu.JTAGAdapter.external=FTDI Adapter +XIAO_ESP32S3_Plus.menu.JTAGAdapter.external.build.openocdscript=esp32s3-ftdi.cfg +XIAO_ESP32S3_Plus.menu.JTAGAdapter.external.build.copy_jtag_files=1 +XIAO_ESP32S3_Plus.menu.JTAGAdapter.bridge=ESP USB Bridge +XIAO_ESP32S3_Plus.menu.JTAGAdapter.bridge.build.openocdscript=esp32s3-bridge.cfg +XIAO_ESP32S3_Plus.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +XIAO_ESP32S3_Plus.menu.PSRAM.disabled=Disabled +XIAO_ESP32S3_Plus.menu.PSRAM.disabled.build.defines= +XIAO_ESP32S3_Plus.menu.PSRAM.disabled.build.psram_type=qspi +XIAO_ESP32S3_Plus.menu.PSRAM.opi=OPI PSRAM +XIAO_ESP32S3_Plus.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM +XIAO_ESP32S3_Plus.menu.PSRAM.opi.build.psram_type=opi + +XIAO_ESP32S3_Plus.menu.FlashMode.qio=QIO 80MHz +XIAO_ESP32S3_Plus.menu.FlashMode.qio.build.flash_mode=dio +XIAO_ESP32S3_Plus.menu.FlashMode.qio.build.boot=qio +XIAO_ESP32S3_Plus.menu.FlashMode.qio.build.boot_freq=80m +XIAO_ESP32S3_Plus.menu.FlashMode.qio.build.flash_freq=80m +XIAO_ESP32S3_Plus.menu.FlashMode.dio=DIO 80MHz +XIAO_ESP32S3_Plus.menu.FlashMode.dio.build.flash_mode=dio +XIAO_ESP32S3_Plus.menu.FlashMode.dio.build.boot=dio +XIAO_ESP32S3_Plus.menu.FlashMode.dio.build.boot_freq=80m +XIAO_ESP32S3_Plus.menu.FlashMode.dio.build.flash_freq=80m + +XIAO_ESP32S3_Plus.menu.FlashSize.8M=8MB (64Mb) +XIAO_ESP32S3_Plus.menu.FlashSize.8M.build.flash_size=8MB + +XIAO_ESP32S3_Plus.menu.LoopCore.1=Core 1 +XIAO_ESP32S3_Plus.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +XIAO_ESP32S3_Plus.menu.LoopCore.0=Core 0 +XIAO_ESP32S3_Plus.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +XIAO_ESP32S3_Plus.menu.EventsCore.1=Core 1 +XIAO_ESP32S3_Plus.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +XIAO_ESP32S3_Plus.menu.EventsCore.0=Core 0 +XIAO_ESP32S3_Plus.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +XIAO_ESP32S3_Plus.menu.USBMode.hwcdc=Hardware CDC and JTAG +XIAO_ESP32S3_Plus.menu.USBMode.hwcdc.build.usb_mode=1 +XIAO_ESP32S3_Plus.menu.USBMode.default=USB-OTG (TinyUSB) +XIAO_ESP32S3_Plus.menu.USBMode.default.build.usb_mode=0 + +XIAO_ESP32S3_Plus.menu.CDCOnBoot.default=Enabled +XIAO_ESP32S3_Plus.menu.CDCOnBoot.default.build.cdc_on_boot=1 +XIAO_ESP32S3_Plus.menu.CDCOnBoot.cdc=Disabled +XIAO_ESP32S3_Plus.menu.CDCOnBoot.cdc.build.cdc_on_boot=0 + +XIAO_ESP32S3_Plus.menu.MSCOnBoot.default=Disabled +XIAO_ESP32S3_Plus.menu.MSCOnBoot.default.build.msc_on_boot=0 +XIAO_ESP32S3_Plus.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +XIAO_ESP32S3_Plus.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +XIAO_ESP32S3_Plus.menu.DFUOnBoot.default=Disabled +XIAO_ESP32S3_Plus.menu.DFUOnBoot.default.build.dfu_on_boot=0 +XIAO_ESP32S3_Plus.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +XIAO_ESP32S3_Plus.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +XIAO_ESP32S3_Plus.menu.UploadMode.default=UART0 / Hardware CDC +XIAO_ESP32S3_Plus.menu.UploadMode.default.upload.use_1200bps_touch=false +XIAO_ESP32S3_Plus.menu.UploadMode.default.upload.wait_for_upload_port=false +XIAO_ESP32S3_Plus.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +XIAO_ESP32S3_Plus.menu.UploadMode.cdc.upload.use_1200bps_touch=true +XIAO_ESP32S3_Plus.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +XIAO_ESP32S3_Plus.menu.PartitionScheme.default_8MB=Default with spiffs (3MB APP/1.5MB SPIFFS) +XIAO_ESP32S3_Plus.menu.PartitionScheme.default_8MB.build.partitions=default_8MB +XIAO_ESP32S3_Plus.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 +XIAO_ESP32S3_Plus.menu.PartitionScheme.max_app_8MB=Maximum APP (7.9MB APP No OTA/No FS) +XIAO_ESP32S3_Plus.menu.PartitionScheme.max_app_8MB.build.partitions=max_app_8MB +XIAO_ESP32S3_Plus.menu.PartitionScheme.max_app_8MB.upload.maximum_size=8257536 +XIAO_ESP32S3_Plus.menu.PartitionScheme.tinyuf2=TinyUF2 8MB (2MB APP/3.7MB FFAT) +XIAO_ESP32S3_Plus.menu.PartitionScheme.tinyuf2.build.custom_bootloader=bootloader-tinyuf2 +XIAO_ESP32S3_Plus.menu.PartitionScheme.tinyuf2.build.custom_partitions=partitions-8MB +XIAO_ESP32S3_Plus.menu.PartitionScheme.tinyuf2.upload.maximum_size=2097152 +XIAO_ESP32S3_Plus.menu.PartitionScheme.tinyuf2.upload.extra_flags=0x410000 "{runtime.platform.path}/variants/{build.variant}/tinyuf2.bin" + +XIAO_ESP32S3_Plus.menu.CPUFreq.240=240MHz (WiFi) +XIAO_ESP32S3_Plus.menu.CPUFreq.240.build.f_cpu=240000000L +XIAO_ESP32S3_Plus.menu.CPUFreq.160=160MHz (WiFi) +XIAO_ESP32S3_Plus.menu.CPUFreq.160.build.f_cpu=160000000L +XIAO_ESP32S3_Plus.menu.CPUFreq.80=80MHz (WiFi) +XIAO_ESP32S3_Plus.menu.CPUFreq.80.build.f_cpu=80000000L +XIAO_ESP32S3_Plus.menu.CPUFreq.40=40MHz +XIAO_ESP32S3_Plus.menu.CPUFreq.40.build.f_cpu=40000000L +XIAO_ESP32S3_Plus.menu.CPUFreq.20=20MHz +XIAO_ESP32S3_Plus.menu.CPUFreq.20.build.f_cpu=20000000L +XIAO_ESP32S3_Plus.menu.CPUFreq.10=10MHz +XIAO_ESP32S3_Plus.menu.CPUFreq.10.build.f_cpu=10000000L + +XIAO_ESP32S3_Plus.menu.UploadSpeed.921600=921600 +XIAO_ESP32S3_Plus.menu.UploadSpeed.921600.upload.speed=921600 +XIAO_ESP32S3_Plus.menu.UploadSpeed.115200=115200 +XIAO_ESP32S3_Plus.menu.UploadSpeed.115200.upload.speed=115200 +XIAO_ESP32S3_Plus.menu.UploadSpeed.256000.windows=256000 +XIAO_ESP32S3_Plus.menu.UploadSpeed.256000.upload.speed=256000 +XIAO_ESP32S3_Plus.menu.UploadSpeed.230400.windows.upload.speed=256000 +XIAO_ESP32S3_Plus.menu.UploadSpeed.230400=230400 +XIAO_ESP32S3_Plus.menu.UploadSpeed.230400.upload.speed=230400 +XIAO_ESP32S3_Plus.menu.UploadSpeed.460800.linux=460800 +XIAO_ESP32S3_Plus.menu.UploadSpeed.460800.macosx=460800 +XIAO_ESP32S3_Plus.menu.UploadSpeed.460800.upload.speed=460800 +XIAO_ESP32S3_Plus.menu.UploadSpeed.512000.windows=512000 +XIAO_ESP32S3_Plus.menu.UploadSpeed.512000.upload.speed=512000 + +XIAO_ESP32S3_Plus.menu.DebugLevel.none=None +XIAO_ESP32S3_Plus.menu.DebugLevel.none.build.code_debug=0 +XIAO_ESP32S3_Plus.menu.DebugLevel.error=Error +XIAO_ESP32S3_Plus.menu.DebugLevel.error.build.code_debug=1 +XIAO_ESP32S3_Plus.menu.DebugLevel.warn=Warn +XIAO_ESP32S3_Plus.menu.DebugLevel.warn.build.code_debug=2 +XIAO_ESP32S3_Plus.menu.DebugLevel.info=Info +XIAO_ESP32S3_Plus.menu.DebugLevel.info.build.code_debug=3 +XIAO_ESP32S3_Plus.menu.DebugLevel.debug=Debug +XIAO_ESP32S3_Plus.menu.DebugLevel.debug.build.code_debug=4 +XIAO_ESP32S3_Plus.menu.DebugLevel.verbose=Verbose +XIAO_ESP32S3_Plus.menu.DebugLevel.verbose.build.code_debug=5 + +XIAO_ESP32S3_Plus.menu.EraseFlash.none=Disabled +XIAO_ESP32S3_Plus.menu.EraseFlash.none.upload.erase_cmd= +XIAO_ESP32S3_Plus.menu.EraseFlash.all=Enabled +XIAO_ESP32S3_Plus.menu.EraseFlash.all.upload.erase_cmd=-e + +############################################################## + connaxio_espoir.name=Connaxio's Espoir connaxio_espoir.vid.0=0x10C4 connaxio_espoir.pid.0=0x8D9A diff --git a/variants/XIAO_ESP32S3_Plus/bootloader-tinyuf2.bin b/variants/XIAO_ESP32S3_Plus/bootloader-tinyuf2.bin new file mode 100644 index 0000000000000000000000000000000000000000..b11e5b236f0992d8351b579c8283c03a5e32a85c GIT binary patch literal 21408 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 SVR0lq@zytgJh)Ff;r{>(gA@M% literal 0 HcmV?d00001 diff --git a/variants/XIAO_ESP32S3_Plus/partitions-8MB.csv b/variants/XIAO_ESP32S3_Plus/partitions-8MB.csv new file mode 100644 index 00000000000..4026378b6fb --- /dev/null +++ b/variants/XIAO_ESP32S3_Plus/partitions-8MB.csv @@ -0,0 +1,10 @@ +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +# bootloader.bin,, 0x1000, 32K +# partition table,, 0x8000, 4K +nvs, data, nvs, 0x9000, 20K, +otadata, data, ota, 0xe000, 8K, +ota_0, 0, ota_0, 0x10000, 2048K, +ota_1, 0, ota_1, 0x210000, 2048K, +uf2, app, factory,0x410000, 256K, +ffat, data, fat, 0x450000, 3776K, diff --git a/variants/XIAO_ESP32S3_Plus/pins_arduino.h b/variants/XIAO_ESP32S3_Plus/pins_arduino.h new file mode 100644 index 00000000000..fb887287e35 --- /dev/null +++ b/variants/XIAO_ESP32S3_Plus/pins_arduino.h @@ -0,0 +1,90 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +#define USB_VID 0x2886 +#define USB_PID 0x0056 + +static const uint8_t LED_BUILTIN = 21; +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN + +static const uint8_t TX = 43; +static const uint8_t RX = 44; + +static const uint8_t TX1 = 42; +static const uint8_t RX1 = 41; + +static const uint8_t SDA = 5; +static const uint8_t SCL = 6; + +static const uint8_t SS = 44; +static const uint8_t MOSI = 9; +static const uint8_t MISO = 8; +static const uint8_t SCK = 7; + +static const uint8_t MOSI1 = 11; +static const uint8_t MISO1 = 12; +static const uint8_t SCK1 = 13; + +static const uint8_t I2S_SCK = 39; +static const uint8_t I2S_SD = 38; +static const uint8_t I2S_WS = 40; + +static const uint8_t MTCK = 39; +static const uint8_t MTDO = 40; +static const uint8_t MTDI = 41; +static const uint8_t MTMS = 42; + +static const uint8_t DVP_Y8 = 11; +static const uint8_t DVP_YP = 12; +static const uint8_t DVP_PCLK = 13; +static const uint8_t DVP_VSYNC = 38; +static const uint8_t CAM_SCL = 39; +static const uint8_t CAM_SDA = 40; +static const uint8_t XMCLK = 10; + +static const uint8_t A0 = 1; +static const uint8_t A1 = 2; +static const uint8_t A2 = 3; +static const uint8_t A3 = 4; +static const uint8_t A4 = 5; +static const uint8_t A5 = 6; +static const uint8_t A8 = 7; +static const uint8_t A9 = 8; +static const uint8_t A10 = 9; +static const uint8_t ADC_BAT = 10; + +static const uint8_t D0 = 1; +static const uint8_t D1 = 2; +static const uint8_t D2 = 3; +static const uint8_t D3 = 4; +static const uint8_t D4 = 5; +static const uint8_t D5 = 6; +static const uint8_t D6 = 43; +static const uint8_t D7 = 44; +static const uint8_t D8 = 7; +static const uint8_t D9 = 8; +static const uint8_t D10 = 9; +static const uint8_t D11 = 38; +static const uint8_t D12 = 39; +static const uint8_t D13 = 40; +static const uint8_t D14 = 41; +static const uint8_t D15 = 42; +static const uint8_t D16 = 10; +static const uint8_t D17 = 13; +static const uint8_t D18 = 12; +static const uint8_t D19 = 11; + +static const uint8_t T1 = 1; +static const uint8_t T2 = 2; +static const uint8_t T3 = 3; +static const uint8_t T4 = 4; +static const uint8_t T5 = 5; +static const uint8_t T6 = 6; +static const uint8_t T7 = 7; +static const uint8_t T8 = 8; +static const uint8_t T9 = 9; + +#endif /* Pins_Arduino_h */ diff --git a/variants/XIAO_ESP32S3_Plus/tinyuf2.bin b/variants/XIAO_ESP32S3_Plus/tinyuf2.bin new file mode 100644 index 0000000000000000000000000000000000000000..86d981f8019368e49c7412d49731a0199b1722bd GIT binary patch literal 141936 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 literal 0 HcmV?d00001 From 15cbb1e857c6a0b4f6a88a611ff929e80ad5fe72 Mon Sep 17 00:00:00 2001 From: lsroka76 <95999074+lsroka76@users.noreply.github.com> Date: Mon, 27 Jan 2025 11:38:50 +0100 Subject: [PATCH 155/183] Add IAS Zone Notification Message service to ZigbeeHandlers and ZigbeeEP.h (#10821) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update ZigbeeHandlers.cpp * Update ZigbeeEP.h * Update ZigbeeEP.h make addBoundDevice virtual for override * fix(zigbee): Update and reorder handlers * fix(zigbee): Place default handler to the end * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- libraries/Zigbee/src/ZigbeeEP.h | 11 +++++---- libraries/Zigbee/src/ZigbeeHandlers.cpp | 30 +++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index d8ed900a7e6..ac22143c4d7 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -105,6 +105,13 @@ class ZigbeeEP { virtual void zbReadBasicCluster(const esp_zb_zcl_attribute_t *attribute); //already implemented virtual void zbIdentify(const esp_zb_zcl_set_attr_value_message_t *message); + virtual void zbIASZoneStatusChangeNotification(const esp_zb_zcl_ias_zone_status_change_notification_message_t *message) {}; + + virtual void addBoundDevice(zb_device_params_t *device) { + _bound_devices.push_back(device); + _is_bound = true; + } + void onIdentify(void (*callback)(uint16_t)) { _on_identify = callback; } @@ -125,10 +132,6 @@ class ZigbeeEP { SemaphoreHandle_t lock; zb_power_source_t _power_source; - void addBoundDevice(zb_device_params_t *device) { - _bound_devices.push_back(device); - _is_bound = true; - } friend class ZigbeeCore; }; diff --git a/libraries/Zigbee/src/ZigbeeHandlers.cpp b/libraries/Zigbee/src/ZigbeeHandlers.cpp index e387b7ce432..bccb27da7f8 100644 --- a/libraries/Zigbee/src/ZigbeeHandlers.cpp +++ b/libraries/Zigbee/src/ZigbeeHandlers.cpp @@ -9,6 +9,7 @@ static esp_err_t zb_attribute_set_handler(const esp_zb_zcl_set_attr_value_messag static esp_err_t zb_attribute_reporting_handler(const esp_zb_zcl_report_attr_message_t *message); static esp_err_t zb_cmd_read_attr_resp_handler(const esp_zb_zcl_cmd_read_attr_resp_message_t *message); static esp_err_t zb_configure_report_resp_handler(const esp_zb_zcl_cmd_config_report_resp_message_t *message); +static esp_err_t zb_cmd_ias_zone_status_change_handler(const esp_zb_zcl_ias_zone_status_change_notification_message_t *message); static esp_err_t zb_cmd_default_resp_handler(const esp_zb_zcl_cmd_default_resp_message_t *message); // Zigbee action handlers @@ -20,8 +21,11 @@ static esp_err_t zb_action_handler(esp_zb_core_action_callback_id_t callback_id, case ESP_ZB_CORE_REPORT_ATTR_CB_ID: ret = zb_attribute_reporting_handler((esp_zb_zcl_report_attr_message_t *)message); break; case ESP_ZB_CORE_CMD_READ_ATTR_RESP_CB_ID: ret = zb_cmd_read_attr_resp_handler((esp_zb_zcl_cmd_read_attr_resp_message_t *)message); break; case ESP_ZB_CORE_CMD_REPORT_CONFIG_RESP_CB_ID: ret = zb_configure_report_resp_handler((esp_zb_zcl_cmd_config_report_resp_message_t *)message); break; - case ESP_ZB_CORE_CMD_DEFAULT_RESP_CB_ID: ret = zb_cmd_default_resp_handler((esp_zb_zcl_cmd_default_resp_message_t *)message); break; - default: log_w("Receive unhandled Zigbee action(0x%x) callback", callback_id); break; + case ESP_ZB_CORE_CMD_IAS_ZONE_ZONE_STATUS_CHANGE_NOT_ID: + ret = zb_cmd_ias_zone_status_change_handler((esp_zb_zcl_ias_zone_status_change_notification_message_t *)message); + break; + case ESP_ZB_CORE_CMD_DEFAULT_RESP_CB_ID: ret = zb_cmd_default_resp_handler((esp_zb_zcl_cmd_default_resp_message_t *)message); break; + default: log_w("Receive unhandled Zigbee action(0x%x) callback", callback_id); break; } return ret; } @@ -132,6 +136,28 @@ static esp_err_t zb_configure_report_resp_handler(const esp_zb_zcl_cmd_config_re return ESP_OK; } +static esp_err_t zb_cmd_ias_zone_status_change_handler(const esp_zb_zcl_ias_zone_status_change_notification_message_t *message) { + if (!message) { + log_e("Empty message"); + return ESP_FAIL; + } + if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Received message: error status(%d)", message->info.status); + return ESP_ERR_INVALID_ARG; + } + log_v( + "IAS Zone Status Notification: from address(0x%x) src endpoint(%d) to dst endpoint(%d) cluster(0x%x)", message->info.src_address.u.short_addr, + message->info.src_endpoint, message->info.dst_endpoint, message->info.cluster + ); + + for (std::list::iterator it = Zigbee.ep_objects.begin(); it != Zigbee.ep_objects.end(); ++it) { + if (message->info.dst_endpoint == (*it)->getEndpoint()) { + (*it)->zbIASZoneStatusChangeNotification(message); + } + } + return ESP_OK; +} + static esp_err_t zb_cmd_default_resp_handler(const esp_zb_zcl_cmd_default_resp_message_t *message) { if (!message) { log_e("Empty message"); From 2fecc482b721b30085f2a9983aaf45f9d38cb064 Mon Sep 17 00:00:00 2001 From: lbernstone Date: Mon, 27 Jan 2025 00:39:15 -1000 Subject: [PATCH 156/183] fix(littlefs): Converted core disableWDT functions to bool (#10896) * fix(littlefs): Converted core disableWDT functions to bool * Missed the returns on core1 * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- cores/esp32/esp32-hal-misc.c | 12 ++++++++---- cores/esp32/esp32-hal.h | 4 ++-- libraries/LittleFS/src/LittleFS.cpp | 6 ++++-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/cores/esp32/esp32-hal-misc.c b/cores/esp32/esp32-hal-misc.c index 0bce548bdd2..02871872f83 100644 --- a/cores/esp32/esp32-hal-misc.c +++ b/cores/esp32/esp32-hal-misc.c @@ -156,11 +156,13 @@ void enableCore0WDT() { } } -void disableCore0WDT() { +bool disableCore0WDT() { TaskHandle_t idle_0 = xTaskGetIdleTaskHandleForCore(0); - if (idle_0 == NULL || esp_task_wdt_delete(idle_0) != ESP_OK) { + if (idle_0 == NULL || esp_task_wdt_status(idle_0) || esp_task_wdt_delete(idle_0) != ESP_OK) { log_e("Failed to remove Core 0 IDLE task from WDT"); + return false; } + return true; } #ifndef CONFIG_FREERTOS_UNICORE @@ -171,11 +173,13 @@ void enableCore1WDT() { } } -void disableCore1WDT() { +bool disableCore1WDT() { TaskHandle_t idle_1 = xTaskGetIdleTaskHandleForCore(1); - if (idle_1 == NULL || esp_task_wdt_delete(idle_1) != ESP_OK) { + if (idle_1 == NULL || esp_task_wdt_status(idle_1) || esp_task_wdt_delete(idle_1) != ESP_OK) { log_e("Failed to remove Core 1 IDLE task from WDT"); + return false; } + return true; } #endif diff --git a/cores/esp32/esp32-hal.h b/cores/esp32/esp32-hal.h index d0bd4b8bc93..5ed99aeb205 100644 --- a/cores/esp32/esp32-hal.h +++ b/cores/esp32/esp32-hal.h @@ -121,11 +121,11 @@ void feedLoopWDT(); //enable/disable WDT for the IDLE task on Core 0 (SYSTEM) void enableCore0WDT(); -void disableCore0WDT(); +bool disableCore0WDT(); #ifndef CONFIG_FREERTOS_UNICORE //enable/disable WDT for the IDLE task on Core 1 (Arduino) void enableCore1WDT(); -void disableCore1WDT(); +bool disableCore1WDT(); #endif //if xCoreID < 0 or CPU is unicore, it will use xTaskCreate, else xTaskCreatePinnedToCore diff --git a/libraries/LittleFS/src/LittleFS.cpp b/libraries/LittleFS/src/LittleFS.cpp index e86caeb74cc..761d1ba4c24 100644 --- a/libraries/LittleFS/src/LittleFS.cpp +++ b/libraries/LittleFS/src/LittleFS.cpp @@ -95,9 +95,11 @@ void LittleFSFS::end() { } bool LittleFSFS::format() { - disableCore0WDT(); + bool wdt_active = disableCore0WDT(); esp_err_t err = esp_littlefs_format(partitionLabel_); - enableCore0WDT(); + if (wdt_active) { + enableCore0WDT(); + } if (err) { log_e("Formatting LittleFS failed! Error: %d", err); return false; From 732a7cb4ee4ae4c5a3bcf07f15ac2526f3cefc06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 30 Jan 2025 18:11:40 +0100 Subject: [PATCH 157/183] feat(zigbee): Add Time cluster support + fix of duplicate indentify cluster (#10863) * feat(zigbee): Add Time cluster support * fix(zigbee): Remove duplicate of identify cluster * feat(zigbee): Remove unused variables in addTimeCluster * feat(zigbee): Update examples with optional Time cluster * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../Zigbee_Temperature_Sensor.ino | 21 +++ .../Zigbee_Thermostat/Zigbee_Thermostat.ino | 15 +++ libraries/Zigbee/src/ZigbeeEP.cpp | 125 ++++++++++++++++++ libraries/Zigbee/src/ZigbeeEP.h | 22 ++- libraries/Zigbee/src/ZigbeeHandlers.cpp | 2 + .../src/ep/ZigbeeCarbonDioxideSensor.cpp | 1 - libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp | 1 - .../Zigbee/src/ep/ZigbeeOccupancySensor.cpp | 1 - .../Zigbee/src/ep/ZigbeePressureSensor.cpp | 1 - 9 files changed, 181 insertions(+), 8 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino index 27aa2db97bd..ad007abbbaa 100644 --- a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino @@ -36,6 +36,11 @@ #define TEMP_SENSOR_ENDPOINT_NUMBER 10 uint8_t button = BOOT_PIN; +// Optional Time cluster variables +struct tm timeinfo; +struct tm *localTime; +int32_t timezone; + ZigbeeTempSensor zbTempSensor = ZigbeeTempSensor(TEMP_SENSOR_ENDPOINT_NUMBER); /************************ Temp sensor *****************************/ @@ -66,6 +71,9 @@ void setup() { // Optional: Set tolerance for temperature measurement in °C (lowest possible value is 0.01°C) zbTempSensor.setTolerance(1); + // Optional: Time cluster configuration (default params, as this device will revieve time from coordinator) + zbTempSensor.addTimeCluster(); + // Add endpoint to Zigbee Core Zigbee.addEndpoint(&zbTempSensor); @@ -85,6 +93,19 @@ void setup() { } Serial.println(); + // Optional: If time cluster is added, time can be read from the coordinator + timeinfo = zbTempSensor.getTime(); + timezone = zbTempSensor.getTimezone(); + + Serial.println("UTC time:"); + Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); + + time_t local = mktime(&timeinfo) + timezone; + localTime = localtime(&local); + + Serial.println("Local time with timezone:"); + Serial.println(localTime, "%A, %B %d %Y %H:%M:%S"); + // Start Temperature sensor reading task xTaskCreate(temp_sensor_value_update, "temp_sensor_update", 2048, NULL, 10, NULL); diff --git a/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino b/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino index a4720feeba4..7cdf45ef711 100644 --- a/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino +++ b/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino @@ -45,6 +45,8 @@ float sensor_max_temp; float sensor_min_temp; float sensor_tolerance; +struct tm timeinfo = {}; // Time structure for Time cluster + /****************** Temperature sensor handling *******************/ void recieveSensorTemp(float temperature) { Serial.printf("Temperature sensor value: %.2f°C\n", temperature); @@ -71,6 +73,19 @@ void setup() { //Optional: set Zigbee device name and model zbThermostat.setManufacturerAndModel("Espressif", "ZigbeeThermostat"); + //Optional Time cluster configuration + //example time January 13, 2025 13:30:30 CET + timeinfo.tm_year = 2025 - 1900; // = 2025 + timeinfo.tm_mon = 0; // January + timeinfo.tm_mday = 13; // 13th + timeinfo.tm_hour = 12; // 12 hours - 1 hour (CET) + timeinfo.tm_min = 30; // 30 minutes + timeinfo.tm_sec = 30; // 30 seconds + timeinfo.tm_isdst = -1; + + // Set time and gmt offset (timezone in seconds -> CET = +3600 seconds) + zbThermostat.addTimeCluster(timeinfo, 3600); + //Add endpoint to Zigbee Core Zigbee.addEndpoint(&zbThermostat); diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index adc87540b83..6a2ace0b90c 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -238,4 +238,129 @@ void ZigbeeEP::zbIdentify(const esp_zb_zcl_set_attr_value_message_t *message) { } } +void ZigbeeEP::addTimeCluster(tm time, int32_t gmt_offset) { + time_t utc_time = 0; + + // Check if time is set + if (time.tm_year > 0) { + // Convert time to UTC + utc_time = mktime(&time); + } + + // Create time cluster server attributes + esp_zb_attribute_list_t *time_cluster_server = esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_TIME); + esp_zb_time_cluster_add_attr(time_cluster_server, ESP_ZB_ZCL_ATTR_TIME_TIME_ZONE_ID, (void *)&gmt_offset); + esp_zb_time_cluster_add_attr(time_cluster_server, ESP_ZB_ZCL_ATTR_TIME_TIME_ID, (void *)&utc_time); + // Create time cluster client attributes + esp_zb_attribute_list_t *time_cluster_client = esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_TIME); + // Add time clusters to cluster list + esp_zb_cluster_list_add_time_cluster(_cluster_list, time_cluster_server, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_time_cluster(_cluster_list, time_cluster_client, ESP_ZB_ZCL_CLUSTER_CLIENT_ROLE); +} + +void ZigbeeEP::setTime(tm time) { + time_t utc_time = mktime(&time); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_TIME, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_TIME_TIME_ID, &utc_time, false); + esp_zb_lock_release(); +} + +void ZigbeeEP::setTimezone(int32_t gmt_offset) { + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_TIME, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_TIME_TIME_ZONE_ID, &gmt_offset, false); + esp_zb_lock_release(); +} + +tm ZigbeeEP::getTime(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_addr_t ieee_addr) { + /* Read peer time */ + esp_zb_zcl_read_attr_cmd_t read_req; + + if (short_addr >= 0) { + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; + read_req.zcl_basic_cmd.dst_addr_u.addr_short = (uint16_t)short_addr; + } else { + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + memcpy(read_req.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); + } + + uint16_t attributes[] = {ESP_ZB_ZCL_ATTR_TIME_TIME_ID}; + read_req.attr_number = ZB_ARRAY_LENTH(attributes); + read_req.attr_field = attributes; + + read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TIME; + + read_req.zcl_basic_cmd.dst_endpoint = endpoint; + read_req.zcl_basic_cmd.src_endpoint = _endpoint; + + // clear read time + _read_time = 0; + + log_v("Reading time from endpoint %d", endpoint); + esp_zb_zcl_read_attr_cmd_req(&read_req); + + //Wait for response or timeout + if (xSemaphoreTake(lock, ZB_CMD_TIMEOUT) != pdTRUE) { + log_e("Error while reading time"); + return tm(); + } + + struct tm *timeinfo = localtime(&_read_time); + if (timeinfo) { + return *timeinfo; + } else { + log_e("Error while converting time"); + return tm(); + } +} + +int32_t ZigbeeEP::getTimezone(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_addr_t ieee_addr) { + /* Read peer timezone */ + esp_zb_zcl_read_attr_cmd_t read_req; + + if (short_addr >= 0) { + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; + read_req.zcl_basic_cmd.dst_addr_u.addr_short = (uint16_t)short_addr; + } else { + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + memcpy(read_req.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); + } + + uint16_t attributes[] = {ESP_ZB_ZCL_ATTR_TIME_TIME_ZONE_ID}; + read_req.attr_number = ZB_ARRAY_LENTH(attributes); + read_req.attr_field = attributes; + + read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TIME; + + read_req.zcl_basic_cmd.dst_endpoint = endpoint; + read_req.zcl_basic_cmd.src_endpoint = _endpoint; + + // clear read timezone + _read_timezone = 0; + + log_v("Reading timezone from endpoint %d", endpoint); + esp_zb_zcl_read_attr_cmd_req(&read_req); + + //Wait for response or timeout + if (xSemaphoreTake(lock, ZB_CMD_TIMEOUT) != pdTRUE) { + log_e("Error while reading timezone"); + } + + return _read_timezone; +} + +void ZigbeeEP::zbReadTimeCluster(const esp_zb_zcl_attribute_t *attribute) { + /* Time cluster attributes */ + if (attribute->id == ESP_ZB_ZCL_ATTR_TIME_TIME_ID && attribute->data.type == ESP_ZB_ZCL_ATTR_TYPE_UTC_TIME) { + log_v("Time attribute received"); + log_v("Time: %lld", *(uint32_t *)attribute->data.value); + _read_time = *(uint32_t *)attribute->data.value; + xSemaphoreGive(lock); + } else if (attribute->id == ESP_ZB_ZCL_ATTR_TIME_TIME_ZONE_ID && attribute->data.type == ESP_ZB_ZCL_ATTR_TYPE_S32) { + log_v("Timezone attribute received"); + log_v("Timezone: %d", *(int32_t *)attribute->data.value); + _read_timezone = *(int32_t *)attribute->data.value; + xSemaphoreGive(lock); + } +} + #endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index ac22143c4d7..eae81fafbc3 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -82,16 +82,27 @@ class ZigbeeEP { _allow_multiple_binding = bind; } - // Manufacturer name and model implemented + // Set Manufacturer name and model void setManufacturerAndModel(const char *name, const char *model); - void setPowerSource(zb_power_source_t power_source, uint8_t percentage = 255); - void setBatteryPercentage(uint8_t percentage); - void reportBatteryPercentage(); // Methods to read manufacturer and model name from selected endpoint and short address char *readManufacturer(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr); char *readModel(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr); + // Set Power source and battery percentage for battery powered devices + void setPowerSource(zb_power_source_t power_source, uint8_t percentage = 255); + void setBatteryPercentage(uint8_t percentage); + void reportBatteryPercentage(); + + // Set time + void addTimeCluster(tm time = {0}, int32_t gmt_offset = 0); // gmt offset in seconds + void setTime(tm time); + void setTimezone(int32_t gmt_offset); + + // Get time from Coordinator or specific endpoint (blocking until response) + struct tm getTime(uint8_t endpoint = 1, int32_t short_addr = 0x0000, esp_zb_ieee_addr_t ieee_addr = {0}); + int32_t getTimezone(uint8_t endpoint = 1, int32_t short_addr = 0x0000, esp_zb_ieee_addr_t ieee_addr = {0}); // gmt offset in seconds + bool epAllowMultipleBinding() { return _allow_multiple_binding; } @@ -104,6 +115,7 @@ class ZigbeeEP { virtual void zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_attribute_t *attribute) {}; virtual void zbReadBasicCluster(const esp_zb_zcl_attribute_t *attribute); //already implemented virtual void zbIdentify(const esp_zb_zcl_set_attr_value_message_t *message); + virtual void zbReadTimeCluster(const esp_zb_zcl_attribute_t *attribute); //already implemented virtual void zbIASZoneStatusChangeNotification(const esp_zb_zcl_ias_zone_status_change_notification_message_t *message) {}; @@ -120,6 +132,8 @@ class ZigbeeEP { char *_read_manufacturer; char *_read_model; void (*_on_identify)(uint16_t time); + time_t _read_time; + int32_t _read_timezone; protected: uint8_t _endpoint; diff --git a/libraries/Zigbee/src/ZigbeeHandlers.cpp b/libraries/Zigbee/src/ZigbeeHandlers.cpp index bccb27da7f8..3b4992d81db 100644 --- a/libraries/Zigbee/src/ZigbeeHandlers.cpp +++ b/libraries/Zigbee/src/ZigbeeHandlers.cpp @@ -105,6 +105,8 @@ static esp_err_t zb_cmd_read_attr_resp_handler(const esp_zb_zcl_cmd_read_attr_re if (variable->status == ESP_ZB_ZCL_STATUS_SUCCESS) { if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_BASIC) { (*it)->zbReadBasicCluster(&variable->attribute); //method zbReadBasicCluster implemented in the common EP class + } else if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_TIME) { + (*it)->zbReadTimeCluster(&variable->attribute); //method zbReadTimeCluster implemented in the common EP class } else { (*it)->zbAttributeRead(message->info.cluster, &variable->attribute); //method zbAttributeRead must be implemented in specific EP class } diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp index 5def43f4199..b4386b80386 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp @@ -11,7 +11,6 @@ esp_zb_cluster_list_t *zigbee_carbon_dioxide_sensor_clusters_create(zigbee_carbo esp_zb_cluster_list_add_carbon_dioxide_measurement_cluster( cluster_list, esp_zb_carbon_dioxide_measurement_cluster_create(carbon_dioxide_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE ); - esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); return cluster_list; } diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp index 75196e78543..36d66840967 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp @@ -9,7 +9,6 @@ esp_zb_cluster_list_t *zigbee_flow_sensor_clusters_create(zigbee_flow_sensor_cfg esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); esp_zb_cluster_list_add_flow_meas_cluster(cluster_list, esp_zb_flow_meas_cluster_create(flow_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); return cluster_list; } diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp index 3a7acee040c..dec7910ac03 100644 --- a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp @@ -9,7 +9,6 @@ esp_zb_cluster_list_t *zigbee_occupancy_sensor_clusters_create(zigbee_occupancy_ esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); esp_zb_cluster_list_add_occupancy_sensing_cluster(cluster_list, esp_zb_occupancy_sensing_cluster_create(occupancy_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); return cluster_list; } diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp index 24b4efb127e..b887680076d 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp @@ -9,7 +9,6 @@ esp_zb_cluster_list_t *zigbee_pressure_sensor_clusters_create(zigbee_pressure_se esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); esp_zb_cluster_list_add_pressure_meas_cluster(cluster_list, esp_zb_pressure_meas_cluster_create(pressure_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); return cluster_list; } From 402ab56bf1d68f8fbc9788a168837b1534551390 Mon Sep 17 00:00:00 2001 From: TD-er Date: Thu, 30 Jan 2025 18:12:07 +0100 Subject: [PATCH 158/183] fix(SPIFFS): Use new disableWDT bool return value (#10909) Analogue to this PR, but for SPIFFS: https://github.com/espressif/arduino-esp32/pull/10896/files --- libraries/SPIFFS/src/SPIFFS.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/SPIFFS/src/SPIFFS.cpp b/libraries/SPIFFS/src/SPIFFS.cpp index a77b32990bf..0b2cc0d462d 100644 --- a/libraries/SPIFFS/src/SPIFFS.cpp +++ b/libraries/SPIFFS/src/SPIFFS.cpp @@ -91,9 +91,11 @@ void SPIFFSFS::end() { } bool SPIFFSFS::format() { - disableCore0WDT(); + bool wdt_active = disableCore0WDT(); esp_err_t err = esp_spiffs_format(partitionLabel_); - enableCore0WDT(); + if (wdt_active) { + enableCore0WDT(); + } if (err) { log_e("Formatting SPIFFS failed! Error: %d", err); return false; From f22866f888b713fa09c4b29b854a734478b407ad Mon Sep 17 00:00:00 2001 From: Jack Lin Date: Thu, 30 Jan 2025 09:14:08 -0800 Subject: [PATCH 159/183] Update HTTPS certificate in BasicHttpsClient.ino (#10911) The certificate is outdated. The current certificate can be found using `openssl s_client -showcerts -connect jigsaw.w3.org:443` --- .../BasicHttpsClient/BasicHttpsClient.ino | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/libraries/HTTPClient/examples/BasicHttpsClient/BasicHttpsClient.ino b/libraries/HTTPClient/examples/BasicHttpsClient/BasicHttpsClient.ino index eb6caef0724..73e127d1261 100644 --- a/libraries/HTTPClient/examples/BasicHttpsClient/BasicHttpsClient.ino +++ b/libraries/HTTPClient/examples/BasicHttpsClient/BasicHttpsClient.ino @@ -14,30 +14,32 @@ #include -// This is a Baltimore CyberTrust cert, the root Certificate Authority that +// This is a Google Trust Services cert, the root Certificate Authority that // signed the server certificate for the demo server https://jigsaw.w3.org in this -// example. This certificate is valid until Mon, 12 May 2025 23:59:00 GMT -const char *rootCACertificate = "-----BEGIN CERTIFICATE-----\n" - "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\n" - "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\n" - "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\n" - "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\n" - "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\n" - "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\n" - "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\n" - "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\n" - "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\n" - "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\n" - "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\n" - "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\n" - "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\n" - "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\n" - "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\n" - "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\n" - "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\n" - "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\n" - "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n" - "-----END CERTIFICATE-----\n"; +// example. This certificate is valid until Jan 28 00:00:42 2028 GMT +const char *rootCACertificate = R"string_literal( +-----BEGIN CERTIFICATE----- +MIIDejCCAmKgAwIBAgIQf+UwvzMTQ77dghYQST2KGzANBgkqhkiG9w0BAQsFADBX +MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UE +CxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIzMTEx +NTAzNDMyMVoXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoT +GUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFI0 +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE83Rzp2iLYK5DuDXFgTB7S0md+8Fhzube +Rr1r1WEYNa5A3XP3iZEwWus87oV8okB2O6nGuEfYKueSkWpz6bFyOZ8pn6KY019e +WIZlD6GEZQbR3IvJx3PIjGov5cSr0R2Ko4H/MIH8MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUgEzW63T/STaj1dj8tT7FavCUHYwwHwYDVR0jBBgwFoAUYHtmGkUN +l8qJUC99BM00qP/8/UswNgYIKwYBBQUHAQEEKjAoMCYGCCsGAQUFBzAChhpodHRw +Oi8vaS5wa2kuZ29vZy9nc3IxLmNydDAtBgNVHR8EJjAkMCKgIKAehhxodHRwOi8v +Yy5wa2kuZ29vZy9yL2dzcjEuY3JsMBMGA1UdIAQMMAowCAYGZ4EMAQIBMA0GCSqG +SIb3DQEBCwUAA4IBAQAYQrsPBtYDh5bjP2OBDwmkoWhIDDkic574y04tfzHpn+cJ +odI2D4SseesQ6bDrarZ7C30ddLibZatoKiws3UL9xnELz4ct92vID24FfVbiI1hY ++SW6FoVHkNeWIP0GCbaM4C6uVdF5dTUsMVs/ZbzNnIdCp5Gxmx5ejvEau8otR/Cs +kGN+hr/W5GvT1tMBjgWKZ1i4//emhA1JG1BbPzoLJQvyEotc03lXjTaCzv8mEbep +8RqZ7a2CPsgRbuvTPBwcOMBBmuFeU88+FSBX6+7iP0il8b4Z0QFqIwwMHfs/L6K1 +vepuoxtGzi4CZ68zJpiq1UvSqTbFJjtbD4seiMHl +-----END CERTIFICATE----- +)string_literal"; // Not sure if NetworkClientSecure checks the validity date of the certificate. // Setting clock just to be sure... From 0302b4db4741ae51ff45a3b1b533175ee0c0d92c Mon Sep 17 00:00:00 2001 From: "Sayed (Tashfi) Nowroz" Date: Fri, 31 Jan 2025 16:25:45 -0500 Subject: [PATCH 160/183] fix(logging): incorrect FPS logging (#10921) * fix(logging): Corrected FPS calculation Previously, last_frame was only updated once at the beginning of stream_handler, leading to incorrect FPS and avg_frame_time computation. This commit ensures last_frame is updated on each iteration after last FPS computation, resulting in accurate FPS logging. Fixes #10920 * Revert "fix(logging): Corrected FPS calculation" This reverts commit 0bb7b9555e7661c72dc3376cf8a001c6fd3758c8. * fix(loggin): Incorrect FPS computation fixed Corrected and tested change in FPS computation, suggested by @me-no-dev and found working with correct numbers. Previously, last_frame was only updated once at the beginning of stream_handler, leading to incorrect FPS and avg_frame_time computation. This commit ensures last_frame is updated on each iteration after last FPS computation, resulting in accurate FPS logging. Fixes #10920 --- libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp b/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp index 6b62ee9b6cf..81d643e37ac 100644 --- a/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp +++ b/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp @@ -281,6 +281,8 @@ static esp_err_t stream_handler(httpd_req_t *req) { int64_t fr_end = esp_timer_get_time(); int64_t frame_time = fr_end - last_frame; + last_frame = fr_end; + frame_time /= 1000; #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO uint32_t avg_frame_time = ra_filter_run(&ra_filter, frame_time); From 1c01fcd196ad8278feafe35bc785999db72a5425 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 4 Feb 2025 06:04:58 -0300 Subject: [PATCH 161/183] fix(uart): fixed esp32s2 uart ci test case (#10926) Wrong pins were used for baud rate detection test case, therefore no data was reaching UART1 RX FIFO from UART0 TX loopback. --- tests/validation/uart/uart.ino | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/validation/uart/uart.ino b/tests/validation/uart/uart.ino index 27bd95da7f8..358276c00b4 100644 --- a/tests/validation/uart/uart.ino +++ b/tests/validation/uart/uart.ino @@ -399,7 +399,8 @@ void auto_baudrate_test(void) { if (TEST_UART_NUM == 1) { selected_serial = &Serial1; - uart_internal_loopback(0, RX1); + // UART1 pins were swapped because of ESP32-P4 + uart_internal_loopback(0, /*RX1*/ TX1); } else { #ifdef RX2 selected_serial = &Serial2; From 2040cbad51b7e9917729244f8781b66786ddd50c Mon Sep 17 00:00:00 2001 From: Akashdeep Deb Date: Tue, 4 Feb 2025 09:24:49 +0000 Subject: [PATCH 162/183] Update README.md to add ESP-SR (#10925) Adding ESP-SR to the documentation Co-authored-by: Me No Dev --- libraries/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/README.md b/libraries/README.md index 38765f99b52..aee5bb07614 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -88,6 +88,9 @@ arduino-esp32 includes libraries for Arduino compatibility along with some objec ### SPIFFS SPI Flash Filesystem (see [spiffs-plugin](https://github.com/me-no-dev/arduino-esp32fs-plugin) to upload to device) +### SR + ESP-SR helps users build AI speech solutions based on ESP32-S3 or ESP32-P4 chips + ### Ticker A timer to call functions on an interval From 6eb99d3ae32966bb985853fdf73d6da2e34fd565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 4 Feb 2025 10:25:11 +0100 Subject: [PATCH 163/183] feat(zigbee): Add IAS Zone endpoints (Contact Switch + Door/Window Handle) (#10918) * feat(zigbee): Add IAS Zone endpoints * ci(pre-commit): Apply automatic fixes * fix(ci): Typo fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- CMakeLists.txt | 2 + .../examples/Zigbee_Contact_Switch/README.md | 58 ++++++++++ .../Zigbee_Contact_Switch.ino | 100 ++++++++++++++++ .../examples/Zigbee_Contact_Switch/ci.json | 6 + libraries/Zigbee/src/Zigbee.h | 2 + libraries/Zigbee/src/ZigbeeEP.h | 1 + libraries/Zigbee/src/ZigbeeHandlers.cpp | 22 ++++ .../Zigbee/src/ep/ZigbeeContactSwitch.cpp | 96 ++++++++++++++++ libraries/Zigbee/src/ep/ZigbeeContactSwitch.h | 67 +++++++++++ .../Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp | 108 ++++++++++++++++++ .../Zigbee/src/ep/ZigbeeDoorWindowHandle.h | 71 ++++++++++++ 11 files changed, 533 insertions(+) create mode 100644 libraries/Zigbee/examples/Zigbee_Contact_Switch/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Contact_Switch/Zigbee_Contact_Switch.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Contact_Switch/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeContactSwitch.h create mode 100644 libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9fd23d14d77..b3cb6c06cdc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -290,6 +290,8 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp + libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp + libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp ) set(ARDUINO_LIBRARY_BLE_SRCS diff --git a/libraries/Zigbee/examples/Zigbee_Contact_Switch/README.md b/libraries/Zigbee/examples/Zigbee_Contact_Switch/README.md new file mode 100644 index 00000000000..a5a32358a7c --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Contact_Switch/README.md @@ -0,0 +1,58 @@ +# Arduino-ESP32 Zigbee Contact Switch Example + +This example shows how to configure the Zigbee end device and use it as a Home Automation (HA) contact switch (IAS Zone), +that can be used for example as window/door sensor having 2 states - closed/open. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## Hardware Required + +* A USB cable for power supply and programming + +### Configure the Project + +Set the Button GPIO by changing the `button` variable. By default, it's the pin `BOOT_PIN` (BOOT button on ESP32-C6 and ESP32-H2). +Set the Sensor GPIO by changing the `sensor_pin` variable. + +#### Using Arduino IDE + +To get more information about the Espressif boards see [Espressif Development Kits](https://www.espressif.com/en/products/devkits). + +* Before Compile/Verify, select the correct board: `Tools -> Board`. +* Select the End device Zigbee mode: `Tools -> Zigbee mode: Zigbee ED (end device)` +* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee 4MB with spiffs` +* Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. +* Optional: Set debug level to verbose to see all logs from Zigbee stack: `Tools -> Core Debug Level: Verbose`. + +## Troubleshooting + +If the End device flashed with this example is not connecting to the coordinator, erase the flash of the End device before flashing the example to the board. + +***Important: Make sure you are using a good quality USB cable and that you have a reliable power source*** + +* **LED not blinking:** Check the wiring connection and the IO selection. +* **Programming Fail:** If the programming/flash procedure fails, try reducing the serial connection speed. +* **COM port not detected:** Check the USB cable and the USB to Serial driver installation. + +If the error persists, you can ask for help at the official [ESP32 forum](https://esp32.com) or see [Contribute](#contribute). + +## Contribute + +To know how to contribute to this project, see [How to contribute.](https://github.com/espressif/arduino-esp32/blob/master/CONTRIBUTING.rst) + +If you have any **feedback** or **issue** to report on this example/library, please open an issue or fix it by creating a new PR. Contributions are more than welcome! + +Before creating a new issue, be sure to try Troubleshooting and check if the same issue was already created by someone else. + +## Resources + +* Official ESP32 Forum: [Link](https://esp32.com) +* Arduino-ESP32 Official Repository: [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) +* ESP32-C6 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf) +* ESP32-H2 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf) +* Official ESP-IDF documentation: [ESP-IDF](https://idf.espressif.com) diff --git a/libraries/Zigbee/examples/Zigbee_Contact_Switch/Zigbee_Contact_Switch.ino b/libraries/Zigbee/examples/Zigbee_Contact_Switch/Zigbee_Contact_Switch.ino new file mode 100644 index 00000000000..ce9eedb683d --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Contact_Switch/Zigbee_Contact_Switch.ino @@ -0,0 +1,100 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @brief This example demonstrates Zigbee contact switch (IAS Zone). + * + * The example demonstrates how to use Zigbee library to create a end device contact switch. + * The contact switch is a Zigbee end device, which is reporting data to the Zigbee network. + * + * Proper Zigbee mode must be selected in Tools->Zigbee mode + * and also the correct partition scheme must be selected in Tools->Partition Scheme. + * + * Please check the README.md for instructions and more detailed description. + * + * Created by Jan Procházka (https://github.com/P-R-O-C-H-Y/) + */ + +#ifndef ZIGBEE_MODE_ED +#error "Zigbee end device mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +/* Zigbee contact sensor configuration */ +#define CONTACT_SWITCH_ENDPOINT_NUMBER 10 +uint8_t button = BOOT_PIN; +uint8_t sensor_pin = 4; + +ZigbeeContactSwitch zbContactSwitch = ZigbeeContactSwitch(CONTACT_SWITCH_ENDPOINT_NUMBER); + +void setup() { + Serial.begin(115200); + + // Init button + switch + pinMode(button, INPUT_PULLUP); + pinMode(sensor_pin, INPUT_PULLUP); + + // Optional: set Zigbee device name and model + zbContactSwitch.setManufacturerAndModel("Espressif", "ZigbeeContactSwitch"); + + // Add endpoint to Zigbee Core + Zigbee.addEndpoint(&zbContactSwitch); + + Serial.println("Starting Zigbee..."); + // When all EPs are registered, start Zigbee in End Device mode + if (!Zigbee.begin()) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } else { + Serial.println("Zigbee started successfully!"); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) { + Serial.print("."); + delay(100); + } + Serial.println(); +} + +void loop() { + // Checking pin for contact change + static bool contact = false; + if (digitalRead(sensor_pin) == HIGH && !contact) { + // Update contact sensor value + zbContactSwitch.setOpen(); + contact = true; + } else if (digitalRead(sensor_pin) == LOW && contact) { + zbContactSwitch.setClosed(); + contact = false; + } + + // Checking button for factory reset + if (digitalRead(button) == LOW) { // Push button pressed + // Key debounce handling + delay(100); + int startTime = millis(); + while (digitalRead(button) == LOW) { + delay(50); + if ((millis() - startTime) > 3000) { + // If key pressed for more than 3secs, factory reset Zigbee and reboot + Serial.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); + Zigbee.factoryReset(); + } + } + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_Contact_Switch/ci.json b/libraries/Zigbee/examples/Zigbee_Contact_Switch/ci.json new file mode 100644 index 00000000000..7b7ccef8ed7 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Contact_Switch/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y" + ] +} diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index cf58dc8d5d8..c97be9378a8 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -18,3 +18,5 @@ #include "ep/ZigbeeFlowSensor.h" #include "ep/ZigbeeOccupancySensor.h" #include "ep/ZigbeeCarbonDioxideSensor.h" +#include "ep/ZigbeeContactSwitch.h" +#include "ep/ZigbeeDoorWindowHandle.h" diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index eae81fafbc3..069db95aac0 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -118,6 +118,7 @@ class ZigbeeEP { virtual void zbReadTimeCluster(const esp_zb_zcl_attribute_t *attribute); //already implemented virtual void zbIASZoneStatusChangeNotification(const esp_zb_zcl_ias_zone_status_change_notification_message_t *message) {}; + virtual void zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) {}; virtual void addBoundDevice(zb_device_params_t *device) { _bound_devices.push_back(device); diff --git a/libraries/Zigbee/src/ZigbeeHandlers.cpp b/libraries/Zigbee/src/ZigbeeHandlers.cpp index 3b4992d81db..52c38eb0633 100644 --- a/libraries/Zigbee/src/ZigbeeHandlers.cpp +++ b/libraries/Zigbee/src/ZigbeeHandlers.cpp @@ -10,6 +10,7 @@ static esp_err_t zb_attribute_reporting_handler(const esp_zb_zcl_report_attr_mes static esp_err_t zb_cmd_read_attr_resp_handler(const esp_zb_zcl_cmd_read_attr_resp_message_t *message); static esp_err_t zb_configure_report_resp_handler(const esp_zb_zcl_cmd_config_report_resp_message_t *message); static esp_err_t zb_cmd_ias_zone_status_change_handler(const esp_zb_zcl_ias_zone_status_change_notification_message_t *message); +static esp_err_t zb_cmd_ias_zone_enroll_response_handler(const esp_zb_zcl_ias_zone_enroll_response_message_t *message); static esp_err_t zb_cmd_default_resp_handler(const esp_zb_zcl_cmd_default_resp_message_t *message); // Zigbee action handlers @@ -24,6 +25,9 @@ static esp_err_t zb_action_handler(esp_zb_core_action_callback_id_t callback_id, case ESP_ZB_CORE_CMD_IAS_ZONE_ZONE_STATUS_CHANGE_NOT_ID: ret = zb_cmd_ias_zone_status_change_handler((esp_zb_zcl_ias_zone_status_change_notification_message_t *)message); break; + case ESP_ZB_CORE_IAS_ZONE_ENROLL_RESPONSE_VALUE_CB_ID: + ret = zb_cmd_ias_zone_enroll_response_handler((esp_zb_zcl_ias_zone_enroll_response_message_t *)message); + break; case ESP_ZB_CORE_CMD_DEFAULT_RESP_CB_ID: ret = zb_cmd_default_resp_handler((esp_zb_zcl_cmd_default_resp_message_t *)message); break; default: log_w("Receive unhandled Zigbee action(0x%x) callback", callback_id); break; } @@ -160,6 +164,24 @@ static esp_err_t zb_cmd_ias_zone_status_change_handler(const esp_zb_zcl_ias_zone return ESP_OK; } +static esp_err_t zb_cmd_ias_zone_enroll_response_handler(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) { + if (!message) { + log_e("Empty message"); + return ESP_FAIL; + } + if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Received message: error status(%d)", message->info.status); + return ESP_ERR_INVALID_ARG; + } + log_v("IAS Zone Enroll Response received"); + for (std::list::iterator it = Zigbee.ep_objects.begin(); it != Zigbee.ep_objects.end(); ++it) { + if (message->info.dst_endpoint == (*it)->getEndpoint()) { + (*it)->zbIASZoneEnrollResponse(message); + } + } + return ESP_OK; +} + static esp_err_t zb_cmd_default_resp_handler(const esp_zb_zcl_cmd_default_resp_message_t *message) { if (!message) { log_e("Empty message"); diff --git a/libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp b/libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp new file mode 100644 index 00000000000..9a3551b0581 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp @@ -0,0 +1,96 @@ +#include "ZigbeeContactSwitch.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +esp_zb_cluster_list_t *zigbee_contact_switch_clusters_create(zigbee_contact_switch_cfg_t *contact_switch) { + esp_zb_basic_cluster_cfg_t *basic_cfg = contact_switch ? &(contact_switch->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = contact_switch ? &(contact_switch->identify_cfg) : NULL; + esp_zb_ias_zone_cluster_cfg_t *ias_zone_cfg = contact_switch ? &(contact_switch->ias_zone_cfg) : NULL; + esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_ias_zone_cluster(cluster_list, esp_zb_ias_zone_cluster_create(ias_zone_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + return cluster_list; +} + +ZigbeeContactSwitch::ZigbeeContactSwitch(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_IAS_ZONE_ID; + _zone_status = 0; + _zone_id = 0xff; + _ias_cie_endpoint = 1; + + //Create custom contact switch configuration + zigbee_contact_switch_cfg_t contact_switch_cfg = ZIGBEE_DEFAULT_CONTACT_SWITCH_CONFIG(); + _cluster_list = zigbee_contact_switch_clusters_create(&contact_switch_cfg); + + _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_IAS_ZONE_ID, .app_device_version = 0}; +} + +void ZigbeeContactSwitch::setIASClientEndpoint(uint8_t ep_number) { + _ias_cie_endpoint = ep_number; +} + +void ZigbeeContactSwitch::setClosed() { + log_v("Setting Contact switch to closed"); + uint8_t closed = 0; // ALARM1 = 0, ALARM2 = 0 + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_IAS_ZONE_ZONESTATUS_ID, &closed, false + ); + esp_zb_lock_release(); + _zone_status = closed; + report(); +} + +void ZigbeeContactSwitch::setOpen() { + log_v("Setting Contact switch to open"); + uint8_t open = ESP_ZB_ZCL_IAS_ZONE_ZONE_STATUS_ALARM1 | ESP_ZB_ZCL_IAS_ZONE_ZONE_STATUS_ALARM2; // ALARM1 = 1, ALARM2 = 1 + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_IAS_ZONE_ZONESTATUS_ID, &open, false); + esp_zb_lock_release(); + _zone_status = open; + report(); +} + +void ZigbeeContactSwitch::report() { + /* Send IAS Zone status changed notification command */ + + esp_zb_zcl_ias_zone_status_change_notif_cmd_t status_change_notif_cmd; + status_change_notif_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + status_change_notif_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + status_change_notif_cmd.zcl_basic_cmd.dst_endpoint = _ias_cie_endpoint; //default is 1 + memcpy(status_change_notif_cmd.zcl_basic_cmd.dst_addr_u.addr_long, _ias_cie_addr, sizeof(esp_zb_ieee_addr_t)); + + status_change_notif_cmd.zone_status = _zone_status; + status_change_notif_cmd.extend_status = 0; + status_change_notif_cmd.zone_id = _zone_id; + status_change_notif_cmd.delay = 0; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_ias_zone_status_change_notif_cmd_req(&status_change_notif_cmd); + esp_zb_lock_release(); + log_v("IAS Zone status changed notification sent"); +} + +void ZigbeeContactSwitch::zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) { + if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE) { + log_v("IAS Zone Enroll Response: zone id(%d), status(%d)", message->zone_id, message->response_code); + if (message->response_code == ESP_ZB_ZCL_IAS_ZONE_ENROLL_RESPONSE_CODE_SUCCESS) { + log_v("IAS Zone Enroll Response: success"); + esp_zb_lock_acquire(portMAX_DELAY); + memcpy( + _ias_cie_addr, + (*(esp_zb_ieee_addr_t *) + esp_zb_zcl_get_attribute(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_IAS_ZONE_IAS_CIE_ADDRESS_ID) + ->data_p), + sizeof(esp_zb_ieee_addr_t) + ); + esp_zb_lock_release(); + _zone_id = message->zone_id; + } + + } else { + log_w("Received message ignored. Cluster ID: %d not supported for On/Off Light", message->info.cluster); + } +} + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeContactSwitch.h b/libraries/Zigbee/src/ep/ZigbeeContactSwitch.h new file mode 100644 index 00000000000..692caf092ba --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeContactSwitch.h @@ -0,0 +1,67 @@ +/* Class of Zigbee contact switch (IAS Zone) endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +// clang-format off +#define ZIGBEE_DEFAULT_CONTACT_SWITCH_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .ias_zone_cfg = \ + { \ + .zone_state = ESP_ZB_ZCL_IAS_ZONE_ZONESTATE_NOT_ENROLLED, \ + .zone_type = ESP_ZB_ZCL_IAS_ZONE_ZONETYPE_CONTACT_SWITCH, \ + .zone_status = 0, \ + .ias_cie_addr = ESP_ZB_ZCL_ZONE_IAS_CIE_ADDR_DEFAULT, \ + .zone_id = 0xff, \ + .zone_ctx = {0, 0, 0, 0}, \ + }, \ + } +// clang-format on + +typedef struct zigbee_contact_switch_cfg_s { + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_ias_zone_cluster_cfg_t ias_zone_cfg; +} zigbee_contact_switch_cfg_t; + +class ZigbeeContactSwitch : public ZigbeeEP { +public: + ZigbeeContactSwitch(uint8_t endpoint); + ~ZigbeeContactSwitch() {} + + // Set the IAS Client endpoint number (default is 1) + void setIASClientEndpoint(uint8_t ep_number); + + // Set the contact switch value to closed + void setClosed(); + + // Set the contact switch value to open + void setOpen(); + + // Report the contact switch value, done automatically after setting the position + void report(); + +private: + void zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) override; + uint8_t _zone_status; + uint8_t _zone_id; + esp_zb_ieee_addr_t _ias_cie_addr; + uint8_t _ias_cie_endpoint; +}; + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp b/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp new file mode 100644 index 00000000000..364b3ef6d9d --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp @@ -0,0 +1,108 @@ +#include "ZigbeeDoorWindowHandle.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +esp_zb_cluster_list_t *zigbee_door_window_handle_clusters_create(zigbee_door_window_handle_cfg_t *door_window_handle) { + esp_zb_basic_cluster_cfg_t *basic_cfg = door_window_handle ? &(door_window_handle->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = door_window_handle ? &(door_window_handle->identify_cfg) : NULL; + esp_zb_ias_zone_cluster_cfg_t *ias_zone_cfg = door_window_handle ? &(door_window_handle->ias_zone_cfg) : NULL; + esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_ias_zone_cluster(cluster_list, esp_zb_ias_zone_cluster_create(ias_zone_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + return cluster_list; +} + +ZigbeeDoorWindowHandle::ZigbeeDoorWindowHandle(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_IAS_ZONE_ID; + _zone_status = 0; + _zone_id = 0xff; + _ias_cie_endpoint = 1; + + //Create custom door window handle configuration + zigbee_door_window_handle_cfg_t door_window_handle_cfg = ZIGBEE_DEFAULT_DOOR_WINDOW_HANDLE_CONFIG(); + _cluster_list = zigbee_door_window_handle_clusters_create(&door_window_handle_cfg); + + _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_IAS_ZONE_ID, .app_device_version = 0}; +} + +void ZigbeeDoorWindowHandle::setIASClientEndpoint(uint8_t ep_number) { + _ias_cie_endpoint = ep_number; +} + +void ZigbeeDoorWindowHandle::setClosed() { + log_v("Setting Door/Window handle to closed"); + uint8_t closed = 0; // ALARM1 = 0, ALARM2 = 0 + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_IAS_ZONE_ZONESTATUS_ID, &closed, false + ); + esp_zb_lock_release(); + _zone_status = closed; + report(); +} + +void ZigbeeDoorWindowHandle::setOpen() { + log_v("Setting Door/Window handle to open"); + uint8_t open = ESP_ZB_ZCL_IAS_ZONE_ZONE_STATUS_ALARM1 | ESP_ZB_ZCL_IAS_ZONE_ZONE_STATUS_ALARM2; // ALARM1 = 1, ALARM2 = 1 + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_IAS_ZONE_ZONESTATUS_ID, &open, false); + esp_zb_lock_release(); + _zone_status = open; + report(); +} + +void ZigbeeDoorWindowHandle::setTilted() { + log_v("Setting Door/Window handle to tilted"); + uint8_t tilted = ESP_ZB_ZCL_IAS_ZONE_ZONE_STATUS_ALARM1; // ALARM1 = 1, ALARM2 = 0 + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_IAS_ZONE_ZONESTATUS_ID, &tilted, false + ); + esp_zb_lock_release(); + _zone_status = tilted; + report(); +} + +void ZigbeeDoorWindowHandle::report() { + /* Send IAS Zone status changed notification command */ + + esp_zb_zcl_ias_zone_status_change_notif_cmd_t status_change_notif_cmd; + status_change_notif_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + status_change_notif_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + status_change_notif_cmd.zcl_basic_cmd.dst_endpoint = _ias_cie_endpoint; //default is 1 + memcpy(status_change_notif_cmd.zcl_basic_cmd.dst_addr_u.addr_long, _ias_cie_addr, sizeof(esp_zb_ieee_addr_t)); + + status_change_notif_cmd.zone_status = _zone_status; + status_change_notif_cmd.extend_status = 0; + status_change_notif_cmd.zone_id = _zone_id; + status_change_notif_cmd.delay = 0; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_ias_zone_status_change_notif_cmd_req(&status_change_notif_cmd); + esp_zb_lock_release(); + log_v("IAS Zone status changed notification sent"); +} + +void ZigbeeDoorWindowHandle::zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) { + if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE) { + log_v("IAS Zone Enroll Response: zone id(%d), status(%d)", message->zone_id, message->response_code); + if (message->response_code == ESP_ZB_ZCL_IAS_ZONE_ENROLL_RESPONSE_CODE_SUCCESS) { + log_v("IAS Zone Enroll Response: success"); + esp_zb_lock_acquire(portMAX_DELAY); + memcpy( + _ias_cie_addr, + (*(esp_zb_ieee_addr_t *) + esp_zb_zcl_get_attribute(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_IAS_ZONE_IAS_CIE_ADDRESS_ID) + ->data_p), + sizeof(esp_zb_ieee_addr_t) + ); + esp_zb_lock_release(); + _zone_id = message->zone_id; + } + + } else { + log_w("Received message ignored. Cluster ID: %d not supported for On/Off Light", message->info.cluster); + } +} + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.h b/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.h new file mode 100644 index 00000000000..e60316f8764 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.h @@ -0,0 +1,71 @@ +/* Class of Zigbee door window handle (IAS Zone) endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +#define ESP_ZB_ZCL_IAS_ZONE_ZONETYPE_DOOR_WINDOW_HANDLE 0x0016 +// clang-format off +#define ZIGBEE_DEFAULT_DOOR_WINDOW_HANDLE_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .ias_zone_cfg = \ + { \ + .zone_state = ESP_ZB_ZCL_IAS_ZONE_ZONESTATE_NOT_ENROLLED, \ + .zone_type = ESP_ZB_ZCL_IAS_ZONE_ZONETYPE_DOOR_WINDOW_HANDLE, \ + .zone_status = 0, \ + .ias_cie_addr = ESP_ZB_ZCL_ZONE_IAS_CIE_ADDR_DEFAULT, \ + .zone_id = 0xff, \ + .zone_ctx = {0, 0, 0, 0}, \ + }, \ + } +// clang-format on + +typedef struct zigbee_door_window_handle_cfg_s { + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_ias_zone_cluster_cfg_t ias_zone_cfg; +} zigbee_door_window_handle_cfg_t; + +class ZigbeeDoorWindowHandle : public ZigbeeEP { +public: + ZigbeeDoorWindowHandle(uint8_t endpoint); + ~ZigbeeDoorWindowHandle() {} + + // Set the IAS Client endpoint number (default is 1) + void setIASClientEndpoint(uint8_t ep_number); + + // Set the door/window handle value to closed + void setClosed(); + + // Set the door/window handle value to open + void setOpen(); + + // Set the door/window handle value to tilted + void setTilted(); + + // Report the door/window handle value, done automatically after setting the position + void report(); + +private: + void zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) override; + uint8_t _zone_status; + uint8_t _zone_id; + esp_zb_ieee_addr_t _ias_cie_addr; + uint8_t _ias_cie_endpoint; +}; + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED From b385562fa601d80633d5d0389e059a5b8ba0f2b7 Mon Sep 17 00:00:00 2001 From: thekurtovic <40248206+thekurtovic@users.noreply.github.com> Date: Tue, 4 Feb 2025 04:52:45 -0500 Subject: [PATCH 164/183] NetworkEvents allow stack size to be changed. (#10805) * feat(net): Allow for event task custom stack size * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Me No Dev Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- libraries/Network/src/NetworkEvents.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libraries/Network/src/NetworkEvents.cpp b/libraries/Network/src/NetworkEvents.cpp index 1a7177bae61..161e55c5d01 100644 --- a/libraries/Network/src/NetworkEvents.cpp +++ b/libraries/Network/src/NetworkEvents.cpp @@ -8,6 +8,10 @@ #include "esp_task.h" #include "esp32-hal.h" +#ifndef ARDUINO_NETWORK_EVENT_TASK_STACK_SIZE +#define ARDUINO_NETWORK_EVENT_TASK_STACK_SIZE 4096 +#endif + NetworkEvents::NetworkEvents() : _arduino_event_group(NULL), _arduino_event_queue(NULL), _arduino_event_task_handle(NULL) {} NetworkEvents::~NetworkEvents() { @@ -61,8 +65,8 @@ bool NetworkEvents::initNetworkEvents() { [](void *self) { static_cast(self)->_checkForEvent(); }, - "arduino_events", // label - 4096, // event task's stack size + "arduino_events", // label + ARDUINO_NETWORK_EVENT_TASK_STACK_SIZE, // event task's stack size this, ESP_TASKD_EVENT_PRIO - 1, &_arduino_event_task_handle, ARDUINO_EVENT_RUNNING_CORE ); if (!_arduino_event_task_handle) { From 8b31d1e1a86c0b3bacc59ab1dacc22ee3c6507c0 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 4 Feb 2025 12:53:29 +0200 Subject: [PATCH 165/183] fix(ci): Disable some RainMaker examples on ESP32 (#10931) --- libraries/RainMaker/examples/RMakerCustomAirCooler/ci.json | 3 +++ libraries/RainMaker/examples/RMakerSonoffDualR3/ci.json | 3 +++ 2 files changed, 6 insertions(+) diff --git a/libraries/RainMaker/examples/RMakerCustomAirCooler/ci.json b/libraries/RainMaker/examples/RMakerCustomAirCooler/ci.json index 1c80eda1d90..ce63fe9ccf0 100644 --- a/libraries/RainMaker/examples/RMakerCustomAirCooler/ci.json +++ b/libraries/RainMaker/examples/RMakerCustomAirCooler/ci.json @@ -1,4 +1,7 @@ { + "targets": { + "esp32": false + }, "fqbn_append": "PartitionScheme=rainmaker_4MB", "requires": [ "CONFIG_ESP_RMAKER_WORK_QUEUE_TASK_STACK=[1-9][0-9]*" diff --git a/libraries/RainMaker/examples/RMakerSonoffDualR3/ci.json b/libraries/RainMaker/examples/RMakerSonoffDualR3/ci.json index 1c80eda1d90..ce63fe9ccf0 100644 --- a/libraries/RainMaker/examples/RMakerSonoffDualR3/ci.json +++ b/libraries/RainMaker/examples/RMakerSonoffDualR3/ci.json @@ -1,4 +1,7 @@ { + "targets": { + "esp32": false + }, "fqbn_append": "PartitionScheme=rainmaker_4MB", "requires": [ "CONFIG_ESP_RMAKER_WORK_QUEUE_TASK_STACK=[1-9][0-9]*" From 6a1127625c1e12f222435dafbfa56aacc2098c97 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 4 Feb 2025 13:22:20 +0200 Subject: [PATCH 166/183] fix(ota): Make sure that ArduinoOTA.end() is called in the destructor (#10932) --- libraries/ArduinoOTA/src/ArduinoOTA.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ArduinoOTA/src/ArduinoOTA.cpp b/libraries/ArduinoOTA/src/ArduinoOTA.cpp index 0ab5466ab20..cb3ddc1e797 100644 --- a/libraries/ArduinoOTA/src/ArduinoOTA.cpp +++ b/libraries/ArduinoOTA/src/ArduinoOTA.cpp @@ -29,7 +29,7 @@ ArduinoOTAClass::ArduinoOTAClass() _start_callback(NULL), _end_callback(NULL), _error_callback(NULL), _progress_callback(NULL) {} ArduinoOTAClass::~ArduinoOTAClass() { - _udp_ota.stop(); + end(); } ArduinoOTAClass &ArduinoOTAClass::onStart(THandlerFunction fn) { From db0bbad9348f7d9bd0ce79152f004c61daf8793a Mon Sep 17 00:00:00 2001 From: Henning Kulander Date: Tue, 4 Feb 2025 16:52:02 +0100 Subject: [PATCH 167/183] Created Zigbee Endpoint for Window Covering. (#10914) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(zigbee): Added Endpoint for Window Covering (#10913) * Added example Sketch. * Added window covering to CMakeLists.txt. * feat(zigbee): Window covering tilt support and fixes * fix(zigbee): Fix typos * ci(pre-commit): Apply automatic fixes * fix(ci): Fixes of typos --------- Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- CMakeLists.txt | 1 + .../examples/Zigbee_Window_Covering/README.md | 69 ++++ .../Zigbee_Window_Covering.ino | 198 +++++++++++ .../examples/Zigbee_Window_Covering/ci.json | 6 + libraries/Zigbee/src/Zigbee.h | 1 + libraries/Zigbee/src/ZigbeeEP.h | 2 +- libraries/Zigbee/src/ZigbeeHandlers.cpp | 26 ++ .../Zigbee/src/ep/ZigbeeWindowCovering.cpp | 308 ++++++++++++++++++ .../Zigbee/src/ep/ZigbeeWindowCovering.h | 147 +++++++++ 9 files changed, 757 insertions(+), 1 deletion(-) create mode 100644 libraries/Zigbee/examples/Zigbee_Window_Covering/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Window_Covering/Zigbee_Window_Covering.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Window_Covering/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeWindowCovering.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b3cb6c06cdc..40567d1b45c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -292,6 +292,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp + libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp ) set(ARDUINO_LIBRARY_BLE_SRCS diff --git a/libraries/Zigbee/examples/Zigbee_Window_Covering/README.md b/libraries/Zigbee/examples/Zigbee_Window_Covering/README.md new file mode 100644 index 00000000000..469560a0e0c --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Window_Covering/README.md @@ -0,0 +1,69 @@ +# Arduino-ESP32 Window Covering Example + +This example shows how to configure the Zigbee end device and use it as a Home Automation (HA) window covering device. + +To see if the communication with your Zigbee network works, use the Serial monitor and watch for output there. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## Hardware Required + +* A USB cable for power supply and programming +* Board (ESP32-H2 or ESP32-C6) as Zigbee end device and upload the Zigbee_Window_Covering example +* Zigbee network / coordinator (Other board with switch examples or Zigbee2mqtt or ZigbeeHomeAssistant like application) + +### Configure the Project + +#### Using Arduino IDE + +To get more information about the Espressif boards see [Espressif Development Kits](https://www.espressif.com/en/products/devkits). + +* Before Compile/Verify, select the correct board: `Tools -> Board`. +* Select the End device Zigbee mode: `Tools -> Zigbee mode: Zigbee ED (end device)` +* Select Tools / USB CDC On Boot: "Enabled" +* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee 4MB with spiffs` +* Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. +* Optional: Set debug level to verbose to see all logs from Zigbee stack: `Tools -> Core Debug Level: Verbose`. + +## Troubleshooting + +If the End device flashed with this example is not connecting to the coordinator, erase the flash of the End device before flashing the example to the board. It is recommended to do this if you re-flash the coordinator. +You can do the following: + +* In the Arduino IDE go to the Tools menu and set `Erase All Flash Before Sketch Upload` to `Enabled`. +* Add to the sketch `Zigbee.factoryReset();` to reset the device and Zigbee stack. + +By default, the coordinator network is closed after rebooting or flashing new firmware. +To open the network you have 2 options: + +* Open network after reboot by setting `Zigbee.setRebootOpenNetwork(time);` before calling `Zigbee.begin();`. +* In application you can anytime call `Zigbee.openNetwork(time);` to open the network for devices to join. + +***Important: Make sure you are using a good quality USB cable and that you have a reliable power source*** + +* **LED not blinking:** Check the wiring connection and the IO selection. +* **Programming Fail:** If the programming/flash procedure fails, try reducing the serial connection speed. +* **COM port not detected:** Check the USB cable and the USB to Serial driver installation. + +If the error persists, you can ask for help at the official [ESP32 forum](https://esp32.com) or see [Contribute](#contribute). + +## Contribute + +To know how to contribute to this project, see [How to contribute.](https://github.com/espressif/arduino-esp32/blob/master/CONTRIBUTING.rst) + +If you have any **feedback** or **issue** to report on this example/library, please open an issue or fix it by creating a new PR. Contributions are more than welcome! + +Before creating a new issue, be sure to try Troubleshooting and check if the same issue was already created by someone else. + +## Resources + +* Official ESP32 Forum: [Link](https://esp32.com) +* Arduino-ESP32 Official Repository: [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) +* ESP32-C6 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf) +* ESP32-H2 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf) +* Official ESP-IDF documentation: [ESP-IDF](https://idf.espressif.com) diff --git a/libraries/Zigbee/examples/Zigbee_Window_Covering/Zigbee_Window_Covering.ino b/libraries/Zigbee/examples/Zigbee_Window_Covering/Zigbee_Window_Covering.ino new file mode 100644 index 00000000000..c7f9cf84f74 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Window_Covering/Zigbee_Window_Covering.ino @@ -0,0 +1,198 @@ +// Copyright 2025 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @brief This example demonstrates Zigbee Window Covering. + * + * The example demonstrates how to use Zigbee library to create a end device window covering device. + * The window covering is a Zigbee end device, which is moving the blinds (lift+tilt) and reporting + * its current position to the Zigbee network. + * + * Use setCoveringType() to set the type of covering (blind, shade, etc.). + * + * The example also demonstrates how to use the button to manually control the lift position. + * + * Proper Zigbee mode must be selected in Tools->Zigbee mode + * and also the correct partition scheme must be selected in Tools->Partition Scheme. + * + * Please check the README.md for instructions and more detailed description. + * + * Created by hennikul and Jan Procházka (https://github.com/P-R-O-C-H-Y/) + */ + +#ifndef ZIGBEE_MODE_ED +#error "Zigbee end device mode is not selected in Tools->Zigbee mode" +#endif + +#include "ZigbeeCore.h" +#include "ep/ZigbeeWindowCovering.h" + +#define ZIGBEE_COVERING_ENDPOINT 10 +#define BUTTON_PIN 9 // ESP32-C6/H2 Boot button + +#define MAX_LIFT 200 // centimeters from open position (0-900) +#define MIN_LIFT 0 + +#define MAX_TILT 40 // centimeters from open position (0-900) +#define MIN_TILT 0 + +uint16_t currentLift = MAX_LIFT; +uint8_t currentLiftPercentage = 100; + +uint16_t currentTilt = MAX_TILT; +uint8_t currentTiltPercentage = 100; + +ZigbeeWindowCovering zbCovering = ZigbeeWindowCovering(ZIGBEE_COVERING_ENDPOINT); + +void setup() { + Serial.begin(115200); + + // Init button for factory reset + pinMode(BUTTON_PIN, INPUT_PULLUP); + + // Optional: set Zigbee device name and model + zbCovering.setManufacturerAndModel("Espressif", "WindowBlinds"); + + // Set proper covering type, it defines which attributes are available + zbCovering.setCoveringType(BLIND_LIFT_AND_TILT); + + // Set configuration: operational, online, not commands_reversed, lift / tilt closed_loop, lift / tilt encoder_controlled + zbCovering.setConfigStatus(true, true, false, true, true, true, true); + + // Set mode: not motor_reversed, calibration_mode, not maintenance_mode, not leds_on + zbCovering.setMode(false, true, false, false); + + // Set limits of motion + zbCovering.setLimits(MIN_LIFT, MAX_LIFT, MIN_TILT, MAX_TILT); + + // Set callback function for open, close, filt and tilt change, stop + zbCovering.onOpen(fullOpen); + zbCovering.onClose(fullClose); + zbCovering.onGoToLiftPercentage(goToLiftPercentage); + zbCovering.onGoToTiltPercentage(goToTiltPercentage); + zbCovering.onStop(stopMotor); + + // Add endpoint to Zigbee Core + Serial.println("Adding ZigbeeWindowCovering endpoint to Zigbee Core"); + Zigbee.addEndpoint(&zbCovering); + + // When all EPs are registered, start Zigbee. By default acts as ZIGBEE_END_DEVICE + Serial.println("Calling Zigbee.begin()"); + if (!Zigbee.begin()) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) { + Serial.print("."); + delay(100); + } + Serial.println(); + + // Set initial position + zbCovering.setLiftPercentage(currentLiftPercentage); + zbCovering.setTiltPercentage(currentTiltPercentage); +} + +void loop() { + // Checking button for factory reset + if (digitalRead(BUTTON_PIN) == LOW) { // Push button pressed + // Key debounce handling + delay(100); + int startTime = millis(); + while (digitalRead(BUTTON_PIN) == LOW) { + delay(50); + if ((millis() - startTime) > 3000) { + // If key pressed for more than 3secs, factory reset Zigbee and reboot + Serial.printf("Resetting Zigbee to factory settings, reboot.\n"); + Zigbee.factoryReset(); + delay(30000); + } + } + // Manual lift control simulation by pressing button + manualControl(); + } + delay(500); +} + +void fullOpen() { + /* This is where you would trigger your motor to go to full open state, currentLift should + be updated until full open has been reached in order to provide feedback to controller of actual position + The stop can be always called, so the movement can be stopped at any time */ + + // Our cover updates instantly! + currentLift = MAX_LIFT; + currentLiftPercentage = 100; + Serial.println("Opening cover"); + // Update the current position + zbCovering.setLiftPercentage(currentLiftPercentage); +} + +void fullClose() { + /* This is where you would trigger your motor to go to full close state, currentLift should + be updated until full close has been reached in order to provide feedback to controller of actual position + The stop can be always called, so the movement can be stopped at any time */ + + // Our cover updates instantly! + currentLift = MIN_LIFT; + currentLiftPercentage = 0; + Serial.println("Closing cover"); + // Update the current position + zbCovering.setLiftPercentage(currentLiftPercentage); +} + +void goToLiftPercentage(uint8_t liftPercentage) { + /* This is where you would trigger your motor to go towards liftPercentage, currentLift should + be updated until liftPercentage has been reached in order to provide feedback to controller */ + + // Our simulated cover updates instantly! + currentLift = (liftPercentage * MAX_LIFT) / 100; + currentLiftPercentage = liftPercentage; + Serial.printf("New requested lift from Zigbee: %d (%d)\n", currentLift, liftPercentage); + + // Update the current position + zbCovering.setLiftPercentage(currentLiftPercentage); //or setLiftPosition() +} + +void goToTiltPercentage(uint8_t tiltPercentage) { + /* This is where you would trigger your motor to go towards tiltPercentage, currentTilt should + be updated until tiltPercentage has been reached in order to provide feedback to controller */ + + // Our simulated cover updates instantly! + currentTilt = (tiltPercentage * MAX_TILT) / 100; + currentTiltPercentage = tiltPercentage; + Serial.printf("New requested tilt from Zigbee: %d (%d)\n", currentTilt, tiltPercentage); + + // Update the current position + zbCovering.setTiltPercentage(currentTiltPercentage); //or setTiltPosition() +} + +void stopMotor() { + // Motor can be stopped while moving cover toward current target, when stopped the actual position should be updated + Serial.println("Stopping motor"); + // Update the current position of both lift and tilt + zbCovering.setLiftPercentage(currentLiftPercentage); + zbCovering.setTiltPercentage(currentTiltPercentage); +} + +void manualControl() { + // Simulate lift percentage move by increasing it by 20% each time + currentLiftPercentage += 20; + if (currentLiftPercentage > 100) { + currentLiftPercentage = 0; + } + zbCovering.setLiftPercentage(currentLiftPercentage); + // Also setLiftPosition() can be used to set the exact position instead of percentage +} diff --git a/libraries/Zigbee/examples/Zigbee_Window_Covering/ci.json b/libraries/Zigbee/examples/Zigbee_Window_Covering/ci.json new file mode 100644 index 00000000000..7b7ccef8ed7 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Window_Covering/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y" + ] +} diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index c97be9378a8..49bfa44d5c1 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -20,3 +20,4 @@ #include "ep/ZigbeeCarbonDioxideSensor.h" #include "ep/ZigbeeContactSwitch.h" #include "ep/ZigbeeDoorWindowHandle.h" +#include "ep/ZigbeeWindowCovering.h" diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index 069db95aac0..fce0500ef0d 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -115,8 +115,8 @@ class ZigbeeEP { virtual void zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_attribute_t *attribute) {}; virtual void zbReadBasicCluster(const esp_zb_zcl_attribute_t *attribute); //already implemented virtual void zbIdentify(const esp_zb_zcl_set_attr_value_message_t *message); + virtual void zbWindowCoveringMovementCmd(const esp_zb_zcl_window_covering_movement_message_t *message) {}; virtual void zbReadTimeCluster(const esp_zb_zcl_attribute_t *attribute); //already implemented - virtual void zbIASZoneStatusChangeNotification(const esp_zb_zcl_ias_zone_status_change_notification_message_t *message) {}; virtual void zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) {}; diff --git a/libraries/Zigbee/src/ZigbeeHandlers.cpp b/libraries/Zigbee/src/ZigbeeHandlers.cpp index 52c38eb0633..575b25ef404 100644 --- a/libraries/Zigbee/src/ZigbeeHandlers.cpp +++ b/libraries/Zigbee/src/ZigbeeHandlers.cpp @@ -12,6 +12,7 @@ static esp_err_t zb_configure_report_resp_handler(const esp_zb_zcl_cmd_config_re static esp_err_t zb_cmd_ias_zone_status_change_handler(const esp_zb_zcl_ias_zone_status_change_notification_message_t *message); static esp_err_t zb_cmd_ias_zone_enroll_response_handler(const esp_zb_zcl_ias_zone_enroll_response_message_t *message); static esp_err_t zb_cmd_default_resp_handler(const esp_zb_zcl_cmd_default_resp_message_t *message); +static esp_err_t zb_window_covering_movement_resp_handler(const esp_zb_zcl_window_covering_movement_message_t *message); // Zigbee action handlers [[maybe_unused]] @@ -28,6 +29,9 @@ static esp_err_t zb_action_handler(esp_zb_core_action_callback_id_t callback_id, case ESP_ZB_CORE_IAS_ZONE_ENROLL_RESPONSE_VALUE_CB_ID: ret = zb_cmd_ias_zone_enroll_response_handler((esp_zb_zcl_ias_zone_enroll_response_message_t *)message); break; + case ESP_ZB_CORE_WINDOW_COVERING_MOVEMENT_CB_ID: + ret = zb_window_covering_movement_resp_handler((esp_zb_zcl_window_covering_movement_message_t *)message); + break; case ESP_ZB_CORE_CMD_DEFAULT_RESP_CB_ID: ret = zb_cmd_default_resp_handler((esp_zb_zcl_cmd_default_resp_message_t *)message); break; default: log_w("Receive unhandled Zigbee action(0x%x) callback", callback_id); break; } @@ -198,4 +202,26 @@ static esp_err_t zb_cmd_default_resp_handler(const esp_zb_zcl_cmd_default_resp_m return ESP_OK; } +static esp_err_t zb_window_covering_movement_resp_handler(const esp_zb_zcl_window_covering_movement_message_t *message) { + if (!message) { + log_e("Empty message"); + } + if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Received message: error status(%d)", message->info.status); + } + + log_v( + "Received message: endpoint(%d), cluster(0x%x), command(0x%x), payload(%d)", message->info.dst_endpoint, message->info.cluster, message->command, + message->payload + ); + + // List through all Zigbee EPs and call the callback function, with the message + for (std::list::iterator it = Zigbee.ep_objects.begin(); it != Zigbee.ep_objects.end(); ++it) { + if (message->info.dst_endpoint == (*it)->getEndpoint()) { + (*it)->zbWindowCoveringMovementCmd(message); //method zbWindowCoveringMovementCmd must be implemented in specific EP class + } + } + return ESP_OK; +} + #endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp new file mode 100644 index 00000000000..970017165e2 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp @@ -0,0 +1,308 @@ + +#include "ZigbeeWindowCovering.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +esp_zb_cluster_list_t *ZigbeeWindowCovering::zigbee_window_covering_clusters_create(zigbee_window_covering_cfg_t *window_covering_cfg) { + esp_zb_attribute_list_t *esp_zb_basic_cluster = esp_zb_basic_cluster_create(&window_covering_cfg->basic_cfg); + esp_zb_attribute_list_t *esp_zb_identify_cluster = esp_zb_identify_cluster_create(&window_covering_cfg->identify_cfg); + esp_zb_attribute_list_t *esp_zb_groups_cluster = esp_zb_groups_cluster_create(&window_covering_cfg->groups_cfg); + esp_zb_attribute_list_t *esp_zb_scenes_cluster = esp_zb_scenes_cluster_create(&window_covering_cfg->scenes_cfg); + esp_zb_attribute_list_t *esp_zb_window_covering_cluster = esp_zb_window_covering_cluster_create(&window_covering_cfg->window_covering_cfg); + + esp_zb_window_covering_cluster_add_attr( + esp_zb_window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CURRENT_POSITION_LIFT_PERCENTAGE_ID, &_current_lift_percentage + ); + esp_zb_window_covering_cluster_add_attr( + esp_zb_window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CURRENT_POSITION_TILT_PERCENTAGE_ID, &_current_tilt_percentage + ); + esp_zb_window_covering_cluster_add_attr(esp_zb_window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CURRENT_POSITION_LIFT_ID, &_current_lift_position); + esp_zb_window_covering_cluster_add_attr(esp_zb_window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CURRENT_POSITION_TILT_ID, &_current_lift_position); + esp_zb_window_covering_cluster_add_attr( + esp_zb_window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_INSTALLED_OPEN_LIMIT_LIFT_ID, &_installed_open_limit_lift + ); + esp_zb_window_covering_cluster_add_attr( + esp_zb_window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_INSTALLED_OPEN_LIMIT_TILT_ID, &_installed_open_limit_tilt + ); + esp_zb_window_covering_cluster_add_attr( + esp_zb_window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_INSTALLED_CLOSED_LIMIT_LIFT_ID, &_installed_closed_limit_lift + ); + esp_zb_window_covering_cluster_add_attr( + esp_zb_window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_INSTALLED_CLOSED_LIMIT_TILT_ID, &_installed_closed_limit_tilt + ); + esp_zb_window_covering_cluster_add_attr( + esp_zb_window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_PHYSICAL_CLOSED_LIMIT_LIFT_ID, &_physical_closed_limit_lift + ); + esp_zb_window_covering_cluster_add_attr( + esp_zb_window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_PHY_CLOSED_LIMIT_TILT_ID, &_physical_closed_limit_lift + ); + + // ------------------------------ Create cluster list ------------------------------ + esp_zb_cluster_list_t *esp_zb_cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(esp_zb_cluster_list, esp_zb_basic_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(esp_zb_cluster_list, esp_zb_identify_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_groups_cluster(esp_zb_cluster_list, esp_zb_groups_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_scenes_cluster(esp_zb_cluster_list, esp_zb_scenes_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_window_covering_cluster(esp_zb_cluster_list, esp_zb_window_covering_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + + return esp_zb_cluster_list; +} + +ZigbeeWindowCovering::ZigbeeWindowCovering(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_WINDOW_COVERING_DEVICE_ID; + + // set default values for window covering attributes + _current_lift_percentage = ESP_ZB_ZCL_WINDOW_COVERING_CURRENT_POSITION_LIFT_PERCENTAGE_DEFAULT_VALUE; + _current_tilt_percentage = ESP_ZB_ZCL_WINDOW_COVERING_CURRENT_POSITION_TILT_PERCENTAGE_DEFAULT_VALUE; + _installed_open_limit_lift = ESP_ZB_ZCL_WINDOW_COVERING_INSTALLED_OPEN_LIMIT_LIFT_DEFAULT_VALUE; + _installed_closed_limit_lift = ESP_ZB_ZCL_WINDOW_COVERING_INSTALLED_CLOSED_LIMIT_LIFT_DEFAULT_VALUE; + _installed_open_limit_tilt = ESP_ZB_ZCL_WINDOW_COVERING_INSTALLED_OPEN_LIMIT_TILT_DEFAULT_VALUE; + _installed_closed_limit_tilt = ESP_ZB_ZCL_WINDOW_COVERING_INSTALLED_CLOSED_LIMIT_TILT_DEFAULT_VALUE; + _current_lift_position = ESP_ZB_ZCL_WINDOW_COVERING_CURRENT_POSITION_LIFT_DEFAULT_VALUE; + _current_tilt_position = ESP_ZB_ZCL_WINDOW_COVERING_CURRENT_POSITION_TILT_DEFAULT_VALUE; + _physical_closed_limit_lift = ESP_ZB_ZCL_WINDOW_COVERING_PHYSICAL_CLOSED_LIMIT_LIFT_DEFAULT_VALUE; + _physical_closed_limit_tilt = ESP_ZB_ZCL_WINDOW_COVERING_PHY_CLOSED_LIMIT_TILT_DEFAULT_VALUE; + + // Create custom window covering configuration + zigbee_window_covering_cfg_t window_covering_cfg = ZIGBEE_DEFAULT_WINDOW_COVERING_CONFIG(); + _cluster_list = zigbee_window_covering_clusters_create(&window_covering_cfg); + + _ep_config = { + .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_WINDOW_COVERING_DEVICE_ID, .app_device_version = 0 + }; +} + +// Configuration methods for window covering +void ZigbeeWindowCovering::setCoveringType(ZigbeeWindowCoveringType covering_type) { + esp_zb_attribute_list_t *window_covering_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_WINDOW_COVERING_TYPE_ID, (void *)&covering_type); +} + +void ZigbeeWindowCovering::setConfigStatus( + bool operational, bool online, bool commands_reversed, bool lift_closed_loop, bool tilt_closed_loop, bool lift_encoder_controlled, + bool tilt_encoder_controlled +) { + uint8_t config_status = (operational ? ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CONFIG_OPERATIONAL : 0) | (online ? ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CONFIG_ONLINE : 0) + | (commands_reversed ? ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CONFIG_REVERSE_COMMANDS : 0) + | (lift_closed_loop ? ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CONFIG_LIFT_CONTROL_IS_CLOSED_LOOP : 0) + | (tilt_closed_loop ? ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CONFIG_TILT_CONTROL_IS_CLOSED_LOOP : 0) + | (lift_encoder_controlled ? ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CONFIG_LIFT_ENCODER_CONTROLLED : 0) + | (tilt_encoder_controlled ? ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CONFIG_TILT_ENCODER_CONTROLLED : 0); + + log_v("Updating window covering config status to %d", config_status); + + esp_zb_attribute_list_t *window_covering_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CONFIG_STATUS_ID, (void *)&config_status); +} + +void ZigbeeWindowCovering::setMode(bool motor_reversed, bool calibration_mode, bool maintenance_mode, bool leds_on) { + uint8_t mode = (motor_reversed ? ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_REVERSED_MOTOR_DIRECTION : 0) + | (calibration_mode ? ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_RUN_IN_CALIBRATION_MODE : 0) + | (maintenance_mode ? ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_MOTOR_IS_RUNNING_IN_MAINTENANCE_MODE : 0) + | (leds_on ? ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_LEDS_WILL_DISPLAY_FEEDBACK : 0); + + log_v("Updating window covering mode to %d", mode); + + esp_zb_attribute_list_t *window_covering_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_MODE_ID, (void *)&mode); +} + +void ZigbeeWindowCovering::setLimits( + uint16_t installed_open_limit_lift, uint16_t installed_closed_limit_lift, uint16_t installed_open_limit_tilt, uint16_t installed_closed_limit_tilt +) { + _installed_open_limit_lift = installed_open_limit_lift; + _installed_closed_limit_lift = installed_closed_limit_lift; + _physical_closed_limit_lift = installed_closed_limit_lift; + _installed_open_limit_tilt = installed_open_limit_tilt; + _installed_closed_limit_tilt = installed_closed_limit_tilt; + _physical_closed_limit_tilt = installed_closed_limit_tilt; + + esp_zb_attribute_list_t *window_covering_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_INSTALLED_OPEN_LIMIT_LIFT_ID, (void *)&_installed_open_limit_lift); + esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_INSTALLED_CLOSED_LIMIT_LIFT_ID, (void *)&_installed_closed_limit_lift); + esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_INSTALLED_OPEN_LIMIT_TILT_ID, (void *)&_installed_open_limit_tilt); + esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_INSTALLED_CLOSED_LIMIT_TILT_ID, (void *)&_installed_closed_limit_tilt); + esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_PHYSICAL_CLOSED_LIMIT_LIFT_ID, (void *)&_physical_closed_limit_lift); + esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_PHY_CLOSED_LIMIT_TILT_ID, (void *)&_physical_closed_limit_tilt); +} + +// Callback for handling incoming messages and commands +void ZigbeeWindowCovering::zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) { + //check the data and call right method + if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING) { + log_v("Received attribute id: 0x%x / data.type: 0x%x", message->attribute.id, message->attribute.data.type); + if (message->attribute.id == ESP_ZB_ZCL_ATTR_WINDOW_COVERING_MODE_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_8BITMAP) { + uint8_t mode = *(uint8_t *)message->attribute.data.value; + bool motor_reversed = mode & ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_REVERSED_MOTOR_DIRECTION; + bool calibration_mode = mode & ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_RUN_IN_CALIBRATION_MODE; + bool maintenance_mode = mode & ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_MOTOR_IS_RUNNING_IN_MAINTENANCE_MODE; + bool leds_on = mode & ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_LEDS_WILL_DISPLAY_FEEDBACK; + log_v( + "Updating window covering mode to motor reversed: %d, calibration mode: %d, maintenance mode: %d, leds on: %d", motor_reversed, calibration_mode, + maintenance_mode, leds_on + ); + setMode(motor_reversed, calibration_mode, maintenance_mode, leds_on); + //Update Configuration status with motor reversed status + uint8_t config_status; + config_status = (*(uint8_t *)esp_zb_zcl_get_attribute( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CONFIG_STATUS_ID + ) + ->data_p); + config_status = motor_reversed ? config_status | ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CONFIG_REVERSE_COMMANDS + : config_status & ~ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CONFIG_REVERSE_COMMANDS; + log_v("Updating window covering config status to %d", config_status); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CONFIG_STATUS_ID, &config_status, + false + ); + esp_zb_lock_release(); + return; + } + } else { + log_w("Received message ignored. Cluster ID: %d not supported for Window Covering", message->info.cluster); + } +} + +void ZigbeeWindowCovering::zbWindowCoveringMovementCmd(const esp_zb_zcl_window_covering_movement_message_t *message) { + // check the data and call right method + if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING) { + if (message->command == ESP_ZB_ZCL_CMD_WINDOW_COVERING_UP_OPEN) { + open(); + return; + } else if (message->command == ESP_ZB_ZCL_CMD_WINDOW_COVERING_DOWN_CLOSE) { + close(); + return; + } else if (message->command == ESP_ZB_ZCL_CMD_WINDOW_COVERING_STOP) { + stop(); + return; + } else if (message->command == ESP_ZB_ZCL_CMD_WINDOW_COVERING_GO_TO_LIFT_PERCENTAGE) { + if (_current_lift_percentage != message->payload.percentage_lift_value) { + _current_lift_percentage = message->payload.percentage_lift_value; + goToLiftPercentage(_current_lift_percentage); + } + return; + } else if (message->command == ESP_ZB_ZCL_CMD_WINDOW_COVERING_GO_TO_TILT_PERCENTAGE) { + if (_current_tilt_percentage != message->payload.percentage_tilt_value) { + _current_tilt_percentage = message->payload.percentage_tilt_value; + goToTiltPercentage(_current_tilt_percentage); + } + } else { + log_w("Received message ignored. Command: %d not supported for Window Covering", message->command); + } + } else { + log_w("Received message ignored. Cluster ID: %d not supported for Window Covering", message->info.cluster); + } +} + +void ZigbeeWindowCovering::open() { + if (_on_open) { + _on_open(); + } +} + +void ZigbeeWindowCovering::close() { + if (_on_close) { + _on_close(); + } +} + +void ZigbeeWindowCovering::goToLiftPercentage(uint8_t lift_percentage) { + if (_on_go_to_lift_percentage) { + _on_go_to_lift_percentage(lift_percentage); + } +} + +void ZigbeeWindowCovering::goToTiltPercentage(uint8_t tilt_percentage) { + if (_on_go_to_tilt_percentage) { + _on_go_to_tilt_percentage(tilt_percentage); + } +} + +void ZigbeeWindowCovering::stop() { + if (_on_stop) { + _on_stop(); + } +} + +// Methods to control window covering from user application +void ZigbeeWindowCovering::setLiftPosition(uint16_t lift_position) { + // Update both lift attributes + _current_lift_position = lift_position; + _current_lift_percentage = ((lift_position - _installed_open_limit_lift) * 100) / (_installed_closed_limit_lift - _installed_open_limit_lift); + + log_v("Updating window covering lift position to %d (%d%)", _current_lift_position, _current_lift_percentage); + // set lift state + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CURRENT_POSITION_LIFT_ID, + &_current_lift_position, false + ); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CURRENT_POSITION_LIFT_PERCENTAGE_ID, + &_current_lift_percentage, false + ); + esp_zb_lock_release(); +} + +void ZigbeeWindowCovering::setLiftPercentage(uint8_t lift_percentage) { + // Update both lift attributes + _current_lift_percentage = lift_percentage; + _current_lift_position = _installed_open_limit_lift + ((_installed_closed_limit_lift - _installed_open_limit_lift) * lift_percentage) / 100; + + log_v("Updating window covering lift position to %d (%d%)", _current_lift_position, _current_lift_percentage); + // set lift state + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CURRENT_POSITION_LIFT_ID, + &_current_lift_position, false + ); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CURRENT_POSITION_LIFT_PERCENTAGE_ID, + &_current_lift_percentage, false + ); + esp_zb_lock_release(); +} + +void ZigbeeWindowCovering::setTiltPosition(uint16_t tilt_position) { + // Update both tilt attributes + _current_tilt_position = tilt_position; + _current_tilt_percentage = ((tilt_position - _installed_open_limit_tilt) * 100) / (_installed_closed_limit_tilt - _installed_open_limit_tilt); + + log_v("Updating window covering tilt position to %d (%d%)", _current_tilt_position, _current_tilt_percentage); + // set lift state + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CURRENT_POSITION_TILT_ID, + &_current_tilt_position, false + ); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CURRENT_POSITION_TILT_PERCENTAGE_ID, + &_current_tilt_percentage, false + ); + esp_zb_lock_release(); +} + +void ZigbeeWindowCovering::setTiltPercentage(uint8_t tilt_percentage) { + // Update both tilt attributes + _current_tilt_percentage = tilt_percentage; + _current_tilt_position = _installed_open_limit_lift + ((_installed_closed_limit_tilt - _installed_open_limit_tilt) * tilt_percentage) / 100; + + log_v("Updating window covering tilt position to %d (%d%)", _current_tilt_position, _current_tilt_percentage); + // set lift state + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CURRENT_POSITION_TILT_ID, + &_current_tilt_position, false + ); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WINDOW_COVERING, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CURRENT_POSITION_TILT_PERCENTAGE_ID, + &_current_tilt_percentage, false + ); + esp_zb_lock_release(); +} + +#endif // SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h new file mode 100644 index 00000000000..5cc2b13701a --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h @@ -0,0 +1,147 @@ +/* Class of Zigbee Window Covering endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +// Window covering types supported by Zigbee Window Covering cluster +enum ZigbeeWindowCoveringType { + ROLLERSHADE = ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_ROLLERSHADE, // LIFT support + ROLLERSHADE_2_MOTOR = ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_ROLLERSHADE_2_MOTOR, // LIFT support + ROLLERSHADE_EXTERIOR = ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_ROLLERSHADE_EXTERIOR, // LIFT support + ROLLERSHADE_EXTERIOR_2_MOTOR = ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_ROLLERSHADE_EXTERIOR_2_MOTOR, // LIFT support + DRAPERY = ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_DRAPERY, // LIFT support + AWNING = ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_AWNING, // LIFT support + SHUTTER = ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_SHUTTER, // TILT support + BLIND_TILT_ONLY = ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_TILT_BLIND_TILT_ONLY, // TILT support + BLIND_LIFT_AND_TILT = ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_TILT_BLIND_LIFT_AND_TILT, // LIFT and TILT support + PROJECTOR_SCREEN = ESP_ZB_ZCL_ATTR_WINDOW_COVERING_TYPE_PROJECTOR_SCREEN, // LIFT support +}; + +// clang-format off +#define ZIGBEE_DEFAULT_WINDOW_COVERING_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .groups_cfg = \ + { \ + .groups_name_support_id = ESP_ZB_ZCL_GROUPS_NAME_SUPPORT_DEFAULT_VALUE, \ + }, \ + .scenes_cfg = \ + { \ + .scenes_count = ESP_ZB_ZCL_SCENES_SCENE_COUNT_DEFAULT_VALUE, \ + .current_scene = ESP_ZB_ZCL_SCENES_CURRENT_SCENE_DEFAULT_VALUE, \ + .current_group = ESP_ZB_ZCL_SCENES_CURRENT_GROUP_DEFAULT_VALUE, \ + .scene_valid = ESP_ZB_ZCL_SCENES_SCENE_VALID_DEFAULT_VALUE, \ + .name_support = ESP_ZB_ZCL_SCENES_NAME_SUPPORT_DEFAULT_VALUE, \ + }, \ + .window_covering_cfg = \ + { \ + .covering_type = ESP_ZB_ZCL_WINDOW_COVERING_WINDOW_COVERING_TYPE_DEFAULT_VALUE, \ + .covering_status = ESP_ZB_ZCL_WINDOW_COVERING_CONFIG_STATUS_DEFAULT_VALUE, \ + .covering_mode = ESP_ZB_ZCL_WINDOW_COVERING_MODE_DEFAULT_VALUE, \ + }, \ + } +// clang-format on + +typedef struct zigbee_window_covering_cfg_s { + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_groups_cluster_cfg_t groups_cfg; + esp_zb_scenes_cluster_cfg_t scenes_cfg; + esp_zb_window_covering_cluster_cfg_t window_covering_cfg; +} zigbee_window_covering_cfg_t; + +class ZigbeeWindowCovering : public ZigbeeEP { +public: + ZigbeeWindowCovering(uint8_t endpoint); + ~ZigbeeWindowCovering(); + + // Set the callback functions for the window covering commands + void onOpen(void (*callback)()) { + _on_open = callback; + } + void onClose(void (*callback)()) { + _on_close = callback; + } + void onGoToLiftPercentage(void (*callback)(uint8_t)) { + _on_go_to_lift_percentage = callback; + } + void onGoToTiltPercentage(void (*callback)(uint8_t)) { + _on_go_to_tilt_percentage = callback; + } + void onStop(void (*callback)()) { + _on_stop = callback; + } + + // Set the window covering position in centimeters or percentage (0-100) + void setLiftPosition(uint16_t lift_position); + void setLiftPercentage(uint8_t lift_percentage); + void setTiltPosition(uint16_t tilt_position); + void setTiltPercentage(uint8_t tilt_percentage); + + // Set the window covering type (see ZigbeeWindowCoveringType) + void setCoveringType(ZigbeeWindowCoveringType covering_type); + + // Set window covering config/status, for more info see esp_zb_zcl_window_covering_config_status_t + void setConfigStatus( + bool operational, bool online, bool commands_reversed, bool lift_closed_loop, bool tilt_closed_loop, bool lift_encoder_controlled, + bool tilt_encoder_controlled + ); + + // Set configuration mode of window covering, for more info see esp_zb_zcl_window_covering_mode_t + void setMode(bool motor_reversed, bool calibration_mode, bool maintenance_mode, bool leds_on); + + // Set limits of motion, for more info see esp_zb_zcl_window_covering_info_attr_t + void setLimits( + uint16_t installed_open_limit_lift, uint16_t installed_closed_limit_lift, uint16_t installed_open_limit_tilt, uint16_t installed_closed_limit_tilt + ); + +private: + void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override; + void zbWindowCoveringMovementCmd(const esp_zb_zcl_window_covering_movement_message_t *message) override; + + // Create window covering cluster list + esp_zb_cluster_list_t *zigbee_window_covering_clusters_create(zigbee_window_covering_cfg_t *window_covering_cfg); + + void open(); + void close(); + void goToLiftPercentage(uint8_t); + void goToTiltPercentage(uint8_t); + void stop(); + + // callback function to be called on lift percentage change (lift percentage) + void (*_on_open)(); + void (*_on_close)(); + void (*_on_go_to_lift_percentage)(uint8_t); + void (*_on_go_to_tilt_percentage)(uint8_t); + void (*_on_stop)(); + + // Widows covering lift attributes + uint8_t _current_lift_percentage; + uint16_t _current_lift_position; + uint16_t _installed_open_limit_lift; + uint16_t _installed_closed_limit_lift; + uint16_t _physical_closed_limit_lift; + + // Windows covering tilt attributes + uint8_t _current_tilt_percentage; + uint16_t _current_tilt_position; + uint16_t _installed_open_limit_tilt; + uint16_t _installed_closed_limit_tilt; + uint16_t _physical_closed_limit_tilt; +}; + +#endif // SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED From 6fcaf690970401e63e75609628663b862a928b68 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 6 Feb 2025 11:19:27 +0200 Subject: [PATCH 168/183] fix(wifi): Make sure that esp-hosted events are propagated (#10939) --- libraries/Network/src/NetworkInterface.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/Network/src/NetworkInterface.cpp b/libraries/Network/src/NetworkInterface.cpp index 4f310821204..01790ec2493 100644 --- a/libraries/Network/src/NetworkInterface.cpp +++ b/libraries/Network/src/NetworkInterface.cpp @@ -81,7 +81,7 @@ void NetworkInterface::_onIpEvent(int32_t event_id, void *event_data) { ); #endif memcpy(&arduino_event.event_info.got_ip, event_data, sizeof(ip_event_got_ip_t)); -#if SOC_WIFI_SUPPORTED +#if SOC_WIFI_SUPPORTED || CONFIG_ESP_WIFI_REMOTE_ENABLED if (_interface_id == ESP_NETIF_ID_STA) { arduino_event.event_id = ARDUINO_EVENT_WIFI_STA_GOT_IP; } else @@ -96,7 +96,7 @@ void NetworkInterface::_onIpEvent(int32_t event_id, void *event_data) { #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE log_v("%s Lost IP", desc()); #endif -#if SOC_WIFI_SUPPORTED +#if SOC_WIFI_SUPPORTED || CONFIG_ESP_WIFI_REMOTE_ENABLED if (_interface_id == ESP_NETIF_ID_STA) { arduino_event.event_id = ARDUINO_EVENT_WIFI_STA_LOST_IP; } else @@ -123,7 +123,7 @@ void NetworkInterface::_onIpEvent(int32_t event_id, void *event_data) { ); #endif memcpy(&arduino_event.event_info.got_ip6, event_data, sizeof(ip_event_got_ip6_t)); -#if SOC_WIFI_SUPPORTED +#if SOC_WIFI_SUPPORTED || CONFIG_ESP_WIFI_REMOTE_ENABLED if (_interface_id == ESP_NETIF_ID_STA) { arduino_event.event_id = ARDUINO_EVENT_WIFI_STA_GOT_IP6; } else if (_interface_id == ESP_NETIF_ID_AP) { @@ -136,7 +136,7 @@ void NetworkInterface::_onIpEvent(int32_t event_id, void *event_data) { arduino_event.event_id = ARDUINO_EVENT_ETH_GOT_IP6; } #endif /* CONFIG_LWIP_IPV6 */ -#if SOC_WIFI_SUPPORTED +#if SOC_WIFI_SUPPORTED || CONFIG_ESP_WIFI_REMOTE_ENABLED } else if (event_id == IP_EVENT_AP_STAIPASSIGNED && _interface_id == ESP_NETIF_ID_AP) { setStatusBits(ESP_NETIF_HAS_IP_BIT); #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE From 5ba4c21a990f46b61ae8c7913b81e15064b2a8ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 6 Feb 2025 16:06:07 +0100 Subject: [PATCH 169/183] fix(zigbee): Add default destructor and fix initialization of tm struct (#10943) --- libraries/Zigbee/src/ZigbeeEP.h | 2 +- libraries/Zigbee/src/ep/ZigbeeWindowCovering.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index fce0500ef0d..584873f50dd 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -95,7 +95,7 @@ class ZigbeeEP { void reportBatteryPercentage(); // Set time - void addTimeCluster(tm time = {0}, int32_t gmt_offset = 0); // gmt offset in seconds + void addTimeCluster(tm time = {}, int32_t gmt_offset = 0); // gmt offset in seconds void setTime(tm time); void setTimezone(int32_t gmt_offset); diff --git a/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h index 5cc2b13701a..08e0a35f737 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h +++ b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h @@ -67,7 +67,7 @@ typedef struct zigbee_window_covering_cfg_s { class ZigbeeWindowCovering : public ZigbeeEP { public: ZigbeeWindowCovering(uint8_t endpoint); - ~ZigbeeWindowCovering(); + ~ZigbeeWindowCovering() {} // Set the callback functions for the window covering commands void onOpen(void (*callback)()) { From 250c1abf781eba8cec7a524090939c30e05b690c Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Wed, 12 Feb 2025 10:40:15 +0200 Subject: [PATCH 170/183] fix(i2s): Add missing initializer for I2S CLK config (#10963) * fix(i2s): Add missing initializer for I2S CLK config * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- libraries/ESP_I2S/src/ESP_I2S.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libraries/ESP_I2S/src/ESP_I2S.cpp b/libraries/ESP_I2S/src/ESP_I2S.cpp index d0ceb0c4b4c..6bf8089e48a 100644 --- a/libraries/ESP_I2S/src/ESP_I2S.cpp +++ b/libraries/ESP_I2S/src/ESP_I2S.cpp @@ -11,6 +11,12 @@ #include "mp3dec.h" #endif +#if SOC_I2S_HW_VERSION_2 +#undef I2S_STD_CLK_DEFAULT_CONFIG +#define I2S_STD_CLK_DEFAULT_CONFIG(rate) \ + { .sample_rate_hz = rate, .clk_src = I2S_CLK_SRC_DEFAULT, .ext_clk_freq_hz = 0, .mclk_multiple = I2S_MCLK_MULTIPLE_256, } +#endif + #define I2S_READ_CHUNK_SIZE 1920 #define I2S_DEFAULT_CFG() \ From 7b651b64d61ccd513480305f60fae877b26f764f Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 13 Feb 2025 12:51:28 +0200 Subject: [PATCH 171/183] feat(cdc): Add support for two CDC ports at once (#10962) * feat(cdc): Add support for two CDC ports at once * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- cores/esp32/USBCDC.cpp | 68 ++++++++++++++++++++++++--------- cores/esp32/esp32-hal-tinyusb.c | 24 ++++++------ cores/esp32/esp32-hal-tinyusb.h | 8 ++++ 3 files changed, 72 insertions(+), 28 deletions(-) diff --git a/cores/esp32/USBCDC.cpp b/cores/esp32/USBCDC.cpp index 795a17dc0b8..945021a79e2 100644 --- a/cores/esp32/USBCDC.cpp +++ b/cores/esp32/USBCDC.cpp @@ -25,8 +25,7 @@ ESP_EVENT_DEFINE_BASE(ARDUINO_USB_CDC_EVENTS); esp_err_t arduino_usb_event_post(esp_event_base_t event_base, int32_t event_id, void *event_data, size_t event_data_size, TickType_t ticks_to_wait); esp_err_t arduino_usb_event_handler_register_with(esp_event_base_t event_base, int32_t event_id, esp_event_handler_t event_handler, void *event_handler_arg); -#define MAX_USB_CDC_DEVICES 2 -USBCDC *devices[MAX_USB_CDC_DEVICES] = {NULL, NULL}; +USBCDC *devices[CFG_TUD_CDC]; static uint16_t load_cdc_descriptor(uint8_t *dst, uint8_t *itf) { uint8_t str_index = tinyusb_add_string_descriptor("TinyUSB CDC"); @@ -38,23 +37,43 @@ static uint16_t load_cdc_descriptor(uint8_t *dst, uint8_t *itf) { return TUD_CDC_DESC_LEN; } +static uint16_t load_cdc_descriptor2(uint8_t *dst, uint8_t *itf) { + uint8_t str_index = tinyusb_add_string_descriptor("TinyUSB CDC2"); + uint8_t ep_ntfy = tinyusb_get_free_in_endpoint(); + TU_VERIFY(ep_ntfy != 0); + uint8_t ep_in = tinyusb_get_free_in_endpoint(); + TU_VERIFY(ep_in != 0); + uint8_t ep_out = tinyusb_get_free_out_endpoint(); + TU_VERIFY(ep_out != 0); + uint8_t descriptor[TUD_CDC_DESC_LEN] = { + // Interface number, string index, EP notification address and size, EP data address (out, in) and size. + TUD_CDC_DESCRIPTOR(*itf, str_index, (uint8_t)(0x80 | ep_ntfy), CFG_TUD_ENDOINT_SIZE, ep_out, (uint8_t)(0x80 | ep_in), CFG_TUD_ENDOINT_SIZE) + }; + *itf += 2; + memcpy(dst, descriptor, TUD_CDC_DESC_LEN); + return TUD_CDC_DESC_LEN; +} + // Invoked when line state DTR & RTS are changed via SET_CONTROL_LINE_STATE void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) { - if (itf < MAX_USB_CDC_DEVICES && devices[itf] != NULL) { + //log_v("ITF: %u, DTR: %u, RTS: %u", itf, dtr, rts); + if (itf < CFG_TUD_CDC && devices[itf] != NULL) { devices[itf]->_onLineState(dtr, rts); } } // Invoked when line coding is change via SET_LINE_CODING void tud_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const *p_line_coding) { - if (itf < MAX_USB_CDC_DEVICES && devices[itf] != NULL) { + //log_v("ITF: %u, BITRATE: %lu, STOP_BITS: %u, PARITY: %u, DATA_BITS: %u", itf, p_line_coding->bit_rate, p_line_coding->stop_bits, p_line_coding->parity, p_line_coding->data_bits); + if (itf < CFG_TUD_CDC && devices[itf] != NULL) { devices[itf]->_onLineCoding(p_line_coding->bit_rate, p_line_coding->stop_bits, p_line_coding->parity, p_line_coding->data_bits); } } // Invoked when received new data void tud_cdc_rx_cb(uint8_t itf) { - if (itf < MAX_USB_CDC_DEVICES && devices[itf] != NULL) { + //log_v("ITF: %u", itf); + if (itf < CFG_TUD_CDC && devices[itf] != NULL) { devices[itf]->_onRX(); } } @@ -66,13 +85,13 @@ void tud_cdc_send_break_cb(uint8_t itf, uint16_t duration_ms) { // Invoked when space becomes available in TX buffer void tud_cdc_tx_complete_cb(uint8_t itf) { - if (itf < MAX_USB_CDC_DEVICES && devices[itf] != NULL) { + if (itf < CFG_TUD_CDC && devices[itf] != NULL) { devices[itf]->_onTX(); } } static void ARDUINO_ISR_ATTR cdc0_write_char(char c) { - if (devices[0] != NULL) { + if (CFG_TUD_CDC && devices[0] != NULL) { tud_cdc_n_write_char(0, c); } } @@ -84,9 +103,15 @@ static void usb_unplugged_cb(void *arg, esp_event_base_t event_base, int32_t eve USBCDC::USBCDC(uint8_t itfn) : itf(itfn), bit_rate(0), stop_bits(0), parity(0), data_bits(0), dtr(false), rts(false), connected(false), reboot_enable(true), rx_queue(NULL), tx_lock(NULL), tx_timeout_ms(250) { - tinyusb_enable_interface(USB_INTERFACE_CDC, TUD_CDC_DESC_LEN, load_cdc_descriptor); - if (itf < MAX_USB_CDC_DEVICES) { + if (itf < CFG_TUD_CDC) { + if (itf == 0) { + tinyusb_enable_interface(USB_INTERFACE_CDC, TUD_CDC_DESC_LEN, load_cdc_descriptor); + } else { + tinyusb_enable_interface(USB_INTERFACE_CDC2, TUD_CDC_DESC_LEN, load_cdc_descriptor2); + } arduino_usb_event_handler_register_with(ARDUINO_USB_EVENTS, ARDUINO_USB_STOPPED_EVENT, usb_unplugged_cb, this); + } else { + log_e("Maximum of %u CDC devices are supported", CFG_TUD_CDC); } } @@ -142,6 +167,9 @@ size_t USBCDC::setRxBufferSize(size_t rx_queue_len) { } void USBCDC::begin(unsigned long baud) { + if (itf >= CFG_TUD_CDC) { + return; + } if (tx_lock == NULL) { tx_lock = xSemaphoreCreateMutex(); } @@ -153,6 +181,9 @@ void USBCDC::begin(unsigned long baud) { } void USBCDC::end() { + if (itf >= CFG_TUD_CDC) { + return; + } connected = false; devices[itf] = NULL; setRxBufferSize(0); @@ -298,14 +329,14 @@ bool USBCDC::rebootEnabled(void) { } int USBCDC::available(void) { - if (itf >= MAX_USB_CDC_DEVICES || rx_queue == NULL) { + if (itf >= CFG_TUD_CDC || rx_queue == NULL) { return -1; } return uxQueueMessagesWaiting(rx_queue); } int USBCDC::peek(void) { - if (itf >= MAX_USB_CDC_DEVICES || rx_queue == NULL) { + if (itf >= CFG_TUD_CDC || rx_queue == NULL) { return -1; } uint8_t c; @@ -316,7 +347,7 @@ int USBCDC::peek(void) { } int USBCDC::read(void) { - if (itf >= MAX_USB_CDC_DEVICES || rx_queue == NULL) { + if (itf >= CFG_TUD_CDC || rx_queue == NULL) { return -1; } uint8_t c = 0; @@ -327,7 +358,7 @@ int USBCDC::read(void) { } size_t USBCDC::read(uint8_t *buffer, size_t size) { - if (itf >= MAX_USB_CDC_DEVICES || rx_queue == NULL) { + if (itf >= CFG_TUD_CDC || rx_queue == NULL) { return -1; } uint8_t c = 0; @@ -339,7 +370,7 @@ size_t USBCDC::read(uint8_t *buffer, size_t size) { } void USBCDC::flush(void) { - if (itf >= MAX_USB_CDC_DEVICES || tx_lock == NULL || !tud_cdc_n_connected(itf)) { + if (itf >= CFG_TUD_CDC || tx_lock == NULL || !tud_cdc_n_connected(itf)) { return; } if (xSemaphoreTake(tx_lock, tx_timeout_ms / portTICK_PERIOD_MS) != pdPASS) { @@ -350,7 +381,7 @@ void USBCDC::flush(void) { } int USBCDC::availableForWrite(void) { - if (itf >= MAX_USB_CDC_DEVICES || tx_lock == NULL || !tud_cdc_n_connected(itf)) { + if (itf >= CFG_TUD_CDC || tx_lock == NULL || !tud_cdc_n_connected(itf)) { return 0; } if (xSemaphoreTake(tx_lock, tx_timeout_ms / portTICK_PERIOD_MS) != pdPASS) { @@ -362,7 +393,7 @@ int USBCDC::availableForWrite(void) { } size_t USBCDC::write(const uint8_t *buffer, size_t size) { - if (itf >= MAX_USB_CDC_DEVICES || tx_lock == NULL || buffer == NULL || size == 0 || !tud_cdc_n_connected(itf)) { + if (itf >= CFG_TUD_CDC || tx_lock == NULL || buffer == NULL || size == 0 || !tud_cdc_n_connected(itf)) { return 0; } if (xPortInIsrContext()) { @@ -415,6 +446,9 @@ uint32_t USBCDC::baudRate() { } void USBCDC::setDebugOutput(bool en) { + if (itf) { + return; + } if (en) { uartSetDebug(NULL); ets_install_putc2((void (*)(char)) & cdc0_write_char); @@ -424,7 +458,7 @@ void USBCDC::setDebugOutput(bool en) { } USBCDC::operator bool() const { - if (itf >= MAX_USB_CDC_DEVICES) { + if (itf >= CFG_TUD_CDC) { return false; } return connected; diff --git a/cores/esp32/esp32-hal-tinyusb.c b/cores/esp32/esp32-hal-tinyusb.c index f83e8b61bd2..0991e08d27f 100644 --- a/cores/esp32/esp32-hal-tinyusb.c +++ b/cores/esp32/esp32-hal-tinyusb.c @@ -616,7 +616,7 @@ void usb_persist_restart(restart_type_t mode) { } static bool tinyusb_reserve_in_endpoint(uint8_t endpoint) { - if (endpoint > 6 || (tinyusb_endpoints.in & BIT(endpoint)) != 0) { + if (endpoint > CFG_TUD_NUM_EPS || (tinyusb_endpoints.in & BIT(endpoint)) != 0) { return false; } tinyusb_endpoints.in |= BIT(endpoint); @@ -624,7 +624,7 @@ static bool tinyusb_reserve_in_endpoint(uint8_t endpoint) { } static bool tinyusb_reserve_out_endpoint(uint8_t endpoint) { - if (endpoint > 6 || (tinyusb_endpoints.out & BIT(endpoint)) != 0) { + if (endpoint > CFG_TUD_NUM_EPS || (tinyusb_endpoints.out & BIT(endpoint)) != 0) { return false; } tinyusb_endpoints.out |= BIT(endpoint); @@ -632,11 +632,13 @@ static bool tinyusb_reserve_out_endpoint(uint8_t endpoint) { } static bool tinyusb_has_available_fifos(void) { - uint8_t max_endpoints = 4, active_endpoints = 0; + uint8_t max_endpoints = CFG_TUD_NUM_IN_EPS - 1, active_endpoints = 0; +#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 if (tinyusb_loaded_interfaces_mask & BIT(USB_INTERFACE_CDC)) { - max_endpoints = 5; //CDC endpoint 0x85 is actually not linked to FIFO and not used + max_endpoints = CFG_TUD_NUM_IN_EPS; //CDC endpoint 0x85 is actually not linked to FIFO and not used } - for (uint8_t i = 1; i < 7; i++) { +#endif + for (uint8_t i = 1; i <= CFG_TUD_NUM_EPS; i++) { if ((tinyusb_endpoints.in & BIT(i)) != 0) { active_endpoints++; } @@ -771,7 +773,7 @@ static void usb_device_task(void *param) { * PUBLIC API * */ #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_ERROR -const char *tinyusb_interface_names[USB_INTERFACE_MAX] = {"MSC", "DFU", "HID", "VENDOR", "CDC", "MIDI", "CUSTOM"}; +const char *tinyusb_interface_names[USB_INTERFACE_MAX] = {"MSC", "DFU", "HID", "VENDOR", "CDC", "CDC2", "MIDI", "CUSTOM"}; #endif static bool tinyusb_is_initialized = false; @@ -862,7 +864,7 @@ uint8_t tinyusb_get_free_duplex_endpoint(void) { log_e("No available IN endpoints"); return 0; } - for (uint8_t i = 1; i < 7; i++) { + for (uint8_t i = 1; i <= CFG_TUD_NUM_IN_EPS; i++) { if ((tinyusb_endpoints.in & BIT(i)) == 0 && (tinyusb_endpoints.out & BIT(i)) == 0) { tinyusb_endpoints.in |= BIT(i); tinyusb_endpoints.out |= BIT(i); @@ -878,13 +880,13 @@ uint8_t tinyusb_get_free_in_endpoint(void) { log_e("No available IN endpoints"); return 0; } - for (uint8_t i = 1; i < 7; i++) { + for (uint8_t i = 1; i <= CFG_TUD_NUM_IN_EPS; i++) { if ((tinyusb_endpoints.in & BIT(i)) == 0 && (tinyusb_endpoints.out & BIT(i)) != 0) { tinyusb_endpoints.in |= BIT(i); return i; } } - for (uint8_t i = 1; i < 7; i++) { + for (uint8_t i = 1; i <= CFG_TUD_NUM_IN_EPS; i++) { if ((tinyusb_endpoints.in & BIT(i)) == 0) { tinyusb_endpoints.in |= BIT(i); return i; @@ -894,13 +896,13 @@ uint8_t tinyusb_get_free_in_endpoint(void) { } uint8_t tinyusb_get_free_out_endpoint(void) { - for (uint8_t i = 1; i < 7; i++) { + for (uint8_t i = 1; i <= CFG_TUD_NUM_EPS; i++) { if ((tinyusb_endpoints.out & BIT(i)) == 0 && (tinyusb_endpoints.in & BIT(i)) != 0) { tinyusb_endpoints.out |= BIT(i); return i; } } - for (uint8_t i = 1; i < 7; i++) { + for (uint8_t i = 1; i <= CFG_TUD_NUM_EPS; i++) { if ((tinyusb_endpoints.out & BIT(i)) == 0) { tinyusb_endpoints.out |= BIT(i); return i; diff --git a/cores/esp32/esp32-hal-tinyusb.h b/cores/esp32/esp32-hal-tinyusb.h index 0b42760e69f..73210c4872b 100644 --- a/cores/esp32/esp32-hal-tinyusb.h +++ b/cores/esp32/esp32-hal-tinyusb.h @@ -38,6 +38,13 @@ extern "C" { #define CFG_TUD_ENDOINT_SIZE 64 #endif #endif +#if CONFIG_IDF_TARGET_ESP32P4 +#define CFG_TUD_NUM_EPS 15 +#define CFG_TUD_NUM_IN_EPS 8 +#else +#define CFG_TUD_NUM_EPS 6 +#define CFG_TUD_NUM_IN_EPS 5 +#endif typedef struct { uint16_t vid; @@ -88,6 +95,7 @@ typedef enum { USB_INTERFACE_HID, USB_INTERFACE_VENDOR, USB_INTERFACE_CDC, + USB_INTERFACE_CDC2, USB_INTERFACE_MIDI, USB_INTERFACE_CUSTOM, USB_INTERFACE_MAX From 6c3a49cac7815a160fe70da07bac66e56b6ef547 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:01:13 +0200 Subject: [PATCH 172/183] build(deps): bump cryptography from 43.0.1 to 44.0.1 in /tests (#10961) Bumps [cryptography](https://github.com/pyca/cryptography) from 43.0.1 to 44.0.1. - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/43.0.1...44.0.1) --- updated-dependencies: - dependency-name: cryptography dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/requirements.txt b/tests/requirements.txt index cef0bf17881..c98c032a3ae 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,4 +1,4 @@ -cryptography==43.0.1 +cryptography==44.0.1 --only-binary cryptography pytest-cov==5.0.0 pytest-embedded-serial-esp==1.12.0 From 83abca1604d6118269f04228f57e93f493241e0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 13 Feb 2025 12:02:35 +0100 Subject: [PATCH 173/183] feat(zigbee): Add OTA client cluster support (#10946) * feat(zigbee): Add OTA client cluster support * feat(zigbee): Add conditions to reject OTA upgrade * feat(zigbee): Add newest version of OTA handler * fix(zigbee): Fix errors and warnings, swap parameters order * feat(zigbee): Add simple OTA Client example * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../examples/Zigbee_OTA_Client/README.md | 68 ++++++ .../Zigbee_OTA_Client/Zigbee_OTA_Client.ino | 112 ++++++++++ .../Zigbee/examples/Zigbee_OTA_Client/ci.json | 6 + libraries/Zigbee/src/ZigbeeEP.cpp | 68 ++++++ libraries/Zigbee/src/ZigbeeEP.h | 23 +- libraries/Zigbee/src/ZigbeeHandlers.cpp | 205 ++++++++++++++++-- 6 files changed, 465 insertions(+), 17 deletions(-) create mode 100644 libraries/Zigbee/examples/Zigbee_OTA_Client/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_OTA_Client/Zigbee_OTA_Client.ino create mode 100644 libraries/Zigbee/examples/Zigbee_OTA_Client/ci.json diff --git a/libraries/Zigbee/examples/Zigbee_OTA_Client/README.md b/libraries/Zigbee/examples/Zigbee_OTA_Client/README.md new file mode 100644 index 00000000000..143ff946f28 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_OTA_Client/README.md @@ -0,0 +1,68 @@ +# Arduino-ESP32 Zigbee OTA Client + on/off light Example + +This example shows how to configure the Zigbee end device with OTA Client and use it as a Home Automation (HA) on/off light. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## Hardware Required + +* A USB cable for power supply and programming + +### Configure the Project + +Set the LED GPIO by changing the `LED_PIN` definition. By default, the LED_PIN is `RGB_BUILTIN`. +By default, the `rgbLedWrite` function is used to control the LED. You can change it to digitalWrite to control a simple LED. + +#### Using Arduino IDE + +To get more information about the Espressif boards see [Espressif Development Kits](https://www.espressif.com/en/products/devkits). + +* Before Compile/Verify, select the correct board: `Tools -> Board`. +* Select the End device Zigbee mode: `Tools -> Zigbee mode: Zigbee ED (end device)` +* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee 4MB with spiffs` +* Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. +* Optional: Set debug level to verbose to see all logs from Zigbee stack: `Tools -> Core Debug Level: Verbose`. + +## Troubleshooting + +If the End device flashed with this example is not connecting to the coordinator, erase the flash of the End device before flashing the example to the board. It is recommended to do this if you re-flash the coordinator. +You can do the following: + +* In the Arduino IDE go to the Tools menu and set `Erase All Flash Before Sketch Upload` to `Enabled`. +* Add to the sketch `Zigbee.factoryReset();` to reset the device and Zigbee stack. + +By default, the coordinator network is closed after rebooting or flashing new firmware. +To open the network you have 2 options: + +* Open network after reboot by setting `Zigbee.setRebootOpenNetwork(time);` before calling `Zigbee.begin();`. +* In application you can anytime call `Zigbee.openNetwork(time);` to open the network for devices to join. + + +***Important: Make sure you are using a good quality USB cable and that you have a reliable power source*** + +* **LED not blinking:** Check the wiring connection and the IO selection. +* **Programming Fail:** If the programming/flash procedure fails, try reducing the serial connection speed. +* **COM port not detected:** Check the USB cable and the USB to Serial driver installation. + +If the error persists, you can ask for help at the official [ESP32 forum](https://esp32.com) or see [Contribute](#contribute). + +## Contribute + +To know how to contribute to this project, see [How to contribute.](https://github.com/espressif/arduino-esp32/blob/master/CONTRIBUTING.rst) + +If you have any **feedback** or **issue** to report on this example/library, please open an issue or fix it by creating a new PR. Contributions are more than welcome! + +Before creating a new issue, be sure to try Troubleshooting and check if the same issue was already created by someone else. + +## Resources + +* Official ESP32 Forum: [Link](https://esp32.com) +* Arduino-ESP32 Official Repository: [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) +* ESP32-C6 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf) +* ESP32-H2 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf) +* Official ESP-IDF documentation: [ESP-IDF](https://idf.espressif.com) diff --git a/libraries/Zigbee/examples/Zigbee_OTA_Client/Zigbee_OTA_Client.ino b/libraries/Zigbee/examples/Zigbee_OTA_Client/Zigbee_OTA_Client.ino new file mode 100644 index 00000000000..29d114014b4 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_OTA_Client/Zigbee_OTA_Client.ino @@ -0,0 +1,112 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @brief This example demonstrates OTA support on light bulb. + * + * The example demonstrates how to use Zigbee library to create a end device light bulb with OTA support. + * The light bulb is a Zigbee end device, which is controlled by a Zigbee coordinator. + * + * Proper Zigbee mode must be selected in Tools->Zigbee mode + * and also the correct partition scheme must be selected in Tools->Partition Scheme. + * + * Please check the README.md for instructions and more detailed description. + * + * Created by Jan Procházka (https://github.com/P-R-O-C-H-Y/) + */ + +#ifndef ZIGBEE_MODE_ED +#error "Zigbee end device mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +/* Zigbee light bulb configuration */ +#define ZIGBEE_LIGHT_ENDPOINT 1 +uint8_t led = RGB_BUILTIN; +uint8_t button = BOOT_PIN; + +/* Zigbee OTA configuration */ +#define OTA_UPGRADE_RUNNING_FILE_VERSION 0x01010100 // Increment this value when the running image is updated +#define OTA_UPGRADE_DOWNLOADED_FILE_VERSION 0x01010101 // Increment this value when the downloaded image is updated +#define OTA_UPGRADE_HW_VERSION 0x0101 // The hardware version, this can be used to differentiate between different hardware versions + +ZigbeeLight zbLight = ZigbeeLight(ZIGBEE_LIGHT_ENDPOINT); + +/********************* RGB LED functions **************************/ +void setLED(bool value) { + digitalWrite(led, value); +} + +/********************* Arduino functions **************************/ +void setup() { + Serial.begin(115200); + + // Init LED and turn it OFF (if LED_PIN == RGB_BUILTIN, the rgbLedWrite() will be used under the hood) + pinMode(led, OUTPUT); + digitalWrite(led, LOW); + + // Init button for factory reset + pinMode(button, INPUT_PULLUP); + + // Optional: set Zigbee device name and model + zbLight.setManufacturerAndModel("Espressif", "ZBLightBulb"); + + // Set callback function for light change + zbLight.onLightChange(setLED); + + // Add OTA client to the light bulb + zbLight.addOTAClient(OTA_UPGRADE_RUNNING_FILE_VERSION, OTA_UPGRADE_DOWNLOADED_FILE_VERSION, OTA_UPGRADE_HW_VERSION); + + // Add endpoint to Zigbee Core + Serial.println("Adding ZigbeeLight endpoint to Zigbee Core"); + Zigbee.addEndpoint(&zbLight); + + // When all EPs are registered, start Zigbee. By default acts as ZIGBEE_END_DEVICE + if (!Zigbee.begin()) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) { + Serial.print("."); + delay(100); + } + Serial.println(); + + // Start Zigbee OTA client query, first request is within a minute and the next requests are sent every hour automatically + zbLight.requestOTAUpdate(); +} + +void loop() { + // Checking button for factory reset + if (digitalRead(button) == LOW) { // Push button pressed + // Key debounce handling + delay(100); + int startTime = millis(); + while (digitalRead(button) == LOW) { + delay(50); + if ((millis() - startTime) > 3000) { + // If key pressed for more than 3secs, factory reset Zigbee and reboot + Serial.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); + Zigbee.factoryReset(); + } + } + // Toggle light by pressing the button + zbLight.setLight(!zbLight.getLightState()); + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_OTA_Client/ci.json b/libraries/Zigbee/examples/Zigbee_OTA_Client/ci.json new file mode 100644 index 00000000000..7b7ccef8ed7 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_OTA_Client/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y" + ] +} diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index 6a2ace0b90c..f3f890393eb 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -363,4 +363,72 @@ void ZigbeeEP::zbReadTimeCluster(const esp_zb_zcl_attribute_t *attribute) { } } +// typedef struct esp_zb_ota_cluster_cfg_s { +// uint32_t ota_upgrade_file_version; /*!< The attribute indicates the file version of the running firmware image on the device */ +// uint16_t ota_upgrade_manufacturer; /*!< The attribute indicates the value for the manufacturer of the device */ +// uint16_t ota_upgrade_image_type; /*!< The attribute indicates the the image type of the file that the client is currently downloading */ +// uint32_t ota_upgrade_downloaded_file_ver; /*!< The attribute indicates the file version of the downloaded image on the device*/ +// esp_zb_ota_cluster_cfg_t; + +// typedef struct esp_zb_zcl_ota_upgrade_client_variable_s { +// uint16_t timer_query; /*!< The field indicates the time of querying OTA image for OTA upgrade client */ +// uint16_t hw_version; /*!< The hardware version */ +// uint8_t max_data_size; /*!< The maximum size of OTA data */ +// } esp_zb_zcl_ota_upgrade_client_variable_t; + +void ZigbeeEP::addOTAClient( + uint32_t file_version, uint32_t downloaded_file_ver, uint16_t hw_version, uint16_t manufacturer, uint16_t image_type, uint8_t max_data_size +) { + + esp_zb_ota_cluster_cfg_t ota_cluster_cfg = {}; + ota_cluster_cfg.ota_upgrade_file_version = file_version; //OTA_UPGRADE_RUNNING_FILE_VERSION; + ota_cluster_cfg.ota_upgrade_downloaded_file_ver = downloaded_file_ver; //OTA_UPGRADE_DOWNLOADED_FILE_VERSION; + ota_cluster_cfg.ota_upgrade_manufacturer = manufacturer; //OTA_UPGRADE_MANUFACTURER; + ota_cluster_cfg.ota_upgrade_image_type = image_type; //OTA_UPGRADE_IMAGE_TYPE; + + esp_zb_attribute_list_t *ota_cluster = esp_zb_ota_cluster_create(&ota_cluster_cfg); + + esp_zb_zcl_ota_upgrade_client_variable_t variable_config = {}; + variable_config.timer_query = ESP_ZB_ZCL_OTA_UPGRADE_QUERY_TIMER_COUNT_DEF; + variable_config.hw_version = hw_version; //OTA_UPGRADE_HW_VERSION; + variable_config.max_data_size = max_data_size; //OTA_UPGRADE_MAX_DATA_SIZE; + + uint16_t ota_upgrade_server_addr = 0xffff; + uint8_t ota_upgrade_server_ep = 0xff; + + ESP_ERROR_CHECK(esp_zb_ota_cluster_add_attr(ota_cluster, ESP_ZB_ZCL_ATTR_OTA_UPGRADE_CLIENT_DATA_ID, (void *)&variable_config)); + ESP_ERROR_CHECK(esp_zb_ota_cluster_add_attr(ota_cluster, ESP_ZB_ZCL_ATTR_OTA_UPGRADE_SERVER_ADDR_ID, (void *)&ota_upgrade_server_addr)); + ESP_ERROR_CHECK(esp_zb_ota_cluster_add_attr(ota_cluster, ESP_ZB_ZCL_ATTR_OTA_UPGRADE_SERVER_ENDPOINT_ID, (void *)&ota_upgrade_server_ep)); + + ESP_ERROR_CHECK(esp_zb_cluster_list_add_ota_cluster(_cluster_list, ota_cluster, ESP_ZB_ZCL_CLUSTER_CLIENT_ROLE)); +} + +static void findOTAServer(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx) { + if (zdo_status == ESP_ZB_ZDP_STATUS_SUCCESS) { + esp_zb_ota_upgrade_client_query_interval_set(*((uint8_t *)user_ctx), OTA_UPGRADE_QUERY_INTERVAL); + esp_zb_ota_upgrade_client_query_image_req(addr, endpoint); + log_i("Query OTA upgrade from server endpoint: %d after %d seconds", endpoint, OTA_UPGRADE_QUERY_INTERVAL); + } else { + log_w("No OTA Server found"); + } +} + +void ZigbeeEP::requestOTAUpdate() { + esp_zb_zdo_match_desc_req_param_t req; + uint16_t cluster_list[] = {ESP_ZB_ZCL_CLUSTER_ID_OTA_UPGRADE}; + + /* Match the OTA server of coordinator */ + req.addr_of_interest = 0x0000; + req.dst_nwk_addr = 0x0000; + req.num_in_clusters = 1; + req.num_out_clusters = 0; + req.profile_id = ESP_ZB_AF_HA_PROFILE_ID; + req.cluster_list = cluster_list; + esp_zb_lock_acquire(portMAX_DELAY); + if (esp_zb_bdb_dev_joined()) { + esp_zb_zdo_match_cluster(&req, findOTAServer, &_endpoint); + } + esp_zb_lock_release(); +} + #endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index 584873f50dd..72cde275293 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -8,7 +8,8 @@ #include /* Useful defines */ -#define ZB_CMD_TIMEOUT 10000 // 10 seconds +#define ZB_CMD_TIMEOUT 10000 // 10 seconds +#define OTA_UPGRADE_QUERY_INTERVAL (1 * 60) // 1 hour = 60 minutes #define ZB_ARRAY_LENTH(arr) (sizeof(arr) / sizeof(arr[0])) #define XYZ_TO_RGB(X, Y, Z, r, g, b) \ @@ -107,6 +108,26 @@ class ZigbeeEP { return _allow_multiple_binding; } + // OTA methods + /** + * @brief Add OTA client to the Zigbee endpoint. + * + * @param file_version The current file version of the OTA client. + * @param downloaded_file_ver The version of the downloaded file. + * @param hw_version The hardware version of the device. + * @param manufacturer The manufacturer code (default: 0x1001). + * @param image_type The image type code (default: 0x1011). + * @param max_data_size The maximum data size for OTA transfer (default and recommended: 223). + */ + void addOTAClient( + uint32_t file_version, uint32_t downloaded_file_ver, uint16_t hw_version, uint16_t manufacturer = 0x1001, uint16_t image_type = 0x1011, + uint8_t max_data_size = 223 + ); + /** + * @brief Request OTA update from the server, first request is within a minute and the next requests are sent every hour automatically. + */ + void requestOTAUpdate(); + // findEndpoind may be implemented by EPs to find and bind devices virtual void findEndpoint(esp_zb_zdo_match_desc_req_param_t *cmd_req) {}; diff --git a/libraries/Zigbee/src/ZigbeeHandlers.cpp b/libraries/Zigbee/src/ZigbeeHandlers.cpp index 575b25ef404..3af1b6c52aa 100644 --- a/libraries/Zigbee/src/ZigbeeHandlers.cpp +++ b/libraries/Zigbee/src/ZigbeeHandlers.cpp @@ -4,6 +4,26 @@ #if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#include "esp_ota_ops.h" +#if CONFIG_ZB_DELTA_OTA // Delta OTA, code is prepared for this feature but not enabled by default +#include "esp_delta_ota_ops.h" +#endif + +//OTA Upgrade defines and variables +#define OTA_ELEMENT_HEADER_LEN 6 /* OTA element format header size include tag identifier and length field */ + +/** + * @name Enumeration for the tag identifier denotes the type and format of the data within the element + * @anchor esp_ota_element_tag_id_t + */ +typedef enum esp_ota_element_tag_id_e { + UPGRADE_IMAGE = 0x0000, /*!< Upgrade image */ +} esp_ota_element_tag_id_t; + +static const esp_partition_t *s_ota_partition = NULL; +static esp_ota_handle_t s_ota_handle = 0; +static bool s_tagid_received = false; + // forward declaration of all implemented handlers static esp_err_t zb_attribute_set_handler(const esp_zb_zcl_set_attr_value_message_t *message); static esp_err_t zb_attribute_reporting_handler(const esp_zb_zcl_report_attr_message_t *message); @@ -13,6 +33,8 @@ static esp_err_t zb_cmd_ias_zone_status_change_handler(const esp_zb_zcl_ias_zone static esp_err_t zb_cmd_ias_zone_enroll_response_handler(const esp_zb_zcl_ias_zone_enroll_response_message_t *message); static esp_err_t zb_cmd_default_resp_handler(const esp_zb_zcl_cmd_default_resp_message_t *message); static esp_err_t zb_window_covering_movement_resp_handler(const esp_zb_zcl_window_covering_movement_message_t *message); +static esp_err_t zb_ota_upgrade_status_handler(const esp_zb_zcl_ota_upgrade_value_message_t *message); +static esp_err_t zb_ota_upgrade_query_image_resp_handler(const esp_zb_zcl_ota_upgrade_query_image_resp_message_t *message); // Zigbee action handlers [[maybe_unused]] @@ -32,6 +54,10 @@ static esp_err_t zb_action_handler(esp_zb_core_action_callback_id_t callback_id, case ESP_ZB_CORE_WINDOW_COVERING_MOVEMENT_CB_ID: ret = zb_window_covering_movement_resp_handler((esp_zb_zcl_window_covering_movement_message_t *)message); break; + case ESP_ZB_CORE_OTA_UPGRADE_VALUE_CB_ID: ret = zb_ota_upgrade_status_handler((esp_zb_zcl_ota_upgrade_value_message_t *)message); break; + case ESP_ZB_CORE_OTA_UPGRADE_QUERY_IMAGE_RESP_CB_ID: + ret = zb_ota_upgrade_query_image_resp_handler((esp_zb_zcl_ota_upgrade_query_image_resp_message_t *)message); + break; case ESP_ZB_CORE_CMD_DEFAULT_RESP_CB_ID: ret = zb_cmd_default_resp_handler((esp_zb_zcl_cmd_default_resp_message_t *)message); break; default: log_w("Receive unhandled Zigbee action(0x%x) callback", callback_id); break; } @@ -186,22 +212,6 @@ static esp_err_t zb_cmd_ias_zone_enroll_response_handler(const esp_zb_zcl_ias_zo return ESP_OK; } -static esp_err_t zb_cmd_default_resp_handler(const esp_zb_zcl_cmd_default_resp_message_t *message) { - if (!message) { - log_e("Empty message"); - return ESP_FAIL; - } - if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) { - log_e("Received message: error status(%d)", message->info.status); - return ESP_ERR_INVALID_ARG; - } - log_v( - "Received default response: from address(0x%x), src_endpoint(%d) to dst_endpoint(%d), cluster(0x%x) with status 0x%x", - message->info.src_address.u.short_addr, message->info.src_endpoint, message->info.dst_endpoint, message->info.cluster, message->status_code - ); - return ESP_OK; -} - static esp_err_t zb_window_covering_movement_resp_handler(const esp_zb_zcl_window_covering_movement_message_t *message) { if (!message) { log_e("Empty message"); @@ -224,4 +234,167 @@ static esp_err_t zb_window_covering_movement_resp_handler(const esp_zb_zcl_windo return ESP_OK; } +static esp_err_t esp_element_ota_data(uint32_t total_size, const void *payload, uint16_t payload_size, void **outbuf, uint16_t *outlen) { + static uint16_t tagid = 0; + void *data_buf = NULL; + uint16_t data_len; + + if (!s_tagid_received) { + uint32_t length = 0; + if (!payload || payload_size <= OTA_ELEMENT_HEADER_LEN) { + log_e("Invalid element format"); + return ESP_ERR_INVALID_ARG; + } + + const uint8_t *payload_ptr = (const uint8_t *)payload; + tagid = *(const uint16_t *)payload_ptr; + length = *(const uint32_t *)(payload_ptr + sizeof(tagid)); + if ((length + OTA_ELEMENT_HEADER_LEN) != total_size) { + log_e("Invalid element length [%ld/%ld]", length, total_size); + return ESP_ERR_INVALID_ARG; + } + + s_tagid_received = true; + + data_buf = (void *)(payload_ptr + OTA_ELEMENT_HEADER_LEN); + data_len = payload_size - OTA_ELEMENT_HEADER_LEN; + } else { + data_buf = (void *)payload; + data_len = payload_size; + } + + switch (tagid) { + case UPGRADE_IMAGE: + *outbuf = data_buf; + *outlen = data_len; + break; + default: + log_e("Unsupported element tag identifier %d", tagid); + return ESP_ERR_INVALID_ARG; + break; + } + + return ESP_OK; +} + +static esp_err_t zb_ota_upgrade_status_handler(const esp_zb_zcl_ota_upgrade_value_message_t *message) { + static uint32_t total_size = 0; + static uint32_t offset = 0; + [[maybe_unused]] + static int64_t start_time = 0; + esp_err_t ret = ESP_OK; + + if (message->info.status == ESP_ZB_ZCL_STATUS_SUCCESS) { + switch (message->upgrade_status) { + case ESP_ZB_ZCL_OTA_UPGRADE_STATUS_START: + log_i("Zigbee - OTA upgrade start"); + start_time = esp_timer_get_time(); + s_ota_partition = esp_ota_get_next_update_partition(NULL); + assert(s_ota_partition); +#if CONFIG_ZB_DELTA_OTA + ret = esp_delta_ota_begin(s_ota_partition, 0, &s_ota_handle); +#else + ret = esp_ota_begin(s_ota_partition, 0, &s_ota_handle); +#endif + if (ret != ESP_OK) { + log_e("Zigbee - Failed to begin OTA partition, status: %s", esp_err_to_name(ret)); + return ret; + } + break; + case ESP_ZB_ZCL_OTA_UPGRADE_STATUS_RECEIVE: + total_size = message->ota_header.image_size; + offset += message->payload_size; + log_i("Zigbee - OTA Client receives data: progress [%ld/%ld]", offset, total_size); + if (message->payload_size && message->payload) { + uint16_t payload_size = 0; + void *payload = NULL; + ret = esp_element_ota_data(total_size, message->payload, message->payload_size, &payload, &payload_size); + if (ret != ESP_OK) { + log_e("Zigbee - Failed to element OTA data, status: %s", esp_err_to_name(ret)); + return ret; + } +#if CONFIG_ZB_DELTA_OTA + ret = esp_delta_ota_write(s_ota_handle, payload, payload_size); +#else + ret = esp_ota_write(s_ota_handle, (const void *)payload, payload_size); +#endif + if (ret != ESP_OK) { + log_e("Zigbee - Failed to write OTA data to partition, status: %s", esp_err_to_name(ret)); + return ret; + } + } + break; + case ESP_ZB_ZCL_OTA_UPGRADE_STATUS_APPLY: log_i("Zigbee - OTA upgrade apply"); break; + case ESP_ZB_ZCL_OTA_UPGRADE_STATUS_CHECK: + ret = offset == total_size ? ESP_OK : ESP_FAIL; + offset = 0; + total_size = 0; + s_tagid_received = false; + log_i("Zigbee - OTA upgrade check status: %s", esp_err_to_name(ret)); + break; + case ESP_ZB_ZCL_OTA_UPGRADE_STATUS_FINISH: + log_i("Zigbee - OTA Finish"); + log_i( + "Zigbee - OTA Information: version: 0x%lx, manufacturer code: 0x%x, image type: 0x%x, total size: %ld bytes, cost time: %lld ms,", + message->ota_header.file_version, message->ota_header.manufacturer_code, message->ota_header.image_type, message->ota_header.image_size, + (esp_timer_get_time() - start_time) / 1000 + ); +#if CONFIG_ZB_DELTA_OTA + ret = esp_delta_ota_end(s_ota_handle); +#else + ret = esp_ota_end(s_ota_handle); +#endif + if (ret != ESP_OK) { + log_e("Zigbee - Failed to end OTA partition, status: %s", esp_err_to_name(ret)); + return ret; + } + ret = esp_ota_set_boot_partition(s_ota_partition); + if (ret != ESP_OK) { + log_e("Zigbee - Failed to set OTA boot partition, status: %s", esp_err_to_name(ret)); + return ret; + } + log_w("Zigbee - Prepare to restart system"); + esp_restart(); + break; + default: log_i("Zigbee - OTA status: %d", message->upgrade_status); break; + } + } + return ret; +} + +static esp_err_t zb_ota_upgrade_query_image_resp_handler(const esp_zb_zcl_ota_upgrade_query_image_resp_message_t *message) { + if (message->info.status == ESP_ZB_ZCL_STATUS_SUCCESS) { + log_i("Zigbee - Queried OTA image from address: 0x%04hx, endpoint: %d", message->server_addr.u.short_addr, message->server_endpoint); + log_i("Zigbee - Image version: 0x%lx, manufacturer code: 0x%x, image size: %ld", message->file_version, message->manufacturer_code, message->image_size); + if (message->image_size == 0) { + log_i("Zigbee - Rejecting OTA image upgrade, image size is 0"); + return ESP_FAIL; + } + if (message->file_version == 0) { + log_i("Zigbee - Rejecting OTA image upgrade, file version is 0"); + return ESP_FAIL; + } + log_i("Zigbee - Approving OTA image upgrade"); + } else { + log_i("Zigbee - OTA image upgrade response status: 0x%x", message->info.status); + } + return ESP_OK; +} + +static esp_err_t zb_cmd_default_resp_handler(const esp_zb_zcl_cmd_default_resp_message_t *message) { + if (!message) { + log_e("Empty message"); + return ESP_FAIL; + } + if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Received message: error status(%d)", message->info.status); + return ESP_ERR_INVALID_ARG; + } + log_v( + "Received default response: from address(0x%x), src_endpoint(%d) to dst_endpoint(%d), cluster(0x%x) with status 0x%x", + message->info.src_address.u.short_addr, message->info.src_endpoint, message->info.dst_endpoint, message->info.cluster, message->status_code + ); + return ESP_OK; +} + #endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED From 7f8c77f9ee7cfac433ef21304c7abf01cf2b86a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 13 Feb 2025 12:03:02 +0100 Subject: [PATCH 174/183] feat(zigbee): Add vibration sensor endpoint (#10944) --- CMakeLists.txt | 1 + .../Zigbee_Vibration_Sensor/README.md | 58 ++++++++++ .../Zigbee_Vibration_Sensor.ino | 104 ++++++++++++++++++ .../examples/Zigbee_Vibration_Sensor/ci.json | 6 + libraries/Zigbee/src/Zigbee.h | 1 + .../Zigbee/src/ep/ZigbeeVibrationSensor.cpp | 86 +++++++++++++++ .../Zigbee/src/ep/ZigbeeVibrationSensor.h | 64 +++++++++++ 7 files changed, 320 insertions(+) create mode 100644 libraries/Zigbee/examples/Zigbee_Vibration_Sensor/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Vibration_Sensor/Zigbee_Vibration_Sensor.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Vibration_Sensor/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeVibrationSensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 40567d1b45c..5ee4ce664ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -293,6 +293,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp + libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp ) set(ARDUINO_LIBRARY_BLE_SRCS diff --git a/libraries/Zigbee/examples/Zigbee_Vibration_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_Vibration_Sensor/README.md new file mode 100644 index 00000000000..b0e5b5f09e8 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Vibration_Sensor/README.md @@ -0,0 +1,58 @@ +# Arduino-ESP32 Zigbee Vibration Sensor Example + +This example shows how to configure the Zigbee end device and use it as a Home Automation (HA) vibration sensor (IAS Zone), +that can be used for example as a security device which is sensing a vibrations. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## Hardware Required + +* A USB cable for power supply and programming + +### Configure the Project + +Set the Button GPIO by changing the `button` variable. By default, it's the pin `BOOT_PIN` (BOOT button on ESP32-C6 and ESP32-H2). +Set the Sensor GPIO by changing the `sensor_pin` variable. + +#### Using Arduino IDE + +To get more information about the Espressif boards see [Espressif Development Kits](https://www.espressif.com/en/products/devkits). + +* Before Compile/Verify, select the correct board: `Tools -> Board`. +* Select the End device Zigbee mode: `Tools -> Zigbee mode: Zigbee ED (end device)` +* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee 4MB with spiffs` +* Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. +* Optional: Set debug level to verbose to see all logs from Zigbee stack: `Tools -> Core Debug Level: Verbose`. + +## Troubleshooting + +If the End device flashed with this example is not connecting to the coordinator, erase the flash of the End device before flashing the example to the board. + +***Important: Make sure you are using a good quality USB cable and that you have a reliable power source*** + +* **LED not blinking:** Check the wiring connection and the IO selection. +* **Programming Fail:** If the programming/flash procedure fails, try reducing the serial connection speed. +* **COM port not detected:** Check the USB cable and the USB to Serial driver installation. + +If the error persists, you can ask for help at the official [ESP32 forum](https://esp32.com) or see [Contribute](#contribute). + +## Contribute + +To know how to contribute to this project, see [How to contribute.](https://github.com/espressif/arduino-esp32/blob/master/CONTRIBUTING.rst) + +If you have any **feedback** or **issue** to report on this example/library, please open an issue or fix it by creating a new PR. Contributions are more than welcome! + +Before creating a new issue, be sure to try Troubleshooting and check if the same issue was already created by someone else. + +## Resources + +* Official ESP32 Forum: [Link](https://esp32.com) +* Arduino-ESP32 Official Repository: [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) +* ESP32-C6 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf) +* ESP32-H2 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf) +* Official ESP-IDF documentation: [ESP-IDF](https://idf.espressif.com) diff --git a/libraries/Zigbee/examples/Zigbee_Vibration_Sensor/Zigbee_Vibration_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Vibration_Sensor/Zigbee_Vibration_Sensor.ino new file mode 100644 index 00000000000..d9ac7b6e241 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Vibration_Sensor/Zigbee_Vibration_Sensor.ino @@ -0,0 +1,104 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @brief This example demonstrates Zigbee vibration sensor (IAS Zone). + * + * The example demonstrates how to use Zigbee library to create a end device vibration sensor. + * The vibration sensor is a Zigbee end device, which is reporting data to the Zigbee network. + * + * Proper Zigbee mode must be selected in Tools->Zigbee mode + * and also the correct partition scheme must be selected in Tools->Partition Scheme. + * + * Please check the README.md for instructions and more detailed description. + * + * Created by Jan Procházka (https://github.com/P-R-O-C-H-Y/) + */ + +#ifndef ZIGBEE_MODE_ED +#error "Zigbee end device mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +/* Zigbee vibration sensor configuration */ +#define VIBRATION_SENSOR_ENDPOINT_NUMBER 10 +uint8_t button = BOOT_PIN; +uint8_t sensor_pin = 4; + +ZigbeeVibrationSensor zbVibrationSensor = ZigbeeVibrationSensor(VIBRATION_SENSOR_ENDPOINT_NUMBER); + +void setup() { + Serial.begin(115200); + + // Init button + sensor + pinMode(button, INPUT_PULLUP); + pinMode(sensor_pin, INPUT); + + // Optional: set Zigbee device name and model + zbVibrationSensor.setManufacturerAndModel("Espressif", "ZigbeeVibrationSensor"); + + // Add endpoint to Zigbee Core + Zigbee.addEndpoint(&zbVibrationSensor); + + Serial.println("Starting Zigbee..."); + // When all EPs are registered, start Zigbee in End Device mode + if (!Zigbee.begin()) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } else { + Serial.println("Zigbee started successfully!"); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) { + Serial.print("."); + delay(100); + } + Serial.println(); +} + +void loop() { + // Checking pin for contact change + static bool sensed = false; + if (digitalRead(sensor_pin) == HIGH && !sensed) { + // Update contact sensor value + zbVibrationSensor.setVibration(true); + sensed = true; + //if sensed, wait 2 seconds before next sensing + delay(2000); + } else if (digitalRead(sensor_pin) == LOW && sensed) { + zbVibrationSensor.setVibration(false); + sensed = false; + //if not sensed, wait 0,5 seconds before next sensing + delay(500); + } + + // Checking button for factory reset + if (digitalRead(button) == LOW) { // Push button pressed + // Key debounce handling + delay(100); + int startTime = millis(); + while (digitalRead(button) == LOW) { + delay(50); + if ((millis() - startTime) > 3000) { + // If key pressed for more than 3secs, factory reset Zigbee and reboot + Serial.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); + Zigbee.factoryReset(); + } + } + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_Vibration_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_Vibration_Sensor/ci.json new file mode 100644 index 00000000000..7b7ccef8ed7 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Vibration_Sensor/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y" + ] +} diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index 49bfa44d5c1..b785c28d0df 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -21,3 +21,4 @@ #include "ep/ZigbeeContactSwitch.h" #include "ep/ZigbeeDoorWindowHandle.h" #include "ep/ZigbeeWindowCovering.h" +#include "ep/ZigbeeVibrationSensor.h" diff --git a/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp new file mode 100644 index 00000000000..2f2172c89df --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp @@ -0,0 +1,86 @@ +#include "ZigbeeVibrationSensor.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +esp_zb_cluster_list_t *zigbee_vibration_sensor_clusters_create(zigbee_vibration_sensor_cfg_t *vibration_sensor) { + esp_zb_basic_cluster_cfg_t *basic_cfg = vibration_sensor ? &(vibration_sensor->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = vibration_sensor ? &(vibration_sensor->identify_cfg) : NULL; + esp_zb_ias_zone_cluster_cfg_t *ias_zone_cfg = vibration_sensor ? &(vibration_sensor->ias_zone_cfg) : NULL; + esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_ias_zone_cluster(cluster_list, esp_zb_ias_zone_cluster_create(ias_zone_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + return cluster_list; +} + +ZigbeeVibrationSensor::ZigbeeVibrationSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_IAS_ZONE_ID; + _zone_status = 0; + _zone_id = 0xff; + _ias_cie_endpoint = 1; + + //Create custom vibration sensor configuration + zigbee_vibration_sensor_cfg_t vibration_sensor_cfg = ZIGBEE_DEFAULT_VIBRATION_SENSOR_CONFIG(); + _cluster_list = zigbee_vibration_sensor_clusters_create(&vibration_sensor_cfg); + + _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_IAS_ZONE_ID, .app_device_version = 0}; +} + +void ZigbeeVibrationSensor::setIASClientEndpoint(uint8_t ep_number) { + _ias_cie_endpoint = ep_number; +} + +void ZigbeeVibrationSensor::setVibration(bool sensed) { + log_v("Setting Vibration sensor to %s", sensed ? "sensed" : "not sensed"); + uint8_t vibration = (uint8_t)sensed; + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_IAS_ZONE_ZONESTATUS_ID, &vibration, false + ); + esp_zb_lock_release(); + _zone_status = vibration; + report(); +} + +void ZigbeeVibrationSensor::report() { + /* Send IAS Zone status changed notification command */ + + esp_zb_zcl_ias_zone_status_change_notif_cmd_t status_change_notif_cmd; + status_change_notif_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + status_change_notif_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + status_change_notif_cmd.zcl_basic_cmd.dst_endpoint = _ias_cie_endpoint; //default is 1 + memcpy(status_change_notif_cmd.zcl_basic_cmd.dst_addr_u.addr_long, _ias_cie_addr, sizeof(esp_zb_ieee_addr_t)); + + status_change_notif_cmd.zone_status = _zone_status; + status_change_notif_cmd.extend_status = 0; + status_change_notif_cmd.zone_id = _zone_id; + status_change_notif_cmd.delay = 0; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_ias_zone_status_change_notif_cmd_req(&status_change_notif_cmd); + esp_zb_lock_release(); + log_v("IAS Zone status changed notification sent"); +} + +void ZigbeeVibrationSensor::zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) { + if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE) { + log_v("IAS Zone Enroll Response: zone id(%d), status(%d)", message->zone_id, message->response_code); + if (message->response_code == ESP_ZB_ZCL_IAS_ZONE_ENROLL_RESPONSE_CODE_SUCCESS) { + log_v("IAS Zone Enroll Response: success"); + esp_zb_lock_acquire(portMAX_DELAY); + memcpy( + _ias_cie_addr, + (*(esp_zb_ieee_addr_t *) + esp_zb_zcl_get_attribute(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_IAS_ZONE_IAS_CIE_ADDRESS_ID) + ->data_p), + sizeof(esp_zb_ieee_addr_t) + ); + esp_zb_lock_release(); + _zone_id = message->zone_id; + } + + } else { + log_w("Received message ignored. Cluster ID: %d not supported for On/Off Light", message->info.cluster); + } +} + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.h b/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.h new file mode 100644 index 00000000000..799cc943cdb --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.h @@ -0,0 +1,64 @@ +/* Class of Zigbee contact switch (IAS Zone) endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +// clang-format off +#define ZIGBEE_DEFAULT_VIBRATION_SENSOR_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .ias_zone_cfg = \ + { \ + .zone_state = ESP_ZB_ZCL_IAS_ZONE_ZONESTATE_NOT_ENROLLED, \ + .zone_type = ESP_ZB_ZCL_IAS_ZONE_ZONETYPE_VIBRATION_MOVEMENT, \ + .zone_status = 0, \ + .ias_cie_addr = ESP_ZB_ZCL_ZONE_IAS_CIE_ADDR_DEFAULT, \ + .zone_id = 0xff, \ + .zone_ctx = {0, 0, 0, 0}, \ + }, \ + } +// clang-format on + +typedef struct zigbee_vibration_sensor_cfg_s { + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_ias_zone_cluster_cfg_t ias_zone_cfg; +} zigbee_vibration_sensor_cfg_t; + +class ZigbeeVibrationSensor : public ZigbeeEP { +public: + ZigbeeVibrationSensor(uint8_t endpoint); + ~ZigbeeVibrationSensor() {} + + // Set the IAS Client endpoint number (default is 1) + void setIASClientEndpoint(uint8_t ep_number); + + // Set the vibration sensor value (true = sensed, false = not sensed) + void setVibration(bool sensed); + + // Report the vibration sensor value, done automatically after setting the sensed value + void report(); + +private: + void zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) override; + uint8_t _zone_status; + uint8_t _zone_id; + esp_zb_ieee_addr_t _ias_cie_addr; + uint8_t _ias_cie_endpoint; +}; + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED From 606a4049a22f33ed32d8e3242b8d7bac536e0c8c Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 13 Feb 2025 13:16:30 +0200 Subject: [PATCH 175/183] IDF release/v5.3 (#10873) * IDF release/v5.3 adf53196 * IDF release/v5.3 fb25eb02 * IDF release/v5.3 fb25eb02 * IDF release/v5.3 fb25eb02 * IDF release/v5.3 fb25eb02 * IDF release/v5.3 489d7a2b --- package/package_esp32_index.template.json | 68 +++++++++++------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index ad031a4d155..5d73debe76f 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -42,7 +42,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.3-cfea4f7c-v1" + "version": "idf-release_v5.3-489d7a2b-v1" }, { "packager": "esp32", @@ -95,63 +95,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.3-cfea4f7c-v1", + "version": "idf-release_v5.3-489d7a2b-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", - "size": "341118284" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", + "size": "341414090" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", - "size": "341118284" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", + "size": "341414090" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", - "size": "341118284" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", + "size": "341414090" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", - "size": "341118284" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", + "size": "341414090" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", - "size": "341118284" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", + "size": "341414090" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", - "size": "341118284" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", + "size": "341414090" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", - "size": "341118284" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", + "size": "341414090" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-cfea4f7c-v1.zip", - "checksum": "SHA-256:1099291229a9be453c771c5867b8487a0266db9246b672417337b8f511d7f820", - "size": "341118284" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.3/esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", + "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", + "size": "341414090" } ] }, From fb6b788b30d69e57995d36db5374645e4c2b4a38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 13 Feb 2025 12:34:30 +0100 Subject: [PATCH 176/183] feat(zigbee): Support HSV color commands for RGB light endpoint (#10959) * feat(zigbee): Support HSV color commands * ci(pre-commit): Apply automatic fixes * feat(zigbee): Add hue and sat attributes and update color capabilities * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Me No Dev Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- libraries/Zigbee/src/ZigbeeEP.h | 16 +-- .../src/ep/ZigbeeColorDimmableLight.cpp | 116 +++++++++--------- .../Zigbee/src/ep/ZigbeeColorDimmableLight.h | 60 +++++++-- .../Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp | 50 ++------ 4 files changed, 126 insertions(+), 116 deletions(-) diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index 72cde275293..3bdd7f22b23 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -6,27 +6,13 @@ #if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED #include +#include /* Useful defines */ #define ZB_CMD_TIMEOUT 10000 // 10 seconds #define OTA_UPGRADE_QUERY_INTERVAL (1 * 60) // 1 hour = 60 minutes #define ZB_ARRAY_LENTH(arr) (sizeof(arr) / sizeof(arr[0])) -#define XYZ_TO_RGB(X, Y, Z, r, g, b) \ - { \ - r = (float)(3.240479 * (X) - 1.537150 * (Y) - 0.498535 * (Z)); \ - g = (float)(-0.969256 * (X) + 1.875992 * (Y) + 0.041556 * (Z)); \ - b = (float)(0.055648 * (X) - 0.204043 * (Y) + 1.057311 * (Z)); \ - if (r > 1) { \ - r = 1; \ - } \ - if (g > 1) { \ - g = 1; \ - } \ - if (b > 1) { \ - b = 1; \ - } \ - } #define RGB_TO_XYZ(r, g, b, X, Y, Z) \ { \ diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp index f034daba54a..7ffd6976e1f 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp @@ -4,8 +4,17 @@ ZigbeeColorDimmableLight::ZigbeeColorDimmableLight(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_COLOR_DIMMABLE_LIGHT_DEVICE_ID; - esp_zb_color_dimmable_light_cfg_t light_cfg = ESP_ZB_DEFAULT_COLOR_DIMMABLE_LIGHT_CONFIG(); + esp_zb_color_dimmable_light_cfg_t light_cfg = ZIGBEE_DEFAULT_COLOR_DIMMABLE_LIGHT_CONFIG(); _cluster_list = esp_zb_color_dimmable_light_clusters_create(&light_cfg); + + //Add support for hue and saturation + uint8_t hue = 0; + uint8_t saturation = 0; + + esp_zb_attribute_list_t *color_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_color_control_cluster_add_attr(color_cluster, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_HUE_ID, &hue); + esp_zb_color_control_cluster_add_attr(color_cluster, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_SATURATION_ID, &saturation); + _ep_config = { .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_COLOR_DIMMABLE_LIGHT_DEVICE_ID, .app_device_version = 0 }; @@ -13,9 +22,7 @@ ZigbeeColorDimmableLight::ZigbeeColorDimmableLight(uint8_t endpoint) : ZigbeeEP( //set default values _current_state = false; _current_level = 255; - _current_red = 255; - _current_green = 255; - _current_blue = 255; + _current_color = {255, 255, 255}; } uint16_t ZigbeeColorDimmableLight::getCurrentColorX() { @@ -32,37 +39,18 @@ uint16_t ZigbeeColorDimmableLight::getCurrentColorY() { ->data_p); } -void ZigbeeColorDimmableLight::calculateRGB(uint16_t x, uint16_t y, uint8_t &red, uint8_t &green, uint8_t &blue) { - float r, g, b, color_x, color_y; - color_x = (float)x / 65535; - color_y = (float)y / 65535; - - float color_X = color_x / color_y; - float color_Z = (1 - color_x - color_y) / color_y; - - XYZ_TO_RGB(color_X, 1, color_Z, r, g, b); - - red = (uint8_t)(r * (float)255); - green = (uint8_t)(g * (float)255); - blue = (uint8_t)(b * (float)255); +uint8_t ZigbeeColorDimmableLight::getCurrentColorHue() { + return (*(uint8_t *)esp_zb_zcl_get_attribute( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_HUE_ID + ) + ->data_p); } -void ZigbeeColorDimmableLight::calculateXY(uint8_t red, uint8_t green, uint8_t blue, uint16_t &x, uint16_t &y) { - // Convert RGB to XYZ - float r = (float)red / 255.0f; - float g = (float)green / 255.0f; - float b = (float)blue / 255.0f; - - float X, Y, Z; - RGB_TO_XYZ(r, g, b, X, Y, Z); - - // Convert XYZ to xy chromaticity coordinates - float color_x = X / (X + Y + Z); - float color_y = Y / (X + Y + Z); - - // Convert normalized xy to 16-bit values - x = (uint16_t)(color_x * 65535.0f); - y = (uint16_t)(color_y * 65535.0f); +uint8_t ZigbeeColorDimmableLight::getCurrentColorSaturation() { + return (*(uint16_t *)esp_zb_zcl_get_attribute( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_SATURATION_ID + ) + ->data_p); } //set attribute method -> method overridden in child class @@ -94,11 +82,7 @@ void ZigbeeColorDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_me uint16_t light_color_x = (*(uint16_t *)message->attribute.data.value); uint16_t light_color_y = getCurrentColorY(); //calculate RGB from XY and call setColor() - uint8_t red, green, blue; - calculateRGB(light_color_x, light_color_y, red, green, blue); - _current_blue = blue; - _current_green = green; - _current_red = red; + _current_color = espXYToRgbColor(255, light_color_x, light_color_y); //TODO: Check if level is correct lightChanged(); return; @@ -106,11 +90,17 @@ void ZigbeeColorDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_me uint16_t light_color_x = getCurrentColorX(); uint16_t light_color_y = (*(uint16_t *)message->attribute.data.value); //calculate RGB from XY and call setColor() - uint8_t red, green, blue; - calculateRGB(light_color_x, light_color_y, red, green, blue); - _current_blue = blue; - _current_green = green; - _current_red = red; + _current_color = espXYToRgbColor(255, light_color_x, light_color_y); //TODO: Check if level is correct + lightChanged(); + return; + } else if (message->attribute.id == ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_HUE_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_U8) { + uint8_t light_color_hue = (*(uint8_t *)message->attribute.data.value); + _current_color = espHsvToRgbColor(light_color_hue, getCurrentColorSaturation(), 255); + lightChanged(); + return; + } else if (message->attribute.id == ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_SATURATION_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_U8) { + uint8_t light_color_saturation = (*(uint8_t *)message->attribute.data.value); + _current_color = espHsvToRgbColor(getCurrentColorHue(), light_color_saturation, 255); lightChanged(); return; } else { @@ -123,7 +113,7 @@ void ZigbeeColorDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_me void ZigbeeColorDimmableLight::lightChanged() { if (_on_light_change) { - _on_light_change(_current_state, _current_red, _current_green, _current_blue, _current_level); + _on_light_change(_current_state, _current_color.r, _current_color.g, _current_color.b, _current_level); } } @@ -131,12 +121,13 @@ void ZigbeeColorDimmableLight::setLight(bool state, uint8_t level, uint8_t red, //Update all attributes _current_state = state; _current_level = level; - _current_red = red; - _current_green = green; - _current_blue = blue; + _current_color = {red, green, blue}; lightChanged(); - log_v("Updating on/off light state to %d", state); + espXyColor_t xy_color = espRgbColorToXYColor(_current_color); + espHsvColor_t hsv_color = espRgbColorToHsvColor(_current_color); + + log_v("Updating light state: %d, level: %d, color: %d, %d, %d", state, level, red, green, blue); /* Update light clusters */ esp_zb_lock_acquire(portMAX_DELAY); //set on/off state @@ -147,28 +138,43 @@ void ZigbeeColorDimmableLight::setLight(bool state, uint8_t level, uint8_t red, esp_zb_zcl_set_attribute_val( _endpoint, ESP_ZB_ZCL_CLUSTER_ID_LEVEL_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_LEVEL_CONTROL_CURRENT_LEVEL_ID, &_current_level, false ); - //set color - uint16_t color_x, color_y; - calculateXY(red, green, blue, color_x, color_y); + //set xy color + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_X_ID, &xy_color.x, false + ); esp_zb_zcl_set_attribute_val( - _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_X_ID, &color_x, false + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_Y_ID, &xy_color.y, false ); + //set hsv color + uint8_t hue = (uint8_t)hsv_color.h; esp_zb_zcl_set_attribute_val( - _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_Y_ID, &color_y, false + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_HUE_ID, &hue, false + ); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_SATURATION_ID, &hsv_color.s, false ); esp_zb_lock_release(); } void ZigbeeColorDimmableLight::setLightState(bool state) { - setLight(state, _current_level, _current_red, _current_green, _current_blue); + setLight(state, _current_level, _current_color.r, _current_color.g, _current_color.b); } void ZigbeeColorDimmableLight::setLightLevel(uint8_t level) { - setLight(_current_state, level, _current_red, _current_green, _current_blue); + setLight(_current_state, level, _current_color.r, _current_color.g, _current_color.b); } void ZigbeeColorDimmableLight::setLightColor(uint8_t red, uint8_t green, uint8_t blue) { setLight(_current_state, _current_level, red, green, blue); } +void ZigbeeColorDimmableLight::setLightColor(espRgbColor_t rgb_color) { + setLight(_current_state, _current_level, rgb_color.r, rgb_color.g, rgb_color.b); +} + +void ZigbeeColorDimmableLight::setLightColor(espHsvColor_t hsv_color) { + espRgbColor_t rgb_color = espHsvColorToRgbColor(hsv_color); + setLight(_current_state, _current_level, rgb_color.r, rgb_color.g, rgb_color.b); +} + #endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h index dad267c7b39..265fec1b37c 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h @@ -9,6 +9,47 @@ #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" +#define ZIGBEE_DEFAULT_COLOR_DIMMABLE_LIGHT_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .groups_cfg = \ + { \ + .groups_name_support_id = ESP_ZB_ZCL_GROUPS_NAME_SUPPORT_DEFAULT_VALUE, \ + }, \ + .scenes_cfg = \ + { \ + .scenes_count = ESP_ZB_ZCL_SCENES_SCENE_COUNT_DEFAULT_VALUE, \ + .current_scene = ESP_ZB_ZCL_SCENES_CURRENT_SCENE_DEFAULT_VALUE, \ + .current_group = ESP_ZB_ZCL_SCENES_CURRENT_GROUP_DEFAULT_VALUE, \ + .scene_valid = ESP_ZB_ZCL_SCENES_SCENE_VALID_DEFAULT_VALUE, \ + .name_support = ESP_ZB_ZCL_SCENES_NAME_SUPPORT_DEFAULT_VALUE, \ + }, \ + .on_off_cfg = \ + { \ + .on_off = ESP_ZB_ZCL_ON_OFF_ON_OFF_DEFAULT_VALUE, \ + }, \ + .level_cfg = \ + { \ + .current_level = ESP_ZB_ZCL_LEVEL_CONTROL_CURRENT_LEVEL_DEFAULT_VALUE, \ + }, \ + .color_cfg = { \ + .current_x = ESP_ZB_ZCL_COLOR_CONTROL_CURRENT_X_DEF_VALUE, \ + .current_y = ESP_ZB_ZCL_COLOR_CONTROL_CURRENT_Y_DEF_VALUE, \ + .color_mode = ESP_ZB_ZCL_COLOR_CONTROL_COLOR_MODE_DEFAULT_VALUE, \ + .options = ESP_ZB_ZCL_COLOR_CONTROL_OPTIONS_DEFAULT_VALUE, \ + .enhanced_color_mode = ESP_ZB_ZCL_COLOR_CONTROL_ENHANCED_COLOR_MODE_DEFAULT_VALUE, \ + .color_capabilities = 0x0009, \ + }, \ + } + class ZigbeeColorDimmableLight : public ZigbeeEP { public: ZigbeeColorDimmableLight(uint8_t endpoint); @@ -24,6 +65,8 @@ class ZigbeeColorDimmableLight : public ZigbeeEP { void setLightState(bool state); void setLightLevel(uint8_t level); void setLightColor(uint8_t red, uint8_t green, uint8_t blue); + void setLightColor(espRgbColor_t rgb_color); + void setLightColor(espHsvColor_t hsv_color); void setLight(bool state, uint8_t level, uint8_t red, uint8_t green, uint8_t blue); bool getLightState() { @@ -32,23 +75,26 @@ class ZigbeeColorDimmableLight : public ZigbeeEP { uint8_t getLightLevel() { return _current_level; } + espRgbColor_t getLightColor() { + return _current_color; + } uint8_t getLightRed() { - return _current_red; + return _current_color.r; } uint8_t getLightGreen() { - return _current_green; + return _current_color.g; } uint8_t getLightBlue() { - return _current_blue; + return _current_color.b; } private: void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override; - void calculateRGB(uint16_t x, uint16_t y, uint8_t &red, uint8_t &green, uint8_t &blue); - void calculateXY(uint8_t red, uint8_t green, uint8_t blue, uint16_t &x, uint16_t &y); uint16_t getCurrentColorX(); uint16_t getCurrentColorY(); + uint8_t getCurrentColorHue(); + uint8_t getCurrentColorSaturation(); void lightChanged(); //callback function to be called on light change (State, R, G, B, Level) @@ -56,9 +102,7 @@ class ZigbeeColorDimmableLight : public ZigbeeEP { bool _current_state; uint8_t _current_level; - uint16_t _current_red; - uint16_t _current_green; - uint16_t _current_blue; + espRgbColor_t _current_color; }; #endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp index 4fd492a5477..7bdd8b8ad6a 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp @@ -16,24 +16,6 @@ ZigbeeColorDimmerSwitch::ZigbeeColorDimmerSwitch(uint8_t endpoint) : ZigbeeEP(en }; } -void ZigbeeColorDimmerSwitch::calculateXY(uint8_t red, uint8_t green, uint8_t blue, uint16_t &x, uint16_t &y) { - // Convert RGB to XYZ - float r = (float)red / 255.0f; - float g = (float)green / 255.0f; - float b = (float)blue / 255.0f; - - float X, Y, Z; - RGB_TO_XYZ(r, g, b, X, Y, Z); - - // Convert XYZ to xy chromaticity coordinates - float color_x = X / (X + Y + Z); - float color_y = Y / (X + Y + Z); - - // Convert normalized xy to 16-bit values - x = (uint16_t)(color_x * 65535.0f); - y = (uint16_t)(color_y * 65535.0f); -} - void ZigbeeColorDimmerSwitch::bindCb(esp_zb_zdp_status_t zdo_status, void *user_ctx) { if (zdo_status == ESP_ZB_ZDP_STATUS_SUCCESS) { log_i("Bound successfully!"); @@ -417,15 +399,13 @@ void ZigbeeColorDimmerSwitch::setLightLevel(uint8_t level, uint8_t endpoint, esp void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t blue) { if (_is_bound) { - //Convert RGB to XY - uint16_t color_x, color_y; - calculateXY(red, green, blue, color_x, color_y); + espXyColor_t xy_color = espRgbToXYColor(red, green, blue); esp_zb_zcl_color_move_to_color_cmd_t cmd_req; cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; - cmd_req.color_x = color_x; - cmd_req.color_y = color_y; + cmd_req.color_x = xy_color.x; + cmd_req.color_y = xy_color.y; cmd_req.transition_time = 0; log_v("Sending 'set light color' command"); esp_zb_lock_acquire(portMAX_DELAY); @@ -438,16 +418,14 @@ void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t blue, uint16_t group_addr) { if (_is_bound) { - //Convert RGB to XY - uint16_t color_x, color_y; - calculateXY(red, green, blue, color_x, color_y); + espXyColor_t xy_color = espRgbToXYColor(red, green, blue); esp_zb_zcl_color_move_to_color_cmd_t cmd_req; cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = group_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT; - cmd_req.color_x = color_x; - cmd_req.color_y = color_y; + cmd_req.color_x = xy_color.x; + cmd_req.color_y = xy_color.y; cmd_req.transition_time = 0; log_v("Sending 'set light color' command to group address 0x%x", group_addr); esp_zb_lock_acquire(portMAX_DELAY); @@ -460,17 +438,15 @@ void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t endpoint, uint16_t short_addr) { if (_is_bound) { - //Convert RGB to XY - uint16_t color_x, color_y; - calculateXY(red, green, blue, color_x, color_y); + espXyColor_t xy_color = espRgbToXYColor(red, green, blue); esp_zb_zcl_color_move_to_color_cmd_t cmd_req; cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.zcl_basic_cmd.dst_endpoint = endpoint; cmd_req.zcl_basic_cmd.dst_addr_u.addr_short = short_addr; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; - cmd_req.color_x = color_x; - cmd_req.color_y = color_y; + cmd_req.color_x = xy_color.x; + cmd_req.color_y = xy_color.y; cmd_req.transition_time = 0; log_v("Sending 'set light color' command to endpoint %d, address 0x%x", endpoint, short_addr); esp_zb_lock_acquire(portMAX_DELAY); @@ -483,17 +459,15 @@ void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { if (_is_bound) { - //Convert RGB to XY - uint16_t color_x, color_y; - calculateXY(red, green, blue, color_x, color_y); + espXyColor_t xy_color = espRgbToXYColor(red, green, blue); esp_zb_zcl_color_move_to_color_cmd_t cmd_req; cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.zcl_basic_cmd.dst_endpoint = endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; memcpy(cmd_req.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); - cmd_req.color_x = color_x; - cmd_req.color_y = color_y; + cmd_req.color_x = xy_color.x; + cmd_req.color_y = xy_color.y; cmd_req.transition_time = 0; log_v( "Sending 'set light color' command to endpoint %d, ieee address %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", endpoint, ieee_addr[7], ieee_addr[6], From 6fb55a7f688742c50ccd715843b03d8e599f31bf Mon Sep 17 00:00:00 2001 From: vortigont Date: Thu, 13 Feb 2025 21:03:21 +0900 Subject: [PATCH 177/183] feat(board): Update 3rd party board Huidu HD-WF2/HD-WF4 (#10957) * feat(board): Update 3rd party board Huidu HD-WF2/HD-WF4 Followup #10779 - fixed flash mode to 'dio' - removed psram flags - corrected gpio mapping defines * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- boards.txt | 28 ---------- variants/huidu_hd_wf2/pins_arduino.h | 15 ------ variants/huidu_hd_wf4/pins_arduino.h | 77 +++++++++++++++------------- 3 files changed, 41 insertions(+), 79 deletions(-) diff --git a/boards.txt b/boards.txt index 9ecd6359759..86f821476cf 100644 --- a/boards.txt +++ b/boards.txt @@ -48923,20 +48923,6 @@ huidu_hd_wf2.menu.CPUFreq.80.build.f_cpu=80000000L huidu_hd_wf2.menu.CPUFreq.40=40MHz huidu_hd_wf2.menu.CPUFreq.40.build.f_cpu=40000000L -huidu_hd_wf2.menu.PSRAM.enabled=QSPI Flash fix -huidu_hd_wf2.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM -huidu_hd_wf2.menu.PSRAM.enabled.build.psram_type=qspi - -huidu_hd_wf2.menu.FlashMode.qio=QIO 80MHz -huidu_hd_wf2.menu.FlashMode.qio.build.flash_mode=dio -huidu_hd_wf2.menu.FlashMode.qio.build.boot=qio -huidu_hd_wf2.menu.FlashMode.qio.build.boot_freq=80m -huidu_hd_wf2.menu.FlashMode.qio.build.flash_freq=80m -huidu_hd_wf2.menu.FlashMode.qio120=QIO 120MHz -huidu_hd_wf2.menu.FlashMode.qio120.build.flash_mode=dio -huidu_hd_wf2.menu.FlashMode.qio120.build.boot=qio -huidu_hd_wf2.menu.FlashMode.qio120.build.boot_freq=120m -huidu_hd_wf2.menu.FlashMode.qio120.build.flash_freq=80m huidu_hd_wf2.menu.FlashMode.dio=DIO 80MHz huidu_hd_wf2.menu.FlashMode.dio.build.flash_mode=dio huidu_hd_wf2.menu.FlashMode.dio.build.boot=dio @@ -49076,20 +49062,6 @@ huidu_hd_wf4.menu.CPUFreq.80.build.f_cpu=80000000L huidu_hd_wf4.menu.CPUFreq.40=40MHz huidu_hd_wf4.menu.CPUFreq.40.build.f_cpu=40000000L -huidu_hd_wf4.menu.PSRAM.enabled=QSPI Flash fix -huidu_hd_wf4.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM -huidu_hd_wf4.menu.PSRAM.enabled.build.psram_type=qspi - -huidu_hd_wf4.menu.FlashMode.qio=QIO 80MHz -huidu_hd_wf4.menu.FlashMode.qio.build.flash_mode=dio -huidu_hd_wf4.menu.FlashMode.qio.build.boot=qio -huidu_hd_wf4.menu.FlashMode.qio.build.boot_freq=80m -huidu_hd_wf4.menu.FlashMode.qio.build.flash_freq=80m -huidu_hd_wf4.menu.FlashMode.qio120=QIO 120MHz -huidu_hd_wf4.menu.FlashMode.qio120.build.flash_mode=dio -huidu_hd_wf4.menu.FlashMode.qio120.build.boot=qio -huidu_hd_wf4.menu.FlashMode.qio120.build.boot_freq=120m -huidu_hd_wf4.menu.FlashMode.qio120.build.flash_freq=80m huidu_hd_wf4.menu.FlashMode.dio=DIO 80MHz huidu_hd_wf4.menu.FlashMode.dio.build.flash_mode=dio huidu_hd_wf4.menu.FlashMode.dio.build.boot=dio diff --git a/variants/huidu_hd_wf2/pins_arduino.h b/variants/huidu_hd_wf2/pins_arduino.h index 97d72dcc0f3..6068e4d6371 100644 --- a/variants/huidu_hd_wf2/pins_arduino.h +++ b/variants/huidu_hd_wf2/pins_arduino.h @@ -58,19 +58,4 @@ static const uint8_t MOSI = 11; static const uint8_t MISO = 13; static const uint8_t SCK = 12; -static const uint8_t T1 = WF2_X1_R1_PIN; -static const uint8_t T2 = WF2_X1_R2_PIN; -static const uint8_t T3 = WF2_X1_G1_PIN; -static const uint8_t T4 = WF2_X1_G2_PIN; -static const uint8_t T5 = WF2_X1_B1_PIN; -static const uint8_t T6 = WF2_X1_B2_PIN; -static const uint8_t T7 = WF2_A_PIN; -static const uint8_t T8 = WF2_B_PIN; -static const uint8_t T9 = WF2_C_PIN; -static const uint8_t T10 = WF2_D_PIN; -static const uint8_t T11 = WF2_X1_E_PIN; -static const uint8_t T12 = WF2_OE_PIN; -static const uint8_t T13 = WF2_CLK_PIN; -static const uint8_t T14 = WF2_LAT_PIN; - #endif /* Pins_Arduino_h */ diff --git a/variants/huidu_hd_wf4/pins_arduino.h b/variants/huidu_hd_wf4/pins_arduino.h index cd96db6c445..5b8667477bf 100644 --- a/variants/huidu_hd_wf4/pins_arduino.h +++ b/variants/huidu_hd_wf4/pins_arduino.h @@ -19,7 +19,7 @@ #define WF4_CLK_PIN 34 #define WF4_LAT_PIN 33 -// X1 +// X1 HUB75 #define WF4_X1_R1_PIN 2 #define WF4_X1_R2_PIN 3 #define WF4_X1_G1_PIN 6 @@ -28,7 +28,7 @@ #define WF4_X1_B2_PIN 11 #define WF4_X1_CS_PIN 45 // CS gpio must be set HIGH to enable X1 output -// X2 +// X2 HUB75 #define WF4_X2_R1_PIN 4 #define WF4_X2_R2_PIN 5 #define WF4_X2_G1_PIN 8 @@ -37,7 +37,7 @@ #define WF4_X2_B2_PIN 13 #define WF4_X2_CS_PIN WF4_X1_CS_PIN // CS gpio must be set HIGH to enable X2 output -// X3 +// X3 HUB75 #define WF4_X3_R1_PIN 2 #define WF4_X3_R2_PIN 3 #define WF4_X3_G1_PIN 6 @@ -46,7 +46,7 @@ #define WF4_X3_B2_PIN 11 #define WF4_X3_CS_PIN 14 // CS gpio must be set HIGH to enable X3 output -// X4 +// X4 HUB75 #define WF4_X4_R1_PIN 4 #define WF4_X4_R2_PIN 5 #define WF4_X4_G1_PIN 8 @@ -55,52 +55,57 @@ #define WF4_X4_B2_PIN 13 #define WF4_X4_CS_PIN WF4_X3_CS_PIN // CS gpio must be set HIGH to enable X4 output -//#define WF4_P1_PIN UART -#define WF4_P2_DATA_PIN 0 // GPIO0 boot -#define WF4_P5_DATA_PIN 16 // temperature -//#define WF4_P7_PIN VCC/GND -#define WF4_P11_DATA_PIN 15 // IR +// P1 is a UART connector +#define WF4_P1_RX_PIN 44 +#define WF4_P1_TX_PIN 43 + +// P2: PCB holes gpio/gnd +#define WF4_P2_DATA_PIN 0 // GPIO0 boot + +// P5: temperature sensor connector +#define WF4_P5_DATA_PIN 16 + +// P7: VCC/GPIO holes on PCB +#define WF4_P7_DATA_PIN 1 + +// P11: IR connector +#define WF4_P11_DATA_PIN 15 + +// P12: two gpio's, Vcc, GND #define WF4_P12_DATA1_PIN 47 #define WF4_P12_DATA2_PIN 18 -#define WF4_S1_DATA_PIN 17 // Button -#define WF4_S2_DATA_PIN 48 -#define WF4_S3_DATA_PIN 26 -#define WF4_S4_DATA_PIN 46 + +// S1 Button +#define WF4_S1_DATA_PIN 17 + +// S2-S3 PCB holes +#define WF4_S2_DATA_PIN 48 +#define WF4_S3_DATA_PIN 26 +#define WF4_S4_DATA_PIN 46 #define WF4_BUTTON_TEST WF4_S1_PIN // Test key button on PCB, 1=normal, 0=pressed #define WF4_LED_RUN_PIN 40 // Status LED on PCB #define WF4_BM8563_I2C_SDA 41 // RTC BM8563 I2C port #define WF4_BM8563_I2C_SCL 42 -#define WF4_USB_DM_PIN 19 -#define WF4_USB_DP_PIN 20 +#define WF4_USB_DN_PIN 19 // USB-A D- +#define WF4_USB_DP_PIN 20 // USB-A D+ #define LED_BUILTIN WF4_LED_RUN_PIN #define BUILTIN_LED LED_BUILTIN // backward compatibility -static const uint8_t TX = 43; -static const uint8_t RX = 44; +static const uint8_t TX = WF4_P1_TX_PIN; +static const uint8_t RX = WF4_P1_RX_PIN; static const uint8_t SDA = WF4_BM8563_I2C_SDA; static const uint8_t SCL = WF4_BM8563_I2C_SCL; -static const uint8_t SS = 10; -static const uint8_t MOSI = 11; -static const uint8_t MISO = 13; -static const uint8_t SCK = 12; - -static const uint8_t T1 = WF4_X1_R1_PIN; -static const uint8_t T2 = WF4_X1_R2_PIN; -static const uint8_t T3 = WF4_X1_G1_PIN; -static const uint8_t T4 = WF4_X1_G2_PIN; -static const uint8_t T5 = WF4_X1_B1_PIN; -static const uint8_t T6 = WF4_X1_B2_PIN; -static const uint8_t T7 = WF4_A_PIN; -static const uint8_t T8 = WF4_B_PIN; -static const uint8_t T9 = WF4_C_PIN; -static const uint8_t T10 = WF4_D_PIN; -static const uint8_t T11 = WF4_E_PIN; -static const uint8_t T12 = WF4_OE_PIN; -static const uint8_t T13 = WF4_CLK_PIN; -static const uint8_t T14 = WF4_LAT_PIN; +// there is no dedicated SPI connector on board, but SPI could be accessed via PCB holes +static const uint8_t SS = WF4_S2_DATA_PIN; +static const uint8_t MOSI = WF4_S3_DATA_PIN; +static const uint8_t MISO = WF4_S4_DATA_PIN; +static const uint8_t SCK = WF4_P7_DATA_PIN; + +// touch pins are mostly busy with HUB75 ports +static const uint8_t T1 = WF4_P7_DATA_PIN; #endif /* Pins_Arduino_h */ From 5488d5d23fb0da47f463fce89a879c4593a6231f Mon Sep 17 00:00:00 2001 From: TD-er Date: Thu, 13 Feb 2025 13:14:05 +0100 Subject: [PATCH 178/183] Fix crash when using String::move on empty string (#10938) (#10945) Fixes: #10938 Keep allocated memory when rhs fits Use case: Appending to a String with pre-allocated memory (e.g. from `reserve()`) No need to move 0-termination char in String::move Simplify calls to String::copy A lot of the same checks were done before calling `copy()` which should be done in the `copy()` function itself. String::copy() Should not copy more than given length Fix potential out of range in String::concat There is no prerequisite the given array has to be a 0-terminated char array. So we should only copy the length that has been given. The `setLen()` function will make sure the internal string is 0-terminated. So no need to dangerously assume there will be 1 more byte to copy Allow String::concat(const String &s) with s.buffer() == nullptr When constructing a String object, the internal buffer is a nullptr. However concatenating this to another String would return `false` while this is perfectly fine to do. --- cores/esp32/WString.cpp | 54 ++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/cores/esp32/WString.cpp b/cores/esp32/WString.cpp index 71183213ac2..5296a2d9652 100644 --- a/cores/esp32/WString.cpp +++ b/cores/esp32/WString.cpp @@ -226,11 +226,11 @@ bool String::changeBuffer(unsigned int maxStrLen) { /*********************************************/ String &String::copy(const char *cstr, unsigned int length) { - if (!reserve(length)) { + if (cstr == nullptr || !reserve(length)) { invalidate(); return *this; } - memmove(wbuffer(), cstr, length + 1); + memmove(wbuffer(), cstr, length); setLen(length); return *this; } @@ -239,15 +239,18 @@ String &String::copy(const char *cstr, unsigned int length) { void String::move(String &rhs) { if (buffer()) { if (capacity() >= rhs.len()) { - memmove(wbuffer(), rhs.buffer(), rhs.length() + 1); + // Use case: When 'reserve()' was called and the first + // assignment/append is the return value of a function. + if (rhs.len() && rhs.buffer()) { + memmove(wbuffer(), rhs.buffer(), rhs.length()); + } setLen(rhs.len()); rhs.invalidate(); return; - } else { - if (!isSSO()) { - free(wbuffer()); - setBuffer(nullptr); - } + } + if (!isSSO()) { + free(wbuffer()); + setBuffer(nullptr); } } if (rhs.isSSO()) { @@ -259,10 +262,7 @@ void String::move(String &rhs) { } setCapacity(rhs.capacity()); setLen(rhs.len()); - rhs.setSSO(false); - rhs.setCapacity(0); - rhs.setBuffer(nullptr); - rhs.setLen(0); + rhs.init(); } #endif @@ -270,12 +270,7 @@ String &String::operator=(const String &rhs) { if (this == &rhs) { return *this; } - if (rhs.buffer()) { - copy(rhs.buffer(), rhs.len()); - } else { - invalidate(); - } - return *this; + return copy(rhs.buffer(), rhs.len()); } #ifdef __GXX_EXPERIMENTAL_CXX0X__ @@ -295,12 +290,7 @@ String &String::operator=(StringSumHelper &&rval) { #endif String &String::operator=(const char *cstr) { - if (cstr) { - copy(cstr, strlen(cstr)); - } else { - invalidate(); - } - return *this; + return copy(cstr, strlen(cstr)); } /*********************************************/ @@ -311,23 +301,21 @@ bool String::concat(const String &s) { // Special case if we're concatting ourself (s += s;) since we may end up // realloc'ing the buffer and moving s.buffer in the method called if (&s == this) { - unsigned int newlen = 2 * len(); - if (!s.buffer()) { - return false; - } if (s.len() == 0) { return true; } + if (!s.buffer()) { + return false; + } + unsigned int newlen = 2 * len(); if (!reserve(newlen)) { return false; } memmove(wbuffer() + len(), buffer(), len()); setLen(newlen); - wbuffer()[len()] = 0; return true; - } else { - return concat(s.buffer(), s.len()); } + return concat(s.buffer(), s.len()); } bool String::concat(const char *cstr, unsigned int length) { @@ -343,10 +331,10 @@ bool String::concat(const char *cstr, unsigned int length) { } if (cstr >= wbuffer() && cstr < wbuffer() + len()) { // compatible with SSO in ram #6155 (case "x += x.c_str()") - memmove(wbuffer() + len(), cstr, length + 1); + memmove(wbuffer() + len(), cstr, length); } else { // compatible with source in flash #6367 - memcpy_P(wbuffer() + len(), cstr, length + 1); + memcpy_P(wbuffer() + len(), cstr, length); } setLen(newlen); return true; From 62082398d322c636184ba4b4a385f9b618f61a77 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Thu, 13 Feb 2025 14:32:20 +0200 Subject: [PATCH 179/183] Update core version to 3.1.2 --- cores/esp32/esp_arduino_version.h | 2 +- libraries/ArduinoOTA/library.properties | 2 +- libraries/AsyncUDP/library.properties | 2 +- libraries/BLE/library.properties | 2 +- libraries/BluetoothSerial/library.properties | 2 +- libraries/DNSServer/library.properties | 2 +- libraries/EEPROM/library.properties | 2 +- libraries/ESP32/library.properties | 2 +- libraries/ESP_I2S/library.properties | 2 +- libraries/ESP_NOW/library.properties | 2 +- libraries/ESP_SR/library.properties | 2 +- libraries/ESPmDNS/library.properties | 2 +- libraries/Ethernet/library.properties | 2 +- libraries/FFat/library.properties | 2 +- libraries/FS/library.properties | 2 +- libraries/HTTPClient/library.properties | 2 +- libraries/HTTPUpdate/library.properties | 2 +- libraries/HTTPUpdateServer/library.properties | 2 +- libraries/Insights/library.properties | 2 +- libraries/LittleFS/library.properties | 2 +- libraries/Matter/library.properties | 2 +- libraries/NetBIOS/library.properties | 2 +- libraries/Network/library.properties | 2 +- libraries/NetworkClientSecure/library.properties | 2 +- libraries/OpenThread/library.properties | 2 +- libraries/PPP/library.properties | 2 +- libraries/Preferences/library.properties | 2 +- libraries/RainMaker/library.properties | 2 +- libraries/SD/library.properties | 2 +- libraries/SD_MMC/library.properties | 2 +- libraries/SPI/library.properties | 2 +- libraries/SPIFFS/library.properties | 2 +- libraries/SimpleBLE/library.properties | 2 +- libraries/TFLiteMicro/library.properties | 2 +- libraries/Ticker/library.properties | 2 +- libraries/USB/library.properties | 2 +- libraries/Update/library.properties | 2 +- libraries/WebServer/library.properties | 2 +- libraries/WiFi/library.properties | 2 +- libraries/WiFiProv/library.properties | 2 +- libraries/Wire/library.properties | 2 +- libraries/Zigbee/library.properties | 2 +- package.json | 2 +- platform.txt | 2 +- 44 files changed, 44 insertions(+), 44 deletions(-) diff --git a/cores/esp32/esp_arduino_version.h b/cores/esp32/esp_arduino_version.h index dece36df1b8..4c9961053f9 100644 --- a/cores/esp32/esp_arduino_version.h +++ b/cores/esp32/esp_arduino_version.h @@ -23,7 +23,7 @@ extern "C" { /** Minor version number (x.X.x) */ #define ESP_ARDUINO_VERSION_MINOR 1 /** Patch version number (x.x.X) */ -#define ESP_ARDUINO_VERSION_PATCH 1 +#define ESP_ARDUINO_VERSION_PATCH 2 /** * Macro to convert ARDUINO version number into an integer diff --git a/libraries/ArduinoOTA/library.properties b/libraries/ArduinoOTA/library.properties index 524564ff699..76043001e9b 100644 --- a/libraries/ArduinoOTA/library.properties +++ b/libraries/ArduinoOTA/library.properties @@ -1,5 +1,5 @@ name=ArduinoOTA -version=3.1.1 +version=3.1.2 author=Ivan Grokhotkov and Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables Over The Air upgrades, via wifi and espota.py UDP request/TCP download. diff --git a/libraries/AsyncUDP/library.properties b/libraries/AsyncUDP/library.properties index 5b1afd68273..c27bbde2eb5 100644 --- a/libraries/AsyncUDP/library.properties +++ b/libraries/AsyncUDP/library.properties @@ -1,5 +1,5 @@ name=ESP32 Async UDP -version=3.1.1 +version=3.1.2 author=Me-No-Dev maintainer=Me-No-Dev sentence=Async UDP Library for ESP32 diff --git a/libraries/BLE/library.properties b/libraries/BLE/library.properties index afda29db686..35346c13b67 100644 --- a/libraries/BLE/library.properties +++ b/libraries/BLE/library.properties @@ -1,5 +1,5 @@ name=BLE -version=3.1.1 +version=3.1.2 author=Neil Kolban maintainer=Dariusz Krempa sentence=BLE functions for ESP32 diff --git a/libraries/BluetoothSerial/library.properties b/libraries/BluetoothSerial/library.properties index cf0dab07aa7..d33d461d77c 100644 --- a/libraries/BluetoothSerial/library.properties +++ b/libraries/BluetoothSerial/library.properties @@ -1,5 +1,5 @@ name=BluetoothSerial -version=3.1.1 +version=3.1.2 author=Evandro Copercini maintainer=Evandro Copercini sentence=Simple UART to Classical Bluetooth bridge for ESP32 diff --git a/libraries/DNSServer/library.properties b/libraries/DNSServer/library.properties index 8a6d1786625..7996c2fef5f 100644 --- a/libraries/DNSServer/library.properties +++ b/libraries/DNSServer/library.properties @@ -1,5 +1,5 @@ name=DNSServer -version=3.1.1 +version=3.1.2 author=Kristijan Novoselić maintainer=Kristijan Novoselić, sentence=A simple DNS server for ESP32. diff --git a/libraries/EEPROM/library.properties b/libraries/EEPROM/library.properties index d66116947c7..aabaf2e3be1 100644 --- a/libraries/EEPROM/library.properties +++ b/libraries/EEPROM/library.properties @@ -1,5 +1,5 @@ name=EEPROM -version=3.1.1 +version=3.1.2 author=Ivan Grokhotkov maintainer=Paolo Becchi sentence=Enables reading and writing data a sequential, addressable FLASH storage diff --git a/libraries/ESP32/library.properties b/libraries/ESP32/library.properties index 160b392f39e..f3cc3d94be2 100644 --- a/libraries/ESP32/library.properties +++ b/libraries/ESP32/library.properties @@ -1,5 +1,5 @@ name=ESP32 -version=3.1.1 +version=3.1.2 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 sketches examples diff --git a/libraries/ESP_I2S/library.properties b/libraries/ESP_I2S/library.properties index 3105266d708..8369862022c 100644 --- a/libraries/ESP_I2S/library.properties +++ b/libraries/ESP_I2S/library.properties @@ -1,5 +1,5 @@ name=ESP_I2S -version=3.1.1 +version=3.1.2 author=me-no-dev maintainer=me-no-dev sentence=Library for ESP I2S communication diff --git a/libraries/ESP_NOW/library.properties b/libraries/ESP_NOW/library.properties index ba52e080046..1f7999ed26f 100644 --- a/libraries/ESP_NOW/library.properties +++ b/libraries/ESP_NOW/library.properties @@ -1,5 +1,5 @@ name=ESP_NOW -version=3.1.1 +version=3.1.2 author=me-no-dev maintainer=P-R-O-C-H-Y sentence=Library for ESP_NOW diff --git a/libraries/ESP_SR/library.properties b/libraries/ESP_SR/library.properties index b52c0552cbb..35225ae79bc 100644 --- a/libraries/ESP_SR/library.properties +++ b/libraries/ESP_SR/library.properties @@ -1,5 +1,5 @@ name=ESP_SR -version=3.1.1 +version=3.1.2 author=me-no-dev maintainer=me-no-dev sentence=Library for ESP Sound Recognition diff --git a/libraries/ESPmDNS/library.properties b/libraries/ESPmDNS/library.properties index fe06ddb6851..3612e3a84de 100644 --- a/libraries/ESPmDNS/library.properties +++ b/libraries/ESPmDNS/library.properties @@ -1,5 +1,5 @@ name=ESPmDNS -version=3.1.1 +version=3.1.2 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 mDNS Library diff --git a/libraries/Ethernet/library.properties b/libraries/Ethernet/library.properties index e8075d15f11..82fff9cb85e 100644 --- a/libraries/Ethernet/library.properties +++ b/libraries/Ethernet/library.properties @@ -1,5 +1,5 @@ name=Ethernet -version=3.1.1 +version=3.1.2 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables network connection (local and Internet) using the ESP32 Ethernet. diff --git a/libraries/FFat/library.properties b/libraries/FFat/library.properties index e75ef4206a6..3c387cd3c64 100644 --- a/libraries/FFat/library.properties +++ b/libraries/FFat/library.properties @@ -1,5 +1,5 @@ name=FFat -version=3.1.1 +version=3.1.2 author=Hristo Gochkov, Ivan Grokhtkov, Larry Bernstone maintainer=Hristo Gochkov sentence=ESP32 FAT on Flash File System diff --git a/libraries/FS/library.properties b/libraries/FS/library.properties index b339f57356f..1a00810a221 100644 --- a/libraries/FS/library.properties +++ b/libraries/FS/library.properties @@ -1,5 +1,5 @@ name=FS -version=3.1.1 +version=3.1.2 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 File System diff --git a/libraries/HTTPClient/library.properties b/libraries/HTTPClient/library.properties index df11cb033b8..20f971ba3ea 100644 --- a/libraries/HTTPClient/library.properties +++ b/libraries/HTTPClient/library.properties @@ -1,5 +1,5 @@ name=HTTPClient -version=3.1.1 +version=3.1.2 author=Markus Sattler maintainer=Markus Sattler sentence=HTTP Client for ESP32 diff --git a/libraries/HTTPUpdate/library.properties b/libraries/HTTPUpdate/library.properties index dc02780c8d2..9145001ce31 100644 --- a/libraries/HTTPUpdate/library.properties +++ b/libraries/HTTPUpdate/library.properties @@ -1,5 +1,5 @@ name=HTTPUpdate -version=3.1.1 +version=3.1.2 author=Markus Sattler maintainer=Markus Sattler sentence=Http Update for ESP32 diff --git a/libraries/HTTPUpdateServer/library.properties b/libraries/HTTPUpdateServer/library.properties index 6cdcc1b34ea..7a05dd26e19 100644 --- a/libraries/HTTPUpdateServer/library.properties +++ b/libraries/HTTPUpdateServer/library.properties @@ -1,5 +1,5 @@ name=HTTPUpdateServer -version=3.1.1 +version=3.1.2 author=Hristo Kapanakov maintainer= sentence=Simple HTTP Update server based on the WebServer diff --git a/libraries/Insights/library.properties b/libraries/Insights/library.properties index 39b1f80c876..076b5b8d0fb 100644 --- a/libraries/Insights/library.properties +++ b/libraries/Insights/library.properties @@ -1,5 +1,5 @@ name=ESP Insights -version=3.1.1 +version=3.1.2 author=Sanket Wadekar maintainer=Sanket Wadekar sentence=ESP Insights diff --git a/libraries/LittleFS/library.properties b/libraries/LittleFS/library.properties index 9f665385dce..f0d29ce90d8 100644 --- a/libraries/LittleFS/library.properties +++ b/libraries/LittleFS/library.properties @@ -1,5 +1,5 @@ name=LittleFS -version=3.1.1 +version=3.1.2 author= maintainer= sentence=LittleFS for esp32 diff --git a/libraries/Matter/library.properties b/libraries/Matter/library.properties index 14a7f48c6de..7f84307354e 100644 --- a/libraries/Matter/library.properties +++ b/libraries/Matter/library.properties @@ -1,5 +1,5 @@ name=Matter -version=3.1.1 +version=3.1.2 author=Rodrigo Garcia | GitHub @SuGlider maintainer=Rodrigo Garcia sentence=Library for supporting Matter environment on ESP32. diff --git a/libraries/NetBIOS/library.properties b/libraries/NetBIOS/library.properties index f28405b7f64..571a5a75d9d 100644 --- a/libraries/NetBIOS/library.properties +++ b/libraries/NetBIOS/library.properties @@ -1,5 +1,5 @@ name=NetBIOS -version=3.1.1 +version=3.1.2 author=Pablo@xpablo.cz maintainer=Hristo Gochkov sentence=Enables NBNS (NetBIOS) name resolution. diff --git a/libraries/Network/library.properties b/libraries/Network/library.properties index d3a9f329306..e7dea53d2e7 100644 --- a/libraries/Network/library.properties +++ b/libraries/Network/library.properties @@ -1,5 +1,5 @@ name=Networking -version=3.1.1 +version=3.1.2 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=General network management library. diff --git a/libraries/NetworkClientSecure/library.properties b/libraries/NetworkClientSecure/library.properties index 6d79dc61095..ec5ee5e2548 100644 --- a/libraries/NetworkClientSecure/library.properties +++ b/libraries/NetworkClientSecure/library.properties @@ -1,5 +1,5 @@ name=NetworkClientSecure -version=3.1.1 +version=3.1.2 author=Evandro Luis Copercini maintainer=Github Community sentence=Enables secure network connection (local and Internet) using the ESP32 built-in WiFi. diff --git a/libraries/OpenThread/library.properties b/libraries/OpenThread/library.properties index a50a803dfa6..ed4506d5efd 100644 --- a/libraries/OpenThread/library.properties +++ b/libraries/OpenThread/library.properties @@ -1,5 +1,5 @@ name=OpenThread -version=3.1.1 +version=3.1.2 author=Rodrigo Garcia | GitHub @SuGlider maintainer=Rodrigo Garcia sentence=Library for OpenThread Network on ESP32. diff --git a/libraries/PPP/library.properties b/libraries/PPP/library.properties index fefd89d4904..5266ac6f6f7 100644 --- a/libraries/PPP/library.properties +++ b/libraries/PPP/library.properties @@ -1,5 +1,5 @@ name=PPP -version=3.1.1 +version=3.1.2 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables network connection using GSM Modem. diff --git a/libraries/Preferences/library.properties b/libraries/Preferences/library.properties index 842ade94003..d5e3a99d081 100644 --- a/libraries/Preferences/library.properties +++ b/libraries/Preferences/library.properties @@ -1,5 +1,5 @@ name=Preferences -version=3.1.1 +version=3.1.2 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Provides friendly access to ESP32's Non-Volatile Storage diff --git a/libraries/RainMaker/library.properties b/libraries/RainMaker/library.properties index 2f49258e78d..2ff5262c31a 100644 --- a/libraries/RainMaker/library.properties +++ b/libraries/RainMaker/library.properties @@ -1,5 +1,5 @@ name=ESP RainMaker -version=3.1.1 +version=3.1.2 author=Sweety Mhaiske maintainer=Hristo Gochkov sentence=ESP RainMaker Support diff --git a/libraries/SD/library.properties b/libraries/SD/library.properties index 117de77ca36..20815d220d2 100644 --- a/libraries/SD/library.properties +++ b/libraries/SD/library.properties @@ -1,5 +1,5 @@ name=SD -version=3.1.1 +version=3.1.2 author=Arduino, SparkFun maintainer=Arduino sentence=Enables reading and writing on SD cards. For all Arduino boards. diff --git a/libraries/SD_MMC/library.properties b/libraries/SD_MMC/library.properties index 72c12c61d5c..9ebf53dde74 100644 --- a/libraries/SD_MMC/library.properties +++ b/libraries/SD_MMC/library.properties @@ -1,5 +1,5 @@ name=SD_MMC -version=3.1.1 +version=3.1.2 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 SDMMC File System diff --git a/libraries/SPI/library.properties b/libraries/SPI/library.properties index 8c567f00d40..81c76fcca48 100644 --- a/libraries/SPI/library.properties +++ b/libraries/SPI/library.properties @@ -1,5 +1,5 @@ name=SPI -version=3.1.1 +version=3.1.2 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables the communication with devices that use the Serial Peripheral Interface (SPI) Bus. For all Arduino boards, BUT Arduino DUE. diff --git a/libraries/SPIFFS/library.properties b/libraries/SPIFFS/library.properties index 68cb55ca124..94f38b3ea00 100644 --- a/libraries/SPIFFS/library.properties +++ b/libraries/SPIFFS/library.properties @@ -1,5 +1,5 @@ name=SPIFFS -version=3.1.1 +version=3.1.2 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 SPIFFS File System diff --git a/libraries/SimpleBLE/library.properties b/libraries/SimpleBLE/library.properties index a5541dd9750..1ad4a83a69a 100644 --- a/libraries/SimpleBLE/library.properties +++ b/libraries/SimpleBLE/library.properties @@ -1,5 +1,5 @@ name=SimpleBLE -version=3.1.1 +version=3.1.2 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Provides really simple BLE advertizer with just on and off diff --git a/libraries/TFLiteMicro/library.properties b/libraries/TFLiteMicro/library.properties index ef9b474611f..39badc8ba1b 100644 --- a/libraries/TFLiteMicro/library.properties +++ b/libraries/TFLiteMicro/library.properties @@ -1,5 +1,5 @@ name=TFLite Micro -version=3.1.1 +version=3.1.2 author=Sanket Wadekar maintainer=Sanket Wadekar sentence=TensorFlow Lite for Microcontrollers diff --git a/libraries/Ticker/library.properties b/libraries/Ticker/library.properties index 8d123806109..080a4a17f40 100644 --- a/libraries/Ticker/library.properties +++ b/libraries/Ticker/library.properties @@ -1,5 +1,5 @@ name=Ticker -version=3.1.1 +version=3.1.2 author=Bert Melis maintainer=Hristo Gochkov sentence=Allows to call functions with a given interval. diff --git a/libraries/USB/library.properties b/libraries/USB/library.properties index 17d4e25cae2..9dc655dbd10 100644 --- a/libraries/USB/library.properties +++ b/libraries/USB/library.properties @@ -1,5 +1,5 @@ name=USB -version=3.1.1 +version=3.1.2 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=ESP32S2 USB Library diff --git a/libraries/Update/library.properties b/libraries/Update/library.properties index 5af58e380e1..83fbfd4c901 100644 --- a/libraries/Update/library.properties +++ b/libraries/Update/library.properties @@ -1,5 +1,5 @@ name=Update -version=3.1.1 +version=3.1.2 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=ESP32 Sketch Update Library diff --git a/libraries/WebServer/library.properties b/libraries/WebServer/library.properties index c225d6ebd95..73d8d87d690 100644 --- a/libraries/WebServer/library.properties +++ b/libraries/WebServer/library.properties @@ -1,5 +1,5 @@ name=WebServer -version=3.1.1 +version=3.1.2 author=Ivan Grokhotkov maintainer=Ivan Grokhtkov sentence=Simple web server library diff --git a/libraries/WiFi/library.properties b/libraries/WiFi/library.properties index a82ae45a2d2..608bf607bf7 100644 --- a/libraries/WiFi/library.properties +++ b/libraries/WiFi/library.properties @@ -1,5 +1,5 @@ name=WiFi -version=3.1.1 +version=3.1.2 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables network connection (local and Internet) using the ESP32 built-in WiFi. diff --git a/libraries/WiFiProv/library.properties b/libraries/WiFiProv/library.properties index 4cf8aa56b39..c87cbcd8cee 100644 --- a/libraries/WiFiProv/library.properties +++ b/libraries/WiFiProv/library.properties @@ -1,5 +1,5 @@ name=WiFiProv -version=3.1.1 +version=3.1.2 author=Switi Mhaiske maintainer=Hristo Gochkov sentence=Enables provisioning. diff --git a/libraries/Wire/library.properties b/libraries/Wire/library.properties index 04beb2053bb..a23b33f431d 100644 --- a/libraries/Wire/library.properties +++ b/libraries/Wire/library.properties @@ -1,5 +1,5 @@ name=Wire -version=3.1.1 +version=3.1.2 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Allows the communication between devices or sensors connected via Two Wire Interface Bus. For esp8266 boards. diff --git a/libraries/Zigbee/library.properties b/libraries/Zigbee/library.properties index 87e0cd63e9f..18fb81548c0 100644 --- a/libraries/Zigbee/library.properties +++ b/libraries/Zigbee/library.properties @@ -1,5 +1,5 @@ name=Zigbee -version=3.1.1 +version=3.1.2 author=P-R-O-C-H-Y maintainer=Jan Procházka sentence=Enables zigbee connection with the ESP32 diff --git a/package.json b/package.json index 742b1154d63..748a2ad1bfb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "framework-arduinoespressif32", - "version": "3.1.1", + "version": "3.1.2", "description": "Arduino Wiring-based Framework for the Espressif ESP32, ESP32-P4, ESP32-S and ESP32-C series of SoCs", "keywords": [ "framework", diff --git a/platform.txt b/platform.txt index cc9608a4f9d..2b7d40cff11 100644 --- a/platform.txt +++ b/platform.txt @@ -1,5 +1,5 @@ name=ESP32 Arduino -version=3.1.1 +version=3.1.2 tools.esp32-arduino-libs.path={runtime.platform.path}/tools/esp32-arduino-libs tools.esp32-arduino-libs.path.windows={runtime.platform.path}\tools\esp32-arduino-libs From a7907cd07e605e4e9e37f0ec862e7da7a145fa38 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Fri, 14 Feb 2025 16:57:23 +0200 Subject: [PATCH 180/183] Add the latest versions to issue report template --- .github/ISSUE_TEMPLATE/Issue-report.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/Issue-report.yml b/.github/ISSUE_TEMPLATE/Issue-report.yml index e3a4e92926e..a902184f06b 100644 --- a/.github/ISSUE_TEMPLATE/Issue-report.yml +++ b/.github/ISSUE_TEMPLATE/Issue-report.yml @@ -41,6 +41,8 @@ body: options: - latest master (checkout manually) - latest development Release Candidate (RC-X) + - v3.1.2 + - v3.1.1 - v3.1.0 - v3.0.7 - v3.0.6 From 758cbd097d938199521c4be686807f473295e8bc Mon Sep 17 00:00:00 2001 From: TD-er Date: Mon, 17 Feb 2025 14:27:41 +0100 Subject: [PATCH 181/183] Fix crash in String when using nullptr (#10971) (#10972) Fixes: #10971 --- cores/esp32/WString.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cores/esp32/WString.cpp b/cores/esp32/WString.cpp index 5296a2d9652..18e64767545 100644 --- a/cores/esp32/WString.cpp +++ b/cores/esp32/WString.cpp @@ -290,7 +290,8 @@ String &String::operator=(StringSumHelper &&rval) { #endif String &String::operator=(const char *cstr) { - return copy(cstr, strlen(cstr)); + const uint32_t length = cstr ? strlen(cstr) : 0u; + return copy(cstr, length); } /*********************************************/ From dbfde15b6ac25720c9132ebd33decf6b34d5e2af Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Mon, 17 Feb 2025 15:28:32 +0200 Subject: [PATCH 182/183] Update core version to 3.1.3 --- cores/esp32/esp_arduino_version.h | 2 +- libraries/ArduinoOTA/library.properties | 2 +- libraries/AsyncUDP/library.properties | 2 +- libraries/BLE/library.properties | 2 +- libraries/BluetoothSerial/library.properties | 2 +- libraries/DNSServer/library.properties | 2 +- libraries/EEPROM/library.properties | 2 +- libraries/ESP32/library.properties | 2 +- libraries/ESP_I2S/library.properties | 2 +- libraries/ESP_NOW/library.properties | 2 +- libraries/ESP_SR/library.properties | 2 +- libraries/ESPmDNS/library.properties | 2 +- libraries/Ethernet/library.properties | 2 +- libraries/FFat/library.properties | 2 +- libraries/FS/library.properties | 2 +- libraries/HTTPClient/library.properties | 2 +- libraries/HTTPUpdate/library.properties | 2 +- libraries/HTTPUpdateServer/library.properties | 2 +- libraries/Insights/library.properties | 2 +- libraries/LittleFS/library.properties | 2 +- libraries/Matter/library.properties | 2 +- libraries/NetBIOS/library.properties | 2 +- libraries/Network/library.properties | 2 +- libraries/NetworkClientSecure/library.properties | 2 +- libraries/OpenThread/library.properties | 2 +- libraries/PPP/library.properties | 2 +- libraries/Preferences/library.properties | 2 +- libraries/RainMaker/library.properties | 2 +- libraries/SD/library.properties | 2 +- libraries/SD_MMC/library.properties | 2 +- libraries/SPI/library.properties | 2 +- libraries/SPIFFS/library.properties | 2 +- libraries/SimpleBLE/library.properties | 2 +- libraries/TFLiteMicro/library.properties | 2 +- libraries/Ticker/library.properties | 2 +- libraries/USB/library.properties | 2 +- libraries/Update/library.properties | 2 +- libraries/WebServer/library.properties | 2 +- libraries/WiFi/library.properties | 2 +- libraries/WiFiProv/library.properties | 2 +- libraries/Wire/library.properties | 2 +- libraries/Zigbee/library.properties | 2 +- package.json | 2 +- platform.txt | 2 +- 44 files changed, 44 insertions(+), 44 deletions(-) diff --git a/cores/esp32/esp_arduino_version.h b/cores/esp32/esp_arduino_version.h index 4c9961053f9..f8b00d3a1dd 100644 --- a/cores/esp32/esp_arduino_version.h +++ b/cores/esp32/esp_arduino_version.h @@ -23,7 +23,7 @@ extern "C" { /** Minor version number (x.X.x) */ #define ESP_ARDUINO_VERSION_MINOR 1 /** Patch version number (x.x.X) */ -#define ESP_ARDUINO_VERSION_PATCH 2 +#define ESP_ARDUINO_VERSION_PATCH 3 /** * Macro to convert ARDUINO version number into an integer diff --git a/libraries/ArduinoOTA/library.properties b/libraries/ArduinoOTA/library.properties index 76043001e9b..bcccbe56b5e 100644 --- a/libraries/ArduinoOTA/library.properties +++ b/libraries/ArduinoOTA/library.properties @@ -1,5 +1,5 @@ name=ArduinoOTA -version=3.1.2 +version=3.1.3 author=Ivan Grokhotkov and Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables Over The Air upgrades, via wifi and espota.py UDP request/TCP download. diff --git a/libraries/AsyncUDP/library.properties b/libraries/AsyncUDP/library.properties index c27bbde2eb5..38543425ee1 100644 --- a/libraries/AsyncUDP/library.properties +++ b/libraries/AsyncUDP/library.properties @@ -1,5 +1,5 @@ name=ESP32 Async UDP -version=3.1.2 +version=3.1.3 author=Me-No-Dev maintainer=Me-No-Dev sentence=Async UDP Library for ESP32 diff --git a/libraries/BLE/library.properties b/libraries/BLE/library.properties index 35346c13b67..12da8222e0c 100644 --- a/libraries/BLE/library.properties +++ b/libraries/BLE/library.properties @@ -1,5 +1,5 @@ name=BLE -version=3.1.2 +version=3.1.3 author=Neil Kolban maintainer=Dariusz Krempa sentence=BLE functions for ESP32 diff --git a/libraries/BluetoothSerial/library.properties b/libraries/BluetoothSerial/library.properties index d33d461d77c..1cdb6302a8a 100644 --- a/libraries/BluetoothSerial/library.properties +++ b/libraries/BluetoothSerial/library.properties @@ -1,5 +1,5 @@ name=BluetoothSerial -version=3.1.2 +version=3.1.3 author=Evandro Copercini maintainer=Evandro Copercini sentence=Simple UART to Classical Bluetooth bridge for ESP32 diff --git a/libraries/DNSServer/library.properties b/libraries/DNSServer/library.properties index 7996c2fef5f..7531b2e52cd 100644 --- a/libraries/DNSServer/library.properties +++ b/libraries/DNSServer/library.properties @@ -1,5 +1,5 @@ name=DNSServer -version=3.1.2 +version=3.1.3 author=Kristijan Novoselić maintainer=Kristijan Novoselić, sentence=A simple DNS server for ESP32. diff --git a/libraries/EEPROM/library.properties b/libraries/EEPROM/library.properties index aabaf2e3be1..4eab97edf9a 100644 --- a/libraries/EEPROM/library.properties +++ b/libraries/EEPROM/library.properties @@ -1,5 +1,5 @@ name=EEPROM -version=3.1.2 +version=3.1.3 author=Ivan Grokhotkov maintainer=Paolo Becchi sentence=Enables reading and writing data a sequential, addressable FLASH storage diff --git a/libraries/ESP32/library.properties b/libraries/ESP32/library.properties index f3cc3d94be2..d8c88776595 100644 --- a/libraries/ESP32/library.properties +++ b/libraries/ESP32/library.properties @@ -1,5 +1,5 @@ name=ESP32 -version=3.1.2 +version=3.1.3 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 sketches examples diff --git a/libraries/ESP_I2S/library.properties b/libraries/ESP_I2S/library.properties index 8369862022c..44493d67ff2 100644 --- a/libraries/ESP_I2S/library.properties +++ b/libraries/ESP_I2S/library.properties @@ -1,5 +1,5 @@ name=ESP_I2S -version=3.1.2 +version=3.1.3 author=me-no-dev maintainer=me-no-dev sentence=Library for ESP I2S communication diff --git a/libraries/ESP_NOW/library.properties b/libraries/ESP_NOW/library.properties index 1f7999ed26f..79c97131fb3 100644 --- a/libraries/ESP_NOW/library.properties +++ b/libraries/ESP_NOW/library.properties @@ -1,5 +1,5 @@ name=ESP_NOW -version=3.1.2 +version=3.1.3 author=me-no-dev maintainer=P-R-O-C-H-Y sentence=Library for ESP_NOW diff --git a/libraries/ESP_SR/library.properties b/libraries/ESP_SR/library.properties index 35225ae79bc..6a59c25102f 100644 --- a/libraries/ESP_SR/library.properties +++ b/libraries/ESP_SR/library.properties @@ -1,5 +1,5 @@ name=ESP_SR -version=3.1.2 +version=3.1.3 author=me-no-dev maintainer=me-no-dev sentence=Library for ESP Sound Recognition diff --git a/libraries/ESPmDNS/library.properties b/libraries/ESPmDNS/library.properties index 3612e3a84de..925bb4fb258 100644 --- a/libraries/ESPmDNS/library.properties +++ b/libraries/ESPmDNS/library.properties @@ -1,5 +1,5 @@ name=ESPmDNS -version=3.1.2 +version=3.1.3 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 mDNS Library diff --git a/libraries/Ethernet/library.properties b/libraries/Ethernet/library.properties index 82fff9cb85e..da3bbbb2211 100644 --- a/libraries/Ethernet/library.properties +++ b/libraries/Ethernet/library.properties @@ -1,5 +1,5 @@ name=Ethernet -version=3.1.2 +version=3.1.3 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables network connection (local and Internet) using the ESP32 Ethernet. diff --git a/libraries/FFat/library.properties b/libraries/FFat/library.properties index 3c387cd3c64..574e184ba02 100644 --- a/libraries/FFat/library.properties +++ b/libraries/FFat/library.properties @@ -1,5 +1,5 @@ name=FFat -version=3.1.2 +version=3.1.3 author=Hristo Gochkov, Ivan Grokhtkov, Larry Bernstone maintainer=Hristo Gochkov sentence=ESP32 FAT on Flash File System diff --git a/libraries/FS/library.properties b/libraries/FS/library.properties index 1a00810a221..91fb4396ed4 100644 --- a/libraries/FS/library.properties +++ b/libraries/FS/library.properties @@ -1,5 +1,5 @@ name=FS -version=3.1.2 +version=3.1.3 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 File System diff --git a/libraries/HTTPClient/library.properties b/libraries/HTTPClient/library.properties index 20f971ba3ea..347ac4f122f 100644 --- a/libraries/HTTPClient/library.properties +++ b/libraries/HTTPClient/library.properties @@ -1,5 +1,5 @@ name=HTTPClient -version=3.1.2 +version=3.1.3 author=Markus Sattler maintainer=Markus Sattler sentence=HTTP Client for ESP32 diff --git a/libraries/HTTPUpdate/library.properties b/libraries/HTTPUpdate/library.properties index 9145001ce31..2bcb06bcad2 100644 --- a/libraries/HTTPUpdate/library.properties +++ b/libraries/HTTPUpdate/library.properties @@ -1,5 +1,5 @@ name=HTTPUpdate -version=3.1.2 +version=3.1.3 author=Markus Sattler maintainer=Markus Sattler sentence=Http Update for ESP32 diff --git a/libraries/HTTPUpdateServer/library.properties b/libraries/HTTPUpdateServer/library.properties index 7a05dd26e19..8eac2aab4cf 100644 --- a/libraries/HTTPUpdateServer/library.properties +++ b/libraries/HTTPUpdateServer/library.properties @@ -1,5 +1,5 @@ name=HTTPUpdateServer -version=3.1.2 +version=3.1.3 author=Hristo Kapanakov maintainer= sentence=Simple HTTP Update server based on the WebServer diff --git a/libraries/Insights/library.properties b/libraries/Insights/library.properties index 076b5b8d0fb..b33dd15755a 100644 --- a/libraries/Insights/library.properties +++ b/libraries/Insights/library.properties @@ -1,5 +1,5 @@ name=ESP Insights -version=3.1.2 +version=3.1.3 author=Sanket Wadekar maintainer=Sanket Wadekar sentence=ESP Insights diff --git a/libraries/LittleFS/library.properties b/libraries/LittleFS/library.properties index f0d29ce90d8..233e5b1ab56 100644 --- a/libraries/LittleFS/library.properties +++ b/libraries/LittleFS/library.properties @@ -1,5 +1,5 @@ name=LittleFS -version=3.1.2 +version=3.1.3 author= maintainer= sentence=LittleFS for esp32 diff --git a/libraries/Matter/library.properties b/libraries/Matter/library.properties index 7f84307354e..f0eea397fe8 100644 --- a/libraries/Matter/library.properties +++ b/libraries/Matter/library.properties @@ -1,5 +1,5 @@ name=Matter -version=3.1.2 +version=3.1.3 author=Rodrigo Garcia | GitHub @SuGlider maintainer=Rodrigo Garcia sentence=Library for supporting Matter environment on ESP32. diff --git a/libraries/NetBIOS/library.properties b/libraries/NetBIOS/library.properties index 571a5a75d9d..bf223a34828 100644 --- a/libraries/NetBIOS/library.properties +++ b/libraries/NetBIOS/library.properties @@ -1,5 +1,5 @@ name=NetBIOS -version=3.1.2 +version=3.1.3 author=Pablo@xpablo.cz maintainer=Hristo Gochkov sentence=Enables NBNS (NetBIOS) name resolution. diff --git a/libraries/Network/library.properties b/libraries/Network/library.properties index e7dea53d2e7..bd5d5677dca 100644 --- a/libraries/Network/library.properties +++ b/libraries/Network/library.properties @@ -1,5 +1,5 @@ name=Networking -version=3.1.2 +version=3.1.3 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=General network management library. diff --git a/libraries/NetworkClientSecure/library.properties b/libraries/NetworkClientSecure/library.properties index ec5ee5e2548..0754e59fba5 100644 --- a/libraries/NetworkClientSecure/library.properties +++ b/libraries/NetworkClientSecure/library.properties @@ -1,5 +1,5 @@ name=NetworkClientSecure -version=3.1.2 +version=3.1.3 author=Evandro Luis Copercini maintainer=Github Community sentence=Enables secure network connection (local and Internet) using the ESP32 built-in WiFi. diff --git a/libraries/OpenThread/library.properties b/libraries/OpenThread/library.properties index ed4506d5efd..078c4b58acc 100644 --- a/libraries/OpenThread/library.properties +++ b/libraries/OpenThread/library.properties @@ -1,5 +1,5 @@ name=OpenThread -version=3.1.2 +version=3.1.3 author=Rodrigo Garcia | GitHub @SuGlider maintainer=Rodrigo Garcia sentence=Library for OpenThread Network on ESP32. diff --git a/libraries/PPP/library.properties b/libraries/PPP/library.properties index 5266ac6f6f7..2d5d3d83877 100644 --- a/libraries/PPP/library.properties +++ b/libraries/PPP/library.properties @@ -1,5 +1,5 @@ name=PPP -version=3.1.2 +version=3.1.3 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables network connection using GSM Modem. diff --git a/libraries/Preferences/library.properties b/libraries/Preferences/library.properties index d5e3a99d081..f6cdb8a074c 100644 --- a/libraries/Preferences/library.properties +++ b/libraries/Preferences/library.properties @@ -1,5 +1,5 @@ name=Preferences -version=3.1.2 +version=3.1.3 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Provides friendly access to ESP32's Non-Volatile Storage diff --git a/libraries/RainMaker/library.properties b/libraries/RainMaker/library.properties index 2ff5262c31a..6b8ba658eb4 100644 --- a/libraries/RainMaker/library.properties +++ b/libraries/RainMaker/library.properties @@ -1,5 +1,5 @@ name=ESP RainMaker -version=3.1.2 +version=3.1.3 author=Sweety Mhaiske maintainer=Hristo Gochkov sentence=ESP RainMaker Support diff --git a/libraries/SD/library.properties b/libraries/SD/library.properties index 20815d220d2..00766c48470 100644 --- a/libraries/SD/library.properties +++ b/libraries/SD/library.properties @@ -1,5 +1,5 @@ name=SD -version=3.1.2 +version=3.1.3 author=Arduino, SparkFun maintainer=Arduino sentence=Enables reading and writing on SD cards. For all Arduino boards. diff --git a/libraries/SD_MMC/library.properties b/libraries/SD_MMC/library.properties index 9ebf53dde74..0cc0a80afd2 100644 --- a/libraries/SD_MMC/library.properties +++ b/libraries/SD_MMC/library.properties @@ -1,5 +1,5 @@ name=SD_MMC -version=3.1.2 +version=3.1.3 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 SDMMC File System diff --git a/libraries/SPI/library.properties b/libraries/SPI/library.properties index 81c76fcca48..57e44241438 100644 --- a/libraries/SPI/library.properties +++ b/libraries/SPI/library.properties @@ -1,5 +1,5 @@ name=SPI -version=3.1.2 +version=3.1.3 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables the communication with devices that use the Serial Peripheral Interface (SPI) Bus. For all Arduino boards, BUT Arduino DUE. diff --git a/libraries/SPIFFS/library.properties b/libraries/SPIFFS/library.properties index 94f38b3ea00..5ecc75c000d 100644 --- a/libraries/SPIFFS/library.properties +++ b/libraries/SPIFFS/library.properties @@ -1,5 +1,5 @@ name=SPIFFS -version=3.1.2 +version=3.1.3 author=Hristo Gochkov, Ivan Grokhtkov maintainer=Hristo Gochkov sentence=ESP32 SPIFFS File System diff --git a/libraries/SimpleBLE/library.properties b/libraries/SimpleBLE/library.properties index 1ad4a83a69a..d5570c41751 100644 --- a/libraries/SimpleBLE/library.properties +++ b/libraries/SimpleBLE/library.properties @@ -1,5 +1,5 @@ name=SimpleBLE -version=3.1.2 +version=3.1.3 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Provides really simple BLE advertizer with just on and off diff --git a/libraries/TFLiteMicro/library.properties b/libraries/TFLiteMicro/library.properties index 39badc8ba1b..259df824a45 100644 --- a/libraries/TFLiteMicro/library.properties +++ b/libraries/TFLiteMicro/library.properties @@ -1,5 +1,5 @@ name=TFLite Micro -version=3.1.2 +version=3.1.3 author=Sanket Wadekar maintainer=Sanket Wadekar sentence=TensorFlow Lite for Microcontrollers diff --git a/libraries/Ticker/library.properties b/libraries/Ticker/library.properties index 080a4a17f40..7f2cdab5220 100644 --- a/libraries/Ticker/library.properties +++ b/libraries/Ticker/library.properties @@ -1,5 +1,5 @@ name=Ticker -version=3.1.2 +version=3.1.3 author=Bert Melis maintainer=Hristo Gochkov sentence=Allows to call functions with a given interval. diff --git a/libraries/USB/library.properties b/libraries/USB/library.properties index 9dc655dbd10..e0bc6c4b7e7 100644 --- a/libraries/USB/library.properties +++ b/libraries/USB/library.properties @@ -1,5 +1,5 @@ name=USB -version=3.1.2 +version=3.1.3 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=ESP32S2 USB Library diff --git a/libraries/Update/library.properties b/libraries/Update/library.properties index 83fbfd4c901..f81897a64d6 100644 --- a/libraries/Update/library.properties +++ b/libraries/Update/library.properties @@ -1,5 +1,5 @@ name=Update -version=3.1.2 +version=3.1.3 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=ESP32 Sketch Update Library diff --git a/libraries/WebServer/library.properties b/libraries/WebServer/library.properties index 73d8d87d690..c9153541cb2 100644 --- a/libraries/WebServer/library.properties +++ b/libraries/WebServer/library.properties @@ -1,5 +1,5 @@ name=WebServer -version=3.1.2 +version=3.1.3 author=Ivan Grokhotkov maintainer=Ivan Grokhtkov sentence=Simple web server library diff --git a/libraries/WiFi/library.properties b/libraries/WiFi/library.properties index 608bf607bf7..e72f082f8e6 100644 --- a/libraries/WiFi/library.properties +++ b/libraries/WiFi/library.properties @@ -1,5 +1,5 @@ name=WiFi -version=3.1.2 +version=3.1.3 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Enables network connection (local and Internet) using the ESP32 built-in WiFi. diff --git a/libraries/WiFiProv/library.properties b/libraries/WiFiProv/library.properties index c87cbcd8cee..6334a5be5c4 100644 --- a/libraries/WiFiProv/library.properties +++ b/libraries/WiFiProv/library.properties @@ -1,5 +1,5 @@ name=WiFiProv -version=3.1.2 +version=3.1.3 author=Switi Mhaiske maintainer=Hristo Gochkov sentence=Enables provisioning. diff --git a/libraries/Wire/library.properties b/libraries/Wire/library.properties index a23b33f431d..044ba74c3d0 100644 --- a/libraries/Wire/library.properties +++ b/libraries/Wire/library.properties @@ -1,5 +1,5 @@ name=Wire -version=3.1.2 +version=3.1.3 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=Allows the communication between devices or sensors connected via Two Wire Interface Bus. For esp8266 boards. diff --git a/libraries/Zigbee/library.properties b/libraries/Zigbee/library.properties index 18fb81548c0..29704db1a92 100644 --- a/libraries/Zigbee/library.properties +++ b/libraries/Zigbee/library.properties @@ -1,5 +1,5 @@ name=Zigbee -version=3.1.2 +version=3.1.3 author=P-R-O-C-H-Y maintainer=Jan Procházka sentence=Enables zigbee connection with the ESP32 diff --git a/package.json b/package.json index 748a2ad1bfb..3a5c290a1cd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "framework-arduinoespressif32", - "version": "3.1.2", + "version": "3.1.3", "description": "Arduino Wiring-based Framework for the Espressif ESP32, ESP32-P4, ESP32-S and ESP32-C series of SoCs", "keywords": [ "framework", diff --git a/platform.txt b/platform.txt index 2b7d40cff11..1c718369587 100644 --- a/platform.txt +++ b/platform.txt @@ -1,5 +1,5 @@ name=ESP32 Arduino -version=3.1.2 +version=3.1.3 tools.esp32-arduino-libs.path={runtime.platform.path}/tools/esp32-arduino-libs tools.esp32-arduino-libs.path.windows={runtime.platform.path}\tools\esp32-arduino-libs From 0ab523de962a045c6b147d42824812d5fa2b7567 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 4 Jun 2025 18:12:02 +0200 Subject: [PATCH 183/183] Backport: changes to compile v3.1.x as component of IDF branch release/v5.3 (#11359) * changes to compile as component of IDF branch release/v5.3 * Update esp32-hal-i2c-slave.c * fix(runners): Use latest ubuntu image --------- Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> --- .github/workflows/build_py_tools.yml | 6 +++--- .github/workflows/push.yml | 2 +- cores/esp32/esp32-hal-i2c-slave.c | 5 +++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_py_tools.yml b/.github/workflows/build_py_tools.yml index 48e7f2c82d3..250d18ab6c0 100644 --- a/.github/workflows/build_py_tools.yml +++ b/.github/workflows/build_py_tools.yml @@ -12,7 +12,7 @@ on: jobs: find-changed-tools: name: Check if tools have been changed - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest outputs: any_changed: ${{ steps.verify-changed-files.outputs.any_changed }} all_changed_files: ${{ steps.verify-changed-files.outputs.all_changed_files }} @@ -55,7 +55,7 @@ jobs: strategy: fail-fast: false matrix: - os: [windows-latest, macos-latest, ubuntu-20.04, ARM] + os: [windows-latest, macos-latest, ubuntu-latest, ARM] include: - os: windows-latest TARGET: win64 @@ -64,7 +64,7 @@ jobs: - os: macos-latest TARGET: macos SEPARATOR: ":" - - os: ubuntu-20.04 + - os: ubuntu-latest TARGET: linux-amd64 SEPARATOR: ":" - os: ARM diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 2ca9e52e48d..3ef4e7edbe3 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -237,7 +237,7 @@ jobs: needs.gen-chunks.outputs.build_all == 'true' || needs.gen-chunks.outputs.build_libraries == 'true' || needs.gen-chunks.outputs.build_idf == 'true' - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest strategy: fail-fast: false matrix: diff --git a/cores/esp32/esp32-hal-i2c-slave.c b/cores/esp32/esp32-hal-i2c-slave.c index 85eddcdfcf4..edaa15aaab5 100644 --- a/cores/esp32/esp32-hal-i2c-slave.c +++ b/cores/esp32/esp32-hal-i2c-slave.c @@ -335,7 +335,12 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t } #endif // !defined(CONFIG_IDF_TARGET_ESP32P4) +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 3) + i2c_ll_set_mode(i2c->dev, I2C_BUS_MODE_SLAVE); + i2c_ll_enable_pins_open_drain(i2c->dev, true); +#else i2c_ll_slave_init(i2c->dev); +#endif i2c_ll_slave_set_fifo_mode(i2c->dev, true); i2c_ll_set_slave_addr(i2c->dev, slaveID, false); i2c_ll_set_tout(i2c->dev, I2C_LL_MAX_TIMEOUT);

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%0Dx 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�s$i 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

6Zy05R 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