From 7089c0a18873bdca74a1880ec9a73d6e03b523be 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, 21 Jan 2025 12:24:43 +0100 Subject: [PATCH 001/290] fix(zigbee): Update esp-zigbee-sdk to 1.6.2 + necessary changes --- boards.txt | 202 +++++++++--------- idf_component.yml | 4 +- .../src/ep/ZigbeeCarbonDioxideSensor.cpp | 3 - 3 files changed, 103 insertions(+), 106 deletions(-) diff --git a/boards.txt b/boards.txt index 8e9655cda48..f3c60dccf1d 100644 --- a/boards.txt +++ b/boards.txt @@ -536,22 +536,22 @@ esp32h2.menu.ZigbeeMode.default.build.zigbee_mode= esp32h2.menu.ZigbeeMode.default.build.zigbee_libs= esp32h2.menu.ZigbeeMode.ed=Zigbee ED (end device) esp32h2.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -esp32h2.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +esp32h2.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native esp32h2.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32h2.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -esp32h2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +esp32h2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native 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.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native 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.ed_debug.build.zigbee_libs=-lesp_zb_api.ed.debug -lzboss_stack.ed.debug -lzboss_port.native.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.zczr_debug.build.zigbee_libs=-lesp_zb_api.zczr.debug -lzboss_stack.zczr.debug -lzboss_port.native.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 +esp32h2.menu.ZigbeeMode.rcp_debug.build.zigbee_libs=-lesp_zb_api.rcp.debug -lzboss_stack.rcp.debug -lzboss_port.native.debug ############################################################## @@ -748,22 +748,22 @@ esp32c6.menu.ZigbeeMode.default.build.zigbee_mode= esp32c6.menu.ZigbeeMode.default.build.zigbee_libs= esp32c6.menu.ZigbeeMode.ed=Zigbee ED (end device) esp32c6.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native esp32c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native 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.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native 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.ed_debug.build.zigbee_libs=-lesp_zb_api.ed.debug -lzboss_stack.ed.debug -lzboss_port.native.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.zczr_debug.build.zigbee_libs=-lesp_zb_api.zczr.debug -lzboss_stack.zczr.debug -lzboss_port.native.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 +esp32c6.menu.ZigbeeMode.rcp_debug.build.zigbee_libs=-lesp_zb_api.rcp.debug -lzboss_stack.rcp.debug -lzboss_port.native.debug ############################################################## @@ -1014,7 +1014,7 @@ esp32s3.menu.ZigbeeMode.default.build.zigbee_mode= esp32s3.menu.ZigbeeMode.default.build.zigbee_libs= esp32s3.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32s3.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -esp32s3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +esp32s3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -1194,7 +1194,7 @@ esp32c3.menu.ZigbeeMode.default.build.zigbee_mode= esp32c3.menu.ZigbeeMode.default.build.zigbee_libs= esp32c3.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32c3.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -esp32c3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +esp32c3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -1401,7 +1401,7 @@ esp32s2.menu.ZigbeeMode.default.build.zigbee_mode= esp32s2.menu.ZigbeeMode.default.build.zigbee_libs= esp32s2.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32s2.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -esp32s2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +esp32s2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -1595,7 +1595,7 @@ esp32.menu.ZigbeeMode.default.build.zigbee_mode= esp32.menu.ZigbeeMode.default.build.zigbee_libs= esp32.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -esp32.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +esp32.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -4965,13 +4965,13 @@ um_tinyc6.menu.ZigbeeMode.default.build.zigbee_mode= um_tinyc6.menu.ZigbeeMode.default.build.zigbee_libs= um_tinyc6.menu.ZigbeeMode.ed=Zigbee ED (end device) um_tinyc6.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -um_tinyc6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +um_tinyc6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native um_tinyc6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) um_tinyc6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -um_tinyc6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +um_tinyc6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native um_tinyc6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) um_tinyc6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -um_tinyc6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +um_tinyc6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -7790,7 +7790,7 @@ sparkfun_esp32s3_thing_plus.menu.ZigbeeMode.default.build.zigbee_mode= sparkfun_esp32s3_thing_plus.menu.ZigbeeMode.default.build.zigbee_libs= sparkfun_esp32s3_thing_plus.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator) sparkfun_esp32s3_thing_plus.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -sparkfun_esp32s3_thing_plus.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +sparkfun_esp32s3_thing_plus.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -7970,13 +7970,13 @@ sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.default.build.zigbee_mode= sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.default.build.zigbee_libs= sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.ed=Zigbee ED (end device) sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -8563,13 +8563,13 @@ sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.default.build.zigbee_mode= sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.default.build.zigbee_libs= sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.ed=Zigbee ED (end device) sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -11797,13 +11797,13 @@ dfrobot_beetle_esp32c6.menu.ZigbeeMode.default.build.zigbee_mode= dfrobot_beetle_esp32c6.menu.ZigbeeMode.default.build.zigbee_libs= dfrobot_beetle_esp32c6.menu.ZigbeeMode.ed=Zigbee ED (end device) dfrobot_beetle_esp32c6.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -dfrobot_beetle_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +dfrobot_beetle_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native dfrobot_beetle_esp32c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) dfrobot_beetle_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -dfrobot_beetle_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +dfrobot_beetle_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native dfrobot_beetle_esp32c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) dfrobot_beetle_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -dfrobot_beetle_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +dfrobot_beetle_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -12346,13 +12346,13 @@ dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.default.build.zigbee_mode= dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.default.build.zigbee_libs= dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.ed=Zigbee ED (end device) dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -12948,7 +12948,7 @@ adafruit_metro_esp32s2.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_metro_esp32s2.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_metro_esp32s2.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_metro_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_metro_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_metro_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit Metro ESP32-S3 @@ -13151,7 +13151,7 @@ adafruit_metro_esp32s3.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_metro_esp32s3.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_metro_esp32s3.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_metro_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_metro_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_metro_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit MagTag 2.9" @@ -13334,7 +13334,7 @@ adafruit_magtag29_esp32s2.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_magtag29_esp32s2.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_magtag29_esp32s2.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_magtag29_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_magtag29_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_magtag29_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit FunHouse @@ -13517,7 +13517,7 @@ adafruit_funhouse_esp32s2.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_funhouse_esp32s2.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_funhouse_esp32s2.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_funhouse_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_funhouse_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_funhouse_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit ESP32 Feather @@ -13651,7 +13651,7 @@ featheresp32.menu.ZigbeeMode.default.build.zigbee_mode= featheresp32.menu.ZigbeeMode.default.build.zigbee_libs= featheresp32.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) featheresp32.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -featheresp32.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +featheresp32.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit Feather ESP32 V2 @@ -13772,7 +13772,7 @@ adafruit_feather_esp32_v2.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_feather_esp32_v2.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_feather_esp32_v2.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_feather_esp32_v2.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_feather_esp32_v2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_feather_esp32_v2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit Feather ESP32-S2 @@ -13955,7 +13955,7 @@ adafruit_feather_esp32s2.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_feather_esp32s2.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_feather_esp32s2.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_feather_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_feather_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_feather_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit Feather ESP32-S2 TFT @@ -14138,7 +14138,7 @@ adafruit_feather_esp32s2_tft.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_feather_esp32s2_tft.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_feather_esp32s2_tft.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_feather_esp32s2_tft.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_feather_esp32s2_tft.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_feather_esp32s2_tft.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit Feather ESP32-S2 Reverse TFT @@ -14321,7 +14321,7 @@ adafruit_feather_esp32s2_reversetft.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_feather_esp32s2_reversetft.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_feather_esp32s2_reversetft.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_feather_esp32s2_reversetft.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_feather_esp32s2_reversetft.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_feather_esp32s2_reversetft.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit Feather ESP32-S3 2MB PSRAM @@ -14539,7 +14539,7 @@ adafruit_feather_esp32s3.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_feather_esp32s3.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_feather_esp32s3.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_feather_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_feather_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_feather_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit Feather ESP32-S3 No PSRAM @@ -14726,7 +14726,7 @@ adafruit_feather_esp32s3_nopsram.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_feather_esp32s3_nopsram.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_feather_esp32s3_nopsram.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_feather_esp32s3_nopsram.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_feather_esp32s3_nopsram.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_feather_esp32s3_nopsram.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit Feather ESP32-S3 TFT @@ -14944,7 +14944,7 @@ adafruit_feather_esp32s3_tft.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_feather_esp32s3_tft.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_feather_esp32s3_tft.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_feather_esp32s3_tft.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_feather_esp32s3_tft.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_feather_esp32s3_tft.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit Feather ESP32-S3 Reverse TFT @@ -15162,7 +15162,7 @@ adafruit_feather_esp32s3_reversetft.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_feather_esp32s3_reversetft.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_feather_esp32s3_reversetft.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_feather_esp32s3_reversetft.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_feather_esp32s3_reversetft.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_feather_esp32s3_reversetft.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################# # Feather C6 @@ -15334,13 +15334,13 @@ adafruit_feather_esp32c6.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_feather_esp32c6.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_feather_esp32c6.menu.ZigbeeMode.ed=Zigbee ED (end device) adafruit_feather_esp32c6.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -adafruit_feather_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +adafruit_feather_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native adafruit_feather_esp32c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_feather_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_feather_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_feather_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native adafruit_feather_esp32c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) adafruit_feather_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -adafruit_feather_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +adafruit_feather_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native @@ -15463,7 +15463,7 @@ adafruit_qtpy_esp32_pico.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_qtpy_esp32_pico.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_qtpy_esp32_pico.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_qtpy_esp32_pico.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_qtpy_esp32_pico.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_qtpy_esp32_pico.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit QT Py ESP32-C3 @@ -15598,7 +15598,7 @@ adafruit_qtpy_esp32c3.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_qtpy_esp32c3.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_qtpy_esp32c3.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_qtpy_esp32c3.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_qtpy_esp32c3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_qtpy_esp32c3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit QT Py ESP32-S2 @@ -15781,7 +15781,7 @@ adafruit_qtpy_esp32s2.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_qtpy_esp32s2.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_qtpy_esp32s2.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_qtpy_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_qtpy_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_qtpy_esp32s2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit QT Py ESP32-S3 No PSRAM @@ -15968,7 +15968,7 @@ adafruit_qtpy_esp32s3_nopsram.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_qtpy_esp32s3_nopsram.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_qtpy_esp32s3_nopsram.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_qtpy_esp32s3_nopsram.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_qtpy_esp32s3_nopsram.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_qtpy_esp32s3_nopsram.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit QT Py ESP32-S3 (4M Flash 2M PSRAM) @@ -16186,7 +16186,7 @@ adafruit_qtpy_esp32s3_n4r2.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_qtpy_esp32s3_n4r2.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_qtpy_esp32s3_n4r2.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_qtpy_esp32s3_n4r2.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_qtpy_esp32s3_n4r2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_qtpy_esp32s3_n4r2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit ItsyBitsy ESP32 @@ -16304,7 +16304,7 @@ adafruit_itsybitsy_esp32.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_itsybitsy_esp32.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_itsybitsy_esp32.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_itsybitsy_esp32.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_itsybitsy_esp32.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_itsybitsy_esp32.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit MatrixPortal ESP32-S3 @@ -16501,7 +16501,7 @@ adafruit_matrixportal_esp32s3.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_matrixportal_esp32s3.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_matrixportal_esp32s3.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_matrixportal_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_matrixportal_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_matrixportal_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit pyCamera S3 @@ -16719,7 +16719,7 @@ adafruit_camera_esp32s3.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_camera_esp32s3.menu.ZigbeeMode.default.build.zigbee_libs= adafruit_camera_esp32s3.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_camera_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -adafruit_camera_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +adafruit_camera_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit Qualia ESP32-S3 RGB666 @@ -16922,7 +16922,7 @@ adafruit_qualia_s3_rgb666.menu.ZigbeeMode.default.build.zigbee_mode= adafruit_qualia_s3_rgb666.menu.ZigbeeMode.default.build.zigbee_libs= 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_qualia_s3_rgb666.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit Sparkle Motion w/ESP32 @@ -17056,7 +17056,7 @@ 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 +sparklemotion.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## # Adafruit Sparkle Motion Mini w/ESP32 @@ -17190,7 +17190,7 @@ 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 +sparklemotionmini.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -17644,7 +17644,7 @@ nologo_esp32s3_pico.menu.ZigbeeMode.default.build.zigbee_mode= nologo_esp32s3_pico.menu.ZigbeeMode.default.build.zigbee_libs= nologo_esp32s3_pico.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) nologo_esp32s3_pico.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -nologo_esp32s3_pico.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +nologo_esp32s3_pico.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -19577,13 +19577,13 @@ esp32c6-evb.menu.ZigbeeMode.default.build.zigbee_mode= esp32c6-evb.menu.ZigbeeMode.default.build.zigbee_libs= esp32c6-evb.menu.ZigbeeMode.ed=Zigbee ED (end device) esp32c6-evb.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -esp32c6-evb.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +esp32c6-evb.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native esp32c6-evb.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32c6-evb.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -esp32c6-evb.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +esp32c6-evb.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native esp32c6-evb.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) esp32c6-evb.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -esp32c6-evb.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +esp32c6-evb.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -19757,13 +19757,13 @@ esp32h2-devkitlipo.menu.ZigbeeMode.default.build.zigbee_mode= esp32h2-devkitlipo.menu.ZigbeeMode.default.build.zigbee_libs= esp32h2-devkitlipo.menu.ZigbeeMode.ed=Zigbee ED (end device) esp32h2-devkitlipo.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -esp32h2-devkitlipo.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +esp32h2-devkitlipo.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native esp32h2-devkitlipo.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32h2-devkitlipo.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -esp32h2-devkitlipo.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +esp32h2-devkitlipo.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native esp32h2-devkitlipo.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) esp32h2-devkitlipo.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -esp32h2-devkitlipo.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +esp32h2-devkitlipo.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -19954,7 +19954,7 @@ esp32-sbc-fabgl.menu.ZigbeeMode.default.build.zigbee_mode= esp32-sbc-fabgl.menu.ZigbeeMode.default.build.zigbee_libs= esp32-sbc-fabgl.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32-sbc-fabgl.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -esp32-sbc-fabgl.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +esp32-sbc-fabgl.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -24628,13 +24628,13 @@ m5stack_nanoc6.menu.ZigbeeMode.default.build.zigbee_mode= m5stack_nanoc6.menu.ZigbeeMode.default.build.zigbee_libs= m5stack_nanoc6.menu.ZigbeeMode.ed=Zigbee ED (end device) m5stack_nanoc6.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -m5stack_nanoc6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +m5stack_nanoc6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native m5stack_nanoc6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) m5stack_nanoc6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -m5stack_nanoc6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +m5stack_nanoc6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native m5stack_nanoc6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) m5stack_nanoc6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -m5stack_nanoc6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +m5stack_nanoc6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -35023,13 +35023,13 @@ XIAO_ESP32C6.menu.ZigbeeMode.default.build.zigbee_mode= XIAO_ESP32C6.menu.ZigbeeMode.default.build.zigbee_libs= XIAO_ESP32C6.menu.ZigbeeMode.ed=Zigbee ED (end device) XIAO_ESP32C6.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -XIAO_ESP32C6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +XIAO_ESP32C6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native XIAO_ESP32C6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) XIAO_ESP32C6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -XIAO_ESP32C6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +XIAO_ESP32C6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native XIAO_ESP32C6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) XIAO_ESP32C6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -XIAO_ESP32C6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +XIAO_ESP32C6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -39384,13 +39384,13 @@ ioxesp32c6.menu.ZigbeeMode.default.build.zigbee_mode= ioxesp32c6.menu.ZigbeeMode.default.build.zigbee_libs= ioxesp32c6.menu.ZigbeeMode.ed=Zigbee ED (end device) ioxesp32c6.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -ioxesp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +ioxesp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native ioxesp32c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator) ioxesp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -ioxesp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +ioxesp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native ioxesp32c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) ioxesp32c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -ioxesp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +ioxesp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## # ATD1.47-S3 @@ -40568,13 +40568,13 @@ epulse_feather_c6.menu.ZigbeeMode.default.build.zigbee_mode= epulse_feather_c6.menu.ZigbeeMode.default.build.zigbee_libs= epulse_feather_c6.menu.ZigbeeMode.ed=Zigbee ED (end device) epulse_feather_c6.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -epulse_feather_c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +epulse_feather_c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native epulse_feather_c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) epulse_feather_c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -epulse_feather_c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +epulse_feather_c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native epulse_feather_c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) epulse_feather_c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -epulse_feather_c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +epulse_feather_c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -43052,7 +43052,7 @@ jczn_2432s028r.menu.ZigbeeMode.default.build.zigbee_mode= jczn_2432s028r.menu.ZigbeeMode.default.build.zigbee_libs= jczn_2432s028r.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) jczn_2432s028r.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -jczn_2432s028r.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +jczn_2432s028r.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -44695,7 +44695,7 @@ waveshare_esp32_s3_touch_lcd_185.menu.ZigbeeMode.default.build.zigbee_mode= waveshare_esp32_s3_touch_lcd_185.menu.ZigbeeMode.default.build.zigbee_libs= waveshare_esp32_s3_touch_lcd_185.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) waveshare_esp32_s3_touch_lcd_185.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -waveshare_esp32_s3_touch_lcd_185.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +waveshare_esp32_s3_touch_lcd_185.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -44862,13 +44862,13 @@ cezerio_dev_esp32c6.menu.ZigbeeMode.default.build.zigbee_mode= cezerio_dev_esp32c6.menu.ZigbeeMode.default.build.zigbee_libs= cezerio_dev_esp32c6.menu.ZigbeeMode.ed=Zigbee ED (end device) cezerio_dev_esp32c6.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -cezerio_dev_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +cezerio_dev_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native cezerio_dev_esp32c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator) cezerio_dev_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -cezerio_dev_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +cezerio_dev_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native cezerio_dev_esp32c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) cezerio_dev_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -cezerio_dev_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +cezerio_dev_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -45035,13 +45035,13 @@ 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.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native 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.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native 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 +cezerio_mini_dev_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -45278,7 +45278,7 @@ waveshare_esp32_s3_lcd_185.menu.ZigbeeMode.default.build.zigbee_mode= waveshare_esp32_s3_lcd_185.menu.ZigbeeMode.default.build.zigbee_libs= waveshare_esp32_s3_lcd_185.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) waveshare_esp32_s3_lcd_185.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -waveshare_esp32_s3_lcd_185.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +waveshare_esp32_s3_lcd_185.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native ############################################################## @@ -45515,7 +45515,7 @@ waveshare_esp32_s3_touch_lcd_146.menu.ZigbeeMode.default.build.zigbee_mode= waveshare_esp32_s3_touch_lcd_146.menu.ZigbeeMode.default.build.zigbee_libs= waveshare_esp32_s3_touch_lcd_146.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) waveshare_esp32_s3_touch_lcd_146.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -waveshare_esp32_s3_touch_lcd_146.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +waveshare_esp32_s3_touch_lcd_146.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -45752,7 +45752,7 @@ waveshare_esp32_s3_lcd_146.menu.ZigbeeMode.default.build.zigbee_mode= waveshare_esp32_s3_lcd_146.menu.ZigbeeMode.default.build.zigbee_libs= waveshare_esp32_s3_lcd_146.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) waveshare_esp32_s3_lcd_146.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -waveshare_esp32_s3_lcd_146.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +waveshare_esp32_s3_lcd_146.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -45989,7 +45989,7 @@ waveshare_esp32_s3_touch_lcd_185_box.menu.ZigbeeMode.default.build.zigbee_mode= waveshare_esp32_s3_touch_lcd_185_box.menu.ZigbeeMode.default.build.zigbee_libs= waveshare_esp32_s3_touch_lcd_185_box.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) waveshare_esp32_s3_touch_lcd_185_box.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -waveshare_esp32_s3_touch_lcd_185_box.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +waveshare_esp32_s3_touch_lcd_185_box.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -46226,7 +46226,7 @@ waveshare_esp32_s3_lcd_147.menu.ZigbeeMode.default.build.zigbee_mode= waveshare_esp32_s3_lcd_147.menu.ZigbeeMode.default.build.zigbee_libs= waveshare_esp32_s3_lcd_147.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) waveshare_esp32_s3_lcd_147.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -waveshare_esp32_s3_lcd_147.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +waveshare_esp32_s3_lcd_147.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -46463,7 +46463,7 @@ waveshare_esp32_s3_touch_lcd_21.menu.ZigbeeMode.default.build.zigbee_mode= waveshare_esp32_s3_touch_lcd_21.menu.ZigbeeMode.default.build.zigbee_libs= waveshare_esp32_s3_touch_lcd_21.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) waveshare_esp32_s3_touch_lcd_21.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -waveshare_esp32_s3_touch_lcd_21.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +waveshare_esp32_s3_touch_lcd_21.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -46700,7 +46700,7 @@ waveshare_esp32_s3_touch_lcd_28.menu.ZigbeeMode.default.build.zigbee_mode= waveshare_esp32_s3_touch_lcd_28.menu.ZigbeeMode.default.build.zigbee_libs= waveshare_esp32_s3_touch_lcd_28.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) waveshare_esp32_s3_touch_lcd_28.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -waveshare_esp32_s3_touch_lcd_28.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +waveshare_esp32_s3_touch_lcd_28.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -46940,7 +46940,7 @@ waveshare_esp32_s3_relay_6ch.menu.ZigbeeMode.default.build.zigbee_mode= waveshare_esp32_s3_relay_6ch.menu.ZigbeeMode.default.build.zigbee_libs= waveshare_esp32_s3_relay_6ch.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) waveshare_esp32_s3_relay_6ch.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -waveshare_esp32_s3_relay_6ch.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +waveshare_esp32_s3_relay_6ch.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## @@ -47839,13 +47839,13 @@ 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.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native 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.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native 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_H2.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -47994,13 +47994,13 @@ 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.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native 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.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native 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 +Pcbcupid_GLYPH_C6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## diff --git a/idf_component.yml b/idf_component.yml index 9c6bd159d42..2a36244cdfc 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -52,12 +52,12 @@ dependencies: espressif/esp_modem: version: "^1.1.0" espressif/esp-zboss-lib: - version: "==1.6.0" + version: "==1.6.2" require: public rules: - if: "target not in [esp32c2, esp32p4]" espressif/esp-zigbee-lib: - version: "==1.6.0" + version: "==1.6.2" require: public rules: - if: "target not in [esp32c2, esp32p4]" diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp index 5def43f4199..0fbb0881bcf 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp @@ -42,9 +42,6 @@ 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; memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t)); reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV; From a4ecdb1a0f9cae404d29295a60f04dc835dcfba8 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, 14 Feb 2025 18:32:14 +0100 Subject: [PATCH 002/290] feat(zigbee): Bump esp-zigbee-sdk to 1.6.3 --- idf_component.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/idf_component.yml b/idf_component.yml index 2a36244cdfc..98678d5d381 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -52,12 +52,12 @@ dependencies: espressif/esp_modem: version: "^1.1.0" espressif/esp-zboss-lib: - version: "==1.6.2" + version: "==1.6.3" require: public rules: - if: "target not in [esp32c2, esp32p4]" espressif/esp-zigbee-lib: - version: "==1.6.2" + version: "==1.6.3" require: public rules: - if: "target not in [esp32c2, esp32p4]" From 20e5e706bef586c92b97ed3eb68281bcdd3ceb68 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, 17 Feb 2025 09:47:29 +0100 Subject: [PATCH 003/290] fix(boards): Delete removed Zigbee RCP mode --- boards.txt | 64 ------------------------------------------------------ 1 file changed, 64 deletions(-) diff --git a/boards.txt b/boards.txt index f3c60dccf1d..3fa2e865f0f 100644 --- a/boards.txt +++ b/boards.txt @@ -540,18 +540,12 @@ esp32h2.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -l esp32h2.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32h2.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR esp32h2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -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 -lzboss_stack.rcp -lzboss_port.native 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 -lzboss_stack.ed.debug -lzboss_port.native.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 -lzboss_stack.zczr.debug -lzboss_port.native.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 -lzboss_stack.rcp.debug -lzboss_port.native.debug ############################################################## @@ -752,18 +746,12 @@ esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -l esp32c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -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 -lzboss_stack.rcp -lzboss_port.native 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 -lzboss_stack.ed.debug -lzboss_port.native.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 -lzboss_stack.zczr.debug -lzboss_port.native.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 -lzboss_stack.rcp.debug -lzboss_port.native.debug ############################################################## @@ -4969,9 +4957,6 @@ um_tinyc6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed um_tinyc6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) um_tinyc6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR um_tinyc6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -um_tinyc6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -um_tinyc6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -um_tinyc6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -7974,9 +7959,6 @@ sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -sparkfun_esp32c6_thing_plus.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -8567,9 +8549,6 @@ sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api. sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -sparkfun_esp32c6_qwiic_pocket.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -11801,9 +11780,6 @@ dfrobot_beetle_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzb dfrobot_beetle_esp32c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) dfrobot_beetle_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR dfrobot_beetle_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -dfrobot_beetle_esp32c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -dfrobot_beetle_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -dfrobot_beetle_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -12350,10 +12326,6 @@ dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -dfrobot_firebeetle2_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native - ############################################################## # dfrobot Romeo ESP32-S3 @@ -15338,11 +15310,6 @@ adafruit_feather_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -l adafruit_feather_esp32c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) adafruit_feather_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR adafruit_feather_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -adafruit_feather_esp32c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -adafruit_feather_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -adafruit_feather_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native - - ############################################################## # Adafruit QT Py ESP32 @@ -19581,9 +19548,6 @@ esp32c6-evb.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.e esp32c6-evb.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32c6-evb.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR esp32c6-evb.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -esp32c6-evb.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -esp32c6-evb.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -esp32c6-evb.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -19761,9 +19725,6 @@ esp32h2-devkitlipo.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_ esp32h2-devkitlipo.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32h2-devkitlipo.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR esp32h2-devkitlipo.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -esp32h2-devkitlipo.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -esp32h2-devkitlipo.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -esp32h2-devkitlipo.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -24632,9 +24593,6 @@ m5stack_nanoc6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stac m5stack_nanoc6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) m5stack_nanoc6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR m5stack_nanoc6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -m5stack_nanoc6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -m5stack_nanoc6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -m5stack_nanoc6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -35027,9 +34985,6 @@ XIAO_ESP32C6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack. XIAO_ESP32C6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) XIAO_ESP32C6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR XIAO_ESP32C6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -XIAO_ESP32C6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -XIAO_ESP32C6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -XIAO_ESP32C6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -39388,9 +39343,6 @@ ioxesp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed ioxesp32c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator) ioxesp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR ioxesp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -ioxesp32c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -ioxesp32c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -ioxesp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## # ATD1.47-S3 @@ -40572,9 +40524,6 @@ epulse_feather_c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_s epulse_feather_c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) epulse_feather_c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR epulse_feather_c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -epulse_feather_c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -epulse_feather_c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -epulse_feather_c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -44866,9 +44815,6 @@ cezerio_dev_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss cezerio_dev_esp32c6.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator) cezerio_dev_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR cezerio_dev_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native -cezerio_dev_esp32c6.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -cezerio_dev_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -cezerio_dev_esp32c6.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api.rcp -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -45039,9 +44985,6 @@ cezerio_mini_dev_esp32c6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -l 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 -lzboss_stack.zczr -lzboss_port.native -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 -lzboss_stack.rcp -lzboss_port.native ############################################################## @@ -47843,13 +47786,9 @@ Pcbcupid_GLYPH_H2.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_s 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 -lzboss_stack.zczr -lzboss_port.native -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 -lzboss_stack.rcp -lzboss_port.native ############################################################## - Pcbcupid_GLYPH_C6.name=Pcbcupid GLYPH C6 Pcbcupid_GLYPH_C6.bootloader.tool=esptool_py @@ -47998,9 +47937,6 @@ Pcbcupid_GLYPH_C6.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_s 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 -lzboss_stack.zczr -lzboss_port.native -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 -lzboss_stack.rcp -lzboss_port.native ############################################################## From 47343a43f73e20b32f51f62fd54ce918ec8339cf Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Wed, 8 Jan 2025 13:26:13 +0200 Subject: [PATCH 004/290] feat(idf): Add support for IDF v5.4 (#10823) --- CMakeLists.txt | 2 +- cores/esp32/esp32-hal-i2c-slave.c | 8 ++++++++ idf_component.yml | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ee4ce664ec..4b22f0fab1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ # idf.py build set(min_supported_idf_version "5.3.0") -set(max_supported_idf_version "5.3.99") +set(max_supported_idf_version "5.4.99") set(idf_version "${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}.${IDF_VERSION_PATCH}") if ("${idf_version}" AND NOT "$ENV{ARDUINO_SKIP_IDF_VERSION_CHECK}") diff --git a/cores/esp32/esp32-hal-i2c-slave.c b/cores/esp32/esp32-hal-i2c-slave.c index 85eddcdfcf4..46c3a4d58c2 100644 --- a/cores/esp32/esp32-hal-i2c-slave.c +++ b/cores/esp32/esp32-hal-i2c-slave.c @@ -336,7 +336,11 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t #endif // !defined(CONFIG_IDF_TARGET_ESP32P4) i2c_ll_slave_init(i2c->dev); +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) + i2c_ll_enable_fifo_mode(i2c->dev, true); +#else i2c_ll_slave_set_fifo_mode(i2c->dev, true); +#endif i2c_ll_set_slave_addr(i2c->dev, slaveID, false); i2c_ll_set_tout(i2c->dev, I2C_LL_MAX_TIMEOUT); i2c_slave_set_frequency(i2c, frequency); @@ -357,7 +361,11 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t i2c_ll_disable_intr_mask(i2c->dev, I2C_LL_INTR_MASK); i2c_ll_clear_intr_mask(i2c->dev, I2C_LL_INTR_MASK); +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) + i2c_ll_enable_fifo_mode(i2c->dev, true); +#else i2c_ll_slave_set_fifo_mode(i2c->dev, true); +#endif if (!i2c->intr_handle) { uint32_t flags = ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_SHARED; diff --git a/idf_component.yml b/idf_component.yml index 9c6bd159d42..a8e6876b03f 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -44,7 +44,7 @@ files: - "platform.txt" - "programmers.txt" dependencies: - idf: ">=5.3,<5.4" + idf: ">=5.3,<5.5" # mdns 1.2.1 is necessary to build H2 with no WiFi espressif/mdns: version: "^1.2.3" From 50d85a6e9dfafd7ebb8e620ba54f6c7850e63e44 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Fri, 10 Jan 2025 14:07:07 +0200 Subject: [PATCH 005/290] fix(ci): Run CI against ESP-IDF v5.4 --- .github/workflows/push.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 2ca9e52e48d..bd5acfa7a40 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -245,7 +245,7 @@ jobs: # See https://hub.docker.com/r/espressif/idf/tags and # 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_ver: ["release-v5.4"] idf_target: [ "esp32", From 18cbd762c91fabeba649671ca682ea7eb624328d Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Wed, 15 Jan 2025 16:35:47 +0200 Subject: [PATCH 006/290] feat(eth): Add support for generic IEEE 802.3 driver (#10859) --- libraries/Ethernet/src/ETH.cpp | 3 +++ libraries/Ethernet/src/ETH.h | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/libraries/Ethernet/src/ETH.cpp b/libraries/Ethernet/src/ETH.cpp index fa8a2b97122..bf63de8724d 100644 --- a/libraries/Ethernet/src/ETH.cpp +++ b/libraries/Ethernet/src/ETH.cpp @@ -283,6 +283,9 @@ bool ETHClass::begin(eth_phy_type_t type, int32_t phy_addr, int mdc, int mdio, i esp_eth_phy_t *phy = NULL; switch (type) { +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) + case ETH_PHY_GENERIC: phy = esp_eth_phy_new_generic(&phy_config); break; +#endif case ETH_PHY_LAN8720: phy = esp_eth_phy_new_lan87xx(&phy_config); break; case ETH_PHY_TLK110: phy = esp_eth_phy_new_ip101(&phy_config); break; case ETH_PHY_RTL8201: phy = esp_eth_phy_new_rtl8201(&phy_config); break; diff --git a/libraries/Ethernet/src/ETH.h b/libraries/Ethernet/src/ETH.h index 582835cf8ac..cbddac065b9 100644 --- a/libraries/Ethernet/src/ETH.h +++ b/libraries/Ethernet/src/ETH.h @@ -23,6 +23,7 @@ #ifndef _ETH_H_ #define _ETH_H_ +#include "esp_idf_version.h" // // Example configurations for pins_arduino.h to allow starting with ETH.begin(); @@ -127,6 +128,10 @@ typedef emac_rmii_clock_mode_t eth_clock_mode_t; typedef enum { #if CONFIG_ETH_USE_ESP32_EMAC +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) + ETH_PHY_GENERIC, +#define ETH_PHY_JL1101 ETH_PHY_GENERIC +#endif ETH_PHY_LAN8720, ETH_PHY_TLK110, ETH_PHY_RTL8201, From f0cf3b1af674edabafd3d0464c99eeabac0d33f8 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 21 Jan 2025 13:14:16 +0200 Subject: [PATCH 007/290] feat(i2c): Add support for the new I2C driver in IDF v5.4 (#10858) * feat(i2c): Add support for the new I2C driver in IDF v5.4 * fix(build): Add the new driver to CMakeLists.txt * fix(i2c): Guard sleep retention Not all chips can restore I2C bus after light sleep * 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 + cores/esp32/esp32-hal-i2c-ng.c | 445 ++++++++++++++++++++++++++++++++ cores/esp32/esp32-hal-i2c.c | 3 + libraries/Wire/src/Wire.cpp | 17 +- libraries/Wire/src/Wire.h | 9 + variants/esp32c6/pins_arduino.h | 5 + 6 files changed, 476 insertions(+), 4 deletions(-) create mode 100644 cores/esp32/esp32-hal-i2c-ng.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b22f0fab1b..a17c516936c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,7 @@ set(CORE_SRCS cores/esp32/esp32-hal-dac.c cores/esp32/esp32-hal-gpio.c cores/esp32/esp32-hal-i2c.c + cores/esp32/esp32-hal-i2c-ng.c cores/esp32/esp32-hal-i2c-slave.c cores/esp32/esp32-hal-ledc.c cores/esp32/esp32-hal-matrix.c diff --git a/cores/esp32/esp32-hal-i2c-ng.c b/cores/esp32/esp32-hal-i2c-ng.c new file mode 100644 index 00000000000..8e48d0e0397 --- /dev/null +++ b/cores/esp32/esp32-hal-i2c-ng.c @@ -0,0 +1,445 @@ +// Copyright 2015-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. + +#include "esp32-hal-i2c.h" + +#if SOC_I2C_SUPPORTED +#include "esp_idf_version.h" +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) +#include "esp32-hal.h" +#if !CONFIG_DISABLE_HAL_LOCKS +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#endif +#include "esp_attr.h" +#include "esp_system.h" +#include "soc/soc_caps.h" +#include "driver/i2c_master.h" +#include "esp32-hal-periman.h" + +typedef volatile struct { + bool initialized; + uint32_t frequency; +#if !CONFIG_DISABLE_HAL_LOCKS + SemaphoreHandle_t lock; +#endif + int8_t scl; + int8_t sda; + i2c_master_bus_handle_t bus_handle; + i2c_master_dev_handle_t dev_handles[128]; +} i2c_bus_t; + +static i2c_bus_t bus[SOC_I2C_NUM]; + +static bool i2cDetachBus(void *bus_i2c_num) { + uint8_t i2c_num = (int)bus_i2c_num - 1; + if (!bus[i2c_num].initialized) { + return true; + } + esp_err_t err = i2cDeinit(i2c_num); + if (err != ESP_OK) { + log_e("i2cDeinit failed with error: %d", err); + return false; + } + return true; +} + +bool i2cIsInit(uint8_t i2c_num) { + if (i2c_num >= SOC_I2C_NUM) { + return false; + } + return bus[i2c_num].initialized; +} + +esp_err_t i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t frequency) { + esp_err_t ret = ESP_OK; + if (i2c_num >= SOC_I2C_NUM) { + return ESP_ERR_INVALID_ARG; + } +#if !CONFIG_DISABLE_HAL_LOCKS + if (bus[i2c_num].lock == NULL) { + bus[i2c_num].lock = xSemaphoreCreateMutex(); + if (bus[i2c_num].lock == NULL) { + log_e("xSemaphoreCreateMutex failed"); + return ESP_ERR_NO_MEM; + } + } + //acquire lock + if (xSemaphoreTake(bus[i2c_num].lock, portMAX_DELAY) != pdTRUE) { + log_e("could not acquire lock"); + return ESP_FAIL; + } +#endif + if (bus[i2c_num].initialized) { + log_e("bus is already initialized"); + ret = ESP_FAIL; + goto init_fail; + } + + if (!frequency) { + frequency = 100000UL; + } else if (frequency > 1000000UL) { + frequency = 1000000UL; + } + + perimanSetBusDeinit(ESP32_BUS_TYPE_I2C_MASTER_SDA, i2cDetachBus); + perimanSetBusDeinit(ESP32_BUS_TYPE_I2C_MASTER_SCL, i2cDetachBus); + + if (!perimanClearPinBus(sda) || !perimanClearPinBus(scl)) { + ret = ESP_FAIL; + goto init_fail; + } + + log_i("Initializing I2C Master: num=%u sda=%d scl=%d freq=%lu", i2c_num, sda, scl, frequency); + + i2c_master_bus_handle_t bus_handle = NULL; + i2c_master_bus_config_t bus_config; + memset(&bus_config, 0, sizeof(i2c_master_bus_config_t)); + bus_config.i2c_port = (i2c_port_num_t)i2c_num; + bus_config.sda_io_num = (gpio_num_t)sda; + bus_config.scl_io_num = (gpio_num_t)scl; +#if SOC_LP_I2C_SUPPORTED + if (i2c_num >= SOC_HP_I2C_NUM) { + bus_config.lp_source_clk = LP_I2C_SCLK_DEFAULT; + } else +#endif + { + bus_config.clk_source = I2C_CLK_SRC_DEFAULT; + } + bus_config.glitch_ignore_cnt = 7; + bus_config.intr_priority = 0; // auto + bus_config.trans_queue_depth = 0; // only valid in asynchronous transaction, which Arduino does not use + bus_config.flags.enable_internal_pullup = 1; +#if SOC_I2C_SUPPORT_SLEEP_RETENTION + bus_config.flags.allow_pd = 1; // backup/restore the I2C registers before/after entering/exist sleep mode +#endif + + ret = i2c_new_master_bus(&bus_config, &bus_handle); + if (ret != ESP_OK) { + log_e("i2c_new_master_bus failed: [%d] %s", ret, esp_err_to_name(ret)); + } else { + bus[i2c_num].initialized = true; + bus[i2c_num].frequency = frequency; + bus[i2c_num].scl = scl; + bus[i2c_num].sda = sda; + bus[i2c_num].bus_handle = bus_handle; + for (uint8_t i = 0; i < 128; i++) { + bus[i2c_num].dev_handles[i] = NULL; + } + if (!perimanSetPinBus(sda, ESP32_BUS_TYPE_I2C_MASTER_SDA, (void *)(i2c_num + 1), i2c_num, -1) + || !perimanSetPinBus(scl, ESP32_BUS_TYPE_I2C_MASTER_SCL, (void *)(i2c_num + 1), i2c_num, -1)) { +#if !CONFIG_DISABLE_HAL_LOCKS + //release lock so that i2cDetachBus can execute i2cDeinit + xSemaphoreGive(bus[i2c_num].lock); +#endif + i2cDetachBus((void *)(i2c_num + 1)); + return ESP_FAIL; + } + } + +init_fail: +#if !CONFIG_DISABLE_HAL_LOCKS + //release lock + xSemaphoreGive(bus[i2c_num].lock); +#endif + return ret; +} + +esp_err_t i2cDeinit(uint8_t i2c_num) { + esp_err_t err = ESP_FAIL; + if (i2c_num >= SOC_I2C_NUM) { + return ESP_ERR_INVALID_ARG; + } +#if !CONFIG_DISABLE_HAL_LOCKS + //acquire lock + if (bus[i2c_num].lock == NULL || xSemaphoreTake(bus[i2c_num].lock, portMAX_DELAY) != pdTRUE) { + log_e("could not acquire lock"); + return err; + } +#endif + if (!bus[i2c_num].initialized) { + log_e("bus is not initialized"); + } else { + // remove devices from the bus + for (uint8_t i = 0; i < 128; i++) { + if (bus[i2c_num].dev_handles[i] != NULL) { + err = i2c_master_bus_rm_device(bus[i2c_num].dev_handles[i]); + bus[i2c_num].dev_handles[i] = NULL; + if (err != ESP_OK) { + log_e("i2c_master_bus_rm_device failed: [%d] %s", err, esp_err_to_name(err)); + } + } + } + err = i2c_del_master_bus(bus[i2c_num].bus_handle); + if (err != ESP_OK) { + log_e("i2c_del_master_bus failed: [%d] %s", err, esp_err_to_name(err)); + } else { + bus[i2c_num].initialized = false; + perimanClearPinBus(bus[i2c_num].scl); + perimanClearPinBus(bus[i2c_num].sda); + bus[i2c_num].scl = -1; + bus[i2c_num].sda = -1; + bus[i2c_num].bus_handle = NULL; + } + } +#if !CONFIG_DISABLE_HAL_LOCKS + //release lock + xSemaphoreGive(bus[i2c_num].lock); +#endif + return err; +} + +static esp_err_t i2cAddDeviceIfNeeded(uint8_t i2c_num, uint16_t address) { + esp_err_t ret = ESP_OK; + if (bus[i2c_num].dev_handles[address] == NULL) { + i2c_master_dev_handle_t dev_handle = NULL; + i2c_device_config_t dev_config; + memset(&dev_config, 0, sizeof(i2c_device_config_t)); + dev_config.dev_addr_length = I2C_ADDR_BIT_LEN_7; // Arduino supports only 7bit addresses + dev_config.device_address = address; + dev_config.scl_speed_hz = bus[i2c_num].frequency; + dev_config.scl_wait_us = 0; + dev_config.flags.disable_ack_check = 0; + + ret = i2c_master_bus_add_device(bus[i2c_num].bus_handle, &dev_config, &dev_handle); + if (ret != ESP_OK) { + log_e("i2c_master_bus_add_device failed: [%d] %s", ret, esp_err_to_name(ret)); + } else { + bus[i2c_num].dev_handles[address] = dev_handle; + log_v("added device: bus=%u addr=0x%x handle=0x%08x", i2c_num, address, dev_handle); + } + } + return ret; +} + +esp_err_t i2cWrite(uint8_t i2c_num, uint16_t address, const uint8_t *buff, size_t size, uint32_t timeOutMillis) { + esp_err_t ret = ESP_FAIL; + // i2c_cmd_handle_t cmd = NULL; + if (i2c_num >= SOC_I2C_NUM) { + return ESP_ERR_INVALID_ARG; + } + if (address >= 128) { + log_e("Only 7bit I2C addresses are supported"); + return ESP_ERR_INVALID_ARG; + } +#if !CONFIG_DISABLE_HAL_LOCKS + //acquire lock + if (bus[i2c_num].lock == NULL || xSemaphoreTake(bus[i2c_num].lock, portMAX_DELAY) != pdTRUE) { + log_e("could not acquire lock"); + return ret; + } +#endif + if (!bus[i2c_num].initialized) { + log_e("bus is not initialized"); + goto end; + } + + if (size == 0) { + // Probe device + ret = i2c_master_probe(bus[i2c_num].bus_handle, address, timeOutMillis); + if (ret != ESP_OK) { + log_v("i2c_master_probe failed: [%d] %s", ret, esp_err_to_name(ret)); + } + } else { + // writing data to device + ret = i2cAddDeviceIfNeeded(i2c_num, address); + if (ret != ESP_OK) { + goto end; + } + + log_v("i2c_master_transmit: bus=%u addr=0x%x handle=0x%08x size=%u", i2c_num, address, bus[i2c_num].dev_handles[address], size); + ret = i2c_master_transmit(bus[i2c_num].dev_handles[address], buff, size, timeOutMillis); + if (ret != ESP_OK) { + log_e("i2c_master_transmit failed: [%d] %s", ret, esp_err_to_name(ret)); + goto end; + } + + // wait for transactions to finish (is it needed with sync transactions?) + // ret = i2c_master_bus_wait_all_done(bus[i2c_num].bus_handle, timeOutMillis); + // if (ret != ESP_OK) { + // log_e("i2c_master_bus_wait_all_done failed: [%d] %s", ret, esp_err_to_name(ret)); + // goto end; + // } + } + +end: +#if !CONFIG_DISABLE_HAL_LOCKS + //release lock + xSemaphoreGive(bus[i2c_num].lock); +#endif + return ret; +} + +esp_err_t i2cRead(uint8_t i2c_num, uint16_t address, uint8_t *buff, size_t size, uint32_t timeOutMillis, size_t *readCount) { + esp_err_t ret = ESP_FAIL; + *readCount = 0; + if (i2c_num >= SOC_I2C_NUM) { + return ESP_ERR_INVALID_ARG; + } +#if !CONFIG_DISABLE_HAL_LOCKS + //acquire lock + if (bus[i2c_num].lock == NULL || xSemaphoreTake(bus[i2c_num].lock, portMAX_DELAY) != pdTRUE) { + log_e("could not acquire lock"); + return ret; + } +#endif + if (!bus[i2c_num].initialized) { + log_e("bus is not initialized"); + goto end; + } + + ret = i2cAddDeviceIfNeeded(i2c_num, address); + if (ret != ESP_OK) { + goto end; + } + + log_v("i2c_master_receive: bus=%u addr=0x%x handle=0x%08x size=%u", i2c_num, address, bus[i2c_num].dev_handles[address], size); + ret = i2c_master_receive(bus[i2c_num].dev_handles[address], buff, size, timeOutMillis); + if (ret != ESP_OK) { + log_e("i2c_master_receive failed: [%d] %s", ret, esp_err_to_name(ret)); + goto end; + } + + // wait for transactions to finish (is it needed with sync transactions?) + // ret = i2c_master_bus_wait_all_done(bus[i2c_num].bus_handle, timeOutMillis); + // if (ret != ESP_OK) { + // log_e("i2c_master_bus_wait_all_done failed: [%d] %s", ret, esp_err_to_name(ret)); + // goto end; + // } + *readCount = size; + +end: +#if !CONFIG_DISABLE_HAL_LOCKS + //release lock + xSemaphoreGive(bus[i2c_num].lock); +#endif + return ret; +} + +esp_err_t i2cWriteReadNonStop( + uint8_t i2c_num, uint16_t address, const uint8_t *wbuff, size_t wsize, uint8_t *rbuff, size_t rsize, uint32_t timeOutMillis, size_t *readCount +) { + esp_err_t ret = ESP_FAIL; + *readCount = 0; + if (i2c_num >= SOC_I2C_NUM) { + return ESP_ERR_INVALID_ARG; + } +#if !CONFIG_DISABLE_HAL_LOCKS + //acquire lock + if (bus[i2c_num].lock == NULL || xSemaphoreTake(bus[i2c_num].lock, portMAX_DELAY) != pdTRUE) { + log_e("could not acquire lock"); + return ret; + } +#endif + if (!bus[i2c_num].initialized) { + log_e("bus is not initialized"); + goto end; + } + + ret = i2cAddDeviceIfNeeded(i2c_num, address); + if (ret != ESP_OK) { + goto end; + } + + log_v("i2c_master_transmit_receive: bus=%u addr=0x%x handle=0x%08x write=%u read=%u", i2c_num, address, bus[i2c_num].dev_handles[address], wsize, rsize); + ret = i2c_master_transmit_receive(bus[i2c_num].dev_handles[address], wbuff, wsize, rbuff, rsize, timeOutMillis); + if (ret != ESP_OK) { + log_e("i2c_master_transmit_receive failed: [%d] %s", ret, esp_err_to_name(ret)); + goto end; + } + + // wait for transactions to finish (is it needed with sync transactions?) + // ret = i2c_master_bus_wait_all_done(bus[i2c_num].bus_handle, timeOutMillis); + // if (ret != ESP_OK) { + // log_e("i2c_master_bus_wait_all_done failed: [%d] %s", ret, esp_err_to_name(ret)); + // goto end; + // } + *readCount = rsize; + +end: +#if !CONFIG_DISABLE_HAL_LOCKS + //release lock + xSemaphoreGive(bus[i2c_num].lock); +#endif + return ret; +} + +esp_err_t i2cSetClock(uint8_t i2c_num, uint32_t frequency) { + esp_err_t ret = ESP_FAIL; + if (i2c_num >= SOC_I2C_NUM) { + return ESP_ERR_INVALID_ARG; + } +#if !CONFIG_DISABLE_HAL_LOCKS + //acquire lock + if (bus[i2c_num].lock == NULL || xSemaphoreTake(bus[i2c_num].lock, portMAX_DELAY) != pdTRUE) { + log_e("could not acquire lock"); + return ret; + } +#endif + if (!bus[i2c_num].initialized) { + log_e("bus is not initialized"); + goto end; + } + if (bus[i2c_num].frequency == frequency) { + ret = ESP_OK; + goto end; + } + if (!frequency) { + frequency = 100000UL; + } else if (frequency > 1000000UL) { + frequency = 1000000UL; + } + + bus[i2c_num].frequency = frequency; + + // loop through devices, remove them and then re-add them with the new frequency + for (uint8_t i = 0; i < 128; i++) { + if (bus[i2c_num].dev_handles[i] != NULL) { + ret = i2c_master_bus_rm_device(bus[i2c_num].dev_handles[i]); + if (ret != ESP_OK) { + log_e("i2c_master_bus_rm_device failed: [%d] %s", ret, esp_err_to_name(ret)); + goto end; + } else { + bus[i2c_num].dev_handles[i] = NULL; + ret = i2cAddDeviceIfNeeded(i2c_num, i); + if (ret != ESP_OK) { + goto end; + } + } + } + } + +end: +#if !CONFIG_DISABLE_HAL_LOCKS + //release lock + xSemaphoreGive(bus[i2c_num].lock); +#endif + return ret; +} + +esp_err_t i2cGetClock(uint8_t i2c_num, uint32_t *frequency) { + if (i2c_num >= SOC_I2C_NUM) { + return ESP_ERR_INVALID_ARG; + } + if (!bus[i2c_num].initialized) { + log_e("bus is not initialized"); + return ESP_FAIL; + } + *frequency = bus[i2c_num].frequency; + return ESP_OK; +} + +#endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) */ +#endif /* SOC_I2C_SUPPORTED */ diff --git a/cores/esp32/esp32-hal-i2c.c b/cores/esp32/esp32-hal-i2c.c index 359b2161201..71c8ae1c428 100644 --- a/cores/esp32/esp32-hal-i2c.c +++ b/cores/esp32/esp32-hal-i2c.c @@ -15,6 +15,8 @@ #include "esp32-hal-i2c.h" #if SOC_I2C_SUPPORTED +#include "esp_idf_version.h" +#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 4, 0) #include "esp32-hal.h" #if !CONFIG_DISABLE_HAL_LOCKS #include "freertos/FreeRTOS.h" @@ -429,4 +431,5 @@ esp_err_t i2cGetClock(uint8_t i2c_num, uint32_t *frequency) { return ESP_OK; } +#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 4, 0) */ #endif /* SOC_I2C_SUPPORTED */ diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp index 24b0eb7c0a3..f8d9496389f 100644 --- a/libraries/Wire/src/Wire.cpp +++ b/libraries/Wire/src/Wire.cpp @@ -462,10 +462,11 @@ uint8_t TwoWire::endTransmission(bool sendStop) { nonStop = true; } switch (err) { - case ESP_OK: return 0; - case ESP_FAIL: return 2; - case ESP_ERR_TIMEOUT: return 5; - default: break; + case ESP_OK: return 0; + case ESP_FAIL: return 2; + case ESP_ERR_NOT_FOUND: return 2; + case ESP_ERR_TIMEOUT: return 5; + default: break; } return 4; } @@ -646,8 +647,16 @@ void TwoWire::onRequestService(uint8_t num, void *arg) { #endif /* SOC_I2C_SUPPORT_SLAVE */ TwoWire Wire = TwoWire(0); +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) +#if SOC_I2C_NUM > 1 +TwoWire Wire1 = TwoWire(1); +#elif SOC_I2C_NUM > 2 +TwoWire Wire2 = TwoWire(2); +#endif /* SOC_I2C_NUM */ +#else #if SOC_HP_I2C_NUM > 1 TwoWire Wire1 = TwoWire(1); #endif /* SOC_HP_I2C_NUM */ +#endif #endif /* SOC_I2C_SUPPORTED */ diff --git a/libraries/Wire/src/Wire.h b/libraries/Wire/src/Wire.h index 45f30c81ffc..0deab7d4a57 100644 --- a/libraries/Wire/src/Wire.h +++ b/libraries/Wire/src/Wire.h @@ -28,6 +28,7 @@ #include "soc/soc_caps.h" #if SOC_I2C_SUPPORTED +#include "esp_idf_version.h" #include #include @@ -144,9 +145,17 @@ class TwoWire : public HardwareI2C { }; extern TwoWire Wire; +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) +#if SOC_I2C_NUM > 1 +extern TwoWire Wire1; +#elif SOC_I2C_NUM > 2 +extern TwoWire Wire2; +#endif /* SOC_I2C_NUM */ +#else #if SOC_HP_I2C_NUM > 1 extern TwoWire Wire1; #endif /* SOC_HP_I2C_NUM */ +#endif #endif /* SOC_I2C_SUPPORTED */ #endif /* TwoWire_h */ diff --git a/variants/esp32c6/pins_arduino.h b/variants/esp32c6/pins_arduino.h index 55afea91565..348db9f907e 100644 --- a/variants/esp32c6/pins_arduino.h +++ b/variants/esp32c6/pins_arduino.h @@ -32,4 +32,9 @@ static const uint8_t A4 = 4; static const uint8_t A5 = 5; static const uint8_t A6 = 6; +// LP I2C Pins are fixed on ESP32-C6 +#define WIRE1_PIN_DEFINED +static const uint8_t SDA1 = 6; +static const uint8_t SCL1 = 7; + #endif /* Pins_Arduino_h */ From 8e9f7c31c9152d5f2ca0f3b4adf3bfb68434a88d Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 18 Feb 2025 17:00:36 +0200 Subject: [PATCH 008/290] IDF release/v5.4 e37d33cc (#10980) --- package/package_esp32_index.template.json | 204 +++++++++++----------- 1 file changed, 102 insertions(+), 102 deletions(-) diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 5d73debe76f..2c86b6fe4dd 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -42,12 +42,12 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.3-489d7a2b-v1" + "version": "idf-release_v5.4-e37d33cc-v2" }, { "packager": "esp32", "name": "xtensa-esp-elf-gcc", - "version": "esp-13.2.0_20240530" + "version": "esp-14.2.0_20241119" }, { "packager": "esp32", @@ -57,7 +57,7 @@ { "packager": "esp32", "name": "riscv32-esp-elf-gcc", - "version": "esp-13.2.0_20240530" + "version": "esp-14.2.0_20241119" }, { "packager": "esp32", @@ -95,125 +95,125 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.3-489d7a2b-v1", + "version": "idf-release_v5.4-e37d33cc-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-489d7a2b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", - "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", - "size": "341414090" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", + "size": "339629117" }, { "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-489d7a2b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", - "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", - "size": "341414090" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", + "size": "339629117" }, { "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-489d7a2b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", - "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", - "size": "341414090" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", + "size": "339629117" }, { "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-489d7a2b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", - "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", - "size": "341414090" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", + "size": "339629117" }, { "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-489d7a2b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", - "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", - "size": "341414090" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", + "size": "339629117" }, { "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-489d7a2b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", - "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", - "size": "341414090" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", + "size": "339629117" }, { "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-489d7a2b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", - "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", - "size": "341414090" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", + "size": "339629117" }, { "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-489d7a2b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.3-489d7a2b-v1.zip", - "checksum": "SHA-256:489012502218a7d30f6c312764bc8d10830a51e1db29558f15181c68373d0095", - "size": "341414090" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", + "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", + "size": "339629117" } ] }, { "name": "xtensa-esp-elf-gcc", - "version": "esp-13.2.0_20240530", + "version": "esp-14.2.0_20241119", "systems": [ { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/xtensa-esp-elf-13.2.0_20240530-x86_64-linux-gnu.tar.gz", - "archiveFileName": "xtensa-esp-elf-13.2.0_20240530-x86_64-linux-gnu.tar.gz", - "checksum": "SHA-256:bce77e8480701d5a90545369d1b5848f6048eb39c0022d2446d1e33a8e127490", - "size": "208911713" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/xtensa-esp-elf-14.2.0_20241119-x86_64-linux-gnu.tar.gz", + "archiveFileName": "xtensa-esp-elf-14.2.0_20241119-x86_64-linux-gnu.tar.gz", + "checksum": "SHA-256:b1859df334a85541ae746e1b86439f59180d87f8cf1cc04c2e770fadf9f006e9", + "size": "323678089" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/xtensa-esp-elf-13.2.0_20240530-aarch64-linux-gnu.tar.gz", - "archiveFileName": "xtensa-esp-elf-13.2.0_20240530-aarch64-linux-gnu.tar.gz", - "checksum": "SHA-256:7c9e3c1adc733d042ed87b92daa1d6396e1b441c1755f1fa14cb88855719ba88", - "size": "202519931" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/xtensa-esp-elf-14.2.0_20241119-aarch64-linux-gnu.tar.gz", + "archiveFileName": "xtensa-esp-elf-14.2.0_20241119-aarch64-linux-gnu.tar.gz", + "checksum": "SHA-256:7ff023033a5c00e55b9fc0a0b26d18fb0e476c24e24c5b0459bcb2e05a3729f1", + "size": "320064691" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/xtensa-esp-elf-13.2.0_20240530-arm-linux-gnueabi.tar.gz", - "archiveFileName": "xtensa-esp-elf-13.2.0_20240530-arm-linux-gnueabi.tar.gz", - "checksum": "SHA-256:d6955e8ea6af91574bf9213b92f32ca09eb8640103446b7fa19a63cfeeec5421", - "size": "202206516" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/xtensa-esp-elf-14.2.0_20241119-arm-linux-gnueabi.tar.gz", + "archiveFileName": "xtensa-esp-elf-14.2.0_20241119-arm-linux-gnueabi.tar.gz", + "checksum": "SHA-256:bb11dbf3ed25d4e0cc9e938749519e8236cfa2609e85742d311f1d869111805a", + "size": "319454139" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/xtensa-esp-elf-13.2.0_20240530-i586-linux-gnu.tar.gz", - "archiveFileName": "xtensa-esp-elf-13.2.0_20240530-i586-linux-gnu.tar.gz", - "checksum": "SHA-256:3666ee74ecb693ee6488f11469802630a7b0d32608184045a4f35cb413f59e3d", - "size": "213304863" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/xtensa-esp-elf-14.2.0_20241119-i586-linux-gnu.tar.gz", + "archiveFileName": "xtensa-esp-elf-14.2.0_20241119-i586-linux-gnu.tar.gz", + "checksum": "SHA-256:5ac611dca62ec791d413d1f417d566c444b006d2a4f97bd749b15f782d87249b", + "size": "328335914" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/xtensa-esp-elf-13.2.0_20240530-x86_64-apple-darwin.tar.gz", - "archiveFileName": "xtensa-esp-elf-13.2.0_20240530-x86_64-apple-darwin.tar.gz", - "checksum": "SHA-256:948cf57b6eecc898b5f70e06ad08ba88c08b627be570ec631dfcd72f6295194a", - "size": "221357024" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/xtensa-esp-elf-14.2.0_20241119-x86_64-apple-darwin_signed.tar.gz", + "archiveFileName": "xtensa-esp-elf-14.2.0_20241119-x86_64-apple-darwin_signed.tar.gz", + "checksum": "SHA-256:15b3e60362028eaeff9156dc82dac3f1436b4aeef3920b28d7650974d8c34751", + "size": "336215844" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/xtensa-esp-elf-13.2.0_20240530-aarch64-apple-darwin.tar.gz", - "archiveFileName": "xtensa-esp-elf-13.2.0_20240530-aarch64-apple-darwin.tar.gz", - "checksum": "SHA-256:6f03fdf0cc14a7f3900ee59977f62e8626d8b7c208506e52f1fd883ac223427a", - "size": "199689745" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/xtensa-esp-elf-14.2.0_20241119-aarch64-apple-darwin_signed.tar.gz", + "archiveFileName": "xtensa-esp-elf-14.2.0_20241119-aarch64-apple-darwin_signed.tar.gz", + "checksum": "SHA-256:45c475518735133789bacccad31f872318b7ecc0b31cc9b7924aad880034f0bf", + "size": "318797396" }, { "host": "i686-mingw32", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/xtensa-esp-elf-13.2.0_20240530-i686-w64-mingw32_hotfix.zip", - "archiveFileName": "xtensa-esp-elf-13.2.0_20240530-i686-w64-mingw32_hotfix.zip", - "checksum": "SHA-256:d6b227c50e3c8e21d62502b3140e5ab74a4cb502c2b4169c36238b9858a8fb88", - "size": "266042967" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/xtensa-esp-elf-14.2.0_20241119-i686-w64-mingw32.zip", + "archiveFileName": "xtensa-esp-elf-14.2.0_20241119-i686-w64-mingw32.zip", + "checksum": "SHA-256:b30e450e0af279783c54a9ae77c3b367dd556b78eda930a92ec7b784a74c28c8", + "size": "382457717" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/xtensa-esp-elf-13.2.0_20240530-x86_64-w64-mingw32_hotfix.zip", - "archiveFileName": "xtensa-esp-elf-13.2.0_20240530-x86_64-w64-mingw32_hotfix.zip", - "checksum": "SHA-256:155ee97b531236e6a7c763395c68ca793e55e74d2cb4d38a23057a153e01e7d0", - "size": "269831985" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/xtensa-esp-elf-14.2.0_20241119-x86_64-w64-mingw32.zip", + "archiveFileName": "xtensa-esp-elf-14.2.0_20241119-x86_64-w64-mingw32.zip", + "checksum": "SHA-256:62ae704777d73c30689efff6e81178632a1ca44d1a2d60f4621eb997e040e028", + "size": "386316009" } ] }, @@ -281,63 +281,63 @@ }, { "name": "riscv32-esp-elf-gcc", - "version": "esp-13.2.0_20240530", + "version": "esp-14.2.0_20241119", "systems": [ { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/riscv32-esp-elf-13.2.0_20240530-x86_64-linux-gnu.tar.gz", - "archiveFileName": "riscv32-esp-elf-13.2.0_20240530-x86_64-linux-gnu.tar.gz", - "checksum": "SHA-256:e7fbfffbb19dcd3764a9848a141bf44e19ad0b48e0bd1515912345c26fe52fba", - "size": "294346758" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/riscv32-esp-elf-14.2.0_20241119-x86_64-linux-gnu.tar.gz", + "archiveFileName": "riscv32-esp-elf-14.2.0_20241119-x86_64-linux-gnu.tar.gz", + "checksum": "SHA-256:a16942465d33c7f0334c16e83bc6feb62e06eeb79cf19099293480bb8d48c0cd", + "size": "593721156" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/riscv32-esp-elf-13.2.0_20240530-aarch64-linux-gnu.tar.gz", - "archiveFileName": "riscv32-esp-elf-13.2.0_20240530-aarch64-linux-gnu.tar.gz", - "checksum": "SHA-256:a178a895b807ed2e87d5d62153c36a6aae048581f527c0eb152f0a02b8de9571", - "size": "288374597" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/riscv32-esp-elf-14.2.0_20241119-aarch64-linux-gnu.tar.gz", + "archiveFileName": "riscv32-esp-elf-14.2.0_20241119-aarch64-linux-gnu.tar.gz", + "checksum": "SHA-256:22486233d0e0fd58a54ae453b701f195f1432fc6f2e17085b9d6c8d5d9acefb7", + "size": "587879927" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/riscv32-esp-elf-13.2.0_20240530-arm-linux-gnueabi.tar.gz", - "archiveFileName": "riscv32-esp-elf-13.2.0_20240530-arm-linux-gnueabi.tar.gz", - "checksum": "SHA-256:4a2f176d0f5bc8a70645975e2a08ea94145fb69b7225c5cdcbd6024a4836aaf5", - "size": "287737495" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/riscv32-esp-elf-14.2.0_20241119-arm-linux-gnueabi.tar.gz", + "archiveFileName": "riscv32-esp-elf-14.2.0_20241119-arm-linux-gnueabi.tar.gz", + "checksum": "SHA-256:27a72d5d96cdb56dae2a1da5dfde1717c18a8c1f9a1454c8e34a8bd34abe662d", + "size": "586531522" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/riscv32-esp-elf-13.2.0_20240530-i586-linux-gnu.tar.gz", - "archiveFileName": "riscv32-esp-elf-13.2.0_20240530-i586-linux-gnu.tar.gz", - "checksum": "SHA-256:7a6f02f1b2effafb18600bbf602818f6923fd320f000fb8659f34acbfda8812f", - "size": "299138540" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/riscv32-esp-elf-14.2.0_20241119-i586-linux-gnu.tar.gz", + "archiveFileName": "riscv32-esp-elf-14.2.0_20241119-i586-linux-gnu.tar.gz", + "checksum": "SHA-256:b7bd6e4cd53a4c55831d48e96a3d500bfffb091bec84a30bc8c3ad687e3eb3a2", + "size": "597070471" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/riscv32-esp-elf-13.2.0_20240530-x86_64-apple-darwin.tar.gz", - "archiveFileName": "riscv32-esp-elf-13.2.0_20240530-x86_64-apple-darwin.tar.gz", - "checksum": "SHA-256:a193b4f025d0d836b0a9d9cbe760af1c53e53af66fc332fe98952bc4c456dd9a", - "size": "305025700" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/riscv32-esp-elf-14.2.0_20241119-x86_64-apple-darwin_signed.tar.gz", + "archiveFileName": "riscv32-esp-elf-14.2.0_20241119-x86_64-apple-darwin_signed.tar.gz", + "checksum": "SHA-256:5f8b571e1aedbe9f856f3bdeca6600cd5510ccff1ca102c4f001421eda560585", + "size": "602343061" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/riscv32-esp-elf-13.2.0_20240530-aarch64-apple-darwin.tar.gz", - "archiveFileName": "riscv32-esp-elf-13.2.0_20240530-aarch64-apple-darwin.tar.gz", - "checksum": "SHA-256:7082dd2e2123dea5609a24092d19ac6612ae7e219df1d298de6b2f64cb4af0df", - "size": "285458443" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/riscv32-esp-elf-14.2.0_20241119-aarch64-apple-darwin_signed.tar.gz", + "archiveFileName": "riscv32-esp-elf-14.2.0_20241119-aarch64-apple-darwin_signed.tar.gz", + "checksum": "SHA-256:a7276042a7eb2d33c2dff7167539e445c32c07d43a2c6827e86d035642503e0b", + "size": "578521565" }, { "host": "i686-mingw32", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/riscv32-esp-elf-13.2.0_20240530-i686-w64-mingw32.zip", - "archiveFileName": "riscv32-esp-elf-13.2.0_20240530-i686-w64-mingw32.zip", - "checksum": "SHA-256:590bfb10576702639825581cc00c445da6e577012840a787137417e80d15f46d", - "size": "366573064" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/riscv32-esp-elf-14.2.0_20241119-i686-w64-mingw32.zip", + "archiveFileName": "riscv32-esp-elf-14.2.0_20241119-i686-w64-mingw32.zip", + "checksum": "SHA-256:54193a97bd75205678ead8d11f00b351cfa3c2a6e5ab5d966341358b9f9422d7", + "size": "672055172" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-13.2.0_20240530/riscv32-esp-elf-13.2.0_20240530-x86_64-w64-mingw32.zip", - "archiveFileName": "riscv32-esp-elf-13.2.0_20240530-x86_64-w64-mingw32.zip", - "checksum": "SHA-256:413eb9f6adf8fdaf25544d014c850fc09eb38bb93a2fc5ebd107ab1b0de1bb3a", - "size": "369820297" + "url": "https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/riscv32-esp-elf-14.2.0_20241119-x86_64-w64-mingw32.zip", + "archiveFileName": "riscv32-esp-elf-14.2.0_20241119-x86_64-w64-mingw32.zip", + "checksum": "SHA-256:24c8407fa467448d394e0639436a5ede31caf1838e35e8435e19df58ebed438c", + "size": "677812937" } ] }, From 55f4f1bfa87acae8713fadc39b2f2c3f0d416f2e Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Tue, 18 Feb 2025 19:10:54 +0200 Subject: [PATCH 009/290] Update core version to 3.2.0 --- cores/esp32/esp_arduino_version.h | 4 ++-- 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, 45 insertions(+), 45 deletions(-) diff --git a/cores/esp32/esp_arduino_version.h b/cores/esp32/esp_arduino_version.h index f8b00d3a1dd..b1355e908ae 100644 --- a/cores/esp32/esp_arduino_version.h +++ b/cores/esp32/esp_arduino_version.h @@ -21,9 +21,9 @@ extern "C" { /** Major version number (X.x.x) */ #define ESP_ARDUINO_VERSION_MAJOR 3 /** Minor version number (x.X.x) */ -#define ESP_ARDUINO_VERSION_MINOR 1 +#define ESP_ARDUINO_VERSION_MINOR 2 /** Patch version number (x.x.X) */ -#define ESP_ARDUINO_VERSION_PATCH 3 +#define ESP_ARDUINO_VERSION_PATCH 0 /** * Macro to convert ARDUINO version number into an integer diff --git a/libraries/ArduinoOTA/library.properties b/libraries/ArduinoOTA/library.properties index bcccbe56b5e..0796eddf318 100644 --- a/libraries/ArduinoOTA/library.properties +++ b/libraries/ArduinoOTA/library.properties @@ -1,5 +1,5 @@ name=ArduinoOTA -version=3.1.3 +version=3.2.0 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 38543425ee1..116dcbacaa8 100644 --- a/libraries/AsyncUDP/library.properties +++ b/libraries/AsyncUDP/library.properties @@ -1,5 +1,5 @@ name=ESP32 Async UDP -version=3.1.3 +version=3.2.0 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 12da8222e0c..7ef636223ec 100644 --- a/libraries/BLE/library.properties +++ b/libraries/BLE/library.properties @@ -1,5 +1,5 @@ name=BLE -version=3.1.3 +version=3.2.0 author=Neil Kolban maintainer=Dariusz Krempa sentence=BLE functions for ESP32 diff --git a/libraries/BluetoothSerial/library.properties b/libraries/BluetoothSerial/library.properties index 1cdb6302a8a..0a382410bba 100644 --- a/libraries/BluetoothSerial/library.properties +++ b/libraries/BluetoothSerial/library.properties @@ -1,5 +1,5 @@ name=BluetoothSerial -version=3.1.3 +version=3.2.0 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 7531b2e52cd..5e70a6ec03a 100644 --- a/libraries/DNSServer/library.properties +++ b/libraries/DNSServer/library.properties @@ -1,5 +1,5 @@ name=DNSServer -version=3.1.3 +version=3.2.0 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 4eab97edf9a..c7e48501c04 100644 --- a/libraries/EEPROM/library.properties +++ b/libraries/EEPROM/library.properties @@ -1,5 +1,5 @@ name=EEPROM -version=3.1.3 +version=3.2.0 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 d8c88776595..7ebc69be71f 100644 --- a/libraries/ESP32/library.properties +++ b/libraries/ESP32/library.properties @@ -1,5 +1,5 @@ name=ESP32 -version=3.1.3 +version=3.2.0 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 44493d67ff2..263e9823275 100644 --- a/libraries/ESP_I2S/library.properties +++ b/libraries/ESP_I2S/library.properties @@ -1,5 +1,5 @@ name=ESP_I2S -version=3.1.3 +version=3.2.0 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 79c97131fb3..f3e5c109a9b 100644 --- a/libraries/ESP_NOW/library.properties +++ b/libraries/ESP_NOW/library.properties @@ -1,5 +1,5 @@ name=ESP_NOW -version=3.1.3 +version=3.2.0 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 6a59c25102f..295761bd9fb 100644 --- a/libraries/ESP_SR/library.properties +++ b/libraries/ESP_SR/library.properties @@ -1,5 +1,5 @@ name=ESP_SR -version=3.1.3 +version=3.2.0 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 925bb4fb258..6d36d61b783 100644 --- a/libraries/ESPmDNS/library.properties +++ b/libraries/ESPmDNS/library.properties @@ -1,5 +1,5 @@ name=ESPmDNS -version=3.1.3 +version=3.2.0 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 da3bbbb2211..d34ae036417 100644 --- a/libraries/Ethernet/library.properties +++ b/libraries/Ethernet/library.properties @@ -1,5 +1,5 @@ name=Ethernet -version=3.1.3 +version=3.2.0 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 574e184ba02..35940fd5472 100644 --- a/libraries/FFat/library.properties +++ b/libraries/FFat/library.properties @@ -1,5 +1,5 @@ name=FFat -version=3.1.3 +version=3.2.0 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 91fb4396ed4..07bd296bb83 100644 --- a/libraries/FS/library.properties +++ b/libraries/FS/library.properties @@ -1,5 +1,5 @@ name=FS -version=3.1.3 +version=3.2.0 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 347ac4f122f..f2dafc36d1b 100644 --- a/libraries/HTTPClient/library.properties +++ b/libraries/HTTPClient/library.properties @@ -1,5 +1,5 @@ name=HTTPClient -version=3.1.3 +version=3.2.0 author=Markus Sattler maintainer=Markus Sattler sentence=HTTP Client for ESP32 diff --git a/libraries/HTTPUpdate/library.properties b/libraries/HTTPUpdate/library.properties index 2bcb06bcad2..419f3b97b3f 100644 --- a/libraries/HTTPUpdate/library.properties +++ b/libraries/HTTPUpdate/library.properties @@ -1,5 +1,5 @@ name=HTTPUpdate -version=3.1.3 +version=3.2.0 author=Markus Sattler maintainer=Markus Sattler sentence=Http Update for ESP32 diff --git a/libraries/HTTPUpdateServer/library.properties b/libraries/HTTPUpdateServer/library.properties index 8eac2aab4cf..9c793a26ac8 100644 --- a/libraries/HTTPUpdateServer/library.properties +++ b/libraries/HTTPUpdateServer/library.properties @@ -1,5 +1,5 @@ name=HTTPUpdateServer -version=3.1.3 +version=3.2.0 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 b33dd15755a..fefe5aab177 100644 --- a/libraries/Insights/library.properties +++ b/libraries/Insights/library.properties @@ -1,5 +1,5 @@ name=ESP Insights -version=3.1.3 +version=3.2.0 author=Sanket Wadekar maintainer=Sanket Wadekar sentence=ESP Insights diff --git a/libraries/LittleFS/library.properties b/libraries/LittleFS/library.properties index 233e5b1ab56..a9dae69b7f8 100644 --- a/libraries/LittleFS/library.properties +++ b/libraries/LittleFS/library.properties @@ -1,5 +1,5 @@ name=LittleFS -version=3.1.3 +version=3.2.0 author= maintainer= sentence=LittleFS for esp32 diff --git a/libraries/Matter/library.properties b/libraries/Matter/library.properties index f0eea397fe8..ac9e0964ab5 100644 --- a/libraries/Matter/library.properties +++ b/libraries/Matter/library.properties @@ -1,5 +1,5 @@ name=Matter -version=3.1.3 +version=3.2.0 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 bf223a34828..5f134bfdc55 100644 --- a/libraries/NetBIOS/library.properties +++ b/libraries/NetBIOS/library.properties @@ -1,5 +1,5 @@ name=NetBIOS -version=3.1.3 +version=3.2.0 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 bd5d5677dca..0b821e08d77 100644 --- a/libraries/Network/library.properties +++ b/libraries/Network/library.properties @@ -1,5 +1,5 @@ name=Networking -version=3.1.3 +version=3.2.0 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=General network management library. diff --git a/libraries/NetworkClientSecure/library.properties b/libraries/NetworkClientSecure/library.properties index 0754e59fba5..455dea6a2bf 100644 --- a/libraries/NetworkClientSecure/library.properties +++ b/libraries/NetworkClientSecure/library.properties @@ -1,5 +1,5 @@ name=NetworkClientSecure -version=3.1.3 +version=3.2.0 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 078c4b58acc..0e547d188aa 100644 --- a/libraries/OpenThread/library.properties +++ b/libraries/OpenThread/library.properties @@ -1,5 +1,5 @@ name=OpenThread -version=3.1.3 +version=3.2.0 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 2d5d3d83877..7158a027b0a 100644 --- a/libraries/PPP/library.properties +++ b/libraries/PPP/library.properties @@ -1,5 +1,5 @@ name=PPP -version=3.1.3 +version=3.2.0 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 f6cdb8a074c..eb0158e4932 100644 --- a/libraries/Preferences/library.properties +++ b/libraries/Preferences/library.properties @@ -1,5 +1,5 @@ name=Preferences -version=3.1.3 +version=3.2.0 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 6b8ba658eb4..95ce14d6708 100644 --- a/libraries/RainMaker/library.properties +++ b/libraries/RainMaker/library.properties @@ -1,5 +1,5 @@ name=ESP RainMaker -version=3.1.3 +version=3.2.0 author=Sweety Mhaiske maintainer=Hristo Gochkov sentence=ESP RainMaker Support diff --git a/libraries/SD/library.properties b/libraries/SD/library.properties index 00766c48470..66c4f5cfafd 100644 --- a/libraries/SD/library.properties +++ b/libraries/SD/library.properties @@ -1,5 +1,5 @@ name=SD -version=3.1.3 +version=3.2.0 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 0cc0a80afd2..855390e5057 100644 --- a/libraries/SD_MMC/library.properties +++ b/libraries/SD_MMC/library.properties @@ -1,5 +1,5 @@ name=SD_MMC -version=3.1.3 +version=3.2.0 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 57e44241438..64db93aceeb 100644 --- a/libraries/SPI/library.properties +++ b/libraries/SPI/library.properties @@ -1,5 +1,5 @@ name=SPI -version=3.1.3 +version=3.2.0 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 5ecc75c000d..78f77fe9794 100644 --- a/libraries/SPIFFS/library.properties +++ b/libraries/SPIFFS/library.properties @@ -1,5 +1,5 @@ name=SPIFFS -version=3.1.3 +version=3.2.0 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 d5570c41751..ad5e10d3acb 100644 --- a/libraries/SimpleBLE/library.properties +++ b/libraries/SimpleBLE/library.properties @@ -1,5 +1,5 @@ name=SimpleBLE -version=3.1.3 +version=3.2.0 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 259df824a45..1e8db045610 100644 --- a/libraries/TFLiteMicro/library.properties +++ b/libraries/TFLiteMicro/library.properties @@ -1,5 +1,5 @@ name=TFLite Micro -version=3.1.3 +version=3.2.0 author=Sanket Wadekar maintainer=Sanket Wadekar sentence=TensorFlow Lite for Microcontrollers diff --git a/libraries/Ticker/library.properties b/libraries/Ticker/library.properties index 7f2cdab5220..975db96d1ad 100644 --- a/libraries/Ticker/library.properties +++ b/libraries/Ticker/library.properties @@ -1,5 +1,5 @@ name=Ticker -version=3.1.3 +version=3.2.0 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 e0bc6c4b7e7..9d47dfc6719 100644 --- a/libraries/USB/library.properties +++ b/libraries/USB/library.properties @@ -1,5 +1,5 @@ name=USB -version=3.1.3 +version=3.2.0 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=ESP32S2 USB Library diff --git a/libraries/Update/library.properties b/libraries/Update/library.properties index f81897a64d6..c3ee8f7e506 100644 --- a/libraries/Update/library.properties +++ b/libraries/Update/library.properties @@ -1,5 +1,5 @@ name=Update -version=3.1.3 +version=3.2.0 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=ESP32 Sketch Update Library diff --git a/libraries/WebServer/library.properties b/libraries/WebServer/library.properties index c9153541cb2..2a9ff530d57 100644 --- a/libraries/WebServer/library.properties +++ b/libraries/WebServer/library.properties @@ -1,5 +1,5 @@ name=WebServer -version=3.1.3 +version=3.2.0 author=Ivan Grokhotkov maintainer=Ivan Grokhtkov sentence=Simple web server library diff --git a/libraries/WiFi/library.properties b/libraries/WiFi/library.properties index e72f082f8e6..03112c2fcc6 100644 --- a/libraries/WiFi/library.properties +++ b/libraries/WiFi/library.properties @@ -1,5 +1,5 @@ name=WiFi -version=3.1.3 +version=3.2.0 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 6334a5be5c4..13a63c50bb1 100644 --- a/libraries/WiFiProv/library.properties +++ b/libraries/WiFiProv/library.properties @@ -1,5 +1,5 @@ name=WiFiProv -version=3.1.3 +version=3.2.0 author=Switi Mhaiske maintainer=Hristo Gochkov sentence=Enables provisioning. diff --git a/libraries/Wire/library.properties b/libraries/Wire/library.properties index 044ba74c3d0..655f4bd3194 100644 --- a/libraries/Wire/library.properties +++ b/libraries/Wire/library.properties @@ -1,5 +1,5 @@ name=Wire -version=3.1.3 +version=3.2.0 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 29704db1a92..9a558d70216 100644 --- a/libraries/Zigbee/library.properties +++ b/libraries/Zigbee/library.properties @@ -1,5 +1,5 @@ name=Zigbee -version=3.1.3 +version=3.2.0 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 3a5c290a1cd..9c918733209 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "framework-arduinoespressif32", - "version": "3.1.3", + "version": "3.2.0", "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 1c718369587..65be05b3bf4 100644 --- a/platform.txt +++ b/platform.txt @@ -1,5 +1,5 @@ name=ESP32 Arduino -version=3.1.3 +version=3.2.0 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 646785e08668c299fc8c8a90ead588a57385d509 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 18 Feb 2025 20:01:18 -0300 Subject: [PATCH 010/290] feat(LP_UART): Implements the ESP32-C6/ESP32-P4 Low Power UART as a possible HardwareSerial port (#10967) * feat(uart): adds low power uart peripheral into hardware serial class * feat(lp_uart): pin setting for lp uart plus esp32p4 fixes * fix(uart): keeps the test as it was before. * fix(uart): updates the copyright year reference * fix(uart): updates the copyright year reference * feat(lp_uart): supports any number of lp uart port for the future * 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> --- cores/esp32/HardwareSerial.cpp | 126 ++++++++++------ cores/esp32/HardwareSerial.h | 23 ++- cores/esp32/esp32-hal-uart.c | 265 ++++++++++++++++++++++++++++----- cores/esp32/esp32-hal-uart.h | 3 +- 4 files changed, 330 insertions(+), 87 deletions(-) diff --git a/cores/esp32/HardwareSerial.cpp b/cores/esp32/HardwareSerial.cpp index fb93dad1c47..c14dac7bc7e 100644 --- a/cores/esp32/HardwareSerial.cpp +++ b/cores/esp32/HardwareSerial.cpp @@ -23,40 +23,52 @@ #define ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE -1 #endif +#if (SOC_UART_LP_NUM >= 1) +#define UART_HW_FIFO_LEN(uart_num) ((uart_num < SOC_UART_HP_NUM) ? SOC_UART_FIFO_LEN : SOC_LP_UART_FIFO_LEN) +#else +#define UART_HW_FIFO_LEN(uart_num) SOC_UART_FIFO_LEN +#endif + void serialEvent(void) __attribute__((weak)); -#if SOC_UART_HP_NUM > 1 +#if SOC_UART_NUM > 1 void serialEvent1(void) __attribute__((weak)); -#endif /* SOC_UART_HP_NUM > 1 */ +#endif /* SOC_UART_NUM > 1 */ -#if SOC_UART_HP_NUM > 2 +#if SOC_UART_NUM > 2 void serialEvent2(void) __attribute__((weak)); -#endif /* SOC_UART_HP_NUM > 2 */ +#endif /* SOC_UART_NUM > 2 */ -#if SOC_UART_HP_NUM > 3 +#if SOC_UART_NUM > 3 void serialEvent3(void) __attribute__((weak)); -#endif /* SOC_UART_HP_NUM > 3 */ +#endif /* SOC_UART_NUM > 3 */ -#if SOC_UART_HP_NUM > 4 +#if SOC_UART_NUM > 4 void serialEvent4(void) __attribute__((weak)); -#endif /* SOC_UART_HP_NUM > 4 */ +#endif /* SOC_UART_NUM > 4 */ + +#if SOC_UART_NUM > 5 +void serialEvent5(void) __attribute__((weak)); +#endif /* SOC_UART_NUM > 5 */ #if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL) // There is always Seria0 for UART0 HardwareSerial Serial0(0); -#if SOC_UART_HP_NUM > 1 +#if SOC_UART_NUM > 1 HardwareSerial Serial1(1); #endif -#if SOC_UART_HP_NUM > 2 +#if SOC_UART_NUM > 2 HardwareSerial Serial2(2); #endif -#if SOC_UART_HP_NUM > 3 +#if SOC_UART_NUM > 3 HardwareSerial Serial3(3); #endif -#if SOC_UART_HP_NUM > 4 +#if SOC_UART_NUM > 4 HardwareSerial Serial4(4); #endif - +#if (SOC_UART_NUM > 5) +HardwareSerial Serial5(5); +#endif #if HWCDC_SERIAL_IS_DEFINED == 1 // Hardware JTAG CDC Event extern void HWCDCSerialEvent(void) __attribute__((weak)); #endif @@ -81,26 +93,31 @@ void serialEventRun(void) { if (serialEvent && Serial0.available()) { serialEvent(); } -#if SOC_UART_HP_NUM > 1 +#if SOC_UART_NUM > 1 if (serialEvent1 && Serial1.available()) { serialEvent1(); } #endif -#if SOC_UART_HP_NUM > 2 +#if SOC_UART_NUM > 2 if (serialEvent2 && Serial2.available()) { serialEvent2(); } #endif -#if SOC_UART_HP_NUM > 3 +#if SOC_UART_NUM > 3 if (serialEvent3 && Serial3.available()) { serialEvent3(); } #endif -#if SOC_UART_HP_NUM > 4 +#if SOC_UART_NUM > 4 if (serialEvent4 && Serial4.available()) { serialEvent4(); } #endif +#if SOC_UART_NUM > 5 + if (serialEvent5 && Serial5.available()) { + serialEvent5(); + } +#endif } #endif @@ -185,7 +202,8 @@ void HardwareSerial::onReceive(OnReceiveCb function, bool onlyOnTimeout) { // in case that onReceive() shall work only with RX Timeout, FIFO shall be high // this is a work around for an IDF issue with events and low FIFO Full value (< 3) - if (_onReceiveTimeout) { + // Not valid for the LP UART + if (_onReceiveTimeout && _uart_nr < SOC_UART_HP_NUM) { uartSetRxFIFOFull(_uart, 120); log_w("OnReceive is set to Timeout only, thus FIFO Full is now 120 bytes."); } @@ -207,12 +225,13 @@ bool HardwareSerial::setRxFIFOFull(uint8_t fifoBytes) { HSERIAL_MUTEX_LOCK(); // in case that onReceive() shall work only with RX Timeout, FIFO shall be high // this is a work around for an IDF issue with events and low FIFO Full value (< 3) - if (_onReceiveCB != NULL && _onReceiveTimeout) { + // Not valid for the LP UART + if (_onReceiveCB != NULL && _onReceiveTimeout && _uart_nr < SOC_UART_HP_NUM) { fifoBytes = 120; log_w("OnReceive is set to Timeout only, thus FIFO Full is now 120 bytes."); } bool retCode = uartSetRxFIFOFull(_uart, fifoBytes); // Set new timeout - if (fifoBytes > 0 && fifoBytes < SOC_UART_FIFO_LEN - 1) { + if (fifoBytes > 0 && fifoBytes < UART_HW_FIFO_LEN(_uart_nr) - 1) { _rxFIFOFull = fifoBytes; } HSERIAL_MUTEX_UNLOCK(); @@ -298,8 +317,8 @@ void HardwareSerial::_uartEventTask(void *args) { } void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert, unsigned long timeout_ms, uint8_t rxfifo_full_thrhd) { - if (_uart_nr >= SOC_UART_HP_NUM) { - log_e("Serial number is invalid, please use a number from 0 to %u", SOC_UART_HP_NUM - 1); + if (_uart_nr >= SOC_UART_NUM) { + log_e("Serial number is invalid, please use a number from 0 to %u", SOC_UART_NUM - 1); return; } @@ -333,7 +352,7 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in txPin = _txPin < 0 ? (int8_t)SOC_TX0 : _txPin; } break; -#if SOC_UART_HP_NUM > 1 // may save some flash bytes... +#if SOC_UART_HP_NUM > 1 case UART_NUM_1: if (rxPin < 0 && txPin < 0) { // do not change RX1/TX1 if it has already been set before @@ -341,8 +360,8 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in txPin = _txPin < 0 ? (int8_t)TX1 : _txPin; } break; -#endif -#if SOC_UART_HP_NUM > 2 // may save some flash bytes... +#endif // UART_NUM_1 +#if SOC_UART_HP_NUM > 2 case UART_NUM_2: if (rxPin < 0 && txPin < 0) { // do not change RX2/TX2 if it has already been set before @@ -354,11 +373,11 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in #endif } break; -#endif -#if SOC_UART_HP_NUM > 3 // may save some flash bytes... +#endif // UART_NUM_2 +#if SOC_UART_HP_NUM > 3 case UART_NUM_3: if (rxPin < 0 && txPin < 0) { - // do not change RX2/TX2 if it has already been set before + // do not change RX3/TX3 if it has already been set before #ifdef RX3 rxPin = _rxPin < 0 ? (int8_t)RX3 : _rxPin; #endif @@ -367,11 +386,11 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in #endif } break; -#endif -#if SOC_UART_HP_NUM > 4 // may save some flash bytes... +#endif // UART_NUM_3 +#if SOC_UART_HP_NUM > 4 case UART_NUM_4: if (rxPin < 0 && txPin < 0) { - // do not change RX2/TX2 if it has already been set before + // do not change RX4/TX4 if it has already been set before #ifdef RX4 rxPin = _rxPin < 0 ? (int8_t)RX4 : _rxPin; #endif @@ -380,7 +399,20 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in #endif } break; +#endif // UART_NUM_4 +#if (SOC_UART_LP_NUM >= 1) + case LP_UART_NUM_0: + if (rxPin < 0 && txPin < 0) { + // do not change RX0_LP/TX0_LP if it has already been set before +#ifdef LP_RX0 + rxPin = _rxPin < 0 ? (int8_t)LP_RX0 : _rxPin; +#endif +#ifdef LP_TX0 + txPin = _txPin < 0 ? (int8_t)LP_TX0 : _txPin; #endif + } + break; +#endif // LP_UART_NUM_0 } } @@ -445,7 +477,8 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in if (!_rxFIFOFull) { // it has not being changed before calling begin() // set a default FIFO Full value for the IDF driver uint8_t fifoFull = 1; - if (baud > 57600 || (_onReceiveCB != NULL && _onReceiveTimeout)) { + // if baud rate is higher than 57600 or onReceive() is set, it will set FIFO Full to 120 bytes, except for LP UART + if (_uart_nr < SOC_UART_HP_NUM && (baud > 57600 || (_onReceiveCB != NULL && _onReceiveTimeout))) { fifoFull = 120; } uartSetRxFIFOFull(_uart, fifoFull); @@ -477,6 +510,12 @@ void HardwareSerial::setDebugOutput(bool en) { if (_uart == 0) { return; } +#if (SOC_UART_LP_NUM >= 1) + if (_uart_nr >= SOC_UART_HP_NUM) { + log_e("LP UART does not support Debug Output."); + return; + } +#endif if (en) { uartSetDebug(_uart); } else { @@ -581,34 +620,37 @@ bool HardwareSerial::setMode(SerialMode mode) { } // minimum total RX Buffer size is the UART FIFO space (128 bytes for most SoC) + 1. IDF imposition. +// LP UART has FIFO of 16 bytes size_t HardwareSerial::setRxBufferSize(size_t new_size) { if (_uart) { log_e("RX Buffer can't be resized when Serial is already running. Set it before calling begin()."); return 0; } - - if (new_size <= SOC_UART_FIFO_LEN) { - log_w("RX Buffer set to minimum value: %d.", SOC_UART_FIFO_LEN + 1); // ESP32, S2, S3 and C3 means higher than 128 - new_size = SOC_UART_FIFO_LEN + 1; + uint8_t FIFOLen = UART_HW_FIFO_LEN(_uart_nr); + // Valid value is higher than the FIFO length + if (new_size <= FIFOLen) { + new_size = FIFOLen + 1; + log_w("RX Buffer set to minimum value: %d.", new_size); } _rxBufferSize = new_size; return _rxBufferSize; } -// minimum total TX Buffer size is the UART FIFO space (128 bytes for most SoC). +// minimum total TX Buffer size is the UART FIFO space (128 bytes for most SoC) + 1. +// LP UART has FIFO of 16 bytes size_t HardwareSerial::setTxBufferSize(size_t new_size) { if (_uart) { log_e("TX Buffer can't be resized when Serial is already running. Set it before calling begin()."); return 0; } - - if (new_size <= SOC_UART_FIFO_LEN) { - log_w("TX Buffer set to minimum value: %d.", SOC_UART_FIFO_LEN); // ESP32, S2, S3 and C3 means higher than 128 - _txBufferSize = 0; // it will use just UART FIFO with SOC_UART_FIFO_LEN bytes (128 for most SoC) - return SOC_UART_FIFO_LEN; + uint8_t FIFOLen = UART_HW_FIFO_LEN(_uart_nr); + // Valid values are zero or higher than the FIFO length + if (new_size > 0 && new_size <= FIFOLen) { + new_size = FIFOLen + 1; + log_w("TX Buffer set to minimum value: %d.", new_size); } // if new_size is higher than SOC_UART_FIFO_LEN, TX Ringbuffer will be active and it will be used to report back "availableToWrite()" _txBufferSize = new_size; diff --git a/cores/esp32/HardwareSerial.h b/cores/esp32/HardwareSerial.h index a33d5def34d..e52428f0dd5 100644 --- a/cores/esp32/HardwareSerial.h +++ b/cores/esp32/HardwareSerial.h @@ -212,6 +212,16 @@ typedef enum { #endif #endif /* SOC_UART_HP_NUM > 2 */ +#if SOC_UART_LP_NUM >= 1 +#ifndef LP_RX0 +#define LP_RX0 (gpio_num_t) LP_U0RXD_GPIO_NUM +#endif + +#ifndef LP_TX0 +#define LP_TX0 (gpio_num_t) LP_U0TXD_GPIO_NUM +#endif +#endif /* SOC_UART_LP_NUM >= 1 */ + typedef std::function OnReceiveCb; typedef std::function OnReceiveErrorCb; @@ -259,7 +269,7 @@ class HardwareSerial : public Stream { // rxfifo_full_thrhd if the UART Flow Control Threshold in the UART FIFO (max 127) void begin( unsigned long baud, uint32_t config = SERIAL_8N1, int8_t rxPin = -1, int8_t txPin = -1, bool invert = false, unsigned long timeout_ms = 20000UL, - uint8_t rxfifo_full_thrhd = 112 + uint8_t rxfifo_full_thrhd = 120 ); void end(void); void updateBaudRate(unsigned long baud); @@ -365,18 +375,21 @@ extern void serialEventRun(void) __attribute__((weak)); #endif // ARDUINO_USB_CDC_ON_BOOT // There is always Seria0 for UART0 extern HardwareSerial Serial0; -#if SOC_UART_HP_NUM > 1 +#if SOC_UART_NUM > 1 extern HardwareSerial Serial1; #endif -#if SOC_UART_HP_NUM > 2 +#if SOC_UART_NUM > 2 extern HardwareSerial Serial2; #endif -#if SOC_UART_HP_NUM > 3 +#if SOC_UART_NUM > 3 extern HardwareSerial Serial3; #endif -#if SOC_UART_HP_NUM > 4 +#if SOC_UART_NUM > 4 extern HardwareSerial Serial4; #endif +#if SOC_UART_NUM > 5 +extern HardwareSerial Serial5; +#endif #endif //!defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL) #endif // HardwareSerial_h diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index 34a2660e3a3..59a95a084f6 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -1,4 +1,4 @@ -// Copyright 2015-2024 Espressif Systems (Shanghai) PTE LTD +// Copyright 2015-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. @@ -33,6 +33,11 @@ #include "hal/gpio_hal.h" #include "esp_rom_gpio.h" +#include "driver/rtc_io.h" +#include "driver/lp_io.h" +#include "soc/uart_periph.h" +#include "esp_private/uart_share_hw_ctrl.h" + 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 @@ -62,18 +67,21 @@ struct uart_struct_t { static uart_t _uart_bus_array[] = { {0, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, -#if SOC_UART_HP_NUM > 1 +#if SOC_UART_NUM > 1 {1, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, #endif -#if SOC_UART_HP_NUM > 2 +#if SOC_UART_NUM > 2 {2, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, #endif -#if SOC_UART_HP_NUM > 3 +#if SOC_UART_NUM > 3 {3, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, #endif -#if SOC_UART_HP_NUM > 4 +#if SOC_UART_NUM > 4 {4, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, #endif +#if SOC_UART_NUM > 5 + {5, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, +#endif }; #else @@ -88,27 +96,121 @@ static uart_t _uart_bus_array[] = { static uart_t _uart_bus_array[] = { {NULL, 0, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, -#if SOC_UART_HP_NUM > 1 +#if SOC_UART_NUM > 1 {NULL, 1, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, #endif -#if SOC_UART_HP_NUM > 2 +#if SOC_UART_NUM > 2 {NULL, 2, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, #endif -#if SOC_UART_HP_NUM > 3 +#if SOC_UART_NUM > 3 {NULL, 3, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, #endif -#if SOC_UART_HP_NUM > 4 +#if SOC_UART_NUM > 4 {NULL, 4, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, #endif +#if SOC_UART_NUM > 5 + {NULL, 5, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, +#endif }; #endif +#if SOC_UART_LP_NUM >= 1 +// LP UART enable pins routine +static bool lp_uart_config_io(uint8_t uart_num, int8_t pin, rtc_gpio_mode_t direction, uint32_t idx) { + /* Skip configuration if the LP_IO is -1 */ + if (pin < 0) { + return true; + } + + // Initialize LP_IO + if (rtc_gpio_init(pin) != ESP_OK) { + log_e("Failed to initialize LP_IO %d", pin); + return false; + } + + // Set LP_IO direction + if (rtc_gpio_set_direction(pin, direction) != ESP_OK) { + log_e("Failed to set LP_IO %d direction", pin); + return false; + } + + // Connect pins + const uart_periph_sig_t *upin = &uart_periph_signal[uart_num].pins[idx]; +#if !SOC_LP_GPIO_MATRIX_SUPPORTED // ESP32-C6/C61/C5 + // When LP_IO Matrix is not support, LP_IO Mux must be connected to the pins + if (rtc_gpio_iomux_func_sel(pin, upin->iomux_func) != ESP_OK) { + log_e("Failed to set LP_IO pin %d into Mux function", pin); + return false; + } +#else // So far, only ESP32-P4 + // If the configured pin is the default LP_IO Mux pin for LP UART, then set the LP_IO MUX function + if (upin->default_gpio == pin) { + if (rtc_gpio_iomux_func_sel(pin, upin->iomux_func) != ESP_OK) { + log_e("Failed to set LP_IO pin %d into Mux function", pin); + return false; + } + } else { + // Otherwise, set the LP_IO Matrix and select FUNC1 + if (rtc_gpio_iomux_func_sel(pin, 1) != ESP_OK) { + log_e("Failed to set LP_IO pin %d into Mux function GPIO", pin); + return false; + } + // Connect the LP_IO to the LP UART peripheral signal + esp_err_t ret; + if (direction == RTC_GPIO_MODE_OUTPUT_ONLY) { + ret = lp_gpio_connect_out_signal(pin, UART_PERIPH_SIGNAL(uart_num, idx), 0, 0); + } else { + ret = lp_gpio_connect_in_signal(pin, UART_PERIPH_SIGNAL(uart_num, idx), 0); + } + if (ret != ESP_OK) { + log_e("Failed to connect LP_IO pin %d to UART%d signal", pin, uart_num); + return false; + } + } +#endif // SOC_LP_GPIO_MATRIX_SUPPORTED + + return true; +} + +// When LP UART needs the RTC IO MUX to set the pin, it will always have fixed pins for RX, TX, CTS and RTS +static bool lpuartCheckPins(int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin, uint8_t uart_nr) { +// check if LP UART is being used and if the pins are valid +#if !SOC_LP_GPIO_MATRIX_SUPPORTED // ESP32-C6/C61/C5 + uint16_t lp_uart_fixed_pin = uart_periph_signal[uart_nr].pins[SOC_UART_RX_PIN_IDX].default_gpio; + if (uart_nr >= SOC_UART_HP_NUM) { // it is a LP UART NUM + if (rxPin > 0 && rxPin != lp_uart_fixed_pin) { + log_e("UART%d LP UART requires RX pin to be set to %d.", uart_nr, lp_uart_fixed_pin); + return false; + } + lp_uart_fixed_pin = uart_periph_signal[uart_nr].pins[SOC_UART_TX_PIN_IDX].default_gpio; + if (txPin > 0 && txPin != lp_uart_fixed_pin) { + log_e("UART%d LP UART requires TX pin to be set to %d.", uart_nr, lp_uart_fixed_pin); + return false; + } + lp_uart_fixed_pin = uart_periph_signal[uart_nr].pins[SOC_UART_CTS_PIN_IDX].default_gpio; + if (ctsPin > 0 && ctsPin != lp_uart_fixed_pin) { + log_e("UART%d LP UART requires CTS pin to be set to %d.", uart_nr, lp_uart_fixed_pin); + return false; + } + lp_uart_fixed_pin = uart_periph_signal[uart_nr].pins[SOC_UART_RTS_PIN_IDX].default_gpio; + if (rtsPin > 0 && rtsPin != lp_uart_fixed_pin) { + log_e("UART%d LP UART requires RTS pin to be set to %d.", uart_nr, lp_uart_fixed_pin); + return false; + } + } + return true; +#else // ESP32-P4 can set any pin for LP UART + return true; +#endif // SOC_LP_GPIO_MATRIX_SUPPORTED +} +#endif // SOC_UART_LP_NUM >= 1 + // Negative Pin Number will keep it unmodified, thus this function can detach individual pins // This function will also unset the pins in the Peripheral Manager and set the pin to -1 after detaching static bool _uartDetachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin) { - if (uart_num >= SOC_UART_HP_NUM) { - log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_HP_NUM - 1); + if (uart_num >= SOC_UART_NUM) { + log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_NUM - 1); return false; } // get UART information @@ -117,7 +219,7 @@ static bool _uartDetachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t //log_v("detaching UART%d pins: prev,pin RX(%d,%d) TX(%d,%d) CTS(%d,%d) RTS(%d,%d)", uart_num, // uart->_rxPin, rxPin, uart->_txPin, txPin, uart->_ctsPin, ctsPin, uart->_rtsPin, rtsPin); vTaskDelay(10); - // detaches pins and sets Peripheral Manager and UART information + // detaches HP and LP pins and sets Peripheral Manager and UART information if (rxPin >= 0 && uart->_rxPin == rxPin && perimanGetPinBusType(rxPin) == ESP32_BUS_TYPE_UART_RX) { gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[rxPin], PIN_FUNC_GPIO); // avoids causing BREAK in the UART line @@ -194,8 +296,8 @@ static bool _uartDetachBus_RTS(void *busptr) { // Attach function for UART // connects the IO Pad, set Paripheral Manager and internal UART structure data static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin) { - if (uart_num >= SOC_UART_HP_NUM) { - log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_HP_NUM - 1); + if (uart_num >= SOC_UART_NUM) { + log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_NUM - 1); return false; } // get UART information @@ -203,6 +305,8 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t //log_v("attaching UART%d pins: prev,new RX(%d,%d) TX(%d,%d) CTS(%d,%d) RTS(%d,%d)", uart_num, // uart->_rxPin, rxPin, uart->_txPin, txPin, uart->_ctsPin, ctsPin, uart->_rtsPin, rtsPin); vTaskDelay(10); + // IDF uart_set_pin() checks if the pin is used within LP UART and if it is a valid RTC IO pin + // No need for Arduino Layer to check it again bool retCode = true; if (rxPin >= 0) { // forces a clean detaching from a previous peripheral @@ -211,6 +315,11 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t } // connect RX Pad bool ret = ESP_OK == uart_set_pin(uart->num, UART_PIN_NO_CHANGE, rxPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); +#if SOC_UART_LP_NUM >= 1 + if (ret && uart_num >= SOC_UART_HP_NUM) { // it is a LP UART NUM + ret &= lp_uart_config_io(uart->num, rxPin, RTC_GPIO_MODE_INPUT_ONLY, SOC_UART_RX_PIN_IDX); + } +#endif if (ret) { ret &= perimanSetPinBus(rxPin, ESP32_BUS_TYPE_UART_RX, (void *)uart, uart_num, -1); if (ret) { @@ -229,6 +338,11 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t } // connect TX Pad bool ret = ESP_OK == uart_set_pin(uart->num, txPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); +#if SOC_UART_LP_NUM >= 1 + if (ret && uart_num >= SOC_UART_HP_NUM) { // it is a LP UART NUM + ret &= lp_uart_config_io(uart->num, txPin, RTC_GPIO_MODE_OUTPUT_ONLY, SOC_UART_TX_PIN_IDX); + } +#endif if (ret) { ret &= perimanSetPinBus(txPin, ESP32_BUS_TYPE_UART_TX, (void *)uart, uart_num, -1); if (ret) { @@ -247,6 +361,11 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t } // connect CTS Pad bool ret = ESP_OK == uart_set_pin(uart->num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, ctsPin); +#if SOC_UART_LP_NUM >= 1 + if (ret && uart_num >= SOC_UART_HP_NUM) { // it is a LP UART NUM + ret &= lp_uart_config_io(uart->num, ctsPin, RTC_GPIO_MODE_INPUT_ONLY, SOC_UART_CTS_PIN_IDX); + } +#endif if (ret) { ret &= perimanSetPinBus(ctsPin, ESP32_BUS_TYPE_UART_CTS, (void *)uart, uart_num, -1); if (ret) { @@ -265,6 +384,11 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t } // connect RTS Pad bool ret = ESP_OK == uart_set_pin(uart->num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, rtsPin, UART_PIN_NO_CHANGE); +#if SOC_UART_LP_NUM >= 1 + if (ret && uart_num >= SOC_UART_HP_NUM) { // it is a LP UART NUM + ret &= lp_uart_config_io(uart->num, rtsPin, RTC_GPIO_MODE_OUTPUT_ONLY, SOC_UART_RTS_PIN_IDX); + } +#endif if (ret) { ret &= perimanSetPinBus(rtsPin, ESP32_BUS_TYPE_UART_RTS, (void *)uart, uart_num, -1); if (ret) { @@ -321,13 +445,20 @@ bool uartIsDriverInstalled(uart_t *uart) { // Negative Pin Number will keep it unmodified, thus this function can set individual pins // When pins are changed, it will detach the previous one bool uartSetPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin) { - if (uart_num >= SOC_UART_HP_NUM) { - log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_HP_NUM - 1); + if (uart_num >= SOC_UART_NUM) { + log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_NUM - 1); return false; } // get UART information uart_t *uart = &_uart_bus_array[uart_num]; +#if SOC_UART_LP_NUM >= 1 + // check if LP UART is being used and if the pins are valid + if (!lpuartCheckPins(rxPin, txPin, ctsPin, rtsPin, uart_num)) { + return false; // failed to set pins + } +#endif + bool retCode = true; UART_MUTEX_LOCK(); @@ -391,7 +522,7 @@ bool _testUartBegin( uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rxPin, int8_t txPin, uint32_t rx_buffer_size, uint32_t tx_buffer_size, bool inverted, uint8_t rxfifo_full_thrhd ) { - if (uart_nr >= SOC_UART_HP_NUM) { + if (uart_nr >= SOC_UART_NUM) { return false; // no new driver has to be installed } uart_t *uart = &_uart_bus_array[uart_nr]; @@ -413,13 +544,24 @@ uart_t *uartBegin( uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rxPin, int8_t txPin, uint32_t rx_buffer_size, uint32_t tx_buffer_size, bool inverted, uint8_t rxfifo_full_thrhd ) { - if (uart_nr >= SOC_UART_HP_NUM) { - log_e("UART number is invalid, please use number from 0 to %u", SOC_UART_HP_NUM - 1); + if (uart_nr >= SOC_UART_NUM) { + log_e("UART number is invalid, please use number from 0 to %u", SOC_UART_NUM - 1); return NULL; // no new driver was installed } uart_t *uart = &_uart_bus_array[uart_nr]; log_v("UART%d baud(%ld) Mode(%x) rxPin(%d) txPin(%d)", uart_nr, baudrate, config, rxPin, txPin); +#if SOC_UART_LP_NUM >= 1 + // check if LP UART is being used and if the pins are valid + if (!lpuartCheckPins(rxPin, txPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, uart_nr)) { + if (uart_is_driver_installed(uart_nr)) { + return uart; // keep the same installed driver + } else { + return NULL; // no new driver was installed + } + } +#endif + #if !CONFIG_DISABLE_HAL_LOCKS if (uart->lock == NULL) { uart->lock = xSemaphoreCreateMutex(); @@ -436,6 +578,10 @@ uart_t *uartBegin( if (uart->_rx_buffer_size != rx_buffer_size || uart->_tx_buffer_size != tx_buffer_size || uart->_inverted != inverted || uart->_rxfifo_full_thrhd != rxfifo_full_thrhd) { log_v("UART%d changing buffer sizes or inverted signal or rxfifo_full_thrhd. IDF driver will be restarted", uart_nr); + log_v("RX buffer size: %d -> %d", uart->_rx_buffer_size, rx_buffer_size); + log_v("TX buffer size: %d -> %d", uart->_tx_buffer_size, tx_buffer_size); + log_v("Inverted signal: %s -> %s", uart->_inverted ? "true" : "false", inverted ? "true" : "false"); + log_v("RX FIFO full threshold: %d -> %d", uart->_rxfifo_full_thrhd, rxfifo_full_thrhd); uartEnd(uart_nr); } else { bool retCode = true; @@ -500,7 +646,7 @@ uart_t *uartBegin( } UART_MUTEX_UNLOCK(); if (retCode) { - // UART driver was already working, just return the uart_t structure, syaing that no new driver was installed + // UART driver was already working, just return the uart_t structure, saying that no new driver was installed return uart; } // if we reach this point, it means that we need to restart the UART driver @@ -516,22 +662,39 @@ uart_t *uartBegin( uart_config.parity = (config & 0x3); uart_config.stop_bits = (config & 0x30) >> 4; uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE; - uart_config.rx_flow_ctrl_thresh = rxfifo_full_thrhd; + uart_config.rx_flow_ctrl_thresh = rxfifo_full_thrhd >= UART_HW_FIFO_LEN(uart_nr) ? UART_HW_FIFO_LEN(uart_nr) - 6 : rxfifo_full_thrhd; + log_v( + "UART%d RX FIFO full threshold set to %d (value requested: %d || FIFO Max = %d)", uart_nr, uart_config.rx_flow_ctrl_thresh, rxfifo_full_thrhd, + UART_HW_FIFO_LEN(uart_nr) + ); + rxfifo_full_thrhd = uart_config.rx_flow_ctrl_thresh; // makes sure that it will be set correctly in the struct uart_config.baud_rate = baudrate; - // there is an issue when returning from light sleep with the C6 and H2: the uart baud rate is not restored - // therefore, uart clock source will set to XTAL for all SoC that support it. This fix solves the C6|H2 issue. +#if SOC_UART_LP_NUM >= 1 + if (uart_nr >= SOC_UART_HP_NUM) { // it is a LP UART NUM + uart_config.lp_source_clk = LP_UART_SCLK_DEFAULT; // use default LP clock + log_v("Setting UART%d to use LP clock", uart_nr); + } else +#endif + { + // there is an issue when returning from light sleep with the C6 and H2: the uart baud rate is not restored + // therefore, uart clock source will set to XTAL for all SoC that support it. This fix solves the C6|H2 issue. #if SOC_UART_SUPPORT_XTAL_CLK - uart_config.source_clk = UART_SCLK_XTAL; // valid for C2, S3, C3, C6, H2 and P4 + uart_config.source_clk = UART_SCLK_XTAL; // valid for C2, S3, C3, C6, H2 and P4 + log_v("Setting UART%d to use XTAL clock", uart_nr); #elif SOC_UART_SUPPORT_REF_TICK - 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! - } + 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 + log_v("Setting UART%d to use REF_TICK clock", uart_nr); + } else { + uart_config.source_clk = UART_SCLK_APB; // baudrate may change with the APB Frequency! + log_v("Setting UART%d to use APB clock", uart_nr); + } #else - // Default CLK Source: CLK_APB for ESP32|S2|S3|C3 -- CLK_PLL_F40M for C2 -- CLK_PLL_F48M for H2 -- CLK_PLL_F80M for C6 - uart_config.source_clk = UART_SCLK_DEFAULT; // baudrate may change with the APB Frequency! + // Default CLK Source: CLK_APB for ESP32|S2|S3|C3 -- CLK_PLL_F40M for C2 -- CLK_PLL_F48M for H2 -- CLK_PLL_F80M for C6 + uart_config.source_clk = UART_SCLK_DEFAULT; // baudrate may change with the APB Frequency! + log_v("Setting UART%d to use DEFAULT clock", uart_nr); #endif + } UART_MUTEX_LOCK(); bool retCode = ESP_OK == uart_driver_install(uart_nr, rx_buffer_size, tx_buffer_size, 20, &(uart->uart_event_queue), 0); @@ -611,16 +774,25 @@ bool uartSetRxFIFOFull(uart_t *uart, uint8_t numBytesFIFOFull) { if (uart == NULL) { return false; } - + uint8_t rxfifo_full_thrhd = numBytesFIFOFull >= UART_HW_FIFO_LEN(uart->num) ? UART_HW_FIFO_LEN(uart->num) - 6 : numBytesFIFOFull; UART_MUTEX_LOCK(); - bool retCode = (ESP_OK == uart_set_rx_full_threshold(uart->num, numBytesFIFOFull)); + bool retCode = (ESP_OK == uart_set_rx_full_threshold(uart->num, rxfifo_full_thrhd)); + if (retCode) { + uart->_rxfifo_full_thrhd = rxfifo_full_thrhd; + if (rxfifo_full_thrhd != numBytesFIFOFull) { + log_w("The RX FIFO Full value for UART%d was set to %d instead of %d", uart->num, rxfifo_full_thrhd, numBytesFIFOFull); + } + log_v("UART%d RX FIFO Full value set to %d from a requested value of %d", uart->num, rxfifo_full_thrhd, numBytesFIFOFull); + } else { + log_e("UART%d failed to set RX FIFO Full value to %d", uart->num, numBytesFIFOFull); + } UART_MUTEX_UNLOCK(); return retCode; } void uartEnd(uint8_t uart_num) { - if (uart_num >= SOC_UART_HP_NUM) { - log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_HP_NUM - 1); + if (uart_num >= SOC_UART_NUM) { + log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_NUM - 1); return; } // get UART information @@ -645,7 +817,7 @@ void uartSetRxInvert(uart_t *uart, bool invert) { // ESP_ERROR_CHECK(uart_set_line_inverse(uart->num, UART_SIGNAL_RXD_INV)); // else // ESP_ERROR_CHECK(uart_set_line_inverse(uart->num, UART_SIGNAL_INV_DISABLE)); - + log_e("uartSetRxInvert is not supported in ESP32C6, ESP32H2 and ESP32P4"); #else // this implementation is better over IDF API because it only affects RXD // this is supported in ESP32, ESP32-S2 and ESP32-C3 @@ -805,11 +977,23 @@ void uartSetBaudRate(uart_t *uart, uint32_t baud_rate) { return; } UART_MUTEX_LOCK(); -#if !SOC_UART_SUPPORT_XTAL_CLK +#if SOC_UART_SUPPORT_XTAL_CLK // ESP32-S3, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-H2 and ESP32-P4 + soc_module_clk_t newClkSrc = UART_SCLK_XTAL; +#if SOC_UART_LP_NUM >= 1 + if (uart->num >= SOC_UART_HP_NUM) { // it is a LP UART NUM + newClkSrc = LP_UART_SCLK_DEFAULT; // use default LP clock + } +#endif + // ESP32-P4 demands an atomic operation for setting the clock source + HP_UART_SRC_CLK_ATOMIC() { + uart_ll_set_sclk(UART_LL_GET_HW(uart->num), newClkSrc); + } +#else // ESP32, ESP32-S2 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) { + log_v("Setting UART%d baud rate to %d.", uart->num, baud_rate); uart->_baudrate = baud_rate; } else { log_e("Setting UART%d baud rate to %d has failed.", uart->num, baud_rate); @@ -889,7 +1073,7 @@ void uart_install_putc() { // Routines that take care of UART mode in the HardwareSerial Class code // used to set UART_MODE_RS485_HALF_DUPLEX auto RTS for TXD for ESP32 chips bool uartSetMode(uart_t *uart, uart_mode_t mode) { - if (uart == NULL || uart->num >= SOC_UART_HP_NUM) { + if (uart == NULL || uart->num >= SOC_UART_NUM) { return false; } @@ -900,6 +1084,7 @@ bool uartSetMode(uart_t *uart, uart_mode_t mode) { } void uartSetDebug(uart_t *uart) { + // LP UART is not supported for debug if (uart == NULL || uart->num >= SOC_UART_HP_NUM) { s_uart_debug_nr = -1; } else { @@ -1170,7 +1355,9 @@ unsigned long uartDetectBaudrate(uart_t *uart) { This creates a loop that lets us receive anything we send on the UART without external wires. */ void uart_internal_loopback(uint8_t uartNum, int8_t rxPin) { - if (uartNum > SOC_UART_HP_NUM - 1 || !GPIO_IS_VALID_GPIO(rxPin)) { + // LP UART is not supported for loopback + if (uartNum >= SOC_UART_HP_NUM || !GPIO_IS_VALID_GPIO(rxPin)) { + log_e("UART%d is not supported for loopback or RX pin %d is invalid.", uartNum, rxPin); return; } esp_rom_gpio_connect_out_signal(rxPin, UART_TX_SIGNAL(uartNum), false, false); diff --git a/cores/esp32/esp32-hal-uart.h b/cores/esp32/esp32-hal-uart.h index 402b5785915..74249194da3 100644 --- a/cores/esp32/esp32-hal-uart.h +++ b/cores/esp32/esp32-hal-uart.h @@ -1,4 +1,4 @@ -// Copyright 2015-2023 Espressif Systems (Shanghai) PTE LTD +// Copyright 2015-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. @@ -17,6 +17,7 @@ #include "soc/soc_caps.h" #if SOC_UART_SUPPORTED +#include "soc/uart_pins.h" #ifdef __cplusplus extern "C" { From 5afafdf4c6a7299e357662646970e490f4244771 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Wed, 19 Feb 2025 18:31:08 -0300 Subject: [PATCH 011/290] fix(matter): commentaries and messages related to factory reset (#10988) * fix(matter): commentaries and messages related to the factory reset * fix(matter): commentaries and messages typo --- .../examples/MatterComposedLights/MatterComposedLights.ino | 2 +- .../examples/MatterContactSensor/MatterContactSensor.ino | 2 +- libraries/Matter/examples/MatterFan/MatterFan.ino | 2 +- .../examples/MatterHumiditySensor/MatterHumiditySensor.ino | 2 +- .../examples/MatterOccupancySensor/MatterOccupancySensor.ino | 2 +- .../examples/MatterPressureSensor/MatterPressureSensor.ino | 4 ++-- .../MatterTemperatureSensor/MatterTemperatureSensor.ino | 2 +- .../Matter/examples/MatterThermostat/MatterThermostat.ino | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino index 9c3dcf05a83..b98cc8e19c9 100644 --- a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino +++ b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino @@ -128,7 +128,7 @@ void loop() { // 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."); + Serial.println("Decommissioning the Composed Light 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/MatterContactSensor/MatterContactSensor.ino b/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino index e27f70e613d..e4c41460d3a 100644 --- a/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino +++ b/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino @@ -140,7 +140,7 @@ void loop() { // 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."); + Serial.println("Decommissioning Contact Sensor 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/MatterFan/MatterFan.ino b/libraries/Matter/examples/MatterFan/MatterFan.ino index 3dc0c89fcf4..1094126a843 100644 --- a/libraries/Matter/examples/MatterFan/MatterFan.ino +++ b/libraries/Matter/examples/MatterFan/MatterFan.ino @@ -180,7 +180,7 @@ void loop() { // 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."); + Serial.println("Decommissioning Fan 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/MatterHumiditySensor/MatterHumiditySensor.ino b/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino index 3fcab46c565..1c7889db849 100644 --- a/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino +++ b/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino @@ -122,7 +122,7 @@ void loop() { // 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."); + Serial.println("Decommissioning Humidity Sensor Matter Accessory. It shall be commissioned again."); Matter.decommission(); } diff --git a/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino b/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino index e88a9a8986b..333f178e9de 100644 --- a/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino +++ b/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino @@ -116,7 +116,7 @@ void loop() { // 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."); + Serial.println("Decommissioning Occupancy Sensor 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/MatterPressureSensor/MatterPressureSensor.ino b/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino index 394a217b87a..db035e951c9 100644 --- a/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino +++ b/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino @@ -122,8 +122,8 @@ void loop() { // 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."); + // Factory reset is triggered if the button is pressed longer than 5 seconds + Serial.println("Decommissioning Pressure Sensor Matter Accessory. It shall be commissioned again."); Matter.decommission(); } diff --git a/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino b/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino index a2866e4655e..086155aeffe 100644 --- a/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino +++ b/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino @@ -122,7 +122,7 @@ void loop() { // 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."); + Serial.println("Decommissioning Temperature Sensor 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/MatterThermostat/MatterThermostat.ino b/libraries/Matter/examples/MatterThermostat/MatterThermostat.ino index 508b508573a..bf76477c846 100644 --- a/libraries/Matter/examples/MatterThermostat/MatterThermostat.ino +++ b/libraries/Matter/examples/MatterThermostat/MatterThermostat.ino @@ -234,7 +234,7 @@ void loop() { // 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."); + Serial.println("Decommissioning Thermostat Matter Accessory. It shall be commissioned again."); Matter.decommission(); button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so } From eec2af3d35d10152307cb878f5f39d288047f28d 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, 19 Feb 2025 22:31:37 +0100 Subject: [PATCH 012/290] feat(zigbee): Add range extender device endpoint (#10970) * feat(zigbee): Add range extender device endpoint * ci(pre-commit): Apply automatic fixes * fix(example): Fix typo catched by precommit --------- Co-authored-by: Me No Dev Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- CMakeLists.txt | 1 + .../examples/Zigbee_Range_Extender/README.md | 68 +++++++++++ .../Zigbee_Range_Extender.ino | 115 ++++++++++++++++++ .../examples/Zigbee_Range_Extender/ci.json | 6 + libraries/Zigbee/src/Zigbee.h | 1 + .../Zigbee/src/ep/ZigbeeRangeExtender.cpp | 15 +++ libraries/Zigbee/src/ep/ZigbeeRangeExtender.h | 18 +++ 7 files changed, 224 insertions(+) create mode 100644 libraries/Zigbee/examples/Zigbee_Range_Extender/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Range_Extender/Zigbee_Range_Extender.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Range_Extender/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeRangeExtender.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a17c516936c..7436eb1833c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -295,6 +295,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp + libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp ) set(ARDUINO_LIBRARY_BLE_SRCS diff --git a/libraries/Zigbee/examples/Zigbee_Range_Extender/README.md b/libraries/Zigbee/examples/Zigbee_Range_Extender/README.md new file mode 100644 index 00000000000..198dd85b6ee --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Range_Extender/README.md @@ -0,0 +1,68 @@ +# Arduino-ESP32 Zigbee Range Extender (Router) Example + +This example shows how to configure the Zigbee Router device and use it as a Home Automation (HA) network range extender. + +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 router device and upload the Zigbee_Range_Extender 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 Coordinator/Router device Zigbee mode: `Tools -> Zigbee mode: Zigbee ZCZR (coordinator/router)` +* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee 4MB with spiffs` (select correct size) +* 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 Router device flashed with this example is not connecting to the coordinator, erase the flash of the Router 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_Range_Extender/Zigbee_Range_Extender.ino b/libraries/Zigbee/examples/Zigbee_Range_Extender/Zigbee_Range_Extender.ino new file mode 100644 index 00000000000..3c4cfeb61dc --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Range_Extender/Zigbee_Range_Extender.ino @@ -0,0 +1,115 @@ +// 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 simple Zigbee Range Extender (router). + * + * The example demonstrates how to use Zigbee library to create a Zigbee network ragbe extender (router). + * + * 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_ZCZR +#error "Zigbee coordinator/router mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +/* Zigbee light bulb configuration */ +#define USE_CUSTOM_ZIGBEE_CONFIG 1 +#define ZIGBEE_EXTENDER_ENDPOINT 1 +uint8_t led = RGB_BUILTIN; +uint8_t button = BOOT_PIN; + +ZigbeeRangeExtender zbExtender = ZigbeeRangeExtender(ZIGBEE_EXTENDER_ENDPOINT); + +/************************** Identify ******************************/ +// 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) { + digitalWrite(led, LOW); + return; + } + digitalWrite(led, blink); + blink = !blink; +} + +/********************* 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 callback function for device identify + zbExtender.onIdentify(identify); + + // Optional: Set Zigbee device name and model + zbExtender.setManufacturerAndModel("Espressif", "ZigbeeRangeExtender"); + + // Add endpoint to Zigbee Core + Serial.println("Adding Zigbee Extender endpoint to Zigbee Core"); + Zigbee.addEndpoint(&zbExtender); + +#if USE_CUSTOM_ZIGBEE_CONFIG + // Optional: Create a custom Zigbee configuration for Zigbee Extender + esp_zb_cfg_t zigbeeConfig = ZIGBEE_DEFAULT_ROUTER_CONFIG(); + zigbeeConfig.nwk_cfg.zczr_cfg.max_children = 20; // 10 is default + + // When all EPs are registered, start Zigbee with custom config + if (!Zigbee.begin(&zigbeeConfig)) { +#else + // When all EPs are registered, start Zigbee as ROUTER device + if (!Zigbee.begin(ZIGBEE_ROUTER)) { +#endif + 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) == 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(); + } + } + } +} diff --git a/libraries/Zigbee/examples/Zigbee_Range_Extender/ci.json b/libraries/Zigbee/examples/Zigbee_Range_Extender/ci.json new file mode 100644 index 00000000000..e79a477da11 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Range_Extender/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee_zczr,ZigbeeMode=zczr", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y" + ] +} diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index b785c28d0df..7353f661416 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -22,3 +22,4 @@ #include "ep/ZigbeeDoorWindowHandle.h" #include "ep/ZigbeeWindowCovering.h" #include "ep/ZigbeeVibrationSensor.h" +#include "ep/ZigbeeRangeExtender.h" diff --git a/libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp b/libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp new file mode 100644 index 00000000000..b29e926c201 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp @@ -0,0 +1,15 @@ +#include "ZigbeeRangeExtender.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +ZigbeeRangeExtender::ZigbeeRangeExtender(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_RANGE_EXTENDER_DEVICE_ID; + + _cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(_cluster_list, esp_zb_basic_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(_cluster_list, esp_zb_identify_cluster_create(NULL), 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_CLIENT_ROLE); + + _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_RANGE_EXTENDER_DEVICE_ID, .app_device_version = 0}; +} + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeRangeExtender.h b/libraries/Zigbee/src/ep/ZigbeeRangeExtender.h new file mode 100644 index 00000000000..7441f48ea7a --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeRangeExtender.h @@ -0,0 +1,18 @@ +/* Class of Zigbee Range Extender 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" + +class ZigbeeRangeExtender : public ZigbeeEP { +public: + ZigbeeRangeExtender(uint8_t endpoint); + ~ZigbeeRangeExtender() {} +}; + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED From 978b441cd4f22d1be8fda760bfe81da06930ba8e Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 19 Feb 2025 18:32:06 -0300 Subject: [PATCH 013/290] test(wokwi): Add I2C Master test and enable GPIO and PSRAM tests (#10848) * test(wokwi): Enable PSRAM test * fix(tests): Add missing diagram for ESP32-P4 * test(wokwi): Enable GPIO test * test(wokwi): Add I2C master test * fix(tests): Add missing requirement and improve logging * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .github/scripts/tests_run.sh | 8 +- tests/requirements.txt | 1 + tests/validation/gpio/ci.json | 3 +- tests/validation/gpio/diagram.esp32p4.json | 28 ++ tests/validation/i2c_master/ci.json | 9 + .../validation/i2c_master/diagram.esp32.json | 24 ++ .../i2c_master/diagram.esp32c3.json | 25 ++ .../i2c_master/diagram.esp32c6.json | 26 ++ .../i2c_master/diagram.esp32h2.json | 24 ++ .../i2c_master/diagram.esp32p4.json | 24 ++ .../i2c_master/diagram.esp32s2.json | 24 ++ .../i2c_master/diagram.esp32s3.json | 24 ++ tests/validation/i2c_master/i2c_master.ino | 271 ++++++++++++++++++ .../validation/i2c_master/test_i2c_master.py | 2 + tests/validation/psram/ci.json | 3 +- 15 files changed, 488 insertions(+), 8 deletions(-) create mode 100644 tests/validation/gpio/diagram.esp32p4.json create mode 100644 tests/validation/i2c_master/ci.json create mode 100644 tests/validation/i2c_master/diagram.esp32.json create mode 100644 tests/validation/i2c_master/diagram.esp32c3.json create mode 100644 tests/validation/i2c_master/diagram.esp32c6.json create mode 100644 tests/validation/i2c_master/diagram.esp32h2.json create mode 100644 tests/validation/i2c_master/diagram.esp32p4.json create mode 100644 tests/validation/i2c_master/diagram.esp32s2.json create mode 100644 tests/validation/i2c_master/diagram.esp32s3.json create mode 100644 tests/validation/i2c_master/i2c_master.ino create mode 100644 tests/validation/i2c_master/test_i2c_master.py diff --git a/.github/scripts/tests_run.sh b/.github/scripts/tests_run.sh index 513fd16b371..8cb21ee519b 100755 --- a/.github/scripts/tests_run.sh +++ b/.github/scripts/tests_run.sh @@ -48,10 +48,10 @@ function run_test { return 0 fi - local right_target - right_target=$(grep -E "^CONFIG_IDF_TARGET=\"$target\"$" "$sdkconfig_path") - if [ -z "$right_target" ]; then - printf "\033[91mError: Sketch %s compiled for different target\n\033[0m\n" "$sketchname" + local compiled_target + compiled_target=$(grep -E "CONFIG_IDF_TARGET=" "$sdkconfig_path" | cut -d'"' -f2) + if [ "$compiled_target" != "$target" ]; then + printf "\033[91mError: Sketch %s compiled for %s, expected %s\033[0m\n" "$sketchname" "$compiled_target" "$target" printf "\n\n\n" return 1 fi diff --git a/tests/requirements.txt b/tests/requirements.txt index c98c032a3ae..b2bae3b86d0 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -5,3 +5,4 @@ pytest-embedded-serial-esp==1.12.0 pytest-embedded-arduino==1.12.0 pytest-embedded-wokwi==1.12.0 pytest-embedded-qemu==1.12.0 +esptool==4.8.1 diff --git a/tests/validation/gpio/ci.json b/tests/validation/gpio/ci.json index f03ec83b39d..7bc6a6ed163 100644 --- a/tests/validation/gpio/ci.json +++ b/tests/validation/gpio/ci.json @@ -1,7 +1,6 @@ { "platforms": { "hardware": false, - "qemu": false, - "wokwi": false + "qemu": false } } diff --git a/tests/validation/gpio/diagram.esp32p4.json b/tests/validation/gpio/diagram.esp32p4.json new file mode 100644 index 00000000000..ffb0cde2775 --- /dev/null +++ b/tests/validation/gpio/diagram.esp32p4.json @@ -0,0 +1,28 @@ +{ + "version": 1, + "author": "lucasssvaz", + "editor": "wokwi", + "parts": [ + { + "type": "board-esp32-p4-function-ev", + "id": "esp32", + "top": -66.32, + "left": -277.63, + "attrs": {} + }, + { + "type": "wokwi-pushbutton", + "id": "btn1", + "top": -128.2, + "left": -19.2, + "attrs": { "color": "green", "bounce": "1" } + } + ], + "connections": [ + [ "esp32:38", "$serialMonitor:TX", "", [] ], + [ "esp32:37", "$serialMonitor:RX", "", [] ], + [ "btn1:2.r", "esp32:GND.3", "black", [ "h19.4", "v29" ] ], + [ "esp32:0", "btn1:1.l", "blue", [ "h-48", "v-67.2" ] ] + ], + "dependencies": {} +} diff --git a/tests/validation/i2c_master/ci.json b/tests/validation/i2c_master/ci.json new file mode 100644 index 00000000000..2b8792cd131 --- /dev/null +++ b/tests/validation/i2c_master/ci.json @@ -0,0 +1,9 @@ +{ + "platforms": { + "hardware": false, + "qemu": false + }, + "requires": [ + "CONFIG_SOC_I2C_SUPPORTED=y" + ] +} diff --git a/tests/validation/i2c_master/diagram.esp32.json b/tests/validation/i2c_master/diagram.esp32.json new file mode 100644 index 00000000000..28e5d2e9c23 --- /dev/null +++ b/tests/validation/i2c_master/diagram.esp32.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "author": "lucasssvaz", + "editor": "wokwi", + "parts": [ + { + "type": "board-esp32-devkit-c-v4", + "id": "esp32", + "top": -57.6, + "left": -177.56, + "attrs": {} + }, + { "type": "wokwi-ds1307", "id": "rtc1", "top": -43.8, "left": -19.1, "attrs": {} } + ], + "connections": [ + [ "esp32:RX", "$serialMonitor:TX", "", [] ], + [ "esp32:TX", "$serialMonitor:RX", "", [] ], + [ "esp32:22", "rtc1:SCL", "green", [ "h38.4", "v-9.6" ] ], + [ "esp32:21", "rtc1:SDA", "blue", [ "h48", "v-28.8", "h19.2" ] ], + [ "esp32:GND.2", "rtc1:GND", "black", [ "v0" ] ], + [ "rtc1:5V", "esp32:5V", "red", [ "h-28.8", "v-67.6", "h-172.8", "v230.4" ] ] + ], + "dependencies": {} +} diff --git a/tests/validation/i2c_master/diagram.esp32c3.json b/tests/validation/i2c_master/diagram.esp32c3.json new file mode 100644 index 00000000000..a7471ec3ca1 --- /dev/null +++ b/tests/validation/i2c_master/diagram.esp32c3.json @@ -0,0 +1,25 @@ +{ + "version": 1, + "author": "lucasssvaz", + "editor": "wokwi", + "parts": [ + { + "type": "board-esp32-c3-devkitm-1", + "id": "esp32", + "top": -57.6, + "left": -177.56, + "attrs": {} + }, + { "type": "wokwi-ds1307", "id": "rtc1", "top": -43.8, "left": -19.1, "attrs": {} } + ], + "connections": [ + [ "esp32:RX", "$serialMonitor:TX", "", [] ], + [ "esp32:TX", "$serialMonitor:RX", "", [] ], + [ "rtc1:5V", "esp32:5V", "red", [ "h-28.8", "v-67.6", "h-172.8", "v230.4" ] ], + [ "esp32:5V.1", "rtc1:5V", "red", [ "h-18.22", "v-144.3", "h153.6", "v48" ] ], + [ "esp32:GND.10", "rtc1:GND", "black", [ "h56.16", "v9.3" ] ], + [ "esp32:8", "rtc1:SDA", "green", [ "h17.76", "v-19.5" ] ], + [ "esp32:9", "rtc1:SCL", "blue", [ "h0" ] ] + ], + "dependencies": {} +} diff --git a/tests/validation/i2c_master/diagram.esp32c6.json b/tests/validation/i2c_master/diagram.esp32c6.json new file mode 100644 index 00000000000..9c759682ae5 --- /dev/null +++ b/tests/validation/i2c_master/diagram.esp32c6.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "author": "lucasssvaz", + "editor": "wokwi", + "parts": [ + { + "type": "board-esp32-c6-devkitc-1", + "id": "esp32", + "top": -57.6, + "left": -177.56, + "attrs": {} + }, + { "type": "wokwi-ds1307", "id": "rtc1", "top": -43.8, "left": -19.1, "attrs": {} } + ], + "connections": [ + [ "esp32:RX", "$serialMonitor:TX", "", [] ], + [ "esp32:TX", "$serialMonitor:RX", "", [] ], + [ "rtc1:5V", "esp32:5V", "red", [ "h-28.8", "v-67.6", "h-172.8", "v230.4" ] ], + [ "esp32:5V.1", "rtc1:5V", "red", [ "h-18.22", "v-144.3", "h153.6", "v48" ] ], + [ "esp32:GND.10", "rtc1:GND", "black", [ "h56.16", "v9.3" ] ], + [ "esp32:23", "rtc1:SDA", "green", [ "h17.38", "v-23.51" ] ], + [ "esp32:GND.4", "rtc1:GND", "black", [ "h55.78", "v-4.31" ] ], + [ "esp32:22", "rtc1:SCL", "blue", [ "h26.98", "v-23.51" ] ] + ], + "dependencies": {} +} diff --git a/tests/validation/i2c_master/diagram.esp32h2.json b/tests/validation/i2c_master/diagram.esp32h2.json new file mode 100644 index 00000000000..d2a2acfecd7 --- /dev/null +++ b/tests/validation/i2c_master/diagram.esp32h2.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "author": "lucasssvaz", + "editor": "wokwi", + "parts": [ + { + "type": "board-esp32-h2-devkitm-1", + "id": "esp32", + "top": -57.6, + "left": -177.56, + "attrs": {} + }, + { "type": "wokwi-ds1307", "id": "rtc1", "top": -43.8, "left": -19.1, "attrs": {} } + ], + "connections": [ + [ "esp32:RX", "$serialMonitor:TX", "", [] ], + [ "esp32:TX", "$serialMonitor:RX", "", [] ], + [ "esp32:GND.6", "rtc1:GND", "black", [ "h0" ] ], + [ "esp32:5V", "rtc1:5V", "red", [ "h-29.14", "v-160.97", "h172.8", "v48" ] ], + [ "esp32:12", "rtc1:SDA", "green", [ "h36.58", "v-36.17" ] ], + [ "esp32:22", "rtc1:SCL", "blue", [ "v-7.37", "h46.18", "v-38.4" ] ] + ], + "dependencies": {} +} diff --git a/tests/validation/i2c_master/diagram.esp32p4.json b/tests/validation/i2c_master/diagram.esp32p4.json new file mode 100644 index 00000000000..ab250c2aafd --- /dev/null +++ b/tests/validation/i2c_master/diagram.esp32p4.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "author": "lucasssvaz", + "editor": "wokwi", + "parts": [ + { + "type": "board-esp32-p4-function-ev", + "id": "esp32", + "top": -57.6, + "left": -177.56, + "attrs": {} + }, + { "type": "wokwi-ds1307", "id": "rtc1", "top": -197.4, "left": 57.7, "attrs": {} } + ], + "connections": [ + [ "esp32:38", "$serialMonitor:TX", "", [] ], + [ "esp32:37", "$serialMonitor:RX", "", [] ], + [ "esp32:5V.1", "rtc1:5V", "red", [ "v0" ] ], + [ "esp32:GND.1", "rtc1:GND", "black", [ "v-133.52", "h5.53" ] ], + [ "esp32:7", "rtc1:SDA", "green", [ "v0" ] ], + [ "esp32:8", "rtc1:SCL", "blue", [ "h15.13", "v-114.12" ] ] + ], + "dependencies": {} +} diff --git a/tests/validation/i2c_master/diagram.esp32s2.json b/tests/validation/i2c_master/diagram.esp32s2.json new file mode 100644 index 00000000000..c34a176bd7e --- /dev/null +++ b/tests/validation/i2c_master/diagram.esp32s2.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "author": "lucasssvaz", + "editor": "wokwi", + "parts": [ + { + "type": "board-esp32-s2-devkitm-1", + "id": "esp32", + "top": -57.6, + "left": -177.56, + "attrs": {} + }, + { "type": "wokwi-ds1307", "id": "rtc1", "top": -43.8, "left": -19.1, "attrs": {} } + ], + "connections": [ + [ "esp32:RX", "$serialMonitor:TX", "", [] ], + [ "esp32:TX", "$serialMonitor:RX", "", [] ], + [ "esp32:GND.2", "rtc1:GND", "black", [ "v0" ] ], + [ "rtc1:5V", "esp32:5V", "red", [ "h-28.8", "v-67.6", "h-172.8", "v230.4" ] ], + [ "esp32:8", "rtc1:SDA", "green", [ "h-19.47", "v-119.51", "h144", "v57.6" ] ], + [ "esp32:9", "rtc1:SCL", "blue", [ "h-29.07", "v-138.71", "h144", "v76.8" ] ] + ], + "dependencies": {} +} diff --git a/tests/validation/i2c_master/diagram.esp32s3.json b/tests/validation/i2c_master/diagram.esp32s3.json new file mode 100644 index 00000000000..6d168fb42e6 --- /dev/null +++ b/tests/validation/i2c_master/diagram.esp32s3.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "author": "lucasssvaz", + "editor": "wokwi", + "parts": [ + { + "type": "board-esp32-s3-devkitc-1", + "id": "esp32", + "top": -57.6, + "left": -177.56, + "attrs": {} + }, + { "type": "wokwi-ds1307", "id": "rtc1", "top": -43.8, "left": -19.1, "attrs": {} } + ], + "connections": [ + [ "esp32:RX", "$serialMonitor:TX", "", [] ], + [ "esp32:TX", "$serialMonitor:RX", "", [] ], + [ "esp32:GND.2", "rtc1:GND", "black", [ "v0" ] ], + [ "rtc1:5V", "esp32:5V", "red", [ "h-28.8", "v-67.6", "h-172.8", "v230.4" ] ], + [ "esp32:8", "rtc1:SDA", "green", [ "h-19.47", "v-119.51", "h144", "v32.93", "h38.35" ] ], + [ "esp32:9", "rtc1:SCL", "blue", [ "h-29.07", "v-138.71", "h144", "v32.93", "h47.95" ] ] + ], + "dependencies": {} +} diff --git a/tests/validation/i2c_master/i2c_master.ino b/tests/validation/i2c_master/i2c_master.ino new file mode 100644 index 00000000000..3c7b2d9824a --- /dev/null +++ b/tests/validation/i2c_master/i2c_master.ino @@ -0,0 +1,271 @@ +/* + I2C Master Test for +*/ + +#include +#include +#include + +/* DS1307 functions */ + +const uint8_t DS1307_ADDR = 0x68; +const uint8_t start_sec = 1; +const uint8_t start_min = 2; +const uint8_t start_hour = 3; +const uint8_t start_day = 4; +const uint8_t start_month = 5; +const uint16_t start_year = 2020; + +static uint8_t read_sec = 0; +static uint8_t read_min = 0; +static uint8_t read_hour = 0; +static uint8_t read_day = 0; +static uint8_t read_month = 0; +static uint16_t read_year = 0; +static int peek_data = -1; + +const auto BCD2DEC = [](uint8_t num) -> uint8_t { + return ((num / 16 * 10) + (num % 16)); +}; + +const auto DEC2BCD = [](uint8_t num) -> uint8_t { + return ((num / 10 * 16) + (num % 10)); +}; + +void reset_read_values() { + read_sec = 0; + read_min = 0; + read_hour = 0; + read_day = 0; + read_month = 0; + read_year = 0; +} + +void ds1307_start(void) { + uint8_t sec; + + //Get seconds + Wire.beginTransmission(DS1307_ADDR); + Wire.write(0x00); + Wire.endTransmission(); + Wire.requestFrom(DS1307_ADDR, 1); + sec = Wire.read() & 0x7F; //Seconds without halt bit + + //Set seconds and start clock + Wire.beginTransmission(DS1307_ADDR); + Wire.write(0x00); + Wire.write(sec); + Wire.endTransmission(); +} + +void ds1307_stop(void) { + uint8_t sec; + + //Get seconds + Wire.beginTransmission(DS1307_ADDR); + Wire.write(0x00); + Wire.endTransmission(); + Wire.requestFrom(DS1307_ADDR, 1); + sec = Wire.read() | 0x80; //Seconds with halt bit + + //Set seconds and halt clock + Wire.beginTransmission(DS1307_ADDR); + Wire.write(0x00); + Wire.write(sec); + Wire.endTransmission(); +} + +void ds1307_get_time(uint8_t *sec, uint8_t *min, uint8_t *hour, uint8_t *day, uint8_t *month, uint16_t *year) { + //Get time + Wire.beginTransmission(DS1307_ADDR); + Wire.write(0x00); + Wire.endTransmission(); + Wire.requestFrom(DS1307_ADDR, 7); + + TEST_ASSERT_EQUAL(7, Wire.available()); + + if (peek_data == -1 && Wire.peek() != -1) { + peek_data = Wire.peek(); + } + + *sec = BCD2DEC(Wire.read() & 0x7F); //Seconds without halt bit + *min = BCD2DEC(Wire.read()); + *hour = BCD2DEC(Wire.read() & 0x3F); + Wire.read(); //Ignore day of week + *day = BCD2DEC(Wire.read()); + *month = BCD2DEC(Wire.read()); + *year = BCD2DEC(Wire.read()) + 2000; +} + +void ds1307_set_time(uint8_t sec, uint8_t min, uint8_t hour, uint8_t day, uint8_t month, uint16_t year) { + Wire.beginTransmission(DS1307_ADDR); + Wire.write(0x00); + Wire.write(DEC2BCD(sec)); + Wire.write(DEC2BCD(min)); + Wire.write(DEC2BCD(hour)); + Wire.write(DEC2BCD(0)); //Ignore day of week + Wire.write(DEC2BCD(day)); + Wire.write(DEC2BCD(month)); + Wire.write(DEC2BCD(year - 2000)); + Wire.endTransmission(); +} + +/* Unity functions */ + +// This function is automatically called by unity before each test is run +void setUp(void) { + reset_read_values(); + Wire.begin(); +} + +// This function is automatically called by unity after each test is run +void tearDown(void) { + //Reset time + ds1307_set_time(start_sec, start_min, start_hour, start_day, start_month, start_year); + + Wire.end(); +} + +void rtc_set_time() { + //Set time + ds1307_set_time(start_sec, start_min, start_hour, start_day, start_month, start_year); + + //Get time + ds1307_get_time(&read_sec, &read_min, &read_hour, &read_day, &read_month, &read_year); + + //Check time + TEST_ASSERT_EQUAL(start_sec, read_sec); + TEST_ASSERT_EQUAL(start_min, read_min); + TEST_ASSERT_EQUAL(start_hour, read_hour); + TEST_ASSERT_EQUAL(start_day, read_day); + TEST_ASSERT_EQUAL(start_month, read_month); + TEST_ASSERT_EQUAL(start_year, read_year); +} + +void rtc_run_clock() { + uint8_t old_sec = 0; + + //Run clock for 5 seconds + ds1307_start(); + delay(5000); + ds1307_stop(); + + //Get time + ds1307_get_time(&read_sec, &read_min, &read_hour, &read_day, &read_month, &read_year); + + //Check time + TEST_ASSERT_UINT8_WITHIN(2, start_sec + 5, read_sec); + TEST_ASSERT_EQUAL(start_min, read_min); + TEST_ASSERT_EQUAL(start_hour, read_hour); + TEST_ASSERT_EQUAL(start_day, read_day); + TEST_ASSERT_EQUAL(start_month, read_month); + TEST_ASSERT_EQUAL(start_year, read_year); + + old_sec = read_sec; + reset_read_values(); + + //Get time again to check that clock is stopped + delay(2000); + ds1307_get_time(&read_sec, &read_min, &read_hour, &read_day, &read_month, &read_year); + + //Check time + TEST_ASSERT_EQUAL(old_sec, read_sec); + TEST_ASSERT_EQUAL(start_min, read_min); + TEST_ASSERT_EQUAL(start_hour, read_hour); + TEST_ASSERT_EQUAL(start_day, read_day); + TEST_ASSERT_EQUAL(start_month, read_month); + TEST_ASSERT_EQUAL(start_year, read_year); +} + +void change_clock() { + //Get time + ds1307_get_time(&read_sec, &read_min, &read_hour, &read_day, &read_month, &read_year); + + //Check time + TEST_ASSERT_EQUAL(start_sec, read_sec); + TEST_ASSERT_EQUAL(start_min, read_min); + TEST_ASSERT_EQUAL(start_hour, read_hour); + TEST_ASSERT_EQUAL(start_day, read_day); + TEST_ASSERT_EQUAL(start_month, read_month); + TEST_ASSERT_EQUAL(start_year, read_year); + + Wire.setClock(400000); + reset_read_values(); + + TEST_ASSERT_EQUAL(400000, Wire.getClock()); + + //Get time + ds1307_get_time(&read_sec, &read_min, &read_hour, &read_day, &read_month, &read_year); + + //Check time + TEST_ASSERT_EQUAL(start_sec, read_sec); + TEST_ASSERT_EQUAL(start_min, read_min); + TEST_ASSERT_EQUAL(start_hour, read_hour); + TEST_ASSERT_EQUAL(start_day, read_day); + TEST_ASSERT_EQUAL(start_month, read_month); + TEST_ASSERT_EQUAL(start_year, read_year); +} + +void swap_pins() { + Wire.setPins(SCL, SDA); + Wire.begin(); + //Set time + ds1307_set_time(start_sec, start_min, start_hour, start_day, start_month, start_year); + + //Get time + ds1307_get_time(&read_sec, &read_min, &read_hour, &read_day, &read_month, &read_year); + + //Check time + TEST_ASSERT_EQUAL(start_sec, read_sec); + TEST_ASSERT_EQUAL(start_min, read_min); + TEST_ASSERT_EQUAL(start_hour, read_hour); + TEST_ASSERT_EQUAL(start_day, read_day); + TEST_ASSERT_EQUAL(start_month, read_month); + TEST_ASSERT_EQUAL(start_year, read_year); + + Wire.setPins(SDA, SCL); +} + +void test_api() { + int integer_ret; + + // Set Buffer Size + integer_ret = Wire.setBufferSize(32); + TEST_ASSERT_EQUAL(32, integer_ret); + integer_ret = Wire.setBufferSize(I2C_BUFFER_LENGTH); + TEST_ASSERT_EQUAL(I2C_BUFFER_LENGTH, integer_ret); + + // Set TimeOut + Wire.setTimeOut(100); + TEST_ASSERT_EQUAL(100, Wire.getTimeOut()); + + // Check if buffer can be peeked + TEST_ASSERT_GREATER_THAN(-1, peek_data); + + Wire.flush(); +} + +/* Main */ + +void setup() { + Serial.begin(115200); + while (!Serial) { + delay(10); + } + + log_d("Starting I2C Master"); + Wire.begin(); + + log_d("Starting tests"); + UNITY_BEGIN(); + RUN_TEST(rtc_set_time); + RUN_TEST(rtc_run_clock); + RUN_TEST(change_clock); + RUN_TEST(swap_pins); + RUN_TEST(test_api); + UNITY_END(); +} + +void loop() { + vTaskDelete(NULL); +} diff --git a/tests/validation/i2c_master/test_i2c_master.py b/tests/validation/i2c_master/test_i2c_master.py new file mode 100644 index 00000000000..da5f790c0f8 --- /dev/null +++ b/tests/validation/i2c_master/test_i2c_master.py @@ -0,0 +1,2 @@ +def test_i2c_master(dut): + dut.expect_unity_test_output(timeout=240) diff --git a/tests/validation/psram/ci.json b/tests/validation/psram/ci.json index 341df103671..999d3be953e 100644 --- a/tests/validation/psram/ci.json +++ b/tests/validation/psram/ci.json @@ -1,7 +1,6 @@ { "platforms": { - "qemu": false, - "wokwi": false + "qemu": false }, "requires": [ "CONFIG_SPIRAM=y" From cd95e4055bc4cc9df2e6e2bccdcdf9a1361b86d4 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 19 Feb 2025 19:52:01 -0300 Subject: [PATCH 014/290] ci(report): Add runtime tests report (#10764) --- .github/scripts/tests_run.sh | 10 ++++---- .github/workflows/tests_results.yml | 37 +++++++++++++++++++++++++---- .github/workflows/tests_wokwi.yml | 4 ++++ README.md | 2 +- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/.github/scripts/tests_run.sh b/.github/scripts/tests_run.sh index 8cb21ee519b..274666c8a44 100755 --- a/.github/scripts/tests_run.sh +++ b/.github/scripts/tests_run.sh @@ -11,9 +11,11 @@ function run_test { local error=0 local sdkconfig_path local extra_args + local test_type sketchdir=$(dirname "$sketch") sketchname=$(basename "$sketchdir") + test_type=$(basename "$(dirname "$sketchdir")") if [ "$options" -eq 0 ] && [ -f "$sketchdir"/ci.json ]; then len=$(jq -r --arg target "$target" '.fqbn[$target] | length' "$sketchdir"/ci.json) @@ -113,14 +115,14 @@ function run_test { rm "$sketchdir"/diagram.json 2>/dev/null || true result=0 - 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 "\033[95mpytest \"%s/test_%s.py\" --build-dir \"%s\" --junit-xml=\"%s\" -o junit_suite_name=%s_%s_%s_%s%s %s\033[0m\n" "$sketchdir" "$sketchname" "$build_dir" "$report_file" "$test_type" "$platform" "$target" "$sketchname" "$i" "${extra_args[*]@Q}" + bash -c "set +e; pytest \"$sketchdir/test_$sketchname.py\" --build-dir \"$build_dir\" --junit-xml=\"$report_file\" -o junit_suite_name=${test_type}_${platform}_${target}_${sketchname}${i} ${extra_args[*]@Q}; exit \$?" || result=$? printf "\n" if [ $result -ne 0 ]; then result=0 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 "\033[95mpytest \"%s/test_%s.py\" --build-dir \"%s\" --junit-xml=\"%s\" -o junit_suite_name=%s_%s_%s_%s%s %s\033[0m\n" "$sketchdir" "$sketchname" "$build_dir" "$report_file" "$test_type" "$platform" "$target" "$sketchname" "$i" "${extra_args[*]@Q}" + bash -c "set +e; pytest \"$sketchdir/test_$sketchname.py\" --build-dir \"$build_dir\" --junit-xml=\"$report_file\" -o junit_suite_name=${test_type}_${platform}_${target}_${sketchname}${i} ${extra_args[*]@Q}; exit \$?" || result=$? printf "\n" if [ $result -ne 0 ]; then printf "\033[91mFailed test: %s -- Config: %s\033[0m\n\n" "$sketchname" "$i" diff --git a/.github/workflows/tests_results.yml b/.github/workflows/tests_results.yml index 947de64ece5..9e213fad14e 100644 --- a/.github/workflows/tests_results.yml +++ b/.github/workflows/tests_results.yml @@ -41,6 +41,7 @@ jobs: original_sha=$(cat ./artifacts/parent-artifacts/sha.txt) original_ref=$(cat ./artifacts/parent-artifacts/ref.txt) original_conclusion=$(cat ./artifacts/parent-artifacts/conclusion.txt) + original_run_id=$(cat ./artifacts/parent-artifacts/run_id.txt) # Sanitize the values to avoid security issues @@ -59,17 +60,27 @@ jobs: # Conclusion: Allow alphabetical characters and underscores original_conclusion=$(echo "$original_conclusion" | tr -cd '[:alpha:]_') + # Run ID: Allow numeric characters + original_run_id=$(echo "$original_run_id" | tr -cd '[:digit:]') + echo "original_event=$original_event" >> $GITHUB_ENV echo "original_action=$original_action" >> $GITHUB_ENV echo "original_sha=$original_sha" >> $GITHUB_ENV echo "original_ref=$original_ref" >> $GITHUB_ENV echo "original_conclusion=$original_conclusion" >> $GITHUB_ENV + echo "original_run_id=$original_run_id" >> $GITHUB_ENV echo "original_event = $original_event" echo "original_action = $original_action" echo "original_sha = $original_sha" echo "original_ref = $original_ref" echo "original_conclusion = $original_conclusion" + echo "original_run_id = $original_run_id" + + - name: Print links to other runs + run: | + echo "Build, Hardware and QEMU tests: https://github.com/${{ github.repository }}/actions/runs/${{ env.original_run_id }}" + echo "Wokwi tests: https://github.com/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }}" - name: Publish Unit Test Results uses: EnricoMi/publish-unit-test-result-action@v2 @@ -80,6 +91,17 @@ jobs: files: ./artifacts/**/*.xml action_fail: true compare_to_earlier_commit: false + json_file: ./unity_results.json + json_suite_details: true + + - name: Upload JSON + uses: actions/upload-artifact@v4 + if: ${{ always() }} + with: + name: unity_results + overwrite: true + path: | + ./unity_results.json - name: Fail if tests failed if: ${{ env.original_conclusion == 'failure' || env.original_conclusion == 'timed_out' || github.event.workflow_run.conclusion == 'failure' || github.event.workflow_run.conclusion == 'timed_out' }} @@ -138,11 +160,18 @@ jobs: })).data; core.info(`${name} is ${state}`); - - name: Create output folder + - name: Generate report if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled + env: + REPORT_FILE: ./runtime-tests-results/RUNTIME_TESTS_REPORT.md + WOKWI_RUN_ID: ${{ github.event.workflow_run.id }} + BUILD_RUN_ID: ${{ env.original_run_id }} + IS_FAILING: ${{ env.original_conclusion == 'failure' || env.original_conclusion == 'timed_out' || github.event.workflow_run.conclusion == 'failure' || github.event.workflow_run.conclusion == 'timed_out' || job.status == 'failure' }} run: | - rm -rf artifacts - mkdir -p runtime-tests-results + rm -rf artifacts $REPORT_FILE + mv -f ./unity_results.json ./runtime-tests-results/unity_results.json + touch $REPORT_FILE + python3 ./runtime-tests-results/table_generator.py ./runtime-tests-results/unity_results.json >> $REPORT_FILE - name: Generate badge if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled @@ -161,6 +190,6 @@ jobs: git config user.email "41898282+github-actions[bot]@users.noreply.github.com" if [[ `git status --porcelain` ]]; then git add --all - git commit -m "Updated runtime tests badge" + git commit -m "Updated runtime tests report" git push origin HEAD:gh-pages fi diff --git a/.github/workflows/tests_wokwi.yml b/.github/workflows/tests_wokwi.yml index f5eb2efcad2..c254d5fa153 100644 --- a/.github/workflows/tests_wokwi.yml +++ b/.github/workflows/tests_wokwi.yml @@ -109,6 +109,10 @@ jobs: printf "\nAction = " cat artifacts/action.txt + printf "${{ github.event.workflow_run.id }}" >> artifacts/run_id.txt + printf "\nRun ID = " + cat artifacts/run_id.txt + if [ -z "$ref" ] || [ "$ref" == "null" ]; then echo "Failed to get PR number or ref" exit 1 diff --git a/README.md b/README.md index 0a9a6d0440c..9d300b25c54 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![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) +[![Runtime Tests](https://github.com/espressif/arduino-esp32/blob/gh-pages/runtime-tests-results/badge.svg)](https://github.com/espressif/arduino-esp32/blob/gh-pages/runtime-tests-results/RUNTIME_TESTS_REPORT.md) ### 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) From 9a783a5d2cce0b4abb3e0583e7df7af905f89a87 Mon Sep 17 00:00:00 2001 From: pwclay <57820386+pwclay@users.noreply.github.com> Date: Thu, 20 Feb 2025 21:59:43 +1300 Subject: [PATCH 015/290] feat(zigbee): Add Analog endpoint device (input, output, value clusters) (#10950) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add analog sensor modules * feat(zigbee): Add analog value, input and output support * fix(zigbee): add missing functiong to header file * fix(zigbee): Update log messages * ci(pre-commit): Apply automatic fixes * fix(example): Fix comment typo --------- Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com> Co-authored-by: Me No Dev Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- CMakeLists.txt | 1 + .../Zigbee_Analog_Input_Output/README.md | 72 ++++++++++ .../Zigbee_Analog_Input_Output.ino | 119 +++++++++++++++++ .../Zigbee_Analog_Input_Output/ci.json | 6 + libraries/Zigbee/src/Zigbee.h | 1 + libraries/Zigbee/src/ep/ZigbeeAnalog.cpp | 124 ++++++++++++++++++ libraries/Zigbee/src/ep/ZigbeeAnalog.h | 76 +++++++++++ libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp | 3 +- 8 files changed, 401 insertions(+), 1 deletion(-) create mode 100644 libraries/Zigbee/examples/Zigbee_Analog_Input_Output/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Analog_Input_Output/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeeAnalog.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeAnalog.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 7436eb1833c..97ad068eb48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -295,6 +295,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp + libraries/Zigbee/src/ep/ZigbeeAnalog.cpp libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp ) diff --git a/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/README.md b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/README.md new file mode 100644 index 00000000000..d62941755c7 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/README.md @@ -0,0 +1,72 @@ +# Arduino-ESP32 Zigbee Analog Input Output Example + +This example shows how to configure the Zigbee end device and use it as a Home Automation (HA) analog input/output device. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## Analog Sensor Functions + + * After this board first starts up, it would be configured locally to report an analog input 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 value to the network. + +## Hardware Required + +* A USB cable for power supply and programming + +### Configure the Project + +Set the ADC GPIO by changing the `analogPin` variable. By default, it's the pin `A0`. +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_Analog_Input_Output/Zigbee_Analog_Input_Output.ino b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino new file mode 100644 index 00000000000..e31407cc8be --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino @@ -0,0 +1,119 @@ +// 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 analog input / output device. + * + * The example demonstrates how to use Zigbee library to create a end device analog device. + * + * 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/) + * Modified by Pat Clay + */ + +#ifndef ZIGBEE_MODE_ED +#error "Zigbee end device mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +/* Zigbee analog device configuration */ +#define ANALOG_DEVICE_ENDPOINT_NUMBER 1 + +uint8_t analogPin = A0; +uint8_t button = BOOT_PIN; + +ZigbeeAnalog zbAnalogDevice = ZigbeeAnalog(ANALOG_DEVICE_ENDPOINT_NUMBER); + +void onAnalogOutputChange(float analog_output) { + Serial.printf("Received analog output change: %.1f\r\n", analog_output); +} + +void setup() { + Serial.begin(115200); + Serial.println("Starting..."); + + // Init button switch + pinMode(button, INPUT_PULLUP); + + // Set analog resolution to 10 bits + analogReadResolution(10); + + // Optional: set Zigbee device name and model + zbAnalogDevice.setManufacturerAndModel("Espressif", "ZigbeeAnalogDevice"); + + // Add analog clusters to Zigbee Analog according your needs + zbAnalogDevice.addAnalogInput(); + zbAnalogDevice.addAnalogOutput(); + + // If analog output cluster is added, set callback function for analog output change + zbAnalogDevice.onAnalogOutputChange(onAnalogOutputChange); + + // Add endpoints to Zigbee Core + Zigbee.addEndpoint(&zbAnalogDevice); + + 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("Connected"); + + // Optional: Add reporting for analog input + zbAnalogDevice.setAnalogInputReporting(0, 30, 10); // report every 30 seconds if value changes by 10 +} + +void loop() { + static uint32_t timeCounter = 0; + + // Read ADC value and update the analog value every 2s + if (!(timeCounter++ % 20)) { // delaying for 100ms x 20 = 2s + float analog = (float)analogRead(analogPin); + Serial.printf("Updating analog input to %.1f\r\n", analog); + zbAnalogDevice.setAnalogInput(analog); + + // Analog input supports reporting + zbAnalogDevice.reportAnalogInput(); + } + + // 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(); + } + } + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/ci.json b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/ci.json new file mode 100644 index 00000000000..7b7ccef8ed7 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/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 7353f661416..c8e7481e58f 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -15,6 +15,7 @@ #include "ep/ZigbeeTempSensor.h" #include "ep/ZigbeeThermostat.h" #include "ep/ZigbeePressureSensor.h" +#include "ep/ZigbeeAnalog.h" #include "ep/ZigbeeFlowSensor.h" #include "ep/ZigbeeOccupancySensor.h" #include "ep/ZigbeeCarbonDioxideSensor.h" diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp new file mode 100644 index 00000000000..25c199b345b --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp @@ -0,0 +1,124 @@ +#include "ZigbeeAnalog.h" +#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED + +esp_zb_cluster_list_t *zigbee_analog_clusters_create(zigbee_analog_cfg_t *analog_sensor) { + esp_zb_basic_cluster_cfg_t *basic_cfg = analog_sensor ? &(analog_sensor->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = analog_sensor ? &(analog_sensor->identify_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); + return cluster_list; +} + +ZigbeeAnalog::ZigbeeAnalog(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID; + + //Create custom analog sensor configuration + zigbee_analog_cfg_t analog_cfg = ZIGBEE_DEFAULT_ANALOG_CONFIG(); + _cluster_list = zigbee_analog_clusters_create(&analog_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 ZigbeeAnalog::addAnalogValue() { + esp_zb_cluster_list_add_analog_value_cluster(_cluster_list, esp_zb_analog_value_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + _analog_clusters |= ANALOG_VALUE; +} + +void ZigbeeAnalog::addAnalogInput() { + esp_zb_cluster_list_add_analog_input_cluster(_cluster_list, esp_zb_analog_input_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + _analog_clusters |= ANALOG_INPUT; +} + +void ZigbeeAnalog::addAnalogOutput() { + esp_zb_cluster_list_add_analog_output_cluster(_cluster_list, esp_zb_analog_output_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + _analog_clusters |= ANALOG_OUTPUT; +} + +//set attribute method -> method overridden in child class +void ZigbeeAnalog::zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) { + if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT) { + if (message->attribute.id == ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_PRESENT_VALUE_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_SINGLE) { + float analog_output = *(float *)message->attribute.data.value; + analogOutputChanged(analog_output); + } else { + log_w("Received message ignored. Attribute ID: %d not supported for Analog Output", message->attribute.id); + } + } else { + log_w("Received message ignored. Cluster ID: %d not supported for Analog endpoint", message->info.cluster); + } +} + +void ZigbeeAnalog::analogOutputChanged(float analog_output) { + if (_on_analog_output_change) { + _on_analog_output_change(analog_output); + } else { + log_w("No callback function set for analog output change"); + } +} + +void ZigbeeAnalog::setAnalogValue(float analog) { + if (!(_analog_clusters & ANALOG_VALUE)) { + log_e("Analog Value cluster not added"); + return; + } + // float zb_analog = analog; + log_d("Setting analog value to %.1f", analog); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_VALUE, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ANALOG_VALUE_PRESENT_VALUE_ID, &analog, false + ); + esp_zb_lock_release(); +} + +void ZigbeeAnalog::setAnalogInput(float analog) { + if (!(_analog_clusters & ANALOG_INPUT)) { + log_e("Analog Input cluster not added"); + return; + } + // float zb_analog = analog; + log_d("Setting analog input to %.1f", analog); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_INPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ANALOG_INPUT_PRESENT_VALUE_ID, &analog, false + ); + esp_zb_lock_release(); +} + +void ZigbeeAnalog::reportAnalogInput() { + /* 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_ANALOG_INPUT_PRESENT_VALUE_ID; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; + report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_ANALOG_INPUT; + 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("Analog Input report sent"); +} + +void ZigbeeAnalog::setAnalogInputReporting(uint16_t min_interval, uint16_t max_interval, float delta) { + 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.s32 = 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(); +} + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.h b/libraries/Zigbee/src/ep/ZigbeeAnalog.h new file mode 100644 index 00000000000..e3b22594324 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.h @@ -0,0 +1,76 @@ +/* Class of Zigbee Analog 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" + +// clang-format off +#define ZIGBEE_DEFAULT_ANALOG_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, \ + }, \ + } +// clang-format on + +//enum for bits set to check what analog cluster were added +enum zigbee_analog_clusters { + ANALOG_VALUE = 1, + ANALOG_INPUT = 2, + ANALOG_OUTPUT = 4 +}; + +typedef struct zigbee_analog_cfg_s { + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_analog_value_cluster_cfg_t analog_value_cfg; + esp_zb_analog_output_cluster_cfg_t analog_output_cfg; + esp_zb_analog_input_cluster_cfg_t analog_input_cfg; +} zigbee_analog_cfg_t; + +class ZigbeeAnalog : public ZigbeeEP { +public: + ZigbeeAnalog(uint8_t endpoint); + ~ZigbeeAnalog() {} + + // Add analog clusters + void addAnalogValue(); + void addAnalogInput(); + void addAnalogOutput(); + + // Use to set a cb function to be called on analog output change + void onAnalogOutputChange(void (*callback)(float analog)) { + _on_analog_output_change = callback; + } + + // Set the analog value / input + void setAnalogValue(float analog); + void setAnalogInput(float analog); + + // Report Analog Input + void reportAnalogInput(); + + // Set reporting for Analog Input + void setAnalogInputReporting(uint16_t min_interval, uint16_t max_interval, float delta); + +private: + void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override; + + void (*_on_analog_output_change)(float); + void analogOutputChanged(float analog_output); + + uint8_t _analog_clusters; +}; + +#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp index d419fb14adc..90df37b91f5 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp @@ -48,7 +48,8 @@ void ZigbeeTempSensor::setReporting(uint16_t min_interval, uint16_t max_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); + 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(); } From 003db9e4c0c352344b984ba1ac25f6a3f706dfe5 Mon Sep 17 00:00:00 2001 From: SooDragon <82627949+SooDragon@users.noreply.github.com> Date: Fri, 21 Feb 2025 19:27:11 +0900 Subject: [PATCH 016/290] Update pins_arduino.h (#11000) --- variants/Geekble_ESP32C3/pins_arduino.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/Geekble_ESP32C3/pins_arduino.h b/variants/Geekble_ESP32C3/pins_arduino.h index 4eec3aa2f68..660313ce849 100644 --- a/variants/Geekble_ESP32C3/pins_arduino.h +++ b/variants/Geekble_ESP32C3/pins_arduino.h @@ -27,6 +27,6 @@ static const uint8_t A1 = 1; static const uint8_t A2 = 2; static const uint8_t A3 = 3; static const uint8_t A4 = 4; -static const uint8_t A5 = 5; +//static const uint8_t A5 = 5; // ADC1 no longer supported #endif /* Pins_Arduino_h */ From 543a647f2c806e038a115230f9a0e0ef3b561de5 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Fri, 21 Feb 2025 23:47:01 -0300 Subject: [PATCH 017/290] ci(test): Fix PSRAM test --- tests/validation/psram/diagram.esp32s3.json | 24 +++++++++++++++++++++ tests/validation/psram/psram.ino | 16 +++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 tests/validation/psram/diagram.esp32s3.json diff --git a/tests/validation/psram/diagram.esp32s3.json b/tests/validation/psram/diagram.esp32s3.json new file mode 100644 index 00000000000..837ff1eed33 --- /dev/null +++ b/tests/validation/psram/diagram.esp32s3.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "author": "lucasssvaz", + "editor": "wokwi", + "parts": [ + { + "type": "board-esp32-s3-devkitc-1", + "id": "esp", + "attrs": { "psramType": "octal" } + } + ], + "connections": [ + [ + "esp:TX", + "$serialMonitor:RX", + "" + ], + [ + "esp:RX", + "$serialMonitor:TX", + "" + ] + ] +} diff --git a/tests/validation/psram/psram.ino b/tests/validation/psram/psram.ino index 1304fe85cc1..a53be84fd68 100644 --- a/tests/validation/psram/psram.ino +++ b/tests/validation/psram/psram.ino @@ -4,6 +4,12 @@ #define MAX_TEST_SIZE 512 * 1024 // 512KB void *buf = NULL; +uint32_t psram_size = 0; + +void psram_found(void) { + psram_size = ESP.getPsramSize(); + TEST_ASSERT_TRUE(psram_size > 0); +} void test_malloc_success(void) { buf = ps_malloc(MAX_TEST_SIZE); @@ -96,6 +102,13 @@ void setup() { } UNITY_BEGIN(); + RUN_TEST(psram_found); + + if (psram_size == 0) { + UNITY_END(); + return; + } + RUN_TEST(test_malloc_success); RUN_TEST(test_malloc_fail); RUN_TEST(test_calloc_success); @@ -104,7 +117,8 @@ void setup() { RUN_TEST(test_memset_all_zeroes); RUN_TEST(test_memset_all_ones); RUN_TEST(test_memset_alternating); - RUN_TEST(test_memset_random); + //This test is disabled because it takes too long to run on some wokwi boards + //RUN_TEST(test_memset_random); RUN_TEST(test_memcpy); UNITY_END(); } From 42bd7456ce17013f73110b219e9aa96da4b6306e Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Fri, 21 Feb 2025 23:54:52 -0300 Subject: [PATCH 018/290] ci(test): Fix GPIO test --- tests/validation/gpio/scenario.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/validation/gpio/scenario.yaml b/tests/validation/gpio/scenario.yaml index a915b546b49..957f58b2176 100644 --- a/tests/validation/gpio/scenario.yaml +++ b/tests/validation/gpio/scenario.yaml @@ -6,31 +6,31 @@ steps: - wait-serial: "Button test" # Need for 1s delay for scenario to run properly - - delay: 1000ms + - delay: 5000ms # Press once - set-control: part-id: btn1 control: pressed value: 1 - - delay: 200ms + - delay: 2000ms - set-control: part-id: btn1 control: pressed value: 0 - - delay: 300ms + - delay: 3000ms # Press 2nd time - set-control: part-id: btn1 control: pressed value: 1 - - delay: 200ms + - delay: 2000ms - set-control: part-id: btn1 control: pressed value: 0 - - delay: 300ms + - delay: 3000ms # Press for the 3rd time - set-control: From 988dbe29731e2a2d09db2ed642c06271afa93705 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Sat, 22 Feb 2025 01:27:17 -0300 Subject: [PATCH 019/290] ci(test): Skip some PSRAM tests in P4 --- tests/validation/psram/psram.ino | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/validation/psram/psram.ino b/tests/validation/psram/psram.ino index a53be84fd68..7bf7bc11c5d 100644 --- a/tests/validation/psram/psram.ino +++ b/tests/validation/psram/psram.ino @@ -117,9 +117,11 @@ void setup() { RUN_TEST(test_memset_all_zeroes); RUN_TEST(test_memset_all_ones); RUN_TEST(test_memset_alternating); - //This test is disabled because it takes too long to run on some wokwi boards - //RUN_TEST(test_memset_random); +#ifndef CONFIG_IDF_TARGET_ESP32P4 + // These tests are taking too long on ESP32-P4 in Wokwi + RUN_TEST(test_memset_random); RUN_TEST(test_memcpy); +#endif UNITY_END(); } From 39be694127034bb54f9c15828393d844fb3a59eb Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 25 Feb 2025 05:06:18 -0300 Subject: [PATCH 020/290] ci(runners): Bump runner images version (#10960) * ci(runners): Bump runner images version * ci(arm): Use github arm images --- .github/workflows/build_py_tools.yml | 12 ++++-------- .github/workflows/push.yml | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build_py_tools.yml b/.github/workflows/build_py_tools.yml index 48e7f2c82d3..d4dfca9c8d1 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, ubuntu-24.04-arm] include: - os: windows-latest TARGET: win64 @@ -64,14 +64,12 @@ jobs: - os: macos-latest TARGET: macos SEPARATOR: ":" - - os: ubuntu-20.04 + - os: ubuntu-latest TARGET: linux-amd64 SEPARATOR: ":" - - os: ARM - CONTAINER: python:3.8-bullseye + - os: ubuntu-24.04-arm TARGET: arm SEPARATOR: ":" - container: ${{ matrix.CONTAINER }} # use python container on ARM env: DISTPATH: pytools-${{ matrix.TARGET }} PIP_EXTRA_INDEX_URL: "https://dl.espressif.com/pypi" @@ -96,8 +94,6 @@ jobs: token: ${{ secrets.TOOLS_UPLOAD_PAT }} ref: ${{ github.event.pull_request.head.ref }} - name: Set up Python 3.8 - # Skip setting python on ARM because of missing compatibility: https://github.com/actions/setup-python/issues/108 - if: matrix.os != 'ARM' uses: actions/setup-python@master with: python-version: 3.8 diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index bd5acfa7a40..211ed1658f9 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: From 164fcc6a61587909b8903c05501bdc5ceacb6006 Mon Sep 17 00:00:00 2001 From: Eric Lewis Date: Tue, 25 Feb 2025 03:06:54 -0500 Subject: [PATCH 021/290] fix(board): Update feathers3 wire1 pin definition (#11001) * update feathers3 wire1 pin definition * 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: Rodrigo Garcia --- variants/um_feathers3/pins_arduino.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/variants/um_feathers3/pins_arduino.h b/variants/um_feathers3/pins_arduino.h index 8de87c688a9..1c81339c88e 100644 --- a/variants/um_feathers3/pins_arduino.h +++ b/variants/um_feathers3/pins_arduino.h @@ -16,6 +16,10 @@ static const uint8_t RX = 44; static const uint8_t SDA = 8; static const uint8_t SCL = 9; +#define WIRE1_PIN_DEFINED 1 // See Wire.cpp at bool TwoWire::initPins(int sdaPin, int sclPin) +static const uint8_t SDA1 = 16; +static const uint8_t SCL1 = 15; + static const uint8_t SS = 5; static const uint8_t MOSI = 35; static const uint8_t MISO = 37; From 0c18b17ac4ac608114cf580f1473de4b6cf3c607 Mon Sep 17 00:00:00 2001 From: SooDragon <82627949+SooDragon@users.noreply.github.com> Date: Tue, 25 Feb 2025 17:07:12 +0900 Subject: [PATCH 022/290] feat(boards): Add Geekble-nano-ESP32S3 (#11005) * add new board add new board * fix(board): add LED_BUILTIN #define --------- Co-authored-by: Rodrigo Garcia --- boards.txt | 190 +++++++++++++++++++ variants/Geekble_Nano_ESP32S3/pins_arduino.h | 74 ++++++++ 2 files changed, 264 insertions(+) create mode 100644 variants/Geekble_Nano_ESP32S3/pins_arduino.h diff --git a/boards.txt b/boards.txt index a83684bca18..a3700c22ef8 100644 --- a/boards.txt +++ b/boards.txt @@ -40832,6 +40832,196 @@ Geekble_ESP32C3.menu.EraseFlash.none.upload.erase_cmd= Geekble_ESP32C3.menu.EraseFlash.all=Enabled Geekble_ESP32C3.menu.EraseFlash.all.upload.erase_cmd=-e +############################################################## + +Geekble_Nano_ESP32S3.name=Geekble nano ESP32-S3 +Geekble_Nano_ESP32S3.vid.0=0x303a +Geekble_Nano_ESP32S3.pid.0= 0x82C5 +Geekble_Nano_ESP32S3.upload_port.0.vid=0x303a +Geekble_Nano_ESP32S3.upload_port.0.pid= 0x82C5 + +Geekble_Nano_ESP32S3.bootloader.tool=esptool_py +Geekble_Nano_ESP32S3.bootloader.tool.default=esptool_py + +Geekble_Nano_ESP32S3.upload.tool=esptool_py +Geekble_Nano_ESP32S3.upload.tool.default=esptool_py +Geekble_Nano_ESP32S3.upload.tool.network=esp_ota + +Geekble_Nano_ESP32S3.upload.maximum_size=1310720 + +Geekble_Nano_ESP32S3.upload.maximum_data_size=327680 +Geekble_Nano_ESP32S3.upload.flags= +Geekble_Nano_ESP32S3.upload.extra_flags= +Geekble_Nano_ESP32S3.upload.use_1200bps_touch=false +Geekble_Nano_ESP32S3.upload.wait_for_upload_port=false + +Geekble_Nano_ESP32S3.serial.disableDTR=false +Geekble_Nano_ESP32S3.serial.disableRTS=false + +Geekble_Nano_ESP32S3.build.tarch=xtensa +Geekble_Nano_ESP32S3.build.bootloader_addr=0x0 +Geekble_Nano_ESP32S3.build.target=esp32s3 +Geekble_Nano_ESP32S3.build.mcu=esp32s3 +Geekble_Nano_ESP32S3.build.core=esp32 +Geekble_Nano_ESP32S3.build.variant=Geekble_Nano_ESP32S3 +Geekble_Nano_ESP32S3.build.board=GEEKBLE_NANO_ESP32S3 + +Geekble_Nano_ESP32S3.build.usb_mode=1 +Geekble_Nano_ESP32S3.build.cdc_on_boot=1 +Geekble_Nano_ESP32S3.build.msc_on_boot=0 +Geekble_Nano_ESP32S3.build.dfu_on_boot=0 +Geekble_Nano_ESP32S3.build.f_cpu=240000000L +Geekble_Nano_ESP32S3.build.flash_size=4MB +Geekble_Nano_ESP32S3.build.flash_freq=80m +Geekble_Nano_ESP32S3.build.flash_mode=dio +Geekble_Nano_ESP32S3.build.boot=qio +Geekble_Nano_ESP32S3.build.boot_freq=80m +Geekble_Nano_ESP32S3.build.partitions=default +Geekble_Nano_ESP32S3.build.defines= +Geekble_Nano_ESP32S3.build.loop_core= +Geekble_Nano_ESP32S3.build.event_core= +Geekble_Nano_ESP32S3.build.psram_type=qspi +Geekble_Nano_ESP32S3.build.memory_type={build.boot}_{build.psram_type} + +Geekble_Nano_ESP32S3.menu.PSRAM.disabled=Disabled +Geekble_Nano_ESP32S3.menu.PSRAM.disabled.build.defines= +Geekble_Nano_ESP32S3.menu.PSRAM.disabled.build.psram_type=qspi +Geekble_Nano_ESP32S3.menu.PSRAM.enabled=Enabled +Geekble_Nano_ESP32S3.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM +Geekble_Nano_ESP32S3.menu.PSRAM.enabled.build.psram_type=qspi + +Geekble_Nano_ESP32S3.menu.FlashMode.qio=QIO 80MHz +Geekble_Nano_ESP32S3.menu.FlashMode.qio.build.flash_mode=dio +Geekble_Nano_ESP32S3.menu.FlashMode.qio.build.boot=qio +Geekble_Nano_ESP32S3.menu.FlashMode.qio.build.boot_freq=80m +Geekble_Nano_ESP32S3.menu.FlashMode.qio.build.flash_freq=80m +Geekble_Nano_ESP32S3.menu.FlashMode.qio120=QIO 120MHz +Geekble_Nano_ESP32S3.menu.FlashMode.qio120.build.flash_mode=dio +Geekble_Nano_ESP32S3.menu.FlashMode.qio120.build.boot=qio +Geekble_Nano_ESP32S3.menu.FlashMode.qio120.build.boot_freq=120m +Geekble_Nano_ESP32S3.menu.FlashMode.qio120.build.flash_freq=80m + +Geekble_Nano_ESP32S3.menu.LoopCore.1=Core 1 +Geekble_Nano_ESP32S3.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +Geekble_Nano_ESP32S3.menu.LoopCore.0=Core 0 +Geekble_Nano_ESP32S3.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +Geekble_Nano_ESP32S3.menu.EventsCore.1=Core 1 +Geekble_Nano_ESP32S3.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +Geekble_Nano_ESP32S3.menu.EventsCore.0=Core 0 +Geekble_Nano_ESP32S3.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +Geekble_Nano_ESP32S3.menu.USBMode.hwcdc=Hardware CDC and JTAG +Geekble_Nano_ESP32S3.menu.USBMode.hwcdc.build.usb_mode=1 +Geekble_Nano_ESP32S3.menu.USBMode.default=USB-OTG (TinyUSB) +Geekble_Nano_ESP32S3.menu.USBMode.default.build.usb_mode=0 + +Geekble_Nano_ESP32S3.menu.CDCOnBoot.default=Disabled +Geekble_Nano_ESP32S3.menu.CDCOnBoot.default.build.cdc_on_boot=0 +Geekble_Nano_ESP32S3.menu.CDCOnBoot.cdc=Enabled +Geekble_Nano_ESP32S3.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 + +Geekble_Nano_ESP32S3.menu.MSCOnBoot.default=Disabled +Geekble_Nano_ESP32S3.menu.MSCOnBoot.default.build.msc_on_boot=0 +Geekble_Nano_ESP32S3.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +Geekble_Nano_ESP32S3.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +Geekble_Nano_ESP32S3.menu.DFUOnBoot.default=Disabled +Geekble_Nano_ESP32S3.menu.DFUOnBoot.default.build.dfu_on_boot=0 +Geekble_Nano_ESP32S3.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +Geekble_Nano_ESP32S3.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +Geekble_Nano_ESP32S3.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +Geekble_Nano_ESP32S3.menu.UploadMode.cdc.upload.use_1200bps_touch=true +Geekble_Nano_ESP32S3.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +Geekble_Nano_ESP32S3.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +Geekble_Nano_ESP32S3.menu.PartitionScheme.default.build.partitions=default +Geekble_Nano_ESP32S3.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +Geekble_Nano_ESP32S3.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +Geekble_Nano_ESP32S3.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +Geekble_Nano_ESP32S3.menu.PartitionScheme.no_ota.build.partitions=no_ota +Geekble_Nano_ESP32S3.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +Geekble_Nano_ESP32S3.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +Geekble_Nano_ESP32S3.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +Geekble_Nano_ESP32S3.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +Geekble_Nano_ESP32S3.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +Geekble_Nano_ESP32S3.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +Geekble_Nano_ESP32S3.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +Geekble_Nano_ESP32S3.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +Geekble_Nano_ESP32S3.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +Geekble_Nano_ESP32S3.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +Geekble_Nano_ESP32S3.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +Geekble_Nano_ESP32S3.menu.PartitionScheme.huge_app.build.partitions=huge_app +Geekble_Nano_ESP32S3.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +Geekble_Nano_ESP32S3.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +Geekble_Nano_ESP32S3.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +Geekble_Nano_ESP32S3.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 +Geekble_Nano_ESP32S3.menu.PartitionScheme.rainmaker=RainMaker 4MB +Geekble_Nano_ESP32S3.menu.PartitionScheme.rainmaker.build.partitions=rainmaker +Geekble_Nano_ESP32S3.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 +Geekble_Nano_ESP32S3.menu.PartitionScheme.rainmaker_4MB=RainMaker 4MB No OTA +Geekble_Nano_ESP32S3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota +Geekble_Nano_ESP32S3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 + +Geekble_Nano_ESP32S3.menu.PartitionScheme.otanofs=OTA no FS (2MB APP with OTA) +Geekble_Nano_ESP32S3.menu.PartitionScheme.otanofs.build.custom_partitions=ota_nofs_4MB +Geekble_Nano_ESP32S3.menu.PartitionScheme.otanofs.upload.maximum_size=2031616 +Geekble_Nano_ESP32S3.menu.PartitionScheme.all_app=Max APP (4MB APP no OTA) +Geekble_Nano_ESP32S3.menu.PartitionScheme.all_app.build.custom_partitions=max_app_4MB +Geekble_Nano_ESP32S3.menu.PartitionScheme.all_app.upload.maximum_size=4063232 + +Geekble_Nano_ESP32S3.menu.PartitionScheme.custom=Custom +Geekble_Nano_ESP32S3.menu.PartitionScheme.custom.build.partitions= +Geekble_Nano_ESP32S3.menu.PartitionScheme.custom.upload.maximum_size=16777216 + +Geekble_Nano_ESP32S3.menu.CPUFreq.240=240MHz (WiFi) +Geekble_Nano_ESP32S3.menu.CPUFreq.240.build.f_cpu=240000000L +Geekble_Nano_ESP32S3.menu.CPUFreq.160=160MHz (WiFi) +Geekble_Nano_ESP32S3.menu.CPUFreq.160.build.f_cpu=160000000L +Geekble_Nano_ESP32S3.menu.CPUFreq.80=80MHz (WiFi) +Geekble_Nano_ESP32S3.menu.CPUFreq.80.build.f_cpu=80000000L +Geekble_Nano_ESP32S3.menu.CPUFreq.40=40MHz +Geekble_Nano_ESP32S3.menu.CPUFreq.40.build.f_cpu=40000000L +Geekble_Nano_ESP32S3.menu.CPUFreq.20=20MHz +Geekble_Nano_ESP32S3.menu.CPUFreq.20.build.f_cpu=20000000L +Geekble_Nano_ESP32S3.menu.CPUFreq.10=10MHz +Geekble_Nano_ESP32S3.menu.CPUFreq.10.build.f_cpu=10000000L + +Geekble_Nano_ESP32S3.menu.UploadSpeed.921600=921600 +Geekble_Nano_ESP32S3.menu.UploadSpeed.921600.upload.speed=921600 +Geekble_Nano_ESP32S3.menu.UploadSpeed.115200=115200 +Geekble_Nano_ESP32S3.menu.UploadSpeed.115200.upload.speed=115200 +Geekble_Nano_ESP32S3.menu.UploadSpeed.256000.windows=256000 +Geekble_Nano_ESP32S3.menu.UploadSpeed.256000.upload.speed=256000 +Geekble_Nano_ESP32S3.menu.UploadSpeed.230400.windows.upload.speed=256000 +Geekble_Nano_ESP32S3.menu.UploadSpeed.230400=230400 +Geekble_Nano_ESP32S3.menu.UploadSpeed.230400.upload.speed=230400 +Geekble_Nano_ESP32S3.menu.UploadSpeed.460800.linux=460800 +Geekble_Nano_ESP32S3.menu.UploadSpeed.460800.macosx=460800 +Geekble_Nano_ESP32S3.menu.UploadSpeed.460800.upload.speed=460800 +Geekble_Nano_ESP32S3.menu.UploadSpeed.512000.windows=512000 +Geekble_Nano_ESP32S3.menu.UploadSpeed.512000.upload.speed=512000 + +Geekble_Nano_ESP32S3.menu.DebugLevel.none=None +Geekble_Nano_ESP32S3.menu.DebugLevel.none.build.code_debug=0 +Geekble_Nano_ESP32S3.menu.DebugLevel.error=Error +Geekble_Nano_ESP32S3.menu.DebugLevel.error.build.code_debug=1 +Geekble_Nano_ESP32S3.menu.DebugLevel.warn=Warn +Geekble_Nano_ESP32S3.menu.DebugLevel.warn.build.code_debug=2 +Geekble_Nano_ESP32S3.menu.DebugLevel.info=Info +Geekble_Nano_ESP32S3.menu.DebugLevel.info.build.code_debug=3 +Geekble_Nano_ESP32S3.menu.DebugLevel.debug=Debug +Geekble_Nano_ESP32S3.menu.DebugLevel.debug.build.code_debug=4 +Geekble_Nano_ESP32S3.menu.DebugLevel.verbose=Verbose +Geekble_Nano_ESP32S3.menu.DebugLevel.verbose.build.code_debug=5 + +Geekble_Nano_ESP32S3.menu.EraseFlash.none=Disabled +Geekble_Nano_ESP32S3.menu.EraseFlash.none.upload.erase_cmd= +Geekble_Nano_ESP32S3.menu.EraseFlash.all=Enabled +Geekble_Nano_ESP32S3.menu.EraseFlash.all.upload.erase_cmd=-e + + ############################################################## waveshare_esp32_s3_zero.name=Waveshare ESP32-S3-Zero diff --git a/variants/Geekble_Nano_ESP32S3/pins_arduino.h b/variants/Geekble_Nano_ESP32S3/pins_arduino.h new file mode 100644 index 00000000000..657c0d5d51b --- /dev/null +++ b/variants/Geekble_Nano_ESP32S3/pins_arduino.h @@ -0,0 +1,74 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +#define USB_VID 0x303a +#define USB_PID 0x82C5 +#define USB_MANUFACTURER "Geekble" +#define USB_PRODUCT "Geekble nano ESP32-S3" +#define USB_SERIAL "" // Empty string for MAC address + +static const uint8_t D0 = 44; // also RX +static const uint8_t D1 = 43; // also TX +static const uint8_t D2 = 5; +static const uint8_t D3 = 6; // also CTS +static const uint8_t D4 = 7; // also DSR +static const uint8_t D5 = 8; +static const uint8_t D6 = 9; +static const uint8_t D7 = 10; +static const uint8_t D8 = 17; +static const uint8_t D9 = 18; +static const uint8_t D10 = 21; // also SS +static const uint8_t D11 = 38; // also MOSI +static const uint8_t D12 = 47; // also MISO +static const uint8_t D13 = 48; // also SCK, LED_BUILTIN + +static const uint8_t A0 = 1; // also DTR +static const uint8_t A1 = 2; +static const uint8_t A2 = 3; +static const uint8_t A3 = 4; +static const uint8_t A4 = 11; // also SDA +static const uint8_t A5 = 12; // also SCL +static const uint8_t A6 = 13; +static const uint8_t A7 = 14; + +// alternate pin functions + +static const uint8_t LED_BUILTIN = D13; +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN + +static const uint8_t SW_BUILTIN = 0; + +static const uint8_t TX = D1; +static const uint8_t RX = D0; +static const uint8_t RTS = 45; +static const uint8_t CTS = D3; +static const uint8_t DTR = A0; +static const uint8_t DSR = D4; + +static const uint8_t SS = D10; +static const uint8_t MOSI = D11; +static const uint8_t MISO = D12; +static const uint8_t SCK = D13; + +static const uint8_t SDA = A4; +static const uint8_t SCL = A5; + +// Touch input capable pins on the header +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; + +#define PIN_I2S_SCK D7 +#define PIN_I2S_FS D8 +#define PIN_I2S_SD D9 +#define PIN_I2S_SD_OUT D9 // same as bidir +#define PIN_I2S_SD_IN D10 + +#endif /* Pins_Arduino_h */ From b33470e44bf2fe5c9371e2a8d94ba8defc023df7 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 25 Feb 2025 10:13:10 +0200 Subject: [PATCH 023/290] IDF release/v5.4 (#10998) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * IDF release/v5.4 bcb3c32d * fix(zigbee): Remove the need of native ieee802154 radio --------- Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com> --- libraries/Zigbee/src/ZigbeeCore.cpp | 4 +- libraries/Zigbee/src/ZigbeeCore.h | 4 +- libraries/Zigbee/src/ZigbeeEP.cpp | 4 +- libraries/Zigbee/src/ZigbeeEP.h | 4 +- libraries/Zigbee/src/ZigbeeHandlers.cpp | 4 +- libraries/Zigbee/src/ep/ZigbeeAnalog.cpp | 4 +- libraries/Zigbee/src/ep/ZigbeeAnalog.h | 4 +- .../src/ep/ZigbeeCarbonDioxideSensor.cpp | 4 +- .../Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h | 4 +- .../src/ep/ZigbeeColorDimmableLight.cpp | 4 +- .../Zigbee/src/ep/ZigbeeColorDimmableLight.h | 4 +- .../Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp | 4 +- .../Zigbee/src/ep/ZigbeeColorDimmerSwitch.h | 4 +- .../Zigbee/src/ep/ZigbeeContactSwitch.cpp | 4 +- libraries/Zigbee/src/ep/ZigbeeContactSwitch.h | 4 +- .../Zigbee/src/ep/ZigbeeDimmableLight.cpp | 2 +- libraries/Zigbee/src/ep/ZigbeeDimmableLight.h | 2 +- .../Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp | 4 +- .../Zigbee/src/ep/ZigbeeDoorWindowHandle.h | 4 +- libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp | 4 +- libraries/Zigbee/src/ep/ZigbeeFlowSensor.h | 4 +- libraries/Zigbee/src/ep/ZigbeeLight.cpp | 4 +- libraries/Zigbee/src/ep/ZigbeeLight.h | 4 +- .../Zigbee/src/ep/ZigbeeOccupancySensor.cpp | 4 +- .../Zigbee/src/ep/ZigbeeOccupancySensor.h | 4 +- .../Zigbee/src/ep/ZigbeePressureSensor.cpp | 4 +- .../Zigbee/src/ep/ZigbeePressureSensor.h | 4 +- .../Zigbee/src/ep/ZigbeeRangeExtender.cpp | 4 +- libraries/Zigbee/src/ep/ZigbeeRangeExtender.h | 4 +- libraries/Zigbee/src/ep/ZigbeeSwitch.cpp | 4 +- libraries/Zigbee/src/ep/ZigbeeSwitch.h | 4 +- libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp | 4 +- libraries/Zigbee/src/ep/ZigbeeTempSensor.h | 4 +- libraries/Zigbee/src/ep/ZigbeeThermostat.cpp | 4 +- libraries/Zigbee/src/ep/ZigbeeThermostat.h | 4 +- .../Zigbee/src/ep/ZigbeeVibrationSensor.cpp | 4 +- .../Zigbee/src/ep/ZigbeeVibrationSensor.h | 4 +- .../Zigbee/src/ep/ZigbeeWindowCovering.cpp | 4 +- .../Zigbee/src/ep/ZigbeeWindowCovering.h | 4 +- package/package_esp32_index.template.json | 68 +++++++++---------- 40 files changed, 110 insertions(+), 110 deletions(-) diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index 19f4d0872b8..0fad546bb15 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -1,7 +1,7 @@ /* Zigbee Core Functions */ #include "ZigbeeCore.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeHandlers.cpp" #include "Arduino.h" @@ -526,4 +526,4 @@ const char *ZigbeeCore::getDeviceTypeString(esp_zb_ha_standard_devices_t deviceI ZigbeeCore Zigbee = ZigbeeCore(); -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ZigbeeCore.h b/libraries/Zigbee/src/ZigbeeCore.h index 02dce54e5ff..1d6e32babe0 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "esp_zigbee_core.h" #include "zdo/esp_zigbee_zdo_common.h" @@ -144,4 +144,4 @@ class ZigbeeCore { extern ZigbeeCore Zigbee; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index f3f890393eb..8320215707b 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -2,7 +2,7 @@ #include "ZigbeeEP.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "esp_zigbee_cluster.h" #include "zcl/esp_zigbee_zcl_power_config.h" @@ -431,4 +431,4 @@ void ZigbeeEP::requestOTAUpdate() { esp_zb_lock_release(); } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index 3bdd7f22b23..14b9ff61040 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -3,7 +3,7 @@ #pragma once #include "ZigbeeCore.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include #include @@ -157,4 +157,4 @@ class ZigbeeEP { friend class ZigbeeCore; }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ZigbeeHandlers.cpp b/libraries/Zigbee/src/ZigbeeHandlers.cpp index 3af1b6c52aa..eeeb1e8013a 100644 --- a/libraries/Zigbee/src/ZigbeeHandlers.cpp +++ b/libraries/Zigbee/src/ZigbeeHandlers.cpp @@ -2,7 +2,7 @@ #include "ZigbeeCore.h" #include "Arduino.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if 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 @@ -397,4 +397,4 @@ static esp_err_t zb_cmd_default_resp_handler(const esp_zb_zcl_cmd_default_resp_m return ESP_OK; } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp index 25c199b345b..9d1b53fd310 100644 --- a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp @@ -1,5 +1,5 @@ #include "ZigbeeAnalog.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED esp_zb_cluster_list_t *zigbee_analog_clusters_create(zigbee_analog_cfg_t *analog_sensor) { esp_zb_basic_cluster_cfg_t *basic_cfg = analog_sensor ? &(analog_sensor->basic_cfg) : NULL; @@ -121,4 +121,4 @@ void ZigbeeAnalog::setAnalogInputReporting(uint16_t min_interval, uint16_t max_i esp_zb_lock_release(); } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.h b/libraries/Zigbee/src/ep/ZigbeeAnalog.h index e3b22594324..8993c6ea1a4 100644 --- a/libraries/Zigbee/src/ep/ZigbeeAnalog.h +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -73,4 +73,4 @@ class ZigbeeAnalog : public ZigbeeEP { uint8_t _analog_clusters; }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp index ad351f1a75d..15e13d04d7e 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp @@ -1,5 +1,5 @@ #include "ZigbeeCarbonDioxideSensor.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if 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; @@ -90,4 +90,4 @@ void ZigbeeCarbonDioxideSensor::report() { log_v("Carbon dioxide report sent"); } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h index 7744fd02f00..41a9a4fb355 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -58,4 +58,4 @@ class ZigbeeCarbonDioxideSensor : public ZigbeeEP { void report(); }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp index 7ffd6976e1f..585b1549816 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp @@ -1,5 +1,5 @@ #include "ZigbeeColorDimmableLight.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED ZigbeeColorDimmableLight::ZigbeeColorDimmableLight(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_COLOR_DIMMABLE_LIGHT_DEVICE_ID; @@ -177,4 +177,4 @@ void ZigbeeColorDimmableLight::setLightColor(espHsvColor_t hsv_color) { setLight(_current_state, _current_level, rgb_color.r, rgb_color.g, rgb_color.b); } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h index 265fec1b37c..64df3565793 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -105,4 +105,4 @@ class ZigbeeColorDimmableLight : public ZigbeeEP { espRgbColor_t _current_color; }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp index 7bdd8b8ad6a..68f287153cb 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp @@ -1,5 +1,5 @@ #include "ZigbeeColorDimmerSwitch.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED // Initialize the static instance pointer ZigbeeColorDimmerSwitch *ZigbeeColorDimmerSwitch::_instance = nullptr; @@ -481,4 +481,4 @@ void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t } } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h index ca67fb4ba62..dbe50a20230 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -55,4 +55,4 @@ class ZigbeeColorDimmerSwitch : public ZigbeeEP { void calculateXY(uint8_t red, uint8_t green, uint8_t blue, uint16_t &x, uint16_t &y); }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp b/libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp index 9a3551b0581..6237315d5d9 100644 --- a/libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp @@ -1,5 +1,5 @@ #include "ZigbeeContactSwitch.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if 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; @@ -93,4 +93,4 @@ void ZigbeeContactSwitch::zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enro } } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeContactSwitch.h b/libraries/Zigbee/src/ep/ZigbeeContactSwitch.h index 692caf092ba..f44ce1cec40 100644 --- a/libraries/Zigbee/src/ep/ZigbeeContactSwitch.h +++ b/libraries/Zigbee/src/ep/ZigbeeContactSwitch.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -64,4 +64,4 @@ class ZigbeeContactSwitch : public ZigbeeEP { uint8_t _ias_cie_endpoint; }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp index 00d3aac3752..34622d1d2db 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 && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "esp_zigbee_cluster.h" diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h index 6f92c3315e4..45c3e97c00b 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" diff --git a/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp b/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp index 364b3ef6d9d..70008fbab10 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp @@ -1,5 +1,5 @@ #include "ZigbeeDoorWindowHandle.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if 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; @@ -105,4 +105,4 @@ void ZigbeeDoorWindowHandle::zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_e } } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.h b/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.h index e60316f8764..8d4eff9e45a 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.h +++ b/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -68,4 +68,4 @@ class ZigbeeDoorWindowHandle : public ZigbeeEP { uint8_t _ias_cie_endpoint; }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp index 36d66840967..d8fea88342e 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp @@ -1,5 +1,5 @@ #include "ZigbeeFlowSensor.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if 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; @@ -86,4 +86,4 @@ void ZigbeeFlowSensor::report() { log_v("Flow report sent"); } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h index 7d5ec26f7ec..5e9e20e4d1a 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -57,4 +57,4 @@ class ZigbeeFlowSensor : public ZigbeeEP { void report(); }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeLight.cpp b/libraries/Zigbee/src/ep/ZigbeeLight.cpp index 100efe34a86..2a87db71287 100644 --- a/libraries/Zigbee/src/ep/ZigbeeLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeLight.cpp @@ -1,5 +1,5 @@ #include "ZigbeeLight.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED ZigbeeLight::ZigbeeLight(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_ON_OFF_LIGHT_DEVICE_ID; @@ -46,4 +46,4 @@ void ZigbeeLight::setLight(bool state) { esp_zb_lock_release(); } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeLight.h b/libraries/Zigbee/src/ep/ZigbeeLight.h index 8cf8c35f781..807802be9b3 100644 --- a/libraries/Zigbee/src/ep/ZigbeeLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeLight.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -38,4 +38,4 @@ class ZigbeeLight : public ZigbeeEP { bool _current_state; }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp index dec7910ac03..830e4397137 100644 --- a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp @@ -1,5 +1,5 @@ #include "ZigbeeOccupancySensor.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if 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; @@ -56,4 +56,4 @@ void ZigbeeOccupancySensor::report() { log_v("Occupancy report sent"); } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h index 40c5eddbbdd..fa622d5a707 100644 --- a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -51,4 +51,4 @@ class ZigbeeOccupancySensor : public ZigbeeEP { void report(); }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp index b887680076d..9c181710bc2 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp @@ -1,5 +1,5 @@ #include "ZigbeePressureSensor.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if 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; @@ -82,4 +82,4 @@ void ZigbeePressureSensor::report() { log_v("Pressure report sent"); } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h index 2d72ef04c06..db14dd1c341 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -57,4 +57,4 @@ class ZigbeePressureSensor : public ZigbeeEP { void report(); }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp b/libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp index b29e926c201..20db20d758a 100644 --- a/libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp @@ -1,5 +1,5 @@ #include "ZigbeeRangeExtender.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED ZigbeeRangeExtender::ZigbeeRangeExtender(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_RANGE_EXTENDER_DEVICE_ID; @@ -12,4 +12,4 @@ ZigbeeRangeExtender::ZigbeeRangeExtender(uint8_t endpoint) : ZigbeeEP(endpoint) _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_RANGE_EXTENDER_DEVICE_ID, .app_device_version = 0}; } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeRangeExtender.h b/libraries/Zigbee/src/ep/ZigbeeRangeExtender.h index 7441f48ea7a..f9e4a963164 100644 --- a/libraries/Zigbee/src/ep/ZigbeeRangeExtender.h +++ b/libraries/Zigbee/src/ep/ZigbeeRangeExtender.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -15,4 +15,4 @@ class ZigbeeRangeExtender : public ZigbeeEP { ~ZigbeeRangeExtender() {} }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp b/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp index f6b36d7f0d4..86c68ae1870 100644 --- a/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp @@ -1,5 +1,5 @@ #include "ZigbeeSwitch.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED // Initialize the static instance pointer ZigbeeSwitch *ZigbeeSwitch::_instance = nullptr; @@ -313,4 +313,4 @@ void ZigbeeSwitch::lightOnWithTimedOff(uint8_t on_off_control, uint16_t time_on, } } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeSwitch.h b/libraries/Zigbee/src/ep/ZigbeeSwitch.h index b638bfe823a..5c527bec6e3 100644 --- a/libraries/Zigbee/src/ep/ZigbeeSwitch.h +++ b/libraries/Zigbee/src/ep/ZigbeeSwitch.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -43,4 +43,4 @@ class ZigbeeSwitch : public ZigbeeEP { static void findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx); }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp index 90df37b91f5..c3991593422 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp @@ -1,5 +1,5 @@ #include "ZigbeeTempSensor.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED ZigbeeTempSensor::ZigbeeTempSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_TEMPERATURE_SENSOR_DEVICE_ID; @@ -150,4 +150,4 @@ void ZigbeeTempSensor::report() { } } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.h b/libraries/Zigbee/src/ep/ZigbeeTempSensor.h index e610ff8d356..41da03d9db8 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -48,4 +48,4 @@ class ZigbeeTempSensor : public ZigbeeEP { bool _humidity_sensor; }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp b/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp index f8957f073a5..357bcaed1bc 100644 --- a/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp @@ -1,5 +1,5 @@ #include "ZigbeeThermostat.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED static float zb_s16_to_temperature(int16_t value) { return 1.0 * value / 100; @@ -202,4 +202,4 @@ void ZigbeeThermostat::setTemperatureReporting(uint16_t min_interval, uint16_t m esp_zb_lock_release(); } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeThermostat.h b/libraries/Zigbee/src/ep/ZigbeeThermostat.h index 669ed9ab50a..7895115e1d1 100644 --- a/libraries/Zigbee/src/ep/ZigbeeThermostat.h +++ b/libraries/Zigbee/src/ep/ZigbeeThermostat.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -62,4 +62,4 @@ class ZigbeeThermostat : public ZigbeeEP { void zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_attribute_t *attribute) override; }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp index 2f2172c89df..9fc75297262 100644 --- a/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp @@ -1,5 +1,5 @@ #include "ZigbeeVibrationSensor.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if 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; @@ -83,4 +83,4 @@ void ZigbeeVibrationSensor::zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_en } } -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.h b/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.h index 799cc943cdb..1ee3740dcc3 100644 --- a/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -61,4 +61,4 @@ class ZigbeeVibrationSensor : public ZigbeeEP { uint8_t _ias_cie_endpoint; }; -#endif //SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp index 970017165e2..f6d6ec268ea 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp @@ -1,6 +1,6 @@ #include "ZigbeeWindowCovering.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if 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); @@ -305,4 +305,4 @@ void ZigbeeWindowCovering::setTiltPercentage(uint8_t tilt_percentage) { esp_zb_lock_release(); } -#endif // SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h index 08e0a35f737..f3a368370c4 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h +++ b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h @@ -4,7 +4,7 @@ #include "soc/soc_caps.h" #include "sdkconfig.h" -#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" @@ -144,4 +144,4 @@ class ZigbeeWindowCovering : public ZigbeeEP { uint16_t _physical_closed_limit_tilt; }; -#endif // SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED +#endif // CONFIG_ZB_ENABLED diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 2c86b6fe4dd..5a37e95930a 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.4-e37d33cc-v2" + "version": "idf-release_v5.4-bcb3c32d-v1" }, { "packager": "esp32", @@ -95,63 +95,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-e37d33cc-v2", + "version": "idf-release_v5.4-bcb3c32d-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", - "size": "339629117" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", + "size": "345570903" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", - "size": "339629117" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", + "size": "345570903" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", - "size": "339629117" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", + "size": "345570903" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", - "size": "339629117" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", + "size": "345570903" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", - "size": "339629117" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", + "size": "345570903" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", - "size": "339629117" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", + "size": "345570903" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", - "size": "339629117" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", + "size": "345570903" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-e37d33cc-v2.zip", - "checksum": "SHA-256:815e53a44eb4e0b59335b97cc0f66ad76a48ea61013dff5289db169f0bb8631c", - "size": "339629117" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", + "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", + "size": "345570903" } ] }, From c76c2eab3751f23087f43b82e60f58beec8ef706 Mon Sep 17 00:00:00 2001 From: Hoan Pham <83377800+mhpham23@users.noreply.github.com> Date: Tue, 25 Feb 2025 03:13:35 -0500 Subject: [PATCH 024/290] Update of Boards.txt & variants - Adding CYObot board - 3rd party board (#10947) * Adding CYObot board - 3rd party board 1. Adding Pin Header file for CYObot to variants folder 2. Add CYObot config to boards.txt * feat(cyobot): adding cyobot_v2_esp32s3 board Change comments in pin header file for cyobot board * fix(cyobot_v2_esp32s3): fix variant name fix variant name for cyobot board * fix(boards.txt): fix name of CYOBot board - Change name to uppercase * fix(CYOBot): fix boards.txt & pin_arduino.h * fix(pins_arduino.h): capitalize 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> --- boards.txt | 252 ++++++++++++++++++++++ variants/cyobot_v2_esp32s3/pins_arduino.h | 52 +++++ 2 files changed, 304 insertions(+) create mode 100644 variants/cyobot_v2_esp32s3/pins_arduino.h diff --git a/boards.txt b/boards.txt index a3700c22ef8..e1c9283f197 100644 --- a/boards.txt +++ b/boards.txt @@ -49221,3 +49221,255 @@ huidu_hd_wf4.menu.EraseFlash.all=Enabled huidu_hd_wf4.menu.EraseFlash.all.upload.erase_cmd=-e ############################################################## + +# CYOBot (CYOBrain V2 ESP32S3) Board +cyobot_v2_esp32s3.name=CYOBOT V2 ESP32S3 + +cyobot_v2_esp32s3.bootloader.tool=esptool_py +cyobot_v2_esp32s3.bootloader.tool.default=esptool_py + +cyobot_v2_esp32s3.upload.tool=esptool_py +cyobot_v2_esp32s3.upload.tool.default=esptool_py +cyobot_v2_esp32s3.upload.tool.network=esp_ota + +cyobot_v2_esp32s3.upload.maximum_size=1310720 +cyobot_v2_esp32s3.upload.maximum_data_size=327680 +cyobot_v2_esp32s3.upload.flags= +cyobot_v2_esp32s3.upload.extra_flags= +cyobot_v2_esp32s3.upload.use_1200bps_touch=false +cyobot_v2_esp32s3.upload.wait_for_upload_port=false + +cyobot_v2_esp32s3.serial.disableDTR=false +cyobot_v2_esp32s3.serial.disableRTS=false + +cyobot_v2_esp32s3.build.tarch=xtensa +cyobot_v2_esp32s3.build.bootloader_addr=0x0 +cyobot_v2_esp32s3.build.target=esp32s3 +cyobot_v2_esp32s3.build.mcu=esp32s3 +cyobot_v2_esp32s3.build.core=esp32 +cyobot_v2_esp32s3.build.variant=cyobot_v2_esp32s3 +cyobot_v2_esp32s3.build.board=CYOBOT_V2_ESP32S3 + +cyobot_v2_esp32s3.build.usb_mode=1 +cyobot_v2_esp32s3.build.cdc_on_boot=0 +cyobot_v2_esp32s3.build.msc_on_boot=0 +cyobot_v2_esp32s3.build.dfu_on_boot=0 +cyobot_v2_esp32s3.build.f_cpu=240000000L +cyobot_v2_esp32s3.build.flash_size=4MB +cyobot_v2_esp32s3.build.flash_freq=80m +cyobot_v2_esp32s3.build.flash_mode=dio +cyobot_v2_esp32s3.build.boot=qio +cyobot_v2_esp32s3.build.boot_freq=80m +cyobot_v2_esp32s3.build.partitions=default +cyobot_v2_esp32s3.build.defines= +cyobot_v2_esp32s3.build.loop_core= +cyobot_v2_esp32s3.build.event_core= +cyobot_v2_esp32s3.build.psram_type=qspi +cyobot_v2_esp32s3.build.memory_type={build.boot}_{build.psram_type} + +## IDE 2.0 Seems to not update the value +cyobot_v2_esp32s3.menu.JTAGAdapter.default=Disabled +cyobot_v2_esp32s3.menu.JTAGAdapter.default.build.copy_jtag_files=0 +cyobot_v2_esp32s3.menu.JTAGAdapter.builtin=Integrated USB JTAG +cyobot_v2_esp32s3.menu.JTAGAdapter.builtin.build.openocdscript=cyobot_v2_esp32s3-builtin.cfg +cyobot_v2_esp32s3.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 +cyobot_v2_esp32s3.menu.JTAGAdapter.external=FTDI Adapter +cyobot_v2_esp32s3.menu.JTAGAdapter.external.build.openocdscript=cyobot_v2_esp32s3-ftdi.cfg +cyobot_v2_esp32s3.menu.JTAGAdapter.external.build.copy_jtag_files=1 +cyobot_v2_esp32s3.menu.JTAGAdapter.bridge=ESP USB Bridge +cyobot_v2_esp32s3.menu.JTAGAdapter.bridge.build.openocdscript=cyobot_v2_esp32s3-bridge.cfg +cyobot_v2_esp32s3.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +cyobot_v2_esp32s3.menu.PSRAM.disabled=Disabled +cyobot_v2_esp32s3.menu.PSRAM.disabled.build.defines= +cyobot_v2_esp32s3.menu.PSRAM.disabled.build.psram_type=qspi +cyobot_v2_esp32s3.menu.PSRAM.enabled=QSPI PSRAM +cyobot_v2_esp32s3.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM +cyobot_v2_esp32s3.menu.PSRAM.enabled.build.psram_type=qspi +cyobot_v2_esp32s3.menu.PSRAM.opi=OPI PSRAM +cyobot_v2_esp32s3.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM +cyobot_v2_esp32s3.menu.PSRAM.opi.build.psram_type=opi + +cyobot_v2_esp32s3.menu.FlashMode.qio=QIO 80MHz +cyobot_v2_esp32s3.menu.FlashMode.qio.build.flash_mode=dio +cyobot_v2_esp32s3.menu.FlashMode.qio.build.boot=qio +cyobot_v2_esp32s3.menu.FlashMode.qio.build.boot_freq=80m +cyobot_v2_esp32s3.menu.FlashMode.qio.build.flash_freq=80m +cyobot_v2_esp32s3.menu.FlashMode.qio120=QIO 120MHz +cyobot_v2_esp32s3.menu.FlashMode.qio120.build.flash_mode=dio +cyobot_v2_esp32s3.menu.FlashMode.qio120.build.boot=qio +cyobot_v2_esp32s3.menu.FlashMode.qio120.build.boot_freq=120m +cyobot_v2_esp32s3.menu.FlashMode.qio120.build.flash_freq=80m +cyobot_v2_esp32s3.menu.FlashMode.dio=DIO 80MHz +cyobot_v2_esp32s3.menu.FlashMode.dio.build.flash_mode=dio +cyobot_v2_esp32s3.menu.FlashMode.dio.build.boot=dio +cyobot_v2_esp32s3.menu.FlashMode.dio.build.boot_freq=80m +cyobot_v2_esp32s3.menu.FlashMode.dio.build.flash_freq=80m +cyobot_v2_esp32s3.menu.FlashMode.opi=OPI 80MHz +cyobot_v2_esp32s3.menu.FlashMode.opi.build.flash_mode=dout +cyobot_v2_esp32s3.menu.FlashMode.opi.build.boot=opi +cyobot_v2_esp32s3.menu.FlashMode.opi.build.boot_freq=80m +cyobot_v2_esp32s3.menu.FlashMode.opi.build.flash_freq=80m + +cyobot_v2_esp32s3.menu.FlashSize.4M=4MB (32Mb) +cyobot_v2_esp32s3.menu.FlashSize.4M.build.flash_size=4MB +cyobot_v2_esp32s3.menu.FlashSize.8M=8MB (64Mb) +cyobot_v2_esp32s3.menu.FlashSize.8M.build.flash_size=8MB +cyobot_v2_esp32s3.menu.FlashSize.16M=16MB (128Mb) +cyobot_v2_esp32s3.menu.FlashSize.16M.build.flash_size=16MB +cyobot_v2_esp32s3.menu.FlashSize.32M=32MB (256Mb) +cyobot_v2_esp32s3.menu.FlashSize.32M.build.flash_size=32MB + +cyobot_v2_esp32s3.menu.LoopCore.1=Core 1 +cyobot_v2_esp32s3.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +cyobot_v2_esp32s3.menu.LoopCore.0=Core 0 +cyobot_v2_esp32s3.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +cyobot_v2_esp32s3.menu.EventsCore.1=Core 1 +cyobot_v2_esp32s3.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +cyobot_v2_esp32s3.menu.EventsCore.0=Core 0 +cyobot_v2_esp32s3.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +cyobot_v2_esp32s3.menu.USBMode.hwcdc=Hardware CDC and JTAG +cyobot_v2_esp32s3.menu.USBMode.hwcdc.build.usb_mode=1 +cyobot_v2_esp32s3.menu.USBMode.default=USB-OTG (TinyUSB) +cyobot_v2_esp32s3.menu.USBMode.default.build.usb_mode=0 + +cyobot_v2_esp32s3.menu.CDCOnBoot.default=Disabled +cyobot_v2_esp32s3.menu.CDCOnBoot.default.build.cdc_on_boot=0 +cyobot_v2_esp32s3.menu.CDCOnBoot.cdc=Enabled +cyobot_v2_esp32s3.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 + +cyobot_v2_esp32s3.menu.MSCOnBoot.default=Disabled +cyobot_v2_esp32s3.menu.MSCOnBoot.default.build.msc_on_boot=0 +cyobot_v2_esp32s3.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +cyobot_v2_esp32s3.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +cyobot_v2_esp32s3.menu.DFUOnBoot.default=Disabled +cyobot_v2_esp32s3.menu.DFUOnBoot.default.build.dfu_on_boot=0 +cyobot_v2_esp32s3.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +cyobot_v2_esp32s3.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +cyobot_v2_esp32s3.menu.UploadMode.default=UART0 / Hardware CDC +cyobot_v2_esp32s3.menu.UploadMode.default.upload.use_1200bps_touch=false +cyobot_v2_esp32s3.menu.UploadMode.default.upload.wait_for_upload_port=false +cyobot_v2_esp32s3.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +cyobot_v2_esp32s3.menu.UploadMode.cdc.upload.use_1200bps_touch=true +cyobot_v2_esp32s3.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +cyobot_v2_esp32s3.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +cyobot_v2_esp32s3.menu.PartitionScheme.default.build.partitions=default +cyobot_v2_esp32s3.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +cyobot_v2_esp32s3.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +cyobot_v2_esp32s3.menu.PartitionScheme.default_8MB=8M with spiffs (3MB APP/1.5MB SPIFFS) +cyobot_v2_esp32s3.menu.PartitionScheme.default_8MB.build.partitions=default_8MB +cyobot_v2_esp32s3.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 +cyobot_v2_esp32s3.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +cyobot_v2_esp32s3.menu.PartitionScheme.minimal.build.partitions=minimal +cyobot_v2_esp32s3.menu.PartitionScheme.no_fs=No FS 4MB (2MB APP x2) +cyobot_v2_esp32s3.menu.PartitionScheme.no_fs.build.partitions=no_fs +cyobot_v2_esp32s3.menu.PartitionScheme.no_fs.upload.maximum_size=2031616 +cyobot_v2_esp32s3.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +cyobot_v2_esp32s3.menu.PartitionScheme.no_ota.build.partitions=no_ota +cyobot_v2_esp32s3.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +cyobot_v2_esp32s3.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +cyobot_v2_esp32s3.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +cyobot_v2_esp32s3.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +cyobot_v2_esp32s3.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +cyobot_v2_esp32s3.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +cyobot_v2_esp32s3.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +cyobot_v2_esp32s3.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +cyobot_v2_esp32s3.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +cyobot_v2_esp32s3.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +cyobot_v2_esp32s3.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +cyobot_v2_esp32s3.menu.PartitionScheme.huge_app.build.partitions=huge_app +cyobot_v2_esp32s3.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +cyobot_v2_esp32s3.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +cyobot_v2_esp32s3.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +cyobot_v2_esp32s3.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 +cyobot_v2_esp32s3.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) +cyobot_v2_esp32s3.menu.PartitionScheme.fatflash.build.partitions=ffat +cyobot_v2_esp32s3.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 +cyobot_v2_esp32s3.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS) +cyobot_v2_esp32s3.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB +cyobot_v2_esp32s3.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 +cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker=RainMaker 4MB +cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker.build.partitions=rainmaker +cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 +cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker_4MB=RainMaker 4MB No OTA +cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota +cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 +cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB +cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB +cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +cyobot_v2_esp32s3.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) +cyobot_v2_esp32s3.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB +cyobot_v2_esp32s3.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 +cyobot_v2_esp32s3.menu.PartitionScheme.app5M_little24M_32MB=32M Flash (4.8MB APP/22MB LittleFS) +cyobot_v2_esp32s3.menu.PartitionScheme.app5M_little24M_32MB.build.partitions=large_littlefs_32MB +cyobot_v2_esp32s3.menu.PartitionScheme.app5M_little24M_32MB.upload.maximum_size=4718592 +cyobot_v2_esp32s3.menu.PartitionScheme.esp_sr_16=ESP SR 16M (3MB APP/7MB SPIFFS/2.9MB MODEL) +cyobot_v2_esp32s3.menu.PartitionScheme.esp_sr_16.upload.maximum_size=3145728 +cyobot_v2_esp32s3.menu.PartitionScheme.esp_sr_16.upload.extra_flags=0xD10000 {build.path}/srmodels.bin +cyobot_v2_esp32s3.menu.PartitionScheme.esp_sr_16.build.partitions=esp_sr_16 +cyobot_v2_esp32s3.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs +cyobot_v2_esp32s3.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr +cyobot_v2_esp32s3.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 +cyobot_v2_esp32s3.menu.PartitionScheme.custom=Custom +cyobot_v2_esp32s3.menu.PartitionScheme.custom.build.partitions= +cyobot_v2_esp32s3.menu.PartitionScheme.custom.upload.maximum_size=16777216 + +cyobot_v2_esp32s3.menu.CPUFreq.240=240MHz (WiFi) +cyobot_v2_esp32s3.menu.CPUFreq.240.build.f_cpu=240000000L +cyobot_v2_esp32s3.menu.CPUFreq.160=160MHz (WiFi) +cyobot_v2_esp32s3.menu.CPUFreq.160.build.f_cpu=160000000L +cyobot_v2_esp32s3.menu.CPUFreq.80=80MHz (WiFi) +cyobot_v2_esp32s3.menu.CPUFreq.80.build.f_cpu=80000000L +cyobot_v2_esp32s3.menu.CPUFreq.40=40MHz +cyobot_v2_esp32s3.menu.CPUFreq.40.build.f_cpu=40000000L +cyobot_v2_esp32s3.menu.CPUFreq.20=20MHz +cyobot_v2_esp32s3.menu.CPUFreq.20.build.f_cpu=20000000L +cyobot_v2_esp32s3.menu.CPUFreq.10=10MHz +cyobot_v2_esp32s3.menu.CPUFreq.10.build.f_cpu=10000000L + +cyobot_v2_esp32s3.menu.UploadSpeed.921600=921600 +cyobot_v2_esp32s3.menu.UploadSpeed.921600.upload.speed=921600 +cyobot_v2_esp32s3.menu.UploadSpeed.115200=115200 +cyobot_v2_esp32s3.menu.UploadSpeed.115200.upload.speed=115200 +cyobot_v2_esp32s3.menu.UploadSpeed.256000.windows=256000 +cyobot_v2_esp32s3.menu.UploadSpeed.256000.upload.speed=256000 +cyobot_v2_esp32s3.menu.UploadSpeed.230400.windows.upload.speed=256000 +cyobot_v2_esp32s3.menu.UploadSpeed.230400=230400 +cyobot_v2_esp32s3.menu.UploadSpeed.230400.upload.speed=230400 +cyobot_v2_esp32s3.menu.UploadSpeed.460800.linux=460800 +cyobot_v2_esp32s3.menu.UploadSpeed.460800.macosx=460800 +cyobot_v2_esp32s3.menu.UploadSpeed.460800.upload.speed=460800 +cyobot_v2_esp32s3.menu.UploadSpeed.512000.windows=512000 +cyobot_v2_esp32s3.menu.UploadSpeed.512000.upload.speed=512000 + +cyobot_v2_esp32s3.menu.DebugLevel.none=None +cyobot_v2_esp32s3.menu.DebugLevel.none.build.code_debug=0 +cyobot_v2_esp32s3.menu.DebugLevel.error=Error +cyobot_v2_esp32s3.menu.DebugLevel.error.build.code_debug=1 +cyobot_v2_esp32s3.menu.DebugLevel.warn=Warn +cyobot_v2_esp32s3.menu.DebugLevel.warn.build.code_debug=2 +cyobot_v2_esp32s3.menu.DebugLevel.info=Info +cyobot_v2_esp32s3.menu.DebugLevel.info.build.code_debug=3 +cyobot_v2_esp32s3.menu.DebugLevel.debug=Debug +cyobot_v2_esp32s3.menu.DebugLevel.debug.build.code_debug=4 +cyobot_v2_esp32s3.menu.DebugLevel.verbose=Verbose +cyobot_v2_esp32s3.menu.DebugLevel.verbose.build.code_debug=5 + +cyobot_v2_esp32s3.menu.EraseFlash.none=Disabled +cyobot_v2_esp32s3.menu.EraseFlash.none.upload.erase_cmd= +cyobot_v2_esp32s3.menu.EraseFlash.all=Enabled +cyobot_v2_esp32s3.menu.EraseFlash.all.upload.erase_cmd=-e + +cyobot_v2_esp32s3.menu.ZigbeeMode.default=Disabled +cyobot_v2_esp32s3.menu.ZigbeeMode.default.build.zigbee_mode= +cyobot_v2_esp32s3.menu.ZigbeeMode.default.build.zigbee_libs= +cyobot_v2_esp32s3.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) +cyobot_v2_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +cyobot_v2_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote + +############################################################## diff --git a/variants/cyobot_v2_esp32s3/pins_arduino.h b/variants/cyobot_v2_esp32s3/pins_arduino.h new file mode 100644 index 00000000000..45f0968ef2a --- /dev/null +++ b/variants/cyobot_v2_esp32s3/pins_arduino.h @@ -0,0 +1,52 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +#define USB_MANUFACTURER "CYOBot" +#define USB_PRODUCT "CYOBrain ESP32S3" +#define USB_SERIAL "" // Empty string for MAC address + +static const uint8_t BUTTON0 = 4; +static const uint8_t BUTTON1 = 38; +static const uint8_t LED = 24; + +static const uint8_t BAT_MEAS = 6; +static const uint8_t CHAR_DET = 23; + +static const uint8_t NEO_BASE = 7; +static const uint8_t NEO_BRAIN = 15; + +static const uint8_t I2S0_MCLK = 16; +static const uint8_t I2S0_DSDIN = 8; +static const uint8_t I2S0_SCLK = 9; +static const uint8_t I2S0_LRCK = 45; + +static const uint8_t SDA = 17; +static const uint8_t SCL = 18; + +static const uint8_t SS = 5; +static const uint8_t MOSI = 2; +static const uint8_t MISO = 42; +static const uint8_t SCK = 41; + +static const uint8_t ENCODER1_A = 39; +static const uint8_t ENCODER1_B = 40; +static const uint8_t ENCODER2_B = 19; +static const uint8_t ENCODER2_A = 20; + +static const uint8_t UART1_RXD = 3; +static const uint8_t UART1_TXD = 1; + +static const uint8_t GPIO46 = 46; +static const uint8_t ESP_IO0 = 0; + +static const uint8_t SD_OUT = 10; +static const uint8_t SD_SPI_MOSI = 11; +static const uint8_t SD_SPI_CLK = 12; +static const uint8_t SD_SPI_MISO = 13; +static const uint8_t SD_SPI_CS = 14; + +static const uint8_t PA_CTRL = 25; + +#endif /* Pins_Arduino_h */ From 1467d874549280ad6542ce1a96fd39a47f45562d Mon Sep 17 00:00:00 2001 From: oddlama Date: Tue, 25 Feb 2025 09:17:17 +0100 Subject: [PATCH 025/290] fix(zigbee): use correct pressure cluster function in setTolerance (#11008) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com> --- libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp index 9c181710bc2..44e3eace610 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp @@ -33,7 +33,7 @@ void ZigbeePressureSensor::setMinMaxValue(int16_t min, int16_t 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); + esp_zb_pressure_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) { @@ -58,7 +58,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 */ + /* Update pressure sensor measured value */ log_d("Setting pressure to %d hPa", pressure); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_set_attribute_val( From 09d89c6da119db31de461a4bdda85f6ecc4c5ea0 Mon Sep 17 00:00:00 2001 From: Gonzalo Brusco Date: Tue, 25 Feb 2025 12:58:10 -0300 Subject: [PATCH 026/290] Fix HardwareSerial config (#11007) --- cores/esp32/HardwareSerial.cpp | 12 ------------ cores/esp32/HardwareSerial.h | 12 ++++++++++++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cores/esp32/HardwareSerial.cpp b/cores/esp32/HardwareSerial.cpp index c14dac7bc7e..76135691411 100644 --- a/cores/esp32/HardwareSerial.cpp +++ b/cores/esp32/HardwareSerial.cpp @@ -11,18 +11,6 @@ #include "driver/uart.h" #include "freertos/queue.h" -#ifndef ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE -#define ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE 2048 -#endif - -#ifndef ARDUINO_SERIAL_EVENT_TASK_PRIORITY -#define ARDUINO_SERIAL_EVENT_TASK_PRIORITY (configMAX_PRIORITIES - 1) -#endif - -#ifndef ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE -#define ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE -1 -#endif - #if (SOC_UART_LP_NUM >= 1) #define UART_HW_FIFO_LEN(uart_num) ((uart_num < SOC_UART_HP_NUM) ? SOC_UART_FIFO_LEN : SOC_LP_UART_FIFO_LEN) #else diff --git a/cores/esp32/HardwareSerial.h b/cores/esp32/HardwareSerial.h index e52428f0dd5..b1f6df17724 100644 --- a/cores/esp32/HardwareSerial.h +++ b/cores/esp32/HardwareSerial.h @@ -97,15 +97,27 @@ typedef enum { } hardwareSerial_error_t; #ifndef ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE +#ifndef CONFIG_ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE #define ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE 2048 +#else +#define ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE CONFIG_ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE +#endif #endif #ifndef ARDUINO_SERIAL_EVENT_TASK_PRIORITY +#ifndef CONFIG_ARDUINO_SERIAL_EVENT_TASK_PRIORITY #define ARDUINO_SERIAL_EVENT_TASK_PRIORITY (configMAX_PRIORITIES - 1) +#else +#define ARDUINO_SERIAL_EVENT_TASK_PRIORITY CONFIG_ARDUINO_SERIAL_EVENT_TASK_PRIORITY +#endif #endif #ifndef ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE +#ifndef CONFIG_ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE #define ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE -1 +#else +#define ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE CONFIG_ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE +#endif #endif // UART0 pins are defined by default by the bootloader. From 7485c653bb949fd182d1eaa46f53f7947b348149 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:00:39 -0300 Subject: [PATCH 027/290] ci(zigbee): Check if Zigbee is enabled for CI tests (#11012) * ci(zigbee): Check if Zigbee is enabled for CI tests * ci(zigbee): Fix requirements * fix(zigbee): Use LED_BUILTIN for range extender * fix(zigbee): Use default GPIO if LED_BUILTINnot defined --- .../Zigbee/examples/Zigbee_Analog_Input_Output/ci.json | 3 ++- .../Zigbee/examples/Zigbee_CarbonDioxide_Sensor/ci.json | 3 ++- .../Zigbee/examples/Zigbee_Color_Dimmable_Light/ci.json | 3 ++- .../Zigbee/examples/Zigbee_Color_Dimmer_Switch/ci.json | 2 +- libraries/Zigbee/examples/Zigbee_Contact_Switch/ci.json | 3 ++- libraries/Zigbee/examples/Zigbee_Dimmable_Light/ci.json | 3 ++- libraries/Zigbee/examples/Zigbee_OTA_Client/ci.json | 3 ++- libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/ci.json | 3 ++- libraries/Zigbee/examples/Zigbee_On_Off_Light/ci.json | 3 ++- libraries/Zigbee/examples/Zigbee_On_Off_Switch/ci.json | 2 +- .../Zigbee/examples/Zigbee_Pressure_Flow_Sensor/ci.json | 3 ++- .../Zigbee_Range_Extender/Zigbee_Range_Extender.ino | 7 ++++++- libraries/Zigbee/examples/Zigbee_Range_Extender/ci.json | 2 +- libraries/Zigbee/examples/Zigbee_Scan_Networks/ci.json | 3 ++- .../Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/ci.json | 3 ++- .../Zigbee/examples/Zigbee_Temperature_Sensor/ci.json | 3 ++- libraries/Zigbee/examples/Zigbee_Thermostat/ci.json | 2 +- libraries/Zigbee/examples/Zigbee_Vibration_Sensor/ci.json | 3 ++- libraries/Zigbee/examples/Zigbee_Window_Covering/ci.json | 3 ++- 19 files changed, 38 insertions(+), 19 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/ci.json b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/ci.json +++ b/libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/ci.json b/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/ci.json b/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/ci.json index e79a477da11..15d6190e4ae 100644 --- a/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/ci.json @@ -1,6 +1,6 @@ { "fqbn_append": "PartitionScheme=zigbee_zczr,ZigbeeMode=zczr", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Contact_Switch/ci.json b/libraries/Zigbee/examples/Zigbee_Contact_Switch/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_Contact_Switch/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Contact_Switch/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Dimmable_Light/ci.json b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_Dimmable_Light/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Dimmable_Light/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_OTA_Client/ci.json b/libraries/Zigbee/examples/Zigbee_OTA_Client/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_OTA_Client/ci.json +++ b/libraries/Zigbee/examples/Zigbee_OTA_Client/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_Light/ci.json b/libraries/Zigbee/examples/Zigbee_On_Off_Light/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_On_Off_Light/ci.json +++ b/libraries/Zigbee/examples/Zigbee_On_Off_Light/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_Switch/ci.json b/libraries/Zigbee/examples/Zigbee_On_Off_Switch/ci.json index e79a477da11..15d6190e4ae 100644 --- a/libraries/Zigbee/examples/Zigbee_On_Off_Switch/ci.json +++ b/libraries/Zigbee/examples/Zigbee_On_Off_Switch/ci.json @@ -1,6 +1,6 @@ { "fqbn_append": "PartitionScheme=zigbee_zczr,ZigbeeMode=zczr", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Range_Extender/Zigbee_Range_Extender.ino b/libraries/Zigbee/examples/Zigbee_Range_Extender/Zigbee_Range_Extender.ino index 3c4cfeb61dc..a1ba90fbaf6 100644 --- a/libraries/Zigbee/examples/Zigbee_Range_Extender/Zigbee_Range_Extender.ino +++ b/libraries/Zigbee/examples/Zigbee_Range_Extender/Zigbee_Range_Extender.ino @@ -34,7 +34,12 @@ /* Zigbee light bulb configuration */ #define USE_CUSTOM_ZIGBEE_CONFIG 1 #define ZIGBEE_EXTENDER_ENDPOINT 1 -uint8_t led = RGB_BUILTIN; + +#ifndef LED_BUILTIN +#define LED_BUILTIN 4 +#endif + +uint8_t led = LED_BUILTIN; uint8_t button = BOOT_PIN; ZigbeeRangeExtender zbExtender = ZigbeeRangeExtender(ZIGBEE_EXTENDER_ENDPOINT); diff --git a/libraries/Zigbee/examples/Zigbee_Range_Extender/ci.json b/libraries/Zigbee/examples/Zigbee_Range_Extender/ci.json index e79a477da11..15d6190e4ae 100644 --- a/libraries/Zigbee/examples/Zigbee_Range_Extender/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Range_Extender/ci.json @@ -1,6 +1,6 @@ { "fqbn_append": "PartitionScheme=zigbee_zczr,ZigbeeMode=zczr", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Scan_Networks/ci.json b/libraries/Zigbee/examples/Zigbee_Scan_Networks/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_Scan_Networks/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Scan_Networks/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/ci.json b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Temperature_Sensor/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Thermostat/ci.json b/libraries/Zigbee/examples/Zigbee_Thermostat/ci.json index e79a477da11..15d6190e4ae 100644 --- a/libraries/Zigbee/examples/Zigbee_Thermostat/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Thermostat/ci.json @@ -1,6 +1,6 @@ { "fqbn_append": "PartitionScheme=zigbee_zczr,ZigbeeMode=zczr", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Vibration_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_Vibration_Sensor/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_Vibration_Sensor/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Vibration_Sensor/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Window_Covering/ci.json b/libraries/Zigbee/examples/Zigbee_Window_Covering/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_Window_Covering/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Window_Covering/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } From 923da957e444501a5a8d7a03a92954426becf8de 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, 26 Feb 2025 10:49:24 +0100 Subject: [PATCH 028/290] feat(zigbee): Add ZigbeeGateway endpoint support + Time Cluster bugfix (#11009) * fix(zigbee): Remove the need of native ieee802154 radio * feat(zigbee): Add ZigbeeGateway endpoint support * fix(zigbee): Fix TimeCluster missing status attribute * feat(zigbee): Add new src to CMakeLists * feaz(zigbee): Update keywords.txt with latest updates * feat(zigbee): Add 8MB Zigbee ZCZR partitions to other socs * 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: Rodrigo Garcia --- CMakeLists.txt | 1 + boards.txt | 12 ++ .../Zigbee/examples/Zigbee_Gateway/README.md | 64 +++++++++ .../Zigbee_Gateway/Zigbee_Gateway.ino | 130 ++++++++++++++++++ .../Zigbee/examples/Zigbee_Gateway/ci.json | 10 ++ libraries/Zigbee/keywords.txt | 50 ++++++- libraries/Zigbee/src/Zigbee.h | 1 + libraries/Zigbee/src/ZigbeeCore.cpp | 8 +- libraries/Zigbee/src/ZigbeeCore.h | 20 +++ libraries/Zigbee/src/ZigbeeEP.cpp | 17 ++- libraries/Zigbee/src/ZigbeeEP.h | 1 + libraries/Zigbee/src/ep/ZigbeeGateway.cpp | 15 ++ libraries/Zigbee/src/ep/ZigbeeGateway.h | 18 +++ 13 files changed, 341 insertions(+), 6 deletions(-) create mode 100644 libraries/Zigbee/examples/Zigbee_Gateway/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Gateway/Zigbee_Gateway.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Gateway/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeeGateway.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeGateway.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 97ad068eb48..32d17e5f68d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -297,6 +297,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp libraries/Zigbee/src/ep/ZigbeeAnalog.cpp libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp + libraries/Zigbee/src/ep/ZigbeeGateway.cpp ) set(ARDUINO_LIBRARY_BLE_SRCS diff --git a/boards.txt b/boards.txt index e1c9283f197..2afe45f50a6 100644 --- a/boards.txt +++ b/boards.txt @@ -947,6 +947,9 @@ esp32s3.menu.PartitionScheme.esp_sr_16.build.partitions=esp_sr_16 esp32s3.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32s3.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32s3.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 +esp32s3.menu.PartitionScheme.zigbee_zczr_8MB=Zigbee ZCZR 8MB with spiffs +esp32s3.menu.PartitionScheme.zigbee_zczr_8MB.build.partitions=zigbee_zczr_8MB +esp32s3.menu.PartitionScheme.zigbee_zczr_8MB.upload.maximum_size=3407872 esp32s3.menu.PartitionScheme.custom=Custom esp32s3.menu.PartitionScheme.custom.build.partitions= esp32s3.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -1108,6 +1111,9 @@ esp32c3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 esp32c3.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32c3.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32c3.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 +esp32c3.menu.PartitionScheme.zigbee_zczr_8MB=Zigbee ZCZR 8MB with spiffs +esp32c3.menu.PartitionScheme.zigbee_zczr_8MB.build.partitions=zigbee_zczr_8MB +esp32c3.menu.PartitionScheme.zigbee_zczr_8MB.upload.maximum_size=3407872 esp32c3.menu.PartitionScheme.custom=Custom esp32c3.menu.PartitionScheme.custom.build.partitions= esp32c3.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -1313,6 +1319,9 @@ esp32s2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 esp32s2.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32s2.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32s2.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 +esp32s2.menu.PartitionScheme.zigbee_zczr_8MB=Zigbee ZCZR 8MB with spiffs +esp32s2.menu.PartitionScheme.zigbee_zczr_8MB.build.partitions=zigbee_zczr_8MB +esp32s2.menu.PartitionScheme.zigbee_zczr_8MB.upload.maximum_size=3407872 esp32s2.menu.PartitionScheme.custom=Custom esp32s2.menu.PartitionScheme.custom.build.partitions= esp32s2.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -1493,6 +1502,9 @@ esp32.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 esp32.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 +esp32.menu.PartitionScheme.zigbee_zczr_8MB=Zigbee ZCZR 8MB with spiffs +esp32.menu.PartitionScheme.zigbee_zczr_8MB.build.partitions=zigbee_zczr_8MB +esp32.menu.PartitionScheme.zigbee_zczr_8MB.upload.maximum_size=3407872 esp32.menu.PartitionScheme.custom=Custom esp32.menu.PartitionScheme.custom.build.partitions= esp32.menu.PartitionScheme.custom.upload.maximum_size=16777216 diff --git a/libraries/Zigbee/examples/Zigbee_Gateway/README.md b/libraries/Zigbee/examples/Zigbee_Gateway/README.md new file mode 100644 index 00000000000..4156538ccd9 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Gateway/README.md @@ -0,0 +1,64 @@ +# Arduino-ESP32 Zigbee Gateway Example + +This example shows how to configure Zigbee Gateway device, running on SoCs without native IEEE 802.15.4. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32 | ESP32-S2 | ESP32-S3 | ESP32-C3 | +| ----------------- | ----- | -------- | -------- | -------- | + +## Hardware Required + +* One development board (ESP32-H2 or ESP32-C6) acting as Zigbee Radio Co-processor loaded with [ot_rcp example](https://github.com/espressif/esp-idf/tree/master/examples/openthread/ot_rcp). +* A USB cable for power supply and programming. +* Choose another board from supported targets as Zigbee coordinator/router and upload the Zigbee_Gateway example. + +### Configure the Project + +Set the RCP connection (UART) by changing the `GATEWAY_RCP_UART_PORT`, `GATEWAY_RCP_RX_PIN` and `GATEWAY_RCP_TX_PIN` definition. + +#### 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 Coordinator Zigbee mode: `Tools -> Zigbee mode: Zigbee ZCZR (coordinator/router)`. +* 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 + +* In the Arduino IDE go to the Tools menu and set `Erase All Flash Before Sketch Upload` to `Enabled`. + +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_Gateway/Zigbee_Gateway.ino b/libraries/Zigbee/examples/Zigbee_Gateway/Zigbee_Gateway.ino new file mode 100644 index 00000000000..402227b9a3d --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Gateway/Zigbee_Gateway.ino @@ -0,0 +1,130 @@ +// 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 simple Zigbee Gateway functionality. + * + * The example demonstrates how to use Zigbee library on ESP32s to create a Zigbee Gateway, updating the time from NTP server. + * The Gateway is able to communicate with Zigbee end devices and send/receive data to/from them. + * The Gateway is also able to communicate with the cloud or other devices over Wi-Fi / BLE. + * + * Proper Zigbee mode must be selected in Tools->Zigbee mode->Zigbee ZCZR (coordinator/router) + * and also the correct partition scheme must be selected in Tools->Partition Scheme->Zigbee ZCZR + * + * 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_ZCZR +#error "Zigbee coordinator mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" +#include +#include "time.h" +#include "esp_sntp.h" + +/* Zigbee gateway configuration */ +#define GATEWAY_ENDPOINT_NUMBER 1 +#define GATEWAY_RCP_UART_PORT UART_NUM_1 // UART 0 is used for Serial communication +#define GATEWAY_RCP_RX_PIN 4 +#define GATEWAY_RCP_TX_PIN 5 + +ZigbeeGateway zbGateway = ZigbeeGateway(GATEWAY_ENDPOINT_NUMBER); + +/* Wi-Fi credentials */ +const char *ssid = "your-ssid"; +const char *password = "your-password"; + +/* NTP server configuration */ +const char *ntpServer1 = "pool.ntp.org"; +const char *ntpServer2 = "time.nist.gov"; +const long gmtOffset_sec = 3600; +const int daylightOffset_sec = 3600; +const char *time_zone = "CET-1CEST,M3.5.0,M10.5.0/3"; // TimeZone rule for Europe/Rome including daylight adjustment rules (optional) + +/* Time structure */ +struct tm timeinfo; + +/********************* Arduino functions **************************/ +void setup() { + Serial.begin(115200); + + // Initialize Wi-Fi and connect to AP + WiFi.begin(ssid, password); + esp_sntp_servermode_dhcp(1); // (optional) + + Serial.print("Connecting to WiFi"); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println("WiFi connected"); + + // Initialize Zigbee and Begin Zigbee stack + // Optional: set Zigbee device name and model + zbGateway.setManufacturerAndModel("Espressif", "ZigbeeGateway"); + zbGateway.addTimeCluster(timeinfo, gmtOffset_sec); + + // Add endpoint to Zigbee Core + Serial.println("Adding Zigbee Gateway endpoint"); + Zigbee.addEndpoint(&zbGateway); + + // Optional: Open network for 180 seconds after boot + Zigbee.setRebootOpenNetwork(180); + + // Set custom radio configuration for RCP communication + esp_zb_radio_config_t radio_config = ZIGBEE_DEFAULT_UART_RCP_RADIO_CONFIG(); + radio_config.radio_uart_config.port = GATEWAY_RCP_UART_PORT; + radio_config.radio_uart_config.rx_pin = (gpio_num_t)GATEWAY_RCP_RX_PIN; + radio_config.radio_uart_config.tx_pin = (gpio_num_t)GATEWAY_RCP_TX_PIN; + + Zigbee.setRadioConfig(radio_config); + + // When all EPs are registered, start Zigbee with ZIGBEE_COORDINATOR or ZIGBEE_ROUTER mode + if (!Zigbee.begin(ZIGBEE_COORDINATOR)) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } + + // set notification call-back function + sntp_set_time_sync_notification_cb(timeavailable); + sntp_set_sync_interval(30000); // sync every 30 seconds + + // config time zone and NTP servers + configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2); +} + +void loop() { + // Nothing to do here in this example +} + +void printLocalTime() { + if (!getLocalTime(&timeinfo)) { + Serial.println("No time available (yet)"); + return; + } + Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); + zbGateway.setTime(timeinfo); + Serial.println("Time updated in Zigbee Gateway"); +} + +// Callback function (gets called when time adjusts via NTP) +void timeavailable(struct timeval *t) { + Serial.println("Got time adjustment from NTP!"); + printLocalTime(); +} diff --git a/libraries/Zigbee/examples/Zigbee_Gateway/ci.json b/libraries/Zigbee/examples/Zigbee_Gateway/ci.json new file mode 100644 index 00000000000..23e1c59d1da --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Gateway/ci.json @@ -0,0 +1,10 @@ +{ + "fqbn_append": "PartitionScheme=zigbee_zczr_8MB,ZigbeeMode=zczr", + "requires": [ + "CONFIG_ZB_ENABLED=y" + ], + "targets": { + "esp32c6": false, + "esp32h2": false + } +} diff --git a/libraries/Zigbee/keywords.txt b/libraries/Zigbee/keywords.txt index 483d54eb712..2eeed5878a7 100644 --- a/libraries/Zigbee/keywords.txt +++ b/libraries/Zigbee/keywords.txt @@ -21,12 +21,22 @@ ZigbeeThermostat KEYWORD1 ZigbeeFlowSensor KEYWORD1 ZigbeePressureSensor KEYWORD1 ZigbeeOccupancySensor KEYWORD1 +ZigbeeAnalog KEYWORD1 +ZigbeeCarbonDioxideSensor KEYWORD1 +ZigbeeContactSwitch KEYWORD1 +ZigbeeDoorWindowHandle KEYWORD1 +ZigbeeGateway KEYWORD1 +ZigbeeRangeExtender KEYWORD1 +ZigbeeVibrationSensor KEYWORD1 +ZigbeeWindowCovering KEYWORD1 # Other zigbee_role_t KEYWORD1 zbstring_t KEYWORD1 zb_device_params_t KEYWORD1 zigbee_scan_result_t KEYWORD1 +zb_power_source_t KEYWORD1 +ZigbeeWindowCoveringType KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -126,6 +136,43 @@ setSensorType KEYWORD2 # ZigbeeCarbonDioxideSensor setCarbonDioxide KEYWORD2 +# ZigbeeAnalog +addAnalogValue KEYWORD2 +addAnalogInput KEYWORD2 +addAnalogOutput KEYWORD2 +onAnalogOutputChange KEYWORD2 +setAnalogValue KEYWORD2 +setAnalogInput KEYWORD2 +reportAnalogInput KEYWORD2 +setAnalogInputReporting KEYWORD2 + +# ZigbeeCarbonDioxideSensor +setCarbonDioxide KEYWORD2 + +# ZigbeeContactSwitch + ZigbeeDoorWindowHandle +setIASClientEndpoint KEYWORD2 +setClosed KEYWORD2 +setOpen KEYWORD2 +setTilted KEYWORD2 + +# ZigbeeVibrationSensor +setVibration KEYWORD2 + +ZigbeeWindowCovering +onOpen KEYWORD2 +onClose KEYWORD2 +onGoToLiftPercentage KEYWORD2 +onGoToTiltPercentage KEYWORD2 +onStop KEYWORD2 +setLiftPosition KEYWORD2 +setLiftPercentage KEYWORD2 +setTiltPosition KEYWORD2 +setTiltPercentage KEYWORD2 +setCoveringType KEYWORD2 +setConfigStatus KEYWORD2 +setMode KEYWORD2 +setLimits KEYWORD2 + ####################################### # Constants (LITERAL1) ####################################### @@ -137,7 +184,6 @@ ZIGBEE_DEFAULT_ED_CONFIG LITERAL1 ZIGBEE_DEFAULT_ROUTER_CONFIG LITERAL1 ZIGBEE_DEFAULT_COORDINATOR_CONFIG LITERAL1 ZIGBEE_DEFAULT_RADIO_CONFIG LITERAL1 +ZIGBEE_DEFAULT_UART_RCP_RADIO_CONFIG LITERAL1 ZIGBEE_DEFAULT_HOST_CONFIG LITERAL1 ZB_ARRAY_LENTH LITERAL1 -XYZ_TO_RGB LITERAL1 -RGB_TO_XYZ LITERAL1 diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index c8e7481e58f..9ccf1e7d8f2 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -24,3 +24,4 @@ #include "ep/ZigbeeWindowCovering.h" #include "ep/ZigbeeVibrationSensor.h" #include "ep/ZigbeeRangeExtender.h" +#include "ep/ZigbeeGateway.h" diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index 0fad546bb15..bd5849bb4b8 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -87,7 +87,11 @@ void ZigbeeCore::addEndpoint(ZigbeeEP *ep) { return; } - esp_zb_ep_list_add_ep(_zb_ep_list, ep->_cluster_list, ep->_ep_config); + if (ep->_device_id == ESP_ZB_HA_HOME_GATEWAY_DEVICE_ID) { + esp_zb_ep_list_add_gateway_ep(_zb_ep_list, ep->_cluster_list, ep->_ep_config); + } else { + esp_zb_ep_list_add_ep(_zb_ep_list, ep->_cluster_list, ep->_ep_config); + } } static void esp_zb_task(void *pvParameters) { @@ -156,7 +160,7 @@ bool ZigbeeCore::zigbeeInit(esp_zb_cfg_t *zb_cfg, bool erase_nvs) { } // Create Zigbee task and start Zigbee stack - xTaskCreate(esp_zb_task, "Zigbee_main", 4096, NULL, 5, NULL); + xTaskCreate(esp_zb_task, "Zigbee_main", 8192, NULL, 5, NULL); return true; } diff --git a/libraries/Zigbee/src/ZigbeeCore.h b/libraries/Zigbee/src/ZigbeeCore.h index 1d6e32babe0..a26e17e58a7 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -60,6 +60,26 @@ typedef enum { } \ } +#define ZIGBEE_DEFAULT_UART_RCP_RADIO_CONFIG() \ + { \ + .radio_mode = ZB_RADIO_MODE_UART_RCP, \ + .radio_uart_config = { \ + .port = UART_NUM_1, \ + .rx_pin = GPIO_NUM_NC, \ + .tx_pin = GPIO_NUM_NC, \ + .uart_config = \ + { \ + .baud_rate = 460800, \ + .data_bits = UART_DATA_8_BITS, \ + .parity = UART_PARITY_DISABLE, \ + .stop_bits = UART_STOP_BITS_1, \ + .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, \ + .rx_flow_ctrl_thresh = 0, \ + .source_clk = UART_SCLK_DEFAULT, \ + }, \ + }, \ + } + class ZigbeeCore { private: esp_zb_radio_config_t _radio_config; diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index 8320215707b..6774e9111f1 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -19,6 +19,7 @@ ZigbeeEP::ZigbeeEP(uint8_t endpoint) { _ep_config.endpoint = 0; _cluster_list = nullptr; _on_identify = nullptr; + _time_status = 0; if (!lock) { lock = xSemaphoreCreateBinary(); if (lock == NULL) { @@ -240,7 +241,6 @@ 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 @@ -251,6 +251,7 @@ void ZigbeeEP::addTimeCluster(tm time, int32_t gmt_offset) { 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); + esp_zb_time_cluster_add_attr(time_cluster_server, ESP_ZB_ZCL_ATTR_TIME_TIME_STATUS_ID, (void *)&_time_status); // 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 @@ -260,6 +261,7 @@ void ZigbeeEP::addTimeCluster(tm time, int32_t gmt_offset) { void ZigbeeEP::setTime(tm time) { time_t utc_time = mktime(&time); + log_d("Setting time to %lld", utc_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(); @@ -306,6 +308,16 @@ tm ZigbeeEP::getTime(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_addr_t ie struct tm *timeinfo = localtime(&_read_time); if (timeinfo) { + // Update time + setTime(*timeinfo); + // Update time status to synced + _time_status |= 0x02; + 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_STATUS_ID, &_time_status, false + ); + esp_zb_lock_release(); + return *timeinfo; } else { log_e("Error while converting time"); @@ -343,8 +355,9 @@ int32_t ZigbeeEP::getTimezone(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_ //Wait for response or timeout if (xSemaphoreTake(lock, ZB_CMD_TIMEOUT) != pdTRUE) { log_e("Error while reading timezone"); + return 0; } - + setTimezone(_read_timezone); return _read_timezone; } diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index 14b9ff61040..0a4e3e9d252 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -153,6 +153,7 @@ class ZigbeeEP { std::list _bound_devices; SemaphoreHandle_t lock; zb_power_source_t _power_source; + uint8_t _time_status; friend class ZigbeeCore; }; diff --git a/libraries/Zigbee/src/ep/ZigbeeGateway.cpp b/libraries/Zigbee/src/ep/ZigbeeGateway.cpp new file mode 100644 index 00000000000..b0be81395ca --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeGateway.cpp @@ -0,0 +1,15 @@ +#include "ZigbeeGateway.h" +#if CONFIG_ZB_ENABLED + +ZigbeeGateway::ZigbeeGateway(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_HOME_GATEWAY_DEVICE_ID; + + _cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(_cluster_list, esp_zb_basic_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(_cluster_list, esp_zb_identify_cluster_create(NULL), 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_CLIENT_ROLE); + + _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_HOME_GATEWAY_DEVICE_ID, .app_device_version = 0}; +} + +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeGateway.h b/libraries/Zigbee/src/ep/ZigbeeGateway.h new file mode 100644 index 00000000000..3925630c0b8 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeGateway.h @@ -0,0 +1,18 @@ +/* Class of Zigbee Gateway endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +class ZigbeeGateway : public ZigbeeEP { +public: + ZigbeeGateway(uint8_t endpoint); + ~ZigbeeGateway() {} +}; + +#endif // CONFIG_ZB_ENABLED From e3bcc58672d39574f3a4fbe3c8c0b2f1844cc202 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 26 Feb 2025 06:49:42 -0300 Subject: [PATCH 029/290] ci(esp32p4): Add missing options for P4 (#11014) Co-authored-by: Rodrigo Garcia --- tests/validation/democfg/ci.json | 7 ++++--- tests/validation/nvs/ci.json | 6 ++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/validation/democfg/ci.json b/tests/validation/democfg/ci.json index e4f275a4bca..cf5c796644e 100644 --- a/tests/validation/democfg/ci.json +++ b/tests/validation/democfg/ci.json @@ -14,17 +14,18 @@ "platforms": { "hardware": true, "qemu": false, - "wokwi": true + "wokwi": false }, "requires": [ "CONFIG_SOC_UART_SUPPORTED=y" ], "targets": { "esp32": true, - "esp32c3": true, + "esp32c3": false, "esp32c6": true, "esp32h2": false, "esp32s2": true, - "esp32s3": true + "esp32s3": true, + "esp32p4": false } } diff --git a/tests/validation/nvs/ci.json b/tests/validation/nvs/ci.json index bddf221e3c0..7f8ce83ec54 100644 --- a/tests/validation/nvs/ci.json +++ b/tests/validation/nvs/ci.json @@ -28,6 +28,12 @@ "espressif:esp32:esp32s3:PSRAM=opi,USBMode=default,PartitionScheme=huge_app,FlashMode=qio", "espressif:esp32:esp32s3:PSRAM=opi,USBMode=default,PartitionScheme=huge_app,FlashMode=qio120", "espressif:esp32:esp32s3:PSRAM=opi,USBMode=default,PartitionScheme=huge_app,FlashMode=dio" + ], + "esp32p4": [ + "espressif:esp32:esp32p4:PSRAM=enabled,USBMode=default,PartitionScheme=huge_app,FlashMode=dio", + "espressif:esp32:esp32p4:PSRAM=enabled,USBMode=default,PartitionScheme=huge_app,FlashMode=dio,FlashFreq=40", + "espressif:esp32:esp32p4:PSRAM=enabled,USBMode=default,PartitionScheme=huge_app,FlashMode=qio", + "espressif:esp32:esp32p4:PSRAM=enabled,USBMode=default,PartitionScheme=huge_app,FlashMode=qio,FlashFreq=40" ] }, "platforms": { From 7575fa0ce8fc8eb3cf886fe28ef1bd881cbbe01d Mon Sep 17 00:00:00 2001 From: oddlama Date: Wed, 26 Feb 2025 10:50:28 +0100 Subject: [PATCH 030/290] fix(zigbee): use correct carbon dioxide cluster function in setTolerance (#11015) * fix(zigbee): use correct carbon dioxide cluster function in setTolerance * 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/ep/ZigbeeCarbonDioxideSensor.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp index 15e13d04d7e..f7c0a19bc78 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp @@ -37,7 +37,9 @@ 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); + esp_zb_carbon_dioxide_measurement_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) { From 684a9312e6e117cefc67ade4da7d9f0b700dc020 Mon Sep 17 00:00:00 2001 From: iranl Date: Wed, 5 Mar 2025 11:45:11 +0100 Subject: [PATCH 031/290] fix(bt): Compile error on ESP32-P4 (#11035) * fix(bt): Fix compile error on ESP32-P4 * fix(bt): Fix compile error on ESP32-P4 --- cores/esp32/esp32-hal-misc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cores/esp32/esp32-hal-misc.c b/cores/esp32/esp32-hal-misc.c index 02871872f83..50e2973d27a 100644 --- a/cores/esp32/esp32-hal-misc.c +++ b/cores/esp32/esp32-hal-misc.c @@ -25,7 +25,7 @@ #include "esp_ota_ops.h" #endif //CONFIG_APP_ROLLBACK_ENABLE #include "esp_private/startup_internal.h" -#ifdef CONFIG_BT_ENABLED +#if defined(CONFIG_BT_ENABLED) && SOC_BT_SUPPORTED #include "esp_bt.h" #endif //CONFIG_BT_ENABLED #include @@ -305,7 +305,7 @@ void initArduino() { if (err) { log_e("Failed to initialize NVS! Error: %u", err); } -#ifdef CONFIG_BT_ENABLED +#if defined(CONFIG_BT_ENABLED) && SOC_BT_SUPPORTED if (!btInUse()) { esp_bt_controller_mem_release(ESP_BT_MODE_BTDM); } From 9e2f75564127a9853f80f3eb637b264406cb2f30 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 5 Mar 2025 08:33:20 -0300 Subject: [PATCH 032/290] test(i2c): Add test to scan bus (#11022) * test(i2c): Add test to scan bus * test(i2c): Add scan test with wifi running * fix(i2c): Simplify test --- tests/validation/i2c_master/i2c_master.ino | 48 ++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tests/validation/i2c_master/i2c_master.ino b/tests/validation/i2c_master/i2c_master.ino index 3c7b2d9824a..9b4cc508a35 100644 --- a/tests/validation/i2c_master/i2c_master.ino +++ b/tests/validation/i2c_master/i2c_master.ino @@ -5,6 +5,11 @@ #include #include #include +#include +#include +#include + +#include "sdkconfig.h" /* DS1307 functions */ @@ -24,6 +29,9 @@ static uint8_t read_month = 0; static uint16_t read_year = 0; static int peek_data = -1; +const char *ssid = "Wokwi-GUEST"; +const char *password = ""; + const auto BCD2DEC = [](uint8_t num) -> uint8_t { return ((num / 16 * 10) + (num % 16)); }; @@ -245,6 +253,42 @@ void test_api() { Wire.flush(); } +bool device_found() { + uint8_t err; + + for (uint8_t address = 1; address < 127; ++address) { + Wire.beginTransmission(address); + err = Wire.endTransmission(); + log_d("Address: 0x%02X, Error: %d", address, err); + if (err == 0) { + log_i("Found device at address: 0x%02X", address); + } else if (address == DS1307_ADDR) { + log_e("Failed to find DS1307"); + return false; + } + } + + return true; +} + +void scan_bus() { + TEST_ASSERT_TRUE(device_found()); +} + +#if SOC_WIFI_SUPPORTED +void scan_bus_with_wifi() { + // delete old config + WiFi.disconnect(true, true, 1000); + delay(1000); + WiFi.begin(ssid, password); + delay(5000); + bool found = device_found(); + WiFi.disconnect(true, true, 1000); + + TEST_ASSERT_TRUE(found); +} +#endif + /* Main */ void setup() { @@ -258,6 +302,10 @@ void setup() { log_d("Starting tests"); UNITY_BEGIN(); + RUN_TEST(scan_bus); +#if SOC_WIFI_SUPPORTED + RUN_TEST(scan_bus_with_wifi); +#endif RUN_TEST(rtc_set_time); RUN_TEST(rtc_run_clock); RUN_TEST(change_clock); From fb5f11b638b377398e6320d48065e8515248d527 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Fri, 7 Mar 2025 19:00:58 -0300 Subject: [PATCH 033/290] feat(matter): necessary changes to insights version for esp_matter (#11042) * feat(matter): necessary changes to insights version for esp_matter * feat(rainmaker): update RainMaker version to 1.5.2 --- idf_component.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/idf_component.yml b/idf_component.yml index 94a69caec2f..967c4ecf0f6 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -69,7 +69,7 @@ dependencies: espressif/network_provisioning: version: "1.0.2" espressif/esp_rainmaker: - version: "1.5.0" + version: "1.5.2" rules: - if: "target not in [esp32c2, esp32p4]" espressif/rmaker_common: @@ -77,16 +77,16 @@ dependencies: rules: - if: "target not in [esp32c2, esp32p4]" espressif/esp_insights: - version: "1.0.1" + version: "1.2.2" rules: - if: "target not in [esp32c2, esp32p4]" # New version breaks esp_insights 1.0.1 espressif/esp_diag_data_store: - version: "1.0.1" + version: "1.0.2" rules: - if: "target not in [esp32c2, esp32p4]" espressif/esp_diagnostics: - version: "1.0.2" + version: "1.2.1" rules: - if: "target not in [esp32c2, esp32p4]" espressif/cbor: From efb02d30ac1b863490a9de49374b18890e84b1f3 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Sun, 9 Mar 2025 08:20:59 -0300 Subject: [PATCH 034/290] feat(gpio): allows mixing digital and analog read/write operations (#11016) * feat(gpio): allows mixing digital and analog read/write operations * fix(gpio): simple mistake in calling __pinMode() fnuction * fix(gpio): simple mistake in calling __pinMode() fnuction * feat(gpio): update the log message to tell the solution for the error. * feat(gpio): warn user about digitalRead() used with non GPIO pin * fix(gpio): wrong peripheral manager test case --- cores/esp32/esp32-hal-gpio.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index b11636daf81..c681be077b3 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -173,7 +173,7 @@ extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val) { if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL) { gpio_set_level((gpio_num_t)pin, val); } else { - log_e("IO %i is not set as GPIO.", pin); + log_e("IO %i is not set as GPIO. Execute digitalMode(%i, OUTPUT) first.", pin, pin); } } @@ -182,14 +182,12 @@ extern int ARDUINO_ISR_ATTR __digitalRead(uint8_t pin) { if (pin == RGB_BUILTIN) { return RGB_BUILTIN_storage; } -#endif - - if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL) { - return gpio_get_level((gpio_num_t)pin); - } else { - log_e("IO %i is not set as GPIO.", pin); - return 0; +#endif // RGB_BUILTIN + // This work when the pin is set as GPIO and in INPUT mode. For all other pin functions, it may return inconsistent response + if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL) { + log_w("IO %i is not set as GPIO. digitalRead() may return an inconsistent value."); } + return gpio_get_level((gpio_num_t)pin); } static void ARDUINO_ISR_ATTR __onPinInterrupt(void *arg) { From 4677ea6ad82d3bb78bec9b10edbe2745fe5a0fc0 Mon Sep 17 00:00:00 2001 From: Oli Date: Mon, 10 Mar 2025 11:53:43 +0000 Subject: [PATCH 035/290] Fix to issue #11044 (#11064) Fix to a copy-paste error that causes a Guru Meditation crash with Zigbee Analog Example. --- libraries/Zigbee/src/ep/ZigbeeAnalog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp index 9d1b53fd310..b6d581450aa 100644 --- a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp @@ -105,7 +105,7 @@ void ZigbeeAnalog::setAnalogInputReporting(uint16_t min_interval, uint16_t max_i 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_id = ESP_ZB_ZCL_CLUSTER_ID_ANALOG_INPUT; 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; From 8575d04ab54789bac24ebe3a1c6428a8246ac897 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Mon, 10 Mar 2025 21:19:22 +0200 Subject: [PATCH 036/290] fix(eth): Fix RMII Ethernet not being able to be restarted (#11048) --- libraries/Ethernet/src/ETH.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/libraries/Ethernet/src/ETH.cpp b/libraries/Ethernet/src/ETH.cpp index bf63de8724d..f347616c340 100644 --- a/libraries/Ethernet/src/ETH.cpp +++ b/libraries/Ethernet/src/ETH.cpp @@ -271,8 +271,8 @@ bool ETHClass::begin(eth_phy_type_t type, int32_t phy_addr, int mdc, int mdio, i eth_mac_config.sw_reset_timeout_ms = 1000; eth_mac_config.rx_task_stack_size = _task_stack_size; - esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&mac_config, ð_mac_config); - if (mac == NULL) { + _mac = esp_eth_mac_new_esp32(&mac_config, ð_mac_config); + if (_mac == NULL) { log_e("esp_eth_mac_new_esp32 failed"); return false; } @@ -281,26 +281,25 @@ bool ETHClass::begin(eth_phy_type_t type, int32_t phy_addr, int mdc, int mdio, i phy_config.phy_addr = phy_addr; phy_config.reset_gpio_num = _pin_power; - esp_eth_phy_t *phy = NULL; switch (type) { #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) - case ETH_PHY_GENERIC: phy = esp_eth_phy_new_generic(&phy_config); break; + case ETH_PHY_GENERIC: _phy = esp_eth_phy_new_generic(&phy_config); break; #endif - case ETH_PHY_LAN8720: phy = esp_eth_phy_new_lan87xx(&phy_config); break; - case ETH_PHY_TLK110: phy = esp_eth_phy_new_ip101(&phy_config); break; - case ETH_PHY_RTL8201: phy = esp_eth_phy_new_rtl8201(&phy_config); break; - case ETH_PHY_DP83848: phy = esp_eth_phy_new_dp83848(&phy_config); break; - case ETH_PHY_KSZ8041: phy = esp_eth_phy_new_ksz80xx(&phy_config); break; - case ETH_PHY_KSZ8081: phy = esp_eth_phy_new_ksz80xx(&phy_config); break; + case ETH_PHY_LAN8720: _phy = esp_eth_phy_new_lan87xx(&phy_config); break; + case ETH_PHY_TLK110: _phy = esp_eth_phy_new_ip101(&phy_config); break; + case ETH_PHY_RTL8201: _phy = esp_eth_phy_new_rtl8201(&phy_config); break; + case ETH_PHY_DP83848: _phy = esp_eth_phy_new_dp83848(&phy_config); break; + case ETH_PHY_KSZ8041: _phy = esp_eth_phy_new_ksz80xx(&phy_config); break; + case ETH_PHY_KSZ8081: _phy = esp_eth_phy_new_ksz80xx(&phy_config); break; default: log_e("Unsupported PHY %d", type); break; } - if (phy == NULL) { + if (_phy == NULL) { log_e("esp_eth_phy_new failed"); return false; } _eth_handle = NULL; - esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(mac, phy); + esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(_mac, _phy); ret = esp_eth_driver_install(ð_config, &_eth_handle); if (ret != ESP_OK) { log_e("Ethernet driver install failed: %d", ret); From eeb6a26ed1e25e723b9660986567ddd1c174d27c Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Mon, 10 Mar 2025 21:19:46 +0200 Subject: [PATCH 037/290] fix(wifi): Disable properly LR mode if it was enabled before (#11052) * fix(wifi): Disable properly LR mode if it was enabled before * 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/WiFi/src/WiFiGeneric.cpp | 70 ++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 19 deletions(-) diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index 40e3b12c687..aa994963514 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -308,7 +308,7 @@ bool wifiLowLevelInit(bool persistent) { esp_err_t err = esp_wifi_init(&cfg); if (err) { - log_e("esp_wifi_init %d", err); + log_e("esp_wifi_init 0x%x: %s", err, esp_err_to_name(err)); lowLevelInitDone = false; return lowLevelInitDone; } @@ -375,7 +375,7 @@ static bool espWiFiStart() { esp_err_t err = esp_wifi_start(); if (err != ESP_OK) { _esp_wifi_started = false; - log_e("esp_wifi_start %d", err); + log_e("esp_wifi_start 0x%x: %s", err, esp_err_to_name(err)); return _esp_wifi_started; } return _esp_wifi_started; @@ -389,7 +389,7 @@ static bool espWiFiStop() { _esp_wifi_started = false; err = esp_wifi_stop(); if (err) { - log_e("Could not stop WiFi! %d", err); + log_e("Could not stop WiFi! 0x%x: %s", err, esp_err_to_name(err)); _esp_wifi_started = true; return false; } @@ -478,7 +478,7 @@ int WiFiGenericClass::setChannel(uint8_t primary, wifi_second_chan_t secondary) ret = esp_wifi_get_country(&country); if (ret != ESP_OK) { - log_e("Failed to get country info"); + log_e("Failed to get country info 0x%x: %s", ret, esp_err_to_name(ret)); return ret; } @@ -492,7 +492,7 @@ int WiFiGenericClass::setChannel(uint8_t primary, wifi_second_chan_t secondary) ret = esp_wifi_set_channel(primary, secondary); if (ret != ESP_OK) { - log_e("Failed to set channel"); + log_e("Failed to set channel 0x%x: %s", ret, esp_err_to_name(ret)); return ret; } @@ -562,13 +562,13 @@ bool WiFiGenericClass::mode(wifi_mode_t m) { if (((m & WIFI_MODE_STA) != 0) && ((cm & WIFI_MODE_STA) == 0)) { err = esp_netif_set_hostname(esp_netifs[ESP_IF_WIFI_STA], NetworkManager::getHostname()); if (err) { - log_e("Could not set hostname! %d", err); + log_e("Could not set hostname! 0x%x: %s", err, esp_err_to_name(err)); return false; } } err = esp_wifi_set_mode(m); if (err) { - log_e("Could not set mode! %d", err); + log_e("Could not set mode! 0x%x: %s", err, esp_err_to_name(err)); return false; } @@ -585,17 +585,44 @@ bool WiFiGenericClass::mode(wifi_mode_t m) { if (m & WIFI_MODE_STA) { err = esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_LR); if (err != ESP_OK) { - log_e("Could not enable long range on STA! %d", err); + log_e("Could not enable long range on STA! 0x%x: %s", err, esp_err_to_name(err)); return false; } } if (m & WIFI_MODE_AP) { err = esp_wifi_set_protocol(WIFI_IF_AP, WIFI_PROTOCOL_LR); if (err != ESP_OK) { - log_e("Could not enable long range on AP! %d", err); + log_e("Could not enable long range on AP! 0x%x: %s", err, esp_err_to_name(err)); return false; } } + } else { +#if CONFIG_SOC_WIFI_HE_SUPPORT +#define WIFI_PROTOCOL_DEFAULT (WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N | WIFI_PROTOCOL_11AX) +#else +#define WIFI_PROTOCOL_DEFAULT (WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N) +#endif + uint8_t current_protocol = 0; + if (m & WIFI_MODE_STA) { + err = esp_wifi_get_protocol(WIFI_IF_STA, ¤t_protocol); + if (err == ESP_OK && current_protocol == WIFI_PROTOCOL_LR) { + log_v("Disabling long range on STA"); + err = esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_DEFAULT); + if (err != ESP_OK) { + log_e("Could not disable long range on STA! 0x%x: %s", err, esp_err_to_name(err)); + } + } + } + if (m & WIFI_MODE_AP) { + err = esp_wifi_get_protocol(WIFI_IF_AP, ¤t_protocol); + if (err == ESP_OK && current_protocol == WIFI_PROTOCOL_LR) { + log_v("Disabling long range on AP"); + err = esp_wifi_set_protocol(WIFI_IF_AP, WIFI_PROTOCOL_DEFAULT); + if (err != ESP_OK) { + log_e("Could not disable long range on AP! 0x%x: %s", err, esp_err_to_name(err)); + } + } + } } if (!espWiFiStart()) { return false; @@ -683,8 +710,9 @@ bool WiFiGenericClass::setSleep(wifi_ps_type_t sleepType) { if (sleepType != _sleepEnabled) { _sleepEnabled = sleepType; if (WiFi.STA.started()) { - if (esp_wifi_set_ps(_sleepEnabled) != ESP_OK) { - log_e("esp_wifi_set_ps failed!"); + esp_err_t err = esp_wifi_set_ps(_sleepEnabled); + if (err != ESP_OK) { + log_e("esp_wifi_set_ps failed!: 0x%x: %s", err, esp_err_to_name(err)); return false; } } @@ -748,8 +776,9 @@ bool WiFiGenericClass::initiateFTM(uint8_t frm_count, uint16_t burst_period, uin memcpy(ftmi_cfg.resp_mac, mac, 6); } // Request FTM session with the Responder - if (ESP_OK != esp_wifi_ftm_initiate_session(&ftmi_cfg)) { - log_e("Failed to initiate FTM session"); + esp_err_t err = esp_wifi_ftm_initiate_session(&ftmi_cfg); + if (ESP_OK != err) { + log_e("Failed to initiate FTM session: 0x%x: %s", err, esp_err_to_name(err)); return false; } return true; @@ -768,8 +797,9 @@ bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2 esp_phy_ant_gpio_config_t wifi_ant_io; - if (ESP_OK != esp_phy_get_ant_gpio(&wifi_ant_io)) { - log_e("Failed to get antenna configuration"); + esp_err_t err = esp_phy_get_ant_gpio(&wifi_ant_io); + if (ESP_OK != err) { + log_e("Failed to get antenna configuration: 0x%x: %s", err, esp_err_to_name(err)); return false; } @@ -778,8 +808,9 @@ bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2 wifi_ant_io.gpio_cfg[1].gpio_num = gpio_ant2; wifi_ant_io.gpio_cfg[1].gpio_select = 1; - if (ESP_OK != esp_phy_set_ant_gpio(&wifi_ant_io)) { - log_e("Failed to set antenna GPIO configuration"); + err = esp_phy_set_ant_gpio(&wifi_ant_io); + if (ESP_OK != err) { + log_e("Failed to set antenna GPIO configuration: 0x%x: %s", err, esp_err_to_name(err)); return false; } @@ -827,8 +858,9 @@ bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2 } set_ant: - if (ESP_OK != esp_phy_set_ant(&ant_config)) { - log_e("Failed to set antenna configuration"); + err = esp_phy_set_ant(&ant_config); + if (ESP_OK != err) { + log_e("Failed to set antenna configuration: 0x%x: %s", err, esp_err_to_name(err)); return false; } #endif From bf5265c7d8330d741993bc977c7eb1bfcf8716e1 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Mon, 10 Mar 2025 21:20:07 +0200 Subject: [PATCH 038/290] feat(eth): Add setters for negotiation, speed and duplex modes (#11053) * feat(eth): Add setters for negotiation, speed and duplex modes * 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 | 37 +++++++++++++++++++++++++++++++++- libraries/Ethernet/src/ETH.h | 8 +++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/libraries/Ethernet/src/ETH.cpp b/libraries/Ethernet/src/ETH.cpp index f347616c340..542a7e2a218 100644 --- a/libraries/Ethernet/src/ETH.cpp +++ b/libraries/Ethernet/src/ETH.cpp @@ -1009,6 +1009,18 @@ bool ETHClass::fullDuplex() const { return (link_duplex == ETH_DUPLEX_FULL); } +bool ETHClass::setFullDuplex(bool on) { + if (_eth_handle == NULL) { + return false; + } + eth_duplex_t link_duplex = on ? ETH_DUPLEX_FULL : ETH_DUPLEX_HALF; + esp_err_t err = esp_eth_ioctl(_eth_handle, ETH_CMD_S_DUPLEX_MODE, &link_duplex); + if (err != ESP_OK) { + log_e("Failed to set duplex mode: 0x%x: %s", err, esp_err_to_name(err)); + } + return err == ESP_OK; +} + bool ETHClass::autoNegotiation() const { if (_eth_handle == NULL) { return false; @@ -1018,6 +1030,17 @@ bool ETHClass::autoNegotiation() const { return auto_nego; } +bool ETHClass::setAutoNegotiation(bool on) { + if (_eth_handle == NULL) { + return false; + } + esp_err_t err = esp_eth_ioctl(_eth_handle, ETH_CMD_S_AUTONEGO, &on); + if (err != ESP_OK) { + log_e("Failed to set auto negotiation: 0x%x: %s", err, esp_err_to_name(err)); + } + return err == ESP_OK; +} + uint32_t ETHClass::phyAddr() const { if (_eth_handle == NULL) { return 0; @@ -1027,7 +1050,7 @@ uint32_t ETHClass::phyAddr() const { return phy_addr; } -uint8_t ETHClass::linkSpeed() const { +uint16_t ETHClass::linkSpeed() const { if (_eth_handle == NULL) { return 0; } @@ -1036,6 +1059,18 @@ uint8_t ETHClass::linkSpeed() const { return (link_speed == ETH_SPEED_10M) ? 10 : 100; } +bool ETHClass::setLinkSpeed(uint16_t speed) { + if (_eth_handle == NULL) { + return false; + } + eth_speed_t link_speed = (speed == 10) ? ETH_SPEED_10M : ETH_SPEED_100M; + esp_err_t err = esp_eth_ioctl(_eth_handle, ETH_CMD_S_SPEED, &link_speed); + if (err != ESP_OK) { + log_e("Failed to set link speed: 0x%x: %s", err, esp_err_to_name(err)); + } + return err == ESP_OK; +} + // void ETHClass::getMac(uint8_t* mac) // { // if(_eth_handle != NULL && mac != NULL){ diff --git a/libraries/Ethernet/src/ETH.h b/libraries/Ethernet/src/ETH.h index cbddac065b9..891863e34bf 100644 --- a/libraries/Ethernet/src/ETH.h +++ b/libraries/Ethernet/src/ETH.h @@ -192,8 +192,14 @@ class ETHClass : public NetworkInterface { // ETH Handle APIs bool fullDuplex() const; - uint8_t linkSpeed() const; + bool setFullDuplex(bool on); + + uint16_t linkSpeed() const; + bool setLinkSpeed(uint16_t speed); //10 or 100 + bool autoNegotiation() const; + bool setAutoNegotiation(bool on); + uint32_t phyAddr() const; esp_eth_handle_t handle() const; From 665d6f8e8d2dec4e2ea7835d02d2033c9c5c788f 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, 10 Mar 2025 20:20:34 +0100 Subject: [PATCH 039/290] fix(zigbee): Use correct attributeID in setAnalogInputReporting (#11065) --- libraries/Zigbee/src/ep/ZigbeeAnalog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp index b6d581450aa..92cfaa09da6 100644 --- a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp @@ -107,7 +107,7 @@ void ZigbeeAnalog::setAnalogInputReporting(uint16_t min_interval, uint16_t max_i reporting_info.ep = _endpoint; reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_ANALOG_INPUT; reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; - reporting_info.attr_id = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID; + reporting_info.attr_id = ESP_ZB_ZCL_ATTR_ANALOG_INPUT_PRESENT_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; From 2276f0b79401ffd63f7719975461dd0c5f68155a 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, 10 Mar 2025 20:21:00 +0100 Subject: [PATCH 040/290] fix(zigbee): Add manuf_code to report attribure commands (#11066) --- .../Zigbee_Temp_Hum_Sensor_Sleepy.ino | 4 ++-- libraries/Zigbee/src/ep/ZigbeeAnalog.cpp | 1 + libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp | 1 + libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp | 1 + libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp | 1 + libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp | 1 + libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp | 2 ++ 7 files changed, 9 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 60bd784cca9..65df4b02957 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 @@ -125,8 +125,8 @@ void loop() { 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 + if ((millis() - startTime) > 10000) { + // If key pressed for more than 10secs, 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/ep/ZigbeeAnalog.cpp b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp index 92cfaa09da6..417eeb6d98c 100644 --- a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp @@ -93,6 +93,7 @@ void ZigbeeAnalog::reportAnalogInput() { report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_ANALOG_INPUT; report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp index f7c0a19bc78..2718d9275c2 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp @@ -85,6 +85,7 @@ void ZigbeeCarbonDioxideSensor::report() { 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; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp index d8fea88342e..11fbf7c906b 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp @@ -79,6 +79,7 @@ void ZigbeeFlowSensor::report() { 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; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp index 830e4397137..31a1f7e90e1 100644 --- a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp @@ -49,6 +49,7 @@ void ZigbeeOccupancySensor::report() { 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; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp index 44e3eace610..21456a51511 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp @@ -75,6 +75,7 @@ void ZigbeePressureSensor::report() { 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; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp index c3991593422..b3ff03f0a6b 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp @@ -74,6 +74,7 @@ void ZigbeeTempSensor::reportTemperature() { 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; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); @@ -116,6 +117,7 @@ void ZigbeeTempSensor::reportHumidity() { 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; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); From e680e7b538026a88616b8247a8909e10fcc64843 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Mon, 10 Mar 2025 16:21:25 -0300 Subject: [PATCH 041/290] fix(matter): removes a few matter 1.4 / IDF 5.4 compilation warning messages (#11067) * fix(matter): uninitialized fields warning * fix(matter): uninitialized fields warning --- libraries/Matter/src/MatterEndpoints/MatterColorLight.h | 4 ++-- .../Matter/src/MatterEndpoints/MatterEnhancedColorLight.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorLight.h index b896afa9b7a..99449addd50 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterColorLight.h @@ -66,8 +66,8 @@ class MatterColorLight : public MatterEndPoint { 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) + bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) + espHsvColor_t colorHSV = {0, 0, 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; diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h index ff6e69e3e65..a4baef968a4 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h @@ -91,7 +91,7 @@ class MatterEnhancedColorLight : public MatterEndPoint { 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) + espHsvColor_t colorHSV = {0, 0, 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; From d9dbc4af41efdceb958aa05925f0eeacec679d78 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Mon, 10 Mar 2025 17:00:34 -0300 Subject: [PATCH 042/290] fix(matter): examples must set pin to Digital Mode after analogWrite() and before digitalWrite() (#11070) * fix(matter): itshall set digital mode before digitalWrite * fix(matter): example must set pin in digital mode before writting * fix(matter): example shall set digital mode before writing * fix(matter): digitalMode necessary before digitalWrite(LOW) * fix(matter): example must set digital mode after analogwrite * fix(matter): wrong copy paste * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../Matter/examples/MatterColorLight/MatterColorLight.ino | 4 ++++ .../examples/MatterDimmableLight/MatterDimmableLight.ino | 4 ++++ .../MatterEnhancedColorLight/MatterEnhancedColorLight.ino | 4 ++++ libraries/Matter/examples/MatterFan/MatterFan.ino | 4 ++++ .../MatterTemperatureLight/MatterTemperatureLight.ino | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino b/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino index dd1724f602d..f3e45887576 100644 --- a/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino +++ b/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino @@ -60,6 +60,10 @@ bool setLightState(bool state, espHsvColor_t colorHSV) { analogWrite(ledPin, colorHSV.v); #endif } else { +#ifndef RGB_BUILTIN + // after analogWrite(), it is necessary to set the GPIO to digital mode first + pinMode(ledPin, OUTPUT); +#endif digitalWrite(ledPin, LOW); } // store last HSV Color and OnOff state for when the Light is restarted / power goes off diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index cb8b8b6f17f..79751905c20 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -56,6 +56,10 @@ bool setLightState(bool state, uint8_t brightness) { analogWrite(ledPin, brightness); #endif } else { +#ifndef RGB_BUILTIN + // after analogWrite(), it is necessary to set the GPIO to digital mode first + pinMode(ledPin, OUTPUT); +#endif digitalWrite(ledPin, LOW); } // store last Brightness and OnOff state for when the Light is restarted / power goes off diff --git a/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino index bd2d13899ca..8e12581fdf2 100644 --- a/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino +++ b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino @@ -64,6 +64,10 @@ bool setLightState(bool state, espHsvColor_t colorHSV, uint8_t brighteness, uint analogWrite(ledPin, colorHSV.v); #endif } else { +#ifndef RGB_BUILTIN + // after analogWrite(), it is necessary to set the GPIO to digital mode first + pinMode(ledPin, OUTPUT); +#endif digitalWrite(ledPin, LOW); } // store last HSV Color and OnOff state for when the Light is restarted / power goes off diff --git a/libraries/Matter/examples/MatterFan/MatterFan.ino b/libraries/Matter/examples/MatterFan/MatterFan.ino index 1094126a843..705aa4853da 100644 --- a/libraries/Matter/examples/MatterFan/MatterFan.ino +++ b/libraries/Matter/examples/MatterFan/MatterFan.ino @@ -49,6 +49,10 @@ void fanDCMotorDrive(bool fanState, uint8_t speedPercent) { // drive the Fan DC motor if (fanState == false) { // turn off the Fan +#ifndef RGB_BUILTIN + // after analogWrite(), it is necessary to set the GPIO to digital mode first + pinMode(dcMotorPin, OUTPUT); +#endif digitalWrite(dcMotorPin, LOW); } else { // set the Fan speed diff --git a/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino b/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino index b814ba89704..d46427591ab 100644 --- a/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino +++ b/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino @@ -66,6 +66,10 @@ bool setLightState(bool state, uint8_t brightness, uint16_t temperature_Mireds) analogWrite(ledPin, brightness); #endif } else { +#ifndef RGB_BUILTIN + // after analogWrite(), it is necessary to set the GPIO to digital mode first + pinMode(ledPin, OUTPUT); +#endif digitalWrite(ledPin, LOW); } // store last Brightness and OnOff state for when the Light is restarted / power goes off From e8a243c1db973b5cdd68949c1dfc8c8bfd11c887 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Mon, 10 Mar 2025 17:18:12 -0300 Subject: [PATCH 043/290] fix(network): fixes a macro name conflict warning (#11068) * fix(network): fixes a macro name conflict warning * feat(networking): removed local maco definition in favor of IDF one --- libraries/Network/src/NetworkClient.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/Network/src/NetworkClient.cpp b/libraries/Network/src/NetworkClient.cpp index da83597d2c6..89411a42453 100644 --- a/libraries/Network/src/NetworkClient.cpp +++ b/libraries/Network/src/NetworkClient.cpp @@ -23,7 +23,11 @@ #include #include -#define IN6_IS_ADDR_V4MAPPED(a) ((((__const uint32_t *)(a))[0] == 0) && (((__const uint32_t *)(a))[1] == 0) && (((__const uint32_t *)(a))[2] == htonl(0xffff))) +// It is already defined in IDF as: +//#define IN6_IS_ADDR_V4MAPPED(a) ip6_addr_isipv4mappedipv6((ip6_addr_t*)(a)) +//#define ip6_addr_isipv4mappedipv6(ip6addr) (((ip6addr)->addr[0] == 0) && ((ip6addr)->addr[1] == 0) && (((ip6addr)->addr[2]) == PP_HTONL(0x0000FFFFUL))) +// Keeping as a memory of the change. +//#define _IN6_IS_ADDR_V4MAPPED(a) ((((__const uint32_t *)(a))[0] == 0) && (((__const uint32_t *)(a))[1] == 0) && (((__const uint32_t *)(a))[2] == htonl(0xffff))) #define WIFI_CLIENT_DEF_CONN_TIMEOUT_MS (3000) #define WIFI_CLIENT_MAX_WRITE_RETRY (10) From bda7c4811728e538b4ea393a5be148cbb614daed Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 11 Mar 2025 00:26:18 +0200 Subject: [PATCH 044/290] IDF release/v5.4 d4aa25a3 (#11060) IDF release/v5.4 d4aa25a3 --- 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 5a37e95930a..249ab43acc6 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.4-bcb3c32d-v1" + "version": "idf-release_v5.4-d4aa25a3-v1" }, { "packager": "esp32", @@ -95,63 +95,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-bcb3c32d-v1", + "version": "idf-release_v5.4-d4aa25a3-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", - "size": "345570903" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", + "size": "350941396" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", - "size": "345570903" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", + "size": "350941396" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", - "size": "345570903" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", + "size": "350941396" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", - "size": "345570903" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", + "size": "350941396" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", - "size": "345570903" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", + "size": "350941396" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", - "size": "345570903" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", + "size": "350941396" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", - "size": "345570903" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", + "size": "350941396" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-bcb3c32d-v1.zip", - "checksum": "SHA-256:2ab7a8565d4eadd805c1d00c9a1550292d3287dc43efa166d7ad3ba5322344bb", - "size": "345570903" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", + "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", + "size": "350941396" } ] }, From 07d6a5a0d2f774bd7b004b1bc647d601199a0489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Wed, 12 Mar 2025 14:38:09 +0100 Subject: [PATCH 045/290] feat(Zigbee): Adding Zigbee Wind speed sensor endpoint (#10455) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Create ZigbeeWindSpeedSensor.h * Create ZigbeeWindSpeedSensor.cpp * Update ZigbeeWindSpeedSensor.cpp * Update ZigbeeWindSpeedSensor.cpp * Create ZigbeeWindSpeedSensor.ino * Update ZigbeeWindSpeedSensor.ino * Update ZigbeeWindSpeedSensor.ino * Create ci.json * Rename ZigbeeWindSpeedSensor.ino to Zigbee_Wind_Speed_Sensor.ino * Rename ci.json to ci.json * Update CMakeLists.txt * Update Zigbee_Wind_Speed_Sensor.ino * Update Zigbee_Wind_Speed_Sensor.ino * Update Zigbee_Wind_Speed_Sensor.ino * Update ZigbeeWindSpeedSensor.cpp * Update ZigbeeWindSpeedSensor.cpp Use ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID device id * feat(zigbee): Add windspeed sensor endpoint * Update Zigbee.h Add ZigbeeWindSpeedSensor.h * update example * add missing sdkconfig include * add readme * ci(pre-commit): Apply automatic fixes * Update README.md --------- 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 + .../Zigbee_Wind_Speed_Sensor/README.md | 60 +++++++++ .../Zigbee_Wind_Speed_Sensor.ino | 119 ++++++++++++++++++ .../examples/Zigbee_Wind_Speed_Sensor/ci.json | 7 ++ libraries/Zigbee/src/Zigbee.h | 1 + .../Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp | 98 +++++++++++++++ .../Zigbee/src/ep/ZigbeeWindSpeedSensor.h | 56 +++++++++ 7 files changed, 342 insertions(+) create mode 100644 libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 32d17e5f68d..d2a9162a9ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -298,6 +298,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeAnalog.cpp libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp libraries/Zigbee/src/ep/ZigbeeGateway.cpp + libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp ) set(ARDUINO_LIBRARY_BLE_SRCS diff --git a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md new file mode 100644 index 00000000000..826c7666e6b --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md @@ -0,0 +1,60 @@ +# Zigbee Wind Speed Sensor Integration with HomeAssistant ZHA + +This guide provides a workaround for integrating a Zigbee Wind Speed Sensor with HomeAssistant using the ZHA integration. Since the wind speed cluster is not natively supported, we will use the ZHA Toolkit from HACS to read the wind speed attribute and store it in a helper variable. +## Alternative Option: Creating a Custom Quirk + +For advanced users, a more robust solution is to create a custom quirk for your Zigbee Wind Speed Sensor. This approach involves writing a custom device handler that directly supports the wind speed cluster, providing a more seamless integration with HomeAssistant. + +Creating a custom quirk can be complex and requires familiarity with Python and the Zigbee protocol. However, it offers greater flexibility and control over your device's behavior. + +For more information and guidance on creating custom quirks, visit the [ZHA Device Handlers repository](https://github.com/zigpy/zha-device-handlers/). + +## Prerequisites + +- HomeAssistant installed and running +- Zigbee Wind Speed Sensor paired with HomeAssistant ZHA +- HACS (Home Assistant Community Store) installed. For more information, visit [HACS](https://hacs.xyz) + +## Steps + +### 1. Install ZHA Toolkit + +1. Open HomeAssistant. +2. Navigate to HACS > Integrations. +3. Search for "ZHA Toolkit - Service for advanced Zigbee Usage" and install it. For more information, visit the [ZHA Toolkit repository](https://github.com/mdeweerd/zha-toolkit). +4. Restart HomeAssistant to apply changes. + +### 2. Create a Helper Variable + +1. Go to Configuration -> Devices & Services -> Helpers. +2. Click on "Add Helper" and select "Number". +3. Name the helper (e.g., `wind_speed`), set the minimum and maximum values, and save it. + +### 3. Create an Automation + +1. Go to Configuration > Automations & Scenes. +2. Click on "Add Automation" and choose "Start with an empty automation". +3. Set a name for the automation (e.g., `Read Wind Speed`). +4. Add a trigger: + - Trigger Type: Time Pattern + - Every: 30 seconds +5. Add an action (Then do): + - Action Type: ZHA Toolkit: Read Attribute + - Setup the action: + ```yaml + action: zha_toolkit.attr_read + metadata: {} + data: + ieee: f0:f5:bd:ff:fe:0e:61:30 #set device IEEE address + endpoint: 10 #set windspeed device endpoint + cluster: 1035 #use this windspeed cluster + attribute: 0 #read measurement value + state_id: input_number.wind_speed #save to created helper variable + state_value_template: value/100 #use correct value format (convert u16 to float) + ``` +6. Save the automation. + +## Conclusion + +By following these steps, you can successfully integrate your Zigbee Wind Speed Sensor with HomeAssistant using the ZHA integration and ZHA Toolkit. The wind speed readings will be updated every 30 seconds and stored in the helper variable for use in your HomeAssistant setup. +The helper variable `wind_speed` is now an entity in HomeAssistant. You can use this entity to display the wind speed on your dashboard or in other automations. diff --git a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino new file mode 100644 index 00000000000..1c24df9a091 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino @@ -0,0 +1,119 @@ +// 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 windspeed sensor. + * + * The example demonstrates how to use Zigbee library to create a end device wind speed sensor. + * The wind speed 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 coordinator mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +#define BUTTON_PIN 9 //Boot button for C6/H2 +#define WIND_SPEED_SENSOR_ENDPOINT_NUMBER 10 + +ZigbeeWindSpeedSensor zbWindSpeedSensor = ZigbeeWindSpeedSensor(WIND_SPEED_SENSOR_ENDPOINT_NUMBER); + +/************************ WindSpeed sensor *****************************/ +static void windspeed_sensor_value_update(void *arg) { + for (;;) { + // Read wind speed sensor value (simulated now by temperature sensor) + float windspeed = temperatureRead(); + log_v("Wind speed sensor value: %.2fm/s", windspeed); + // Update windspeed value in Windspeed sensor EP + zbWindSpeedSensor.setWindSpeed(windspeed); + delay(1000); + } +} + +/********************* Arduino functions **************************/ +void setup() { + Serial.begin(115200); + while (!Serial) { + delay(10); + } + + // Init button switch + pinMode(BUTTON_PIN, INPUT); + + // Optional: set Zigbee device name and model + zbWindSpeedSensor.setManufacturerAndModel("Espressif", "ZigbeeWindSpeedSensor"); + + // Set minimum and maximum windspeed measurement value in m/s + zbWindSpeedSensor.setMinMaxValue(0, 50); + + // Set tolerance for windspeed measurement in m/s (lowest possible value is 0.01 m/s) + zbWindSpeedSensor.setTolerance(1); + + // Add endpoint to Zigbee Core + Zigbee.addEndpoint(&zbWindSpeedSensor); + + 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 Wind speed sensor reading task + xTaskCreate(windspeed_sensor_value_update, "wind_speed_sensor_update", 2048, NULL, 10, NULL); + + // Set reporting interval for windspeed measurement in seconds, must be called after Zigbee.begin() + // min_interval and max_interval in seconds, delta (WindSpeed change in m/s) + // if min = 1 and max = 0, reporting is sent only when windspeed changes by delta + // if min = 0 and max = 10, reporting is sent every 10 seconds or windspeed changes by delta + // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of windspeed change + zbWindSpeedSensor.setReporting(1, 0, 1); +} + +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.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); + Zigbee.factoryReset(); + } + } + zbWindSpeedSensor.reportWindSpeed(); + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/ci.json new file mode 100644 index 00000000000..ceacc367801 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" + ] +} diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index 9ccf1e7d8f2..e5f669ba899 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -25,3 +25,4 @@ #include "ep/ZigbeeVibrationSensor.h" #include "ep/ZigbeeRangeExtender.h" #include "ep/ZigbeeGateway.h" +#include "ep/ZigbeeWindSpeedSensor.h" diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp new file mode 100644 index 00000000000..d93b02adbc3 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp @@ -0,0 +1,98 @@ +#include "ZigbeeWindSpeedSensor.h" +#if CONFIG_ZB_ENABLED + +esp_zb_cluster_list_t *zigbee_wind_speed_sensor_clusters_create(zigbee_wind_speed_sensor_cfg_t *wind_speed_sensor) { + esp_zb_basic_cluster_cfg_t *basic_cfg = wind_speed_sensor ? &(wind_speed_sensor->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = wind_speed_sensor ? &(wind_speed_sensor->identify_cfg) : NULL; + esp_zb_wind_speed_measurement_cluster_cfg_t *wind_speed_cfg = wind_speed_sensor ? &(wind_speed_sensor->wind_speed_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_wind_speed_measurement_cluster( + cluster_list, esp_zb_wind_speed_measurement_cluster_create(wind_speed_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE + ); + return cluster_list; +} + +// There is no device_id for wind speed sensor, we use a generic one +ZigbeeWindSpeedSensor::ZigbeeWindSpeedSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID; + + zigbee_wind_speed_sensor_cfg_t windspeed_sensor_cfg = ZIGBEE_DEFAULT_WIND_SPEED_SENSOR_CONFIG(); + _cluster_list = zigbee_wind_speed_sensor_clusters_create(&windspeed_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}; +} + +static uint16_t zb_windspeed_to_u16(float windspeed) { + return (uint16_t)(windspeed * 100); +} + +void ZigbeeWindSpeedSensor::setMinMaxValue(float min, float max) { + uint16_t zb_min = zb_windspeed_to_u16(min); + uint16_t zb_max = zb_windspeed_to_u16(max); + esp_zb_attribute_list_t *windspeed_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + // + esp_zb_cluster_update_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&zb_min); + esp_zb_cluster_update_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&zb_max); +} + +void ZigbeeWindSpeedSensor::setTolerance(float tolerance) { + // Convert tolerance to ZCL uint16_t + uint16_t zb_tolerance = zb_windspeed_to_u16(tolerance); + esp_zb_attribute_list_t *windspeed_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_wind_speed_measurement_cluster_add_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); +} + +void ZigbeeWindSpeedSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { + 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_WIND_SPEED_MEASUREMENT; + reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; + reporting_info.attr_id = ESP_ZB_ZCL_ATTR_WIND_SPEED_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 = (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(); +} + +void ZigbeeWindSpeedSensor::setWindSpeed(float windspeed) { + uint16_t zb_windspeed = zb_windspeed_to_u16(windspeed); + log_v("Updating windspeed sensor value..."); + /* Update windspeed sensor measured value */ + log_d("Setting windspeed to %d", zb_windspeed); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID, + &zb_windspeed, false + ); + esp_zb_lock_release(); +} + +void ZigbeeWindSpeedSensor::reportWindSpeed() { + /* 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_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; + report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT; + report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_zb_lock_release(); + log_v("Wind speed measurement report sent"); +} + +#endif //CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h new file mode 100644 index 00000000000..e091d3ae548 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h @@ -0,0 +1,56 @@ +/* Class of Zigbee WindSpeed sensor endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +#define ZIGBEE_DEFAULT_WIND_SPEED_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, \ + }, \ + .wind_speed_meas_cfg = { \ + .measured_value = ESP_ZB_ZCL_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_DEFAULT, \ + .min_measured_value = ESP_ZB_ZCL_WIND_SPEED_MEASUREMENT_MIN_MEASURED_VALUE_DEFAULT, \ + .max_measured_value = ESP_ZB_ZCL_WIND_SPEED_MEASUREMENT_MAX_MEASURED_VALUE_DEFAULT, \ + }, \ + } + +typedef struct zigbee_wind_speed_sensor_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_wind_speed_measurement_cluster_cfg_t + wind_speed_meas_cfg; /*!< Wind speed measurement cluster configuration, @ref esp_zb_wind_speed_measurement_cluster_cfg_s */ +} zigbee_wind_speed_sensor_cfg_t; + +class ZigbeeWindSpeedSensor : public ZigbeeEP { +public: + ZigbeeWindSpeedSensor(uint8_t endpoint); + ~ZigbeeWindSpeedSensor() {} + + // Set the WindSpeed value in 0,01 m/s + void setWindSpeed(float value); + + // Set the min and max value for the WindSpeed sensor + void setMinMaxValue(float min, float max); + + // Set the tolerance value for the WindSpeed sensor + void setTolerance(float tolerance); + + // Set the reporting interval for WindSpeed measurement in seconds and delta + void setReporting(uint16_t min_interval, uint16_t max_interval, float delta); + void reportWindSpeed(); +}; + +#endif //CONFIG_ZB_ENABLED From c2b0482511911fd6b57b160f7cdf5cc1187ddaab Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Thu, 13 Mar 2025 06:44:23 -0300 Subject: [PATCH 046/290] ci(hw): Fix files being overwritten (#11019) Co-authored-by: Sugar Glider Co-authored-by: Me No Dev --- .github/scripts/sketch_utils.sh | 4 ++-- .github/scripts/tests_run.sh | 10 +++++----- .github/workflows/tests_build.yml | 24 ++++++++++++------------ .github/workflows/tests_hw.yml | 16 +++++++++++++--- .github/workflows/tests_qemu.yml | 2 +- .github/workflows/tests_wokwi.yml | 2 +- docs/en/contributing.rst | 4 ++-- 7 files changed, 36 insertions(+), 26 deletions(-) diff --git a/.github/scripts/sketch_utils.sh b/.github/scripts/sketch_utils.sh index 00d7d1bc232..e536da50111 100755 --- a/.github/scripts/sketch_utils.sh +++ b/.github/scripts/sketch_utils.sh @@ -244,7 +244,7 @@ function build_sketch { # build_sketch [ext build_dir="$ARDUINO_BUILD_DIR" elif [ "$len" -eq 1 ]; then # build_dir="$sketchdir/build" - build_dir="$HOME/.arduino/tests/$sketchname/build.tmp" + build_dir="$HOME/.arduino/tests/$target/$sketchname/build.tmp" fi output_file="$HOME/.arduino/cli_compile_output.txt" @@ -254,7 +254,7 @@ function build_sketch { # build_sketch [ext 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" + build_dir="$HOME/.arduino/tests/$target/$sketchname/build$i.tmp" fi rm -rf "$build_dir" mkdir -p "$build_dir" diff --git a/.github/scripts/tests_run.sh b/.github/scripts/tests_run.sh index 274666c8a44..1c4bee79742 100755 --- a/.github/scripts/tests_run.sh +++ b/.github/scripts/tests_run.sh @@ -27,9 +27,9 @@ function run_test { fi if [ "$len" -eq 1 ]; then - sdkconfig_path="$HOME/.arduino/tests/$sketchname/build.tmp/sdkconfig" + sdkconfig_path="$HOME/.arduino/tests/$target/$sketchname/build.tmp/sdkconfig" else - sdkconfig_path="$HOME/.arduino/tests/$sketchname/build0.tmp/sdkconfig" + sdkconfig_path="$HOME/.arduino/tests/$target/$sketchname/build0.tmp/sdkconfig" fi if [ -f "$sketchdir"/ci.json ]; then @@ -45,7 +45,7 @@ function run_test { fi 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 "\033[93mSketch %s build not found in %s\nMight be due to missing target requirements or build failure\033[0m\n" "$(dirname "$sdkconfig_path")" "$sketchname" printf "\n\n\n" return 0 fi @@ -60,7 +60,7 @@ function run_test { if [ "$len" -eq 1 ]; then # build_dir="$sketchdir/build" - build_dir="$HOME/.arduino/tests/$sketchname/build.tmp" + build_dir="$HOME/.arduino/tests/$target/$sketchname/build.tmp" report_file="$sketchdir/$target/$sketchname.xml" fi @@ -83,7 +83,7 @@ function run_test { if [ "$len" -ne 1 ]; then # build_dir="$sketchdir/build$i" - build_dir="$HOME/.arduino/tests/$sketchname/build$i.tmp" + build_dir="$HOME/.arduino/tests/$target/$sketchname/build$i.tmp" report_file="$sketchdir/$target/$sketchname$i.xml" fi diff --git a/.github/workflows/tests_build.yml b/.github/workflows/tests_build.yml index 7a5a2959657..7a10c95ed22 100644 --- a/.github/workflows/tests_build.yml +++ b/.github/workflows/tests_build.yml @@ -26,10 +26,10 @@ jobs: with: key: tests-${{ env.id }}-bin path: | - ~/.arduino/tests/**/build*.tmp/*.bin - ~/.arduino/tests/**/build*.tmp/*.elf - ~/.arduino/tests/**/build*.tmp/*.json - ~/.arduino/tests/**/build*.tmp/sdkconfig + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.bin + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.elf + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.json + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/sdkconfig - name: Evaluate if tests should be built id: check-build @@ -73,10 +73,10 @@ jobs: with: key: tests-${{ env.id }}-bin path: | - ~/.arduino/tests/**/build*.tmp/*.bin - ~/.arduino/tests/**/build*.tmp/*.elf - ~/.arduino/tests/**/build*.tmp/*.json - ~/.arduino/tests/**/build*.tmp/sdkconfig + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.bin + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.elf + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.json + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/sdkconfig - name: Upload ${{ inputs.chip }} ${{ inputs.type }} binaries as artifacts uses: actions/upload-artifact@v4 @@ -84,7 +84,7 @@ jobs: name: tests-bin-${{ inputs.chip }}-${{ inputs.type }} overwrite: true path: | - ~/.arduino/tests/**/build*.tmp/*.bin - ~/.arduino/tests/**/build*.tmp/*.elf - ~/.arduino/tests/**/build*.tmp/*.json - ~/.arduino/tests/**/build*.tmp/sdkconfig + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.bin + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.elf + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.json + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/sdkconfig diff --git a/.github/workflows/tests_hw.yml b/.github/workflows/tests_hw.yml index 76480ed7c0e..6c15ba79a7f 100644 --- a/.github/workflows/tests_hw.yml +++ b/.github/workflows/tests_hw.yml @@ -22,13 +22,18 @@ defaults: jobs: hardware-test: name: Hardware ${{ inputs.chip }} ${{ inputs.type }} tests - runs-on: [arduino, "${{ inputs.chip }}"] + runs-on: ["arduino", "${{ inputs.chip }}"] env: id: ${{ github.event.pull_request.number || github.ref }}-${{ github.event.pull_request.head.sha || github.sha }}-${{ inputs.chip }}-${{ inputs.type }} container: image: python:3.10.1-bullseye - options: --privileged + options: --privileged --device-cgroup-rule="c 188:* rmw" --device-cgroup-rule="c 166:* rmw" steps: + - name: Clean workspace + run: | + rm -rf ./* + rm -rf ~/.arduino/tests + - name: Check if already passed id: cache-results if: github.event.pull_request.number != null @@ -81,7 +86,12 @@ jobs: with: name: tests-bin-${{ inputs.chip }}-${{ inputs.type }} path: | - ~/.arduino/tests + ~/.arduino/tests/${{ inputs.chip }} + + - name: List binaries + if: ${{ steps.check-tests.outputs.enabled == 'true' }} + run: | + ls -laR ~/.arduino/tests - name: Run Tests if: ${{ steps.check-tests.outputs.enabled == 'true' }} diff --git a/.github/workflows/tests_qemu.yml b/.github/workflows/tests_qemu.yml index 6675909c9df..6c5934ce69a 100644 --- a/.github/workflows/tests_qemu.yml +++ b/.github/workflows/tests_qemu.yml @@ -117,7 +117,7 @@ jobs: with: name: tests-bin-${{ inputs.chip }}-${{ inputs.type }} path: | - ~/.arduino/tests + ~/.arduino/tests/${{ inputs.chip }} - name: Run Tests if: ${{ steps.check-tests.outputs.enabled == 'true' }} diff --git a/.github/workflows/tests_wokwi.yml b/.github/workflows/tests_wokwi.yml index c254d5fa153..4e5d3ceca51 100644 --- a/.github/workflows/tests_wokwi.yml +++ b/.github/workflows/tests_wokwi.yml @@ -276,7 +276,7 @@ jobs: run-id: ${{ github.event.workflow_run.id }} name: tests-bin-${{ matrix.chip }}-${{ matrix.type }} path: | - ~/.arduino/tests + ~/.arduino/tests/${{ matrix.chip }} - name: Run Tests if: ${{ steps.check-tests.outputs.enabled == 'true' }} diff --git a/docs/en/contributing.rst b/docs/en/contributing.rst index fb7843f1fb6..4093c60ec64 100644 --- a/docs/en/contributing.rst +++ b/docs/en/contributing.rst @@ -318,7 +318,7 @@ ESP32-C3 target, you would run: ./.github/scripts/tests_build.sh -s uart -t esp32c3 -You should see the output of the build process and the test binary should be generated in the ``~/.arduino/tests//build.tmp`` folder. +You should see the output of the build process and the test binary should be generated in the ``~/.arduino/tests///build.tmp`` folder. Now that the test is built, you can run it in the target board. Connect the target board to your computer and run: @@ -339,7 +339,7 @@ The test will run on the target board and you should see the output of the test lucassvaz@Lucas--MacBook-Pro esp32 % ./.github/scripts/tests_run.sh -s uart -t esp32c3 Sketch uart test type: validation Running test: uart -- Config: Default - pytest tests --build-dir /Users/lucassvaz/.arduino/tests/uart/build.tmp -k test_uart --junit-xml=/Users/lucassvaz/Espressif/Arduino/hardware/espressif/esp32/tests/validation/uart/esp32c3/uart.xml --embedded-services esp,arduino + pytest tests --build-dir /Users/lucassvaz/.arduino/tests/esp32c3/uart/build.tmp -k test_uart --junit-xml=/Users/lucassvaz/Espressif/Arduino/hardware/espressif/esp32/tests/validation/uart/esp32c3/uart.xml --embedded-services esp,arduino =============================================================================================== test session starts ================================================================================================ platform darwin -- Python 3.12.3, pytest-8.2.2, pluggy-1.5.0 rootdir: /Users/lucassvaz/Espressif/Arduino/hardware/espressif/esp32/tests From 2a3de9c41533c0559e7c16ea34f4315e5fc2205d Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Thu, 13 Mar 2025 07:02:43 -0300 Subject: [PATCH 047/290] test(i2c): Do not use delta as Wokwi timing can be inconsistent (#11080) * test(i2c): Do not use delta as Wokwi timing can be inconsistent * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- tests/validation/i2c_master/i2c_master.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/validation/i2c_master/i2c_master.ino b/tests/validation/i2c_master/i2c_master.ino index 9b4cc508a35..41e7d2ae5f9 100644 --- a/tests/validation/i2c_master/i2c_master.ino +++ b/tests/validation/i2c_master/i2c_master.ino @@ -162,7 +162,7 @@ void rtc_run_clock() { ds1307_get_time(&read_sec, &read_min, &read_hour, &read_day, &read_month, &read_year); //Check time - TEST_ASSERT_UINT8_WITHIN(2, start_sec + 5, read_sec); + TEST_ASSERT_NOT_EQUAL(start_sec, read_sec); //Seconds should have changed TEST_ASSERT_EQUAL(start_min, read_min); TEST_ASSERT_EQUAL(start_hour, read_hour); TEST_ASSERT_EQUAL(start_day, read_day); From f7c1efccaa91d0249d3c8164f59a796065091fd5 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 17 Mar 2025 07:37:41 -0300 Subject: [PATCH 048/290] docs(esp32p4): Add missing information and improve organization (#11081) * docs(esp32p4): Add missing information and improve organization * docs(datasheets): Add missing datasheets * docs(readme): Reorder title * docs(typos): Fix typos --- README.md | 11 ++- docs/en/boards/boards.rst | 10 +- docs/en/common/datasheet.inc | 12 ++- docs/en/getting_started.rst | 11 ++- docs/en/lib_builder.rst | 4 +- docs/en/libraries.rst | 106 ++++++++++++---------- package/package_esp32_index.template.json | 15 ++- 7 files changed, 97 insertions(+), 72 deletions(-) diff --git a/README.md b/README.md index 9d300b25c54..f40315c03cc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Arduino core for the ESP32, ESP32-P4, ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6 and ESP32-H2 +# Arduino core for the ESP32, ESP32-C3, ESP32-C6, ESP32-H2, ESP32-P4, ESP32-S2 and ESP32-S3. [![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) @@ -67,16 +67,17 @@ Here are the ESP32 series supported by the Arduino-ESP32 project: | **SoC** | **Stable** | **Development** | **Datasheet** | |----------|:----------:|:---------------:|:-------------------------------------------------------------------------------------------------:| | ESP32 | Yes | Yes | [ESP32](https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf) | -| ESP32-S2 | Yes | Yes | [ESP32-S2](https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf) | | ESP32-C3 | Yes | Yes | [ESP32-C3](https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf) | -| 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 | Yes | Yes | [ESP32-P4](https://www.espressif.com/sites/default/files/documentation/esp32-p4_datasheet_en.pdf) | +| ESP32-S2 | Yes | Yes | [ESP32-S2](https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf) | +| ESP32-S3 | Yes | Yes | [ESP32-S3](https://www.espressif.com/sites/default/files/documentation/esp32-s3_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 -> build system. For more information, see the [Lib Builder documentation](https://docs.espressif.com/projects/arduino-esp32/en/latest/lib_builder.html). +> ESP32-C2 is also supported by Arduino-ESP32 but requires using Arduino as an ESP-IDF component or rebuilding the static libraries. +> For more information, see the [Arduino as an ESP-IDF component documentation](https://docs.espressif.com/projects/arduino-esp32/en/latest/esp-idf_component.html) or the +> [Lib Builder documentation](https://docs.espressif.com/projects/arduino-esp32/en/latest/lib_builder.html), respectively. For more details visit the [supported chips](https://docs.espressif.com/projects/arduino-esp32/en/latest/getting_started.html#supported-soc-s) documentation page. diff --git a/docs/en/boards/boards.rst b/docs/en/boards/boards.rst index 05df917c8b1..407b019a78b 100644 --- a/docs/en/boards/boards.rst +++ b/docs/en/boards/boards.rst @@ -18,16 +18,18 @@ The ESP32 is divided by family: * ESP32 * Wi-Fi, BT and BLE 4 -* ESP32-S2 - * Wi-Fi only -* ESP32-S3 - * Wi-Fi and BLE 5 * ESP32-C3 * Wi-Fi and BLE 5 * ESP32-C6 * Wi-Fi, BLE 5 and IEEE 802.15.4 * ESP32-H2 * BLE 5 and IEEE 802.15.4 +* ESP32-P4 + * 400 MHz Dual Core RISC-V CPU, 40 MHz ULP Co-processor, single-precision FPU and AI extensions. +* ESP32-S2 + * Wi-Fi only +* ESP32-S3 + * Wi-Fi and BLE 5 For each family, we have SoC variants with some differentiation. The differences are more about the embedded flash and its size and the number of the cores (dual or single). diff --git a/docs/en/common/datasheet.inc b/docs/en/common/datasheet.inc index 193359fb73a..7086a12d1a8 100644 --- a/docs/en/common/datasheet.inc +++ b/docs/en/common/datasheet.inc @@ -2,16 +2,20 @@ Datasheet --------- * `ESP32`_ (Datasheet) -* `ESP32-S2`_ (Datasheet) +* `ESP32-C2`_ (Datasheet) * `ESP32-C3`_ (Datasheet) -* `ESP32-S3`_ (Datasheet) * `ESP32-C6`_ (Datasheet) * `ESP32-H2`_ (Datasheet) +* `ESP32-P4`_ (Datasheet) +* `ESP32-S2`_ (Datasheet) +* `ESP32-S3`_ (Datasheet) .. _Espressif Product Selector: https://products.espressif.com/ .. _ESP32: https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf -.. _ESP32-S2: https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf +.. _ESP32-C2: https://www.espressif.com/sites/default/files/documentation/esp8684_datasheet_en.pdf .. _ESP32-C3: https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf -.. _ESP32-S3: https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf .. _ESP32-C6: https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf .. _ESP32-H2: https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf +.. _ESP32-P4: https://www.espressif.com/sites/default/files/documentation/esp32-p4_datasheet_en.pdf +.. _ESP32-S2: https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf +.. _ESP32-S3: https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf diff --git a/docs/en/getting_started.rst b/docs/en/getting_started.rst index cabb2ddc805..1b0f1bba87a 100644 --- a/docs/en/getting_started.rst +++ b/docs/en/getting_started.rst @@ -38,17 +38,18 @@ Here are the ESP32 series supported by the Arduino-ESP32 project: SoC Stable Development Datasheet ========== ====== =========== ================================= ESP32 Yes Yes `ESP32`_ -ESP32-S2 Yes Yes `ESP32-S2`_ ESP32-C3 Yes Yes `ESP32-C3`_ -ESP32-S3 Yes Yes `ESP32-S3`_ ESP32-C6 Yes Yes `ESP32-C6`_ ESP32-H2 Yes Yes `ESP32-H2`_ +ESP32-P4 Yes Yes `ESP32-P4`_ +ESP32-S2 Yes Yes `ESP32-S2`_ +ESP32-S3 Yes Yes `ESP32-S3`_ ========== ====== =========== ================================= .. 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 build system. - For more information, see the `Lib Builder documentation `_. + ESP32-C2 is also supported by Arduino-ESP32 but requires using Arduino as an ESP-IDF component or rebuilding the static libraries. + For more information, see the `Arduino as an ESP-IDF component documentation `_ or the + `Lib Builder documentation `_, respectively. See `Boards `_ for more details about ESP32 development boards. diff --git a/docs/en/lib_builder.rst b/docs/en/lib_builder.rst index 478becc3350..e7edb331fd3 100644 --- a/docs/en/lib_builder.rst +++ b/docs/en/lib_builder.rst @@ -151,13 +151,13 @@ Set the build target(chip). ex. 'esp32s3' This build command will build for the ESP32-S3 target. You can specify other targets. * esp32 -* esp32s2 -* esp32s3 * esp32c2 * esp32c3 * esp32c6 * esp32h2 * esp32p4 +* esp32s2 +* esp32s3 Set Build Type ^^^^^^^^^^^^^^ diff --git a/docs/en/libraries.rst b/docs/en/libraries.rst index 0e3499f7783..525a5c4ba26 100644 --- a/docs/en/libraries.rst +++ b/docs/en/libraries.rst @@ -9,60 +9,68 @@ Supported Peripherals Currently, the Arduino ESP32 supports the following peripherals with Arduino APIs. -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| Peripheral | ESP32 | S2 | C3 | S3 | C6 | H2 | Notes | -+===============+=======+=======+=======+=======+=======+=======+=======+ -| ADC | Yes | Yes | Yes | Yes | Yes | Yes | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| BT Classic | Yes | N/A | N/A | N/A | N/A | N/A | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| BLE | Yes | N/A | Yes | Yes | Yes | Yes | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| DAC | Yes | Yes | N/A | N/A | N/A | N/A | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| Ethernet | Yes | N/A | N/A | N/A | N/A | N/A | (*) | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| GPIO | Yes | Yes | Yes | Yes | Yes | Yes | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| Hall Sensor | N/A | N/A | N/A | N/A | N/A | N/A | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| I2C | Yes | Yes | Yes | Yes | Yes | Yes | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| I2S | Yes | Yes | Yes | Yes | Yes | Yes | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| LEDC | Yes | Yes | Yes | Yes | Yes | Yes | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| Motor PWM | No | N/A | N/A | N/A | N/A | N/A | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| Pulse Counter | No | No | No | No | No | No | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| RMT | Yes | Yes | Yes | Yes | Yes | Yes | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| SDIO | No | No | No | No | No | No | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| SDMMC | Yes | N/A | N/A | Yes | N/A | N/A | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| Timer | Yes | Yes | Yes | Yes | Yes | Yes | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| Temp. Sensor | N/A | Yes | Yes | Yes | Yes | Yes | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| Touch | Yes | Yes | N/A | Yes | N/A | N/A | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| TWAI | No | No | No | No | No | No | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| UART | Yes | Yes | Yes | Yes | Yes | Yes | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| USB | N/A | Yes | Yes | Yes | Yes | Yes | (**) | -+---------------+-------+-------+-------+-------+-------+-------+-------+ -| Wi-Fi | Yes | Yes | Yes | Yes | Yes | N/A | | -+---------------+-------+-------+-------+-------+-------+-------+-------+ ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| Peripheral | ESP32 | C3 | C6 | H2 | P4 | S2 | S3 | Notes | ++===============+=======+=======+=======+=======+=======+=======+=======+=======+ +| ADC | Yes | Yes | Yes | Yes | Yes | Yes | Yes | (1) | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| BT Classic | Yes | N/A | N/A | N/A | N/A | N/A | N/A | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| BLE | Yes | Yes | Yes | Yes | No | N/A | Yes | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| DAC | Yes | N/A | N/A | N/A | Yes | Yes | N/A | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| Ethernet | Yes | N/A | N/A | N/A | Yes | N/A | N/A | (2) | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| GPIO | Yes | Yes | Yes | Yes | Yes | Yes | Yes | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| Hall Sensor | N/A | N/A | N/A | N/A | N/A | N/A | N/A | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| I2C | Yes | Yes | Yes | Yes | Yes | Yes | Yes | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| I2S | Yes | Yes | Yes | Yes | Yes | Yes | Yes | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| LEDC | Yes | Yes | Yes | Yes | Yes | Yes | Yes | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| MIPI | N/A | N/A | N/A | N/A | No | N/A | N/A | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| Motor PWM | No | N/A | N/A | N/A | N/A | N/A | N/A | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| MSPI | N/A | N/A | N/A | N/A | No | N/A | N/A | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| Pulse Counter | No | No | No | No | No | No | No | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| RMT | Yes | Yes | Yes | Yes | Yes | Yes | Yes | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| SDIO | No | No | No | No | No | No | No | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| SDMMC | Yes | N/A | N/A | N/A | N/A | N/A | Yes | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| Timer | Yes | Yes | Yes | Yes | Yes | Yes | Yes | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| Temp. Sensor | N/A | Yes | Yes | Yes | Yes | Yes | Yes | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| Touch | Yes | N/A | N/A | N/A | Yes | Yes | Yes | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| TWAI | No | No | No | No | No | No | No | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| UART | Yes | Yes | Yes | Yes | Yes | Yes | Yes | | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| USB | N/A | Yes | Yes | Yes | Yes | Yes | Yes | (3) | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ +| Wi-Fi | Yes | Yes | Yes | N/A | Yes | Yes | Yes | (4) | ++---------------+-------+-------+-------+-------+-------+-------+-------+-------+ Notes ^^^^^ -(*) SPI Ethernet is supported by all ESP32 families and RMII only for ESP32. +(1) ESP32-P4 calibration schemes not supported yet in IDF and ADC Continuous also lacks IDF support. -(**) ESP32-C3, C6, H2 only support USB CDC/JTAG +(2) SPI Ethernet is supported by all ESP32 families and RMII only for ESP32 and ESP32-P4. + +(3) ESP32-C3, C6, H2 only support USB CDC/JTAG + +(4) ESP32-P4 only supports Wi-Fi through another SoC by using ``esp_hosted``. .. note:: Some peripherals are not available for all ESP32 families. To see more details about it, see the corresponding SoC at `Product Selector `_ page. diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 249ab43acc6..b0d7c3200d1 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -26,13 +26,22 @@ "name": "ESP32 Dev Board" }, { - "name": "ESP32-S2 Dev Board" + "name": "ESP32-C3 Dev Board" }, { - "name": "ESP32-S3 Dev Board" + "name": "ESP32-C6 Dev Board" }, { - "name": "ESP32-C3 Dev Board" + "name": "ESP32-H2 Dev Board" + }, + { + "name": "ESP32-P4 Dev Board" + }, + { + "name": "ESP32-S2 Dev Board" + }, + { + "name": "ESP32-S3 Dev Board" }, { "name": "Arduino Nano ESP32" From ba2ab1e4bb59fe9601e8dd9c0ebbc544dfeca242 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 17 Mar 2025 10:20:30 -0300 Subject: [PATCH 049/290] ci(actions): Replace changed-files (#11130) --- .github/scripts/set_push_chunks.sh | 93 +++++++++++++++++++++++++++- .github/workflows/build_py_tools.yml | 18 +++--- .github/workflows/pre-commit.yml | 17 ++++- .github/workflows/push.yml | 54 ++-------------- 4 files changed, 120 insertions(+), 62 deletions(-) diff --git a/.github/scripts/set_push_chunks.sh b/.github/scripts/set_push_chunks.sh index ff0af7da6e8..21ae83ddacd 100644 --- a/.github/scripts/set_push_chunks.sh +++ b/.github/scripts/set_push_chunks.sh @@ -2,6 +2,93 @@ build_all=false chunks_count=0 +last_check_files="" +last_check_result="" +gh_output="" + +# Define the file patterns +core_files=( + '\.github/.*' + 'cores/.*' + 'package/.*' + 'tools/.*' + 'platform\.txt' + 'programmers\.txt' + 'variants/esp32/.*' + 'variants/esp32c3/.*' + 'variants/esp32c6/.*' + 'variants/esp32h2/.*' + 'variants/esp32p4/.*' + 'variants/esp32s2/.*' + 'variants/esp32s3/.*' +) +library_files=( + 'libraries/.*/examples/.*' + 'libraries/.*/src/.*' +) +networking_files=( + 'libraries/Network/src/.*' +) +fs_files=( + 'libraries/FS/src/.*' +) +static_sketches_files=( + 'libraries/NetworkClientSecure/examples/WiFiClientSecure/WiFiClientSecure\.ino' + 'libraries/BLE/examples/Server/Server\.ino' + 'libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer\.ino' + 'libraries/Insights/examples/MinimalDiagnostics/MinimalDiagnostics\.ino' + 'libraries/NetworkClientSecure/src/.*' + 'libraries/BLE/src/.*' + 'libraries/Insights/src/.*' +) +idf_files=( + 'idf_component\.yml' + 'Kconfig\.projbuild' + 'CMakeLists\.txt' + 'variants/esp32c2/.*' +) + +# Function to check if any files match the patterns +check_files() { + local patterns=("$@") + local files_found="" + for pattern in "${patterns[@]}"; do + echo "Checking pattern: $pattern" + matched_files=$(echo "$gh_output" | grep -E "$pattern") + echo "matched_files: $matched_files" + files_found+="$matched_files " + done + + last_check_files=$(echo "$files_found" | xargs) + if [[ -n $last_check_files ]]; then + last_check_result="true" + else + last_check_result="false" + fi + echo "last_check_result: $last_check_result" +} + +if [[ $IS_PR != 'true' ]]; then + gh_output=$(gh api repos/espressif/arduino-esp32/commits/"$GITHUB_SHA" --jq '.files[].filename') +else + gh_output=$(gh pr diff "$PR_NUM" --name-only) +fi +echo "gh_output: $gh_output" + +# Output the results +check_files "${core_files[@]}" +CORE_CHANGED=$last_check_result +check_files "${library_files[@]}" +LIB_CHANGED=$last_check_result +LIB_FILES=$last_check_files +check_files "${networking_files[@]}" +NETWORKING_CHANGED=$last_check_result +check_files "${fs_files[@]}" +FS_CHANGED=$last_check_result +check_files "${static_sketches_files[@]}" +STATIC_SKETCHES_CHANGED=$last_check_result +check_files "${idf_files[@]}" +IDF_CHANGED=$last_check_result if [[ $CORE_CHANGED == 'true' ]] || [[ $IS_PR != 'true' ]]; then echo "Core files changed or not a PR. Building all." @@ -76,9 +163,9 @@ chunks+="]" { echo "build_all=$build_all" - echo "build_libraries=$BUILD_LIBRARIES" - echo "build_static_sketches=$BUILD_STATIC_SKETCHES" - echo "build_idf=$BUILD_IDF" + echo "build_libraries=$LIB_CHANGED" + echo "build_static_sketches=$STATIC_SKETCHES_CHANGED" + echo "build_idf=$IDF_CHANGED" echo "chunk_count=$chunks_count" echo "chunks=$chunks" } >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/build_py_tools.yml b/.github/workflows/build_py_tools.yml index d4dfca9c8d1..ca13da03136 100644 --- a/.github/workflows/build_py_tools.yml +++ b/.github/workflows/build_py_tools.yml @@ -30,16 +30,16 @@ jobs: echo "Make sure you are using a branch inside the repository and not a fork." - name: Verify Python Tools Changed - uses: tj-actions/changed-files@v41 id: verify-changed-files - with: - fetch_depth: "2" - since_last_remote_commit: "true" - files: | - tools/get.py - tools/espota.py - tools/gen_esp32part.py - tools/gen_insights_package.py + run: | + CHANGED_FILES=$(git diff-tree --no-commit-id --name-only -r ^HEAD -- tools/get.py tools/espota.py tools/gen_esp32part.py tools/gen_insights_package.py | xargs) + echo "all_changed_files=$CHANGED_FILES" >> $GITHUB_OUTPUT + if [ -n "$CHANGED_FILES" ]; then + echo "any_changed=true" >> $GITHUB_OUTPUT + else + echo "any_changed=false" >> $GITHUB_OUTPUT + fi + - name: List all changed files shell: bash run: | diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index dc009e445da..6290b9ea908 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -58,7 +58,22 @@ jobs: - name: Get changed files id: changed-files - uses: tj-actions/changed-files@v42.0.2 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUM: ${{ github.event.pull_request.number }} + IS_PR: ${{ github.event_name == 'pull_request' }} + GITHUB_SHA: ${{ github.sha }} + run: | + if [[ $IS_PR != 'true' ]]; then + files_changed=$(gh api repos/espressif/arduino-esp32/commits/"$GITHUB_SHA" --jq '.files[].filename' | xargs) + else + files_changed=$(gh pr diff "$PR_NUM" --name-only | xargs) + fi + echo "all_changed_files=$files_changed" >> $GITHUB_OUTPUT + echo "Changed files:" + for file in $files_changed; do + echo " $file" + done - name: Run pre-commit hooks in changed files run: pre-commit run --color=always --show-diff-on-failure --files ${{ steps.changed-files.outputs.all_changed_files }} diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 211ed1658f9..feb32f95d03 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -45,12 +45,13 @@ on: - "!.github/scripts/tests_*" - "!.github/scripts/upload_*" - "variants/esp32/**/*" - - "variants/esp32s2/**/*" - - "variants/esp32s3/**/*" - "variants/esp32c2/**/*" - "variants/esp32c3/**/*" - "variants/esp32c6/**/*" - "variants/esp32h2/**/*" + - "variants/esp32p4/**/*" + - "variants/esp32s2/**/*" + - "variants/esp32s3/**/*" concurrency: group: build-${{github.event.pull_request.number || github.ref}} @@ -85,58 +86,13 @@ jobs: with: fetch-depth: 2 - - name: Get changed files - id: changed-files - uses: tj-actions/changed-files@v44 - with: - files_yaml: | - core: - - '.github/**' - - 'cores/**' - - 'package/**' - - 'tools/**' - - 'platform.txt' - - 'programmers.txt' - - "variants/esp32/**/*" - - "variants/esp32s2/**/*" - - "variants/esp32s3/**/*" - - "variants/esp32c3/**/*" - - "variants/esp32c6/**/*" - - "variants/esp32h2/**/*" - libraries: - - 'libraries/**/examples/**' - - 'libraries/**/src/**' - networking: - - 'libraries/Network/src/**' - fs: - - 'libraries/FS/src/**' - static_sketeches: - - 'libraries/NetworkClientSecure/examples/WiFiClientSecure/WiFiClientSecure.ino' - - 'libraries/BLE/examples/Server/Server.ino' - - 'libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino' - - 'libraries/Insights/examples/MinimalDiagnostics/MinimalDiagnostics.ino' - - 'libraries/NetworkClientSecure/src/**' - - 'libraries/BLE/src/**' - - 'libraries/Insights/src/**' - idf: - - 'idf_component.yml' - - 'Kconfig.projbuild' - - 'CMakeLists.txt' - - "variants/esp32c2/**/*" - - name: Set chunks id: set-chunks env: - LIB_FILES: ${{ steps.changed-files.outputs.libraries_all_changed_files }} IS_PR: ${{ github.event_name == 'pull_request' }} + PR_NUM: ${{ github.event.pull_request.number }} MAX_CHUNKS: ${{ env.MAX_CHUNKS }} - 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' }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | bash ./.github/scripts/set_push_chunks.sh From 74ee9df48c0387a2b0cf2034e7e3694fa2b74e3e Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Mon, 17 Mar 2025 12:36:10 -0300 Subject: [PATCH 050/290] fix(uart): Fixes UART CI script to work with Arduino Core 3.2.x (#11077) * fix(uart): ci uart test fail on esp32s2 after uart break * fix(uart): ci error with change pins test on ESP32 * fix(uart): ci test with perimgr using esp32 fails * feat(uart): avoid electrical noise before setting pins * fix(uart_ci): fixes the UART CI sketch due to IDF 5.3 pull up change * fix(uart_ci): keeping previous formatting and applying changes * feat(uart_ci): trick for passing esp32 wokwi ci test Wokwi ESP32 fails with the pinMode() in line 56|58 Real device with Arduino Core 3.1.2 and 3.2 needs it to fix the issue. This patch will skip the pinMode() when compiling with Wokwi and make it pass the CI test case. * feat(uart_ci): reverting the wokwi patch, once it didn't make any difference * fix(wokwi): Change CPU freq to 80 * fix(wokwi): Change CPU freq to 120 * ci(pre-commit): Apply automatic fixes * fix(uart_ci): fixes a couple typos in commentatries --------- Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Co-authored-by: Me No Dev Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- tests/validation/uart/diagram.esp32.json | 2 +- tests/validation/uart/uart.ino | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/validation/uart/diagram.esp32.json b/tests/validation/uart/diagram.esp32.json index a31c06d8313..c2fbd952fd0 100644 --- a/tests/validation/uart/diagram.esp32.json +++ b/tests/validation/uart/diagram.esp32.json @@ -6,7 +6,7 @@ { "type": "board-esp32-devkit-c-v4", "id": "esp", - "attrs": { "cpuFrequency": "40" } + "attrs": { "cpuFrequency": "120" } } ], "connections": [ diff --git a/tests/validation/uart/uart.ino b/tests/validation/uart/uart.ino index 358276c00b4..794fc9affc2 100644 --- a/tests/validation/uart/uart.ino +++ b/tests/validation/uart/uart.ino @@ -53,6 +53,8 @@ public: : uart_num(num), serial(serial_ref), peeked_char(-1), default_rx_pin(rx_pin), default_tx_pin(tx_pin), recv_msg("") {} void begin(unsigned long baudrate) { + // pinMode will force enabling the internal pullup resistor (IDF 5.3.2 Change) + pinMode(default_rx_pin, INPUT_PULLUP); serial.begin(baudrate, SERIAL_8N1, default_rx_pin, default_tx_pin); while (!serial) { delay(10); @@ -365,6 +367,8 @@ void change_pins_test(void) { if (TEST_UART_NUM == 1) { UARTTestConfig &config = *uart_test_configs[0]; + // pinMode will force enabling the internal pullup resistor (IDF 5.3.2 Change) + pinMode(NEW_RX1, INPUT_PULLUP); 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)); From 8e62997bfdb9f056935749507818b59b2f44b3dd Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Mon, 17 Mar 2025 12:36:44 -0300 Subject: [PATCH 051/290] fix(UART): sets the correct uart clock source when using begin(baudrate) (#11122) * fix(uart): uart begin does not set the clock source when baudrate changes * fix(uart): returns success on baud rate change operation * fix(code): uart typo - missing ( in the code * fix(uart): replacing mutex lock to avoid double lock * 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> --- cores/esp32/esp32-hal-uart.c | 21 +++++++++------------ cores/esp32/esp32-hal-uart.h | 2 +- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index 59a95a084f6..d76578480f5 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -585,17 +585,11 @@ uart_t *uartBegin( uartEnd(uart_nr); } else { bool retCode = true; - UART_MUTEX_LOCK(); //User may just want to change some parameters, such as baudrate, data length, parity, stop bits or pins if (uart->_baudrate != baudrate) { - if (ESP_OK != uart_set_baudrate(uart_nr, baudrate)) { - log_e("UART%d changing baudrate failed.", uart_nr); - retCode = false; - } else { - log_v("UART%d changed baudrate to %d", uart_nr, baudrate); - uart->_baudrate = baudrate; - } + retCode = uartSetBaudRate(uart, baudrate); } + UART_MUTEX_LOCK(); uart_word_length_t data_bits = (config & 0xc) >> 2; uart_parity_t parity = config & 0x3; uart_stop_bits_t stop_bits = (config & 0x30) >> 4; @@ -972,10 +966,11 @@ void uartFlushTxOnly(uart_t *uart, bool txOnly) { UART_MUTEX_UNLOCK(); } -void uartSetBaudRate(uart_t *uart, uint32_t baud_rate) { +bool uartSetBaudRate(uart_t *uart, uint32_t baud_rate) { if (uart == NULL) { - return; + return false; } + bool retCode = true; UART_MUTEX_LOCK(); #if SOC_UART_SUPPORT_XTAL_CLK // ESP32-S3, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-H2 and ESP32-P4 soc_module_clk_t newClkSrc = UART_SCLK_XTAL; @@ -993,12 +988,14 @@ void uartSetBaudRate(uart_t *uart, uint32_t baud_rate) { uart_ll_set_sclk(UART_LL_GET_HW(uart->num), newClkSrc); #endif if (uart_set_baudrate(uart->num, baud_rate) == ESP_OK) { - log_v("Setting UART%d baud rate to %d.", uart->num, baud_rate); + log_v("Setting UART%d baud rate to %ld.", uart->num, baud_rate); uart->_baudrate = baud_rate; } else { - log_e("Setting UART%d baud rate to %d has failed.", uart->num, baud_rate); + retCode = false; + log_e("Setting UART%d baud rate to %ld has failed.", uart->num, baud_rate); } UART_MUTEX_UNLOCK(); + return retCode; } uint32_t uartGetBaudRate(uart_t *uart) { diff --git a/cores/esp32/esp32-hal-uart.h b/cores/esp32/esp32-hal-uart.h index 74249194da3..9edbc4bfd22 100644 --- a/cores/esp32/esp32-hal-uart.h +++ b/cores/esp32/esp32-hal-uart.h @@ -58,7 +58,7 @@ void uartWriteBuf(uart_t *uart, const uint8_t *data, size_t len); void uartFlush(uart_t *uart); void uartFlushTxOnly(uart_t *uart, bool txOnly); -void uartSetBaudRate(uart_t *uart, uint32_t baud_rate); +bool uartSetBaudRate(uart_t *uart, uint32_t baud_rate); uint32_t uartGetBaudRate(uart_t *uart); void uartSetRxInvert(uart_t *uart, bool invert); From e2915c48e8512d3d190e883185d23b9d6e62c7ff 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, 19 Mar 2025 13:08:56 +0100 Subject: [PATCH 052/290] feat(zigbee): Save network channel after 1st joining for faster rejoin (#11123) * feat(zigbee): Save network channel after 1st joining for faster rejoin * ci(pre-commit): Apply automatic fixes * feat(zigbee): Add channel mask reset after timeout * feat(zigbee): Add the resetChannelMask to all Begin methods * feaz(zigbee): Move function to private and add set method * fix(example): Remove test from device mode 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> --- .../Zigbee_Temp_Hum_Sensor_Sleepy.ino | 8 +++- libraries/Zigbee/src/ZigbeeCore.cpp | 43 ++++++++++++++++--- libraries/Zigbee/src/ZigbeeCore.h | 12 +++++- libraries/Zigbee/src/ZigbeeEP.cpp | 1 + 4 files changed, 55 insertions(+), 9 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 65df4b02957..0bfbad1fe95 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 @@ -77,7 +77,7 @@ void setup() { esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); // Optional: set Zigbee device name and model - zbTempSensor.setManufacturerAndModel("Espressif", "SleepyZigbeeTempSensorTest"); + zbTempSensor.setManufacturerAndModel("Espressif", "SleepyZigbeeTempSensor"); // Set minimum and maximum temperature measurement value (10-50°C is default range for chip temperature measurement) zbTempSensor.setMinMaxValue(10, 50); @@ -99,11 +99,15 @@ void setup() { esp_zb_cfg_t zigbeeConfig = ZIGBEE_DEFAULT_ED_CONFIG(); zigbeeConfig.nwk_cfg.zed_cfg.keep_alive = 10000; + // For battery powered devices, it can be better to set timeout for Zigbee Begin to lower value to save battery + // If the timeout has been reached, the network channel mask will be reset and the device will try to connect again after reset (scanning all channels) + Zigbee.setTimeout(10000); // Set timeout for Zigbee Begin to 10s (default is 30s) + // When all EPs are registered, start Zigbee in End Device mode if (!Zigbee.begin(&zigbeeConfig, false)) { Serial.println("Zigbee failed to start!"); Serial.println("Rebooting..."); - ESP.restart(); + ESP.restart(); // If Zigbee failed to start, reboot the device and try again } Serial.println("Connecting to network"); while (!Zigbee.connected()) { diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index bd5849bb4b8..2200aec2662 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -6,9 +6,16 @@ #include "ZigbeeHandlers.cpp" #include "Arduino.h" -#define ZB_INIT_TIMEOUT 30000 // 30 seconds +#ifdef __cplusplus +extern "C" { +#endif +#include "zboss_api.h" +extern zb_ret_t zb_nvram_write_dataset(zb_nvram_dataset_types_t t); // rejoin scanning workaround +extern void zb_set_ed_node_descriptor(bool power_src, bool rx_on_when_idle, bool alloc_addr); // sleepy device power mode workaround +#ifdef __cplusplus +} +#endif -extern "C" void zb_set_ed_node_descriptor(bool power_src, bool rx_on_when_idle, bool alloc_addr); static bool edBatteryPowered = false; ZigbeeCore::ZigbeeCore() { @@ -18,6 +25,7 @@ ZigbeeCore::ZigbeeCore() { _primary_channel_mask = ESP_ZB_TRANSCEIVER_ALL_CHANNELS_MASK; _open_network = 0; _scan_status = ZB_SCAN_FAILED; + _begin_timeout = ZB_BEGIN_TIMEOUT_DEFAULT; _started = false; _connected = false; _scan_duration = 3; // default scan duration @@ -39,8 +47,11 @@ bool ZigbeeCore::begin(esp_zb_cfg_t *role_cfg, bool erase_nvs) { return false; } _role = (zigbee_role_t)role_cfg->esp_zb_role; - if (xSemaphoreTake(lock, ZB_INIT_TIMEOUT) != pdTRUE) { - log_e("ZigbeeCore begin timeout"); + if (xSemaphoreTake(lock, _begin_timeout) != pdTRUE) { + log_e("ZigbeeCore begin failed or timeout"); + if (_role != ZIGBEE_COORDINATOR) { // Only End Device and Router can rejoin + resetNVRAMChannelMask(); + } } return started(); } @@ -71,8 +82,11 @@ bool ZigbeeCore::begin(zigbee_role_t role, bool erase_nvs) { } default: log_e("Invalid Zigbee Role"); return false; } - if (!status || xSemaphoreTake(lock, ZB_INIT_TIMEOUT) != pdTRUE) { + if (!status || xSemaphoreTake(lock, _begin_timeout) != pdTRUE) { log_e("ZigbeeCore begin failed or timeout"); + if (_role != ZIGBEE_COORDINATOR) { // Only End Device and Router can rejoin + resetNVRAMChannelMask(); + } } return started(); } @@ -220,6 +234,7 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { switch (sig_type) { case ESP_ZB_ZDO_SIGNAL_SKIP_STARTUP: // Common log_i("Zigbee stack initialized"); + log_d("Zigbee channel mask: 0x%08x", esp_zb_get_channel_mask()); esp_zb_bdb_start_top_level_commissioning(ESP_ZB_BDB_MODE_INITIALIZATION); break; case ESP_ZB_BDB_SIGNAL_DEVICE_FIRST_START: // Common @@ -245,6 +260,8 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { log_i("Opening network for joining for %d seconds", Zigbee._open_network); esp_zb_bdb_open_network(Zigbee._open_network); } else { + // Save the channel mask to NVRAM in case of reboot which may be on a different channel after a change in the network + Zigbee.setNVRAMChannelMask(1 << esp_zb_get_current_channel()); Zigbee._connected = true; } Zigbee.searchBindings(); @@ -289,6 +306,8 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { extended_pan_id[0], esp_zb_get_pan_id(), esp_zb_get_current_channel(), esp_zb_get_short_address() ); Zigbee._connected = true; + // Set channel mask and write to NVRAM, so that the device will re-join the network faster after reboot (scan only on the current channel) + Zigbee.setNVRAMChannelMask(1 << esp_zb_get_current_channel()); } 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); @@ -483,6 +502,20 @@ void ZigbeeCore::searchBindings() { esp_zb_zdo_binding_table_req(mb_req, bindingTableCb, (void *)mb_req); } +void ZigbeeCore::resetNVRAMChannelMask() { + _primary_channel_mask = ESP_ZB_TRANSCEIVER_ALL_CHANNELS_MASK; + esp_zb_set_channel_mask(_primary_channel_mask); + zb_nvram_write_dataset(ZB_NVRAM_COMMON_DATA); + log_v("Channel mask reset to all channels"); +} + +void ZigbeeCore::setNVRAMChannelMask(uint32_t mask) { + _primary_channel_mask = mask; + esp_zb_set_channel_mask(_primary_channel_mask); + zb_nvram_write_dataset(ZB_NVRAM_COMMON_DATA); + log_v("Channel mask set to 0x%08x", mask); +} + // 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 a26e17e58a7..018f701d6e0 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -28,6 +28,8 @@ typedef enum { #define ZB_SCAN_RUNNING (-1) #define ZB_SCAN_FAILED (-2) +#define ZB_BEGIN_TIMEOUT_DEFAULT 30000 // 30 seconds + #define ZIGBEE_DEFAULT_ED_CONFIG() \ { \ .esp_zb_role = ESP_ZB_DEVICE_TYPE_ED, .install_code_policy = false, \ @@ -85,6 +87,7 @@ class ZigbeeCore { esp_zb_radio_config_t _radio_config; esp_zb_host_config_t _host_config; uint32_t _primary_channel_mask; + uint32_t _begin_timeout; int16_t _scan_status; uint8_t _scan_duration; bool _rx_on_when_idle; @@ -103,6 +106,8 @@ class ZigbeeCore { 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); + void resetNVRAMChannelMask(); // Reset to default mask also in NVRAM + void setNVRAMChannelMask(uint32_t mask); // Set channel mask in NVRAM public: ZigbeeCore(); @@ -134,7 +139,8 @@ class ZigbeeCore { esp_zb_host_config_t getHostConfig(); 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 + + void setScanDuration(uint8_t duration); // Can be set from 1 - 4. 1 is fastest, 4 is slowest uint8_t getScanDuration() { return _scan_duration; } @@ -145,7 +151,9 @@ class ZigbeeCore { bool getRxOnWhenIdle() { return _rx_on_when_idle; } - + void setTimeout(uint32_t timeout) { + _begin_timeout = timeout; + } void setRebootOpenNetwork(uint8_t time); void openNetwork(uint8_t time); diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index 6774e9111f1..7052a558192 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -104,6 +104,7 @@ void ZigbeeEP::reportBatteryPercentage() { 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; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); From 18709faa9085e2df4e24c41fed6da216b7f8c485 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Wed, 19 Mar 2025 21:02:20 -0300 Subject: [PATCH 053/290] fix(uart): uart rx timeout validation with proper log message (#11141) * feat(uart): adds a function to calculate maximum valid rx timeout * fix(uart): check uart rx timeout value and log an error msg * fix(uart): changes log message to a more clear one * 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 | 26 +++++++++++++++++++++++++- cores/esp32/esp32-hal-uart.h | 4 ++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index d76578480f5..75e2da013ea 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -757,7 +757,11 @@ bool uartSetRxTimeout(uart_t *uart, uint8_t numSymbTimeout) { if (uart == NULL) { return false; } - + uint16_t maxRXTimeout = uart_get_max_rx_timeout(uart->num); + if (numSymbTimeout > maxRXTimeout) { + log_e("Invalid RX Timeout value, its limit is %d", maxRXTimeout); + return false; + } UART_MUTEX_LOCK(); bool retCode = (ESP_OK == uart_set_rx_timeout(uart->num, numSymbTimeout)); UART_MUTEX_UNLOCK(); @@ -1382,4 +1386,24 @@ int uart_send_msg_with_break(uint8_t uartNum, uint8_t *msg, size_t msgSize) { return uart_write_bytes_with_break(uartNum, (const void *)msg, msgSize, 12); } +// returns the maximum valid uart RX Timeout based on the UART Source Clock and Baudrate +uint16_t uart_get_max_rx_timeout(uint8_t uartNum) { + if (uartNum >= SOC_UART_NUM) { + log_e("UART%d is invalid. This device has %d UARTs, from 0 to %d.", uartNum, SOC_UART_NUM, SOC_UART_NUM - 1); + return (uint16_t)-1; + } + uint16_t tout_max_thresh = uart_ll_max_tout_thrd(UART_LL_GET_HW(uartNum)); + uint8_t symbol_len = 1; // number of bits per symbol including start + uart_parity_t parity_mode; + uart_stop_bits_t stop_bit; + uart_word_length_t data_bit; + uart_ll_get_data_bit_num(UART_LL_GET_HW(uartNum), &data_bit); + uart_ll_get_stop_bits(UART_LL_GET_HW(uartNum), &stop_bit); + uart_ll_get_parity(UART_LL_GET_HW(uartNum), &parity_mode); + symbol_len += (data_bit < UART_DATA_BITS_MAX) ? (uint8_t)data_bit + 5 : 8; + symbol_len += (stop_bit > UART_STOP_BITS_1) ? 2 : 1; + symbol_len += (parity_mode > UART_PARITY_DISABLE) ? 1 : 0; + return (uint16_t)(tout_max_thresh / symbol_len); +} + #endif /* SOC_UART_SUPPORTED */ diff --git a/cores/esp32/esp32-hal-uart.h b/cores/esp32/esp32-hal-uart.h index 9edbc4bfd22..4d686fdd23d 100644 --- a/cores/esp32/esp32-hal-uart.h +++ b/cores/esp32/esp32-hal-uart.h @@ -116,6 +116,10 @@ void uart_send_break(uint8_t uartNum); // Sends a buffer and at the end of the stream, it generates BREAK in the line int uart_send_msg_with_break(uint8_t uartNum, uint8_t *msg, size_t msgSize); +// UART RX Timeout (in UART Symbols) depends on the UART Clock Source and the SoC that is used +// This is a helper function that calculates what is the maximum RX Timeout that a running UART IDF driver allows. +uint16_t uart_get_max_rx_timeout(uint8_t uartNum); + #ifdef __cplusplus } #endif From 66abd86ce906dedad848f17685ca5c445d48ae26 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 19 Mar 2025 21:06:20 -0300 Subject: [PATCH 054/290] fix(camera_webserver): Fix typo in OV2640 definition (#11145) --- .../Camera/CameraWebServer/camera_index.h | 515 +++++++++--------- 1 file changed, 260 insertions(+), 255 deletions(-) diff --git a/libraries/ESP32/examples/Camera/CameraWebServer/camera_index.h b/libraries/ESP32/examples/Camera/CameraWebServer/camera_index.h index 07e2d661821..b38e2773af3 100644 --- a/libraries/ESP32/examples/Camera/CameraWebServer/camera_index.h +++ b/libraries/ESP32/examples/Camera/CameraWebServer/camera_index.h @@ -1,260 +1,265 @@ -//File: index_ov2640.html.gz, Size: 6578 -#define index_ov2640_html_gz_len 6578 +//File: index_ov2640.html.gz, Size: 6687 +#define index_ov2640_html_gz_len 6687 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 + 0x1F, 0x8B, 0x08, 0x08, 0xA5, 0xF6, 0xDA, 0x67, 0x00, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x5F, 0x6F, 0x76, 0x32, 0x36, 0x34, 0x30, 0x2E, 0x68, 0x74, 0x6D, + 0x6C, 0x2E, 0x67, 0x7A, 0x00, 0xED, 0x7D, 0x7B, 0x73, 0xDB, 0x36, 0xD6, 0xF7, 0xFF, 0xFD, 0x14, 0x8C, 0xDA, 0xB5, 0xE4, 0xB1, 0x24, 0xDB, 0xB2, 0xE3, 0x24, + 0x5E, 0x5B, 0x79, 0x72, 0x71, 0x93, 0xCE, 0x93, 0xB4, 0xDD, 0xBA, 0x97, 0xEC, 0xEC, 0xEC, 0xA4, 0x94, 0x08, 0x49, 0x6C, 0x28, 0x52, 0x4B, 0x52, 0xBE, 0xB4, + 0xE3, 0xCF, 0xF1, 0x7E, 0xA0, 0xE7, 0x8B, 0xED, 0xEF, 0x00, 0x20, 0x09, 0x92, 0xE0, 0x4D, 0xB2, 0xA5, 0x6C, 0xF7, 0x95, 0x34, 0x12, 0x05, 0x02, 0x07, 0x07, + 0xE7, 0x86, 0x83, 0x83, 0x0B, 0xCF, 0x1E, 0x59, 0xDE, 0x38, 0xBC, 0x5D, 0x30, 0x63, 0x16, 0xCE, 0x9D, 0xE1, 0x17, 0x67, 0xE2, 0xC7, 0xC0, 0xEB, 0x6C, 0xC6, + 0x4C, 0x4B, 0x5C, 0xF2, 0xBF, 0x73, 0x16, 0x9A, 0xC6, 0x78, 0x66, 0xFA, 0x01, 0x0B, 0xCF, 0x5B, 0xCB, 0x70, 0xD2, 0x7B, 0xDA, 0xCA, 0xDE, 0x76, 0xCD, 0x39, + 0x3B, 0x6F, 0x5D, 0xD9, 0xEC, 0x7A, 0xE1, 0xF9, 0x61, 0xCB, 0x18, 0x7B, 0x6E, 0xC8, 0x5C, 0x64, 0xBF, 0xB6, 0xAD, 0x70, 0x76, 0x6E, 0xB1, 0x2B, 0x7B, 0xCC, + 0x7A, 0xFC, 0x4F, 0xD7, 0x76, 0xED, 0xD0, 0x36, 0x9D, 0x5E, 0x30, 0x36, 0x1D, 0x76, 0x7E, 0xA8, 0xC2, 0x0A, 0xED, 0xD0, 0x61, 0xC3, 0x8B, 0xCB, 0xEF, 0x8F, + 0x06, 0xC6, 0x77, 0x3F, 0x0F, 0x4E, 0x8E, 0x0F, 0xCE, 0xF6, 0x45, 0x5A, 0x92, 0x27, 0x08, 0x6F, 0xD5, 0xFF, 0xF4, 0x1A, 0x79, 0xD6, 0xAD, 0xF1, 0x47, 0x2A, + 0x89, 0x5E, 0x13, 0x20, 0xD1, 0x9B, 0x98, 0x73, 0xDB, 0xB9, 0x3D, 0x35, 0x5E, 0xF8, 0xA8, 0xB3, 0xFB, 0x96, 0x39, 0x57, 0x2C, 0xB4, 0xC7, 0x66, 0x37, 0x30, + 0xDD, 0xA0, 0x17, 0x30, 0xDF, 0x9E, 0xFC, 0x35, 0x57, 0x70, 0x64, 0x8E, 0x3F, 0x4D, 0x7D, 0x6F, 0xE9, 0x5A, 0xA7, 0xC6, 0x97, 0x87, 0x4F, 0xE9, 0x9D, 0xCF, + 0x34, 0xF6, 0x1C, 0xCF, 0xC7, 0xFD, 0x8B, 0xAF, 0xE9, 0x9D, 0xBF, 0xCF, 0x6B, 0x0F, 0xEC, 0xDF, 0xD9, 0xA9, 0x71, 0x78, 0xB2, 0xB8, 0x49, 0xDD, 0xBF, 0xFB, + 0x22, 0xF5, 0x77, 0x36, 0x28, 0xC2, 0x5E, 0x96, 0x7F, 0x5A, 0x5E, 0x3E, 0x60, 0xE3, 0xD0, 0xF6, 0xDC, 0xFE, 0xDC, 0xB4, 0x5D, 0x0D, 0x24, 0xCB, 0x0E, 0x16, + 0x8E, 0x09, 0x1A, 0x4C, 0x1C, 0x56, 0x0A, 0xE7, 0xCB, 0x39, 0x73, 0x97, 0xDD, 0x0A, 0x68, 0x04, 0xA4, 0x67, 0xD9, 0xBE, 0xC8, 0x75, 0x4A, 0x74, 0x58, 0xCE, + 0xDD, 0x4A, 0xB0, 0x65, 0x78, 0xB9, 0x9E, 0xCB, 0x34, 0x04, 0xA4, 0x8A, 0xAE, 0x7D, 0x73, 0x41, 0x19, 0xE8, 0x37, 0x9F, 0x65, 0x6E, 0xBB, 0x42, 0xA8, 0x4E, + 0x8D, 0xA3, 0xE3, 0x83, 0xC5, 0x4D, 0x05, 0x2B, 0x8F, 0x4E, 0xE8, 0x9D, 0xCF, 0xB4, 0x30, 0x2D, 0xCB, 0x76, 0xA7, 0xA7, 0x06, 0xE8, 0xAC, 0x01, 0xE1, 0xF9, + 0x16, 0xF3, 0x7B, 0xBE, 0x69, 0xD9, 0xCB, 0xE0, 0xD4, 0x38, 0xD6, 0xE5, 0x99, 0x9B, 0xFE, 0x14, 0xB8, 0x84, 0x1E, 0x90, 0xED, 0x1D, 0x6A, 0x31, 0x91, 0x59, + 0x7C, 0x7B, 0x3A, 0x0B, 0xC1, 0xD2, 0x5C, 0x9E, 0x2C, 0xD1, 0xA4, 0x0A, 0x55, 0xF1, 0xB3, 0x94, 0x6E, 0x7A, 0xAA, 0x99, 0x8E, 0x3D, 0x75, 0x7B, 0x76, 0xC8, + 0xE6, 0x68, 0x4E, 0x10, 0xFA, 0x2C, 0x1C, 0xCF, 0xCA, 0x50, 0x99, 0xD8, 0xD3, 0xA5, 0xCF, 0x34, 0x88, 0xC4, 0x74, 0x2B, 0x69, 0x30, 0x6E, 0xE6, 0x6F, 0xF5, + 0xAE, 0xD9, 0xE8, 0x93, 0x1D, 0xF6, 0x24, 0x4D, 0x46, 0x6C, 0xE2, 0xF9, 0x90, 0x73, 0x4D, 0xCE, 0x28, 0x87, 0xE3, 0x8D, 0x3F, 0xF5, 0x82, 0xD0, 0xF4, 0x41, + 0xBB, 0x6A, 0x80, 0xE6, 0x24, 0x64, 0xD0, 0xCD, 0x2A, 0x78, 0x8C, 0xA4, 0xA2, 0x1A, 0x5A, 0x71, 0xB5, 0x32, 0x83, 0xED, 0x3A, 0xB6, 0xCB, 0xEA, 0xA3, 0x57, + 0x54, 0x6F, 0x1A, 0x9C, 0xC8, 0x55, 0x83, 0x31, 0xF6, 0x7C, 0x5A, 0x26, 0x25, 0xBC, 0xAD, 0xF9, 0xCA, 0xA4, 0xDE, 0x1C, 0x1E, 0x1C, 0xFC, 0x25, 0x7F, 0x73, + 0xC6, 0x84, 0x98, 0x9A, 0xCB, 0xD0, 0x5B, 0x5F, 0x23, 0x72, 0x6A, 0x95, 0x69, 0xC7, 0xFF, 0xCC, 0x99, 0x65, 0x9B, 0x46, 0x47, 0x51, 0xE7, 0xA7, 0x07, 0x90, + 0xA9, 0x5D, 0xC3, 0x74, 0x2D, 0xA3, 0xE3, 0xF9, 0x36, 0x14, 0xC1, 0xE4, 0xE6, 0xC6, 0x41, 0x0A, 0x3A, 0x8E, 0x05, 0xDB, 0xD5, 0x34, 0xB9, 0x44, 0x67, 0x54, + 0x8A, 0xE8, 0xD5, 0xA6, 0xA6, 0xC9, 0xA9, 0xA5, 0x40, 0x9A, 0x36, 0x56, 0xF2, 0xAB, 0x0E, 0xCF, 0x04, 0x61, 0x81, 0x62, 0x19, 0xEF, 0xA2, 0x4C, 0x11, 0x0F, + 0xD1, 0xCD, 0x8E, 0x3B, 0xC8, 0x7A, 0x35, 0x33, 0x7A, 0x06, 0x59, 0xC9, 0x5D, 0x7D, 0x19, 0x09, 0x54, 0xCF, 0xF2, 0xAC, 0x50, 0x34, 0x68, 0xAE, 0xBE, 0xA9, + 0x89, 0xED, 0x10, 0x6F, 0x9D, 0x0C, 0x55, 0x58, 0x91, 0x66, 0x96, 0xA4, 0x81, 0x35, 0x69, 0x64, 0x51, 0x6A, 0x5B, 0x95, 0x46, 0x96, 0xA5, 0x89, 0x75, 0x69, + 0x60, 0x61, 0x6A, 0x59, 0x19, 0xC1, 0xCE, 0x6A, 0x7F, 0xE3, 0xCB, 0xD1, 0x32, 0x0C, 0x3D, 0x37, 0x58, 0xAB, 0x8B, 0x2A, 0xD2, 0xB3, 0xDF, 0x96, 0x41, 0x68, + 0x4F, 0x6E, 0x7B, 0x52, 0xA5, 0xA1, 0x67, 0x0B, 0x13, 0x2E, 0xE4, 0x88, 0x85, 0xD7, 0x8C, 0x95, 0xBB, 0x1B, 0xAE, 0x79, 0x05, 0xBB, 0x33, 0x9D, 0x3A, 0x3A, + 0xD9, 0x1B, 0x2F, 0xFD, 0x80, 0xFC, 0xB6, 0x85, 0x67, 0x03, 0xB0, 0x9F, 0xAF, 0x38, 0xAD, 0x83, 0x35, 0x2B, 0xEA, 0x8D, 0x47, 0x9A, 0xBA, 0xBC, 0x65, 0x48, + 0x34, 0xD6, 0x72, 0xC2, 0x43, 0x73, 0xEC, 0x10, 0xD5, 0x68, 0xEE, 0x49, 0x4D, 0xD4, 0xDC, 0x89, 0x54, 0xB0, 0xB4, 0x5B, 0x48, 0xE3, 0x75, 0x3A, 0x9E, 0xB1, + 0xF1, 0x27, 0x66, 0xED, 0x55, 0xBA, 0x61, 0x55, 0xEE, 0x61, 0xDF, 0x76, 0x17, 0xCB, 0xB0, 0x47, 0xEE, 0xD4, 0xE2, 0x41, 0x78, 0xCE, 0x05, 0x32, 0x6A, 0xE2, + 0x60, 0x50, 0xE6, 0x54, 0x3C, 0x5E, 0xDC, 0x94, 0x13, 0x41, 0x45, 0x76, 0xE8, 0x98, 0x23, 0xE6, 0x94, 0xA1, 0x2C, 0x95, 0xA1, 0xC0, 0xEC, 0x4A, 0x5B, 0x55, + 0xEC, 0xBB, 0x65, 0x7C, 0xD1, 0xE3, 0x27, 0x7F, 0xA9, 0x4D, 0x47, 0x7E, 0xDD, 0x4D, 0x25, 0x05, 0xCC, 0x81, 0x82, 0x15, 0xB9, 0xDE, 0xC8, 0x73, 0x0D, 0x1C, + 0x4A, 0x2B, 0xF0, 0x4D, 0x77, 0xCA, 0x60, 0x0B, 0x6E, 0xBA, 0xD1, 0x65, 0xF9, 0xC0, 0xA0, 0x56, 0xF3, 0xC9, 0x54, 0x83, 0xEC, 0x65, 0x15, 0x0B, 0x83, 0xD0, + 0x35, 0xFA, 0xE2, 0x62, 0x05, 0xAF, 0x44, 0xE1, 0x6F, 0x29, 0x22, 0x87, 0x5A, 0xE9, 0x10, 0x8E, 0x89, 0x56, 0x73, 0xD2, 0xB2, 0xA5, 0x75, 0xF4, 0x2B, 0x4D, + 0x43, 0x34, 0xE4, 0x9B, 0x4C, 0xAA, 0x06, 0x8D, 0x93, 0xC9, 0xD1, 0xC1, 0xD1, 0x71, 0xA5, 0xE7, 0xA4, 0x6D, 0x65, 0x66, 0xE0, 0xA8, 0x31, 0x1D, 0xB1, 0x59, + 0x29, 0x15, 0x82, 0xC0, 0xBC, 0xD2, 0x3A, 0xED, 0x5E, 0x80, 0xF1, 0x37, 0x8D, 0xDC, 0xCC, 0x51, 0x80, 0xB1, 0x5B, 0xA8, 0x19, 0x7A, 0x49, 0x41, 0x1F, 0x68, + 0xF1, 0xE3, 0x2E, 0x9D, 0x56, 0x05, 0x22, 0xF2, 0xEA, 0xD1, 0x4E, 0x71, 0x40, 0x9F, 0x45, 0x61, 0xB0, 0xD6, 0xA9, 0x0C, 0xD9, 0x4D, 0xD8, 0xB3, 0xD8, 0xD8, + 0xF3, 0x85, 0x37, 0x58, 0x30, 0x72, 0xCC, 0x30, 0xB2, 0x5A, 0x62, 0x4F, 0x67, 0xDE, 0x15, 0xF3, 0x35, 0xC4, 0xCA, 0x30, 0xF5, 0xF8, 0xD9, 0xB1, 0x55, 0x03, + 0x9A, 0x89, 0xEE, 0x51, 0x4B, 0xFB, 0x34, 0xB8, 0xC1, 0xE1, 0x78, 0x50, 0xAA, 0xC7, 0x02, 0x5C, 0x1F, 0x3A, 0x63, 0x8E, 0x1C, 0x66, 0x95, 0xF4, 0x66, 0x16, + 0x9B, 0x98, 0x4B, 0x27, 0xAC, 0x90, 0x4A, 0xF3, 0x80, 0xDE, 0x65, 0x35, 0x72, 0x33, 0xF4, 0x0F, 0x8A, 0x0B, 0x9D, 0x73, 0xC3, 0xF1, 0x4F, 0x4D, 0x9D, 0x91, + 0xAB, 0x61, 0x2E, 0x16, 0xCC, 0x44, 0xAE, 0x31, 0x24, 0x51, 0xCF, 0x87, 0x5A, 0x43, 0x0C, 0xBD, 0x9D, 0xAF, 0x35, 0x6E, 0xAF, 0x54, 0xD8, 0xD8, 0x79, 0x6C, + 0xD4, 0xE6, 0xD3, 0x89, 0x37, 0x5E, 0xEA, 0xBC, 0x9A, 0x7A, 0x8A, 0x97, 0x87, 0x77, 0x1A, 0x91, 0x2C, 0x70, 0x6C, 0xAE, 0xFE, 0x4B, 0xD7, 0x25, 0x8E, 0xF6, + 0x42, 0x1F, 0xCD, 0xD4, 0x54, 0x54, 0x8F, 0x70, 0x2B, 0xD9, 0xB0, 0x14, 0x61, 0x8B, 0x62, 0x57, 0x19, 0x33, 0xA5, 0x31, 0xA7, 0xB1, 0xA5, 0x35, 0x60, 0x43, + 0x6C, 0x2B, 0x02, 0xB5, 0x1E, 0x5D, 0xC2, 0xD9, 0x72, 0xAE, 0xF3, 0xA3, 0xA2, 0xCA, 0x0E, 0xD1, 0xE9, 0x8B, 0xEA, 0xFC, 0xE9, 0xC8, 0xEC, 0x1C, 0x74, 0x0F, + 0xBA, 0x47, 0xF8, 0xD2, 0x8C, 0x67, 0xCA, 0x85, 0x4B, 0x92, 0xB7, 0x40, 0xF2, 0x32, 0x26, 0xBA, 0x3A, 0xAC, 0x54, 0x64, 0xEC, 0x2B, 0x79, 0x51, 0x5F, 0x93, + 0xD2, 0xF1, 0xA5, 0xC3, 0x7E, 0x45, 0x3F, 0x5C, 0x20, 0xD2, 0xCD, 0x05, 0x51, 0x23, 0x2D, 0x4D, 0x59, 0x3C, 0xF7, 0x7E, 0x07, 0x31, 0xC9, 0x09, 0xF9, 0xAF, + 0x97, 0x76, 0x85, 0x14, 0x7F, 0x6A, 0x49, 0x6F, 0x4C, 0x97, 0x60, 0xDB, 0xB2, 0x81, 0x00, 0x44, 0x21, 0x7D, 0xA4, 0xD7, 0x07, 0x0C, 0x5D, 0x8C, 0x41, 0x7D, + 0x0C, 0x46, 0x0B, 0x3D, 0x43, 0x25, 0xCF, 0x0A, 0x34, 0x98, 0xD8, 0x8E, 0xD3, 0x73, 0xBC, 0xEB, 0x6A, 0x4F, 0xA4, 0x5C, 0x92, 0x73, 0x72, 0x5A, 0x2D, 0xF2, + 0xAB, 0x62, 0xBB, 0x84, 0xE5, 0xFA, 0x8F, 0xC0, 0xF6, 0xBF, 0xAD, 0x6B, 0x51, 0x54, 0x63, 0xB5, 0x8E, 0x62, 0x05, 0x79, 0x5C, 0xAF, 0xA2, 0x5A, 0xA2, 0x24, + 0x3C, 0xC1, 0xF2, 0x61, 0xCF, 0xB5, 0x8D, 0x70, 0xEC, 0x0A, 0x43, 0xCF, 0x64, 0x60, 0xE4, 0x33, 0x07, 0xE3, 0x8B, 0x2B, 0x4D, 0x3F, 0x5C, 0x23, 0x42, 0x51, + 0x39, 0x7C, 0x53, 0x8B, 0xD7, 0x69, 0x09, 0x27, 0xDD, 0xE7, 0x13, 0x5D, 0xEA, 0x0B, 0xDF, 0xA1, 0xD8, 0x56, 0xEB, 0xC5, 0xBA, 0xC2, 0xDD, 0x4F, 0x6B, 0x86, + 0x3E, 0x53, 0x03, 0x8B, 0x1E, 0x19, 0xED, 0xA9, 0xCF, 0x6E, 0x6B, 0x34, 0xA6, 0x2B, 0x7F, 0x4F, 0x45, 0xFC, 0x78, 0xF5, 0x50, 0x09, 0xEF, 0x00, 0xA4, 0x14, + 0xF5, 0x8F, 0x83, 0x1A, 0x55, 0x17, 0x57, 0x59, 0x47, 0x1E, 0xE3, 0xE8, 0x68, 0xAB, 0x55, 0xC3, 0xDC, 0x94, 0x74, 0xA1, 0x7A, 0x51, 0x8D, 0x7A, 0x5F, 0xFD, + 0x78, 0x9E, 0x4D, 0x50, 0x50, 0x3F, 0x4E, 0x27, 0x3F, 0xF5, 0xA8, 0xDC, 0xBA, 0x45, 0x2C, 0xA2, 0x68, 0x4A, 0xA5, 0xE5, 0x88, 0x83, 0x98, 0xC5, 0xD2, 0xA7, + 0x85, 0x4C, 0xD6, 0xB3, 0x31, 0xF0, 0x62, 0x96, 0x44, 0xEE, 0x33, 0x67, 0x33, 0xF2, 0xCC, 0x65, 0x97, 0x0F, 0xF6, 0xB0, 0x0F, 0x9D, 0x01, 0xC8, 0xA4, 0xE9, + 0x30, 0x4A, 0x32, 0x97, 0x07, 0xD9, 0x0B, 0xA2, 0x80, 0xF9, 0x2E, 0xAB, 0x70, 0x80, 0xAC, 0xDA, 0x22, 0x2D, 0xA3, 0xCA, 0xB5, 0xB2, 0xCC, 0xC2, 0xE4, 0x23, + 0x59, 0xE5, 0x21, 0xCF, 0xB9, 0x09, 0xB7, 0x97, 0xC4, 0x15, 0xAB, 0x0A, 0xB4, 0xFC, 0xAB, 0x23, 0xEE, 0x4A, 0x8C, 0xF5, 0xF0, 0x04, 0x66, 0xA6, 0xB4, 0xCA, + 0xB1, 0xE3, 0x05, 0x6B, 0x06, 0xC0, 0x8A, 0xE3, 0x5F, 0xDA, 0x3B, 0xB5, 0xBA, 0xEE, 0x52, 0x9D, 0x2A, 0x57, 0xC7, 0x0C, 0xCD, 0xE1, 0x14, 0x6B, 0xCD, 0x64, + 0x59, 0x94, 0x92, 0x47, 0xD0, 0xF8, 0xFC, 0x25, 0x26, 0x06, 0x61, 0x39, 0x74, 0x66, 0x34, 0x1D, 0xA8, 0xAB, 0x13, 0x2A, 0x2D, 0xE5, 0xC3, 0xCC, 0xB6, 0x2C, + 0x56, 0x1A, 0x0B, 0xA6, 0x31, 0x6F, 0x4D, 0xE7, 0x81, 0xF0, 0xD7, 0x05, 0xA5, 0x1E, 0x44, 0x29, 0x4A, 0x97, 0x35, 0xA0, 0xA6, 0x87, 0xD5, 0x18, 0xD9, 0xD1, + 0x14, 0x45, 0xD2, 0xD3, 0xAE, 0x48, 0x29, 0xAA, 0x5A, 0xE5, 0x8E, 0x63, 0xAD, 0x44, 0x32, 0xD0, 0x81, 0x72, 0xE5, 0xAD, 0x79, 0x06, 0x2B, 0x3E, 0x91, 0xD2, + 0x97, 0x73, 0x4B, 0x72, 0x1A, 0xB0, 0x57, 0x34, 0xBB, 0x72, 0x8F, 0x53, 0x6D, 0x5C, 0x02, 0xB2, 0xF5, 0x16, 0x92, 0x66, 0x4B, 0x9E, 0x51, 0x09, 0x92, 0x71, + 0x17, 0x13, 0x2D, 0xAE, 0x4A, 0xE7, 0x5A, 0x55, 0x39, 0xCE, 0xF6, 0x95, 0xD5, 0x70, 0x67, 0xFB, 0xC9, 0xC2, 0xBD, 0x33, 0x5A, 0x12, 0xA7, 0x2E, 0x9A, 0x93, + 0xF5, 0x8C, 0x1D, 0x33, 0x08, 0xCE, 0x5B, 0xB4, 0xB4, 0x4B, 0x59, 0x77, 0xC7, 0xB3, 0x58, 0xF6, 0x95, 0x61, 0x5B, 0xE7, 0x2D, 0xC7, 0x9B, 0x7A, 0x99, 0x7B, + 0xFC, 0xBE, 0xE0, 0x32, 0xFA, 0xB1, 0xF3, 0x56, 0x6A, 0x7E, 0xB1, 0xC5, 0x4B, 0x25, 0x49, 0xAD, 0xE1, 0xCE, 0x97, 0xCF, 0x9E, 0x3C, 0x39, 0xF9, 0xEB, 0x8E, + 0x3B, 0x0A, 0x16, 0xF2, 0xFB, 0x47, 0x31, 0x1D, 0x2B, 0xD6, 0xF4, 0xA1, 0x6B, 0x0B, 0x43, 0x88, 0x5E, 0x70, 0xB6, 0xCF, 0x81, 0x66, 0x10, 0xD9, 0x07, 0x26, + 0x05, 0xB8, 0x49, 0x77, 0x47, 0x87, 0x5E, 0x94, 0x25, 0x40, 0x0F, 0x3E, 0x32, 0x7D, 0x4D, 0x16, 0x9E, 0x4D, 0x38, 0xD3, 0xDC, 0x94, 0xB4, 0x38, 0x4F, 0x46, + 0xDE, 0x4D, 0xB6, 0x05, 0xBC, 0x51, 0x92, 0x61, 0x32, 0x17, 0xB3, 0x8A, 0x00, 0xA2, 0x18, 0x2F, 0x4E, 0x93, 0xAB, 0xC8, 0xA3, 0xCD, 0x94, 0x62, 0x01, 0x65, + 0xBE, 0x19, 0x3B, 0x58, 0x7F, 0x20, 0x12, 0x50, 0x95, 0x60, 0x8A, 0xEB, 0x85, 0xC2, 0x54, 0x16, 0x54, 0x95, 0x6A, 0xAA, 0x2C, 0xA3, 0x4C, 0x1B, 0x8A, 0x56, + 0x80, 0xB4, 0x3D, 0x0E, 0x5D, 0xA4, 0x95, 0x43, 0xCA, 0xF2, 0x35, 0x2A, 0xDC, 0x1A, 0x7E, 0x78, 0xF5, 0xEE, 0x7F, 0x8D, 0xF7, 0x6F, 0x7F, 0xD7, 0x72, 0xA8, + 0x0A, 0x29, 0xB2, 0xD1, 0x35, 0x6A, 0x56, 0xF8, 0x11, 0xD1, 0xA4, 0x25, 0x39, 0xC3, 0x21, 0x50, 0x6F, 0xEF, 0x30, 0x77, 0x8A, 0xF5, 0xA3, 0xAD, 0x43, 0xFC, + 0x33, 0x6F, 0xA2, 0x7F, 0x83, 0x96, 0x41, 0xF6, 0x9B, 0x5F, 0x5C, 0x99, 0xCE, 0x92, 0xAE, 0x0E, 0xEA, 0xB4, 0x35, 0x2F, 0x5A, 0xDA, 0x6C, 0xD2, 0xB0, 0xC4, + 0x34, 0x56, 0x0C, 0x71, 0x9A, 0xCA, 0xAD, 0xE1, 0x25, 0x0B, 0xCF, 0xF6, 0xC5, 0xAD, 0x0A, 0xAE, 0x95, 0xD7, 0x0D, 0x4D, 0x16, 0xE2, 0x50, 0x26, 0x42, 0x65, + 0x8C, 0x9F, 0xF8, 0x58, 0x82, 0x4B, 0x54, 0xA9, 0xC5, 0x79, 0x95, 0xEB, 0x71, 0xC9, 0xD6, 0xF0, 0x07, 0xC6, 0x1D, 0x22, 0xA0, 0x51, 0x8B, 0xF1, 0x90, 0x69, + 0xEE, 0xA3, 0xA6, 0xEA, 0x8F, 0xE5, 0x59, 0xCE, 0x49, 0xF5, 0x68, 0x36, 0x0C, 0x84, 0xAB, 0x41, 0xF7, 0x47, 0xBD, 0x9E, 0x31, 0x78, 0xFF, 0xBD, 0xD1, 0xEB, + 0xD5, 0xC8, 0xEC, 0x2D, 0xB8, 0x3A, 0x49, 0xFE, 0x1F, 0x3E, 0x6E, 0x0D, 0x7F, 0xFA, 0xF0, 0xE6, 0x45, 0x07, 0x7E, 0xE1, 0xC1, 0xCD, 0xE1, 0xE0, 0xE0, 0x60, + 0xF7, 0x6C, 0x5F, 0x64, 0x69, 0x0E, 0xEB, 0x18, 0x7C, 0xE5, 0xB0, 0x06, 0x4F, 0x01, 0xEB, 0x60, 0x70, 0xBC, 0x06, 0xAC, 0xA3, 0xD6, 0xF0, 0xED, 0x6B, 0x01, + 0xE9, 0xC9, 0x60, 0x1D, 0xA4, 0x06, 0xD0, 0x4A, 0xC2, 0x09, 0xE8, 0xDC, 0x3C, 0x39, 0x79, 0xBA, 0x06, 0x24, 0x2C, 0xB9, 0xBE, 0xFC, 0x19, 0xA0, 0xB0, 0xC6, + 0xEE, 0x06, 0xD4, 0x5A, 0x03, 0x12, 0x94, 0x8E, 0x00, 0xC1, 0xA6, 0xDF, 0x1C, 0x3F, 0x5D, 0x03, 0xD0, 0x33, 0x10, 0x89, 0x00, 0x01, 0xC8, 0xCD, 0xD1, 0x3A, + 0x54, 0xC2, 0xCA, 0xF4, 0x57, 0xDF, 0x7C, 0xDD, 0x39, 0x46, 0xCB, 0x06, 0xCF, 0x4E, 0x9A, 0xC0, 0x81, 0xEC, 0xA5, 0x41, 0x3D, 0x69, 0x0D, 0x81, 0x0A, 0xA1, + 0x13, 0x41, 0x81, 0x58, 0x0A, 0x19, 0xFD, 0xC9, 0x0D, 0x10, 0xAD, 0xC2, 0x42, 0x77, 0xCC, 0xC9, 0xA2, 0x80, 0x77, 0xC5, 0x7B, 0xB5, 0x15, 0xA4, 0xF6, 0xA4, + 0x35, 0xFC, 0x1B, 0xB5, 0x9B, 0x2A, 0x1A, 0x1C, 0xAF, 0xD1, 0x6E, 0x48, 0x3F, 0xCA, 0x13, 0x8C, 0x95, 0x41, 0x40, 0xE8, 0xDF, 0x72, 0x64, 0x08, 0xD0, 0xE1, + 0x93, 0x46, 0xC4, 0x4B, 0x43, 0x82, 0xC8, 0xFF, 0x8D, 0xB8, 0x00, 0x20, 0x37, 0x87, 0xC7, 0x6B, 0x28, 0x0F, 0x44, 0x1E, 0x8A, 0x03, 0x6D, 0x7E, 0xBA, 0xBA, + 0x88, 0x02, 0x17, 0xDE, 0x2A, 0xD8, 0x05, 0x32, 0x0B, 0xAB, 0x23, 0x03, 0x59, 0x7F, 0x76, 0x72, 0xF3, 0xEC, 0xA4, 0x1E, 0x00, 0xB2, 0xE7, 0x64, 0x1B, 0xCB, + 0x2C, 0x7E, 0x79, 0x87, 0x50, 0x66, 0xEC, 0xFF, 0xB5, 0xC4, 0x10, 0x2E, 0xBC, 0x6D, 0x6C, 0xEA, 0x65, 0x39, 0xD0, 0x44, 0x5C, 0xD4, 0xB3, 0xF2, 0x0A, 0x26, + 0xF1, 0x6A, 0xA2, 0xD6, 0xF0, 0xB8, 0x46, 0x6F, 0x9A, 0x72, 0xB7, 0x78, 0xD9, 0x14, 0xFE, 0xBC, 0x8B, 0x27, 0xC9, 0xA3, 0xCE, 0x1D, 0xDA, 0x70, 0x14, 0x77, + 0xE7, 0xB0, 0x2C, 0x2B, 0x75, 0x23, 0x1A, 0x5C, 0xCD, 0x9B, 0xD6, 0xF0, 0xE4, 0xA8, 0xB2, 0xFB, 0x5D, 0x9D, 0x19, 0x23, 0x1E, 0x2C, 0x70, 0x59, 0x10, 0x34, + 0xE6, 0x47, 0x52, 0xB4, 0x35, 0x7C, 0x19, 0x5F, 0xAF, 0xC3, 0x95, 0xDE, 0x60, 0x0D, 0xB6, 0x28, 0xE8, 0x08, 0xCE, 0xF4, 0xE0, 0x60, 0x71, 0xD6, 0x24, 0x8E, + 0xD6, 0xFD, 0x32, 0xA6, 0x0A, 0xDB, 0x75, 0xF8, 0x42, 0x83, 0x05, 0xDF, 0x0C, 0xA2, 0xB4, 0xFA, 0x5C, 0x89, 0x0A, 0xA2, 0x2F, 0x91, 0x57, 0x5B, 0xE3, 0x48, + 0x8C, 0xCA, 0x9F, 0x80, 0x1F, 0x81, 0x19, 0x2E, 0xC5, 0xBA, 0xAD, 0xC6, 0x1C, 0x49, 0x8A, 0xC2, 0x75, 0x89, 0xAF, 0xB7, 0xC6, 0x15, 0x05, 0x9D, 0x3F, 0x03, + 0x5F, 0x16, 0x6C, 0x8C, 0xBD, 0x71, 0x1F, 0xD9, 0x64, 0x82, 0x0E, 0xAB, 0x39, 0x6F, 0x52, 0xC5, 0xC1, 0x1F, 0xF1, 0xDF, 0xB8, 0xE0, 0xFF, 0x1B, 0x8F, 0x23, + 0x32, 0xE0, 0x56, 0x1F, 0x4C, 0x64, 0x7B, 0x6F, 0x19, 0x50, 0xA7, 0x21, 0x7D, 0x74, 0xD5, 0x1A, 0x7E, 0xEB, 0xC5, 0x78, 0xAE, 0xEE, 0x60, 0x7C, 0xCB, 0xA6, + 0x3C, 0x5E, 0xBD, 0x8E, 0x9F, 0xF3, 0xC6, 0x37, 0x6F, 0xF9, 0x86, 0xC8, 0x75, 0xBC, 0xAE, 0x1F, 0xE0, 0x8F, 0xFE, 0x88, 0x58, 0xDB, 0x3A, 0x3E, 0xE0, 0x1B, + 0x1F, 0xCB, 0xEB, 0xD7, 0x83, 0x02, 0x67, 0xF4, 0x25, 0x2E, 0xD6, 0x03, 0x02, 0xD7, 0xF8, 0x92, 0x2D, 0x6C, 0xF3, 0x73, 0x70, 0xB7, 0xCC, 0xEB, 0x51, 0x63, + 0xB5, 0x40, 0x99, 0xD6, 0xF0, 0xC5, 0x2F, 0x2F, 0x1B, 0x1B, 0x29, 0x31, 0xEB, 0x5B, 0x47, 0xC2, 0x93, 0xD8, 0x09, 0x55, 0x96, 0x0B, 0x6A, 0xE9, 0x35, 0xA7, + 0x6E, 0x60, 0x4B, 0xD3, 0xAE, 0x08, 0x41, 0x3E, 0x49, 0xD6, 0x52, 0x9A, 0x59, 0xAF, 0x8D, 0x0F, 0x67, 0xC1, 0x80, 0xC4, 0xC7, 0x29, 0x42, 0x9A, 0xAB, 0x30, + 0x89, 0x17, 0xE4, 0x9C, 0x32, 0xDE, 0xE0, 0x6A, 0x53, 0xEC, 0x12, 0xD5, 0x6E, 0x8D, 0x67, 0xB2, 0xD5, 0xDB, 0x66, 0x1C, 0x10, 0x99, 0x7B, 0x56, 0xF3, 0x90, + 0x95, 0x2C, 0xD7, 0x1A, 0x82, 0x6B, 0xEF, 0x71, 0xD1, 0xB8, 0x97, 0x89, 0x00, 0x3C, 0x70, 0xF7, 0xF2, 0x02, 0x3B, 0xE5, 0xD6, 0xE9, 0x59, 0x2E, 0xB1, 0x3E, + 0x13, 0x83, 0xB4, 0xD5, 0xBB, 0x95, 0x57, 0x8E, 0xB7, 0xB4, 0x56, 0x87, 0x80, 0x3E, 0xE5, 0xBB, 0xC9, 0x04, 0x5B, 0xF7, 0xD7, 0x8A, 0x2A, 0x78, 0xF3, 0x9A, + 0xE5, 0x1F, 0xD8, 0x8A, 0xB3, 0x71, 0x73, 0x03, 0xC1, 0xC6, 0xE0, 0xE2, 0xC5, 0x2B, 0xE3, 0xF2, 0xE2, 0xDB, 0xCB, 0xEF, 0x7E, 0xD8, 0x8C, 0x75, 0x40, 0x9D, + 0x5B, 0x32, 0x0C, 0xD4, 0xDA, 0xAD, 0x1B, 0x73, 0x36, 0x1E, 0xAC, 0xC2, 0x27, 0x48, 0x3B, 0x31, 0xEA, 0xF5, 0xE5, 0xF7, 0x9B, 0xE2, 0x12, 0x9C, 0xFD, 0x6D, + 0xB1, 0x09, 0x8D, 0xDD, 0x3E, 0x9F, 0x3E, 0x3A, 0xEC, 0x8A, 0x39, 0x2B, 0xF0, 0x4A, 0x14, 0x24, 0x7E, 0x19, 0xEF, 0xE8, 0x6A, 0x6B, 0x03, 0xB9, 0x18, 0x95, + 0x3F, 0xC1, 0x30, 0x0E, 0x52, 0xF1, 0x91, 0x23, 0xBD, 0x8A, 0xF2, 0x88, 0x92, 0xAD, 0xE1, 0xC5, 0x0D, 0x56, 0xC7, 0x60, 0xD3, 0xF6, 0x3A, 0x1C, 0x41, 0x08, + 0x7A, 0x0D, 0x86, 0x44, 0xA8, 0x08, 0x8E, 0x80, 0xFC, 0x9C, 0x21, 0x34, 0xA1, 0xA3, 0xCC, 0xF5, 0x21, 0x62, 0x78, 0x8F, 0x5C, 0x21, 0xE0, 0x0F, 0xC9, 0x98, + 0xE9, 0x0A, 0xFD, 0xCE, 0x94, 0xFA, 0x9D, 0x37, 0xAF, 0x36, 0x63, 0xCA, 0x50, 0xD9, 0x96, 0x2C, 0x19, 0x35, 0x73, 0x7B, 0x86, 0xCC, 0x90, 0xF3, 0xED, 0x11, + 0x15, 0x56, 0x1C, 0x44, 0xC8, 0x82, 0x18, 0x3B, 0xAF, 0x32, 0x80, 0x50, 0x34, 0xE7, 0xF0, 0x66, 0x1D, 0xD5, 0x89, 0xD0, 0x48, 0x6B, 0xCE, 0x51, 0xA2, 0x37, + 0x8F, 0xEF, 0x55, 0x6B, 0x8E, 0x2A, 0xB1, 0x5D, 0x47, 0x69, 0xA8, 0x25, 0x63, 0x66, 0x63, 0xE6, 0x7D, 0xDA, 0x98, 0x21, 0x4A, 0x59, 0xC1, 0x13, 0xE3, 0x95, + 0xF8, 0xB7, 0x0E, 0x6F, 0x06, 0xEB, 0xF0, 0x46, 0xC5, 0x28, 0xCD, 0x9E, 0x93, 0x07, 0xEA, 0x69, 0x68, 0xDE, 0xEC, 0x21, 0xE7, 0x3C, 0x16, 0xCD, 0x6D, 0x1A, + 0xCA, 0x20, 0x30, 0xF4, 0xFD, 0x66, 0x6C, 0x1A, 0x55, 0x56, 0xD3, 0xA6, 0xAD, 0x65, 0xC1, 0x78, 0xA3, 0xB6, 0x3E, 0x8C, 0x5E, 0x81, 0x1B, 0x28, 0x83, 0xE1, + 0xF3, 0x86, 0xB8, 0x41, 0x95, 0x6D, 0xA7, 0x87, 0xE1, 0xCD, 0xDC, 0x36, 0x7F, 0x7C, 0xF3, 0xFA, 0xE3, 0x74, 0x6E, 0x36, 0xE6, 0x91, 0x2C, 0x87, 0xC0, 0xAE, + 0x79, 0x6D, 0xBC, 0x79, 0xFF, 0x62, 0x23, 0xBC, 0x8A, 0x2A, 0xDD, 0x0E, 0xBF, 0xE2, 0x26, 0x6F, 0x9B, 0x67, 0x58, 0x6B, 0xD6, 0x5C, 0xA9, 0xA8, 0x50, 0x6B, + 0xF8, 0x8E, 0xE1, 0x4C, 0x9C, 0x57, 0x9E, 0x2F, 0x8F, 0xC8, 0xDB, 0x08, 0xD7, 0x78, 0xCD, 0xDB, 0x61, 0x99, 0x68, 0xF4, 0xB6, 0xF9, 0x35, 0x9B, 0xDB, 0xBE, + 0xEF, 0xF9, 0x8D, 0x59, 0x26, 0xCB, 0x21, 0x4C, 0xD5, 0x7B, 0xCF, 0xAF, 0x36, 0xC2, 0xAE, 0xA8, 0xD6, 0xED, 0x70, 0x2C, 0x6E, 0xF3, 0xB6, 0x99, 0x76, 0x35, + 0x71, 0xEC, 0x45, 0x63, 0x96, 0xF1, 0x52, 0x58, 0x79, 0xD6, 0xFB, 0x1A, 0xBF, 0x1B, 0x61, 0x97, 0xA8, 0x71, 0x3B, 0xCC, 0x92, 0xAD, 0xDD, 0x36, 0xAB, 0xAC, + 0xF1, 0x75, 0x63, 0x46, 0xA1, 0x4C, 0x6B, 0xF8, 0xFA, 0xD5, 0x2F, 0x46, 0xE7, 0xB5, 0x77, 0x8D, 0x7D, 0x71, 0xBF, 0x33, 0xE3, 0xE2, 0x5B, 0xAC, 0xC0, 0xDA, + 0x00, 0xC7, 0xA8, 0xEA, 0xED, 0xF0, 0x8B, 0x37, 0x7A, 0xDB, 0xDC, 0xE2, 0x7B, 0x80, 0xB0, 0x0C, 0x7E, 0x85, 0xB5, 0x2F, 0xA2, 0x20, 0xAD, 0x7D, 0xC1, 0x95, + 0xF1, 0xD2, 0xDC, 0x8C, 0x41, 0x8C, 0xEB, 0xDD, 0x84, 0xD3, 0x9E, 0x34, 0x72, 0xFB, 0x5E, 0x86, 0x55, 0x83, 0x45, 0x69, 0x17, 0xC3, 0xFA, 0x48, 0xDB, 0x69, + 0x68, 0x9B, 0x29, 0x16, 0xF2, 0xBD, 0xBB, 0x78, 0x6D, 0x7C, 0x13, 0xFD, 0xAD, 0xD1, 0x9A, 0x95, 0x63, 0x76, 0x45, 0x43, 0xDB, 0x34, 0x3E, 0xE9, 0xC1, 0xED, + 0xE0, 0x31, 0x42, 0x0E, 0xEB, 0x0C, 0x6F, 0x8B, 0xC2, 0xA8, 0x8F, 0x1F, 0xAF, 0xC9, 0x13, 0x75, 0x33, 0x86, 0x3C, 0xC5, 0xB0, 0x4A, 0x49, 0xE4, 0xA6, 0x00, + 0x3E, 0x9C, 0xC7, 0xF2, 0x7F, 0x9C, 0x4E, 0xE8, 0x20, 0x84, 0xFD, 0x86, 0x85, 0xC6, 0x25, 0x5D, 0xD6, 0xDC, 0x05, 0xA0, 0x40, 0x89, 0xB6, 0x00, 0xE1, 0xFC, + 0x50, 0x73, 0x8E, 0xB9, 0x3E, 0x3A, 0xDF, 0x11, 0xB0, 0xE8, 0x5F, 0x35, 0xB0, 0xDA, 0xFB, 0x05, 0xF8, 0x06, 0x21, 0xDA, 0xF1, 0x93, 0x3E, 0x8E, 0x15, 0xA2, + 0x2F, 0xB6, 0xFF, 0x0D, 0xCF, 0x70, 0x60, 0x85, 0x1B, 0x65, 0xE3, 0x7B, 0xE3, 0xAE, 0xE5, 0x66, 0xA7, 0x91, 0xE7, 0x58, 0xC8, 0xF8, 0xC2, 0xBA, 0xA2, 0xA3, + 0x69, 0x2C, 0x03, 0x7B, 0x1D, 0xE4, 0xB6, 0x1D, 0x2A, 0x02, 0xDD, 0x89, 0x20, 0x54, 0x10, 0x7B, 0xE6, 0x47, 0xE0, 0xC5, 0x06, 0x2B, 0x3A, 0xCC, 0xA3, 0x84, + 0xDA, 0x05, 0x3B, 0x8D, 0x7C, 0x86, 0xD8, 0x49, 0xB4, 0xC3, 0x44, 0xB3, 0x01, 0x4D, 0xBB, 0xEF, 0xE8, 0x07, 0x36, 0xB5, 0x03, 0xE0, 0x68, 0x80, 0x4F, 0xFB, + 0x7C, 0xAF, 0x86, 0xD0, 0x90, 0x7A, 0xFB, 0x80, 0xD4, 0x2A, 0xE5, 0x2E, 0x46, 0xED, 0xEE, 0xAE, 0x46, 0x5D, 0x48, 0x76, 0x2F, 0x56, 0x1A, 0x62, 0x95, 0x14, + 0x62, 0xF9, 0xF9, 0xEC, 0x98, 0x76, 0x9D, 0x18, 0x51, 0xD3, 0xB0, 0xED, 0xEB, 0xB8, 0x6A, 0xE9, 0x79, 0xE5, 0x96, 0x21, 0xB4, 0x74, 0xE5, 0x1D, 0x43, 0x44, + 0x25, 0x2C, 0x3D, 0x9A, 0x76, 0x8D, 0xF7, 0x66, 0xF0, 0xA9, 0x6B, 0xFC, 0x4C, 0x0A, 0xBF, 0xC1, 0x8D, 0x43, 0x84, 0x3B, 0xF6, 0x32, 0xC6, 0x5D, 0x47, 0x6E, + 0xF3, 0x90, 0x58, 0x5F, 0x1C, 0xFD, 0x43, 0xC4, 0x4D, 0x6C, 0x1E, 0x52, 0x42, 0x6F, 0x37, 0x87, 0xB4, 0x29, 0xE2, 0xDE, 0xF6, 0x0F, 0xDD, 0x4B, 0x93, 0xE6, + 0x20, 0x66, 0xCD, 0x26, 0xE1, 0x9F, 0x68, 0x12, 0x2E, 0xE2, 0x26, 0x3D, 0xBD, 0xCF, 0x1D, 0x51, 0xF7, 0xD2, 0x22, 0x39, 0xB1, 0xF3, 0x99, 0x34, 0xA9, 0xD6, + 0x26, 0x2F, 0x2E, 0xDB, 0xF7, 0xB5, 0xC7, 0x4B, 0x6B, 0x0C, 0x71, 0x2A, 0x43, 0x3D, 0x9D, 0xA7, 0x9E, 0xE6, 0xDE, 0x74, 0x9E, 0x7A, 0xB0, 0x55, 0x75, 0x5E, + 0x96, 0x55, 0x74, 0x7E, 0x83, 0xCA, 0x1E, 0x21, 0xFE, 0x27, 0x53, 0xF8, 0xA8, 0x59, 0x0D, 0x94, 0x5E, 0xDB, 0xAC, 0xCD, 0x6A, 0x48, 0x2C, 0x09, 0x90, 0xCD, + 0xFB, 0xD3, 0x90, 0x02, 0xB9, 0x5D, 0x49, 0x48, 0xA5, 0xCD, 0x19, 0x6E, 0xA6, 0x4F, 0xE2, 0x9E, 0x94, 0xCA, 0x4E, 0x59, 0x3B, 0xED, 0x3C, 0x3A, 0xC2, 0x7E, + 0x19, 0xEE, 0x36, 0xDD, 0x07, 0x7B, 0xEA, 0x6F, 0x26, 0x7D, 0x60, 0xA7, 0x8C, 0x36, 0xBE, 0x2D, 0xE0, 0x07, 0x37, 0x76, 0xCC, 0xB0, 0xBF, 0xB8, 0x99, 0x2F, + 0x96, 0xAD, 0x69, 0x73, 0xFE, 0xD8, 0x6A, 0xD2, 0xAA, 0x12, 0x4C, 0xE2, 0x0E, 0x8B, 0x43, 0xDB, 0xAA, 0x07, 0x1F, 0xE2, 0x96, 0x6B, 0x06, 0xCD, 0x8A, 0x51, + 0x88, 0x8B, 0x15, 0x8D, 0x89, 0xB9, 0x21, 0x94, 0x41, 0x0C, 0x5C, 0x47, 0x76, 0xCD, 0xF0, 0x26, 0x13, 0xFE, 0xAC, 0x9E, 0x27, 0x64, 0x30, 0x82, 0x4F, 0x94, + 0x7E, 0x80, 0xCA, 0x4B, 0x46, 0xC4, 0x09, 0x86, 0x31, 0x6E, 0x5C, 0xC4, 0xA4, 0xA0, 0xDD, 0x1B, 0x09, 0xB0, 0xA0, 0x90, 0x48, 0xF0, 0xFA, 0x9B, 0x9F, 0x75, + 0x34, 0x10, 0xBA, 0x76, 0x90, 0x27, 0x01, 0x36, 0x86, 0xAD, 0xBA, 0x31, 0x1C, 0x19, 0x6A, 0x52, 0x8B, 0x8F, 0x5A, 0x05, 0xB5, 0x8E, 0x26, 0xC9, 0x9E, 0xB1, + 0x75, 0x4C, 0x96, 0x86, 0x02, 0x58, 0x1C, 0x4F, 0xAB, 0x42, 0x8D, 0xEF, 0x55, 0x0D, 0xA8, 0x25, 0x07, 0x18, 0x4B, 0xD7, 0x97, 0x03, 0x0B, 0x24, 0x5B, 0x59, + 0x0C, 0x80, 0xA3, 0x56, 0x0C, 0xEE, 0x8B, 0x06, 0x58, 0x14, 0x4A, 0xCD, 0x6F, 0x2C, 0x06, 0xE8, 0x00, 0x6B, 0x89, 0x01, 0xDA, 0x2E, 0xC4, 0x20, 0xD9, 0x50, + 0x98, 0xAC, 0x18, 0xAA, 0x20, 0x96, 0x22, 0x05, 0x4F, 0x20, 0x05, 0x87, 0x83, 0x27, 0xF5, 0x34, 0x61, 0x73, 0x36, 0xF7, 0x9A, 0xD6, 0x78, 0x34, 0xB5, 0xB7, + 0xBF, 0xD8, 0xAE, 0xE5, 0x5D, 0x37, 0x33, 0xB9, 0x6A, 0x45, 0x9F, 0xBB, 0xB9, 0x6D, 0x36, 0x6A, 0xA5, 0x50, 0x4B, 0x0F, 0x81, 0xA4, 0x4B, 0x84, 0xAD, 0x10, + 0xE4, 0xCC, 0x1F, 0x7B, 0x90, 0xDA, 0x91, 0x14, 0xE5, 0xAE, 0xE7, 0x04, 0xE4, 0xD7, 0x60, 0x7F, 0xF3, 0xB5, 0xB1, 0xC2, 0x8E, 0xF4, 0x82, 0x15, 0xE1, 0xD8, + 0xCB, 0x6C, 0xAC, 0xB0, 0x73, 0xBF, 0xFE, 0x9A, 0x75, 0x3A, 0x45, 0xC1, 0x58, 0xED, 0x18, 0x85, 0xCA, 0xE5, 0xDB, 0x8A, 0xEF, 0xB2, 0x5E, 0xBC, 0x42, 0x68, + 0x2B, 0x7C, 0xAC, 0x7A, 0x7B, 0x6E, 0xB3, 0x02, 0x20, 0x8B, 0x83, 0xA7, 0x58, 0xDE, 0x8E, 0xAB, 0x87, 0xF6, 0x0C, 0x3F, 0x9C, 0x2A, 0xC6, 0x2C, 0xAE, 0xBC, + 0xA1, 0x31, 0x4B, 0xFC, 0x7C, 0x08, 0xD3, 0xD6, 0x07, 0x2F, 0x7F, 0xD7, 0x34, 0x09, 0xF1, 0xDF, 0x55, 0x9B, 0x74, 0x74, 0x5F, 0x4D, 0x5A, 0xA3, 0xAB, 0x8A, + 0xA5, 0x2B, 0xF4, 0x42, 0x3C, 0x9F, 0x70, 0x55, 0xE1, 0x12, 0xA5, 0x21, 0x5B, 0xC2, 0xE6, 0x1A, 0x97, 0x68, 0xEA, 0x46, 0x05, 0x2C, 0x42, 0xA0, 0x1E, 0x33, + 0xE2, 0x48, 0x4B, 0xC2, 0x0C, 0x98, 0x97, 0xCF, 0x4B, 0xBE, 0x44, 0x8B, 0xEA, 0x8A, 0x97, 0xA6, 0x45, 0xB0, 0x66, 0x9F, 0x8F, 0x78, 0xE1, 0x78, 0x32, 0x4A, + 0x5D, 0xD9, 0x78, 0x89, 0xE2, 0x64, 0xBC, 0xF8, 0xD5, 0xE6, 0x05, 0x2C, 0xC6, 0x60, 0x65, 0x7E, 0xE0, 0xC0, 0x93, 0xCF, 0xCC, 0x82, 0x89, 0x26, 0xAD, 0x21, + 0x62, 0x38, 0x36, 0x65, 0x73, 0x22, 0xA6, 0x4C, 0x23, 0xC9, 0x7E, 0x50, 0x3A, 0x30, 0x3C, 0x5A, 0x99, 0x72, 0x68, 0x9A, 0xCC, 0x24, 0xE9, 0x7B, 0xE5, 0xB3, + 0x7D, 0x38, 0x85, 0x9A, 0x23, 0xD7, 0xF4, 0x78, 0x9E, 0x89, 0xC7, 0xBE, 0x15, 0x1C, 0x97, 0x16, 0x1F, 0xD3, 0xC6, 0xE7, 0xB9, 0x92, 0x03, 0x41, 0x63, 0x47, + 0x33, 0x7B, 0x50, 0x68, 0xE5, 0x91, 0x68, 0x67, 0xA6, 0xDC, 0x93, 0x7F, 0x45, 0x73, 0x69, 0x34, 0x29, 0x67, 0xCC, 0x7C, 0x36, 0x39, 0x6F, 0x7D, 0x19, 0xC3, + 0x94, 0xD4, 0xA2, 0x2C, 0x2D, 0x03, 0x26, 0xD9, 0x75, 0x3C, 0x93, 0x9C, 0x55, 0x73, 0x81, 0x7D, 0xFC, 0xAC, 0xFF, 0xDB, 0x82, 0x82, 0xBC, 0xB8, 0x79, 0xB6, + 0x6F, 0xD6, 0x9B, 0xC7, 0xE5, 0x47, 0x8B, 0xCA, 0x99, 0x76, 0xBA, 0x8C, 0x27, 0xF1, 0xFE, 0xEF, 0xFF, 0x55, 0x85, 0x66, 0xE8, 0xE1, 0x7F, 0x09, 0x01, 0x20, + 0x46, 0xFE, 0xF8, 0xBC, 0x05, 0x4C, 0x7D, 0x2F, 0x80, 0x2B, 0x6A, 0x63, 0x92, 0xAE, 0x80, 0x72, 0x05, 0xD4, 0xDE, 0xD7, 0x91, 0x3B, 0x93, 0x59, 0x33, 0x36, + 0x39, 0x0B, 0xC6, 0xBE, 0xBD, 0x80, 0xAB, 0x86, 0xC7, 0x00, 0x2F, 0x71, 0x76, 0x5D, 0xD8, 0x47, 0x44, 0xF5, 0xE2, 0x0A, 0x17, 0xEF, 0x28, 0xC2, 0x0C, 0xCA, + 0x77, 0xDA, 0xAF, 0xBF, 0x7B, 0x4F, 0x07, 0x60, 0x50, 0x1A, 0xE8, 0xC5, 0xAC, 0x76, 0xD7, 0x98, 0x2C, 0x5D, 0xE1, 0xBD, 0x77, 0xB0, 0x6D, 0xC6, 0x0D, 0xC5, + 0x43, 0x18, 0xAF, 0x4C, 0x1F, 0x47, 0x9F, 0x06, 0xEC, 0xAD, 0x17, 0x84, 0xC6, 0x39, 0x08, 0x2C, 0x21, 0xE2, 0x50, 0x47, 0x7E, 0x48, 0x42, 0x5F, 0xB4, 0x4B, + 0xE6, 0x14, 0x0D, 0xFF, 0xC9, 0x77, 0x90, 0x35, 0x2E, 0xB5, 0x67, 0xB4, 0x4F, 0x9F, 0x1E, 0xB6, 0x49, 0xFE, 0xE2, 0x2A, 0x26, 0xF4, 0x58, 0x45, 0xE4, 0xEB, + 0x2C, 0x7D, 0xA7, 0x6B, 0x8C, 0x47, 0xBB, 0xE2, 0x90, 0x44, 0x9E, 0x4C, 0x69, 0xD1, 0xE9, 0xB9, 0xFD, 0x70, 0xC6, 0xDC, 0x4E, 0x82, 0x19, 0x94, 0x61, 0x81, + 0xF9, 0xDC, 0xD4, 0x13, 0x22, 0xED, 0x49, 0x92, 0xDE, 0x87, 0x43, 0x1F, 0xE2, 0xF9, 0x2E, 0x8F, 0xCE, 0xCF, 0x71, 0x6E, 0xE6, 0x41, 0xFA, 0x41, 0x92, 0xE3, + 0x51, 0x36, 0x5F, 0x17, 0xA3, 0xC4, 0x54, 0xC2, 0x8F, 0x30, 0x0D, 0xCA, 0x31, 0xBF, 0x77, 0x06, 0x73, 0x32, 0xE7, 0xCC, 0xC6, 0x05, 0xC8, 0x8A, 0x74, 0x76, + 0xD3, 0x08, 0x76, 0x2C, 0x33, 0x34, 0x65, 0x5B, 0x94, 0x5A, 0x81, 0x49, 0xD7, 0xE0, 0xB7, 0xD4, 0xD3, 0x27, 0xEF, 0x76, 0xFB, 0xA0, 0x21, 0xDA, 0x1B, 0x97, + 0x66, 0xBE, 0x9F, 0x7D, 0xF4, 0x25, 0x4A, 0xF7, 0x0E, 0xBB, 0x06, 0xDD, 0x49, 0x97, 0x55, 0x90, 0x94, 0x57, 0x77, 0x31, 0xD1, 0xCA, 0xC1, 0x6A, 0x40, 0x0A, + 0x70, 0xFC, 0xF0, 0xC9, 0x98, 0xD6, 0xB0, 0x3D, 0x98, 0x04, 0x00, 0xC5, 0x30, 0x11, 0x20, 0x7C, 0xC0, 0x2E, 0x1F, 0x3D, 0x77, 0x85, 0x51, 0x54, 0xB8, 0xB6, + 0xBF, 0x0F, 0x95, 0x86, 0x51, 0x62, 0x90, 0x8A, 0x69, 0xA7, 0x2D, 0x27, 0x30, 0x21, 0x51, 0xED, 0x83, 0x9B, 0xF6, 0x1E, 0x00, 0xE0, 0x44, 0x4C, 0xCC, 0x7D, + 0x63, 0x7A, 0x19, 0x43, 0x8F, 0xDD, 0x04, 0x1A, 0xBF, 0x4D, 0x20, 0x33, 0xF7, 0x79, 0x3A, 0xAF, 0x24, 0x7B, 0xA3, 0x23, 0xD3, 0xF7, 0xDA, 0xBB, 0x6D, 0x89, + 0x3C, 0xFF, 0x0F, 0x71, 0xEB, 0x88, 0x8B, 0x1D, 0x8E, 0xE3, 0xAE, 0x71, 0x76, 0x26, 0xAB, 0x11, 0xB9, 0x28, 0x11, 0x99, 0xF8, 0x4F, 0xE6, 0x56, 0x2C, 0x8A, + 0xBF, 0x7E, 0xF5, 0x47, 0x24, 0xB3, 0x77, 0xFB, 0xC0, 0xFA, 0x39, 0x45, 0x10, 0xBE, 0xFA, 0x03, 0xDF, 0x77, 0x3B, 0x3C, 0x6C, 0xF0, 0xD5, 0x1F, 0xF4, 0x73, + 0xB7, 0x83, 0x9A, 0x70, 0xCD, 0xEB, 0xBB, 0xFB, 0x95, 0xD3, 0x21, 0x4F, 0x3D, 0x44, 0x89, 0x0B, 0xA8, 0x17, 0x93, 0xAD, 0x31, 0x4E, 0x38, 0xF0, 0xBC, 0x10, + 0x29, 0xE0, 0x11, 0xF3, 0x7B, 0x8C, 0xDD, 0xCF, 0x5D, 0x23, 0x84, 0x24, 0x47, 0x4C, 0x77, 0xC0, 0x92, 0x88, 0x50, 0xF1, 0x09, 0xA8, 0xF6, 0x84, 0xE7, 0x34, + 0xA4, 0xAA, 0x24, 0x02, 0x12, 0xE5, 0xC4, 0xC3, 0x2E, 0x02, 0x86, 0x05, 0x28, 0x1D, 0x02, 0x95, 0xC8, 0x5B, 0x01, 0xC5, 0x87, 0xC3, 0x54, 0x13, 0xF8, 0x81, + 0xC4, 0x37, 0x64, 0x33, 0xDA, 0x92, 0x69, 0xB1, 0xB0, 0xC9, 0x5F, 0xC8, 0x61, 0x82, 0xA9, 0xB8, 0x59, 0x20, 0x87, 0x1F, 0x70, 0x1C, 0x63, 0x87, 0xCE, 0x64, + 0xCC, 0x9A, 0x8A, 0x1C, 0x89, 0x28, 0xD3, 0x73, 0xFA, 0x02, 0x5D, 0xE8, 0xA7, 0x90, 0x3F, 0x80, 0x2A, 0x5C, 0xF8, 0x0E, 0x0F, 0x01, 0x7C, 0xBC, 0xE9, 0xC2, + 0x78, 0xD1, 0xC5, 0x2D, 0x34, 0xC3, 0xB5, 0xE8, 0x3F, 0xFD, 0xE0, 0x9F, 0x68, 0x14, 0x25, 0xC8, 0x2B, 0xA4, 0x71, 0x9F, 0x95, 0x92, 0xC4, 0x05, 0xE5, 0xE2, + 0x3E, 0x06, 0xCF, 0x25, 0xAE, 0x90, 0x46, 0x67, 0x7E, 0x40, 0x76, 0xBB, 0xC6, 0xC8, 0x76, 0x5D, 0x7E, 0x51, 0x81, 0x7D, 0xD2, 0xD5, 0x3F, 0x0F, 0x6E, 0xD0, + 0x02, 0x89, 0xDA, 0xDD, 0x4E, 0x70, 0x1B, 0xFF, 0xBB, 0xBD, 0xDB, 0x61, 0x74, 0x8F, 0x23, 0x89, 0x6B, 0xBA, 0xC3, 0x31, 0xBD, 0xDB, 0x01, 0x7E, 0x74, 0x27, + 0x42, 0x98, 0x27, 0xD0, 0xED, 0x08, 0xEF, 0xBB, 0x9D, 0x90, 0xEE, 0x4B, 0xE4, 0xF1, 0x8F, 0x6E, 0xCA, 0x16, 0x20, 0x33, 0x2F, 0x2B, 0x9B, 0x81, 0xBF, 0xBC, + 0xA4, 0x6C, 0x0B, 0x30, 0xE0, 0x0F, 0x74, 0x07, 0x12, 0xA2, 0x4D, 0x77, 0x3B, 0xB2, 0x4D, 0x48, 0x92, 0x57, 0x59, 0x52, 0x93, 0x4D, 0x08, 0xA5, 0x15, 0x79, + 0x29, 0x3A, 0x69, 0xA5, 0xFF, 0x80, 0x7E, 0x5C, 0x38, 0x8C, 0x2E, 0x5F, 0xDE, 0x7E, 0x63, 0x75, 0xDA, 0x72, 0x42, 0xB6, 0x4D, 0x36, 0x4C, 0x2D, 0xD3, 0xF7, + 0xDC, 0xB1, 0x63, 0xE3, 0xF1, 0x31, 0x90, 0xB7, 0x5D, 0xE3, 0x7C, 0x28, 0xED, 0x18, 0x09, 0x34, 0xB2, 0xAB, 0x42, 0x5A, 0x08, 0x3A, 0x9A, 0x52, 0x6C, 0xEF, + 0xF6, 0xB9, 0x1C, 0x4A, 0x59, 0x23, 0x10, 0x52, 0x05, 0xEB, 0xC1, 0xA0, 0xCC, 0x1A, 0x18, 0x39, 0x6D, 0x29, 0x05, 0xC2, 0x73, 0x2B, 0x50, 0x38, 0x18, 0xD5, + 0xD4, 0xA2, 0xA7, 0x48, 0x59, 0xD9, 0x12, 0xAD, 0x8E, 0x14, 0xF8, 0x51, 0x56, 0x81, 0xC1, 0x2A, 0x3F, 0xEC, 0xB4, 0x2F, 0x68, 0x21, 0xF0, 0x3F, 0xDA, 0x7B, + 0x94, 0x69, 0xAF, 0xFD, 0xCF, 0x53, 0xA3, 0xBD, 0xA7, 0x6A, 0xB2, 0xD0, 0x43, 0x45, 0xE5, 0x04, 0xC7, 0x84, 0xE5, 0xAA, 0xE6, 0x98, 0x9C, 0x07, 0xE3, 0x1C, + 0x53, 0xCB, 0xDC, 0x03, 0xC7, 0xD4, 0x89, 0xE0, 0x75, 0xB8, 0xA6, 0xCE, 0xBC, 0x96, 0x70, 0xAE, 0xB2, 0xBC, 0x64, 0x9A, 0xE4, 0x96, 0x6A, 0xDA, 0x63, 0x6E, + 0xAD, 0xC2, 0x26, 0xD1, 0xC5, 0x41, 0x7B, 0x98, 0xFF, 0xF6, 0xC7, 0xF7, 0xEF, 0xC8, 0x54, 0xEA, 0x59, 0x16, 0x73, 0x2C, 0xEB, 0x8E, 0x68, 0x20, 0x50, 0xDF, + 0x99, 0x32, 0xDC, 0xA9, 0x3E, 0x74, 0xAF, 0x6D, 0xA0, 0x0F, 0x45, 0x32, 0xF5, 0xA0, 0x15, 0x82, 0x20, 0x0D, 0x6F, 0x3D, 0xDD, 0x25, 0x63, 0x1B, 0x29, 0x6F, + 0x52, 0xAA, 0x44, 0x16, 0xA8, 0x40, 0x2D, 0x26, 0x0A, 0xC8, 0x39, 0x85, 0x51, 0xFA, 0x84, 0x8D, 0xAB, 0x08, 0xD7, 0xD7, 0xA0, 0xAE, 0x51, 0x8B, 0x6C, 0x7A, + 0x62, 0xDB, 0x64, 0xD1, 0x12, 0xEA, 0x48, 0xCB, 0x5F, 0x8B, 0x40, 0x32, 0x86, 0xAD, 0x11, 0xF0, 0xA8, 0x27, 0xA8, 0x05, 0x26, 0x0A, 0x5D, 0x16, 0xC3, 0xB9, + 0x6D, 0x02, 0xE7, 0x56, 0x03, 0x47, 0xF6, 0x3C, 0xB5, 0xC0, 0xC8, 0x40, 0x57, 0x21, 0x94, 0x7A, 0xC8, 0xC8, 0xE0, 0x92, 0xAE, 0x4D, 0xB2, 0xA7, 0xAB, 0xD7, + 0x26, 0x19, 0x14, 0x29, 0x86, 0x53, 0x93, 0x36, 0x32, 0x12, 0xA1, 0x91, 0xE7, 0xAC, 0x37, 0x02, 0xCB, 0x22, 0x3E, 0xAB, 0xFB, 0x1F, 0x13, 0x13, 0xD6, 0x22, + 0xF9, 0xD9, 0x8A, 0x96, 0x4C, 0xF9, 0xEA, 0x0C, 0x92, 0x70, 0xE6, 0x68, 0x7B, 0x03, 0x3C, 0x72, 0xC0, 0x0C, 0x61, 0x9F, 0x30, 0x8E, 0x67, 0x41, 0x9F, 0x3C, + 0xDC, 0x98, 0x8C, 0xB9, 0x5B, 0x7D, 0x17, 0x08, 0x70, 0x80, 0xBB, 0xA7, 0xD2, 0x8D, 0x4D, 0xC4, 0x33, 0x07, 0x4B, 0x24, 0x17, 0x81, 0x13, 0x77, 0x0B, 0x20, + 0xCA, 0x1E, 0x26, 0x5D, 0x82, 0x12, 0x8B, 0xA0, 0xF1, 0x51, 0x8C, 0x02, 0x0B, 0xAB, 0x98, 0xF3, 0xFD, 0x8C, 0xAC, 0x40, 0x3E, 0xFA, 0x89, 0x20, 0x50, 0x3C, + 0x2A, 0x19, 0x9A, 0x8D, 0xE1, 0x08, 0x1A, 0xED, 0x68, 0xCA, 0xAE, 0x7D, 0x9A, 0xF3, 0xB8, 0x51, 0x42, 0x4E, 0xC2, 0x19, 0xCF, 0x05, 0x8E, 0xA9, 0x07, 0x1A, + 0x8C, 0x30, 0xF8, 0x8E, 0x9F, 0x5B, 0x24, 0x80, 0xF1, 0x85, 0xD5, 0x31, 0x24, 0x91, 0x46, 0x03, 0xD7, 0x4C, 0x92, 0x98, 0xDB, 0xE9, 0xE1, 0x69, 0x04, 0xFA, + 0x5A, 0x53, 0xFE, 0xBB, 0xAC, 0x48, 0xFE, 0x93, 0x2B, 0xBE, 0x93, 0x62, 0x3E, 0x43, 0xE0, 0xC5, 0x95, 0xFE, 0x7C, 0xDE, 0xBF, 0xD1, 0x0E, 0x25, 0x37, 0x28, + 0x9B, 0xFB, 0xFB, 0xC6, 0x8B, 0x30, 0x34, 0xC1, 0x00, 0x9A, 0xA7, 0x9C, 0x11, 0x7D, 0x0C, 0x31, 0x65, 0x4C, 0x11, 0x58, 0x12, 0x4A, 0xB1, 0xA8, 0x18, 0x14, + 0x21, 0xBD, 0xA5, 0xC7, 0x3C, 0x45, 0xEA, 0xCC, 0x41, 0xF5, 0xFF, 0xB5, 0x64, 0xFE, 0xED, 0x25, 0x27, 0x98, 0xE7, 0xBF, 0x70, 0x9C, 0x4E, 0x9B, 0x44, 0x53, + 0x4E, 0x3B, 0x73, 0x1B, 0x8F, 0x4C, 0x00, 0x75, 0x81, 0x3A, 0xC0, 0xE3, 0x44, 0xE6, 0xA3, 0x58, 0x85, 0xE4, 0x3B, 0xC6, 0x5D, 0xE8, 0xAE, 0x39, 0x33, 0xB2, + 0x83, 0x7E, 0xE4, 0xF0, 0xDC, 0x4F, 0xEC, 0x16, 0xA7, 0x18, 0x9C, 0x27, 0xB4, 0x61, 0x99, 0xC0, 0x82, 0xA4, 0x0E, 0xEB, 0x23, 0xE7, 0x2B, 0x39, 0x90, 0x3B, + 0x3C, 0xD2, 0x64, 0x4A, 0x58, 0xC0, 0xA5, 0x93, 0x34, 0x31, 0xFF, 0x14, 0x8C, 0x68, 0x54, 0x96, 0xFD, 0xA7, 0x09, 0x81, 0x48, 0x04, 0x25, 0xF1, 0xA2, 0xCE, + 0x2B, 0x53, 0x43, 0x26, 0x3C, 0x81, 0xE0, 0x44, 0x62, 0x19, 0x96, 0x0B, 0x04, 0x43, 0x58, 0xDA, 0x38, 0xC4, 0xB2, 0x10, 0xDD, 0x9C, 0x7B, 0x21, 0x74, 0x23, + 0x65, 0x31, 0x6C, 0x17, 0x0F, 0xF7, 0x31, 0x1D, 0x5E, 0x6A, 0x03, 0xEA, 0xAF, 0xD1, 0xF1, 0x06, 0xFA, 0x9F, 0x8B, 0x41, 0xD4, 0x1B, 0x37, 0xE7, 0x24, 0x24, + 0xB6, 0x07, 0x89, 0x94, 0xA8, 0x74, 0x48, 0x99, 0x05, 0x79, 0x3F, 0xAA, 0xE9, 0xD1, 0x23, 0x7E, 0x25, 0x53, 0x15, 0xEB, 0x71, 0x2E, 0xB2, 0x08, 0xCE, 0xA4, + 0x19, 0x9C, 0x87, 0x9D, 0x81, 0x11, 0x01, 0x57, 0x20, 0x08, 0xDD, 0x8A, 0xD9, 0xBB, 0x80, 0xB7, 0x49, 0xB2, 0xF0, 0xFF, 0xAD, 0xFE, 0x67, 0x64, 0xF5, 0x1F, + 0xCE, 0xC4, 0xD7, 0x8F, 0xC2, 0x89, 0x72, 0xFA, 0xB0, 0xE0, 0x1E, 0xE2, 0x85, 0xFA, 0xB8, 0x9F, 0x34, 0xDD, 0x89, 0x7C, 0x61, 0xDA, 0x40, 0x20, 0x9D, 0x48, + 0x16, 0xD1, 0x88, 0xC2, 0xF7, 0x14, 0xE0, 0xA6, 0x68, 0x77, 0xA7, 0x2D, 0xE6, 0x16, 0xB8, 0x3D, 0x26, 0x14, 0xA5, 0x4B, 0x32, 0xC3, 0x9C, 0x6D, 0x49, 0x49, + 0x1F, 0x56, 0xE7, 0x8A, 0x65, 0x0A, 0xC7, 0xA5, 0xE5, 0xB3, 0xDA, 0x2B, 0xAB, 0x8E, 0x9E, 0xE9, 0x2E, 0x3B, 0x03, 0x64, 0x88, 0x9F, 0xF2, 0x7E, 0x8E, 0xC7, + 0xC4, 0x71, 0xAD, 0x51, 0xC0, 0x32, 0xFE, 0x98, 0xE6, 0x3A, 0x68, 0x95, 0x02, 0xE6, 0x6E, 0x5E, 0x1A, 0xB2, 0x30, 0xA5, 0x0D, 0x8C, 0xAC, 0x9A, 0x8C, 0x12, + 0xE9, 0xBF, 0xE7, 0x86, 0xBB, 0x74, 0x1C, 0xC8, 0x20, 0x35, 0x01, 0x32, 0xA8, 0xDE, 0xD5, 0x9A, 0xE8, 0xFF, 0x5C, 0x7B, 0x16, 0x63, 0x9E, 0xA2, 0xC0, 0xCE, + 0x4E, 0x1A, 0x1A, 0x4D, 0x32, 0x08, 0x37, 0x3E, 0xAE, 0x4D, 0xE4, 0xC7, 0xCC, 0x0A, 0x66, 0x6E, 0x92, 0x7E, 0x56, 0xA2, 0x84, 0xCE, 0xFA, 0x51, 0x8A, 0xF0, + 0x8A, 0x8F, 0x03, 0x44, 0xF0, 0x5C, 0x33, 0x22, 0x10, 0x3F, 0xA9, 0x2F, 0x17, 0x8D, 0x7D, 0xCE, 0xA5, 0xBE, 0xC3, 0xE4, 0x19, 0x5E, 0xBB, 0xA0, 0x3F, 0x09, + 0x73, 0x92, 0x90, 0x0E, 0x11, 0x64, 0x20, 0xE2, 0x28, 0x26, 0x05, 0x22, 0x35, 0x2C, 0x83, 0x37, 0xB7, 0x50, 0x04, 0x8F, 0x4E, 0xB3, 0x91, 0x27, 0xEA, 0xA8, + 0x4F, 0x30, 0xE4, 0x95, 0x03, 0x0C, 0x9D, 0xB8, 0xA3, 0x74, 0xED, 0x79, 0xDF, 0x80, 0x67, 0x2C, 0x00, 0xC2, 0x2B, 0xC8, 0x03, 0x29, 0xC5, 0x3C, 0x3A, 0xCE, + 0x54, 0x43, 0x10, 0x0E, 0xEE, 0x7A, 0x44, 0xA4, 0xE0, 0xB5, 0xE2, 0xB2, 0x10, 0x94, 0x91, 0xD9, 0xCB, 0x98, 0x03, 0x37, 0xC4, 0xA3, 0xD7, 0x23, 0x98, 0xC8, + 0xFA, 0x86, 0xE6, 0xEE, 0x63, 0xC8, 0x71, 0x42, 0xDA, 0xA9, 0xCC, 0x05, 0x95, 0x55, 0xEE, 0x8B, 0xAE, 0x2F, 0xE9, 0xF7, 0x12, 0xF1, 0xBA, 0xA7, 0x9E, 0xE0, + 0x90, 0xBA, 0x01, 0xAD, 0xBD, 0x5E, 0xB3, 0x13, 0x28, 0x81, 0x29, 0x26, 0x5B, 0xB3, 0x40, 0x97, 0xA3, 0xB9, 0x9D, 0x8C, 0x28, 0x12, 0x80, 0x6D, 0x4C, 0xFA, + 0x35, 0xE8, 0x4F, 0x54, 0xDD, 0x13, 0xF6, 0x8B, 0xBB, 0xDA, 0x00, 0x94, 0x0A, 0x92, 0xF3, 0x63, 0xF3, 0x3D, 0xE7, 0x39, 0xE6, 0x1B, 0x29, 0xF4, 0x4D, 0x0C, + 0xCE, 0x4C, 0xC9, 0x08, 0x10, 0x62, 0x2E, 0x91, 0x83, 0x48, 0xCF, 0x26, 0x46, 0x33, 0x78, 0x69, 0xCF, 0x5C, 0x9D, 0xC2, 0xFA, 0xD5, 0x67, 0x28, 0x07, 0x04, + 0xB0, 0x96, 0xF7, 0xAB, 0x3F, 0x38, 0x88, 0x3B, 0x63, 0x02, 0xDD, 0x0F, 0x66, 0xCC, 0xE2, 0x13, 0x05, 0x98, 0x2A, 0x3C, 0xC5, 0xAD, 0xCC, 0xEC, 0xE1, 0xDD, + 0xAF, 0xB1, 0x84, 0xC4, 0x5D, 0x47, 0xE5, 0xE0, 0x81, 0x4F, 0x32, 0x97, 0x8F, 0x1B, 0x84, 0xBB, 0xAD, 0x09, 0x15, 0xC5, 0x1A, 0x87, 0x1C, 0xE2, 0xD1, 0xE4, + 0xDF, 0xC2, 0x1B, 0xC9, 0x88, 0x29, 0x3C, 0x6F, 0x3E, 0xEC, 0x01, 0x07, 0xAC, 0xC8, 0x80, 0x09, 0x1E, 0xD1, 0xE0, 0x46, 0x90, 0x29, 0x45, 0x61, 0xD1, 0x18, + 0xD9, 0x96, 0xEA, 0x19, 0x58, 0xD9, 0xAB, 0xC7, 0xB4, 0xF8, 0x2D, 0xC0, 0x60, 0x45, 0x14, 0x96, 0x53, 0x92, 0x59, 0x18, 0x54, 0x81, 0x02, 0x20, 0x45, 0xA2, + 0x22, 0x32, 0xA5, 0x77, 0x16, 0x4B, 0x7A, 0x95, 0x8E, 0xB5, 0x22, 0x6B, 0x1C, 0x0D, 0x49, 0x04, 0xE3, 0xD8, 0x3F, 0xB8, 0xC8, 0xFC, 0x53, 0xC6, 0x45, 0x14, + 0x3B, 0x14, 0x5D, 0xD6, 0x42, 0x27, 0x37, 0xE4, 0xAB, 0x40, 0xE5, 0x1E, 0x9D, 0x5F, 0x65, 0xEC, 0xC7, 0xE1, 0xC1, 0xC5, 0xCC, 0x0D, 0xFA, 0x54, 0x0F, 0x4D, + 0x3F, 0xC2, 0x4B, 0x8F, 0xC1, 0x14, 0xF2, 0x68, 0xBD, 0xB3, 0x42, 0x72, 0x09, 0xE9, 0x12, 0xEA, 0x7A, 0x65, 0x33, 0xF2, 0xAE, 0x4A, 0x02, 0x95, 0xB4, 0x3A, + 0x80, 0xD3, 0x2B, 0x29, 0x40, 0xAB, 0x10, 0xC4, 0x6A, 0x90, 0xCA, 0x92, 0xC9, 0xCA, 0x11, 0x05, 0x06, 0x5F, 0x16, 0x52, 0x6F, 0xB6, 0x82, 0x67, 0x4D, 0x15, + 0x25, 0xA8, 0xD5, 0x65, 0x53, 0x9B, 0xB9, 0x95, 0xF2, 0x5C, 0x73, 0xAB, 0x8B, 0xAB, 0xAB, 0x48, 0xD4, 0xDA, 0xB1, 0x28, 0xA5, 0x46, 0x08, 0x39, 0x5E, 0xFA, + 0xA2, 0x14, 0x8D, 0xFA, 0xA3, 0xB2, 0x82, 0xF1, 0xE9, 0x03, 0x28, 0xA7, 0xB4, 0xD8, 0x5B, 0x88, 0x5D, 0xE8, 0x19, 0x43, 0x82, 0xE5, 0xE0, 0x88, 0x3E, 0xC2, + 0x8C, 0x79, 0x8B, 0x8E, 0x74, 0x5A, 0x54, 0xEA, 0xA4, 0xA7, 0x18, 0xD4, 0xDD, 0xEC, 0x64, 0xE1, 0xD5, 0x98, 0x1F, 0xDD, 0xD2, 0xD6, 0x40, 0xBC, 0xEE, 0x63, + 0x41, 0x8C, 0x30, 0xE7, 0xF1, 0x42, 0x11, 0xB2, 0x36, 0x74, 0xF9, 0xAB, 0xA8, 0x93, 0xBA, 0xDF, 0x94, 0x54, 0x08, 0x29, 0x2B, 0xC3, 0xC5, 0x5B, 0x64, 0x51, + 0x49, 0x42, 0x3C, 0x42, 0x43, 0x03, 0xB2, 0xE3, 0xF2, 0x24, 0x00, 0x0A, 0xC1, 0x27, 0x12, 0x53, 0x60, 0x56, 0x13, 0x32, 0x49, 0x3B, 0x96, 0x46, 0x5E, 0xE9, + 0x8B, 0xC4, 0x2A, 0xA3, 0xE7, 0x1F, 0xC7, 0x23, 0x74, 0x3F, 0xAF, 0xA1, 0x3E, 0xD0, 0xD7, 0xEB, 0xCE, 0x2E, 0xFA, 0xA0, 0xE2, 0xE6, 0x08, 0x72, 0x25, 0xB2, + 0x53, 0x17, 0x09, 0x6E, 0xE8, 0xF5, 0xD0, 0x52, 0xF4, 0xD1, 0x83, 0x53, 0x45, 0xFE, 0x82, 0x8F, 0x38, 0xC8, 0x6D, 0x2E, 0x22, 0x2C, 0x39, 0xEA, 0x19, 0xD2, + 0x0A, 0xBF, 0x31, 0x05, 0x20, 0x31, 0xE1, 0x39, 0x64, 0x33, 0xAE, 0xA1, 0x22, 0x17, 0x51, 0x86, 0x18, 0xF7, 0x58, 0x0F, 0x0A, 0x30, 0xA7, 0x85, 0x45, 0x63, + 0xD3, 0xBD, 0x32, 0x03, 0x55, 0xDE, 0xC7, 0x80, 0x15, 0x32, 0x29, 0xF2, 0x1D, 0xAC, 0xF7, 0xA2, 0x0C, 0x2D, 0x29, 0xBB, 0xE2, 0x5F, 0x9F, 0xEF, 0xC4, 0x20, + 0xD7, 0x9E, 0xD8, 0xC7, 0xFF, 0xA4, 0x6E, 0x8B, 0x07, 0xBF, 0x46, 0xF7, 0xC5, 0x3F, 0x91, 0x21, 0xAE, 0x85, 0x1E, 0xB5, 0xDA, 0x37, 0x17, 0x0B, 0xCC, 0xB0, + 0xBF, 0x9A, 0xD9, 0x8E, 0xD5, 0x11, 0x45, 0xE3, 0xB5, 0x27, 0xC0, 0x8C, 0x56, 0x51, 0xF1, 0x75, 0x0E, 0x12, 0x2A, 0x14, 0x91, 0xAF, 0xAC, 0xC2, 0xEA, 0xA0, + 0xF6, 0x00, 0x43, 0x35, 0x59, 0xA5, 0x48, 0xEA, 0x5B, 0x38, 0x04, 0xED, 0x1B, 0x5A, 0x06, 0xC7, 0x39, 0xD9, 0x3D, 0xE8, 0x1E, 0xC8, 0x0C, 0x21, 0x3C, 0x9D, + 0x88, 0x5A, 0x04, 0x97, 0x96, 0x0B, 0xFD, 0xF4, 0x03, 0xC9, 0xB8, 0x84, 0x1B, 0x7A, 0x90, 0x2F, 0x4A, 0xEA, 0xB4, 0xF9, 0x3A, 0xBA, 0xFD, 0xDF, 0x16, 0x34, + 0xFB, 0x1A, 0xD9, 0x78, 0x85, 0x8C, 0xB4, 0x44, 0x8E, 0x48, 0x25, 0xB2, 0x47, 0x19, 0x38, 0x50, 0x24, 0xBB, 0x30, 0xD2, 0x24, 0xA9, 0x91, 0x9E, 0xA7, 0x8A, + 0x46, 0x0B, 0xE8, 0xA8, 0x38, 0xB5, 0xE4, 0x6B, 0x8C, 0xF8, 0xFE, 0xCE, 0x4C, 0x1F, 0xFC, 0xD8, 0x33, 0x3A, 0xD8, 0x56, 0xB0, 0xD7, 0xE1, 0xE9, 0xEF, 0xD1, + 0x9C, 0x59, 0x67, 0x77, 0xEF, 0x70, 0x77, 0x97, 0x1E, 0xAC, 0x3E, 0x66, 0x9D, 0xDE, 0x20, 0xCA, 0x82, 0x1F, 0x9E, 0x47, 0x54, 0x52, 0x7C, 0xFF, 0xAD, 0x87, + 0x67, 0x08, 0x97, 0x65, 0x78, 0x6F, 0xBB, 0xD4, 0x0D, 0x96, 0x65, 0xB9, 0x64, 0x20, 0xAC, 0x95, 0xCB, 0xD2, 0xE2, 0xEB, 0xFE, 0xA2, 0xC1, 0x17, 0x5F, 0x0E, + 0x05, 0x7F, 0x5B, 0xF1, 0xB4, 0xA5, 0xB3, 0x87, 0x35, 0x50, 0x9E, 0x8F, 0x1B, 0x6A, 0x28, 0x43, 0x92, 0x3B, 0x71, 0xA7, 0xE4, 0xF0, 0x3B, 0xC7, 0xFF, 0x8C, + 0xAD, 0x91, 0x0E, 0x4A, 0x2E, 0xAC, 0x5C, 0xC7, 0x07, 0xD4, 0x3A, 0x37, 0xA5, 0xCE, 0x60, 0x3A, 0xF6, 0x9A, 0x1D, 0x76, 0xA6, 0x1D, 0xBF, 0x57, 0x4B, 0xA8, + 0xE7, 0x3C, 0x32, 0x86, 0x22, 0x8D, 0xC6, 0x60, 0xB1, 0xD5, 0xC6, 0x98, 0xAC, 0xAC, 0x2B, 0xC1, 0x6D, 0xA5, 0xF3, 0x91, 0x03, 0xB8, 0x8A, 0x02, 0xCA, 0x71, + 0xBB, 0x4A, 0x59, 0x65, 0x60, 0x58, 0xDA, 0x59, 0x67, 0x0F, 0x88, 0xE5, 0x20, 0x00, 0x35, 0xDF, 0x72, 0x35, 0x6E, 0x21, 0xDB, 0x8F, 0x7C, 0x82, 0x00, 0x64, + 0xAF, 0xA8, 0x90, 0x1C, 0x33, 0x29, 0xD6, 0xAA, 0x60, 0xA4, 0x9B, 0x1F, 0xE5, 0x66, 0xCC, 0x58, 0xD1, 0xE8, 0x36, 0x3F, 0xB2, 0x8D, 0xCD, 0x1B, 0x68, 0x1D, + 0x1D, 0xBC, 0x9D, 0x90, 0x90, 0x95, 0xD3, 0x9B, 0xA9, 0xF4, 0x8E, 0x46, 0xF8, 0x15, 0x25, 0xD4, 0xF3, 0xC1, 0x05, 0xB9, 0x58, 0x4D, 0x72, 0x31, 0x49, 0x2E, + 0x2A, 0x90, 0x0C, 0x2F, 0xAB, 0xC3, 0x0D, 0xB1, 0xFC, 0xFF, 0xF2, 0x32, 0x69, 0xD9, 0xF5, 0xA8, 0x14, 0x4F, 0x39, 0x9C, 0x57, 0x9A, 0x57, 0x5E, 0x20, 0xF5, + 0x10, 0x11, 0xD1, 0xAC, 0xEB, 0x51, 0xBD, 0x66, 0x45, 0xE1, 0x00, 0x2A, 0x90, 0x34, 0x4B, 0x1F, 0x34, 0x88, 0x9A, 0xF2, 0x9A, 0x85, 0x72, 0x07, 0x9B, 0xE9, + 0x5A, 0x46, 0xFC, 0xD8, 0xDB, 0x18, 0xD9, 0x38, 0xA5, 0x0C, 0xE7, 0x38, 0x93, 0xF0, 0xBC, 0xE2, 0xBF, 0xB5, 0xD0, 0x8E, 0x73, 0x27, 0x22, 0x9C, 0x00, 0x88, + 0x42, 0x15, 0x98, 0x5B, 0x48, 0x07, 0x9C, 0x84, 0x0F, 0x6F, 0x71, 0xEC, 0x33, 0x9E, 0xBA, 0x9A, 0x01, 0x87, 0x56, 0x7A, 0x53, 0x17, 0x90, 0x52, 0x79, 0x84, + 0xA8, 0x0A, 0x6B, 0x11, 0xAF, 0x29, 0x96, 0x2B, 0x88, 0xC5, 0x3F, 0xF1, 0xC0, 0x71, 0x1C, 0x4C, 0x11, 0xCE, 0x9D, 0xE1, 0x17, 0xFF, 0x06, 0x6E, 0xDA, 0x6F, + 0xC1, 0x5F, 0xA4, 0x00, 0x00 }; //File: index_ov3660.html.gz, Size: 8636 From 88cda9ff59d3ca4a8a227e7b6039597ccfa58d34 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Tue, 21 Jan 2025 17:14:16 +0200 Subject: [PATCH 055/290] feat(idf): Add initial support for IDF v5.5 and ESP32-C5 --- CMakeLists.txt | 2 +- boards.txt | 212 ++++++++++++++++++++++++++++++ cores/esp32/Esp.cpp | 3 + cores/esp32/HardwareSerial.h | 8 ++ cores/esp32/esp32-hal-cpu.c | 8 +- cores/esp32/esp32-hal-i2c-slave.c | 7 +- cores/esp32/esp32-hal-matrix.c | 2 + cores/esp32/esp32-hal-misc.c | 4 +- cores/esp32/esp32-hal-spi.c | 83 ++++++------ cores/esp32/esp32-hal-uart.c | 22 +++- idf_component.yml | 6 +- libraries/SPI/src/SPI.cpp | 2 +- platform.txt | 9 ++ variants/esp32c5/pins_arduino.h | 42 ++++++ 14 files changed, 357 insertions(+), 53 deletions(-) create mode 100644 variants/esp32c5/pins_arduino.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d2a9162a9ba..dd9544f13e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ # idf.py build set(min_supported_idf_version "5.3.0") -set(max_supported_idf_version "5.4.99") +set(max_supported_idf_version "5.5.99") set(idf_version "${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}.${IDF_VERSION_PATCH}") if ("${idf_version}" AND NOT "$ENV{ARDUINO_SKIP_IDF_VERSION_CHECK}") diff --git a/boards.txt b/boards.txt index 2afe45f50a6..ea520e60fde 100644 --- a/boards.txt +++ b/boards.txt @@ -161,6 +161,218 @@ esp32c2.menu.EraseFlash.all.upload.erase_cmd=-e ############################################################## +esp32c5.name=ESP32C5 Dev Module + +esp32c5.bootloader.tool=esptool_py +esp32c5.bootloader.tool.default=esptool_py + +esp32c5.upload.tool=esptool_py +esp32c5.upload.tool.default=esptool_py +esp32c5.upload.tool.network=esp_ota + +esp32c5.upload.maximum_size=1310720 +esp32c5.upload.maximum_data_size=327680 +esp32c5.upload.flags= +esp32c5.upload.extra_flags= +esp32c5.upload.use_1200bps_touch=false +esp32c5.upload.wait_for_upload_port=false + +esp32c5.serial.disableDTR=false +esp32c5.serial.disableRTS=false + +esp32c5.build.tarch=riscv32 +esp32c5.build.target=esp +esp32c5.build.mcu=esp32c5 +esp32c5.build.core=esp32 +esp32c5.build.variant=esp32c5 +esp32c5.build.board=ESP32C5_DEV +esp32c5.build.bootloader_addr=0x0 + +esp32c5.build.cdc_on_boot=0 +esp32c5.build.f_cpu=240000000L +esp32c5.build.flash_size=4MB +esp32c5.build.flash_freq=80m +esp32c5.build.flash_mode=qio +esp32c5.build.boot=qio +esp32c5.build.partitions=default +esp32c5.build.defines= + +## IDE 2.0 Seems to not update the value +esp32c5.menu.JTAGAdapter.default=Disabled +esp32c5.menu.JTAGAdapter.default.build.copy_jtag_files=0 +esp32c5.menu.JTAGAdapter.builtin=Integrated USB JTAG +esp32c5.menu.JTAGAdapter.builtin.build.openocdscript=esp32c5-builtin.cfg +esp32c5.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 +esp32c5.menu.JTAGAdapter.external=FTDI Adapter +esp32c5.menu.JTAGAdapter.external.build.openocdscript=esp32c5-ftdi.cfg +esp32c5.menu.JTAGAdapter.external.build.copy_jtag_files=1 +esp32c5.menu.JTAGAdapter.bridge=ESP USB Bridge +esp32c5.menu.JTAGAdapter.bridge.build.openocdscript=esp32c5-bridge.cfg +esp32c5.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +esp32c5.menu.CDCOnBoot.default=Disabled +esp32c5.menu.CDCOnBoot.default.build.cdc_on_boot=0 +esp32c5.menu.CDCOnBoot.cdc=Enabled +esp32c5.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 + +esp32c5.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +esp32c5.menu.PartitionScheme.default.build.partitions=default +esp32c5.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +esp32c5.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +esp32c5.menu.PartitionScheme.default_8MB=8M with spiffs (3MB APP/1.5MB SPIFFS) +esp32c5.menu.PartitionScheme.default_8MB.build.partitions=default_8MB +esp32c5.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 +esp32c5.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +esp32c5.menu.PartitionScheme.minimal.build.partitions=minimal +esp32c5.menu.PartitionScheme.no_fs=No FS 4MB (2MB APP x2) +esp32c5.menu.PartitionScheme.no_fs.build.partitions=no_fs +esp32c5.menu.PartitionScheme.no_fs.upload.maximum_size=2031616 +esp32c5.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +esp32c5.menu.PartitionScheme.no_ota.build.partitions=no_ota +esp32c5.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +esp32c5.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +esp32c5.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +esp32c5.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +esp32c5.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +esp32c5.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +esp32c5.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +esp32c5.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +esp32c5.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +esp32c5.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +esp32c5.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +esp32c5.menu.PartitionScheme.huge_app.build.partitions=huge_app +esp32c5.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +esp32c5.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +esp32c5.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +esp32c5.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 +esp32c5.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) +esp32c5.menu.PartitionScheme.fatflash.build.partitions=ffat +esp32c5.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 +esp32c5.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS) +esp32c5.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB +esp32c5.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 +esp32c5.menu.PartitionScheme.rainmaker=RainMaker 4MB +esp32c5.menu.PartitionScheme.rainmaker.build.partitions=rainmaker +esp32c5.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 +esp32c5.menu.PartitionScheme.rainmaker_4MB=RainMaker 4MB No OTA +esp32c5.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota +esp32c5.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 +esp32c5.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB +esp32c5.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB +esp32c5.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32c5.menu.PartitionScheme.zigbee_2MB=Zigbee 2MB with spiffs +esp32c5.menu.PartitionScheme.zigbee_2MB.build.partitions=zigbee_2MB +esp32c5.menu.PartitionScheme.zigbee_2MB.upload.maximum_size=1310720 +esp32c5.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs +esp32c5.menu.PartitionScheme.zigbee.build.partitions=zigbee +esp32c5.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 +esp32c5.menu.PartitionScheme.zigbee_8MB=Zigbee 8MB with spiffs +esp32c5.menu.PartitionScheme.zigbee_8MB.build.partitions=zigbee_8MB +esp32c5.menu.PartitionScheme.zigbee_8MB.upload.maximum_size=3407872 +esp32c5.menu.PartitionScheme.zigbee_zczr_2MB=Zigbee ZCZR 2MB with spiffs +esp32c5.menu.PartitionScheme.zigbee_zczr_2MB.build.partitions=zigbee_zczr_2MB +esp32c5.menu.PartitionScheme.zigbee_zczr_2MB.upload.maximum_size=1310720 +esp32c5.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs +esp32c5.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr +esp32c5.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 +esp32c5.menu.PartitionScheme.zigbee_zczr_8MB=Zigbee ZCZR 8MB with spiffs +esp32c5.menu.PartitionScheme.zigbee_zczr_8MB.build.partitions=zigbee_zczr_8MB +esp32c5.menu.PartitionScheme.zigbee_zczr_8MB.upload.maximum_size=3407872 +esp32c5.menu.PartitionScheme.custom=Custom +esp32c5.menu.PartitionScheme.custom.build.partitions= +esp32c5.menu.PartitionScheme.custom.upload.maximum_size=16777216 + +esp32c5.menu.CPUFreq.240=240MHz (WiFi) +esp32c5.menu.CPUFreq.240.build.f_cpu=240000000L +esp32c5.menu.CPUFreq.120=120MHz (WiFi) +esp32c5.menu.CPUFreq.120.build.f_cpu=120000000L +esp32c5.menu.CPUFreq.80=80MHz (WiFi) +esp32c5.menu.CPUFreq.80.build.f_cpu=80000000L +esp32c5.menu.CPUFreq.40=40MHz +esp32c5.menu.CPUFreq.40.build.f_cpu=40000000L +esp32c5.menu.CPUFreq.20=20MHz +esp32c5.menu.CPUFreq.20.build.f_cpu=20000000L +esp32c5.menu.CPUFreq.10=10MHz +esp32c5.menu.CPUFreq.10.build.f_cpu=10000000L + +esp32c5.menu.FlashMode.qio=QIO +esp32c5.menu.FlashMode.qio.build.flash_mode=dio +esp32c5.menu.FlashMode.qio.build.boot=qio +esp32c5.menu.FlashMode.dio=DIO +esp32c5.menu.FlashMode.dio.build.flash_mode=dio +esp32c5.menu.FlashMode.dio.build.boot=dio + +esp32c5.menu.FlashFreq.80=80MHz +esp32c5.menu.FlashFreq.80.build.flash_freq=80m +esp32c5.menu.FlashFreq.40=40MHz +esp32c5.menu.FlashFreq.40.build.flash_freq=40m + +esp32c5.menu.FlashSize.4M=4MB (32Mb) +esp32c5.menu.FlashSize.4M.build.flash_size=4MB +esp32c5.menu.FlashSize.8M=8MB (64Mb) +esp32c5.menu.FlashSize.8M.build.flash_size=8MB +esp32c5.menu.FlashSize.2M=2MB (16Mb) +esp32c5.menu.FlashSize.2M.build.flash_size=2MB +esp32c5.menu.FlashSize.16M=16MB (128Mb) +esp32c5.menu.FlashSize.16M.build.flash_size=16MB + +esp32c5.menu.UploadSpeed.921600=921600 +esp32c5.menu.UploadSpeed.921600.upload.speed=921600 +esp32c5.menu.UploadSpeed.115200=115200 +esp32c5.menu.UploadSpeed.115200.upload.speed=115200 +esp32c5.menu.UploadSpeed.256000.windows=256000 +esp32c5.menu.UploadSpeed.256000.upload.speed=256000 +esp32c5.menu.UploadSpeed.230400.windows.upload.speed=256000 +esp32c5.menu.UploadSpeed.230400=230400 +esp32c5.menu.UploadSpeed.230400.upload.speed=230400 +esp32c5.menu.UploadSpeed.460800.linux=460800 +esp32c5.menu.UploadSpeed.460800.macosx=460800 +esp32c5.menu.UploadSpeed.460800.upload.speed=460800 +esp32c5.menu.UploadSpeed.512000.windows=512000 +esp32c5.menu.UploadSpeed.512000.upload.speed=512000 + +esp32c5.menu.DebugLevel.none=None +esp32c5.menu.DebugLevel.none.build.code_debug=0 +esp32c5.menu.DebugLevel.error=Error +esp32c5.menu.DebugLevel.error.build.code_debug=1 +esp32c5.menu.DebugLevel.warn=Warn +esp32c5.menu.DebugLevel.warn.build.code_debug=2 +esp32c5.menu.DebugLevel.info=Info +esp32c5.menu.DebugLevel.info.build.code_debug=3 +esp32c5.menu.DebugLevel.debug=Debug +esp32c5.menu.DebugLevel.debug.build.code_debug=4 +esp32c5.menu.DebugLevel.verbose=Verbose +esp32c5.menu.DebugLevel.verbose.build.code_debug=5 + +esp32c5.menu.EraseFlash.none=Disabled +esp32c5.menu.EraseFlash.none.upload.erase_cmd= +esp32c5.menu.EraseFlash.all=Enabled +esp32c5.menu.EraseFlash.all.upload.erase_cmd=-e + +esp32c5.menu.ZigbeeMode.default=Disabled +esp32c5.menu.ZigbeeMode.default.build.zigbee_mode= +esp32c5.menu.ZigbeeMode.default.build.zigbee_libs= +esp32c5.menu.ZigbeeMode.ed=Zigbee ED (end device) +esp32c5.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED +esp32c5.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +esp32c5.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) +esp32c5.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +esp32c5.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port +esp32c5.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) +esp32c5.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP +esp32c5.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +esp32c5.menu.ZigbeeMode.ed_debug=Zigbee ED (end device) - Debug +esp32c5.menu.ZigbeeMode.ed_debug.build.zigbee_mode=-DZIGBEE_MODE_ED +esp32c5.menu.ZigbeeMode.ed_debug.build.zigbee_libs=-lesp_zb_api_ed.debug -lesp_zb_cli_command -lzboss_stack.ed.debug -lzboss_port.debug +esp32c5.menu.ZigbeeMode.zczr_debug=Zigbee ZCZR (coordinator/router) - Debug +esp32c5.menu.ZigbeeMode.zczr_debug.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +esp32c5.menu.ZigbeeMode.zczr_debug.build.zigbee_libs=-lesp_zb_api_zczr.debug -lesp_zb_cli_command -lzboss_stack.zczr.debug -lzboss_port.debug +esp32c5.menu.ZigbeeMode.rcp_debug=Zigbee RCP (radio co-processor) - Debug +esp32c5.menu.ZigbeeMode.rcp_debug.build.zigbee_mode=-DZIGBEE_MODE_RCP +esp32c5.menu.ZigbeeMode.rcp_debug.build.zigbee_libs=-lesp_zb_api_rcp.debug -lesp_zb_cli_command -lzboss_stack.rcp.debug -lzboss_port.debug + +############################################################## + esp32p4.name=ESP32P4 Dev Module esp32p4.bootloader.tool=esptool_py diff --git a/cores/esp32/Esp.cpp b/cores/esp32/Esp.cpp index 9f90a828b25..3cb0e7351c6 100644 --- a/cores/esp32/Esp.cpp +++ b/cores/esp32/Esp.cpp @@ -63,6 +63,9 @@ extern "C" { #elif CONFIG_IDF_TARGET_ESP32P4 #include "esp32p4/rom/spi_flash.h" #define ESP_FLASH_IMAGE_BASE 0x2000 // Esp32p4 is located at 0x2000 +#elif CONFIG_IDF_TARGET_ESP32C5 +#include "esp32c5/rom/spi_flash.h" +#define ESP_FLASH_IMAGE_BASE 0x0000 // Esp32c5 is located at 0x0000 #else #error Target CONFIG_IDF_TARGET is not supported #endif diff --git a/cores/esp32/HardwareSerial.h b/cores/esp32/HardwareSerial.h index b1f6df17724..775b6ee2bcb 100644 --- a/cores/esp32/HardwareSerial.h +++ b/cores/esp32/HardwareSerial.h @@ -139,6 +139,8 @@ typedef enum { #define SOC_RX0 (gpio_num_t)23 #elif CONFIG_IDF_TARGET_ESP32P4 #define SOC_RX0 (gpio_num_t)38 +#elif CONFIG_IDF_TARGET_ESP32C5 +#define SOC_RX0 (gpio_num_t)12 #endif #endif @@ -157,6 +159,8 @@ typedef enum { #define SOC_TX0 (gpio_num_t)24 #elif CONFIG_IDF_TARGET_ESP32P4 #define SOC_TX0 (gpio_num_t)37 +#elif CONFIG_IDF_TARGET_ESP32C5 +#define SOC_TX0 (gpio_num_t)11 #endif #endif @@ -180,6 +184,8 @@ typedef enum { #define RX1 (gpio_num_t)0 #elif CONFIG_IDF_TARGET_ESP32P4 #define RX1 (gpio_num_t)11 +#elif CONFIG_IDF_TARGET_ESP32C5 +#define RX1 (gpio_num_t)4 #endif #endif @@ -200,6 +206,8 @@ typedef enum { #define TX1 (gpio_num_t)1 #elif CONFIG_IDF_TARGET_ESP32P4 #define TX1 (gpio_num_t)10 +#elif CONFIG_IDF_TARGET_ESP32C5 +#define TX1 (gpio_num_t)5 #endif #endif #endif /* SOC_UART_HP_NUM > 1 */ diff --git a/cores/esp32/esp32-hal-cpu.c b/cores/esp32/esp32-hal-cpu.c index 1ffde860792..8c13a4077fd 100644 --- a/cores/esp32/esp32-hal-cpu.c +++ b/cores/esp32/esp32-hal-cpu.c @@ -19,7 +19,7 @@ #include "esp_attr.h" #include "esp_log.h" #include "soc/rtc.h" -#if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) +#if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) && !defined(CONFIG_IDF_TARGET_ESP32C5) #include "soc/rtc_cntl_reg.h" #include "soc/syscon_reg.h" #endif @@ -48,6 +48,8 @@ #include "esp32h2/rom/rtc.h" #elif CONFIG_IDF_TARGET_ESP32P4 #include "esp32p4/rom/rtc.h" +#elif CONFIG_IDF_TARGET_ESP32C5 +#include "esp32c5/rom/rtc.h" #else #error Target CONFIG_IDF_TARGET is not supported #endif @@ -179,7 +181,7 @@ bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) { rtc_cpu_freq_config_t conf, cconf; uint32_t capb, apb; //Get XTAL Frequency and calculate min CPU MHz -#if (!defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4)) +#if (!defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) && !defined(CONFIG_IDF_TARGET_ESP32C5)) rtc_xtal_freq_t xtal = rtc_clk_xtal_freq_get(); #endif #if CONFIG_IDF_TARGET_ESP32 @@ -195,7 +197,7 @@ bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) { } } #endif -#if (!defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4)) +#if (!defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) && !defined(CONFIG_IDF_TARGET_ESP32C5)) if (cpu_freq_mhz > xtal && cpu_freq_mhz != 240 && cpu_freq_mhz != 160 && cpu_freq_mhz != 120 && cpu_freq_mhz != 80) { if (xtal >= RTC_XTAL_FREQ_40M) { log_e("Bad frequency: %u MHz! Options are: 240, 160, 120, 80, %u, %u and %u MHz", cpu_freq_mhz, xtal, xtal / 2, xtal / 4); diff --git a/cores/esp32/esp32-hal-i2c-slave.c b/cores/esp32/esp32-hal-i2c-slave.c index 46c3a4d58c2..0e01259da61 100644 --- a/cores/esp32/esp32-hal-i2c-slave.c +++ b/cores/esp32/esp32-hal-i2c-slave.c @@ -43,7 +43,9 @@ #include "soc/i2c_struct.h" #include "soc/periph_defs.h" #include "hal/i2c_ll.h" +#ifndef CONFIG_IDF_TARGET_ESP32C5 #include "hal/clk_gate_ll.h" +#endif #include "esp32-hal-log.h" #include "esp32-hal-i2c-slave.h" #include "esp32-hal-periman.h" @@ -325,7 +327,7 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t frequency = 100000L; } frequency = (frequency * 5) / 4; -#if !defined(CONFIG_IDF_TARGET_ESP32P4) +#if !defined(CONFIG_IDF_TARGET_ESP32P4) && !defined(CONFIG_IDF_TARGET_ESP32C5) if (i2c->num == 0) { periph_ll_enable_clk_clear_rst(PERIPH_I2C0_MODULE); #if SOC_HP_I2C_NUM > 1 @@ -556,6 +558,9 @@ static bool i2c_slave_set_frequency(i2c_slave_struct_t *i2c, uint32_t clk_speed) i2c_ll_set_source_clk(i2c->dev, SOC_MOD_CLK_APB); /*!< I2C source clock from APB, 80M*/ } #elif SOC_I2C_SUPPORT_XTAL +#ifndef XTAL_CLK_FREQ +#define XTAL_CLK_FREQ APB_CLK_FREQ +#endif i2c_ll_master_cal_bus_clk(XTAL_CLK_FREQ, clk_speed, &clk_cal); I2C_CLOCK_SRC_ATOMIC() { i2c_ll_set_source_clk(i2c->dev, SOC_MOD_CLK_XTAL); /*!< I2C source clock from XTAL, 40M */ diff --git a/cores/esp32/esp32-hal-matrix.c b/cores/esp32/esp32-hal-matrix.c index 7cddb4e04db..0d81e979f2b 100644 --- a/cores/esp32/esp32-hal-matrix.c +++ b/cores/esp32/esp32-hal-matrix.c @@ -34,6 +34,8 @@ #include "esp32h2/rom/gpio.h" #elif CONFIG_IDF_TARGET_ESP32P4 #include "esp32p4/rom/gpio.h" +#elif CONFIG_IDF_TARGET_ESP32C5 +#include "esp32c5/rom/gpio.h" #else #error Target CONFIG_IDF_TARGET is not supported #endif diff --git a/cores/esp32/esp32-hal-misc.c b/cores/esp32/esp32-hal-misc.c index 50e2973d27a..39f81d50ae5 100644 --- a/cores/esp32/esp32-hal-misc.c +++ b/cores/esp32/esp32-hal-misc.c @@ -30,7 +30,7 @@ #endif //CONFIG_BT_ENABLED #include #include "soc/rtc.h" -#if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) +#if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) && !defined(CONFIG_IDF_TARGET_ESP32C5) #include "soc/rtc_cntl_reg.h" #include "soc/syscon_reg.h" #endif @@ -56,6 +56,8 @@ #include "esp32h2/rom/rtc.h" #elif CONFIG_IDF_TARGET_ESP32P4 #include "esp32p4/rom/rtc.h" +#elif CONFIG_IDF_TARGET_ESP32C5 +#include "esp32c5/rom/rtc.h" #else #error Target CONFIG_IDF_TARGET is not supported diff --git a/cores/esp32/esp32-hal-spi.c b/cores/esp32/esp32-hal-spi.c index 80928309670..4cff353d76c 100644 --- a/cores/esp32/esp32-hal-spi.c +++ b/cores/esp32/esp32-hal-spi.c @@ -26,7 +26,9 @@ #include "soc/io_mux_reg.h" #include "soc/gpio_sig_map.h" #include "soc/rtc.h" +#ifndef CONFIG_IDF_TARGET_ESP32C5 #include "hal/clk_gate_ll.h" +#endif #include "esp32-hal-periman.h" #include "esp_private/periph_ctrl.h" @@ -60,6 +62,9 @@ #elif CONFIG_IDF_TARGET_ESP32P4 #include "esp32p4/rom/ets_sys.h" #include "esp32p4/rom/gpio.h" +#elif CONFIG_IDF_TARGET_ESP32C5 +#include "esp32c5/rom/ets_sys.h" +#include "esp32c5/rom/gpio.h" #else #error Target CONFIG_IDF_TARGET is not supported #endif @@ -119,7 +124,7 @@ struct spi_struct_t { #define SPI_SS_IDX(p, n) ((p == 0) ? SPI_FSPI_SS_IDX(n) : ((p == 1) ? SPI_HSPI_SS_IDX(n) : 0)) -#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 +#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32C5 // ESP32C3 #define SPI_COUNT (1) @@ -161,7 +166,7 @@ static spi_t _spi_bus_array[] = { {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1} #elif CONFIG_IDF_TARGET_ESP32C3 {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1} -#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 +#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32C5 {(spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1} #else {(volatile spi_dev_t *)(DR_REG_SPI0_BASE), 0, -1, -1, -1, -1}, @@ -188,7 +193,7 @@ static spi_t _spi_bus_array[] = { {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1} #elif CONFIG_IDF_TARGET_ESP32C3 {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1} -#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 +#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32C5 {(spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1} #else {(volatile spi_dev_t *)(DR_REG_SPI0_BASE), NULL, 0, -1, -1, -1, -1}, @@ -685,7 +690,7 @@ spi_t *spiStartBus(uint8_t spi_num, uint32_t clockDiv, uint8_t dataMode, uint8_t spi->dev->user.doutdin = 1; int i; for (i = 0; i < 16; i++) { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[i].val = 0x00000000; #else spi->dev->data_buf[i] = 0x00000000; @@ -733,7 +738,7 @@ void spiWrite(spi_t *spi, const uint32_t *data, uint8_t len) { spi->dev->miso_dlen.usr_miso_dbitlen = 0; #endif for (i = 0; i < len; i++) { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[i].val = data[i]; #else spi->dev->data_buf[i] = data[i]; @@ -760,7 +765,7 @@ void spiTransfer(spi_t *spi, uint32_t *data, uint8_t len) { spi->dev->mosi_dlen.usr_mosi_dbitlen = (len * 32) - 1; spi->dev->miso_dlen.usr_miso_dbitlen = (len * 32) - 1; for (i = 0; i < len; i++) { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[i].val = data[i]; #else spi->dev->data_buf[i] = data[i]; @@ -773,7 +778,7 @@ void spiTransfer(spi_t *spi, uint32_t *data, uint8_t len) { spi->dev->cmd.usr = 1; while (spi->dev->cmd.usr); for (i = 0; i < len; i++) { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 data[i] = spi->dev->data_buf[i].val; #else data[i] = spi->dev->data_buf[i]; @@ -791,7 +796,7 @@ void spiWriteByte(spi_t *spi, uint8_t data) { #if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32 spi->dev->miso_dlen.usr_miso_dbitlen = 0; #endif -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[0].val = data; #else spi->dev->data_buf[0] = data; @@ -813,7 +818,7 @@ uint8_t spiTransferByte(spi_t *spi, uint8_t data) { SPI_MUTEX_LOCK(); spi->dev->mosi_dlen.usr_mosi_dbitlen = 7; spi->dev->miso_dlen.usr_miso_dbitlen = 7; -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[0].val = data; #else spi->dev->data_buf[0] = data; @@ -824,7 +829,7 @@ uint8_t spiTransferByte(spi_t *spi, uint8_t data) { #endif spi->dev->cmd.usr = 1; while (spi->dev->cmd.usr); -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 data = spi->dev->data_buf[0].val & 0xFF; #else data = spi->dev->data_buf[0] & 0xFF; @@ -854,7 +859,7 @@ void spiWriteWord(spi_t *spi, uint16_t data) { #if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32 spi->dev->miso_dlen.usr_miso_dbitlen = 0; #endif -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[0].val = data; #else spi->dev->data_buf[0] = data; @@ -878,7 +883,7 @@ uint16_t spiTransferWord(spi_t *spi, uint16_t data) { SPI_MUTEX_LOCK(); spi->dev->mosi_dlen.usr_mosi_dbitlen = 15; spi->dev->miso_dlen.usr_miso_dbitlen = 15; -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[0].val = data; #else spi->dev->data_buf[0] = data; @@ -889,7 +894,7 @@ uint16_t spiTransferWord(spi_t *spi, uint16_t data) { #endif spi->dev->cmd.usr = 1; while (spi->dev->cmd.usr); -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 data = spi->dev->data_buf[0].val; #else data = spi->dev->data_buf[0]; @@ -913,7 +918,7 @@ void spiWriteLong(spi_t *spi, uint32_t data) { #if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32 spi->dev->miso_dlen.usr_miso_dbitlen = 0; #endif -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[0].val = data; #else spi->dev->data_buf[0] = data; @@ -937,7 +942,7 @@ uint32_t spiTransferLong(spi_t *spi, uint32_t data) { SPI_MUTEX_LOCK(); spi->dev->mosi_dlen.usr_mosi_dbitlen = 31; spi->dev->miso_dlen.usr_miso_dbitlen = 31; -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[0].val = data; #else spi->dev->data_buf[0] = data; @@ -948,7 +953,7 @@ uint32_t spiTransferLong(spi_t *spi, uint32_t data) { #endif spi->dev->cmd.usr = 1; while (spi->dev->cmd.usr); -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 data = spi->dev->data_buf[0].val; #else data = spi->dev->data_buf[0]; @@ -987,7 +992,7 @@ static void __spiTransferBytes(spi_t *spi, const uint8_t *data, uint8_t *out, ui spi->dev->miso_dlen.usr_miso_dbitlen = ((bytes * 8) - 1); for (i = 0; i < words; i++) { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[i].val = wordsBuf[i]; //copy buffer to spi fifo #else spi->dev->data_buf[i] = wordsBuf[i]; //copy buffer to spi fifo @@ -1004,7 +1009,7 @@ static void __spiTransferBytes(spi_t *spi, const uint8_t *data, uint8_t *out, ui if (out) { for (i = 0; i < words; i++) { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 wordsBuf[i] = spi->dev->data_buf[i].val; //copy spi fifo to buffer #else wordsBuf[i] = spi->dev->data_buf[i]; //copy spi fifo to buffer @@ -1145,7 +1150,7 @@ void ARDUINO_ISR_ATTR spiWriteByteNL(spi_t *spi, uint8_t data) { #if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32 spi->dev->miso_dlen.usr_miso_dbitlen = 0; #endif -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[0].val = data; #else spi->dev->data_buf[0] = data; @@ -1164,7 +1169,7 @@ uint8_t spiTransferByteNL(spi_t *spi, uint8_t data) { } spi->dev->mosi_dlen.usr_mosi_dbitlen = 7; spi->dev->miso_dlen.usr_miso_dbitlen = 7; -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[0].val = data; #else spi->dev->data_buf[0] = data; @@ -1175,7 +1180,7 @@ uint8_t spiTransferByteNL(spi_t *spi, uint8_t data) { #endif spi->dev->cmd.usr = 1; while (spi->dev->cmd.usr); -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 data = spi->dev->data_buf[0].val & 0xFF; #else data = spi->dev->data_buf[0] & 0xFF; @@ -1194,7 +1199,7 @@ void ARDUINO_ISR_ATTR spiWriteShortNL(spi_t *spi, uint16_t data) { #if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32 spi->dev->miso_dlen.usr_miso_dbitlen = 0; #endif -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[0].val = data; #else spi->dev->data_buf[0] = data; @@ -1216,7 +1221,7 @@ uint16_t spiTransferShortNL(spi_t *spi, uint16_t data) { } spi->dev->mosi_dlen.usr_mosi_dbitlen = 15; spi->dev->miso_dlen.usr_miso_dbitlen = 15; -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[0].val = data; #else spi->dev->data_buf[0] = data; @@ -1227,7 +1232,7 @@ uint16_t spiTransferShortNL(spi_t *spi, uint16_t data) { #endif spi->dev->cmd.usr = 1; while (spi->dev->cmd.usr); -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 data = spi->dev->data_buf[0].val & 0xFFFF; #else data = spi->dev->data_buf[0] & 0xFFFF; @@ -1249,7 +1254,7 @@ void ARDUINO_ISR_ATTR spiWriteLongNL(spi_t *spi, uint32_t data) { #if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32 spi->dev->miso_dlen.usr_miso_dbitlen = 0; #endif -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[0].val = data; #else spi->dev->data_buf[0] = data; @@ -1271,7 +1276,7 @@ uint32_t spiTransferLongNL(spi_t *spi, uint32_t data) { } spi->dev->mosi_dlen.usr_mosi_dbitlen = 31; spi->dev->miso_dlen.usr_miso_dbitlen = 31; -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[0].val = data; #else spi->dev->data_buf[0] = data; @@ -1282,7 +1287,7 @@ uint32_t spiTransferLongNL(spi_t *spi, uint32_t data) { #endif spi->dev->cmd.usr = 1; while (spi->dev->cmd.usr); -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 data = spi->dev->data_buf[0].val; #else data = spi->dev->data_buf[0]; @@ -1313,7 +1318,7 @@ void spiWriteNL(spi_t *spi, const void *data_in, uint32_t len) { spi->dev->miso_dlen.usr_miso_dbitlen = 0; #endif for (size_t i = 0; i < c_longs; i++) { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[i].val = data[i]; #else spi->dev->data_buf[i] = data[i]; @@ -1352,7 +1357,7 @@ void spiTransferBytesNL(spi_t *spi, const void *data_in, uint8_t *data_out, uint spi->dev->miso_dlen.usr_miso_dbitlen = (c_len * 8) - 1; if (data) { for (size_t i = 0; i < c_longs; i++) { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[i].val = data[i]; #else spi->dev->data_buf[i] = data[i]; @@ -1360,7 +1365,7 @@ void spiTransferBytesNL(spi_t *spi, const void *data_in, uint8_t *data_out, uint } } else { for (size_t i = 0; i < c_longs; i++) { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[i].val = 0xFFFFFFFF; #else spi->dev->data_buf[i] = 0xFFFFFFFF; @@ -1376,13 +1381,13 @@ void spiTransferBytesNL(spi_t *spi, const void *data_in, uint8_t *data_out, uint if (result) { if (c_len & 3) { for (size_t i = 0; i < (c_longs - 1); i++) { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 result[i] = spi->dev->data_buf[i].val; #else result[i] = spi->dev->data_buf[i]; #endif } -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 uint32_t last_data = spi->dev->data_buf[c_longs - 1].val; #else uint32_t last_data = spi->dev->data_buf[c_longs - 1]; @@ -1394,7 +1399,7 @@ void spiTransferBytesNL(spi_t *spi, const void *data_in, uint8_t *data_out, uint } } else { for (size_t i = 0; i < c_longs; i++) { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 result[i] = spi->dev->data_buf[i].val; #else result[i] = spi->dev->data_buf[i]; @@ -1436,7 +1441,7 @@ void spiTransferBitsNL(spi_t *spi, uint32_t data, uint32_t *out, uint8_t bits) { spi->dev->mosi_dlen.usr_mosi_dbitlen = (bits - 1); spi->dev->miso_dlen.usr_miso_dbitlen = (bits - 1); -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[0].val = data; #else spi->dev->data_buf[0] = data; @@ -1447,7 +1452,7 @@ void spiTransferBitsNL(spi_t *spi, uint32_t data, uint32_t *out, uint8_t bits) { #endif spi->dev->cmd.usr = 1; while (spi->dev->cmd.usr); -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 data = spi->dev->data_buf[0].val; #else data = spi->dev->data_buf[0]; @@ -1488,27 +1493,27 @@ void ARDUINO_ISR_ATTR spiWritePixelsNL(spi_t *spi, const void *data_in, uint32_t if (msb) { if (l_bytes && i == (c_longs - 1)) { if (l_bytes == 2) { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 MSB_16_SET(spi->dev->data_buf[i].val, data[i]); #else MSB_16_SET(spi->dev->data_buf[i], data[i]); #endif } else { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[i].val = data[i] & 0xFF; #else spi->dev->data_buf[i] = data[i] & 0xFF; #endif } } else { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 MSB_PIX_SET(spi->dev->data_buf[i].val, data[i]); #else MSB_PIX_SET(spi->dev->data_buf[i], data[i]); #endif } } else { -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 spi->dev->data_buf[i].val = data[i]; #else spi->dev->data_buf[i] = data[i]; diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index 75e2da013ea..a928a8ede3a 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -206,6 +206,14 @@ static bool lpuartCheckPins(int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rt } #endif // SOC_UART_LP_NUM >= 1 +#ifndef GPIO_FUNC_IN_LOW +#define GPIO_FUNC_IN_LOW GPIO_MATRIX_CONST_ZERO_INPUT +#endif + +#ifndef GPIO_FUNC_IN_HIGH +#define GPIO_FUNC_IN_HIGH GPIO_MATRIX_CONST_ONE_INPUT +#endif + // Negative Pin Number will keep it unmodified, thus this function can detach individual pins // This function will also unset the pins in the Peripheral Manager and set the pin to -1 after detaching static bool _uartDetachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin) { @@ -221,7 +229,8 @@ static bool _uartDetachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t // detaches HP and LP pins and sets Peripheral Manager and UART information if (rxPin >= 0 && uart->_rxPin == rxPin && perimanGetPinBusType(rxPin) == ESP32_BUS_TYPE_UART_RX) { - gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[rxPin], PIN_FUNC_GPIO); + //gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[rxPin], PIN_FUNC_GPIO); + esp_rom_gpio_pad_select_gpio(rxPin); // avoids causing BREAK in the UART line if (uart->_inverted) { esp_rom_gpio_connect_in_signal(GPIO_FUNC_IN_LOW, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RX_PIN_IDX), false); @@ -235,7 +244,8 @@ static bool _uartDetachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t } } if (txPin >= 0 && uart->_txPin == txPin && perimanGetPinBusType(txPin) == ESP32_BUS_TYPE_UART_TX) { - gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[txPin], PIN_FUNC_GPIO); + //gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[txPin], PIN_FUNC_GPIO); + esp_rom_gpio_pad_select_gpio(txPin); esp_rom_gpio_connect_out_signal(txPin, SIG_GPIO_OUT_IDX, false, false); uart->_txPin = -1; // -1 means unassigned/detached if (!perimanClearPinBus(txPin)) { @@ -244,7 +254,8 @@ static bool _uartDetachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t } } if (ctsPin >= 0 && uart->_ctsPin == ctsPin && perimanGetPinBusType(ctsPin) == ESP32_BUS_TYPE_UART_CTS) { - gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[ctsPin], PIN_FUNC_GPIO); + //gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[ctsPin], PIN_FUNC_GPIO); + esp_rom_gpio_pad_select_gpio(ctsPin); esp_rom_gpio_connect_in_signal(GPIO_FUNC_IN_LOW, UART_PERIPH_SIGNAL(uart_num, SOC_UART_CTS_PIN_IDX), false); uart->_ctsPin = -1; // -1 means unassigned/detached if (!perimanClearPinBus(ctsPin)) { @@ -253,7 +264,8 @@ static bool _uartDetachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t } } if (rtsPin >= 0 && uart->_rtsPin == rtsPin && perimanGetPinBusType(rtsPin) == ESP32_BUS_TYPE_UART_RTS) { - gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[rtsPin], PIN_FUNC_GPIO); + //gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[rtsPin], PIN_FUNC_GPIO); + esp_rom_gpio_pad_select_gpio(rtsPin); esp_rom_gpio_connect_out_signal(rtsPin, SIG_GPIO_OUT_IDX, false, false); uart->_rtsPin = -1; // -1 means unassigned/detached if (!perimanClearPinBus(rtsPin)) { @@ -808,7 +820,7 @@ void uartSetRxInvert(uart_t *uart, bool invert) { if (uart == NULL) { return; } -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 // POTENTIAL ISSUE :: original code only set/reset rxd_inv bit // IDF or LL set/reset the whole inv_mask! // if (invert) diff --git a/idf_component.yml b/idf_component.yml index 967c4ecf0f6..c1fc614cae5 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -10,6 +10,7 @@ targets: - esp32c6 - esp32h2 - esp32p4 + - esp32c5 tags: - arduino files: @@ -22,6 +23,7 @@ files: - "variants/esp32c6/**/*" - "variants/esp32h2/**/*" - "variants/esp32p4/**/*" + - "variants/esp32c5/**/*" exclude: - "docs/" - "docs/**/*" @@ -44,7 +46,7 @@ files: - "platform.txt" - "programmers.txt" dependencies: - idf: ">=5.3,<5.5" + idf: ">=5.3,<5.6" # mdns 1.2.1 is necessary to build H2 with no WiFi espressif/mdns: version: "^1.2.3" @@ -107,7 +109,7 @@ dependencies: rules: - if: "target == esp32p4" espressif/esp_wifi_remote: - version: "^0.4.1" + version: "^0.5.4" rules: - if: "target == esp32p4" espressif/libsodium: diff --git a/libraries/SPI/src/SPI.cpp b/libraries/SPI/src/SPI.cpp index 35e52f43e4d..732128809c9 100644 --- a/libraries/SPI/src/SPI.cpp +++ b/libraries/SPI/src/SPI.cpp @@ -83,7 +83,7 @@ void SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss) { _miso = (_spi_num == FSPI) ? MISO : -1; _mosi = (_spi_num == FSPI) ? MOSI : -1; _ss = (_spi_num == FSPI) ? SS : -1; -#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 _sck = SCK; _miso = MISO; _mosi = MOSI; diff --git a/platform.txt b/platform.txt index 65be05b3bf4..f41a8b4a764 100644 --- a/platform.txt +++ b/platform.txt @@ -84,6 +84,7 @@ build.extra_flags.esp32c3=-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT={build. build.extra_flags.esp32c6=-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT={build.cdc_on_boot} build.extra_flags.esp32h2=-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT={build.cdc_on_boot} build.extra_flags.esp32p4=-DARDUINO_USB_MODE={build.usb_mode} -DARDUINO_USB_CDC_ON_BOOT={build.cdc_on_boot} -DARDUINO_USB_MSC_ON_BOOT={build.msc_on_boot} -DARDUINO_USB_DFU_ON_BOOT={build.dfu_on_boot} +build.extra_flags.esp32c5=-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT={build.cdc_on_boot} # This can be overriden in boards.txt build.zigbee_mode= @@ -260,6 +261,14 @@ debug_config.esp32c6= debug_script.esp32h2=esp32h2-builtin.cfg debug_config.esp32h2= +# ESP32-P4 debug configuration (TBD) +debug_script.esp32p4=esp32p4-builtin.cfg +debug_config.esp32p4= + +# ESP32-C5 debug configuration (TBD) +debug_script.esp32c5=esp32c5-builtin.cfg +debug_config.esp32c5= + # Debug API variable definitions debug.executable={build.path}/{build.project_name}.elf debug.toolchain=gcc diff --git a/variants/esp32c5/pins_arduino.h b/variants/esp32c5/pins_arduino.h new file mode 100644 index 00000000000..eeaf3e01ebb --- /dev/null +++ b/variants/esp32c5/pins_arduino.h @@ -0,0 +1,42 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include +#include "soc/soc_caps.h" + +#define PIN_RGB_LED 8 +// 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 RGB_BRIGHTNESS 64 + +static const uint8_t TX = 11; +static const uint8_t RX = 12; + +// static const uint8_t USB_DM = 13; +// static const uint8_t USB_DP = 14; + +static const uint8_t SDA = 23; +static const uint8_t SCL = 22; + +static const uint8_t SS = 18; +static const uint8_t MOSI = 19; +static const uint8_t MISO = 20; +static const uint8_t SCK = 21; + +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; + +// LP I2C Pins are fixed on ESP32-C6 +#define WIRE1_PIN_DEFINED +static const uint8_t SDA1 = 2; +static const uint8_t SCL1 = 3; + +#endif /* Pins_Arduino_h */ From bf90cbd18316603a717fa08e2ba4dfcb85541236 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Wed, 22 Jan 2025 01:34:44 +0200 Subject: [PATCH 056/290] fix(examples): Add changes required to some examples --- libraries/ESP32/examples/DeepSleep/TouchWakeUp/TouchWakeUp.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP32/examples/DeepSleep/TouchWakeUp/TouchWakeUp.ino b/libraries/ESP32/examples/DeepSleep/TouchWakeUp/TouchWakeUp.ino index 9d2b248ba44..5b1e0e9e115 100644 --- a/libraries/ESP32/examples/DeepSleep/TouchWakeUp/TouchWakeUp.ino +++ b/libraries/ESP32/examples/DeepSleep/TouchWakeUp/TouchWakeUp.ino @@ -48,7 +48,7 @@ Method to print the touchpad by which ESP32 has been awaken from sleep */ void print_wakeup_touchpad() { - touchPin = esp_sleep_get_touchpad_wakeup_status(); + touchPin = (touch_pad_t)esp_sleep_get_touchpad_wakeup_status(); #if CONFIG_IDF_TARGET_ESP32 switch (touchPin) { From af5abd5f6196ab4868b229f1e45f662961e531c7 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Wed, 22 Jan 2025 12:19:42 +0200 Subject: [PATCH 057/290] fix(c5): Update bootloader location --- boards.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards.txt b/boards.txt index ea520e60fde..af3e217df9d 100644 --- a/boards.txt +++ b/boards.txt @@ -186,7 +186,7 @@ esp32c5.build.mcu=esp32c5 esp32c5.build.core=esp32 esp32c5.build.variant=esp32c5 esp32c5.build.board=ESP32C5_DEV -esp32c5.build.bootloader_addr=0x0 +esp32c5.build.bootloader_addr=0x2000 esp32c5.build.cdc_on_boot=0 esp32c5.build.f_cpu=240000000L From 0894d7db68562d4690c5b201df7f0c333c776bc1 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Wed, 22 Jan 2025 12:31:54 +0200 Subject: [PATCH 058/290] fix(report): Add missing chip names --- cores/esp32/Esp.cpp | 6 ++++++ cores/esp32/chip-debug-report.cpp | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/cores/esp32/Esp.cpp b/cores/esp32/Esp.cpp index 3cb0e7351c6..2b2e1280683 100644 --- a/cores/esp32/Esp.cpp +++ b/cores/esp32/Esp.cpp @@ -21,6 +21,7 @@ #include "Esp.h" #include "esp_sleep.h" #include "spi_flash_mmap.h" +#include "esp_idf_version.h" #include #include #include @@ -304,6 +305,11 @@ const char *EspClass::getChipModel(void) { case CHIP_ESP32C6: return "ESP32-C6"; case CHIP_ESP32H2: return "ESP32-H2"; case CHIP_ESP32P4: return "ESP32-P4"; +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) + case CHIP_ESP32C5: return "ESP32-C5"; + case CHIP_ESP32C61: return "ESP32-C61"; + case CHIP_ESP32H21: return "ESP32-H21"; +#endif default: return "UNKNOWN"; } #endif diff --git a/cores/esp32/chip-debug-report.cpp b/cores/esp32/chip-debug-report.cpp index daafef3cab9..e3f3f431f81 100644 --- a/cores/esp32/chip-debug-report.cpp +++ b/cores/esp32/chip-debug-report.cpp @@ -88,6 +88,11 @@ static void printChipInfo(void) { case CHIP_ESP32C6: chip_report_printf("ESP32-C6\n"); break; case CHIP_ESP32H2: chip_report_printf("ESP32-H2\n"); break; case CHIP_ESP32P4: chip_report_printf("ESP32-P4\n"); break; +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) + case CHIP_ESP32C5: chip_report_printf("ESP32-C5\n"); break; + case CHIP_ESP32C61: chip_report_printf("ESP32-C61\n"); break; + case CHIP_ESP32H21: chip_report_printf("ESP32-H21\n"); break; +#endif default: chip_report_printf("Unknown %d\n", info.model); break; } printPkgVersion(); From 100ed8e89524d5228ea2fc8d5220eba775462519 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, 22 Jan 2025 12:56:41 +0100 Subject: [PATCH 059/290] fix(c5): Update debug log in setCpuFrequencyMhz --- cores/esp32/esp32-hal-cpu.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cores/esp32/esp32-hal-cpu.c b/cores/esp32/esp32-hal-cpu.c index 8c13a4077fd..30c7e3a2b0a 100644 --- a/cores/esp32/esp32-hal-cpu.c +++ b/cores/esp32/esp32-hal-cpu.c @@ -267,6 +267,12 @@ bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) { (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 ); +#elif defined(CONFIG_IDF_TARGET_ESP32C5) + log_d( + "%s: %u / %u = %u Mhz, APB: %u Hz", + (conf.source == SOC_CPU_CLK_SRC_PLL_F240M || conf.source == SOC_CPU_CLK_SRC_PLL_F160M) ? "PLL" : ((conf.source == SOC_CPU_CLK_SRC_XTAL) ? "XTAL" : "8M"), + conf.source_freq_mhz, conf.div, conf.freq_mhz, apb + ); #else log_d( "%s: %u / %u = %u Mhz, APB: %u Hz", (conf.source == SOC_CPU_CLK_SRC_PLL) ? "PLL" : ((conf.source == SOC_CPU_CLK_SRC_XTAL) ? "XTAL" : "17.5M"), From d9d3bf48d3f25bd3bc8a2217c67034c5842eccb5 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 22 Jan 2025 14:50:05 +0100 Subject: [PATCH 060/290] add c5 bootloader location to pioarduino script (#10889) * add c5 bootloader location to pioarduino script * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- tools/pioarduino-build.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/pioarduino-build.py b/tools/pioarduino-build.py index 3335a716888..47940b0d043 100644 --- a/tools/pioarduino-build.py +++ b/tools/pioarduino-build.py @@ -213,7 +213,11 @@ def add_tinyuf2_extra_image(): LIBSOURCE_DIRS=[join(FRAMEWORK_DIR, "libraries")], FLASH_EXTRA_IMAGES=[ ( - "0x1000" if build_mcu in ["esp32", "esp32s2"] else ("0x2000" if build_mcu in ["esp32p4"] else "0x0000"), + ( + "0x1000" + if build_mcu in ["esp32", "esp32s2"] + else ("0x2000" if build_mcu in ["esp32p4", "esp32c5"] else "0x0000") + ), get_bootloader_image(variants_dir), ), ("0x8000", join(env.subst("$BUILD_DIR"), "partitions.bin")), From 8af81cdf096f003255679485733566ffb23f3042 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Wed, 22 Jan 2025 15:52:13 +0200 Subject: [PATCH 061/290] fix(ci): Fix/stop some examples for C5 --- libraries/ESP32/examples/DeepSleep/ExternalWakeUp/ci.json | 3 ++- .../ESP32/examples/DeepSleep/SmoothBlink_ULP_Code/ci.json | 3 ++- libraries/ESP32/examples/DeepSleep/TouchWakeUp/ci.json | 3 ++- libraries/ESP32/examples/RMT/RMTLoopback/RMTLoopback.ino | 2 +- .../ESP32/examples/ResetReason/ResetReason/ResetReason.ino | 2 ++ libraries/ESP32/examples/TWAI/TWAIreceive/ci.json | 5 +++++ libraries/ESP32/examples/TWAI/TWAItransmit/ci.json | 5 +++++ libraries/ESP_SR/examples/Basic/ci.json | 3 ++- 8 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 libraries/ESP32/examples/TWAI/TWAIreceive/ci.json create mode 100644 libraries/ESP32/examples/TWAI/TWAItransmit/ci.json diff --git a/libraries/ESP32/examples/DeepSleep/ExternalWakeUp/ci.json b/libraries/ESP32/examples/DeepSleep/ExternalWakeUp/ci.json index cd679adefad..dfd49d94fe9 100644 --- a/libraries/ESP32/examples/DeepSleep/ExternalWakeUp/ci.json +++ b/libraries/ESP32/examples/DeepSleep/ExternalWakeUp/ci.json @@ -3,6 +3,7 @@ "esp32c3": false, "esp32c6": false, "esp32h2": false, - "esp32p4": false + "esp32p4": false, + "esp32c5": false } } diff --git a/libraries/ESP32/examples/DeepSleep/SmoothBlink_ULP_Code/ci.json b/libraries/ESP32/examples/DeepSleep/SmoothBlink_ULP_Code/ci.json index 6afa60f44c4..5fa2bd14e5d 100644 --- a/libraries/ESP32/examples/DeepSleep/SmoothBlink_ULP_Code/ci.json +++ b/libraries/ESP32/examples/DeepSleep/SmoothBlink_ULP_Code/ci.json @@ -5,6 +5,7 @@ "esp32h2": false, "esp32p4": false, "esp32s2": false, - "esp32s3": false + "esp32s3": false, + "esp32c5": false } } diff --git a/libraries/ESP32/examples/DeepSleep/TouchWakeUp/ci.json b/libraries/ESP32/examples/DeepSleep/TouchWakeUp/ci.json index 25c42144223..ae65fa0df74 100644 --- a/libraries/ESP32/examples/DeepSleep/TouchWakeUp/ci.json +++ b/libraries/ESP32/examples/DeepSleep/TouchWakeUp/ci.json @@ -2,6 +2,7 @@ "targets": { "esp32c3": false, "esp32c6": false, - "esp32h2": false + "esp32h2": false, + "esp32c5": false } } diff --git a/libraries/ESP32/examples/RMT/RMTLoopback/RMTLoopback.ino b/libraries/ESP32/examples/RMT/RMTLoopback/RMTLoopback.ino index 17e7af290bf..1b96d868ecb 100644 --- a/libraries/ESP32/examples/RMT/RMTLoopback/RMTLoopback.ino +++ b/libraries/ESP32/examples/RMT/RMTLoopback/RMTLoopback.ino @@ -21,7 +21,7 @@ * */ -#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 // ESP32 C3 has only 2 channels for RX and 2 for TX, thus MAX RMT_MEM is 128 #define RMT_TX_PIN 4 #define RMT_RX_PIN 5 diff --git a/libraries/ESP32/examples/ResetReason/ResetReason/ResetReason.ino b/libraries/ESP32/examples/ResetReason/ResetReason/ResetReason.ino index 0104c6422f2..ca7e15bf479 100644 --- a/libraries/ESP32/examples/ResetReason/ResetReason/ResetReason.ino +++ b/libraries/ESP32/examples/ResetReason/ResetReason/ResetReason.ino @@ -28,6 +28,8 @@ #include "esp32h2/rom/rtc.h" #elif CONFIG_IDF_TARGET_ESP32P4 #include "esp32p4/rom/rtc.h" +#elif CONFIG_IDF_TARGET_ESP32C5 +#include "esp32c5/rom/rtc.h" #else #error Target CONFIG_IDF_TARGET is not supported #endif diff --git a/libraries/ESP32/examples/TWAI/TWAIreceive/ci.json b/libraries/ESP32/examples/TWAI/TWAIreceive/ci.json new file mode 100644 index 00000000000..7379dba8bb9 --- /dev/null +++ b/libraries/ESP32/examples/TWAI/TWAIreceive/ci.json @@ -0,0 +1,5 @@ +{ + "targets": { + "esp32c5": false + } +} diff --git a/libraries/ESP32/examples/TWAI/TWAItransmit/ci.json b/libraries/ESP32/examples/TWAI/TWAItransmit/ci.json new file mode 100644 index 00000000000..7379dba8bb9 --- /dev/null +++ b/libraries/ESP32/examples/TWAI/TWAItransmit/ci.json @@ -0,0 +1,5 @@ +{ + "targets": { + "esp32c5": false + } +} diff --git a/libraries/ESP_SR/examples/Basic/ci.json b/libraries/ESP_SR/examples/Basic/ci.json index c395378f45e..ec0e969a7d0 100644 --- a/libraries/ESP_SR/examples/Basic/ci.json +++ b/libraries/ESP_SR/examples/Basic/ci.json @@ -13,6 +13,7 @@ "esp32c6": false, "esp32h2": false, "esp32p4": false, - "esp32s2": false + "esp32s2": false, + "esp32c5": false } } From 9fbcb345b786e30de491e34b1cd4ea8d8ff4e2ef 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, 22 Jan 2025 18:44:49 +0100 Subject: [PATCH 062/290] fix(c5): Update PIN_RGB_LED in pins_arduino.h --- variants/esp32c5/pins_arduino.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/esp32c5/pins_arduino.h b/variants/esp32c5/pins_arduino.h index eeaf3e01ebb..6ed7f0320fe 100644 --- a/variants/esp32c5/pins_arduino.h +++ b/variants/esp32c5/pins_arduino.h @@ -4,7 +4,7 @@ #include #include "soc/soc_caps.h" -#define PIN_RGB_LED 8 +#define PIN_RGB_LED 27 // 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 From f45cd7bf337316f4c6dde18bf23cd9c5b413863f Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Mon, 27 Jan 2025 14:06:54 +0200 Subject: [PATCH 063/290] fix(psram): Add support for ESP32-C5 PSRAM --- boards.txt | 5 +++++ cores/esp32/chip-debug-report.cpp | 3 +++ cores/esp32/esp32-hal-psram.c | 2 ++ 3 files changed, 10 insertions(+) diff --git a/boards.txt b/boards.txt index af3e217df9d..0f42aa18a05 100644 --- a/boards.txt +++ b/boards.txt @@ -210,6 +210,11 @@ esp32c5.menu.JTAGAdapter.bridge=ESP USB Bridge esp32c5.menu.JTAGAdapter.bridge.build.openocdscript=esp32c5-bridge.cfg esp32c5.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 +esp32c5.menu.PSRAM.disabled=Disabled +esp32c5.menu.PSRAM.disabled.build.defines= +esp32c5.menu.PSRAM.enabled=Enabled +esp32c5.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM + esp32c5.menu.CDCOnBoot.default=Disabled esp32c5.menu.CDCOnBoot.default.build.cdc_on_boot=0 esp32c5.menu.CDCOnBoot.cdc=Enabled diff --git a/cores/esp32/chip-debug-report.cpp b/cores/esp32/chip-debug-report.cpp index e3f3f431f81..281c7bdb62d 100644 --- a/cores/esp32/chip-debug-report.cpp +++ b/cores/esp32/chip-debug-report.cpp @@ -67,6 +67,9 @@ static void printPkgVersion(void) { #elif CONFIG_IDF_TARGET_ESP32P4 uint32_t pkg_ver = REG_GET_FIELD(EFUSE_RD_MAC_SYS_2_REG, EFUSE_PKG_VERSION); chip_report_printf("%lu", pkg_ver); +#elif CONFIG_IDF_TARGET_ESP32C5 + uint32_t pkg_ver = REG_GET_FIELD(EFUSE_RD_MAC_SYS2_REG, EFUSE_PKG_VERSION); + chip_report_printf("%lu", pkg_ver); #else chip_report_printf("Unknown"); #endif diff --git a/cores/esp32/esp32-hal-psram.c b/cores/esp32/esp32-hal-psram.c index 3c7a51c3343..0d57a67ede4 100644 --- a/cores/esp32/esp32-hal-psram.c +++ b/cores/esp32/esp32-hal-psram.c @@ -29,6 +29,8 @@ #include "esp32s3/rom/cache.h" #elif CONFIG_IDF_TARGET_ESP32P4 #include "esp32p4/rom/cache.h" +#elif CONFIG_IDF_TARGET_ESP32C5 +#include "esp32c5/rom/cache.h" #else #error Target CONFIG_IDF_TARGET is not supported #endif From 75de09ef298c5bc9e26c7be2fd8af0446b4e4296 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Tue, 4 Feb 2025 00:14:19 +0200 Subject: [PATCH 064/290] fix(board): Update ESP32-C5 Dev Kit Pinout --- variants/esp32c5/pins_arduino.h | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/variants/esp32c5/pins_arduino.h b/variants/esp32c5/pins_arduino.h index 6ed7f0320fe..e3a7e57ef44 100644 --- a/variants/esp32c5/pins_arduino.h +++ b/variants/esp32c5/pins_arduino.h @@ -19,13 +19,13 @@ static const uint8_t RX = 12; // static const uint8_t USB_DM = 13; // static const uint8_t USB_DP = 14; -static const uint8_t SDA = 23; -static const uint8_t SCL = 22; +static const uint8_t SDA = 0; +static const uint8_t SCL = 1; -static const uint8_t SS = 18; -static const uint8_t MOSI = 19; -static const uint8_t MISO = 20; -static const uint8_t SCK = 21; +static const uint8_t SS = 6; +static const uint8_t MOSI = 8; +static const uint8_t MISO = 9; +static const uint8_t SCK = 10; static const uint8_t A0 = 1; static const uint8_t A1 = 2; @@ -34,9 +34,15 @@ static const uint8_t A3 = 4; static const uint8_t A4 = 5; static const uint8_t A5 = 6; -// LP I2C Pins are fixed on ESP32-C6 +// LP I2C Pins are fixed on ESP32-C5 +static const uint8_t LP_SDA = 2; +static const uint8_t LP_SCL = 3; #define WIRE1_PIN_DEFINED -static const uint8_t SDA1 = 2; -static const uint8_t SCL1 = 3; +#define SDA1 LP_SDA +#define SCL1 LP_SCL + +// LP UART Pins are fixed on ESP32-C5 +static const uint8_t LP_RX = 4; +static const uint8_t LP_TX = 5; #endif /* Pins_Arduino_h */ From 6283c15ae22da9ec731b2fc7a1f5539f9efca6cf Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 18 Feb 2025 14:24:37 +0200 Subject: [PATCH 065/290] IDF master (#10887) * feat(ci): Run sketches on ESP32-C5 * IDF master 1160a86b * fix(zigbee): Remove RCP mode from ESP32-C5 --- .github/scripts/on-push.sh | 1 + .github/scripts/sketch_utils.sh | 5 + .github/workflows/push.yml | 1 + boards.txt | 14 +- package/package_esp32_index.template.json | 204 +++++++++++----------- 5 files changed, 113 insertions(+), 112 deletions(-) diff --git a/.github/scripts/on-push.sh b/.github/scripts/on-push.sh index 6095f88e727..3eb020c09a3 100755 --- a/.github/scripts/on-push.sh +++ b/.github/scripts/on-push.sh @@ -90,6 +90,7 @@ if [ "$BUILD_LOG" -eq 1 ]; then fi #build sketches for different targets +build "esp32c5" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$LOG_LEVEL" "$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[@]}" diff --git a/.github/scripts/sketch_utils.sh b/.github/scripts/sketch_utils.sh index e536da50111..323f39b3afc 100755 --- a/.github/scripts/sketch_utils.sh +++ b/.github/scripts/sketch_utils.sh @@ -156,6 +156,7 @@ function build_sketch { # build_sketch [ext esp32c6_opts=$(echo "$debug_level,$fqbn_append" | sed 's/^,*//;s/,*$//;s/,\{2,\}/,/g') esp32h2_opts=$(echo "$debug_level,$fqbn_append" | sed 's/^,*//;s/,*$//;s/,\{2,\}/,/g') esp32p4_opts=$(echo "PSRAM=enabled,USBMode=default,$debug_level,$fqbn_append" | sed 's/^,*//;s/,*$//;s/,\{2,\}/,/g') + esp32c5_opts=$(echo "$debug_level,$fqbn_append" | sed 's/^,*//;s/,*$//;s/,\{2,\}/,/g') # Select the common part of the FQBN based on the target. The rest will be # appended depending on the passed options. @@ -191,6 +192,10 @@ function build_sketch { # build_sketch [ext [ -n "${options:-$esp32p4_opts}" ] && opt=":${options:-$esp32p4_opts}" fqbn="espressif:esp32:esp32p4$opt" ;; + "esp32c5") + [ -n "${options:-$esp32c5_opts}" ] && opt=":${options:-$esp32c5_opts}" + fqbn="espressif:esp32:esp32c5$opt" + ;; *) echo "ERROR: Invalid chip: $target" exit 1 diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index feb32f95d03..428b89a8c21 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -47,6 +47,7 @@ on: - "variants/esp32/**/*" - "variants/esp32c2/**/*" - "variants/esp32c3/**/*" + - "variants/esp32c5/**/*" - "variants/esp32c6/**/*" - "variants/esp32h2/**/*" - "variants/esp32p4/**/*" diff --git a/boards.txt b/boards.txt index 0f42aa18a05..f7ad60d3eab 100644 --- a/boards.txt +++ b/boards.txt @@ -359,22 +359,16 @@ esp32c5.menu.ZigbeeMode.default.build.zigbee_mode= esp32c5.menu.ZigbeeMode.default.build.zigbee_libs= esp32c5.menu.ZigbeeMode.ed=Zigbee ED (end device) esp32c5.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED -esp32c5.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api_ed -lesp_zb_cli_command -lzboss_stack.ed -lzboss_port +esp32c5.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native esp32c5.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) esp32c5.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -esp32c5.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api_zczr -lesp_zb_cli_command -lzboss_stack.zczr -lzboss_port -esp32c5.menu.ZigbeeMode.rcp=Zigbee RCP (radio co-processor) -esp32c5.menu.ZigbeeMode.rcp.build.zigbee_mode=-DZIGBEE_MODE_RCP -esp32c5.menu.ZigbeeMode.rcp.build.zigbee_libs=-lesp_zb_api_rcp -lesp_zb_cli_command -lzboss_stack.rcp -lzboss_port +esp32c5.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native esp32c5.menu.ZigbeeMode.ed_debug=Zigbee ED (end device) - Debug esp32c5.menu.ZigbeeMode.ed_debug.build.zigbee_mode=-DZIGBEE_MODE_ED -esp32c5.menu.ZigbeeMode.ed_debug.build.zigbee_libs=-lesp_zb_api_ed.debug -lesp_zb_cli_command -lzboss_stack.ed.debug -lzboss_port.debug +esp32c5.menu.ZigbeeMode.ed_debug.build.zigbee_libs=-lesp_zb_api.ed.debug -lzboss_stack.ed.debug -lzboss_port.native.debug esp32c5.menu.ZigbeeMode.zczr_debug=Zigbee ZCZR (coordinator/router) - Debug esp32c5.menu.ZigbeeMode.zczr_debug.build.zigbee_mode=-DZIGBEE_MODE_ZCZR -esp32c5.menu.ZigbeeMode.zczr_debug.build.zigbee_libs=-lesp_zb_api_zczr.debug -lesp_zb_cli_command -lzboss_stack.zczr.debug -lzboss_port.debug -esp32c5.menu.ZigbeeMode.rcp_debug=Zigbee RCP (radio co-processor) - Debug -esp32c5.menu.ZigbeeMode.rcp_debug.build.zigbee_mode=-DZIGBEE_MODE_RCP -esp32c5.menu.ZigbeeMode.rcp_debug.build.zigbee_libs=-lesp_zb_api_rcp.debug -lesp_zb_cli_command -lzboss_stack.rcp.debug -lzboss_port.debug +esp32c5.menu.ZigbeeMode.zczr_debug.build.zigbee_libs=-lesp_zb_api.zczr.debug -lzboss_stack.zczr.debug -lzboss_port.native.debug ############################################################## diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index b0d7c3200d1..8bbd2e6a4e9 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-d4aa25a3-v1" + "version": "idf-master-1160a86b-v1" }, { "packager": "esp32", @@ -61,7 +61,7 @@ { "packager": "esp32", "name": "xtensa-esp-elf-gdb", - "version": "14.2_20240403" + "version": "15.2_20241112" }, { "packager": "esp32", @@ -71,7 +71,7 @@ { "packager": "esp32", "name": "riscv32-esp-elf-gdb", - "version": "14.2_20240403" + "version": "15.2_20241112" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-d4aa25a3-v1", + "version": "idf-master-1160a86b-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", + "size": "405894668" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", + "size": "405894668" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", + "size": "405894668" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", + "size": "405894668" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", + "size": "405894668" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", + "size": "405894668" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", + "size": "405894668" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", + "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", + "size": "405894668" } ] }, @@ -228,63 +228,63 @@ }, { "name": "xtensa-esp-elf-gdb", - "version": "14.2_20240403", + "version": "15.2_20241112", "systems": [ { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-x86_64-linux-gnu.tar.gz", - "archiveFileName": "xtensa-esp-elf-gdb-14.2_20240403-x86_64-linux-gnu.tar.gz", - "checksum": "SHA-256:9d68472d4cba5cf8c2b79d94f86f92c828e76a632bd1e6be5e7706e5b304d36e", - "size": "31010320" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-x86_64-linux-gnu.tar.gz", + "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-x86_64-linux-gnu.tar.gz", + "checksum": "SHA-256:18774349d2b1c7d7f5ba984563f7022aef4a3df4b706ed8821c53266f599343d", + "size": "35179121" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-aarch64-linux-gnu.tar.gz", - "archiveFileName": "xtensa-esp-elf-gdb-14.2_20240403-aarch64-linux-gnu.tar.gz", - "checksum": "SHA-256:bdabc3217994815fc311c4e16e588b78f6596b5ad4ffa46c80b40e982cfb1e66", - "size": "30954580" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-aarch64-linux-gnu.tar.gz", + "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-aarch64-linux-gnu.tar.gz", + "checksum": "SHA-256:77cb3b2c85d6cfbb40b7f99eebbc2b1c3f4fe13eba20b3da798bdbbc6eb8e87c", + "size": "34295046" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-arm-linux-gnueabi.tar.gz", - "archiveFileName": "xtensa-esp-elf-gdb-14.2_20240403-arm-linux-gnueabi.tar.gz", - "checksum": "SHA-256:d54b8d703ba897b28c627da3d27106a3906dd01ba298778a67064710bc33c76d", - "size": "28697281" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-arm-linux-gnueabi.tar.gz", + "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-arm-linux-gnueabi.tar.gz", + "checksum": "SHA-256:b87af0539de118eb9d43a4a89c8c1b0a6ab2557560015155104c44f91b5c4aa0", + "size": "30338727" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-i586-linux-gnu.tar.gz", - "archiveFileName": "xtensa-esp-elf-gdb-14.2_20240403-i586-linux-gnu.tar.gz", - "checksum": "SHA-256:64d3bc992ed8fdec383d49e8b803ac494605a38117c8293db8da055037de96b0", - "size": "29890994" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-i586-linux-gnu.tar.gz", + "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-i586-linux-gnu.tar.gz", + "checksum": "SHA-256:2c7531bd390928fed479999ac9089b39a25f56ca4f4cc330db7d7a633a37405b", + "size": "33906121" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-x86_64-apple-darwin14.tar.gz", - "archiveFileName": "xtensa-esp-elf-gdb-14.2_20240403-x86_64-apple-darwin14.tar.gz", - "checksum": "SHA-256:023e74b3fda793da4bc0509b02de776ee0dad6efaaac17bef5916fb7dc9c26b9", - "size": "44446611" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-x86_64-apple-darwin21.1.tar.gz", + "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-x86_64-apple-darwin21.1.tar.gz", + "checksum": "SHA-256:ba2907be9a4c22c4e418f42ec84cf57401570a71dabbe69425227114ebf351a7", + "size": "52502302" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-aarch64-apple-darwin21.1.tar.gz", - "archiveFileName": "xtensa-esp-elf-gdb-14.2_20240403-aarch64-apple-darwin21.1.tar.gz", - "checksum": "SHA-256:ea757c6bf8c25238f6d2fdcc6bbab25a1b00608a0f9e19b7ddd2f37ddbdc3fb1", - "size": "37021423" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-aarch64-apple-darwin21.1.tar.gz", + "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-aarch64-apple-darwin21.1.tar.gz", + "checksum": "SHA-256:893500d6de354a6870820b9398531d8cd37d1cd85f3ae9b1f8a4c070b8048707", + "size": "41892363" }, { "host": "i686-mingw32", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-i686-w64-mingw32.zip", - "archiveFileName": "xtensa-esp-elf-gdb-14.2_20240403-i686-w64-mingw32.zip", - "checksum": "SHA-256:322e8d9b700dc32d8158e3dc55fb85ec55de48d0bb7789375ee39a28d5d655e2", - "size": "26302466" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-i686-w64-mingw32.zip", + "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-i686-w64-mingw32.zip", + "checksum": "SHA-256:328181380fccb252105c51a86071edbc5ef63e0114540edc4f8b2d62acf44916", + "size": "31307770" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/xtensa-esp-elf-gdb-14.2_20240403-x86_64-w64-mingw32.zip", - "archiveFileName": "xtensa-esp-elf-gdb-14.2_20240403-x86_64-w64-mingw32.zip", - "checksum": "SHA-256:a27a2fe20f192f8e0a51b8936428b4e1cf8935cfe008ee445cc49f6fc7f6db2e", - "size": "28366035" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-x86_64-w64-mingw32.zip", + "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-x86_64-w64-mingw32.zip", + "checksum": "SHA-256:9c1949058d7aa1fa6f6f2d03173659b9f54e3c3940cbeebc1d56ae169c604ab2", + "size": "31420687" } ] }, @@ -352,63 +352,63 @@ }, { "name": "riscv32-esp-elf-gdb", - "version": "14.2_20240403", + "version": "15.2_20241112", "systems": [ { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-x86_64-linux-gnu.tar.gz", - "archiveFileName": "riscv32-esp-elf-gdb-14.2_20240403-x86_64-linux-gnu.tar.gz", - "checksum": "SHA-256:ce004bc0bbd71b246800d2d13b239218b272a38bd528e316f21f1af2db8a4b13", - "size": "30707431" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-x86_64-linux-gnu.tar.gz", + "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-x86_64-linux-gnu.tar.gz", + "checksum": "SHA-256:bfca245b3d84244ad3b6156496728d916ac5ccc0d7f8e048194b7eba5cdbe047", + "size": "35297398" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-aarch64-linux-gnu.tar.gz", - "archiveFileName": "riscv32-esp-elf-gdb-14.2_20240403-aarch64-linux-gnu.tar.gz", - "checksum": "SHA-256:ba10f2866c61410b88c65957274280b1a62e3bed05131654ed9b6758efe18e55", - "size": "30824065" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-aarch64-linux-gnu.tar.gz", + "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-aarch64-linux-gnu.tar.gz", + "checksum": "SHA-256:8536da9e3093b8f25e0b5204b04ed4afea432d1fd262f2abb466016d3d750ea6", + "size": "34455317" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-arm-linux-gnueabi.tar.gz", - "archiveFileName": "riscv32-esp-elf-gdb-14.2_20240403-arm-linux-gnueabi.tar.gz", - "checksum": "SHA-256:88539db5d987f28827efac7e26080a2803b9b539342ccd2963ccfdd56d7f08f7", - "size": "29000575" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-arm-linux-gnueabi.tar.gz", + "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-arm-linux-gnueabi.tar.gz", + "checksum": "SHA-256:33a80d5e6604bb7d08b15492b8ec84c9176245e066d0bf8aad7570786ca44081", + "size": "31188203" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-i586-linux-gnu.tar.gz", - "archiveFileName": "riscv32-esp-elf-gdb-14.2_20240403-i586-linux-gnu.tar.gz", - "checksum": "SHA-256:0e628ee37438ab6ba05eb889a76d09e50cb98e0020a16b8e2b935c5cf19b4ed2", - "size": "29947521" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-i586-linux-gnu.tar.gz", + "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-i586-linux-gnu.tar.gz", + "checksum": "SHA-256:ba448ecf2c80064013eaacb0e7be514a5ef17516f49ff3e50bc41c5578b8d88e", + "size": "34211289" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-x86_64-apple-darwin14.tar.gz", - "archiveFileName": "riscv32-esp-elf-gdb-14.2_20240403-x86_64-apple-darwin14.tar.gz", - "checksum": "SHA-256:8f6bda832d70dad5860a639d55aba4237bd10cbac9f4822db1eece97357b34a9", - "size": "44196117" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-x86_64-apple-darwin21.1.tar.gz", + "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-x86_64-apple-darwin21.1.tar.gz", + "checksum": "SHA-256:bdd07c54fe3216eb5c34f92cac514eb4af777c951573f186c33408c75f56bb4b", + "size": "52831957" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-aarch64-apple-darwin21.1.tar.gz", - "archiveFileName": "riscv32-esp-elf-gdb-14.2_20240403-aarch64-apple-darwin21.1.tar.gz", - "checksum": "SHA-256:d88b6116e86456c8480ce9bc95aed375a35c0d091f1da0a53b86be0e6ef3d320", - "size": "36794404" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-aarch64-apple-darwin21.1.tar.gz", + "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-aarch64-apple-darwin21.1.tar.gz", + "checksum": "SHA-256:9924f439ae77c3346e532a48a0d56330466c33ce1abd8d72b77f9f7f5c3b1196", + "size": "42227631" }, { "host": "i686-mingw32", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-i686-w64-mingw32.zip", - "archiveFileName": "riscv32-esp-elf-gdb-14.2_20240403-i686-w64-mingw32.zip", - "checksum": "SHA-256:d6e7ce05805b0d8d4dd138ad239b98a1adf8da98941867d60760eb1ae5361730", - "size": "26486295" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-i686-w64-mingw32.zip", + "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-i686-w64-mingw32.zip", + "checksum": "SHA-256:dcdafd30854b092671f555d844d94b0733e2ffcac8c026b4fb7b8a72ebef0016", + "size": "31971712" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v14.2_20240403/riscv32-esp-elf-gdb-14.2_20240403-x86_64-w64-mingw32.zip", - "archiveFileName": "riscv32-esp-elf-gdb-14.2_20240403-x86_64-w64-mingw32.zip", - "checksum": "SHA-256:5c9f211dc46daf6b96fad09d709284a0f0186fef8947d9f6edd6bca5b5ad4317", - "size": "27942579" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-x86_64-w64-mingw32.zip", + "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-x86_64-w64-mingw32.zip", + "checksum": "SHA-256:6ec8b3a073f2c5835321b4b560f8fc56180458204d071da139ff983436ea45e5", + "size": "31759225" } ] }, From 042015efc8930c3de0633ad930c8c05ed536aadd Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 18 Feb 2025 21:09:27 +0200 Subject: [PATCH 066/290] IDF master (#10981) * IDF master 1160a86b * fix(ci): Do not compile RainMaker examples on ESP32 --- .../RainMaker/examples/RMakerCustom/ci.json | 3 + .../RainMaker/examples/RMakerSwitch/ci.json | 3 + package/package_esp32_index.template.json | 68 +++++++++---------- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/libraries/RainMaker/examples/RMakerCustom/ci.json b/libraries/RainMaker/examples/RMakerCustom/ci.json index 1c80eda1d90..ce63fe9ccf0 100644 --- a/libraries/RainMaker/examples/RMakerCustom/ci.json +++ b/libraries/RainMaker/examples/RMakerCustom/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/RMakerSwitch/ci.json b/libraries/RainMaker/examples/RMakerSwitch/ci.json index 1c80eda1d90..ce63fe9ccf0 100644 --- a/libraries/RainMaker/examples/RMakerSwitch/ci.json +++ b/libraries/RainMaker/examples/RMakerSwitch/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/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 8bbd2e6a4e9..714328f9a17 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-master-1160a86b-v1" + "version": "idf-master-1160a86b-v2" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-master-1160a86b-v1", + "version": "idf-master-1160a86b-v2", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", - "size": "405894668" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", + "size": "406007754" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", - "size": "405894668" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", + "size": "406007754" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", - "size": "405894668" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", + "size": "406007754" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", - "size": "405894668" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", + "size": "406007754" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", - "size": "405894668" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", + "size": "406007754" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", - "size": "405894668" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", + "size": "406007754" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", - "size": "405894668" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", + "size": "406007754" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v1.zip", - "checksum": "SHA-256:ab71bb61b12ad109750d4d39200c2aeaa826395f65a2c95c2012d969eb5f76a2", - "size": "405894668" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", + "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", + "size": "406007754" } ] }, From e30e3c30f189aa87d69acb16b672f0ff2a94f1be Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 25 Feb 2025 10:28:07 +0200 Subject: [PATCH 067/290] IDF master (#10999) * IDF master c71d74e2 * IDF master 81e8b752 * IDF master 877057db --- 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 714328f9a17..46f0cd3418a 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-master-1160a86b-v2" + "version": "idf-master-877057db-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-master-1160a86b-v2", + "version": "idf-master-877057db-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", - "size": "406007754" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", + "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", + "size": "411930767" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", - "size": "406007754" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", + "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", + "size": "411930767" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", - "size": "406007754" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", + "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", + "size": "411930767" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", - "size": "406007754" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", + "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", + "size": "411930767" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", - "size": "406007754" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", + "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", + "size": "411930767" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", - "size": "406007754" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", + "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", + "size": "411930767" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", - "size": "406007754" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", + "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", + "size": "411930767" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-1160a86b-v2.zip", - "checksum": "SHA-256:2050bda30b1d3cc397683f38267744dc45d7e4c4dc857250477117f30db754db", - "size": "406007754" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", + "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", + "size": "411930767" } ] }, From 3fe2fe5311df6fc93cad8cb19e5a234b37605e3d Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 27 Feb 2025 00:56:51 +0200 Subject: [PATCH 068/290] IDF master 0461e2ff (#11018) --- 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 46f0cd3418a..f5bf9ed85cd 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-master-877057db-v1" + "version": "idf-master-0461e2ff-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-master-877057db-v1", + "version": "idf-master-0461e2ff-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", - "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", - "size": "411930767" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", + "size": "411886500" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", - "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", - "size": "411930767" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", + "size": "411886500" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", - "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", - "size": "411930767" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", + "size": "411886500" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", - "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", - "size": "411930767" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", + "size": "411886500" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", - "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", - "size": "411930767" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", + "size": "411886500" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", - "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", - "size": "411930767" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", + "size": "411886500" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", - "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", - "size": "411930767" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", + "size": "411886500" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-877057db-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-877057db-v1.zip", - "checksum": "SHA-256:fcded8de4107841bea5aaeb7bf7b53a336b3d132df29fb09ae6697b187d51920", - "size": "411930767" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", + "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", + "size": "411886500" } ] }, From d66eeb77547290eb5811fe6662ca2f709e747577 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 5 Mar 2025 11:44:51 +0100 Subject: [PATCH 069/290] c5 flash base address is 0x2000 (#11037) * c5 flash base address is 0x2000 * 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/Esp.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cores/esp32/Esp.cpp b/cores/esp32/Esp.cpp index 2b2e1280683..f911b2d5f20 100644 --- a/cores/esp32/Esp.cpp +++ b/cores/esp32/Esp.cpp @@ -66,7 +66,7 @@ extern "C" { #define ESP_FLASH_IMAGE_BASE 0x2000 // Esp32p4 is located at 0x2000 #elif CONFIG_IDF_TARGET_ESP32C5 #include "esp32c5/rom/spi_flash.h" -#define ESP_FLASH_IMAGE_BASE 0x0000 // Esp32c5 is located at 0x0000 +#define ESP_FLASH_IMAGE_BASE 0x2000 // Esp32c5 is located at 0x2000 #else #error Target CONFIG_IDF_TARGET is not supported #endif @@ -306,11 +306,11 @@ const char *EspClass::getChipModel(void) { case CHIP_ESP32H2: return "ESP32-H2"; case CHIP_ESP32P4: return "ESP32-P4"; #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) - case CHIP_ESP32C5: return "ESP32-C5"; + case CHIP_ESP32C5: return "ESP32-C5"; case CHIP_ESP32C61: return "ESP32-C61"; case CHIP_ESP32H21: return "ESP32-H21"; #endif - default: return "UNKNOWN"; + default: return "UNKNOWN"; } #endif } From 7c1ac1ae60672216f942b812dcebc0e97326e9e2 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Mon, 10 Mar 2025 22:19:40 +0200 Subject: [PATCH 070/290] feat(wifi): Add support for 2.4GHz and 5GHz band switching (#11045) * feat(wifi): Add support for 2.4GHz and 5GHz band switching * 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/WiFi/examples/WiFiScan/WiFiScan.ino | 41 ++++++--- libraries/WiFi/src/WiFiGeneric.cpp | 88 +++++++++++++++++++ libraries/WiFi/src/WiFiGeneric.h | 4 + 3 files changed, 121 insertions(+), 12 deletions(-) diff --git a/libraries/WiFi/examples/WiFiScan/WiFiScan.ino b/libraries/WiFi/examples/WiFiScan/WiFiScan.ino index 15ce367c897..98733adb0bb 100644 --- a/libraries/WiFi/examples/WiFiScan/WiFiScan.ino +++ b/libraries/WiFi/examples/WiFiScan/WiFiScan.ino @@ -1,5 +1,5 @@ /* - * This sketch demonstrates how to scan WiFi networks. + * This sketch demonstrates how to scan WiFi networks. For chips that support 5GHz band, separate scans are done for all bands. * The API is based on the Arduino WiFi Shield library, but has significant changes as newer WiFi functions are supported. * E.g. the return value of `encryptionType()` different because more modern encryption is supported. */ @@ -7,18 +7,13 @@ void setup() { Serial.begin(115200); - - // Set WiFi to station mode and disconnect from an AP if it was previously connected. - WiFi.mode(WIFI_STA); - WiFi.disconnect(); - delay(100); - + // Enable Station Interface + WiFi.STA.begin(); Serial.println("Setup done"); } -void loop() { +void ScanWiFi() { Serial.println("Scan start"); - // WiFi.scanNetworks will return the number of networks found. int n = WiFi.scanNetworks(); Serial.println("Scan done"); @@ -54,11 +49,33 @@ void loop() { delay(10); } } - Serial.println(""); // Delete the scan result to free memory for code below. WiFi.scanDelete(); - + Serial.println("-------------------------------------"); +} +void loop() { + Serial.println("-------------------------------------"); + Serial.println("Default wifi band mode scan:"); + Serial.println("-------------------------------------"); + WiFi.setBandMode(WIFI_BAND_MODE_AUTO); + ScanWiFi(); +#if CONFIG_SOC_WIFI_SUPPORT_5G + // Wait a bit before scanning again. + delay(1000); + Serial.println("-------------------------------------"); + Serial.println("2.4 Ghz wifi band mode scan:"); + Serial.println("-------------------------------------"); + WiFi.setBandMode(WIFI_BAND_MODE_2G_ONLY); + ScanWiFi(); + // Wait a bit before scanning again. + delay(1000); + Serial.println("-------------------------------------"); + Serial.println("5 Ghz wifi band mode scan:"); + Serial.println("-------------------------------------"); + WiFi.setBandMode(WIFI_BAND_MODE_5G_ONLY); + ScanWiFi(); +#endif // Wait a bit before scanning again. - delay(5000); + delay(10000); } diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index aa994963514..6e38e19a29f 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -378,6 +378,10 @@ static bool espWiFiStart() { log_e("esp_wifi_start 0x%x: %s", err, esp_err_to_name(err)); return _esp_wifi_started; } +#if SOC_WIFI_SUPPORT_5G + log_v("Setting Band Mode to AUTO"); + esp_wifi_set_band_mode(WIFI_BAND_MODE_AUTO); +#endif return _esp_wifi_started; } @@ -729,6 +733,90 @@ wifi_ps_type_t WiFiGenericClass::getSleep() { return _sleepEnabled; } +/** + * control wifi band mode + * @param band_mode enum possible band modes + * @return ok + */ +bool WiFiGenericClass::setBandMode(wifi_band_mode_t band_mode) { +#if SOC_WIFI_SUPPORT_5G + if (!WiFi.STA.started() && !WiFi.AP.started()) { + log_e("You need to start WiFi first"); + return false; + } + wifi_band_mode_t bm = WIFI_BAND_MODE_AUTO; + esp_err_t err = esp_wifi_get_band_mode(&bm); + if (err != ESP_OK) { + log_e("Failed to get Current Band Mode: 0x%x: %s", err, esp_err_to_name(err)); + return false; + } else if (bm == band_mode) { + log_d("No change in Band Mode"); + return true; + } else { + log_d("Switching Band Mode from %d to %d", bm, band_mode); + } +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_ERROR + if (WiFi.STA.connected() || WiFi.AP.connected()) { + log_e("Your network will get disconnected!"); + } +#endif + err = esp_wifi_set_band_mode(band_mode); + if (err != ESP_OK) { + log_e("Failed to set Band Mode: 0x%x: %s", err, esp_err_to_name(err)); + return false; + } + delay(100); + return true; +#else + if (band_mode == WIFI_BAND_MODE_5G_ONLY) { + log_e("This chip supports only 2.4GHz WiFi"); + } + return band_mode != WIFI_BAND_MODE_5G_ONLY; +#endif +} + +/** + * get the current enabled wifi band mode + * @return enum band mode + */ +wifi_band_mode_t WiFiGenericClass::getBandMode() { +#if SOC_WIFI_SUPPORT_5G + wifi_band_mode_t band_mode = WIFI_BAND_MODE_AUTO; + if (!WiFi.STA.started() && !WiFi.AP.started()) { + log_e("You need to start WiFi first"); + return band_mode; + } + esp_err_t err = esp_wifi_get_band_mode(&band_mode); + if (err != ESP_OK) { + log_e("Failed to get Band Mode: 0x%x: %s", err, esp_err_to_name(err)); + } + return band_mode; +#else + return WIFI_BAND_MODE_2G_ONLY; +#endif +} + +/** + * get the current active wifi band + * @return enum band + */ +wifi_band_t WiFiGenericClass::getBand() { +#if SOC_WIFI_SUPPORT_5G + wifi_band_t band = WIFI_BAND_2G; + if (!WiFi.STA.started() && !WiFi.AP.started()) { + log_e("You need to start WiFi first"); + return band; + } + esp_err_t err = esp_wifi_get_band(&band); + if (err != ESP_OK) { + log_e("Failed to get Band: 0x%x: %s", err, esp_err_to_name(err)); + } + return band; +#else + return WIFI_BAND_2G; +#endif +} + /** * control wifi tx power * @param power enum maximum wifi tx power diff --git a/libraries/WiFi/src/WiFiGeneric.h b/libraries/WiFi/src/WiFiGeneric.h index ed216229ed4..8497b4b4f3d 100644 --- a/libraries/WiFi/src/WiFiGeneric.h +++ b/libraries/WiFi/src/WiFiGeneric.h @@ -111,6 +111,10 @@ class WiFiGenericClass { bool setTxPower(wifi_power_t power); wifi_power_t getTxPower(); + bool setBandMode(wifi_band_mode_t band_mode); + wifi_band_mode_t getBandMode(); + wifi_band_t getBand(); + bool initiateFTM(uint8_t frm_count = 16, uint16_t burst_period = 2, uint8_t channel = 1, const uint8_t *mac = NULL); static bool setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, wifi_rx_ant_t rx_mode, wifi_tx_ant_t tx_mode); From 7fda434d8916a7d6ad6561332b09a3a1293a75cd Mon Sep 17 00:00:00 2001 From: TANAKA Masayuki Date: Fri, 21 Mar 2025 04:52:36 +0900 Subject: [PATCH 071/290] fix(rmt): Fixed protocol name in RMTReadXJT examples (#11136) * fix(rmt): Fixed protocol name in RMTReadXJT examples I couldn't find a protocol called D12. I found LR12 so I'll fix that. * feat(RMT): changing example commentary to reflect D16 protocol --------- Co-authored-by: Sugar Glider --- libraries/ESP32/examples/RMT/RMTReadXJT/RMTReadXJT.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/ESP32/examples/RMT/RMTReadXJT/RMTReadXJT.ino b/libraries/ESP32/examples/RMT/RMTReadXJT/RMTReadXJT.ino index d9e86ce8399..762225bcdf5 100644 --- a/libraries/ESP32/examples/RMT/RMTReadXJT/RMTReadXJT.ino +++ b/libraries/ESP32/examples/RMT/RMTReadXJT/RMTReadXJT.ino @@ -13,7 +13,7 @@ // limitations under the License. /** - * @brief This example demonstrates usage of RMT for receiving XJT D12 data + * @brief This example demonstrates usage of RMT for receiving XJT D16 data * * The output is the RMT data read and processed * @@ -21,7 +21,7 @@ // // Note: This example uses a FrSKY device communication -// using XJT D12 protocol +// using XJT D16 protocol // // ; 0 bit = 6us low/10us high // ; 1 bit = 14us low/10us high From 6c04a9315309b530120de98321f8d900c151a9b9 Mon Sep 17 00:00:00 2001 From: Math0XK <145477623+Math0XK@users.noreply.github.com> Date: Thu, 20 Mar 2025 21:11:11 +0100 Subject: [PATCH 072/290] Add a Default 32MB partition (#11143) * Add a Default 32MB partition This is a complementary addition to use 32MB boards in PlatformIO like the ESP32-S3-DevKitC-1-N32R8V. * Edited Board file Added partition "default_32MB" to the menu * Delete tools/boards.txt * Edited boards.txt Added the "default_32MB" partition to the menu * feat(boards): adds app13M_data7M_32MB to s3 octal * fix(board): format linux new line * fix(boards): trying to make it \n and not \r\n * add change to esp32s3-octal board too This reverts commit 3afddfc2ce5281d8cd0344bc91665665d4179040, reversing changes made to a9f64003bad5a2dcc1bd7f66e8494c9f8c8dd2e2. * fix(boards): setting eol as /n * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Sugar Glider Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- boards.txt | 6 ++++++ tools/partitions/default_32MB.csv | 7 +++++++ 2 files changed, 13 insertions(+) create mode 100644 tools/partitions/default_32MB.csv diff --git a/boards.txt b/boards.txt index 2afe45f50a6..88d5eacfffc 100644 --- a/boards.txt +++ b/boards.txt @@ -940,6 +940,9 @@ esp32s3.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 esp32s3.menu.PartitionScheme.app5M_little24M_32MB=32M Flash (4.8MB APP/22MB LittleFS) esp32s3.menu.PartitionScheme.app5M_little24M_32MB.build.partitions=large_littlefs_32MB esp32s3.menu.PartitionScheme.app5M_little24M_32MB.upload.maximum_size=4718592 +esp32s3.menu.PartitionScheme.app13M_data7M_32MB=32M Flash (13MB APP/6.75MB SPIFFS) +esp32s3.menu.PartitionScheme.app13M_data7M_32MB.build.partitions=default_32MB +esp32s3.menu.PartitionScheme.app13M_data7M_32MB.upload.maximum_size=13107200 esp32s3.menu.PartitionScheme.esp_sr_16=ESP SR 16M (3MB APP/7MB SPIFFS/2.9MB MODEL) esp32s3.menu.PartitionScheme.esp_sr_16.upload.maximum_size=3145728 esp32s3.menu.PartitionScheme.esp_sr_16.upload.extra_flags=0xD10000 {build.path}/srmodels.bin @@ -2148,6 +2151,9 @@ esp32s3-octal.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 esp32s3-octal.menu.PartitionScheme.app5M_little24M_32MB=32M Flash (4.8MB APP/22MB LittleFS) esp32s3-octal.menu.PartitionScheme.app5M_little24M_32MB.build.partitions=large_littlefs_32MB esp32s3-octal.menu.PartitionScheme.app5M_little24M_32MB.upload.maximum_size=4718592 +esp32s3-octal.menu.PartitionScheme.app13M_data7M_32MB=32M Flash (13MB APP/6.75MB SPIFFS) +esp32s3-octal.menu.PartitionScheme.app13M_data7M_32MB.build.partitions=default_32MB +esp32s3-octal.menu.PartitionScheme.app13M_data7M_32MB.upload.maximum_size=13107200 esp32s3-octal.menu.CPUFreq.240=240MHz (WiFi) esp32s3-octal.menu.CPUFreq.240.build.f_cpu=240000000L diff --git a/tools/partitions/default_32MB.csv b/tools/partitions/default_32MB.csv new file mode 100644 index 00000000000..dd07ac32185 --- /dev/null +++ b/tools/partitions/default_32MB.csv @@ -0,0 +1,7 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0xC80000, +app1, app, ota_1, 0xC90000,0xC80000, +spiffs, data, spiffs, 0x1910000,0x6C0000, +coredump, data, coredump,0x1FF0000,0x10000, From cc2632b3bb0f45b34fbefd196581b727a45e36c8 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 24 Mar 2025 09:51:25 -0300 Subject: [PATCH 073/290] fix(ext_lib): Fix ESPAsyncWebServer URL and examples (#11160) --- .github/workflows/lib.json | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/.github/workflows/lib.json b/.github/workflows/lib.json index 9b528e4cc43..5b93d6689ef 100644 --- a/.github/workflows/lib.json +++ b/.github/workflows/lib.json @@ -23,16 +23,44 @@ ] }, { - "source-url": "https://github.com/me-no-dev/ESPAsyncWebServer.git", + "source-url": "https://github.com/ESP32Async/ESPAsyncWebServer.git", "required-libs": [ - {"source-url": "https://github.com/me-no-dev/AsyncTCP.git"} + {"source-url": "https://github.com/ESP32Async/AsyncTCP.git"} ], "exclude_targets": [], "sketch_path": [ + "~/Arduino/libraries/ESPAsyncWebServer/examples/Auth/Auth.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/CORS/CORS.ino", "~/Arduino/libraries/ESPAsyncWebServer/examples/CaptivePortal/CaptivePortal.ino", - "~/Arduino/libraries/ESPAsyncWebServer/examples/ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino", - "~/Arduino/libraries/ESPAsyncWebServer/examples/regex_patterns/regex_patterns.ino", - "~/Arduino/libraries/ESPAsyncWebServer/examples/simple_server/simple_server.ino" + "~/Arduino/libraries/ESPAsyncWebServer/examples/CatchAllHandler/CatchAllHandler.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/ChunkResponse/ChunkResponse.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/ChunkRetryResponse/ChunkRetryResponse.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/EndBegin/EndBegin.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/Filters/Filters.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/FlashResponse/FlashResponse.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/HeaderManipulation/HeaderManipulation.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/Headers/Headers.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/Json/Json.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/Logging/Logging.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/MessagePack/MessagePack.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/Middleware/Middleware.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/Params/Params.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/PartitionDownloader/PartitionDownloader.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/PerfTests/PerfTests.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/RateLimit/RateLimit.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/Redirect/Redirect.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/RequestContinuation/RequestContinuation.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/RequestContinuationComplete/RequestContinuationComplete.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/ResumableDownload/ResumableDownload.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/Rewrite/Rewrite.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/ServerSentEvents/ServerSentEvents.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/ServerState/ServerState.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/SkipServerMiddleware/SkipServerMiddleware.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/SlowChunkResponse/SlowChunkResponse.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/StaticFile/StaticFile.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/Templates/Templates.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/Upload/Upload.ino", + "~/Arduino/libraries/ESPAsyncWebServer/examples/WebSocket/WebSocket.ino" ] }, { From 6273c4ffd821117a7804a146e2e19fc99f10590f Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Mon, 24 Mar 2025 09:59:42 -0300 Subject: [PATCH 074/290] fix(freertos_stats): remove volatile c++ 20 deprecated warning (#11158) --- cores/esp32/freertos_stats.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cores/esp32/freertos_stats.cpp b/cores/esp32/freertos_stats.cpp index 50a98bf502b..b37a5205e11 100644 --- a/cores/esp32/freertos_stats.cpp +++ b/cores/esp32/freertos_stats.cpp @@ -31,7 +31,8 @@ void printRunningTasks(Print &printer) { #endif configRUN_TIME_COUNTER_TYPE ulTotalRunTime = 0; TaskStatus_t *pxTaskStatusArray = NULL; - volatile UBaseType_t uxArraySize = 0, x = 0; + volatile UBaseType_t uxArraySize = 0; + uint32_t x = 0; const char *taskStates[] = {"Running", "Ready", "Blocked", "Suspended", "Deleted", "Invalid"}; // Take a snapshot of the number of tasks in case it changes while this function is executing. From cd7f4218e7fa0d2aa0c736284bf85436e178f361 Mon Sep 17 00:00:00 2001 From: Marcel <51757730+Marnek@users.noreply.github.com> Date: Mon, 24 Mar 2025 15:26:49 +0200 Subject: [PATCH 075/290] Fix(esp32s3usbotg) stdbool dependency in pins_arduino.h (#11155) * Fix(esp32s3usbotg) stdbool dependency in pins_arduino.h * fix(board): Remove comment in pins_arduino.h --------- Co-authored-by: Me No Dev --- variants/esp32s3usbotg/pins_arduino.h | 1 + 1 file changed, 1 insertion(+) diff --git a/variants/esp32s3usbotg/pins_arduino.h b/variants/esp32s3usbotg/pins_arduino.h index 004055cde49..5b873e2d2f1 100644 --- a/variants/esp32s3usbotg/pins_arduino.h +++ b/variants/esp32s3usbotg/pins_arduino.h @@ -2,6 +2,7 @@ #define Pins_Arduino_h #include +#include #define USB_VID 0x303a #define USB_PID 0x1001 From 9dddc142fc32bc028f4c18eec409e24d57607529 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 27 Mar 2025 12:29:11 +0200 Subject: [PATCH 076/290] fix(net): Use network_event_handle_t for internal callbacks (#11179) * fix(net): Use network_event_handle_t for internal callbacks * 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 | 9 +++++---- libraries/Ethernet/src/ETH.h | 1 + libraries/PPP/src/PPP.cpp | 8 +++++--- libraries/PPP/src/PPP.h | 1 + libraries/WiFi/src/AP.cpp | 7 ++++--- libraries/WiFi/src/STA.cpp | 8 +++++--- libraries/WiFi/src/WiFiAP.h | 2 ++ libraries/WiFi/src/WiFiSTA.h | 1 + 8 files changed, 24 insertions(+), 13 deletions(-) diff --git a/libraries/Ethernet/src/ETH.cpp b/libraries/Ethernet/src/ETH.cpp index 542a7e2a218..4c0b8cbbcfb 100644 --- a/libraries/Ethernet/src/ETH.cpp +++ b/libraries/Ethernet/src/ETH.cpp @@ -136,7 +136,7 @@ ETHClass::ETHClass(uint8_t eth_index) _pin_mcd(-1), _pin_mdio(-1), _pin_power(-1), _pin_rmii_clock(-1) #endif /* CONFIG_ETH_USE_ESP32_EMAC */ , - _task_stack_size(4096) { + _task_stack_size(4096), _eth_connected_event_handle(0) { } ETHClass::~ETHClass() {} @@ -359,7 +359,7 @@ bool ETHClass::begin(eth_phy_type_t type, int32_t phy_addr, int mdc, int mdio, i /* attach to receive events */ initNetif((Network_Interface_ID)(ESP_NETIF_ID_ETH + _eth_index)); - Network.onSysEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED); + _eth_connected_event_handle = Network.onSysEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED); ret = esp_eth_start(_eth_handle); if (ret != ESP_OK) { @@ -849,7 +849,7 @@ bool ETHClass::beginSPI( perimanSetPinBusExtraType(_pin_rst, "ETH_RST"); } - Network.onSysEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED); + _eth_connected_event_handle = Network.onSysEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED); return true; @@ -885,7 +885,8 @@ static bool empty_ethDetachBus(void *bus_pointer) { void ETHClass::end(void) { - Network.removeEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED); + Network.removeEvent(_eth_connected_event_handle); + _eth_connected_event_handle = 0; if (_eth_handle != NULL) { if (esp_eth_stop(_eth_handle) != ESP_OK) { diff --git a/libraries/Ethernet/src/ETH.h b/libraries/Ethernet/src/ETH.h index 891863e34bf..1995fc77a77 100644 --- a/libraries/Ethernet/src/ETH.h +++ b/libraries/Ethernet/src/ETH.h @@ -247,6 +247,7 @@ class ETHClass : public NetworkInterface { int8_t _pin_rmii_clock; #endif /* CONFIG_ETH_USE_ESP32_EMAC */ size_t _task_stack_size; + network_event_handle_t _eth_connected_event_handle; static bool ethDetachBus(void *bus_pointer); bool beginSPI( diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp index 77b70d3969c..87fee6920c3 100644 --- a/libraries/PPP/src/PPP.cpp +++ b/libraries/PPP/src/PPP.cpp @@ -152,7 +152,8 @@ esp_modem_dce_t *PPPClass::handle() const { PPPClass::PPPClass() : _dce(NULL), _pin_tx(-1), _pin_rx(-1), _pin_rts(-1), _pin_cts(-1), _flow_ctrl(ESP_MODEM_FLOW_CONTROL_NONE), _pin_rst(-1), _pin_rst_act_low(true), - _pin_rst_delay(200), _pin(NULL), _apn(NULL), _rx_buffer_size(4096), _tx_buffer_size(512), _mode(ESP_MODEM_MODE_COMMAND), _uart_num(UART_NUM_1) {} + _pin_rst_delay(200), _pin(NULL), _apn(NULL), _rx_buffer_size(4096), _tx_buffer_size(512), _mode(ESP_MODEM_MODE_COMMAND), _uart_num(UART_NUM_1), + _ppp_event_handle(0) {} PPPClass::~PPPClass() {} @@ -360,7 +361,7 @@ bool PPPClass::begin(ppp_modem_model_t model, uint8_t uart_num, int baud_rate) { } } - Network.onSysEvent(onPppArduinoEvent); + _ppp_event_handle = Network.onSysEvent(onPppArduinoEvent); setStatusBits(ESP_NETIF_STARTED_BIT); arduino_event_t arduino_event; @@ -402,7 +403,8 @@ void PPPClass::end(void) { } _esp_modem = NULL; - Network.removeEvent(onPppArduinoEvent); + Network.removeEvent(_ppp_event_handle); + _ppp_event_handle = 0; if (_dce != NULL) { esp_modem_destroy(_dce); diff --git a/libraries/PPP/src/PPP.h b/libraries/PPP/src/PPP.h index b8e1f7ad56f..b317f52aefc 100644 --- a/libraries/PPP/src/PPP.h +++ b/libraries/PPP/src/PPP.h @@ -108,6 +108,7 @@ class PPPClass : public NetworkInterface { int _tx_buffer_size; esp_modem_dce_mode_t _mode; uint8_t _uart_num; + network_event_handle_t _ppp_event_handle; static bool pppDetachBus(void *bus_pointer); }; diff --git a/libraries/WiFi/src/AP.cpp b/libraries/WiFi/src/AP.cpp index b713a6d3901..0e7839764ea 100644 --- a/libraries/WiFi/src/AP.cpp +++ b/libraries/WiFi/src/AP.cpp @@ -148,7 +148,7 @@ void APClass::_onApEvent(int32_t event_id, void *event_data) { } } -APClass::APClass() { +APClass::APClass() : _wifi_ap_event_handle(0) { _ap_network_if = this; } @@ -163,7 +163,7 @@ bool APClass::onEnable() { return false; } if (_esp_netif == NULL) { - Network.onSysEvent(_onApArduinoEvent); + _wifi_ap_event_handle = Network.onSysEvent(_onApArduinoEvent); _esp_netif = get_esp_interface_netif(ESP_IF_WIFI_AP); /* attach to receive events */ initNetif(ESP_NETIF_ID_AP); @@ -172,7 +172,8 @@ bool APClass::onEnable() { } bool APClass::onDisable() { - Network.removeEvent(_onApArduinoEvent); + Network.removeEvent(_wifi_ap_event_handle); + _wifi_ap_event_handle = 0; // we just set _esp_netif to NULL here, so destroyNetif() does not try to destroy it. // That would be done by WiFi.enableAP(false) if STA is not enabled, or when it gets disabled _esp_netif = NULL; diff --git a/libraries/WiFi/src/STA.cpp b/libraries/WiFi/src/STA.cpp index 547a27d1c47..84258589b28 100644 --- a/libraries/WiFi/src/STA.cpp +++ b/libraries/WiFi/src/STA.cpp @@ -228,7 +228,8 @@ void STAClass::_onStaEvent(int32_t event_id, void *event_data) { } STAClass::STAClass() - : _minSecurity(WIFI_AUTH_WPA2_PSK), _scanMethod(WIFI_FAST_SCAN), _sortMethod(WIFI_CONNECT_AP_BY_SIGNAL), _autoReconnect(true), _status(WL_STOPPED) { + : _minSecurity(WIFI_AUTH_WPA2_PSK), _scanMethod(WIFI_FAST_SCAN), _sortMethod(WIFI_CONNECT_AP_BY_SIGNAL), _autoReconnect(true), _status(WL_STOPPED), + _wifi_sta_event_handle(0) { _sta_network_if = this; } @@ -276,14 +277,15 @@ bool STAClass::onEnable() { return false; } /* attach to receive events */ - Network.onSysEvent(_onStaArduinoEvent); + _wifi_sta_event_handle = Network.onSysEvent(_onStaArduinoEvent); initNetif(ESP_NETIF_ID_STA); } return true; } bool STAClass::onDisable() { - Network.removeEvent(_onStaArduinoEvent); + Network.removeEvent(_wifi_sta_event_handle); + _wifi_sta_event_handle = 0; // we just set _esp_netif to NULL here, so destroyNetif() does not try to destroy it. // That would be done by WiFi.enableSTA(false) if AP is not enabled, or when it gets disabled _esp_netif = NULL; diff --git a/libraries/WiFi/src/WiFiAP.h b/libraries/WiFi/src/WiFiAP.h index e80f91fa26c..540ec87f44f 100644 --- a/libraries/WiFi/src/WiFiAP.h +++ b/libraries/WiFi/src/WiFiAP.h @@ -60,6 +60,8 @@ class APClass : public NetworkInterface { void _onApEvent(int32_t event_id, void *event_data); protected: + network_event_handle_t _wifi_ap_event_handle; + size_t printDriverInfo(Print &out) const; friend class WiFiGenericClass; diff --git a/libraries/WiFi/src/WiFiSTA.h b/libraries/WiFi/src/WiFiSTA.h index 3c8adbd8502..6063eae7968 100644 --- a/libraries/WiFi/src/WiFiSTA.h +++ b/libraries/WiFi/src/WiFiSTA.h @@ -95,6 +95,7 @@ class STAClass : public NetworkInterface { wifi_sort_method_t _sortMethod; bool _autoReconnect; wl_status_t _status; + network_event_handle_t _wifi_sta_event_handle; size_t printDriverInfo(Print &out) const; From df51bc3aa5e6939821629c9838f0116b8652ef5d Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 27 Mar 2025 12:29:31 +0200 Subject: [PATCH 077/290] fix(eth): Set the ETH properties at the correct time (#11182) * fix(eth): Set the ETH properties at the correct time * 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 | 79 ++++++++++++++++++++++++++++++++-- libraries/Ethernet/src/ETH.h | 7 +++ 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/libraries/Ethernet/src/ETH.cpp b/libraries/Ethernet/src/ETH.cpp index 4c0b8cbbcfb..3dfba37c684 100644 --- a/libraries/Ethernet/src/ETH.cpp +++ b/libraries/Ethernet/src/ETH.cpp @@ -124,7 +124,8 @@ void ETHClass::_onEthEvent(int32_t event_id, void *event_data) { } ETHClass::ETHClass(uint8_t eth_index) - : _eth_handle(NULL), _eth_index(eth_index), _phy_type(ETH_PHY_MAX), _glue_handle(NULL), _mac(NULL), _phy(NULL) + : _eth_handle(NULL), _eth_index(eth_index), _phy_type(ETH_PHY_MAX), _glue_handle(NULL), _mac(NULL), _phy(NULL), _eth_started(false), _link_speed(100), + _full_duplex(true), _auto_negotiation(true) #if ETH_SPI_SUPPORTS_CUSTOM , _spi(NULL) @@ -351,6 +352,19 @@ bool ETHClass::begin(eth_phy_type_t type, int32_t phy_addr, int mdc, int mdio, i return false; } + // auto negotiation needs to be disabled to change duplex mode and link speed + if (!_auto_negotiation) { + if (!_setAutoNegotiation(_auto_negotiation)) { + return false; + } + if (!_setFullDuplex(_full_duplex)) { + return false; + } + if (!_setLinkSpeed(_link_speed)) { + return false; + } + } + if (_eth_ev_instance == NULL && esp_event_handler_instance_register(ETH_EVENT, ESP_EVENT_ANY_ID, &_eth_event_cb, NULL, &_eth_ev_instance)) { log_e("event_handler_instance_register for ETH_EVENT Failed!"); return false; @@ -367,6 +381,8 @@ bool ETHClass::begin(eth_phy_type_t type, int32_t phy_addr, int mdc, int mdio, i return false; } + _eth_started = true; + if (!perimanSetPinBus(_pin_rmii_clock, ESP32_BUS_TYPE_ETHERNET_CLK, (void *)(this), -1, -1)) { goto err; } @@ -788,6 +804,19 @@ bool ETHClass::beginSPI( return false; } + // auto negotiation needs to be disabled to change duplex mode and link speed + if (!_auto_negotiation) { + if (!_setAutoNegotiation(_auto_negotiation)) { + return false; + } + if (!_setFullDuplex(_full_duplex)) { + return false; + } + if (!_setLinkSpeed(_link_speed)) { + return false; + } + } + if (_eth_ev_instance == NULL && esp_event_handler_instance_register(ETH_EVENT, ESP_EVENT_ANY_ID, &_eth_event_cb, NULL, &_eth_ev_instance)) { log_e("event_handler_instance_register for ETH_EVENT Failed!"); return false; @@ -803,6 +832,8 @@ bool ETHClass::beginSPI( return false; } + _eth_started = true; + // If Arduino's SPI is used, cs pin is in GPIO mode #if ETH_SPI_SUPPORTS_CUSTOM if (_spi == NULL) { @@ -897,6 +928,9 @@ void ETHClass::end(void) { while (getStatusBits() & ESP_NETIF_STARTED_BIT) { delay(10); } + + _eth_started = false; + //delete glue first if (_glue_handle != NULL) { if (esp_eth_del_netif_glue(_glue_handle) != ESP_OK) { @@ -1010,7 +1044,7 @@ bool ETHClass::fullDuplex() const { return (link_duplex == ETH_DUPLEX_FULL); } -bool ETHClass::setFullDuplex(bool on) { +bool ETHClass::_setFullDuplex(bool on) { if (_eth_handle == NULL) { return false; } @@ -1022,6 +1056,18 @@ bool ETHClass::setFullDuplex(bool on) { return err == ESP_OK; } +bool ETHClass::setFullDuplex(bool on) { + if (_eth_started) { + log_e("This method must be called before ETH.begin()"); + return false; + } + if (_auto_negotiation) { + log_w("Auto Negotiation MUST be OFF for this setting to be applied"); + } + _full_duplex = on; + return true; +} + bool ETHClass::autoNegotiation() const { if (_eth_handle == NULL) { return false; @@ -1031,7 +1077,7 @@ bool ETHClass::autoNegotiation() const { return auto_nego; } -bool ETHClass::setAutoNegotiation(bool on) { +bool ETHClass::_setAutoNegotiation(bool on) { if (_eth_handle == NULL) { return false; } @@ -1042,6 +1088,15 @@ bool ETHClass::setAutoNegotiation(bool on) { return err == ESP_OK; } +bool ETHClass::setAutoNegotiation(bool on) { + if (_eth_started) { + log_e("This method must be called before ETH.begin()"); + return false; + } + _auto_negotiation = on; + return true; +} + uint32_t ETHClass::phyAddr() const { if (_eth_handle == NULL) { return 0; @@ -1060,7 +1115,7 @@ uint16_t ETHClass::linkSpeed() const { return (link_speed == ETH_SPEED_10M) ? 10 : 100; } -bool ETHClass::setLinkSpeed(uint16_t speed) { +bool ETHClass::_setLinkSpeed(uint16_t speed) { if (_eth_handle == NULL) { return false; } @@ -1072,6 +1127,22 @@ bool ETHClass::setLinkSpeed(uint16_t speed) { return err == ESP_OK; } +bool ETHClass::setLinkSpeed(uint16_t speed) { + if (speed != 10 && speed != 100) { + log_e("Ethernet currently supports only 10 or 100 Mbps link speed"); + return false; + } + if (_eth_started) { + log_e("This method must be called before ETH.begin()"); + return false; + } + if (_auto_negotiation) { + log_w("Auto Negotiation MUST be OFF for this setting to be applied"); + } + _link_speed = speed; + return true; +} + // void ETHClass::getMac(uint8_t* mac) // { // if(_eth_handle != NULL && mac != NULL){ diff --git a/libraries/Ethernet/src/ETH.h b/libraries/Ethernet/src/ETH.h index 1995fc77a77..c52aac6ec6f 100644 --- a/libraries/Ethernet/src/ETH.h +++ b/libraries/Ethernet/src/ETH.h @@ -229,6 +229,10 @@ class ETHClass : public NetworkInterface { esp_eth_netif_glue_handle_t _glue_handle; esp_eth_mac_t *_mac; esp_eth_phy_t *_phy; + bool _eth_started; + uint16_t _link_speed; + bool _full_duplex; + bool _auto_negotiation; #if ETH_SPI_SUPPORTS_CUSTOM SPIClass *_spi; char _cs_str[10]; @@ -257,6 +261,9 @@ class ETHClass : public NetworkInterface { #endif int sck, int miso, int mosi, spi_host_device_t spi_host, uint8_t spi_freq_mhz ); + bool _setFullDuplex(bool on); + bool _setLinkSpeed(uint16_t speed); + bool _setAutoNegotiation(bool on); friend class EthernetClass; // to access beginSPI }; From 98611d46dc48dd75127819f416a444b9b661a81f Mon Sep 17 00:00:00 2001 From: ShuishengPeng <63339353+ackPeng@users.noreply.github.com> Date: Thu, 27 Mar 2025 18:29:57 +0800 Subject: [PATCH 078/290] fix: Add 16M flash option for xiao_esp32_s3_plus (#11183) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: xiao_esp32_s3_plus supports 16M flash, adds 16M flash and 16M partition table options * fix: remove empty lines --------- Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com> --- boards.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/boards.txt b/boards.txt index 88d5eacfffc..661d1f7a990 100644 --- a/boards.txt +++ b/boards.txt @@ -35264,6 +35264,8 @@ 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.FlashSize.16M=16MB (128Mb) +XIAO_ESP32S3_Plus.menu.FlashSize.16M.build.flash_size=16MB XIAO_ESP32S3_Plus.menu.LoopCore.1=Core 1 XIAO_ESP32S3_Plus.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 @@ -35302,6 +35304,12 @@ 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.fatflash=16M Flash (2MB APP/12.5MB FATFS) +XIAO_ESP32S3_Plus.menu.PartitionScheme.fatflash.build.partitions=ffat +XIAO_ESP32S3_Plus.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 +XIAO_ESP32S3_Plus.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS) +XIAO_ESP32S3_Plus.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB +XIAO_ESP32S3_Plus.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 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 From caa597143cd7b11204f9f038e36be1d61a853fdb Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Thu, 27 Mar 2025 07:31:31 -0300 Subject: [PATCH 079/290] ci(workflows): Lock actions to commits and improve readability (#11147) * Revert "ci(actions): Replace changed-files (#11130)" This reverts commit ba2ab1e4bb59fe9601e8dd9c0ebbc544dfeca242. * ci(workflows): Lock actions to commits and improve readability --- .github/scripts/set_push_chunks.sh | 93 +--------------------- .github/workflows/allboards.yml | 10 +-- .github/workflows/boards.yml | 10 +-- .github/workflows/build_py_tools.yml | 33 +++++--- .github/workflows/dangerjs.yml | 4 +- .github/workflows/docs_build.yml | 9 ++- .github/workflows/docs_deploy.yml | 7 +- .github/workflows/gh-pages.yml | 4 +- .github/workflows/lib.yml | 15 ++-- .github/workflows/pre-commit-status.yml | 4 +- .github/workflows/pre-commit.yml | 27 ++----- .github/workflows/publishlib.yml | 4 +- .github/workflows/publishsizes-2.x.yml | 6 +- .github/workflows/publishsizes.yml | 8 +- .github/workflows/push.yml | 80 +++++++++++++++---- .github/workflows/release.yml | 16 +++- .github/workflows/tests.yml | 6 +- .github/workflows/tests_build.yml | 10 +-- .github/workflows/tests_hw.yml | 12 +-- .github/workflows/tests_qemu.yml | 18 ++--- .github/workflows/tests_results.yml | 14 ++-- .github/workflows/tests_wokwi.yml | 32 ++++---- .github/workflows/upload-idf-component.yml | 4 +- 23 files changed, 199 insertions(+), 227 deletions(-) diff --git a/.github/scripts/set_push_chunks.sh b/.github/scripts/set_push_chunks.sh index 21ae83ddacd..ff0af7da6e8 100644 --- a/.github/scripts/set_push_chunks.sh +++ b/.github/scripts/set_push_chunks.sh @@ -2,93 +2,6 @@ build_all=false chunks_count=0 -last_check_files="" -last_check_result="" -gh_output="" - -# Define the file patterns -core_files=( - '\.github/.*' - 'cores/.*' - 'package/.*' - 'tools/.*' - 'platform\.txt' - 'programmers\.txt' - 'variants/esp32/.*' - 'variants/esp32c3/.*' - 'variants/esp32c6/.*' - 'variants/esp32h2/.*' - 'variants/esp32p4/.*' - 'variants/esp32s2/.*' - 'variants/esp32s3/.*' -) -library_files=( - 'libraries/.*/examples/.*' - 'libraries/.*/src/.*' -) -networking_files=( - 'libraries/Network/src/.*' -) -fs_files=( - 'libraries/FS/src/.*' -) -static_sketches_files=( - 'libraries/NetworkClientSecure/examples/WiFiClientSecure/WiFiClientSecure\.ino' - 'libraries/BLE/examples/Server/Server\.ino' - 'libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer\.ino' - 'libraries/Insights/examples/MinimalDiagnostics/MinimalDiagnostics\.ino' - 'libraries/NetworkClientSecure/src/.*' - 'libraries/BLE/src/.*' - 'libraries/Insights/src/.*' -) -idf_files=( - 'idf_component\.yml' - 'Kconfig\.projbuild' - 'CMakeLists\.txt' - 'variants/esp32c2/.*' -) - -# Function to check if any files match the patterns -check_files() { - local patterns=("$@") - local files_found="" - for pattern in "${patterns[@]}"; do - echo "Checking pattern: $pattern" - matched_files=$(echo "$gh_output" | grep -E "$pattern") - echo "matched_files: $matched_files" - files_found+="$matched_files " - done - - last_check_files=$(echo "$files_found" | xargs) - if [[ -n $last_check_files ]]; then - last_check_result="true" - else - last_check_result="false" - fi - echo "last_check_result: $last_check_result" -} - -if [[ $IS_PR != 'true' ]]; then - gh_output=$(gh api repos/espressif/arduino-esp32/commits/"$GITHUB_SHA" --jq '.files[].filename') -else - gh_output=$(gh pr diff "$PR_NUM" --name-only) -fi -echo "gh_output: $gh_output" - -# Output the results -check_files "${core_files[@]}" -CORE_CHANGED=$last_check_result -check_files "${library_files[@]}" -LIB_CHANGED=$last_check_result -LIB_FILES=$last_check_files -check_files "${networking_files[@]}" -NETWORKING_CHANGED=$last_check_result -check_files "${fs_files[@]}" -FS_CHANGED=$last_check_result -check_files "${static_sketches_files[@]}" -STATIC_SKETCHES_CHANGED=$last_check_result -check_files "${idf_files[@]}" -IDF_CHANGED=$last_check_result if [[ $CORE_CHANGED == 'true' ]] || [[ $IS_PR != 'true' ]]; then echo "Core files changed or not a PR. Building all." @@ -163,9 +76,9 @@ chunks+="]" { echo "build_all=$build_all" - echo "build_libraries=$LIB_CHANGED" - echo "build_static_sketches=$STATIC_SKETCHES_CHANGED" - echo "build_idf=$IDF_CHANGED" + echo "build_libraries=$BUILD_LIBRARIES" + echo "build_static_sketches=$BUILD_STATIC_SKETCHES" + echo "build_idf=$BUILD_IDF" echo "chunk_count=$chunks_count" echo "chunks=$chunks" } >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/allboards.yml b/.github/workflows/allboards.yml index 8c4dadcd03e..6910ad05d3f 100644 --- a/.github/workflows/allboards.yml +++ b/.github/workflows/allboards.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ github.event.client_payload.branch }} @@ -32,13 +32,13 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ github.event.client_payload.branch }} - run: npm install - name: Setup jq - uses: dcarbone/install-jq-action@v1.0.1 + uses: dcarbone/install-jq-action@e397bd87438d72198f81efd21f876461183d383a # v3.0.1 - id: set-test-chunks name: Set Chunks @@ -64,7 +64,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ github.event.client_payload.branch }} @@ -74,7 +74,7 @@ jobs: FQBN: ${{ toJSON(matrix.chunk) }} - name: Compile sketch - uses: P-R-O-C-H-Y/compile-sketches@main + uses: P-R-O-C-H-Y/compile-sketches@a62f069b92dc8f5053da4ac439ea6d1950cf6379 # main with: platforms: | ${{ env.REPOSITORY }} diff --git a/.github/workflows/boards.yml b/.github/workflows/boards.yml index a51c794cfb4..287e97219c4 100644 --- a/.github/workflows/boards.yml +++ b/.github/workflows/boards.yml @@ -22,10 +22,10 @@ jobs: steps: # This step makes the contents of the repository available to the workflow - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup jq - uses: dcarbone/install-jq-action@v1.0.1 + uses: dcarbone/install-jq-action@e397bd87438d72198f81efd21f876461183d383a # v3.0.1 - name: Get board name run: bash .github/scripts/find_new_boards.sh ${{ github.repository }} ${{github.base_ref}} @@ -47,7 +47,7 @@ jobs: steps: # This step makes the contents of the repository available to the workflow - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Check if build.board is uppercase run: | @@ -60,7 +60,7 @@ jobs: fi - name: Get libs cache - uses: actions/cache@v4 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }} path: | @@ -73,7 +73,7 @@ jobs: ./tools/xtensa-* - name: Compile sketch - uses: P-R-O-C-H-Y/compile-sketches@main + uses: P-R-O-C-H-Y/compile-sketches@a62f069b92dc8f5053da4ac439ea6d1950cf6379 # main with: platforms: | ${{ env.REPOSITORY }} diff --git a/.github/workflows/build_py_tools.yml b/.github/workflows/build_py_tools.yml index ca13da03136..bbb36589c84 100644 --- a/.github/workflows/build_py_tools.yml +++ b/.github/workflows/build_py_tools.yml @@ -18,7 +18,7 @@ jobs: all_changed_files: ${{ steps.verify-changed-files.outputs.all_changed_files }} steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 2 ref: ${{ github.event.pull_request.head.ref }} @@ -30,15 +30,16 @@ jobs: echo "Make sure you are using a branch inside the repository and not a fork." - name: Verify Python Tools Changed + uses: tj-actions/changed-files@2f7c5bfce28377bc069a65ba478de0a74aa0ca32 # v46.0.1 id: verify-changed-files - run: | - CHANGED_FILES=$(git diff-tree --no-commit-id --name-only -r ^HEAD -- tools/get.py tools/espota.py tools/gen_esp32part.py tools/gen_insights_package.py | xargs) - echo "all_changed_files=$CHANGED_FILES" >> $GITHUB_OUTPUT - if [ -n "$CHANGED_FILES" ]; then - echo "any_changed=true" >> $GITHUB_OUTPUT - else - echo "any_changed=false" >> $GITHUB_OUTPUT - fi + with: + fetch_depth: "2" + since_last_remote_commit: "true" + files: | + tools/get.py + tools/espota.py + tools/gen_esp32part.py + tools/gen_insights_package.py - name: List all changed files shell: bash @@ -88,25 +89,30 @@ jobs: for tool in ${{ env.CHANGED_TOOLS }}; do echo "tool $tool was changed" done + - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: token: ${{ secrets.TOOLS_UPLOAD_PAT }} ref: ${{ github.event.pull_request.head.ref }} + - name: Set up Python 3.8 - uses: actions/setup-python@master + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4 with: python-version: 3.8 + - name: Install dependencies run: | python -m pip install --upgrade pip pip install pyinstaller requests + - name: Build with PyInstaller shell: bash run: | for tool in ${{ env.CHANGED_TOOLS }}; do pyinstaller --distpath ./${{ env.DISTPATH }} -F --icon=.github/pytools/espressif.ico tools/$tool.py done + - name: Sign binaries if: matrix.os == 'windows-latest' env: @@ -119,12 +125,14 @@ jobs: { ./.github/pytools/Sign-File.ps1 -Path ./${{ env.DISTPATH }}/$node.exe } + - name: Test binaries shell: bash run: | for tool in ${{ env.CHANGED_TOOLS }}; do ./${{ env.DISTPATH }}/$tool${{ matrix.EXTEN }} -h done + - name: Push binary to tools if: matrix.os == 'windows-latest' env: @@ -135,8 +143,9 @@ jobs: cp -f ./${{ env.DISTPATH }}/$tool.exe tools/$tool.exe done bash .github/scripts/upload_py_tools.sh "${{ env.CHANGED_TOOLS }}" + - name: Archive artifact - uses: actions/upload-artifact@master + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ${{ env.DISTPATH }} path: ${{ env.DISTPATH }} diff --git a/.github/workflows/dangerjs.yml b/.github/workflows/dangerjs.yml index 8fa7b737317..13bc907566b 100644 --- a/.github/workflows/dangerjs.yml +++ b/.github/workflows/dangerjs.yml @@ -12,12 +12,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out PR head - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ github.event.pull_request.head.sha }} - name: DangerJS pull request linter - uses: espressif/shared-github-dangerjs@v1 + uses: espressif/shared-github-dangerjs@fb17367fd3e8ff7412603b8e946d9b19ffdb2d7f # v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/docs_build.yml b/.github/workflows/docs_build.yml index d2f12e1f7b5..d9b9f160228 100644 --- a/.github/workflows/docs_build.yml +++ b/.github/workflows/docs_build.yml @@ -21,14 +21,16 @@ jobs: run: shell: bash steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: submodules: true - - uses: actions/setup-python@v5 + + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4 with: cache-dependency-path: docs/requirements.txt cache: "pip" python-version: "3.10" + - name: Build run: | sudo apt update @@ -38,8 +40,9 @@ jobs: 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 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: docs path: docs diff --git a/.github/workflows/docs_deploy.yml b/.github/workflows/docs_deploy.yml index b558fd21aa5..9f45e35aef8 100644 --- a/.github/workflows/docs_deploy.yml +++ b/.github/workflows/docs_deploy.yml @@ -26,14 +26,17 @@ jobs: run: | echo "Release workflow failed. Exiting..." exit 1 - - uses: actions/checkout@v4 + + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: submodules: true - - uses: actions/setup-python@v5 + + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4 with: cache-dependency-path: docs/requirements.txt cache: "pip" python-version: "3.10" + - name: Deploy Documentation env: # Deploy to production server diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 47480e8239a..60795229eff 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -15,7 +15,9 @@ jobs: name: Build GitHub Pages runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Copy Files env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/lib.yml b/.github/workflows/lib.yml index 1197308c921..0cb50842e5d 100644 --- a/.github/workflows/lib.yml +++ b/.github/workflows/lib.yml @@ -62,10 +62,10 @@ jobs: steps: # This step makes the contents of the repository available to the workflow - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Compile sketch - uses: P-R-O-C-H-Y/compile-sketches@main + uses: P-R-O-C-H-Y/compile-sketches@a62f069b92dc8f5053da4ac439ea6d1950cf6379 # main with: platforms: | ${{ env.REPOSITORY }} @@ -80,7 +80,7 @@ jobs: - --warnings="all" - name: Upload artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ${{ env.SKETCHES_REPORTS_ARTIFACT_NAME }}-${{ matrix.target }} path: ${{ env.SKETCHES_REPORTS_PATH }} @@ -92,7 +92,7 @@ jobs: steps: # Check out repository - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: token: ${{ env.GITHUB_TOKEN }} fetch-depth: "0" @@ -102,14 +102,14 @@ jobs: # This step is needed to get the size data produced by the compile jobs - name: Download sketches reports artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 with: pattern: ${{ env.SKETCHES_REPORTS_ARTIFACT_NAME }}-* merge-multiple: true path: ${{ env.SKETCHES_REPORTS_PATH }} - name: Report results - uses: P-R-O-C-H-Y/report-size-deltas@main + uses: P-R-O-C-H-Y/report-size-deltas@4a79caa6dcc3579024293638b97156106edc588e # main with: sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }} destination-file: ${{ env.RESULT_LIBRARY_TEST_FILE }} @@ -136,8 +136,9 @@ jobs: env: PR_NUM: ${{ github.event.number }} run: echo $PR_NUM > pr_num.txt + - name: Upload PR number - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: pr_number path: ./pr_num.txt diff --git a/.github/workflows/pre-commit-status.yml b/.github/workflows/pre-commit-status.yml index d0060668476..c7be9f8d352 100644 --- a/.github/workflows/pre-commit-status.yml +++ b/.github/workflows/pre-commit-status.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Report success - uses: actions/github-script@v7 + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const owner = '${{ github.repository_owner }}'; @@ -43,7 +43,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Report pending - uses: actions/github-script@v7 + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const owner = '${{ github.repository_owner }}'; diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 6290b9ea908..a3b858dd0fb 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout latest commit - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 2 @@ -34,7 +34,7 @@ jobs: GH_TOKEN: ${{ github.token }} - name: Set up Python 3 - uses: actions/setup-python@v5 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4 with: cache-dependency-path: tools/pre-commit/requirements.txt cache: "pip" @@ -46,7 +46,7 @@ jobs: echo "PY_HASH=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV - name: Restore pre-commit cache - uses: actions/cache/restore@v4 + uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 id: restore-cache with: path: | @@ -58,28 +58,13 @@ jobs: - name: Get changed files id: changed-files - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_NUM: ${{ github.event.pull_request.number }} - IS_PR: ${{ github.event_name == 'pull_request' }} - GITHUB_SHA: ${{ github.sha }} - run: | - if [[ $IS_PR != 'true' ]]; then - files_changed=$(gh api repos/espressif/arduino-esp32/commits/"$GITHUB_SHA" --jq '.files[].filename' | xargs) - else - files_changed=$(gh pr diff "$PR_NUM" --name-only | xargs) - fi - echo "all_changed_files=$files_changed" >> $GITHUB_OUTPUT - echo "Changed files:" - for file in $files_changed; do - echo " $file" - done + uses: tj-actions/changed-files@2f7c5bfce28377bc069a65ba478de0a74aa0ca32 # v46.0.1 - name: Run pre-commit hooks in changed files run: pre-commit run --color=always --show-diff-on-failure --files ${{ steps.changed-files.outputs.all_changed_files }} - name: Save pre-commit cache - uses: actions/cache/save@v4 + uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 if: ${{ always() && steps.restore-cache.outputs.cache-hit != 'true' }} continue-on-error: true with: @@ -88,7 +73,7 @@ jobs: key: ${{ steps.restore-cache.outputs.cache-primary-key }} - name: Push changes using pre-commit-ci-lite - uses: pre-commit-ci/lite-action@v1.1.0 + uses: pre-commit-ci/lite-action@5d6cc0eb514c891a40562a58a8e71576c5c7fb43 # v1.1.0 # Only push changes in PRs if: ${{ always() && github.event_name == 'pull_request' }} with: diff --git a/.github/workflows/publishlib.yml b/.github/workflows/publishlib.yml index 62393b80915..0e1c3f64afd 100644 --- a/.github/workflows/publishlib.yml +++ b/.github/workflows/publishlib.yml @@ -44,12 +44,12 @@ jobs: - name: Read the pr_num file id: pr_num_reader - uses: juliangruber/read-file-action@v1 + uses: juliangruber/read-file-action@b549046febe0fe86f8cb4f93c24e284433f9ab58 # v1.1.7 with: path: ./artifacts/workflows/pr_num.txt - name: Report results - uses: P-R-O-C-H-Y/report-size-deltas@libs + uses: P-R-O-C-H-Y/report-size-deltas@256d1f13e4195cd7fd436d2f959e6dc4d5e4b406 # libs with: sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }} github-token: ${{ env.GITHUB_TOKEN }} diff --git a/.github/workflows/publishsizes-2.x.yml b/.github/workflows/publishsizes-2.x.yml index ffbd751838c..738e215bc3f 100644 --- a/.github/workflows/publishsizes-2.x.yml +++ b/.github/workflows/publishsizes-2.x.yml @@ -14,8 +14,8 @@ jobs: 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 + - name: Checkout gh-pages branch + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: gh-pages @@ -34,7 +34,7 @@ jobs: mv v2.x_cli_compile/*.json artifacts/sizes-report/master/ - name: Report results - uses: P-R-O-C-H-Y/report-size-deltas@sizes_v2 + uses: P-R-O-C-H-Y/report-size-deltas@2043188c68f483a7b50527c4eacf609d05bb67a5 # sizes_v2 with: sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }} github-token: ${{ env.GITHUB_TOKEN }} diff --git a/.github/workflows/publishsizes.yml b/.github/workflows/publishsizes.yml index 6c6d75eccce..69c18cf1835 100644 --- a/.github/workflows/publishsizes.yml +++ b/.github/workflows/publishsizes.yml @@ -21,8 +21,8 @@ jobs: github.event.workflow_run.conclusion == 'success' steps: - - name: Checkout code - uses: actions/checkout@v4 # This step checks out the repository's code at gh-pages branch + - name: Checkout gh-pages branch + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: gh-pages @@ -60,12 +60,12 @@ jobs: - name: Read the pr_num file id: pr_num_reader - uses: juliangruber/read-file-action@v1 + uses: juliangruber/read-file-action@b549046febe0fe86f8cb4f93c24e284433f9ab58 # v1.1.7 with: path: ./artifacts/sizes-report/pr_num.txt - name: Report results - uses: P-R-O-C-H-Y/report-size-deltas@sizes_v2 + uses: P-R-O-C-H-Y/report-size-deltas@2043188c68f483a7b50527c4eacf609d05bb67a5 # sizes_v2 with: sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }} github-token: ${{ env.GITHUB_TOKEN }} diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index feb32f95d03..d98da24fc07 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -66,7 +66,7 @@ jobs: runs-on: ubuntu-latest if: ${{ !(github.event_name == 'pull_request' && startsWith(github.head_ref, 'release/')) }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - run: bash ./.github/scripts/check-cmakelists.sh gen-chunks: @@ -82,23 +82,69 @@ jobs: chunks: ${{ steps.set-chunks.outputs.chunks }} steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 2 + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@2f7c5bfce28377bc069a65ba478de0a74aa0ca32 # v46.0.1 + with: + files_yaml: | + core: + - '.github/**' + - 'cores/**' + - 'package/**' + - 'tools/**' + - 'platform.txt' + - 'programmers.txt' + - "variants/esp32/**/*" + - "variants/esp32c3/**/*" + - "variants/esp32c6/**/*" + - "variants/esp32h2/**/*" + - "variants/esp32p4/**/*" + - "variants/esp32s2/**/*" + - "variants/esp32s3/**/*" + libraries: + - 'libraries/**/examples/**' + - 'libraries/**/src/**' + networking: + - 'libraries/Network/src/**' + fs: + - 'libraries/FS/src/**' + static_sketeches: + - 'libraries/NetworkClientSecure/examples/WiFiClientSecure/WiFiClientSecure.ino' + - 'libraries/BLE/examples/Server/Server.ino' + - 'libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino' + - 'libraries/Insights/examples/MinimalDiagnostics/MinimalDiagnostics.ino' + - 'libraries/NetworkClientSecure/src/**' + - 'libraries/BLE/src/**' + - 'libraries/Insights/src/**' + idf: + - 'idf_component.yml' + - 'Kconfig.projbuild' + - 'CMakeLists.txt' + - "variants/esp32c2/**/*" + - name: Set chunks id: set-chunks env: + LIB_FILES: ${{ steps.changed-files.outputs.libraries_all_changed_files }} IS_PR: ${{ github.event_name == 'pull_request' }} - PR_NUM: ${{ github.event.pull_request.number }} MAX_CHUNKS: ${{ env.MAX_CHUNKS }} - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + 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 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: sketches_found path: sketches_found.txt @@ -117,13 +163,13 @@ jobs: chunk: ${{ fromJson(needs.gen-chunks.outputs.chunks) }} steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4 with: python-version: "3.x" - name: Get libs cache - uses: actions/cache@v4 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }} path: | @@ -151,7 +197,7 @@ jobs: - name: Download sketches found if: ${{ needs.gen-chunks.outputs.build_all == 'false' && needs.gen-chunks.outputs.build_libraries == 'true' }} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 with: name: sketches_found @@ -161,7 +207,7 @@ jobs: #Upload cli compile json as artifact - name: Upload cli compile json - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: pr_cli_compile_${{ matrix.chunk }} path: cli_compile_${{ matrix.chunk }}.json @@ -179,8 +225,8 @@ jobs: os: [windows-latest, macOS-latest] steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4 with: python-version: "3.x" - name: Build Sketches @@ -216,10 +262,11 @@ jobs: container: espressif/idf:${{ matrix.idf_ver }} steps: - name: Check out arduino-esp32 as a component - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: submodules: recursive path: components/arduino-esp32 + - name: Build env: IDF_TARGET: ${{ matrix.idf_target }} @@ -239,7 +286,7 @@ jobs: steps: # Check out repository - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: token: ${{secrets.GITHUB_TOKEN}} fetch-depth: "0" @@ -248,7 +295,7 @@ jobs: run: git checkout remotes/origin/gh-pages - name: Download sketches reports artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 with: pattern: pr_cli_compile_* merge-multiple: true @@ -278,8 +325,9 @@ jobs: env: PR_NUM: ${{ github.event.number }} run: echo $PR_NUM > pr_num.txt + - name: Upload PR number - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: pr_number path: ./pr_num.txt diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 53a512dd54f..7b23c80c49a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,14 +10,22 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 - - uses: actions/setup-python@v5 + + - name: Set up Python + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4 with: python-version: "3.x" - - run: pip install packaging - - run: pip install pyserial + + - name: Install packaging + run: pip install packaging + + - name: Install pyserial + run: pip install pyserial + - name: Build Release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0db3b98782b..ddc9b64aace 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -43,7 +43,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Upload - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: event_file path: ${{ github.event_path }} @@ -62,7 +62,7 @@ jobs: PERFORMANCE_ENABLED: ${{ contains(github.event.pull_request.labels.*.name, 'perf_test') }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: sparse-checkout: .github/scripts/tests_matrix.sh @@ -71,7 +71,7 @@ jobs: run: bash .github/scripts/tests_matrix.sh - name: Upload - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: matrix_info path: info/* diff --git a/.github/workflows/tests_build.yml b/.github/workflows/tests_build.yml index 7a10c95ed22..ac1f40644ed 100644 --- a/.github/workflows/tests_build.yml +++ b/.github/workflows/tests_build.yml @@ -22,7 +22,7 @@ jobs: - name: Check if already built id: cache-build-binaries if: github.event.pull_request.number != null - uses: actions/cache/restore@v4 + uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: key: tests-${{ env.id }}-bin path: | @@ -46,10 +46,10 @@ jobs: - name: Checkout user repository if: ${{ steps.check-build.outputs.enabled == 'true' }} - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Get libs cache - uses: actions/cache@v4 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 if: ${{ steps.check-build.outputs.enabled == 'true' }} with: key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }} @@ -68,7 +68,7 @@ jobs: bash .github/scripts/tests_build.sh -c -type ${{ inputs.type }} -t ${{ inputs.chip }} - name: Upload ${{ inputs.chip }} ${{ inputs.type }} binaries as cache - uses: actions/cache/save@v4 + uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 if: steps.check-build.outputs.enabled == 'true' && github.event.pull_request.number != null with: key: tests-${{ env.id }}-bin @@ -79,7 +79,7 @@ jobs: ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/sdkconfig - name: Upload ${{ inputs.chip }} ${{ inputs.type }} binaries as artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: tests-bin-${{ inputs.chip }}-${{ inputs.type }} overwrite: true diff --git a/.github/workflows/tests_hw.yml b/.github/workflows/tests_hw.yml index 6c15ba79a7f..6f5fc67f7b9 100644 --- a/.github/workflows/tests_hw.yml +++ b/.github/workflows/tests_hw.yml @@ -37,7 +37,7 @@ jobs: - name: Check if already passed id: cache-results if: github.event.pull_request.number != null - uses: actions/cache/restore@v4 + uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: key: tests-${{ env.id }}-results-hw path: | @@ -59,13 +59,13 @@ jobs: - name: Checkout user repository if: ${{ steps.check-tests.outputs.enabled == 'true' }} - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: sparse-checkout: | * # setup-python currently only works on ubuntu images - # - uses: actions/setup-python@v5 + # - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4 # if: ${{ steps.check-tests.outputs.enabled == 'true' }} # with: # cache-dependency-path: tests/requirements.txt @@ -82,7 +82,7 @@ jobs: - name: Get binaries if: ${{ steps.check-tests.outputs.enabled == 'true' }} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 with: name: tests-bin-${{ inputs.chip }}-${{ inputs.type }} path: | @@ -99,7 +99,7 @@ jobs: bash .github/scripts/tests_run.sh -c -type ${{ inputs.type }} -t ${{ inputs.chip }} -i 0 -m 1 -e - name: Upload ${{ inputs.chip }} ${{ inputs.type }} hardware results as cache - uses: actions/cache/save@v4 + uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 if: steps.check-tests.outputs.enabled == 'true' && github.event.pull_request.number != null with: key: tests-${{ env.id }}-results-hw @@ -108,7 +108,7 @@ jobs: tests/**/result_*.json - name: Upload ${{ inputs.chip }} ${{ inputs.type }} hardware results as artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: always() with: name: tests-results-hw-${{ inputs.chip }}-${{ inputs.type }} diff --git a/.github/workflows/tests_qemu.yml b/.github/workflows/tests_qemu.yml index 6c5934ce69a..fa3f874cbbb 100644 --- a/.github/workflows/tests_qemu.yml +++ b/.github/workflows/tests_qemu.yml @@ -21,7 +21,7 @@ jobs: - name: Check if already passed id: get-cache-results if: github.event.pull_request.number != null - uses: actions/cache/restore@v4 + uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: key: tests-${{ env.id }}-results-qemu path: | @@ -43,7 +43,7 @@ jobs: - name: Checkout user repository if: ${{ steps.check-tests.outputs.enabled == 'true' }} - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ github.event.pull_request.head.sha || github.sha }} persist-credentials: false @@ -60,7 +60,7 @@ jobs: cd .github curl https://codeload.github.com/${{ github.repository }}/tar.gz/master | tar -xz --strip=2 arduino-esp32-master/.github - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4 if: ${{ steps.check-tests.outputs.enabled == 'true' }} with: cache-dependency-path: tests/requirements.txt @@ -74,14 +74,14 @@ jobs: pip install -r tests/requirements.txt --extra-index-url https://dl.espressif.com/pypi - name: Install APT dependencies - uses: awalsh128/cache-apt-pkgs-action@v1.4.2 + uses: awalsh128/cache-apt-pkgs-action@5902b33ae29014e6ca012c5d8025d4346556bd40 # v1.4.3 if: ${{ steps.check-tests.outputs.enabled == 'true' }} with: packages: libpixman-1-0 libnuma1 libglib2.0-0 libslirp0 libsdl2-2.0-0 version: 1.0 - name: Get QEMU version - uses: pozetroninc/github-action-get-latest-release@v0.7.0 + uses: pozetroninc/github-action-get-latest-release@2a61c339ea7ef0a336d1daa35ef0cb1418e7676c # v0.8.0 if: ${{ steps.check-tests.outputs.enabled == 'true' }} id: get-qemu-version with: @@ -92,7 +92,7 @@ jobs: - name: Cache QEMU id: cache-qemu - uses: actions/cache@v4 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 if: ${{ steps.check-tests.outputs.enabled == 'true' }} with: path: | @@ -113,7 +113,7 @@ jobs: - name: Get binaries if: ${{ steps.check-tests.outputs.enabled == 'true' }} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 with: name: tests-bin-${{ inputs.chip }}-${{ inputs.type }} path: | @@ -124,7 +124,7 @@ jobs: run: QEMU_PATH="${{ env.QEMU_INSTALL_PATH }}" bash .github/scripts/tests_run.sh -c -type ${{inputs.type}} -t ${{inputs.chip}} -i 0 -m 1 -Q - name: Upload ${{ inputs.chip }} ${{ inputs.type }} QEMU results as cache - uses: actions/cache/save@v4 + uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 if: steps.check-tests.outputs.enabled == 'true' && github.event.pull_request.number != null with: key: tests-${{ env.id }}-results-qemu @@ -133,7 +133,7 @@ jobs: tests/**/result_*.json - name: Upload ${{ inputs.chip }} ${{ inputs.type }} QEMU results as artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: always() with: name: tests-results-qemu-${{ inputs.chip }}-${{ inputs.type }} diff --git a/.github/workflows/tests_results.yml b/.github/workflows/tests_results.yml index 9e213fad14e..ebba2a3aa08 100644 --- a/.github/workflows/tests_results.yml +++ b/.github/workflows/tests_results.yml @@ -24,12 +24,12 @@ jobs: pull-requests: write contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: gh-pages - name: Download and Extract Artifacts - uses: dawidd6/action-download-artifact@v6 + uses: dawidd6/action-download-artifact@07ab29fd4a977ae4d2b275087cf67563dfdf0295 # v9 with: run_id: ${{ github.event.workflow_run.id }} path: ./artifacts @@ -83,7 +83,7 @@ jobs: echo "Wokwi tests: https://github.com/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }}" - name: Publish Unit Test Results - uses: EnricoMi/publish-unit-test-result-action@v2 + uses: EnricoMi/publish-unit-test-result-action@170bf24d20d201b842d7a52403b73ed297e6645b # v2.18.0 with: commit: ${{ env.original_sha }} event_file: ./artifacts/parent-artifacts/event_file/event.json @@ -95,7 +95,7 @@ jobs: json_suite_details: true - name: Upload JSON - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: ${{ always() }} with: name: unity_results @@ -109,7 +109,7 @@ jobs: - name: Clean up caches if: always() - uses: actions/github-script@v7 + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const ref = process.env.original_ref; @@ -139,7 +139,7 @@ jobs: }); - name: Report conclusion - uses: actions/github-script@v7 + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 if: always() with: script: | @@ -175,7 +175,7 @@ jobs: - name: Generate badge if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled - uses: jaywcjlove/generated-badges@v1.0.13 + uses: jaywcjlove/generated-badges@0e078ae4d4bab3777ea4f137de496ab44688f5ad # v1.0.13 with: label: Runtime Tests status: ${{ job.status == 'success' && 'passing' || 'failing' }} diff --git a/.github/workflows/tests_wokwi.yml b/.github/workflows/tests_wokwi.yml index 4e5d3ceca51..03dd64fc0fb 100644 --- a/.github/workflows/tests_wokwi.yml +++ b/.github/workflows/tests_wokwi.yml @@ -27,7 +27,7 @@ jobs: types: ${{ steps.set-ref.outputs.types }} steps: - name: Report pending - uses: actions/github-script@v7 + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const owner = '${{ github.repository_owner }}'; @@ -47,7 +47,7 @@ jobs: core.info(`${name} is ${state}`); - name: Download and extract event file - uses: actions/download-artifact@v4 + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 with: github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id }} @@ -55,7 +55,7 @@ jobs: path: artifacts/event_file - name: Download and extract matrix info - uses: actions/download-artifact@v4 + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 with: github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id }} @@ -130,7 +130,7 @@ jobs: echo "ref=$ref" >> $GITHUB_OUTPUT - name: Download and extract parent hardware results - uses: actions/download-artifact@v4 + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 continue-on-error: true with: github-token: ${{ secrets.GITHUB_TOKEN }} @@ -140,7 +140,7 @@ jobs: path: artifacts/results/hw - name: Download and extract parent QEMU results - uses: actions/download-artifact@v4 + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 continue-on-error: true with: github-token: ${{ secrets.GITHUB_TOKEN }} @@ -150,14 +150,14 @@ jobs: path: artifacts/results/qemu - name: Upload parent artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: parent-artifacts path: artifacts if-no-files-found: error - name: Report conclusion - uses: actions/github-script@v7 + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 if: always() with: script: | @@ -197,7 +197,7 @@ jobs: chip: ${{ fromJson(needs.get-artifacts.outputs.targets) }} steps: - name: Report pending - uses: actions/github-script@v7 + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const owner = '${{ github.repository_owner }}'; @@ -219,7 +219,7 @@ jobs: - name: Check if already passed id: get-cache-results if: needs.get-artifacts.outputs.pr_num - uses: actions/cache/restore@v4 + uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: key: tests-${{ env.id }}-results-wokwi path: | @@ -243,11 +243,11 @@ jobs: # DO NOT CHECKOUT THE USER'S REPOSITORY IN THIS WORKFLOW. IT HAS HIGH SECURITY RISKS. - name: Checkout repository if: ${{ steps.check-tests.outputs.enabled == 'true' }} - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ needs.get-artifacts.outputs.base || github.ref }} - - uses: actions/setup-python@v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4 if: ${{ steps.check-tests.outputs.enabled == 'true' }} with: cache-dependency-path: tests/requirements.txt @@ -266,11 +266,11 @@ jobs: - name: Wokwi CI Server if: ${{ steps.check-tests.outputs.enabled == 'true' }} - uses: wokwi/wokwi-ci-server-action@v1 + uses: wokwi/wokwi-ci-server-action@a6fabb5a49e080158c7a1d121ea5b789536a82c3 # v1 - name: Get binaries if: ${{ steps.check-tests.outputs.enabled == 'true' }} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 with: github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id }} @@ -286,7 +286,7 @@ jobs: bash .github/scripts/tests_run.sh -c -type ${{ matrix.type }} -t ${{ matrix.chip }} -i 0 -m 1 -W ${{ env.WOKWI_TIMEOUT }} - name: Upload ${{ matrix.chip }} ${{ matrix.type }} Wokwi results as cache - uses: actions/cache/save@v4 + uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 if: steps.check-tests.outputs.enabled == 'true' && needs.get-artifacts.outputs.pr_num with: key: tests-${{ env.id }}-results-wokwi @@ -295,7 +295,7 @@ jobs: tests/**/result_*.json - name: Upload ${{ matrix.chip }} ${{ matrix.type }} Wokwi results as artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: always() with: name: tests-results-wokwi-${{ matrix.chip }}-${{ matrix.type }} @@ -305,7 +305,7 @@ jobs: tests/**/result_*.json - name: Report conclusion - uses: actions/github-script@v7 + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 if: always() with: script: | diff --git a/.github/workflows/upload-idf-component.yml b/.github/workflows/upload-idf-component.yml index 5ce4562c01a..687e721fbc2 100644 --- a/.github/workflows/upload-idf-component.yml +++ b/.github/workflows/upload-idf-component.yml @@ -45,13 +45,13 @@ jobs: echo "Tag: $tag" echo "RELEASE_TAG=$tag" >> $GITHUB_ENV - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ inputs.git_ref || env.RELEASE_TAG }} submodules: "recursive" - name: Upload components to the component registry - uses: espressif/upload-components-ci-action@v1 + uses: espressif/upload-components-ci-action@b78a19fa5424714997596d3ecffa634aef8ae20b # v1.0.5 with: name: arduino-esp32 version: ${{ env.RELEASE_TAG }} From 1ca9dab521fd4252e2c33799e79f1929e93bbd02 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Thu, 27 Mar 2025 07:32:36 -0300 Subject: [PATCH 080/290] fix(arduino_pins): fixes Lolin-C3-Pico and C3-Mini RGB LED pin + C3-Pico SPI SCK pin definition (#11186) * fix(arduino_pins): fixes RGB LED pin and SPI SCK pin definition * fix(arduino_pins): lolin-c3-mini rgb led pin --- variants/lolin_c3_mini/pins_arduino.h | 10 +++++++++- variants/lolin_c3_pico/pins_arduino.h | 12 ++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/variants/lolin_c3_mini/pins_arduino.h b/variants/lolin_c3_mini/pins_arduino.h index c7357975ac7..0236f02267d 100644 --- a/variants/lolin_c3_mini/pins_arduino.h +++ b/variants/lolin_c3_mini/pins_arduino.h @@ -2,10 +2,18 @@ #define Pins_Arduino_h #include +#include "soc/soc_caps.h" -static const uint8_t LED_BUILTIN = 7; +// based on https://www.wemos.cc/en/latest/c3/c3_mini.html +// WS2812 RGB LED on pin 7 +#define PIN_RGB_LED 7 +// 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 RGB_BRIGHTNESS 64 static const uint8_t TX = 21; static const uint8_t RX = 20; diff --git a/variants/lolin_c3_pico/pins_arduino.h b/variants/lolin_c3_pico/pins_arduino.h index 8d4cfc5c4f0..45087c3f9fc 100644 --- a/variants/lolin_c3_pico/pins_arduino.h +++ b/variants/lolin_c3_pico/pins_arduino.h @@ -4,10 +4,18 @@ #define Pins_Arduino_h #include +#include "soc/soc_caps.h" -static const uint8_t LED_BUILTIN = 7; +// based on https://www.wemos.cc/en/latest/c3/c3_pico.html +// WS2812 RGB LED on pin 7 +#define PIN_RGB_LED 7 +// 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 RGB_BRIGHTNESS 64 static const uint8_t TX = 21; static const uint8_t RX = 20; @@ -17,7 +25,7 @@ static const uint8_t SCL = 10; static const uint8_t VBAT = 3; -static const uint8_t SCK = 2; +static const uint8_t SCK = 1; static const uint8_t MISO = 0; static const uint8_t MOSI = 4; static const uint8_t SS = 5; From 86221479b774e65b0a3dc74ba901e8f4a1a89663 Mon Sep 17 00:00:00 2001 From: FidelSch Date: Thu, 27 Mar 2025 07:35:19 -0300 Subject: [PATCH 081/290] fix: BLEAdvertising methods return error codes (#11154) * fix: BLEAdvertising methods return error codes Some methods returned void even if they could produce an error, in which case they failed silently. They now return the corresponding error code. * fix: methods which could error out return bool Changed from returning esp_error_t, in order to be more arduino compatible. --------- Co-authored-by: Sugar Glider --- libraries/BLE/src/BLEAdvertising.cpp | 34 ++++++++++++++++------------ libraries/BLE/src/BLEAdvertising.h | 10 ++++---- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/libraries/BLE/src/BLEAdvertising.cpp b/libraries/BLE/src/BLEAdvertising.cpp index 2d71c4d7478..fe39a69c206 100644 --- a/libraries/BLE/src/BLEAdvertising.cpp +++ b/libraries/BLE/src/BLEAdvertising.cpp @@ -183,7 +183,7 @@ void BLEAdvertising::setScanFilter(bool scanRequestWhitelistOnly, bool connectWh * @brief Set the advertisement data that is to be published in a regular advertisement. * @param [in] advertisementData The data to be advertised. */ -void BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertisementData) { +bool BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertisementData) { log_v(">> setAdvertisementData"); esp_err_t errRc = ::esp_ble_gap_config_adv_data_raw((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length()); if (errRc != ESP_OK) { @@ -191,13 +191,14 @@ void BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertisementDat } m_customAdvData = true; // Set the flag that indicates we are using custom advertising data. log_v("<< setAdvertisementData"); + return ESP_OK == errRc; } // setAdvertisementData /** * @brief Set the advertisement data that is to be published in a scan response. * @param [in] advertisementData The data to be advertised. */ -void BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData) { +bool BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData) { log_v(">> setScanResponseData"); esp_err_t errRc = ::esp_ble_gap_config_scan_rsp_data_raw((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length()); if (errRc != ESP_OK) { @@ -205,6 +206,7 @@ void BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData } m_customScanResponseData = true; // Set the flag that indicates we are using custom scan response data. log_v("<< setScanResponseData"); + return ESP_OK == errRc; } // setScanResponseData /** @@ -212,7 +214,7 @@ void BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData * Start advertising. * @return N/A. */ -void BLEAdvertising::start() { +bool BLEAdvertising::start() { log_v(">> start: customAdvData: %d, customScanResponseData: %d", m_customAdvData, m_customScanResponseData); // We have a vector of service UUIDs that we wish to advertise. In order to use the @@ -225,7 +227,7 @@ void BLEAdvertising::start() { m_advData.p_service_uuid = (uint8_t *)malloc(m_advData.service_uuid_len); if (!m_advData.p_service_uuid) { log_e(">> start failed: out of memory"); - return; + return false; } uint8_t *p = m_advData.p_service_uuid; @@ -250,7 +252,7 @@ void BLEAdvertising::start() { errRc = ::esp_ble_gap_config_adv_data(&m_advData); if (errRc != ESP_OK) { log_e("<< esp_ble_gap_config_adv_data: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - return; + return false; } } @@ -266,7 +268,7 @@ void BLEAdvertising::start() { errRc = ::esp_ble_gap_config_adv_data(&m_scanRespData); if (errRc != ESP_OK) { log_e("<< esp_ble_gap_config_adv_data (Scan response): rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - return; + return false; } } @@ -279,9 +281,10 @@ void BLEAdvertising::start() { errRc = ::esp_ble_gap_start_advertising(&m_advParams); if (errRc != ESP_OK) { log_e("<< esp_ble_gap_start_advertising: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - return; + } else { + log_v("<< start"); } - log_v("<< start"); + return ESP_OK == errRc; } // start /** @@ -289,14 +292,15 @@ void BLEAdvertising::start() { * Stop advertising. * @return N/A. */ -void BLEAdvertising::stop() { +bool BLEAdvertising::stop() { log_v(">> stop"); esp_err_t errRc = ::esp_ble_gap_stop_advertising(); if (errRc != ESP_OK) { log_e("esp_ble_gap_stop_advertising: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - return; + } else { + log_v("<< stop"); } - log_v("<< stop"); + return ESP_OK == errRc; } // stop /** @@ -305,17 +309,17 @@ void BLEAdvertising::stop() { * @param [in] Bluetooth address type. * Set BLE address. */ - -void BLEAdvertising::setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type) { +bool BLEAdvertising::setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type) { log_v(">> setPrivateAddress"); m_advParams.own_addr_type = type; esp_err_t errRc = esp_ble_gap_set_rand_addr((uint8_t *)addr); if (errRc != ESP_OK) { log_e("esp_ble_gap_set_rand_addr: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - return; + } else { + log_v("<< setPrivateAddress"); } - log_v("<< setPrivateAddress"); + return ESP_OK == errRc; } // setPrivateAddress /** diff --git a/libraries/BLE/src/BLEAdvertising.h b/libraries/BLE/src/BLEAdvertising.h index 9da70a3d9ca..1e573ac814f 100644 --- a/libraries/BLE/src/BLEAdvertising.h +++ b/libraries/BLE/src/BLEAdvertising.h @@ -54,18 +54,18 @@ class BLEAdvertising { bool removeServiceUUID(int index); bool removeServiceUUID(BLEUUID serviceUUID); bool removeServiceUUID(const char *serviceUUID); - void start(); - void stop(); + bool start(); + bool stop(); void setAppearance(uint16_t appearance); void setAdvertisementType(esp_ble_adv_type_t adv_type); void setAdvertisementChannelMap(esp_ble_adv_channel_t channel_map); void setMaxInterval(uint16_t maxinterval); void setMinInterval(uint16_t mininterval); - void setAdvertisementData(BLEAdvertisementData &advertisementData); + bool setAdvertisementData(BLEAdvertisementData &advertisementData); void setScanFilter(bool scanRequestWhitelistOnly, bool connectWhitelistOnly); - void setScanResponseData(BLEAdvertisementData &advertisementData); + bool setScanResponseData(BLEAdvertisementData &advertisementData); void setPrivateAddress(esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM); - void setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM); + bool setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM); void handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); void setMinPreferred(uint16_t); From e37435c442a6385bab0a4c8a2a03e9d142f2b090 Mon Sep 17 00:00:00 2001 From: MikaFromTheRoof Date: Thu, 27 Mar 2025 11:56:30 +0100 Subject: [PATCH 082/290] feat(zigbee): Add Illuminance sensor endpoint (#11171) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added Zigbee light sensor * Add comment for macro * Some last corrections * refactor(zigbee): changed class name to ZigbeeIlluminanceSensor * feat(zigbee): Illumanance sensor update * fix(zigbee): Change name of macro to avoid possible conflict with esp-zigbee-sdk * Update keywords.txt * fix(zigbee): Add Illuminance to Cmake file * fix(example): Update Illuminance example * ci(pre-commit): Apply automatic fixes * Update Zigbee_Illuminance_Sensor.ino * 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> --- CMakeLists.txt | 1 + .../Zigbee_Illuminance_Sensor/README.md | 78 ++++++++++ .../Zigbee_Illuminance_Sensor.ino | 141 ++++++++++++++++++ .../Zigbee_Illuminance_Sensor/ci.json | 7 + libraries/Zigbee/keywords.txt | 4 + libraries/Zigbee/src/Zigbee.h | 1 + .../Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp | 74 +++++++++ .../Zigbee/src/ep/ZigbeeIlluminanceSensor.h | 51 +++++++ 8 files changed, 357 insertions(+) create mode 100644 libraries/Zigbee/examples/Zigbee_Illuminance_Sensor/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Illuminance_Sensor/Zigbee_Illuminance_Sensor.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Illuminance_Sensor/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d2a9162a9ba..7539601d9e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -299,6 +299,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp libraries/Zigbee/src/ep/ZigbeeGateway.cpp libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp + libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp ) set(ARDUINO_LIBRARY_BLE_SRCS diff --git a/libraries/Zigbee/examples/Zigbee_Illuminance_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_Illuminance_Sensor/README.md new file mode 100644 index 00000000000..fe723696d5a --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Illuminance_Sensor/README.md @@ -0,0 +1,78 @@ +# Arduino-ESP32 Zigbee Illuminance Sensor Example + +This example demonstrates how to use the Zigbee library to create an end device illuminance sensor and use it as a Home Automation (HA) extended illuminance sensor. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## Illuminance Sensor Functions + +1. Initialize a Zigbee illuminance sensor. +2. Measure illuminance value. +3. Report the measured value to the Zigbee network. + +## Hardware Required + +* ESP32-H2 or ESP32-C6 development board +* A USB cable for power supply and programming +* Some kind of light sensor, such as a photoresistor + +### Configure the Project + +In this example the raw analog value of a light sensor is used to calculate illuminance. +Alter the calculation according to your use case and calibrate it to receive correct lux values. +Set the illuminance sensor GPIO by changing the `illuminance_sensor_pin` variable to the pin to the pin to which your sensor is connected. +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` +* Enable USB CDC to be able to use the serial monitor: `Tools -> USB CDC On Boot: Enabled` +* 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 that you are using a good quality USB cable with data lines 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_Illuminance_Sensor/Zigbee_Illuminance_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Illuminance_Sensor/Zigbee_Illuminance_Sensor.ino new file mode 100644 index 00000000000..bbb2cba569f --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Illuminance_Sensor/Zigbee_Illuminance_Sensor.ino @@ -0,0 +1,141 @@ +// 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 illuminance sensor. + * + * The example demonstrates how to use Zigbee library to create a end device illuminance sensor. + * The illuminance 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 MikaFromTheRoof (https://github.com/MikaFromTheRoof) + */ + +#ifndef ZIGBEE_MODE_ED +#error "Zigbee end device mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +#define ZIGBEE_ILLUMINANCE_SENSOR_ENDPOINT 9 +uint8_t button = BOOT_PIN; +uint8_t illuminance_sensor_pin = 6; // Insert the analog pin to which the sensor (e.g. photoresistor) is connected + +ZigbeeIlluminanceSensor zbIlluminanceSensor = ZigbeeIlluminanceSensor(ZIGBEE_ILLUMINANCE_SENSOR_ENDPOINT); + +/********************* Illuminance sensor **************************/ +static void illuminance_sensor_value_update(void *arg) { + for (;;) { + // read the raw analog value from the sensor + int lsens_analog_raw = analogRead(illuminance_sensor_pin); + Serial.printf("[Illuminance Sensor] raw analog value: %d\r\n", lsens_analog_raw); + + // conversion into zigbee raw illuminance value (typically between 0 in darkness and 50000 in direct sunlight) + // depends on the value range of the raw analog sensor values and will need calibration for correct lux values + // for demonstration purpose map the 12-bit ADC value (0-4095) to Zigbee illuminance range (0-50000) + int lsens_illuminance_raw = map(lsens_analog_raw, 0, 4095, 0, 50000); + Serial.printf("[Illuminance Sensor] raw illuminance value: %d\r\n", lsens_illuminance_raw); + + // according to zigbee documentation the formular 10^(lsens_illuminance_raw/10000)-1 can be used to calculate lux value from raw illuminance value + // Note: Zigbee2MQTT seems to be using the formular 10^(lsens_illuminance_raw/10000) instead (without -1) + int lsens_illuminance_lux = round(pow(10, (lsens_illuminance_raw / 10000.0)) - 1); + Serial.printf("[Illuminance Sensor] lux value: %d lux\r\n", lsens_illuminance_lux); + + // Update illuminance in illuminance sensor EP + zbIlluminanceSensor.setIlluminance(lsens_illuminance_raw); // use raw illuminance here! + + delay(1000); // reduce delay (in ms), if you want your device to react more quickly to changes in illuminance + } +} + +/********************* Arduino functions **************************/ +void setup() { + Serial.begin(115200); + + // Optional: configure analog input + analogSetAttenuation(ADC_11db); // set analog to digital converter (ADC) attenuation to 11 dB (up to ~3.3V input) + analogReadResolution(12); // set analog read resolution to 12 bits (value range from 0 to 4095), 12 is default + + // Init button for factory reset + pinMode(button, INPUT_PULLUP); + + // Optional: Set Zigbee device name and model + zbIlluminanceSensor.setManufacturerAndModel("Espressif", "ZigbeeIlluminanceSensor"); + + // Optional: Set power source (choose between ZB_POWER_SOURCE_MAINS and ZB_POWER_SOURCE_BATTERY), defaults to unknown + zbIlluminanceSensor.setPowerSource(ZB_POWER_SOURCE_MAINS); + + // Set minimum and maximum for raw illuminance value (0 min and 50000 max equals to 0 lux - 100,000 lux) + zbIlluminanceSensor.setMinMaxValue(0, 50000); + + // Optional: Set tolerance for raw illuminance value + zbIlluminanceSensor.setTolerance(1); + + // Add endpoint to Zigbee Core + Serial.println("Adding Zigbee illuminance sensor endpoint to Zigbee Core"); + Zigbee.addEndpoint(&zbIlluminanceSensor); + + 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 illuminance sensor reading task + xTaskCreate(illuminance_sensor_value_update, "illuminance_sensor_update", 2048, NULL, 10, NULL); + + // Set reporting schedule for illuminance value measurement in seconds, must be called after Zigbee.begin() + // min_interval and max_interval in seconds, delta + // if min = 1 and max = 0, delta = 1000, reporting is sent when raw illuminance value changes by 1000, but at most once per second + // if min = 0 and max = 10, delta = 1000, reporting is sent every 10 seconds or if raw illuminance value changes by 1000 + // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of illuminance change + // Note: On pairing with Zigbee Home Automation or Zigbee2MQTT the reporting schedule will most likely be overwritten with their default settings + zbIlluminanceSensor.setReporting(1, 0, 1000); +} + +/********************* Main loop **************************/ +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 3 secs, factory reset Zigbee and reboot + Serial.println("Resetting Zigbee to factory and rebooting in 1s"); + delay(1000); + Zigbee.factoryReset(); + } + } + // force report of illuminance when button is pressed + zbIlluminanceSensor.report(); + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_Illuminance_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_Illuminance_Sensor/ci.json new file mode 100644 index 00000000000..ceacc367801 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Illuminance_Sensor/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" + ] +} diff --git a/libraries/Zigbee/keywords.txt b/libraries/Zigbee/keywords.txt index 2eeed5878a7..586d2bdc677 100644 --- a/libraries/Zigbee/keywords.txt +++ b/libraries/Zigbee/keywords.txt @@ -29,6 +29,7 @@ ZigbeeGateway KEYWORD1 ZigbeeRangeExtender KEYWORD1 ZigbeeVibrationSensor KEYWORD1 ZigbeeWindowCovering KEYWORD1 +ZigbeeIlluminanceSensor KEYWORD1 # Other zigbee_role_t KEYWORD1 @@ -123,6 +124,9 @@ setHumidity KEYWORD2 setHumidityReporting KEYWORD2 reportHumidity KEYWORD2 +# ZigbeeIlluminanceSensor +setIlluminance KEYWORD2 + # ZigbeeFlowSensor setFlow KEYWORD2 diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index e5f669ba899..ea42e9dd41a 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -18,6 +18,7 @@ #include "ep/ZigbeeAnalog.h" #include "ep/ZigbeeFlowSensor.h" #include "ep/ZigbeeOccupancySensor.h" +#include "ep/ZigbeeIlluminanceSensor.h" #include "ep/ZigbeeCarbonDioxideSensor.h" #include "ep/ZigbeeContactSwitch.h" #include "ep/ZigbeeDoorWindowHandle.h" diff --git a/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp new file mode 100644 index 00000000000..d38e9b1065f --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp @@ -0,0 +1,74 @@ +#include "ZigbeeIlluminanceSensor.h" +#if CONFIG_ZB_ENABLED + +ZigbeeIlluminanceSensor::ZigbeeIlluminanceSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_LIGHT_SENSOR_DEVICE_ID; + + esp_zb_light_sensor_cfg_t light_sensor_cfg = ZIGBEE_DEFAULT_ILLUMINANCE_SENSOR_CONFIG(); + _cluster_list = esp_zb_light_sensor_clusters_create(&light_sensor_cfg); + + _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_LIGHT_SENSOR_DEVICE_ID, .app_device_version = 0}; +} + +void ZigbeeIlluminanceSensor::setMinMaxValue(uint16_t min, uint16_t max) { + esp_zb_attribute_list_t *light_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_update_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&min); + esp_zb_cluster_update_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&max); +} + +void ZigbeeIlluminanceSensor::setTolerance(uint16_t tolerance) { + esp_zb_attribute_list_t *light_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_illuminance_meas_cluster_add_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_TOLERANCE_ID, (void *)&tolerance); +} + +void ZigbeeIlluminanceSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) { + 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_ILLUMINANCE_MEASUREMENT; + reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; + reporting_info.attr_id = ESP_ZB_ZCL_ATTR_ILLUMINANCE_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(); +} + +void ZigbeeIlluminanceSensor::setIlluminance(uint16_t illuminanceValue) { + log_v("Updating Illuminance..."); + /* Update illuminance sensor measured illuminance */ + log_d("Setting Illuminance to %d", illuminanceValue); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MEASURED_VALUE_ID, + &illuminanceValue, false + ); + esp_zb_lock_release(); +} + +void ZigbeeIlluminanceSensor::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_ILLUMINANCE_MEASUREMENT_MEASURED_VALUE_ID; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; + report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT; + report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_zb_lock_release(); + log_v("Illuminance report sent"); +} + +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.h b/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.h new file mode 100644 index 00000000000..9c9d9e3fcaf --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.h @@ -0,0 +1,51 @@ +/* Class of Zigbee Illuminance sensor endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +#define ZIGBEE_DEFAULT_ILLUMINANCE_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, \ + }, \ + .illuminance_cfg = { \ + .measured_value = ESP_ZB_ZCL_ILLUMINANCE_MEASUREMENT_LIGHT_SENSOR_TYPE_DEFAULT_VALUE, \ + .min_value = ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MIN_MEASURED_VALUE_MIN_VALUE, \ + .max_value = ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MAX_MEASURED_VALUE_MAX_VALUE, \ + }, \ + } + +class ZigbeeIlluminanceSensor : public ZigbeeEP { +public: + ZigbeeIlluminanceSensor(uint8_t endpoint); + ~ZigbeeIlluminanceSensor() {} + + // Set the illuminance value + void setIlluminance(uint16_t value); + + // Set the min and max value for the illuminance sensor + void setMinMaxValue(uint16_t min, uint16_t max); + + // Set the tolerance value for the illuminance sensor + void setTolerance(uint16_t tolerance); + + // Set the reporting interval for illuminance measurement in seconds and delta + void setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta); + + // Report the illuminance value + void report(); +}; + +#endif // CONFIG_ZB_ENABLED From 17258930e61a92a25831a25d52f087704419755a Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 27 Mar 2025 13:38:04 +0200 Subject: [PATCH 083/290] fix(wifi_scan): Fix some edge cases where WiFi Scan may fail (#11188) --- libraries/WiFi/src/WiFiScan.cpp | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/libraries/WiFi/src/WiFiScan.cpp b/libraries/WiFi/src/WiFiScan.cpp index 27d9edcc70c..086b875fcb2 100644 --- a/libraries/WiFi/src/WiFiScan.cpp +++ b/libraries/WiFi/src/WiFiScan.cpp @@ -92,9 +92,6 @@ int16_t } if (esp_wifi_scan_start(&config, false) == ESP_OK) { _scanStarted = millis(); - if (!_scanStarted) { //Prevent 0 from millis overflow - ++_scanStarted; - } WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT); WiFiGenericClass::setStatusBits(WIFI_SCANNING_BIT); @@ -118,21 +115,20 @@ int16_t void WiFiScanClass::_scanDone() { esp_wifi_scan_get_ap_num(&(WiFiScanClass::_scanCount)); if (WiFiScanClass::_scanResult) { - delete[] reinterpret_cast(WiFiScanClass::_scanResult); - WiFiScanClass::_scanResult = nullptr; + free(WiFiScanClass::_scanResult); + WiFiScanClass::_scanResult = NULL; } if (WiFiScanClass::_scanCount) { - WiFiScanClass::_scanResult = new (std::nothrow) wifi_ap_record_t[WiFiScanClass::_scanCount]; + WiFiScanClass::_scanResult = calloc(WiFiScanClass::_scanCount, sizeof(wifi_ap_record_t)); if (!WiFiScanClass::_scanResult) { WiFiScanClass::_scanCount = 0; } else if (esp_wifi_scan_get_ap_records(&(WiFiScanClass::_scanCount), (wifi_ap_record_t *)_scanResult) != ESP_OK) { - delete[] reinterpret_cast(WiFiScanClass::_scanResult); - WiFiScanClass::_scanResult = nullptr; + free(WiFiScanClass::_scanResult); + WiFiScanClass::_scanResult = NULL; WiFiScanClass::_scanCount = 0; } } - WiFiScanClass::_scanStarted = 0; //Reset after a scan is completed for normal behavior WiFiGenericClass::setStatusBits(WIFI_SCAN_DONE_BIT); WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT); } @@ -161,15 +157,13 @@ int16_t WiFiScanClass::scanComplete() { } if (WiFiGenericClass::getStatusBits() & WIFI_SCANNING_BIT) { + // Check if the delay expired, return WIFI_SCAN_FAILED in this case + if ((millis() - WiFiScanClass::_scanStarted) > WiFiScanClass::_scanTimeout) { + WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT); + return WIFI_SCAN_FAILED; + } return WIFI_SCAN_RUNNING; } - // last one to avoid time affecting Async mode - if (WiFiScanClass::_scanStarted - && (millis() - WiFiScanClass::_scanStarted) - > WiFiScanClass::_scanTimeout) { //Check is scan was started and if the delay expired, return WIFI_SCAN_FAILED in this case - WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT); - return WIFI_SCAN_FAILED; - } return WIFI_SCAN_FAILED; } @@ -179,11 +173,12 @@ int16_t WiFiScanClass::scanComplete() { */ void WiFiScanClass::scanDelete() { WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT); + WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT); if (WiFiScanClass::_scanResult) { - delete[] reinterpret_cast(WiFiScanClass::_scanResult); - WiFiScanClass::_scanResult = nullptr; - WiFiScanClass::_scanCount = 0; + free(WiFiScanClass::_scanResult); + WiFiScanClass::_scanResult = NULL; } + WiFiScanClass::_scanCount = 0; } /** From bbaabb183a11d072cec64abf4fe2f22315cb95df Mon Sep 17 00:00:00 2001 From: SooDragon <82627949+SooDragon@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:52:32 +0900 Subject: [PATCH 084/290] fix: Geekble Nano board setup update (#11131) * Geekble Nano board setup update Geekble Nano board setup update * fix: erase Comment Line fix: erase Comment Line * revert re-naming revert re-naming --- boards.txt | 90 +++++------------------------------------------------- 1 file changed, 8 insertions(+), 82 deletions(-) diff --git a/boards.txt b/boards.txt index 661d1f7a990..9190ee03a63 100644 --- a/boards.txt +++ b/boards.txt @@ -40874,8 +40874,8 @@ Geekble_Nano_ESP32S3.upload.tool.default=esptool_py Geekble_Nano_ESP32S3.upload.tool.network=esp_ota Geekble_Nano_ESP32S3.upload.maximum_size=1310720 - Geekble_Nano_ESP32S3.upload.maximum_data_size=327680 +Geekble_Nano_ESP32S3.upload.speed=921600 Geekble_Nano_ESP32S3.upload.flags= Geekble_Nano_ESP32S3.upload.extra_flags= Geekble_Nano_ESP32S3.upload.use_1200bps_touch=false @@ -40901,61 +40901,18 @@ Geekble_Nano_ESP32S3.build.flash_size=4MB Geekble_Nano_ESP32S3.build.flash_freq=80m Geekble_Nano_ESP32S3.build.flash_mode=dio Geekble_Nano_ESP32S3.build.boot=qio -Geekble_Nano_ESP32S3.build.boot_freq=80m Geekble_Nano_ESP32S3.build.partitions=default Geekble_Nano_ESP32S3.build.defines= -Geekble_Nano_ESP32S3.build.loop_core= -Geekble_Nano_ESP32S3.build.event_core= -Geekble_Nano_ESP32S3.build.psram_type=qspi -Geekble_Nano_ESP32S3.build.memory_type={build.boot}_{build.psram_type} - -Geekble_Nano_ESP32S3.menu.PSRAM.disabled=Disabled -Geekble_Nano_ESP32S3.menu.PSRAM.disabled.build.defines= -Geekble_Nano_ESP32S3.menu.PSRAM.disabled.build.psram_type=qspi -Geekble_Nano_ESP32S3.menu.PSRAM.enabled=Enabled -Geekble_Nano_ESP32S3.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM -Geekble_Nano_ESP32S3.menu.PSRAM.enabled.build.psram_type=qspi - -Geekble_Nano_ESP32S3.menu.FlashMode.qio=QIO 80MHz -Geekble_Nano_ESP32S3.menu.FlashMode.qio.build.flash_mode=dio -Geekble_Nano_ESP32S3.menu.FlashMode.qio.build.boot=qio -Geekble_Nano_ESP32S3.menu.FlashMode.qio.build.boot_freq=80m -Geekble_Nano_ESP32S3.menu.FlashMode.qio.build.flash_freq=80m -Geekble_Nano_ESP32S3.menu.FlashMode.qio120=QIO 120MHz -Geekble_Nano_ESP32S3.menu.FlashMode.qio120.build.flash_mode=dio -Geekble_Nano_ESP32S3.menu.FlashMode.qio120.build.boot=qio -Geekble_Nano_ESP32S3.menu.FlashMode.qio120.build.boot_freq=120m -Geekble_Nano_ESP32S3.menu.FlashMode.qio120.build.flash_freq=80m - -Geekble_Nano_ESP32S3.menu.LoopCore.1=Core 1 -Geekble_Nano_ESP32S3.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 -Geekble_Nano_ESP32S3.menu.LoopCore.0=Core 0 -Geekble_Nano_ESP32S3.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 - -Geekble_Nano_ESP32S3.menu.EventsCore.1=Core 1 -Geekble_Nano_ESP32S3.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 -Geekble_Nano_ESP32S3.menu.EventsCore.0=Core 0 -Geekble_Nano_ESP32S3.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 +Geekble_Nano_ESP32S3.build.memory_type=qio_qspi +Geekble_Nano_ESP32S3.build.loop_core=-DARDUINO_RUNNING_CORE=1 +Geekble_Nano_ESP32S3.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 -Geekble_Nano_ESP32S3.menu.USBMode.hwcdc=Hardware CDC and JTAG -Geekble_Nano_ESP32S3.menu.USBMode.hwcdc.build.usb_mode=1 Geekble_Nano_ESP32S3.menu.USBMode.default=USB-OTG (TinyUSB) Geekble_Nano_ESP32S3.menu.USBMode.default.build.usb_mode=0 - -Geekble_Nano_ESP32S3.menu.CDCOnBoot.default=Disabled -Geekble_Nano_ESP32S3.menu.CDCOnBoot.default.build.cdc_on_boot=0 -Geekble_Nano_ESP32S3.menu.CDCOnBoot.cdc=Enabled -Geekble_Nano_ESP32S3.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 - -Geekble_Nano_ESP32S3.menu.MSCOnBoot.default=Disabled -Geekble_Nano_ESP32S3.menu.MSCOnBoot.default.build.msc_on_boot=0 -Geekble_Nano_ESP32S3.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) -Geekble_Nano_ESP32S3.menu.MSCOnBoot.msc.build.msc_on_boot=1 - -Geekble_Nano_ESP32S3.menu.DFUOnBoot.default=Disabled -Geekble_Nano_ESP32S3.menu.DFUOnBoot.default.build.dfu_on_boot=0 -Geekble_Nano_ESP32S3.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) -Geekble_Nano_ESP32S3.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 +Geekble_Nano_ESP32S3.menu.USBMode.default.build.cdc_on_boot=1 +Geekble_Nano_ESP32S3.menu.USBMode.hwcdc=Hardware CDC and JTAG +Geekble_Nano_ESP32S3.menu.USBMode.hwcdc.build.usb_mode=1 +Geekble_Nano_ESP32S3.menu.USBMode.hwcdc.build.cdc_on_boot=1 Geekble_Nano_ESP32S3.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) Geekble_Nano_ESP32S3.menu.UploadMode.cdc.upload.use_1200bps_touch=true @@ -40989,46 +40946,16 @@ Geekble_Nano_ESP32S3.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 Geekble_Nano_ESP32S3.menu.PartitionScheme.rainmaker_4MB=RainMaker 4MB No OTA Geekble_Nano_ESP32S3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota Geekble_Nano_ESP32S3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 - Geekble_Nano_ESP32S3.menu.PartitionScheme.otanofs=OTA no FS (2MB APP with OTA) Geekble_Nano_ESP32S3.menu.PartitionScheme.otanofs.build.custom_partitions=ota_nofs_4MB Geekble_Nano_ESP32S3.menu.PartitionScheme.otanofs.upload.maximum_size=2031616 Geekble_Nano_ESP32S3.menu.PartitionScheme.all_app=Max APP (4MB APP no OTA) Geekble_Nano_ESP32S3.menu.PartitionScheme.all_app.build.custom_partitions=max_app_4MB Geekble_Nano_ESP32S3.menu.PartitionScheme.all_app.upload.maximum_size=4063232 - Geekble_Nano_ESP32S3.menu.PartitionScheme.custom=Custom Geekble_Nano_ESP32S3.menu.PartitionScheme.custom.build.partitions= Geekble_Nano_ESP32S3.menu.PartitionScheme.custom.upload.maximum_size=16777216 -Geekble_Nano_ESP32S3.menu.CPUFreq.240=240MHz (WiFi) -Geekble_Nano_ESP32S3.menu.CPUFreq.240.build.f_cpu=240000000L -Geekble_Nano_ESP32S3.menu.CPUFreq.160=160MHz (WiFi) -Geekble_Nano_ESP32S3.menu.CPUFreq.160.build.f_cpu=160000000L -Geekble_Nano_ESP32S3.menu.CPUFreq.80=80MHz (WiFi) -Geekble_Nano_ESP32S3.menu.CPUFreq.80.build.f_cpu=80000000L -Geekble_Nano_ESP32S3.menu.CPUFreq.40=40MHz -Geekble_Nano_ESP32S3.menu.CPUFreq.40.build.f_cpu=40000000L -Geekble_Nano_ESP32S3.menu.CPUFreq.20=20MHz -Geekble_Nano_ESP32S3.menu.CPUFreq.20.build.f_cpu=20000000L -Geekble_Nano_ESP32S3.menu.CPUFreq.10=10MHz -Geekble_Nano_ESP32S3.menu.CPUFreq.10.build.f_cpu=10000000L - -Geekble_Nano_ESP32S3.menu.UploadSpeed.921600=921600 -Geekble_Nano_ESP32S3.menu.UploadSpeed.921600.upload.speed=921600 -Geekble_Nano_ESP32S3.menu.UploadSpeed.115200=115200 -Geekble_Nano_ESP32S3.menu.UploadSpeed.115200.upload.speed=115200 -Geekble_Nano_ESP32S3.menu.UploadSpeed.256000.windows=256000 -Geekble_Nano_ESP32S3.menu.UploadSpeed.256000.upload.speed=256000 -Geekble_Nano_ESP32S3.menu.UploadSpeed.230400.windows.upload.speed=256000 -Geekble_Nano_ESP32S3.menu.UploadSpeed.230400=230400 -Geekble_Nano_ESP32S3.menu.UploadSpeed.230400.upload.speed=230400 -Geekble_Nano_ESP32S3.menu.UploadSpeed.460800.linux=460800 -Geekble_Nano_ESP32S3.menu.UploadSpeed.460800.macosx=460800 -Geekble_Nano_ESP32S3.menu.UploadSpeed.460800.upload.speed=460800 -Geekble_Nano_ESP32S3.menu.UploadSpeed.512000.windows=512000 -Geekble_Nano_ESP32S3.menu.UploadSpeed.512000.upload.speed=512000 - Geekble_Nano_ESP32S3.menu.DebugLevel.none=None Geekble_Nano_ESP32S3.menu.DebugLevel.none.build.code_debug=0 Geekble_Nano_ESP32S3.menu.DebugLevel.error=Error @@ -41047,7 +40974,6 @@ Geekble_Nano_ESP32S3.menu.EraseFlash.none.upload.erase_cmd= Geekble_Nano_ESP32S3.menu.EraseFlash.all=Enabled Geekble_Nano_ESP32S3.menu.EraseFlash.all.upload.erase_cmd=-e - ############################################################## waveshare_esp32_s3_zero.name=Waveshare ESP32-S3-Zero From a3b6fe61ba39fccf8770a0bdf06243377c907702 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, 27 Mar 2025 21:13:48 +0100 Subject: [PATCH 085/290] feat(zigbee): Add check, boolean returns, fix Analog, add optional reset on factoryReset (#11153) * feat(zigbee): Add checks on setting attrs and commands * feat(zigbee): Add error info in the logs * fix(zigbee): Fix memory leak, print esp_zb_zcl_status_t error, remove analogValue from analog EP * feat(example): Update factoryResetoption in sleepy example * fix(zigbee): Add error checks to Illuminance EP * fix(zigbee): Return false on first error hit * fix(zigbee): Apply same formatting on all returns * fix(zigbee): Add check when adding a OTA cluster * fix(zigbee): release locks before returning * fix(zigbee): use correct return in doorWindowHandle * fix/zigbee): Add missing return in WindowCovering * fix(zigbee): Added a note of future task * 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_Temp_Hum_Sensor_Sleepy.ino | 6 +- libraries/Zigbee/src/ZigbeeCore.cpp | 29 ++- libraries/Zigbee/src/ZigbeeCore.h | 4 +- libraries/Zigbee/src/ZigbeeEP.cpp | 220 ++++++++++++++---- libraries/Zigbee/src/ZigbeeEP.h | 24 +- libraries/Zigbee/src/ep/ZigbeeAnalog.cpp | 84 ++++--- libraries/Zigbee/src/ep/ZigbeeAnalog.h | 37 +-- .../src/ep/ZigbeeCarbonDioxideSensor.cpp | 52 ++++- .../Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h | 10 +- .../src/ep/ZigbeeColorDimmableLight.cpp | 69 ++++-- .../Zigbee/src/ep/ZigbeeColorDimmableLight.h | 12 +- .../Zigbee/src/ep/ZigbeeContactSwitch.cpp | 31 ++- libraries/Zigbee/src/ep/ZigbeeContactSwitch.h | 6 +- .../Zigbee/src/ep/ZigbeeDimmableLight.cpp | 26 ++- libraries/Zigbee/src/ep/ZigbeeDimmableLight.h | 7 +- .../Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp | 39 +++- .../Zigbee/src/ep/ZigbeeDoorWindowHandle.h | 8 +- libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp | 58 ++++- libraries/Zigbee/src/ep/ZigbeeFlowSensor.h | 10 +- .../Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp | 54 ++++- .../Zigbee/src/ep/ZigbeeIlluminanceSensor.h | 10 +- libraries/Zigbee/src/ep/ZigbeeLight.cpp | 11 +- libraries/Zigbee/src/ep/ZigbeeLight.h | 2 +- .../Zigbee/src/ep/ZigbeeOccupancySensor.cpp | 34 ++- .../Zigbee/src/ep/ZigbeeOccupancySensor.h | 6 +- .../Zigbee/src/ep/ZigbeePressureSensor.cpp | 52 ++++- .../Zigbee/src/ep/ZigbeePressureSensor.h | 10 +- libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp | 88 +++++-- libraries/Zigbee/src/ep/ZigbeeTempSensor.h | 18 +- .../Zigbee/src/ep/ZigbeeVibrationSensor.cpp | 11 +- .../Zigbee/src/ep/ZigbeeVibrationSensor.h | 2 +- .../Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp | 54 ++++- .../Zigbee/src/ep/ZigbeeWindSpeedSensor.h | 10 +- .../Zigbee/src/ep/ZigbeeWindowCovering.cpp | 156 ++++++++++--- .../Zigbee/src/ep/ZigbeeWindowCovering.h | 16 +- 35 files changed, 889 insertions(+), 377 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 0bfbad1fe95..3eefd973dd2 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 @@ -133,7 +133,11 @@ void loop() { // If key pressed for more than 10secs, factory reset Zigbee and reboot Serial.println("Resetting Zigbee to factory and rebooting in 1s."); delay(1000); - Zigbee.factoryReset(); + // Optional set reset in factoryReset to false, to not restart device after erasing nvram, but set it to endless sleep manually instead + Zigbee.factoryReset(false); + Serial.println("Going to endless sleep, press RESET button or power off/on the device to wake up"); + esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_TIMER); + esp_deep_sleep_start(); } } } diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index 2200aec2662..b93542159a6 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -91,21 +91,26 @@ bool ZigbeeCore::begin(zigbee_role_t role, bool erase_nvs) { return started(); } -void ZigbeeCore::addEndpoint(ZigbeeEP *ep) { +bool ZigbeeCore::addEndpoint(ZigbeeEP *ep) { ep_objects.push_back(ep); log_d("Endpoint: %d, Device ID: 0x%04x", ep->_endpoint, ep->_device_id); //Register clusters and ep_list to the ZigbeeCore class's ep_list if (ep->_ep_config.endpoint == 0 || ep->_cluster_list == nullptr) { log_e("Endpoint config or Cluster list is not initialized, EP not added to ZigbeeCore's EP list"); - return; + return false; } - + esp_err_t ret = ESP_OK; if (ep->_device_id == ESP_ZB_HA_HOME_GATEWAY_DEVICE_ID) { - esp_zb_ep_list_add_gateway_ep(_zb_ep_list, ep->_cluster_list, ep->_ep_config); + ret = esp_zb_ep_list_add_gateway_ep(_zb_ep_list, ep->_cluster_list, ep->_ep_config); } else { - esp_zb_ep_list_add_ep(_zb_ep_list, ep->_cluster_list, ep->_ep_config); + ret = esp_zb_ep_list_add_ep(_zb_ep_list, ep->_cluster_list, ep->_ep_config); + } + if (ret != ESP_OK) { + log_e("Failed to add endpoint: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; } + return true; } static void esp_zb_task(void *pvParameters) { @@ -368,16 +373,22 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { 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(); + Zigbee.factoryReset(true); } 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; } } -void ZigbeeCore::factoryReset() { - log_v("Factory resetting Zigbee stack, device will reboot"); - esp_zb_factory_reset(); +void ZigbeeCore::factoryReset(bool restart) { + if (restart) { + log_v("Factory resetting Zigbee stack, device will reboot"); + esp_zb_factory_reset(); + } else { + log_v("Factory resetting Zigbee NVRAM to factory default"); + log_w("The device will not reboot, to take effect please reboot the device manually"); + esp_zb_zcl_reset_nvram_to_factory_default(); + } } void ZigbeeCore::scanCompleteCallback(esp_zb_zdp_status_t zdo_status, uint8_t count, esp_zb_network_descriptor_t *nwk_descriptor) { diff --git a/libraries/Zigbee/src/ZigbeeCore.h b/libraries/Zigbee/src/ZigbeeCore.h index 018f701d6e0..06c3ec4551a 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -129,7 +129,7 @@ class ZigbeeCore { return _role; } - void addEndpoint(ZigbeeEP *ep); + bool addEndpoint(ZigbeeEP *ep); //void removeEndpoint(ZigbeeEP *ep); void setRadioConfig(esp_zb_radio_config_t config); @@ -164,7 +164,7 @@ class ZigbeeCore { zigbee_scan_result_t *getScanResult(); void scanDelete(); - void factoryReset(); + void factoryReset(bool restart = true); // Friend function declaration to allow access to private members friend void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct); diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index 7052a558192..e7d507dc441 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -32,71 +32,95 @@ void ZigbeeEP::setVersion(uint8_t version) { _ep_config.app_device_version = version; } -void ZigbeeEP::setManufacturerAndModel(const char *name, const char *model) { +bool ZigbeeEP::setManufacturerAndModel(const char *name, const char *model) { // Convert manufacturer to ZCL string - size_t length = strlen(name); - if (length > 32) { - log_e("Manufacturer name is too long"); - return; + size_t name_length = strlen(name); + size_t model_length = strlen(model); + if (name_length > 32 || model_length > 32) { + log_e("Manufacturer or model name is too long"); + return false; } // Allocate a new array of size length + 2 (1 for the length, 1 for null terminator) - char *zb_name = new char[length + 2]; + char *zb_name = new char[name_length + 2]; + char *zb_model = new char[model_length + 2]; // Store the length as the first element - zb_name[0] = static_cast(length); // Cast size_t to char + zb_name[0] = static_cast(name_length); // Cast size_t to char + zb_model[0] = static_cast(model_length); // Use memcpy to copy the characters to the result array - memcpy(zb_name + 1, name, length); + memcpy(zb_name + 1, name, name_length); + memcpy(zb_model + 1, model, model_length); // Null-terminate the array - zb_name[length + 1] = '\0'; - - // Convert model to ZCL string - length = strlen(model); - if (length > 32) { - log_e("Model name is too long"); - delete[] zb_name; - return; - } - char *zb_model = new char[length + 2]; - zb_model[0] = static_cast(length); - memcpy(zb_model + 1, model, length); - zb_model[length + 1] = '\0'; + zb_name[name_length + 1] = '\0'; + zb_model[model_length + 1] = '\0'; // Get the basic cluster and update the manufacturer and model attributes esp_zb_attribute_list_t *basic_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_BASIC, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_basic_cluster_add_attr(basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_MANUFACTURER_NAME_ID, (void *)zb_name); - esp_zb_basic_cluster_add_attr(basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_MODEL_IDENTIFIER_ID, (void *)zb_model); + esp_err_t ret_name = esp_zb_basic_cluster_add_attr(basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_MANUFACTURER_NAME_ID, (void *)zb_name); + if (ret_name != ESP_OK) { + log_e("Failed to set manufacturer: 0x%x: %s", ret_name, esp_err_to_name(ret_name)); + } + esp_err_t ret_model = esp_zb_basic_cluster_add_attr(basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_MODEL_IDENTIFIER_ID, (void *)zb_model); + if (ret_model != ESP_OK) { + log_e("Failed to set model: 0x%x: %s", ret_model, esp_err_to_name(ret_model)); + } + delete[] zb_name; + delete[] zb_model; + return ret_name == ESP_OK && ret_model == ESP_OK; } -void ZigbeeEP::setPowerSource(zb_power_source_t power_source, uint8_t battery_percentage) { +bool ZigbeeEP::setPowerSource(zb_power_source_t power_source, uint8_t battery_percentage) { esp_zb_attribute_list_t *basic_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_BASIC, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_update_attr(basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_POWER_SOURCE_ID, (void *)&power_source); + esp_err_t ret = esp_zb_cluster_update_attr(basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_POWER_SOURCE_ID, (void *)&power_source); + if (ret != ESP_OK) { + log_e("Failed to set power source: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } if (power_source == ZB_POWER_SOURCE_BATTERY) { // Add power config cluster and battery percentage attribute + if (battery_percentage > 100) { + battery_percentage = 100; + } battery_percentage = battery_percentage * 2; esp_zb_attribute_list_t *power_config_cluster = esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_POWER_CONFIG); - esp_zb_power_config_cluster_add_attr(power_config_cluster, ESP_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID, (void *)&battery_percentage); - esp_zb_cluster_list_add_power_config_cluster(_cluster_list, power_config_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + ret = esp_zb_power_config_cluster_add_attr(power_config_cluster, ESP_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID, (void *)&battery_percentage); + if (ret != ESP_OK) { + log_e("Failed to add battery percentage attribute: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_list_add_power_config_cluster(_cluster_list, power_config_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + if (ret != ESP_OK) { + log_e("Failed to add power config cluster: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } } _power_source = power_source; + return true; } -void ZigbeeEP::setBatteryPercentage(uint8_t percentage) { +bool ZigbeeEP::setBatteryPercentage(uint8_t percentage) { // 100% = 200 in decimal, 0% = 0 // Convert percentage to 0-200 range + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; if (percentage > 100) { percentage = 100; } percentage = percentage * 2; esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_set_attribute_val( + ret = esp_zb_zcl_set_attribute_val( _endpoint, ESP_ZB_ZCL_CLUSTER_ID_POWER_CONFIG, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID, &percentage, false ); esp_zb_lock_release(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set battery percentage: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } log_v("Battery percentage updated"); + return true; } -void ZigbeeEP::reportBatteryPercentage() { +bool ZigbeeEP::reportBatteryPercentage() { /* 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; @@ -107,9 +131,14 @@ void ZigbeeEP::reportBatteryPercentage() { report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to report battery percentage: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } log_v("Battery percentage reported"); + return true; } char *ZigbeeEP::readManufacturer(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr) { @@ -134,7 +163,9 @@ char *ZigbeeEP::readManufacturer(uint8_t endpoint, uint16_t short_addr, esp_zb_i read_req.attr_number = ZB_ARRAY_LENTH(attributes); read_req.attr_field = attributes; - // clear read manufacturer + if (_read_manufacturer != nullptr) { + free(_read_manufacturer); + } _read_manufacturer = nullptr; esp_zb_lock_acquire(portMAX_DELAY); @@ -170,7 +201,9 @@ char *ZigbeeEP::readModel(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_add read_req.attr_number = ZB_ARRAY_LENTH(attributes); read_req.attr_field = attributes; - // clear read model + if (_read_model != nullptr) { + free(_read_model); + } _read_model = nullptr; esp_zb_lock_acquire(portMAX_DELAY); @@ -240,7 +273,7 @@ void ZigbeeEP::zbIdentify(const esp_zb_zcl_set_attr_value_message_t *message) { } } -void ZigbeeEP::addTimeCluster(tm time, int32_t gmt_offset) { +bool ZigbeeEP::addTimeCluster(tm time, int32_t gmt_offset) { time_t utc_time = 0; // Check if time is set if (time.tm_year > 0) { @@ -250,28 +283,63 @@ void ZigbeeEP::addTimeCluster(tm time, int32_t gmt_offset) { // 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); - esp_zb_time_cluster_add_attr(time_cluster_server, ESP_ZB_ZCL_ATTR_TIME_TIME_STATUS_ID, (void *)&_time_status); + esp_err_t ret = esp_zb_time_cluster_add_attr(time_cluster_server, ESP_ZB_ZCL_ATTR_TIME_TIME_ZONE_ID, (void *)&gmt_offset); + if (ret != ESP_OK) { + log_e("Failed to add time zone attribute: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_time_cluster_add_attr(time_cluster_server, ESP_ZB_ZCL_ATTR_TIME_TIME_ID, (void *)&utc_time); + if (ret != ESP_OK) { + log_e("Failed to add time attribute: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_time_cluster_add_attr(time_cluster_server, ESP_ZB_ZCL_ATTR_TIME_TIME_STATUS_ID, (void *)&_time_status); + if (ret != ESP_OK) { + log_e("Failed to add time status attribute: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } // 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); + ret = esp_zb_cluster_list_add_time_cluster(_cluster_list, time_cluster_server, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + if (ret != ESP_OK) { + log_e("Failed to add time cluster (server role): 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_list_add_time_cluster(_cluster_list, time_cluster_client, ESP_ZB_ZCL_CLUSTER_CLIENT_ROLE); + if (ret != ESP_OK) { + log_e("Failed to add time cluster (client role): 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeEP::setTime(tm time) { +bool ZigbeeEP::setTime(tm time) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; time_t utc_time = mktime(&time); log_d("Setting time to %lld", utc_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); + ret = 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(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set time: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; } -void ZigbeeEP::setTimezone(int32_t gmt_offset) { +bool ZigbeeEP::setTimezone(int32_t gmt_offset) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; + log_d("Setting timezone to %d", 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); + ret = + 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(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set timezone: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; } tm ZigbeeEP::getTime(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_addr_t ieee_addr) { @@ -390,7 +458,7 @@ void ZigbeeEP::zbReadTimeCluster(const esp_zb_zcl_attribute_t *attribute) { // uint8_t max_data_size; /*!< The maximum size of OTA data */ // } esp_zb_zcl_ota_upgrade_client_variable_t; -void ZigbeeEP::addOTAClient( +bool 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 ) { @@ -410,11 +478,27 @@ void ZigbeeEP::addOTAClient( 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)); + esp_err_t ret = esp_zb_ota_cluster_add_attr(ota_cluster, ESP_ZB_ZCL_ATTR_OTA_UPGRADE_CLIENT_DATA_ID, (void *)&variable_config); + if (ret != ESP_OK) { + log_e("Failed to add OTA client data: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_ota_cluster_add_attr(ota_cluster, ESP_ZB_ZCL_ATTR_OTA_UPGRADE_SERVER_ADDR_ID, (void *)&ota_upgrade_server_addr); + if (ret != ESP_OK) { + log_e("Failed to add OTA server address: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_ota_cluster_add_attr(ota_cluster, ESP_ZB_ZCL_ATTR_OTA_UPGRADE_SERVER_ENDPOINT_ID, (void *)&ota_upgrade_server_ep); + if (ret != ESP_OK) { + log_e("Failed to add OTA server endpoint: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_list_add_ota_cluster(_cluster_list, ota_cluster, ESP_ZB_ZCL_CLUSTER_CLIENT_ROLE); + if (ret != ESP_OK) { + log_e("Failed to add OTA cluster: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } static void findOTAServer(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx) { @@ -445,4 +529,42 @@ void ZigbeeEP::requestOTAUpdate() { esp_zb_lock_release(); } +const char *ZigbeeEP::esp_zb_zcl_status_to_name(esp_zb_zcl_status_t status) { + switch (status) { + case ESP_ZB_ZCL_STATUS_SUCCESS: return "Success"; + case ESP_ZB_ZCL_STATUS_FAIL: return "Fail"; + case ESP_ZB_ZCL_STATUS_NOT_AUTHORIZED: return "Not authorized"; + case ESP_ZB_ZCL_STATUS_MALFORMED_CMD: return "Malformed command"; + case ESP_ZB_ZCL_STATUS_UNSUP_CLUST_CMD: return "Unsupported cluster command"; + case ESP_ZB_ZCL_STATUS_UNSUP_GEN_CMD: return "Unsupported general command"; + case ESP_ZB_ZCL_STATUS_UNSUP_MANUF_CLUST_CMD: return "Unsupported manufacturer cluster command"; + case ESP_ZB_ZCL_STATUS_UNSUP_MANUF_GEN_CMD: return "Unsupported manufacturer general command"; + case ESP_ZB_ZCL_STATUS_INVALID_FIELD: return "Invalid field"; + case ESP_ZB_ZCL_STATUS_UNSUP_ATTRIB: return "Unsupported attribute"; + case ESP_ZB_ZCL_STATUS_INVALID_VALUE: return "Invalid value"; + case ESP_ZB_ZCL_STATUS_READ_ONLY: return "Read only"; + case ESP_ZB_ZCL_STATUS_INSUFF_SPACE: return "Insufficient space"; + case ESP_ZB_ZCL_STATUS_DUPE_EXISTS: return "Duplicate exists"; + case ESP_ZB_ZCL_STATUS_NOT_FOUND: return "Not found"; + case ESP_ZB_ZCL_STATUS_UNREPORTABLE_ATTRIB: return "Unreportable attribute"; + case ESP_ZB_ZCL_STATUS_INVALID_TYPE: return "Invalid type"; + case ESP_ZB_ZCL_STATUS_WRITE_ONLY: return "Write only"; + case ESP_ZB_ZCL_STATUS_INCONSISTENT: return "Inconsistent"; + case ESP_ZB_ZCL_STATUS_ACTION_DENIED: return "Action denied"; + case ESP_ZB_ZCL_STATUS_TIMEOUT: return "Timeout"; + case ESP_ZB_ZCL_STATUS_ABORT: return "Abort"; + case ESP_ZB_ZCL_STATUS_INVALID_IMAGE: return "Invalid OTA upgrade image"; + case ESP_ZB_ZCL_STATUS_WAIT_FOR_DATA: return "Server does not have data block available yet"; + case ESP_ZB_ZCL_STATUS_NO_IMAGE_AVAILABLE: return "No image available"; + case ESP_ZB_ZCL_STATUS_REQUIRE_MORE_IMAGE: return "Require more image"; + case ESP_ZB_ZCL_STATUS_NOTIFICATION_PENDING: return "Notification pending"; + case ESP_ZB_ZCL_STATUS_HW_FAIL: return "Hardware failure"; + case ESP_ZB_ZCL_STATUS_SW_FAIL: return "Software failure"; + case ESP_ZB_ZCL_STATUS_CALIB_ERR: return "Calibration error"; + case ESP_ZB_ZCL_STATUS_UNSUP_CLUST: return "Cluster is not found on the target endpoint"; + case ESP_ZB_ZCL_STATUS_LIMIT_REACHED: return "Limit reached"; + default: return "Unknown status"; + } +} + #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index 0a4e3e9d252..bd142344929 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -70,21 +70,21 @@ class ZigbeeEP { } // Set Manufacturer name and model - void setManufacturerAndModel(const char *name, const char *model); + bool setManufacturerAndModel(const char *name, const char *model); // 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(); + bool setPowerSource(zb_power_source_t power_source, uint8_t percentage = 255); + bool setBatteryPercentage(uint8_t percentage); + bool reportBatteryPercentage(); // Set time - void addTimeCluster(tm time = {}, int32_t gmt_offset = 0); // gmt offset in seconds - void setTime(tm time); - void setTimezone(int32_t gmt_offset); + bool addTimeCluster(tm time = {}, int32_t gmt_offset = 0); // gmt offset in seconds + bool setTime(tm time); + bool 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}); @@ -104,8 +104,9 @@ class ZigbeeEP { * @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). + * @return true if the OTA client was added successfully, false otherwise. */ - void addOTAClient( + bool 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 ); @@ -114,10 +115,10 @@ class ZigbeeEP { */ void requestOTAUpdate(); - // findEndpoind may be implemented by EPs to find and bind devices + // findEndpoint may be implemented by EPs to find and bind devices virtual void findEndpoint(esp_zb_zdo_match_desc_req_param_t *cmd_req) {}; - //list of all handlers function calls, to be override by EPs implementation + // list of all handlers function calls, to be override by EPs implementation virtual void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) {}; 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 @@ -144,6 +145,9 @@ class ZigbeeEP { int32_t _read_timezone; protected: + // Convert ZCL status to name + const char *esp_zb_zcl_status_to_name(esp_zb_zcl_status_t status); + uint8_t _endpoint; esp_zb_ha_standard_devices_t _device_id; esp_zb_endpoint_config_t _ep_config; diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp index 417eeb6d98c..a95668b7afe 100644 --- a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp @@ -1,38 +1,35 @@ #include "ZigbeeAnalog.h" #if CONFIG_ZB_ENABLED -esp_zb_cluster_list_t *zigbee_analog_clusters_create(zigbee_analog_cfg_t *analog_sensor) { - esp_zb_basic_cluster_cfg_t *basic_cfg = analog_sensor ? &(analog_sensor->basic_cfg) : NULL; - esp_zb_identify_cluster_cfg_t *identify_cfg = analog_sensor ? &(analog_sensor->identify_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); - return cluster_list; -} - ZigbeeAnalog::ZigbeeAnalog(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID; - //Create custom analog sensor configuration - zigbee_analog_cfg_t analog_cfg = ZIGBEE_DEFAULT_ANALOG_CONFIG(); - _cluster_list = zigbee_analog_clusters_create(&analog_cfg); + //Create basic analog sensor clusters without configuration + _cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(_cluster_list, esp_zb_basic_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(_cluster_list, esp_zb_identify_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); _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 ZigbeeAnalog::addAnalogValue() { - esp_zb_cluster_list_add_analog_value_cluster(_cluster_list, esp_zb_analog_value_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - _analog_clusters |= ANALOG_VALUE; -} - -void ZigbeeAnalog::addAnalogInput() { - esp_zb_cluster_list_add_analog_input_cluster(_cluster_list, esp_zb_analog_input_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); +bool ZigbeeAnalog::addAnalogInput() { + esp_err_t ret = esp_zb_cluster_list_add_analog_input_cluster(_cluster_list, esp_zb_analog_input_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + if (ret != ESP_OK) { + log_e("Failed to add Analog Input cluster: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } _analog_clusters |= ANALOG_INPUT; + return true; } -void ZigbeeAnalog::addAnalogOutput() { - esp_zb_cluster_list_add_analog_output_cluster(_cluster_list, esp_zb_analog_output_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); +bool ZigbeeAnalog::addAnalogOutput() { + esp_err_t ret = esp_zb_cluster_list_add_analog_output_cluster(_cluster_list, esp_zb_analog_output_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + if (ret != ESP_OK) { + log_e("Failed to add Analog Output cluster: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } _analog_clusters |= ANALOG_OUTPUT; + return true; } //set attribute method -> method overridden in child class @@ -57,35 +54,26 @@ void ZigbeeAnalog::analogOutputChanged(float analog_output) { } } -void ZigbeeAnalog::setAnalogValue(float analog) { - if (!(_analog_clusters & ANALOG_VALUE)) { - log_e("Analog Value cluster not added"); - return; - } - // float zb_analog = analog; - log_d("Setting analog value to %.1f", analog); - esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_set_attribute_val( - _endpoint, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_VALUE, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ANALOG_VALUE_PRESENT_VALUE_ID, &analog, false - ); - esp_zb_lock_release(); -} - -void ZigbeeAnalog::setAnalogInput(float analog) { +bool ZigbeeAnalog::setAnalogInput(float analog) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; if (!(_analog_clusters & ANALOG_INPUT)) { log_e("Analog Input cluster not added"); - return; + return false; } - // float zb_analog = analog; log_d("Setting analog input to %.1f", analog); esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_set_attribute_val( + ret = esp_zb_zcl_set_attribute_val( _endpoint, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_INPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ANALOG_INPUT_PRESENT_VALUE_ID, &analog, false ); esp_zb_lock_release(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set analog input: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; } -void ZigbeeAnalog::reportAnalogInput() { +bool ZigbeeAnalog::reportAnalogInput() { /* 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; @@ -96,12 +84,17 @@ void ZigbeeAnalog::reportAnalogInput() { report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send Analog Input report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } log_v("Analog Input report sent"); + return true; } -void ZigbeeAnalog::setAnalogInputReporting(uint16_t min_interval, uint16_t max_interval, float delta) { +bool ZigbeeAnalog::setAnalogInputReporting(uint16_t min_interval, uint16_t max_interval, float delta) { 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; @@ -118,8 +111,13 @@ void ZigbeeAnalog::setAnalogInputReporting(uint16_t min_interval, uint16_t max_i 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_err_t ret = esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to set Analog Input reporting: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.h b/libraries/Zigbee/src/ep/ZigbeeAnalog.h index 8993c6ea1a4..03fbc678b6e 100644 --- a/libraries/Zigbee/src/ep/ZigbeeAnalog.h +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.h @@ -9,32 +9,15 @@ #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" -// clang-format off -#define ZIGBEE_DEFAULT_ANALOG_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, \ - }, \ - } -// clang-format on - //enum for bits set to check what analog cluster were added enum zigbee_analog_clusters { - ANALOG_VALUE = 1, - ANALOG_INPUT = 2, - ANALOG_OUTPUT = 4 + ANALOG_INPUT = 1, + ANALOG_OUTPUT = 2 }; typedef struct zigbee_analog_cfg_s { esp_zb_basic_cluster_cfg_t basic_cfg; esp_zb_identify_cluster_cfg_t identify_cfg; - esp_zb_analog_value_cluster_cfg_t analog_value_cfg; esp_zb_analog_output_cluster_cfg_t analog_output_cfg; esp_zb_analog_input_cluster_cfg_t analog_input_cfg; } zigbee_analog_cfg_t; @@ -45,24 +28,22 @@ class ZigbeeAnalog : public ZigbeeEP { ~ZigbeeAnalog() {} // Add analog clusters - void addAnalogValue(); - void addAnalogInput(); - void addAnalogOutput(); + bool addAnalogInput(); + bool addAnalogOutput(); // Use to set a cb function to be called on analog output change void onAnalogOutputChange(void (*callback)(float analog)) { _on_analog_output_change = callback; } - // Set the analog value / input - void setAnalogValue(float analog); - void setAnalogInput(float analog); + // Set the analog input value + bool setAnalogInput(float analog); - // Report Analog Input - void reportAnalogInput(); + // Report Analog Input value + bool reportAnalogInput(); // Set reporting for Analog Input - void setAnalogInputReporting(uint16_t min_interval, uint16_t max_interval, float delta); + bool setAnalogInputReporting(uint16_t min_interval, uint16_t max_interval, float delta); private: void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override; diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp index 2718d9275c2..2b8271f09a9 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp @@ -24,25 +24,39 @@ ZigbeeCarbonDioxideSensor::ZigbeeCarbonDioxideSensor(uint8_t endpoint) : ZigbeeE _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) { +bool 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); + esp_err_t ret = esp_zb_cluster_update_attr(carbon_dioxide_measure_cluster, ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&zb_min); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(carbon_dioxide_measure_cluster, ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&zb_max); + if (ret != ESP_OK) { + log_e("Failed to set max value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeCarbonDioxideSensor::setTolerance(float tolerance) { +bool 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_carbon_dioxide_measurement_cluster_add_attr( + esp_err_t ret = esp_zb_carbon_dioxide_measurement_cluster_add_attr( carbon_dioxide_measure_cluster, ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance ); + if (ret != ESP_OK) { + log_e("Failed to set tolerance: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) { +bool ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) { 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; @@ -60,24 +74,35 @@ void ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max 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_err_t ret = esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to set reporting: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeCarbonDioxideSensor::setCarbonDioxide(float carbon_dioxide) { +bool ZigbeeCarbonDioxideSensor::setCarbonDioxide(float carbon_dioxide) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; 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( + ret = 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(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set carbon dioxide: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; } -void ZigbeeCarbonDioxideSensor::report() { +bool 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; @@ -88,9 +113,14 @@ void ZigbeeCarbonDioxideSensor::report() { report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send carbon dioxide report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } log_v("Carbon dioxide report sent"); + return true; } #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h index 41a9a4fb355..e0a6de48648 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h @@ -42,20 +42,20 @@ class ZigbeeCarbonDioxideSensor : public ZigbeeEP { ~ZigbeeCarbonDioxideSensor() {} // Set the carbon dioxide value in ppm - void setCarbonDioxide(float carbon_dioxide); + bool setCarbonDioxide(float carbon_dioxide); // Set the min and max value for the carbon dioxide sensor in ppm - void setMinMaxValue(float min, float max); + bool setMinMaxValue(float min, float max); // Set the tolerance value for the carbon dioxide sensor in ppm - void setTolerance(float tolerance); + bool 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); + bool setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta); // Report the carbon dioxide value - void report(); + bool report(); }; #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp index 585b1549816..caac73b5c68 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp @@ -117,7 +117,8 @@ void ZigbeeColorDimmableLight::lightChanged() { } } -void ZigbeeColorDimmableLight::setLight(bool state, uint8_t level, uint8_t red, uint8_t green, uint8_t blue) { +bool ZigbeeColorDimmableLight::setLight(bool state, uint8_t level, uint8_t red, uint8_t green, uint8_t blue) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; //Update all attributes _current_state = state; _current_level = level; @@ -126,55 +127,83 @@ void ZigbeeColorDimmableLight::setLight(bool state, uint8_t level, uint8_t red, espXyColor_t xy_color = espRgbColorToXYColor(_current_color); espHsvColor_t hsv_color = espRgbColorToHsvColor(_current_color); + uint8_t hue = (uint8_t)hsv_color.h; 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 - esp_zb_zcl_set_attribute_val( + ret = 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 ); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set light state: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } //set level - esp_zb_zcl_set_attribute_val( + ret = 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 xy color - esp_zb_zcl_set_attribute_val( + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set light level: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } + //set x color + ret = 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( + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set light xy color: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } + //set y color + ret = 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, &xy_color.y, false ); - //set hsv color - uint8_t hue = (uint8_t)hsv_color.h; - esp_zb_zcl_set_attribute_val( + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set light y color: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } + //set hue + ret = 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_HUE_ID, &hue, false ); - esp_zb_zcl_set_attribute_val( + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set light hue: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } + //set saturation + ret = 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 ); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set light saturation: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } +unlock_and_return: esp_zb_lock_release(); + return ret == ESP_ZB_ZCL_STATUS_SUCCESS; } -void ZigbeeColorDimmableLight::setLightState(bool state) { - setLight(state, _current_level, _current_color.r, _current_color.g, _current_color.b); +bool ZigbeeColorDimmableLight::setLightState(bool state) { + return setLight(state, _current_level, _current_color.r, _current_color.g, _current_color.b); } -void ZigbeeColorDimmableLight::setLightLevel(uint8_t level) { - setLight(_current_state, level, _current_color.r, _current_color.g, _current_color.b); +bool ZigbeeColorDimmableLight::setLightLevel(uint8_t level) { + return 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); +bool ZigbeeColorDimmableLight::setLightColor(uint8_t red, uint8_t green, uint8_t blue) { + return 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); +bool ZigbeeColorDimmableLight::setLightColor(espRgbColor_t rgb_color) { + return setLight(_current_state, _current_level, rgb_color.r, rgb_color.g, rgb_color.b); } -void ZigbeeColorDimmableLight::setLightColor(espHsvColor_t hsv_color) { +bool 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); + return setLight(_current_state, _current_level, rgb_color.r, rgb_color.g, rgb_color.b); } #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h index 64df3565793..6681f213ad0 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h @@ -62,12 +62,12 @@ 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 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 setLightState(bool state); + bool setLightLevel(uint8_t level); + bool setLightColor(uint8_t red, uint8_t green, uint8_t blue); + bool setLightColor(espRgbColor_t rgb_color); + bool setLightColor(espHsvColor_t hsv_color); + bool setLight(bool state, uint8_t level, uint8_t red, uint8_t green, uint8_t blue); bool getLightState() { return _current_state; diff --git a/libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp b/libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp index 6237315d5d9..ced8e43d6ea 100644 --- a/libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp @@ -29,29 +29,39 @@ void ZigbeeContactSwitch::setIASClientEndpoint(uint8_t ep_number) { _ias_cie_endpoint = ep_number; } -void ZigbeeContactSwitch::setClosed() { +bool 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( + esp_err_t ret = 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(); + if (ret != ESP_OK) { + log_e("Failed to set contact switch to closed: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } _zone_status = closed; - report(); + return report(); } -void ZigbeeContactSwitch::setOpen() { +bool 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_err_t ret = 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(); + if (ret != ESP_OK) { + log_e("Failed to set contact switch to open: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } _zone_status = open; - report(); + return report(); } -void ZigbeeContactSwitch::report() { +bool ZigbeeContactSwitch::report() { /* Send IAS Zone status changed notification command */ esp_zb_zcl_ias_zone_status_change_notif_cmd_t status_change_notif_cmd; @@ -66,9 +76,14 @@ void ZigbeeContactSwitch::report() { 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_err_t ret = esp_zb_zcl_ias_zone_status_change_notif_cmd_req(&status_change_notif_cmd); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send IAS Zone status changed notification: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } log_v("IAS Zone status changed notification sent"); + return true; } void ZigbeeContactSwitch::zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) { diff --git a/libraries/Zigbee/src/ep/ZigbeeContactSwitch.h b/libraries/Zigbee/src/ep/ZigbeeContactSwitch.h index f44ce1cec40..b33effd8dfc 100644 --- a/libraries/Zigbee/src/ep/ZigbeeContactSwitch.h +++ b/libraries/Zigbee/src/ep/ZigbeeContactSwitch.h @@ -48,13 +48,13 @@ class ZigbeeContactSwitch : public ZigbeeEP { void setIASClientEndpoint(uint8_t ep_number); // Set the contact switch value to closed - void setClosed(); + bool setClosed(); // Set the contact switch value to open - void setOpen(); + bool setOpen(); // Report the contact switch value, done automatically after setting the position - void report(); + bool report(); private: void zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) override; diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp index 34622d1d2db..05a7e5ad6c1 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp @@ -1,4 +1,3 @@ - #include "ZigbeeDimmableLight.h" #if CONFIG_ZB_ENABLED @@ -52,7 +51,8 @@ void ZigbeeDimmableLight::lightChanged() { } } -void ZigbeeDimmableLight::setLight(bool state, uint8_t level) { +bool ZigbeeDimmableLight::setLight(bool state, uint8_t level) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; // Update all attributes _current_state = state; _current_level = level; @@ -62,22 +62,32 @@ void ZigbeeDimmableLight::setLight(bool state, uint8_t level) { /* Update light clusters */ esp_zb_lock_acquire(portMAX_DELAY); // set on/off state - esp_zb_zcl_set_attribute_val( + ret = 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 ); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set light state: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } // set level - esp_zb_zcl_set_attribute_val( + ret = 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 ); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set light level: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } +unlock_and_return: esp_zb_lock_release(); + return ret == ESP_ZB_ZCL_STATUS_SUCCESS; } -void ZigbeeDimmableLight::setLightState(bool state) { - setLight(state, _current_level); +bool ZigbeeDimmableLight::setLightState(bool state) { + return setLight(state, _current_level); } -void ZigbeeDimmableLight::setLightLevel(uint8_t level) { - setLight(_current_state, level); +bool ZigbeeDimmableLight::setLightLevel(uint8_t level) { + return setLight(_current_state, level); } esp_zb_cluster_list_t *ZigbeeDimmableLight::zigbee_dimmable_light_clusters_create(zigbee_dimmable_light_cfg_t *light_cfg) { diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h index 45c3e97c00b..747fdbafaef 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h @@ -76,9 +76,9 @@ class ZigbeeDimmableLight : public ZigbeeEP { lightChanged(); } - void setLightState(bool state); - void setLightLevel(uint8_t level); - void setLight(bool state, uint8_t level); + bool setLightState(bool state); + bool setLightLevel(uint8_t level); + bool setLight(bool state, uint8_t level); bool getLightState() { return _current_state; @@ -89,7 +89,6 @@ class ZigbeeDimmableLight : public ZigbeeEP { 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); diff --git a/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp b/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp index 70008fbab10..c5b62ee2b75 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp @@ -29,41 +29,58 @@ void ZigbeeDoorWindowHandle::setIASClientEndpoint(uint8_t ep_number) { _ias_cie_endpoint = ep_number; } -void ZigbeeDoorWindowHandle::setClosed() { +bool ZigbeeDoorWindowHandle::setClosed() { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; 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( + ret = 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(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set door/window handle to closed: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } _zone_status = closed; - report(); + return report(); } -void ZigbeeDoorWindowHandle::setOpen() { +bool ZigbeeDoorWindowHandle::setOpen() { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; 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); + ret = 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(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set door/window handle to open: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } _zone_status = open; - report(); + return report(); } -void ZigbeeDoorWindowHandle::setTilted() { +bool ZigbeeDoorWindowHandle::setTilted() { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; 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( + ret = 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(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set door/window handle to tilted: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } _zone_status = tilted; - report(); + return report(); } -void ZigbeeDoorWindowHandle::report() { +bool ZigbeeDoorWindowHandle::report() { /* Send IAS Zone status changed notification command */ esp_zb_zcl_ias_zone_status_change_notif_cmd_t status_change_notif_cmd; @@ -77,10 +94,12 @@ void ZigbeeDoorWindowHandle::report() { status_change_notif_cmd.zone_id = _zone_id; status_change_notif_cmd.delay = 0; + //NOTE: Check result of esp_zb_zcl_ias_zone_status_change_notif_cmd_req() and return true if success, false if failure 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"); + return true; } void ZigbeeDoorWindowHandle::zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) { diff --git a/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.h b/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.h index 8d4eff9e45a..efffd34b12f 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.h +++ b/libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.h @@ -49,16 +49,16 @@ class ZigbeeDoorWindowHandle : public ZigbeeEP { void setIASClientEndpoint(uint8_t ep_number); // Set the door/window handle value to closed - void setClosed(); + bool setClosed(); // Set the door/window handle value to open - void setOpen(); + bool setOpen(); // Set the door/window handle value to tilted - void setTilted(); + bool setTilted(); // Report the door/window handle value, done automatically after setting the position - void report(); + bool report(); private: void zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) override; diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp index 11fbf7c906b..8a60af5a8e1 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp @@ -22,24 +22,37 @@ ZigbeeFlowSensor::ZigbeeFlowSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { _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) { +bool 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); + esp_err_t ret = esp_zb_cluster_update_attr(flow_measure_cluster, ESP_ZB_ZCL_ATTR_FLOW_MEASUREMENT_MIN_VALUE_ID, (void *)&zb_min); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(flow_measure_cluster, ESP_ZB_ZCL_ATTR_FLOW_MEASUREMENT_MAX_VALUE_ID, (void *)&zb_max); + if (ret != ESP_OK) { + log_e("Failed to set max value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeFlowSensor::setTolerance(float tolerance) { - // Convert tolerance to ZCL uint16_t +bool ZigbeeFlowSensor::setTolerance(float tolerance) { 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); + esp_err_t ret = esp_zb_flow_meas_cluster_add_attr(flow_measure_cluster, ESP_ZB_ZCL_ATTR_FLOW_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); + if (ret != ESP_OK) { + log_e("Failed to set tolerance: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeFlowSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { +bool ZigbeeFlowSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { 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; @@ -54,24 +67,39 @@ void ZigbeeFlowSensor::setReporting(uint16_t min_interval, uint16_t 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_err_t ret = esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); + + if (ret != ESP_OK) { + log_e("Failed to set reporting: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeFlowSensor::setFlow(float flow) { +bool ZigbeeFlowSensor::setFlow(float flow) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; 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( + ret = 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(); + + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set flow value: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; } -void ZigbeeFlowSensor::report() { +bool 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; @@ -82,9 +110,15 @@ void ZigbeeFlowSensor::report() { report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); esp_zb_lock_release(); + + if (ret != ESP_OK) { + log_e("Failed to send flow report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } log_v("Flow report sent"); + return true; } #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h index 5e9e20e4d1a..fa16b4a5636 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h @@ -42,19 +42,19 @@ class ZigbeeFlowSensor : public ZigbeeEP { ~ZigbeeFlowSensor() {} // Set the flow value in 0,1 m3/h - void setFlow(float value); + bool setFlow(float value); // Set the min and max value for the flow sensor in 0,1 m3/h - void setMinMaxValue(float min, float max); + bool setMinMaxValue(float min, float max); // Set the tolerance value for the flow sensor in 0,01 m3/h - void setTolerance(float tolerance); + bool setTolerance(float tolerance); // 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); + bool setReporting(uint16_t min_interval, uint16_t max_interval, float delta); // Report the flow value - void report(); + bool report(); }; #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp index d38e9b1065f..f1661c3a026 100644 --- a/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp @@ -10,20 +10,34 @@ ZigbeeIlluminanceSensor::ZigbeeIlluminanceSensor(uint8_t endpoint) : ZigbeeEP(en _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_LIGHT_SENSOR_DEVICE_ID, .app_device_version = 0}; } -void ZigbeeIlluminanceSensor::setMinMaxValue(uint16_t min, uint16_t max) { +bool ZigbeeIlluminanceSensor::setMinMaxValue(uint16_t min, uint16_t max) { esp_zb_attribute_list_t *light_measure_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_update_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&min); - esp_zb_cluster_update_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&max); + esp_err_t ret = esp_zb_cluster_update_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&min); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&max); + if (ret != ESP_OK) { + log_e("Failed to set max value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeIlluminanceSensor::setTolerance(uint16_t tolerance) { +bool ZigbeeIlluminanceSensor::setTolerance(uint16_t tolerance) { esp_zb_attribute_list_t *light_measure_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_illuminance_meas_cluster_add_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_TOLERANCE_ID, (void *)&tolerance); + esp_err_t ret = esp_zb_illuminance_meas_cluster_add_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_TOLERANCE_ID, (void *)&tolerance); + if (ret != ESP_OK) { + log_e("Failed to set tolerance: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeIlluminanceSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) { +bool ZigbeeIlluminanceSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) { 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; @@ -38,24 +52,37 @@ void ZigbeeIlluminanceSensor::setReporting(uint16_t min_interval, uint16_t max_i 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_err_t ret = esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); + + if (ret != ESP_OK) { + log_e("Failed to set reporting: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeIlluminanceSensor::setIlluminance(uint16_t illuminanceValue) { +bool ZigbeeIlluminanceSensor::setIlluminance(uint16_t illuminanceValue) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; log_v("Updating Illuminance..."); /* Update illuminance sensor measured illuminance */ log_d("Setting Illuminance to %d", illuminanceValue); esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_set_attribute_val( + ret = esp_zb_zcl_set_attribute_val( _endpoint, ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MEASURED_VALUE_ID, &illuminanceValue, false ); esp_zb_lock_release(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set illuminance: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; } -void ZigbeeIlluminanceSensor::report() { +bool ZigbeeIlluminanceSensor::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; @@ -66,9 +93,14 @@ void ZigbeeIlluminanceSensor::report() { report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send illuminance report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } log_v("Illuminance report sent"); + return true; } #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.h b/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.h index 9c9d9e3fcaf..133dfc315db 100644 --- a/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.h @@ -33,19 +33,19 @@ class ZigbeeIlluminanceSensor : public ZigbeeEP { ~ZigbeeIlluminanceSensor() {} // Set the illuminance value - void setIlluminance(uint16_t value); + bool setIlluminance(uint16_t value); // Set the min and max value for the illuminance sensor - void setMinMaxValue(uint16_t min, uint16_t max); + bool setMinMaxValue(uint16_t min, uint16_t max); // Set the tolerance value for the illuminance sensor - void setTolerance(uint16_t tolerance); + bool setTolerance(uint16_t tolerance); // Set the reporting interval for illuminance measurement in seconds and delta - void setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta); + bool setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta); // Report the illuminance value - void report(); + bool report(); }; #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeLight.cpp b/libraries/Zigbee/src/ep/ZigbeeLight.cpp index 2a87db71287..edfac04fcdf 100644 --- a/libraries/Zigbee/src/ep/ZigbeeLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeLight.cpp @@ -33,17 +33,24 @@ void ZigbeeLight::lightChanged() { } } -void ZigbeeLight::setLight(bool state) { +bool ZigbeeLight::setLight(bool state) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; _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( + ret = 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(); + + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set light state: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; } #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeLight.h b/libraries/Zigbee/src/ep/ZigbeeLight.h index 807802be9b3..773fbb14ec5 100644 --- a/libraries/Zigbee/src/ep/ZigbeeLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeLight.h @@ -23,7 +23,7 @@ class ZigbeeLight : public ZigbeeEP { lightChanged(); } // Use to control light state - void setLight(bool state); + bool setLight(bool state); // Use to get light state bool getLightState() { return _current_state; diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp index 31a1f7e90e1..b8f88fed4a4 100644 --- a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp @@ -22,26 +22,41 @@ ZigbeeOccupancySensor::ZigbeeOccupancySensor(uint8_t endpoint) : ZigbeeEP(endpoi _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) { +bool 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); + esp_err_t ret = esp_zb_cluster_update_attr(occupancy_sens_cluster, ESP_ZB_ZCL_ATTR_OCCUPANCY_SENSING_OCCUPANCY_SENSOR_TYPE_ID, (void *)&sensor_type); + if (ret != ESP_OK) { + log_e("Failed to set sensor type: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(occupancy_sens_cluster, ESP_ZB_ZCL_ATTR_OCCUPANCY_SENSING_OCCUPANCY_SENSOR_TYPE_BITMAP_ID, (void *)&sensor_type_bitmap); + if (ret != ESP_OK) { + log_e("Failed to set sensor type bitmap: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeOccupancySensor::setOccupancy(bool occupied) { +bool ZigbeeOccupancySensor::setOccupancy(bool occupied) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; 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( + ret = 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(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set occupancy: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; } -void ZigbeeOccupancySensor::report() { +bool 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; @@ -52,9 +67,14 @@ void ZigbeeOccupancySensor::report() { report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send occupancy report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } log_v("Occupancy report sent"); + return true; } #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h index fa622d5a707..7408e10a76b 100644 --- a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h @@ -42,13 +42,13 @@ class ZigbeeOccupancySensor : public ZigbeeEP { ~ZigbeeOccupancySensor() {} // Set the occupancy value. True for occupied, false for unoccupied - void setOccupancy(bool occupied); + bool setOccupancy(bool occupied); // Set the sensor type, see esp_zb_zcl_occupancy_sensing_occupancy_sensor_type_t - void setSensorType(uint8_t sensor_type); + bool setSensorType(uint8_t sensor_type); // Report the occupancy value - void report(); + bool report(); }; #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp index 21456a51511..bca06a35d0c 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp @@ -22,21 +22,33 @@ ZigbeePressureSensor::ZigbeePressureSensor(uint8_t endpoint) : ZigbeeEP(endpoint _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) { - +bool 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); + esp_err_t ret = esp_zb_cluster_update_attr(pressure_measure_cluster, ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_MIN_VALUE_ID, (void *)&min); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(pressure_measure_cluster, ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_MAX_VALUE_ID, (void *)&max); + if (ret != ESP_OK) { + log_e("Failed to set max value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeePressureSensor::setTolerance(uint16_t tolerance) { +bool 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_pressure_meas_cluster_add_attr(pressure_measure_cluster, ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_TOLERANCE_ID, (void *)&tolerance); + esp_err_t ret = esp_zb_pressure_meas_cluster_add_attr(pressure_measure_cluster, ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_TOLERANCE_ID, (void *)&tolerance); + if (ret != ESP_OK) { + log_e("Failed to set tolerance: 0x%x: %s", ret, esp_err_to_name(ret)); + } + return ret == ESP_OK; } -void ZigbeePressureSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) { +bool ZigbeePressureSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) { 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; @@ -52,22 +64,33 @@ void ZigbeePressureSensor::setReporting(uint16_t min_interval, uint16_t max_inte 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_err_t ret = esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to set reporting: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeePressureSensor::setPressure(int16_t pressure) { +bool ZigbeePressureSensor::setPressure(int16_t pressure) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; log_v("Updating pressure sensor value..."); /* Update pressure sensor measured value */ log_d("Setting pressure to %d hPa", pressure); esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_set_attribute_val( + ret = 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(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set pressure: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; } -void ZigbeePressureSensor::report() { +bool 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; @@ -78,9 +101,14 @@ void ZigbeePressureSensor::report() { report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send pressure report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } log_v("Pressure report sent"); + return true; } #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h index db14dd1c341..f93df7a7411 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h @@ -42,19 +42,19 @@ class ZigbeePressureSensor : public ZigbeeEP { ~ZigbeePressureSensor() {} // Set the pressure value in 1 hPa - void setPressure(int16_t value); + bool setPressure(int16_t value); // Set the min and max value for the pressure sensor in 1 hPa - void setMinMaxValue(int16_t min, int16_t max); + bool setMinMaxValue(int16_t min, int16_t max); // Set the tolerance value for the pressure sensor in 1 hPa - void setTolerance(uint16_t tolerance); + bool setTolerance(uint16_t tolerance); // 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); + bool setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta); // Report the pressure value - void report(); + bool report(); }; #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp index b3ff03f0a6b..7126dae15cf 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp @@ -17,24 +17,38 @@ static int16_t zb_float_to_s16(float temp) { return (int16_t)(temp * 100); } -void ZigbeeTempSensor::setMinMaxValue(float min, float max) { +bool ZigbeeTempSensor::setMinMaxValue(float min, float max) { int16_t zb_min = zb_float_to_s16(min); int16_t zb_max = zb_float_to_s16(max); esp_zb_attribute_list_t *temp_measure_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_update_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MIN_VALUE_ID, (void *)&zb_min); - esp_zb_cluster_update_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MAX_VALUE_ID, (void *)&zb_max); + esp_err_t ret = esp_zb_cluster_update_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MIN_VALUE_ID, (void *)&zb_min); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MAX_VALUE_ID, (void *)&zb_max); + if (ret != ESP_OK) { + log_e("Failed to set max value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeTempSensor::setTolerance(float tolerance) { +bool ZigbeeTempSensor::setTolerance(float tolerance) { // Convert tolerance to ZCL uint16_t uint16_t zb_tolerance = (uint16_t)(tolerance * 100); esp_zb_attribute_list_t *temp_measure_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_temperature_meas_cluster_add_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); + esp_err_t ret = esp_zb_temperature_meas_cluster_add_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); + if (ret != ESP_OK) { + log_e("Failed to set tolerance: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeTempSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { +bool ZigbeeTempSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { 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; @@ -50,23 +64,34 @@ void ZigbeeTempSensor::setReporting(uint16_t min_interval, uint16_t max_interval 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_err_t ret = esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to set reporting: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeTempSensor::setTemperature(float temperature) { +bool ZigbeeTempSensor::setTemperature(float temperature) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; int16_t zb_temperature = zb_float_to_s16(temperature); log_v("Updating temperature sensor value..."); /* Update temperature sensor measured value */ log_d("Setting temperature to %d", zb_temperature); esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_set_attribute_val( + ret = esp_zb_zcl_set_attribute_val( _endpoint, ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, &zb_temperature, false ); esp_zb_lock_release(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set temperature: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; } -void ZigbeeTempSensor::reportTemperature() { +bool ZigbeeTempSensor::reportTemperature() { /* 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; @@ -77,9 +102,14 @@ void ZigbeeTempSensor::reportTemperature() { report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send temperature report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } log_v("Temperature report sent"); + return true; } void ZigbeeTempSensor::addHumiditySensor(float min, float max, float tolerance) { @@ -96,20 +126,26 @@ void ZigbeeTempSensor::addHumiditySensor(float min, float max, float tolerance) _humidity_sensor = true; } -void ZigbeeTempSensor::setHumidity(float humidity) { +bool ZigbeeTempSensor::setHumidity(float humidity) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; int16_t zb_humidity = zb_float_to_s16(humidity); log_v("Updating humidity sensor value..."); /* Update humidity sensor measured value */ log_d("Setting humidity to %d", zb_humidity); esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_set_attribute_val( + ret = esp_zb_zcl_set_attribute_val( _endpoint, ESP_ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID, &zb_humidity, false ); esp_zb_lock_release(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set humidity: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; } -void ZigbeeTempSensor::reportHumidity() { +bool ZigbeeTempSensor::reportHumidity() { /* 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; @@ -120,12 +156,17 @@ void ZigbeeTempSensor::reportHumidity() { report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send humidity report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } log_v("Humidity report sent"); + return true; } -void ZigbeeTempSensor::setHumidityReporting(uint16_t min_interval, uint16_t max_interval, float delta) { +bool ZigbeeTempSensor::setHumidityReporting(uint16_t min_interval, uint16_t max_interval, float delta) { 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; @@ -141,15 +182,22 @@ void ZigbeeTempSensor::setHumidityReporting(uint16_t min_interval, uint16_t max_ 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_err_t ret = esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to set humidity reporting: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeTempSensor::report() { - reportTemperature(); +bool ZigbeeTempSensor::report() { + bool temp_ret = reportTemperature(); + bool hum_ret = true; if (_humidity_sensor) { - reportHumidity(); + hum_ret = reportHumidity(); } + return temp_ret && hum_ret; } #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.h b/libraries/Zigbee/src/ep/ZigbeeTempSensor.h index 41da03d9db8..bc769b32de6 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.h @@ -15,34 +15,34 @@ class ZigbeeTempSensor : public ZigbeeEP { ~ZigbeeTempSensor() {} // Set the temperature value in 0,01°C - void setTemperature(float value); + bool setTemperature(float value); // Set the min and max value for the temperature sensor in 0,01°C - void setMinMaxValue(float min, float max); + bool setMinMaxValue(float min, float max); // Set the tolerance value for the temperature sensor in 0,01°C - void setTolerance(float tolerance); + bool setTolerance(float tolerance); // Set the reporting interval for temperature measurement in seconds and delta (temp change in 0,01 °C) - void setReporting(uint16_t min_interval, uint16_t max_interval, float delta); + bool setReporting(uint16_t min_interval, uint16_t max_interval, float delta); // Report the temperature value - void reportTemperature(); + bool reportTemperature(); // Add humidity cluster to the temperature sensor device void addHumiditySensor(float min, float max, float tolerance); // Set the humidity value in 0,01% - void setHumidity(float value); + bool setHumidity(float value); // Set the reporting interval for humidity measurement in seconds and delta (humidity change in 0,01%) - void setHumidityReporting(uint16_t min_interval, uint16_t max_interval, float delta); + bool setHumidityReporting(uint16_t min_interval, uint16_t max_interval, float delta); // Report the humidity value - void reportHumidity(); + bool reportHumidity(); // Report the temperature and humidity values if humidity sensor is added - void report(); + bool report(); private: bool _humidity_sensor; diff --git a/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp index 9fc75297262..6be457c389a 100644 --- a/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp @@ -29,16 +29,22 @@ void ZigbeeVibrationSensor::setIASClientEndpoint(uint8_t ep_number) { _ias_cie_endpoint = ep_number; } -void ZigbeeVibrationSensor::setVibration(bool sensed) { +bool ZigbeeVibrationSensor::setVibration(bool sensed) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; 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( + ret = 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(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set vibration status: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } _zone_status = vibration; report(); + return true; } void ZigbeeVibrationSensor::report() { @@ -49,7 +55,6 @@ void ZigbeeVibrationSensor::report() { 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; diff --git a/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.h b/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.h index 1ee3740dcc3..2f67c7bb6b4 100644 --- a/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeVibrationSensor.h @@ -48,7 +48,7 @@ class ZigbeeVibrationSensor : public ZigbeeEP { void setIASClientEndpoint(uint8_t ep_number); // Set the vibration sensor value (true = sensed, false = not sensed) - void setVibration(bool sensed); + bool setVibration(bool sensed); // Report the vibration sensor value, done automatically after setting the sensed value void report(); diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp index d93b02adbc3..72184927d4d 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp @@ -28,25 +28,39 @@ static uint16_t zb_windspeed_to_u16(float windspeed) { return (uint16_t)(windspeed * 100); } -void ZigbeeWindSpeedSensor::setMinMaxValue(float min, float max) { +bool ZigbeeWindSpeedSensor::setMinMaxValue(float min, float max) { uint16_t zb_min = zb_windspeed_to_u16(min); uint16_t zb_max = zb_windspeed_to_u16(max); esp_zb_attribute_list_t *windspeed_measure_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - // - esp_zb_cluster_update_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&zb_min); - esp_zb_cluster_update_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&zb_max); + esp_err_t ret = esp_zb_cluster_update_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&zb_min); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&zb_max); + if (ret != ESP_OK) { + log_e("Failed to set max value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeWindSpeedSensor::setTolerance(float tolerance) { +bool ZigbeeWindSpeedSensor::setTolerance(float tolerance) { // Convert tolerance to ZCL uint16_t uint16_t zb_tolerance = zb_windspeed_to_u16(tolerance); esp_zb_attribute_list_t *windspeed_measure_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_wind_speed_measurement_cluster_add_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); + esp_err_t ret = + esp_zb_wind_speed_measurement_cluster_add_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); + if (ret != ESP_OK) { + log_e("Failed to set tolerance: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeWindSpeedSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { +bool ZigbeeWindSpeedSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { 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; @@ -62,24 +76,35 @@ void ZigbeeWindSpeedSensor::setReporting(uint16_t min_interval, uint16_t max_int 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_err_t ret = esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to set reporting: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeWindSpeedSensor::setWindSpeed(float windspeed) { +bool ZigbeeWindSpeedSensor::setWindSpeed(float windspeed) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; uint16_t zb_windspeed = zb_windspeed_to_u16(windspeed); log_v("Updating windspeed sensor value..."); /* Update windspeed sensor measured value */ log_d("Setting windspeed to %d", zb_windspeed); esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_set_attribute_val( + ret = esp_zb_zcl_set_attribute_val( _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID, &zb_windspeed, false ); esp_zb_lock_release(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set wind speed: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; } -void ZigbeeWindSpeedSensor::reportWindSpeed() { +bool ZigbeeWindSpeedSensor::reportWindSpeed() { /* 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; @@ -90,9 +115,14 @@ void ZigbeeWindSpeedSensor::reportWindSpeed() { report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); - esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send wind speed report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } log_v("Wind speed measurement report sent"); + return true; } #endif //CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h index e091d3ae548..641c1d84780 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h @@ -40,17 +40,17 @@ class ZigbeeWindSpeedSensor : public ZigbeeEP { ~ZigbeeWindSpeedSensor() {} // Set the WindSpeed value in 0,01 m/s - void setWindSpeed(float value); + bool setWindSpeed(float value); // Set the min and max value for the WindSpeed sensor - void setMinMaxValue(float min, float max); + bool setMinMaxValue(float min, float max); // Set the tolerance value for the WindSpeed sensor - void setTolerance(float tolerance); + bool setTolerance(float tolerance); // Set the reporting interval for WindSpeed measurement in seconds and delta - void setReporting(uint16_t min_interval, uint16_t max_interval, float delta); - void reportWindSpeed(); + bool setReporting(uint16_t min_interval, uint16_t max_interval, float delta); + bool reportWindSpeed(); }; #endif //CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp index f6d6ec268ea..7c7889dbbf7 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp @@ -1,4 +1,3 @@ - #include "ZigbeeWindowCovering.h" #if CONFIG_ZB_ENABLED @@ -72,13 +71,18 @@ ZigbeeWindowCovering::ZigbeeWindowCovering(uint8_t endpoint) : ZigbeeEP(endpoint } // Configuration methods for window covering -void ZigbeeWindowCovering::setCoveringType(ZigbeeWindowCoveringType covering_type) { +bool 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); + esp_err_t ret = esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_WINDOW_COVERING_TYPE_ID, (void *)&covering_type); + if (ret != ESP_OK) { + log_e("Failed to set covering type: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeWindowCovering::setConfigStatus( +bool 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 ) { @@ -93,10 +97,15 @@ void ZigbeeWindowCovering::setConfigStatus( 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); + esp_err_t ret = esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_CONFIG_STATUS_ID, (void *)&config_status); + if (ret != ESP_OK) { + log_e("Failed to set config status: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeWindowCovering::setMode(bool motor_reversed, bool calibration_mode, bool maintenance_mode, bool leds_on) { +bool 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) @@ -106,10 +115,15 @@ void ZigbeeWindowCovering::setMode(bool motor_reversed, bool calibration_mode, b 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); + esp_err_t ret = esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_MODE_ID, (void *)&mode); + if (ret != ESP_OK) { + log_e("Failed to set mode: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } -void ZigbeeWindowCovering::setLimits( +bool 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; @@ -121,12 +135,41 @@ void ZigbeeWindowCovering::setLimits( 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); + esp_err_t ret = + esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_INSTALLED_OPEN_LIMIT_LIFT_ID, (void *)&_installed_open_limit_lift); + if (ret != ESP_OK) { + log_e("Failed to set installed open limit lift: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = + esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_INSTALLED_CLOSED_LIMIT_LIFT_ID, (void *)&_installed_closed_limit_lift); + if (ret != ESP_OK) { + log_e("Failed to set installed closed limit lift: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_INSTALLED_OPEN_LIMIT_TILT_ID, (void *)&_installed_open_limit_tilt); + if (ret != ESP_OK) { + log_e("Failed to set installed open limit tilt: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = + esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_INSTALLED_CLOSED_LIMIT_TILT_ID, (void *)&_installed_closed_limit_tilt); + if (ret != ESP_OK) { + log_e("Failed to set installed closed limit tilt: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = + esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_PHYSICAL_CLOSED_LIMIT_LIFT_ID, (void *)&_physical_closed_limit_lift); + if (ret != ESP_OK) { + log_e("Failed to set physical closed limit lift: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(window_covering_cluster, ESP_ZB_ZCL_ATTR_WINDOW_COVERING_PHY_CLOSED_LIMIT_TILT_ID, (void *)&_physical_closed_limit_tilt); + if (ret != ESP_OK) { + log_e("Failed to set physical closed limit tilt: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; } // Callback for handling incoming messages and commands @@ -183,12 +226,13 @@ void ZigbeeWindowCovering::zbWindowCoveringMovementCmd(const esp_zb_zcl_window_c if (_current_lift_percentage != message->payload.percentage_lift_value) { _current_lift_percentage = message->payload.percentage_lift_value; goToLiftPercentage(_current_lift_percentage); + return; } - 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); + return; } } else { log_w("Received message ignored. Command: %d not supported for Window Covering", message->command); @@ -229,80 +273,122 @@ void ZigbeeWindowCovering::stop() { } // Methods to control window covering from user application -void ZigbeeWindowCovering::setLiftPosition(uint16_t lift_position) { +bool ZigbeeWindowCovering::setLiftPosition(uint16_t lift_position) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; // 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( + ret = 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( + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set lift position: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } + ret = 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 ); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set lift percentage: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } +unlock_and_return: esp_zb_lock_release(); + return ret == ESP_ZB_ZCL_STATUS_SUCCESS; } -void ZigbeeWindowCovering::setLiftPercentage(uint8_t lift_percentage) { +bool ZigbeeWindowCovering::setLiftPercentage(uint8_t lift_percentage) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; // 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 percentage to %d%% (%d)", _current_lift_percentage, _current_lift_position); - 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( + ret = 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( + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set lift position: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } + ret = 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 ); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set lift percentage: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } +unlock_and_return: esp_zb_lock_release(); + return ret == ESP_ZB_ZCL_STATUS_SUCCESS; } -void ZigbeeWindowCovering::setTiltPosition(uint16_t tilt_position) { +bool ZigbeeWindowCovering::setTiltPosition(uint16_t tilt_position) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; // 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( + ret = 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( + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set tilt position: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } + ret = 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 ); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set tilt percentage: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } +unlock_and_return: esp_zb_lock_release(); + return ret == ESP_ZB_ZCL_STATUS_SUCCESS; } -void ZigbeeWindowCovering::setTiltPercentage(uint8_t tilt_percentage) { +bool ZigbeeWindowCovering::setTiltPercentage(uint8_t tilt_percentage) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; // 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; + _current_tilt_position = _installed_open_limit_tilt + ((_installed_closed_limit_tilt - _installed_open_limit_tilt) * tilt_percentage) / 100; + + log_v("Updating window covering tilt percentage to %d%% (%d)", _current_tilt_percentage, _current_tilt_position); - 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( + ret = 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( + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set tilt position: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } + ret = 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 ); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set tilt percentage: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + goto unlock_and_return; + } +unlock_and_return: esp_zb_lock_release(); + return ret == ESP_ZB_ZCL_STATUS_SUCCESS; } #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h index f3a368370c4..288d92c5765 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h +++ b/libraries/Zigbee/src/ep/ZigbeeWindowCovering.h @@ -87,25 +87,25 @@ class ZigbeeWindowCovering : public ZigbeeEP { } // 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); + bool setLiftPosition(uint16_t lift_position); + bool setLiftPercentage(uint8_t lift_percentage); + bool setTiltPosition(uint16_t tilt_position); + bool setTiltPercentage(uint8_t tilt_percentage); // Set the window covering type (see ZigbeeWindowCoveringType) - void setCoveringType(ZigbeeWindowCoveringType covering_type); + bool setCoveringType(ZigbeeWindowCoveringType covering_type); // Set window covering config/status, for more info see esp_zb_zcl_window_covering_config_status_t - void setConfigStatus( + bool 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); + bool 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( + bool 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 ); From 1014937965fa4148a57793dfb1ad92d66d71d519 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Fri, 28 Mar 2025 10:37:48 +0200 Subject: [PATCH 086/290] IDF release/v5.4 (#11149) * IDF release/v5.4 5cbd2a38 * fix(ci): Disable RainMaker examples on ESP32 * IDF release/v5.4 5cbd2a38 * IDF release/v5.4 2f7dcd86 --- .../RainMaker/examples/RMakerCustom/ci.json | 3 + .../RainMaker/examples/RMakerSwitch/ci.json | 3 + package/package_esp32_index.template.json | 68 +++++++++---------- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/libraries/RainMaker/examples/RMakerCustom/ci.json b/libraries/RainMaker/examples/RMakerCustom/ci.json index 1c80eda1d90..ce63fe9ccf0 100644 --- a/libraries/RainMaker/examples/RMakerCustom/ci.json +++ b/libraries/RainMaker/examples/RMakerCustom/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/RMakerSwitch/ci.json b/libraries/RainMaker/examples/RMakerSwitch/ci.json index 1c80eda1d90..ce63fe9ccf0 100644 --- a/libraries/RainMaker/examples/RMakerSwitch/ci.json +++ b/libraries/RainMaker/examples/RMakerSwitch/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/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index b0d7c3200d1..19254d11682 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-d4aa25a3-v1" + "version": "idf-release_v5.4-2f7dcd86-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-d4aa25a3-v1", + "version": "idf-release_v5.4-2f7dcd86-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", + "size": "352347498" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", + "size": "352347498" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", + "size": "352347498" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", + "size": "352347498" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", + "size": "352347498" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", + "size": "352347498" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", + "size": "352347498" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-d4aa25a3-v1.zip", - "checksum": "SHA-256:81101d580ebafb78f71bd494f4f5162fd829279d18634282c0f8f95c9e928335", - "size": "350941396" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", + "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", + "size": "352347498" } ] }, From de184bd0cbb6f8d6c68497236657a1cb591f5ce4 Mon Sep 17 00:00:00 2001 From: Lewis He Date: Fri, 28 Mar 2025 16:38:31 +0800 Subject: [PATCH 087/290] Update LilyGo variants and add new variants (#11192) * Update LilyGo T-Watch-S3 definition and expansion options * Update LilyGo T-Watch-Ultra definition and expand options * Added variant LilyGo-T-LoRa-Pager * Update partition table order * Update LilyGo board partition table order * 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 | 175 +++++++++++++++++++- variants/lilygo_tlora_pager/pins_arduino.h | 100 +++++++++++ variants/lilygo_twatch_s3/pins_arduino.h | 7 + variants/lilygo_twatch_ultra/pins_arduino.h | 51 ++++-- 4 files changed, 310 insertions(+), 23 deletions(-) create mode 100644 variants/lilygo_tlora_pager/pins_arduino.h diff --git a/boards.txt b/boards.txt index 9190ee03a63..f0df27762c2 100644 --- a/boards.txt +++ b/boards.txt @@ -6070,10 +6070,12 @@ twatchs3.menu.EraseFlash.none.upload.erase_cmd= twatchs3.menu.EraseFlash.all=Enabled twatchs3.menu.EraseFlash.all.upload.erase_cmd=-e -twatchs3.menu.Revision.Radio_SX1280=Radio-SX1280 -twatchs3.menu.Revision.Radio_SX1280.build.board=LILYGO_LORA_SX1280 twatchs3.menu.Revision.Radio_SX1262=Radio-SX1262 twatchs3.menu.Revision.Radio_SX1262.build.board=LILYGO_LORA_SX1262 +twatchs3.menu.Revision.Radio_SX1280=Radio-SX1280 +twatchs3.menu.Revision.Radio_SX1280.build.board=LILYGO_LORA_SX1280 +twatchs3.menu.Revision.Radio_CC1101=Radio-CC1101 +twatchs3.menu.Revision.Radio_CC1101.build.board=LILYGO_LORA_CC1101 ############################################################## @@ -6166,12 +6168,12 @@ twatch_ultra.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) twatch_ultra.menu.UploadMode.cdc.upload.use_1200bps_touch=true twatch_ultra.menu.UploadMode.cdc.upload.wait_for_upload_port=true -twatch_ultra.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) -twatch_ultra.menu.PartitionScheme.fatflash.build.partitions=ffat -twatch_ultra.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 twatch_ultra.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS) twatch_ultra.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB twatch_ultra.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 +twatch_ultra.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) +twatch_ultra.menu.PartitionScheme.fatflash.build.partitions=ffat +twatch_ultra.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 twatch_ultra.menu.PartitionScheme.rainmaker=RainMaker twatch_ultra.menu.PartitionScheme.rainmaker.build.partitions=rainmaker twatch_ultra.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 @@ -6233,7 +6235,170 @@ twatch_ultra.menu.Revision.Radio_SX1280=Radio-SX1280 twatch_ultra.menu.Revision.Radio_SX1280.build.board=LILYGO_LORA_SX1280 twatch_ultra.menu.Revision.Radio_SX1262=Radio-SX1262 twatch_ultra.menu.Revision.Radio_SX1262.build.board=LILYGO_LORA_SX1262 +twatch_ultra.menu.Revision.Radio_CC1101=Radio-CC1101 +twatch_ultra.menu.Revision.Radio_CC1101.build.board=LILYGO_LORA_CC1101 + + +############################################################## + +tlora_pager.name=LilyGo-T-LoRa-Pager + +tlora_pager.bootloader.tool=esptool_py +tlora_pager.bootloader.tool.default=esptool_py + +tlora_pager.upload.tool=esptool_py +tlora_pager.upload.tool.default=esptool_py +tlora_pager.upload.tool.network=esp_ota + +tlora_pager.upload.maximum_size=1310720 +tlora_pager.upload.maximum_data_size=327680 +tlora_pager.upload.flags= +tlora_pager.upload.extra_flags= +tlora_pager.upload.use_1200bps_touch=false +tlora_pager.upload.wait_for_upload_port=false + +tlora_pager.serial.disableDTR=false +tlora_pager.serial.disableRTS=false + +tlora_pager.build.tarch=xtensa +tlora_pager.build.bootloader_addr=0x0 +tlora_pager.build.target=esp32s3 +tlora_pager.build.mcu=esp32s3 +tlora_pager.build.core=esp32 +tlora_pager.build.variant=lilygo_tlora_pager +tlora_pager.build.board=T_LORA_PAGER + +tlora_pager.build.usb_mode=1 +tlora_pager.build.cdc_on_boot=1 +tlora_pager.build.msc_on_boot=0 +tlora_pager.build.dfu_on_boot=0 +tlora_pager.build.f_cpu=240000000L +tlora_pager.build.flash_size=16MB +tlora_pager.build.flash_freq=80m +tlora_pager.build.flash_mode=dio +tlora_pager.build.boot=qio +tlora_pager.build.boot_freq=80m +tlora_pager.build.partitions=app3M_fat9M_16MB +tlora_pager.build.defines=-DBOARD_HAS_PSRAM -DARDUINO_T_LORA_PAGER +tlora_pager.build.loop_core= +tlora_pager.build.event_core= +tlora_pager.build.psram_type=qspi +tlora_pager.build.memory_type={build.boot}_{build.psram_type} +## IDE 2.0 Seems to not update the value +tlora_pager.menu.JTAGAdapter.default=Disabled +tlora_pager.menu.JTAGAdapter.default.build.copy_jtag_files=0 +tlora_pager.menu.JTAGAdapter.builtin=Integrated USB JTAG +tlora_pager.menu.JTAGAdapter.builtin.build.openocdscript=esp32s3-builtin.cfg +tlora_pager.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 + +tlora_pager.menu.LoopCore.1=Core 1 +tlora_pager.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +tlora_pager.menu.LoopCore.0=Core 0 +tlora_pager.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +tlora_pager.menu.EventsCore.1=Core 1 +tlora_pager.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +tlora_pager.menu.EventsCore.0=Core 0 +tlora_pager.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +tlora_pager.menu.USBMode.hwcdc=Hardware CDC and JTAG +tlora_pager.menu.USBMode.hwcdc.build.usb_mode=1 +tlora_pager.menu.USBMode.default=USB-OTG (TinyUSB) +tlora_pager.menu.USBMode.default.build.usb_mode=0 + +tlora_pager.menu.CDCOnBoot.default=Enabled +tlora_pager.menu.CDCOnBoot.default.build.cdc_on_boot=1 +tlora_pager.menu.CDCOnBoot.cdc=Disabled +tlora_pager.menu.CDCOnBoot.cdc.build.cdc_on_boot=0 + +tlora_pager.menu.MSCOnBoot.default=Disabled +tlora_pager.menu.MSCOnBoot.default.build.msc_on_boot=0 +tlora_pager.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +tlora_pager.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +tlora_pager.menu.DFUOnBoot.default=Disabled +tlora_pager.menu.DFUOnBoot.default.build.dfu_on_boot=0 +tlora_pager.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +tlora_pager.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +tlora_pager.menu.UploadMode.default=UART0 / Hardware CDC +tlora_pager.menu.UploadMode.default.upload.use_1200bps_touch=false +tlora_pager.menu.UploadMode.default.upload.wait_for_upload_port=false +tlora_pager.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +tlora_pager.menu.UploadMode.cdc.upload.use_1200bps_touch=true +tlora_pager.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +tlora_pager.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS) +tlora_pager.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB +tlora_pager.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 +tlora_pager.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) +tlora_pager.menu.PartitionScheme.fatflash.build.partitions=ffat +tlora_pager.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 +tlora_pager.menu.PartitionScheme.rainmaker=RainMaker +tlora_pager.menu.PartitionScheme.rainmaker.build.partitions=rainmaker +tlora_pager.menu.PartitionScheme.rainmaker.upload.maximum_size=3145728 +tlora_pager.menu.PartitionScheme.esp_sr_16=ESP SR 16M (3MB APP/7MB SPIFFS/2.9MB MODEL) +tlora_pager.menu.PartitionScheme.esp_sr_16.upload.maximum_size=3145728 +tlora_pager.menu.PartitionScheme.esp_sr_16.upload.extra_flags=0xD10000 {build.path}/srmodels.bin +tlora_pager.menu.PartitionScheme.esp_sr_16.build.partitions=esp_sr_16 +tlora_pager.menu.PartitionScheme.custom=Custom +tlora_pager.menu.PartitionScheme.custom.build.partitions= +tlora_pager.menu.PartitionScheme.custom.upload.maximum_size=16777216 + +tlora_pager.menu.CPUFreq.240=240MHz (WiFi) +tlora_pager.menu.CPUFreq.240.build.f_cpu=240000000L +tlora_pager.menu.CPUFreq.160=160MHz (WiFi) +tlora_pager.menu.CPUFreq.160.build.f_cpu=160000000L +tlora_pager.menu.CPUFreq.80=80MHz (WiFi) +tlora_pager.menu.CPUFreq.80.build.f_cpu=80000000L +tlora_pager.menu.CPUFreq.40=40MHz +tlora_pager.menu.CPUFreq.40.build.f_cpu=40000000L +tlora_pager.menu.CPUFreq.20=20MHz +tlora_pager.menu.CPUFreq.20.build.f_cpu=20000000L +tlora_pager.menu.CPUFreq.10=10MHz +tlora_pager.menu.CPUFreq.10.build.f_cpu=10000000L + +tlora_pager.menu.UploadSpeed.921600=921600 +tlora_pager.menu.UploadSpeed.921600.upload.speed=921600 +tlora_pager.menu.UploadSpeed.115200=115200 +tlora_pager.menu.UploadSpeed.115200.upload.speed=115200 +tlora_pager.menu.UploadSpeed.256000.windows=256000 +tlora_pager.menu.UploadSpeed.256000.upload.speed=256000 +tlora_pager.menu.UploadSpeed.230400.windows.upload.speed=256000 +tlora_pager.menu.UploadSpeed.230400=230400 +tlora_pager.menu.UploadSpeed.230400.upload.speed=230400 +tlora_pager.menu.UploadSpeed.460800.linux=460800 +tlora_pager.menu.UploadSpeed.460800.macosx=460800 +tlora_pager.menu.UploadSpeed.460800.upload.speed=460800 +tlora_pager.menu.UploadSpeed.512000.windows=512000 +tlora_pager.menu.UploadSpeed.512000.upload.speed=512000 + +tlora_pager.menu.DebugLevel.none=None +tlora_pager.menu.DebugLevel.none.build.code_debug=0 +tlora_pager.menu.DebugLevel.error=Error +tlora_pager.menu.DebugLevel.error.build.code_debug=1 +tlora_pager.menu.DebugLevel.warn=Warn +tlora_pager.menu.DebugLevel.warn.build.code_debug=2 +tlora_pager.menu.DebugLevel.info=Info +tlora_pager.menu.DebugLevel.info.build.code_debug=3 +tlora_pager.menu.DebugLevel.debug=Debug +tlora_pager.menu.DebugLevel.debug.build.code_debug=4 +tlora_pager.menu.DebugLevel.verbose=Verbose +tlora_pager.menu.DebugLevel.verbose.build.code_debug=5 + +tlora_pager.menu.EraseFlash.none=Disabled +tlora_pager.menu.EraseFlash.none.upload.erase_cmd= +tlora_pager.menu.EraseFlash.all=Enabled +tlora_pager.menu.EraseFlash.all.upload.erase_cmd=-e + + +tlora_pager.menu.Revision.Radio_SX1280=Radio-SX1280 +tlora_pager.menu.Revision.Radio_SX1280.build.board=LILYGO_LORA_SX1280 +tlora_pager.menu.Revision.Radio_SX1262=Radio-SX1262 +tlora_pager.menu.Revision.Radio_SX1262.build.board=LILYGO_LORA_SX1262 +tlora_pager.menu.Revision.Radio_CC1101=Radio-CC1101 +tlora_pager.menu.Revision.Radio_CC1101.build.board=LILYGO_LORA_CC1101 ############################################################## diff --git a/variants/lilygo_tlora_pager/pins_arduino.h b/variants/lilygo_tlora_pager/pins_arduino.h new file mode 100644 index 00000000000..1a1d8e5da3f --- /dev/null +++ b/variants/lilygo_tlora_pager/pins_arduino.h @@ -0,0 +1,100 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +#ifndef digitalPinToInterrupt +#define digitalPinToInterrupt(p) (((p) < 48) ? (p) : -1) +#endif + +#define USB_VID 0x303a +#define USB_PID 0x82D1 +#define USB_MANUFACTURER "LILYGO" +#define USB_PRODUCT "T-LoRa-Pager" + +// ST7796 +#define DISP_WIDTH (222) +#define DISP_HEIGHT (480) +#define SD_CS (21) + +static const uint8_t TX = 43; +static const uint8_t RX = 44; + +//BHI260,PCF85063,BQ25896,DRV2605L,ES8311 share I2C Bus +static const uint8_t SDA = 2; +static const uint8_t SCL = 3; + +// Default sd cs pin +static const uint8_t SS = SD_CS; +static const uint8_t MOSI = 34; +static const uint8_t MISO = 33; +static const uint8_t SCK = 35; + +#define KB_INT (6) +#define KB_BACKLIGHT (46) + +// Rotary +#define ROTARY_A (40) +#define ROTARY_B (41) +#define ROTARY_C (7) + +// Interrupt IO port +#define RTC_INT (1) +#define NFC_INT (5) +#define SENSOR_INT (8) +#define NFC_CS (39) + +// ES8311 +#define I2S_WS (18) +#define I2S_SCK (11) +#define I2S_MCLK (10) +#define I2S_SDOUT (45) +#define I2S_SDIN (17) + +// GPS +#define GPS_TX (12) +#define GPS_RX (4) +#define GPS_PPS (13) + +// LoRa, SD, ST25R3916 card share SPI bus +#define LORA_SCK (SCK) // share spi bus +#define LORA_MISO (MISO) // share spi bus +#define LORA_MOSI (MOSI) // share spi bus +#define LORA_CS (36) +#define LORA_RST (47) +#define LORA_BUSY (48) +#define LORA_IRQ (14) + +// SPI interface display +#define DISP_MOSI (MOSI) +#define DISP_MISO (MISO) +#define DISP_SCK (SCK) +#define DISP_RST (-1) +#define DISP_CS (38) +#define DISP_DC (37) +#define DISP_BL (42) + +// External expansion chip IO definition +#define EXPANDS_DRV_EN (0) +#define EXPANDS_AMP_EN (1) +#define EXPANDS_KB_RST (2) +#define EXPANDS_LORA_EN (3) +#define EXPANDS_GPS_EN (4) +#define EXPANDS_NFC_EN (5) +#define EXPANDS_DISP_RST (6) +#define EXPANDS_GPS_RST (7) +#define EXPANDS_KB_EN (8) +#define EXPANDS_GPIO_EN (9) + +// Peripheral definition exists +#define USING_AUDIO_CODEC +#define USING_XL9555_EXPANDS +#define USING_PPM_MANAGE +#define USING_BQ_GAUGE +#define USING_INPUT_DEV_ROTARY +#define USING_INPUT_DEV_KEYBOARD +#define USING_ST25R3916 +#define USING_BHI260_SENSOR +#define HAS_SD_CARD_SOCKET + +#endif /* Pins_Arduino_h */ diff --git a/variants/lilygo_twatch_s3/pins_arduino.h b/variants/lilygo_twatch_s3/pins_arduino.h index 59434161d98..b184dc9ba17 100644 --- a/variants/lilygo_twatch_s3/pins_arduino.h +++ b/variants/lilygo_twatch_s3/pins_arduino.h @@ -66,4 +66,11 @@ static const uint8_t SCK = 3; #define GPS_TX (TX) #define GPS_RX (RX) +// Peripheral definition exists +#define USING_PCM_AMPLIFIER +#define USING_PDM_MICROPHONE +#define USING_PMU_MANAGE +#define USING_INPUT_DEV_TOUCHPAD +#define USING_IR_REMOTE + #endif /* Pins_Arduino_h */ diff --git a/variants/lilygo_twatch_ultra/pins_arduino.h b/variants/lilygo_twatch_ultra/pins_arduino.h index 57f6c2c3fea..c90c1ba584e 100644 --- a/variants/lilygo_twatch_ultra/pins_arduino.h +++ b/variants/lilygo_twatch_ultra/pins_arduino.h @@ -12,27 +12,25 @@ #define USB_MANUFACTURER "LILYGO" #define USB_PRODUCT "T-Watch-Ultra" -#define DISP_WIDTH (240) -#define DISP_HEIGHT (296) - -#define DISP_D0 (39) -#define DISP_D1 (40) -#define DISP_D2 (45) -#define DISP_D3 (42) -#define DISP_SCK (41) -#define DISP_RST (6) -#define DISP_CS (38) -#define DISP_TE (37) - -// touch screen -#define TP_INT (12) -#define TP_RST (46) +#define DISP_WIDTH 502 +#define DISP_HEIGHT 410 + +// QSPI interface display +#define DISP_D0 (38) +#define DISP_D1 (39) +#define DISP_D2 (42) +#define DISP_D3 (45) +#define DISP_SCK (40) +#define DISP_CS (41) +#define DISP_TE (6) + // Interrupt IO port +#define TP_INT (12) #define RTC_INT (1) #define PMU_INT (7) #define NFC_INT (5) #define SENSOR_INT (8) -#define NFC_RST (4) +#define NFC_CS (4) // PDM microphone #define MIC_SCK (17) @@ -59,8 +57,9 @@ static const uint8_t MOSI = 34; static const uint8_t MISO = 33; static const uint8_t SCK = 35; -#define GPS_TX (TX) -#define GPS_RX (RX) +#define GPS_TX (TX) +#define GPS_RX (RX) +#define GPS_PPS (13) #define TP_SDA (SDA) #define TP_SCL (SCL) @@ -74,4 +73,20 @@ static const uint8_t SCK = 35; #define LORA_BUSY (48) #define LORA_IRQ (14) +// External expansion chip IO definition +#define EXPANDS_DRV_EN (6) +#define EXPANDS_DISP_EN (7) +#define EXPANDS_TOUCH_RST (10) +#define EXPANDS_DISP_RST (11) + +// Peripheral definition exists +#define USING_XL9555_EXPANDS +#define USING_PCM_AMPLIFIER +#define USING_PDM_MICROPHONE +#define USING_PMU_MANAGE +#define USING_INPUT_DEV_TOUCHPAD +#define USING_ST25R3916 +#define USING_BHI260_SENSOR +#define HAS_SD_CARD_SOCKET + #endif /* Pins_Arduino_h */ From a61961d5c995106ba89e1361655471938dfc4502 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Fri, 28 Mar 2025 10:48:39 +0200 Subject: [PATCH 088/290] IDF master (#11150) * IDF master ee77c489 * IDF master ee77c489 * IDF master 50be9735 * IDF master 23c73cdc * IDF master a45d713b --- package/package_esp32_index.template.json | 128 +++++++++++----------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index f5bf9ed85cd..1b935fd8acf 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-master-0461e2ff-v1" + "version": "idf-master-a45d713b-v1" }, { "packager": "esp32", @@ -76,7 +76,7 @@ { "packager": "esp32", "name": "openocd-esp32", - "version": "v0.12.0-esp32-20241016" + "version": "v0.12.0-esp32-20250226" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-master-0461e2ff-v1", + "version": "idf-master-a45d713b-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", - "size": "411886500" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", + "size": "420636315" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", - "size": "411886500" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", + "size": "420636315" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", - "size": "411886500" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", + "size": "420636315" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", - "size": "411886500" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", + "size": "420636315" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", - "size": "411886500" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", + "size": "420636315" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", - "size": "411886500" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", + "size": "420636315" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", - "size": "411886500" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", + "size": "420636315" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-0461e2ff-v1.zip", - "checksum": "SHA-256:e1413b7d711cbdc4efb3064d6ac25e09068d7a01db3a706bd1426b0fd992e35b", - "size": "411886500" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", + "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", + "size": "420636315" } ] }, @@ -414,56 +414,56 @@ }, { "name": "openocd-esp32", - "version": "v0.12.0-esp32-20241016", + "version": "v0.12.0-esp32-20250226", "systems": [ { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-linux-amd64-0.12.0-esp32-20241016.tar.gz", - "archiveFileName": "openocd-esp32-linux-amd64-0.12.0-esp32-20241016.tar.gz", - "checksum": "SHA-256:e82b0f036dc99244bead5f09a86e91bb2365cbcd1122ac68261e5647942485df", - "size": "2398717" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-linux-amd64-0.12.0-esp32-20250226.tar.gz", + "archiveFileName": "openocd-esp32-linux-amd64-0.12.0-esp32-20250226.tar.gz", + "checksum": "SHA-256:914c726342ba5828e53f41aa454f01f317c42d8e6772d3d874593a6960fc4729", + "size": "2414924" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-linux-arm64-0.12.0-esp32-20241016.tar.gz", - "archiveFileName": "openocd-esp32-linux-arm64-0.12.0-esp32-20241016.tar.gz", - "checksum": "SHA-256:8f8daf5bd22ec5d2fa9257b0862ec33da18ee677e023fb9a9eb17f74ce208c76", - "size": "2271584" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-linux-arm64-0.12.0-esp32-20250226.tar.gz", + "archiveFileName": "openocd-esp32-linux-arm64-0.12.0-esp32-20250226.tar.gz", + "checksum": "SHA-256:c44ee99a9209c0234dbbcec86339fd685f5c61a763b29c33eba590bf62db2296", + "size": "2293923" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-linux-armel-0.12.0-esp32-20241016.tar.gz", - "archiveFileName": "openocd-esp32-linux-armel-0.12.0-esp32-20241016.tar.gz", - "checksum": "SHA-256:bc9c020ecf20e2000f76cffa44305fd5bc44d2e688ea78cce423399d33f19767", - "size": "2414206" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-linux-armel-0.12.0-esp32-20250226.tar.gz", + "archiveFileName": "openocd-esp32-linux-armel-0.12.0-esp32-20250226.tar.gz", + "checksum": "SHA-256:21ab6af3cf05f9290f4d59f1f381d5094dd2755fc528d3d2feb9334348fc0d8d", + "size": "2436071" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-macos-0.12.0-esp32-20241016.tar.gz", - "archiveFileName": "openocd-esp32-macos-0.12.0-esp32-20241016.tar.gz", - "checksum": "SHA-256:02a2dffe801a2d005fa9e614d80ff8173395b2cb0b5d3118d0229d094a9946a7", - "size": "2508089" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-macos-0.12.0-esp32-20250226.tar.gz", + "archiveFileName": "openocd-esp32-macos-0.12.0-esp32-20250226.tar.gz", + "checksum": "SHA-256:0b5751699e93b6d101381611c96216ddff8c7dfd16425c610993fa27993f9a0a", + "size": "2525387" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-macos-arm64-0.12.0-esp32-20241016.tar.gz", - "archiveFileName": "openocd-esp32-macos-arm64-0.12.0-esp32-20241016.tar.gz", - "checksum": "SHA-256:c382f9e884d6565cb6089bff5f200f4810994667d885f062c3d3c5625a0fa9d6", - "size": "2552569" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-macos-arm64-0.12.0-esp32-20250226.tar.gz", + "archiveFileName": "openocd-esp32-macos-arm64-0.12.0-esp32-20250226.tar.gz", + "checksum": "SHA-256:8bffbbb594b27a4971a3922792135f8c836fff26991f7f450094386920263531", + "size": "2568843" }, { "host": "i686-mingw32", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-win32-0.12.0-esp32-20241016.zip", - "archiveFileName": "openocd-esp32-win32-0.12.0-esp32-20241016.zip", - "checksum": "SHA-256:3b5d615e0a72cc771a45dd469031312d5881c01d7b6bc9edb29b8b6bda8c2e90", - "size": "2946244" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-win32-0.12.0-esp32-20250226.zip", + "archiveFileName": "openocd-esp32-win32-0.12.0-esp32-20250226.zip", + "checksum": "SHA-256:aaf3c955bb4eb47805a1ba108dfd07a8a56ce720cb40194a354362b5f0961230", + "size": "2960226" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-win64-0.12.0-esp32-20241016.zip", - "archiveFileName": "openocd-esp32-win64-0.12.0-esp32-20241016.zip", - "checksum": "SHA-256:5e7b2fd1947d3a8625f6a11db7a2340cf2f41ff4c61284c022c7d7c32b18780a", - "size": "2946244" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-win64-0.12.0-esp32-20250226.zip", + "archiveFileName": "openocd-esp32-win64-0.12.0-esp32-20250226.zip", + "checksum": "SHA-256:79baf35325117a53093b62f6b9bee677dd12275d7066e3f8a274d2a80e986b6e", + "size": "2960225" } ] }, From fbca62fd6889b31a686f8bd8bca05358796efe28 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Sat, 29 Mar 2025 14:13:57 +0200 Subject: [PATCH 089/290] Update Issue-report.yml with the latest versions --- .github/ISSUE_TEMPLATE/Issue-report.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/Issue-report.yml b/.github/ISSUE_TEMPLATE/Issue-report.yml index a902184f06b..1229df2d947 100644 --- a/.github/ISSUE_TEMPLATE/Issue-report.yml +++ b/.github/ISSUE_TEMPLATE/Issue-report.yml @@ -39,8 +39,11 @@ body: label: Version description: What version of Arduino ESP32 are you running? If possible, consider updating to the latest version. options: - - latest master (checkout manually) + - latest stable Release (if not listed below) - latest development Release Candidate (RC-X) + - latest master (checkout manually) + - v3.2.0 + - v3.1.3 - v3.1.2 - v3.1.1 - v3.1.0 From 7b0298b4621561e62c248fed7318406677a8a4e2 Mon Sep 17 00:00:00 2001 From: Lewis He Date: Mon, 31 Mar 2025 16:06:18 +0800 Subject: [PATCH 090/290] Modify T-LoRa-Pager device PID (#11194) Co-authored-by: Sugar Glider --- variants/lilygo_tlora_pager/pins_arduino.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/lilygo_tlora_pager/pins_arduino.h b/variants/lilygo_tlora_pager/pins_arduino.h index 1a1d8e5da3f..a7e03c759bd 100644 --- a/variants/lilygo_tlora_pager/pins_arduino.h +++ b/variants/lilygo_tlora_pager/pins_arduino.h @@ -8,7 +8,7 @@ #endif #define USB_VID 0x303a -#define USB_PID 0x82D1 +#define USB_PID 0x82D4 #define USB_MANUFACTURER "LILYGO" #define USB_PRODUCT "T-LoRa-Pager" From 22f07d01c88009ba707e30f04b1d2687aec14286 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Tue, 1 Apr 2025 09:36:19 -0300 Subject: [PATCH 091/290] fix(rmt): memset all config structs to zero before using (#11203) * fix(rmt): memset all config structs to zero to increase code safety --- cores/esp32/esp32-hal-rmt.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/cores/esp32/esp32-hal-rmt.c b/cores/esp32/esp32-hal-rmt.c index e3877b5ff48..7bca1a1b529 100644 --- a/cores/esp32/esp32-hal-rmt.c +++ b/cores/esp32/esp32-hal-rmt.c @@ -206,7 +206,8 @@ bool rmtSetCarrier(int pin, bool carrier_en, bool carrier_level, uint32_t freque log_w("GPIO %d - RMT Carrier must be a float percentage from 0 to 1. Setting to 50%.", pin); duty_percent = 0.5; } - rmt_carrier_config_t carrier_cfg = {0}; + rmt_carrier_config_t carrier_cfg; + memset((void *)&carrier_cfg, 0, sizeof(rmt_carrier_config_t)); carrier_cfg.duty_cycle = duty_percent; // duty cycle carrier_cfg.frequency_hz = carrier_en ? frequency_Hz : 0; // carrier frequency in Hz carrier_cfg.flags.polarity_active_low = carrier_level; // carrier modulation polarity level @@ -313,7 +314,8 @@ static bool _rmtWrite(int pin, rmt_data_t *data, size_t num_rmt_symbols, bool bl return false; } - rmt_transmit_config_t transmit_cfg = {0}; // loop mode disabled + rmt_transmit_config_t transmit_cfg; // loop mode disabled + memset((void *)&transmit_cfg, 0, sizeof(rmt_transmit_config_t)); bool retCode = true; RMT_MUTEX_LOCK(bus); @@ -380,6 +382,7 @@ static bool _rmtRead(int pin, rmt_data_t *data, size_t *num_rmt_symbols, bool wa // request reading RMT Channel Data rmt_receive_config_t receive_config; + memset((void *)&receive_config, 0, sizeof(rmt_receive_config_t)); receive_config.signal_range_min_ns = bus->signal_range_min_ns; receive_config.signal_range_max_ns = bus->signal_range_max_ns; @@ -530,6 +533,7 @@ bool rmtInit(int pin, rmt_ch_dir_t channel_direction, rmt_reserve_memsize_t mem_ if (channel_direction == RMT_TX_MODE) { // TX Channel rmt_tx_channel_config_t tx_cfg; + memset((void *)&tx_cfg, 0, sizeof(rmt_tx_channel_config_t)); tx_cfg.gpio_num = pin; // CLK_APB for ESP32|S2|S3|C3 -- CLK_PLL_F80M for C6 -- CLK_XTAL for H2 tx_cfg.clk_src = RMT_CLK_SRC_DEFAULT; @@ -559,6 +563,7 @@ bool rmtInit(int pin, rmt_ch_dir_t channel_direction, rmt_reserve_memsize_t mem_ } else { // RX Channel rmt_rx_channel_config_t rx_cfg; + memset((void *)&rx_cfg, 0, sizeof(rmt_rx_channel_config_t)); rx_cfg.gpio_num = pin; // CLK_APB for ESP32|S2|S3|C3 -- CLK_PLL_F80M for C6 -- CLK_XTAL for H2 rx_cfg.clk_src = RMT_CLK_SRC_DEFAULT; @@ -585,7 +590,8 @@ bool rmtInit(int pin, rmt_ch_dir_t channel_direction, rmt_reserve_memsize_t mem_ } // allocate memory for the RMT Copy encoder - rmt_copy_encoder_config_t copy_encoder_config = {}; + rmt_copy_encoder_config_t copy_encoder_config; + memset((void *)©_encoder_config, 0, sizeof(rmt_copy_encoder_config_t)); if (rmt_new_copy_encoder(©_encoder_config, &bus->rmt_copy_encoder_h) != ESP_OK) { log_e("GPIO %d - RMT Encoder Memory Allocation error.", pin); goto Err; From 23ded939ead68c5bbb608218aedc29a0499159a0 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: Sat, 5 Apr 2025 17:46:20 +0200 Subject: [PATCH 092/290] feat(zigbee): Add PM2.5 endpoint support (#11205) * feat(zigbee): Add PM2.5 endpoint support * 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 + .../examples/Zigbee_PM25_Sensor/README.md | 72 +++++++++++ .../Zigbee_PM25_Sensor/Zigbee_PM25_Sensor.ino | 109 ++++++++++++++++ .../examples/Zigbee_PM25_Sensor/ci.json | 7 ++ libraries/Zigbee/src/Zigbee.h | 28 +++-- libraries/Zigbee/src/ep/ZigbeePM25Sensor.cpp | 118 ++++++++++++++++++ libraries/Zigbee/src/ep/ZigbeePM25Sensor.h | 60 +++++++++ 7 files changed, 384 insertions(+), 11 deletions(-) create mode 100644 libraries/Zigbee/examples/Zigbee_PM25_Sensor/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_PM25_Sensor/Zigbee_PM25_Sensor.ino create mode 100644 libraries/Zigbee/examples/Zigbee_PM25_Sensor/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeePM25Sensor.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeePM25Sensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 7539601d9e5..14fcb19b6da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -300,6 +300,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeGateway.cpp libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp + libraries/Zigbee/src/ep/ZigbeePM25Sensor.cpp ) set(ARDUINO_LIBRARY_BLE_SRCS diff --git a/libraries/Zigbee/examples/Zigbee_PM25_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_PM25_Sensor/README.md new file mode 100644 index 00000000000..51bf11459b7 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_PM25_Sensor/README.md @@ -0,0 +1,72 @@ +# Arduino-ESP32 PM2.5 Sensor + +This example shows how to configure the Zigbee end device and use it as a Home Automation (HA) simple sensor device type with particulate matter (PM2.5) 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 PM2.5 on every 30 seconds. + * By clicking the button (BOOT) on this board, this board will immediately send a report of the current PM2.5 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 PM2.5 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_PM25_Sensor/Zigbee_PM25_Sensor.ino b/libraries/Zigbee/examples/Zigbee_PM25_Sensor/Zigbee_PM25_Sensor.ino new file mode 100644 index 00000000000..a98d697f700 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_PM25_Sensor/Zigbee_PM25_Sensor.ino @@ -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. + +/** + * @brief This example demonstrates Zigbee PM2.5 sensor. + * + * The example demonstrates how to use Zigbee library to create a end device PM2.5 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 PM2.5 sensor configuration */ +#define PM2_5_SENSOR_ENDPOINT_NUMBER 1 +uint8_t button = BOOT_PIN; + +ZigbeePM25Sensor zbPM25Sensor = ZigbeePM25Sensor(PM2_5_SENSOR_ENDPOINT_NUMBER); + +void setup() { + Serial.begin(115200); + + // Init button switch + pinMode(button, INPUT_PULLUP); + + // Optional: set Zigbee device name and model + zbPM25Sensor.setManufacturerAndModel("Espressif", "ZigbeePM25Sensor"); + + // Set minimum and maximum PM2.5 measurement value in µg/m³ + zbPM25Sensor.setMinMaxValue(0, 350); + + // Set tolerance for PM2.5 measurement in µg/m³ + zbPM25Sensor.setTolerance(0.1); + + // Add endpoints to Zigbee Core + Zigbee.addEndpoint(&zbPM25Sensor); + + 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 PM2.5 measurement to be done every 30 seconds, must be called after Zigbee.begin() + // min_interval and max_interval in seconds, delta (PM2.5 change in µg/m³) + // if min = 1 and max = 0, reporting is sent only when PM2.5 changes by delta + // if min = 0 and max = 10, reporting is sent every 10 seconds or when PM2.5 changes by delta + // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of delta change + zbPM25Sensor.setReporting(0, 30, 0); +} + +void loop() { + static uint32_t timeCounter = 0; + // Read PM2.5 sensor every 2s + if (!(timeCounter++ % 20)) { // delaying for 100ms x 20 = 2s + // Read sensor value - here is chip temperature used + 50 as a dummy value for demonstration + float pm25_value = 50.5 + temperatureRead(); + Serial.printf("Updating PM2.5 sensor value to %0.1f µg/m³\r\n", pm25_value); + zbPM25Sensor.setPM25(pm25_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(); + } + } + zbPM25Sensor.report(); + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_PM25_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_PM25_Sensor/ci.json new file mode 100644 index 00000000000..ceacc367801 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_PM25_Sensor/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" + ] +} diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index ea42e9dd41a..7f44d7813af 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -7,23 +7,29 @@ #include "ZigbeeEP.h" // Endpoints -#include "ep/ZigbeeLight.h" +//// Switches +#include "ep/ZigbeeColorDimmerSwitch.h" #include "ep/ZigbeeSwitch.h" -#include "ep/ZigbeeDimmableLight.h" +//// Lights #include "ep/ZigbeeColorDimmableLight.h" -#include "ep/ZigbeeColorDimmerSwitch.h" -#include "ep/ZigbeeTempSensor.h" +#include "ep/ZigbeeDimmableLight.h" +#include "ep/ZigbeeLight.h" +//// Controllers #include "ep/ZigbeeThermostat.h" -#include "ep/ZigbeePressureSensor.h" +//// Sensors #include "ep/ZigbeeAnalog.h" -#include "ep/ZigbeeFlowSensor.h" -#include "ep/ZigbeeOccupancySensor.h" -#include "ep/ZigbeeIlluminanceSensor.h" #include "ep/ZigbeeCarbonDioxideSensor.h" #include "ep/ZigbeeContactSwitch.h" #include "ep/ZigbeeDoorWindowHandle.h" -#include "ep/ZigbeeWindowCovering.h" +#include "ep/ZigbeeFlowSensor.h" +#include "ep/ZigbeeIlluminanceSensor.h" +#include "ep/ZigbeeOccupancySensor.h" +#include "ep/ZigbeePM25Sensor.h" +#include "ep/ZigbeePressureSensor.h" +#include "ep/ZigbeeTempSensor.h" #include "ep/ZigbeeVibrationSensor.h" -#include "ep/ZigbeeRangeExtender.h" -#include "ep/ZigbeeGateway.h" #include "ep/ZigbeeWindSpeedSensor.h" +#include "ep/ZigbeeWindowCovering.h" +//// Other +#include "ep/ZigbeeGateway.h" +#include "ep/ZigbeeRangeExtender.h" diff --git a/libraries/Zigbee/src/ep/ZigbeePM25Sensor.cpp b/libraries/Zigbee/src/ep/ZigbeePM25Sensor.cpp new file mode 100644 index 00000000000..d25d15e5de3 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeePM25Sensor.cpp @@ -0,0 +1,118 @@ +#include "ZigbeePM25Sensor.h" +#if CONFIG_ZB_ENABLED + +esp_zb_cluster_list_t *zigbee_pm2_5_sensor_clusters_create(zigbee_pm2_5_sensor_cfg_t *pm2_5_sensor) { + esp_zb_basic_cluster_cfg_t *basic_cfg = pm2_5_sensor ? &(pm2_5_sensor->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = pm2_5_sensor ? &(pm2_5_sensor->identify_cfg) : NULL; + esp_zb_pm2_5_measurement_cluster_cfg_t *pm2_5_meas_cfg = pm2_5_sensor ? &(pm2_5_sensor->pm2_5_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_pm2_5_measurement_cluster(cluster_list, esp_zb_pm2_5_measurement_cluster_create(pm2_5_meas_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + return cluster_list; +} + +ZigbeePM25Sensor::ZigbeePM25Sensor(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID; + + //Create custom PM2.5 sensor configuration + zigbee_pm2_5_sensor_cfg_t pm2_5_sensor_cfg = ZIGBEE_DEFAULT_PM2_5_SENSOR_CONFIG(); + _cluster_list = zigbee_pm2_5_sensor_clusters_create(&pm2_5_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}; +} + +bool ZigbeePM25Sensor::setMinMaxValue(float min, float max) { + esp_zb_attribute_list_t *pm2_5_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_PM2_5_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_err_t ret = esp_zb_cluster_update_attr(pm2_5_measure_cluster, ESP_ZB_ZCL_ATTR_PM2_5_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&min); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(pm2_5_measure_cluster, ESP_ZB_ZCL_ATTR_PM2_5_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&max); + if (ret != ESP_OK) { + log_e("Failed to set max value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeePM25Sensor::setTolerance(float tolerance) { + esp_zb_attribute_list_t *pm2_5_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_PM2_5_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_err_t ret = esp_zb_pm2_5_measurement_cluster_add_attr(pm2_5_measure_cluster, ESP_ZB_ZCL_ATTR_PM2_5_MEASUREMENT_TOLERANCE_ID, (void *)&tolerance); + if (ret != ESP_OK) { + log_e("Failed to set tolerance: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeePM25Sensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { + 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_PM2_5_MEASUREMENT; + reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; + reporting_info.attr_id = ESP_ZB_ZCL_ATTR_PM2_5_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 = (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; + float delta_f = delta; + memcpy(&reporting_info.u.send_info.delta.s32, &delta_f, sizeof(float)); + + esp_zb_lock_acquire(portMAX_DELAY); + esp_err_t ret = esp_zb_zcl_update_reporting_info(&reporting_info); + esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to set reporting: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeePM25Sensor::setPM25(float pm25) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; + log_v("Updating PM2.5 sensor value..."); + /* Update PM2.5 sensor measured value */ + log_d("Setting PM2.5 to %0.1f", pm25); + esp_zb_lock_acquire(portMAX_DELAY); + ret = esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_PM2_5_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_PM2_5_MEASUREMENT_MEASURED_VALUE_ID, &pm25, false + ); + esp_zb_lock_release(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set PM2.5: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeePM25Sensor::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_PM2_5_MEASUREMENT_MEASURED_VALUE_ID; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; + report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_PM2_5_MEASUREMENT; + report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send PM2.5 report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + log_v("PM2.5 report sent"); + return true; +} + +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeePM25Sensor.h b/libraries/Zigbee/src/ep/ZigbeePM25Sensor.h new file mode 100644 index 00000000000..344f3e1f479 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeePM25Sensor.h @@ -0,0 +1,60 @@ +/* Class of Zigbee PM2.5 sensor endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +// clang-format off +#define ZIGBEE_DEFAULT_PM2_5_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, \ + }, \ + .pm2_5_meas_cfg = \ + { \ + .measured_value = 0.0, \ + .min_measured_value = 0.0, \ + .max_measured_value = 500.0, \ + }, \ + } +// clang-format on + +typedef struct zigbee_pm2_5_sensor_cfg_s { + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_pm2_5_measurement_cluster_cfg_t pm2_5_meas_cfg; +} zigbee_pm2_5_sensor_cfg_t; + +class ZigbeePM25Sensor : public ZigbeeEP { +public: + ZigbeePM25Sensor(uint8_t endpoint); + ~ZigbeePM25Sensor() {} + + // Set the PM2.5 value in 0.1 µg/m³ + bool setPM25(float pm25); + + // Set the min and max value for the PM2.5 sensor in 0.1 µg/m³ + bool setMinMaxValue(float min, float max); + + // Set the tolerance value for the PM2.5 sensor in 0.1 µg/m³ + bool setTolerance(float tolerance); + + // Set the reporting interval for PM2.5 measurement in seconds and delta (PM2.5 change in 0.1 µg/m³) + bool setReporting(uint16_t min_interval, uint16_t max_interval, float delta); + + // Report the PM2.5 value + bool report(); +}; + +#endif // CONFIG_ZB_ENABLED From b333bf2697463f76e98640d4421dfd1560482c1f Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Sat, 5 Apr 2025 12:47:38 -0300 Subject: [PATCH 093/290] fix(zigbeeEP): review of names and memory allocation (#11199) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(zigbeeEP): review of names and memory allocation * fix(zigbeeEP): destructor shall free any allocated memory * fix(zigbee_ep): forgotten var name change * feat(zigbee_ep): use static heap memory for manufacturer and model names * feat(zigbee_ep): changed model and manufacturer to heap * feat(zigbee_ep): use static heap memory allocation * fix(zigbee_ep): using stack only for adding attribute * feat(zigbee_ep): reverting back read data type * fix(zigbee_ep): rooling back to use malloc for remote attr reading * feat(zigbee_ep): check malloc return for null * fix(zigbee_ep): replace nullptr by NULL after C malloc() * ci(pre-commit): Apply automatic fixes * fix(zigbee_ep): fix variable scope Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(zigbee_ep): fix variable scope Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- 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> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- libraries/Zigbee/src/ZigbeeEP.cpp | 59 +++++++++++++++++++------------ libraries/Zigbee/src/ZigbeeEP.h | 4 +++ 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index e7d507dc441..338a4107cf2 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -19,6 +19,8 @@ ZigbeeEP::ZigbeeEP(uint8_t endpoint) { _ep_config.endpoint = 0; _cluster_list = nullptr; _on_identify = nullptr; + _read_model = NULL; + _read_manufacturer = NULL; _time_status = 0; if (!lock) { lock = xSemaphoreCreateBinary(); @@ -33,16 +35,23 @@ void ZigbeeEP::setVersion(uint8_t version) { } bool ZigbeeEP::setManufacturerAndModel(const char *name, const char *model) { + // Allocate a new array of size length + 2 (1 for the length, 1 for null terminator) + char zb_name[ZB_MAX_NAME_LENGTH + 2]; + char zb_model[ZB_MAX_NAME_LENGTH + 2]; + // Convert manufacturer to ZCL string size_t name_length = strlen(name); size_t model_length = strlen(model); - if (name_length > 32 || model_length > 32) { + if (name_length > ZB_MAX_NAME_LENGTH || model_length > ZB_MAX_NAME_LENGTH) { log_e("Manufacturer or model name is too long"); return false; } - // Allocate a new array of size length + 2 (1 for the length, 1 for null terminator) - char *zb_name = new char[name_length + 2]; - char *zb_model = new char[model_length + 2]; + // Get and check the basic cluster + esp_zb_attribute_list_t *basic_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_BASIC, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + if (basic_cluster == nullptr) { + log_e("Failed to get basic cluster"); + return false; + } // Store the length as the first element zb_name[0] = static_cast(name_length); // Cast size_t to char zb_model[0] = static_cast(model_length); @@ -52,9 +61,7 @@ bool ZigbeeEP::setManufacturerAndModel(const char *name, const char *model) { // Null-terminate the array zb_name[name_length + 1] = '\0'; zb_model[model_length + 1] = '\0'; - - // Get the basic cluster and update the manufacturer and model attributes - esp_zb_attribute_list_t *basic_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_BASIC, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + // Update the manufacturer and model attributes esp_err_t ret_name = esp_zb_basic_cluster_add_attr(basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_MANUFACTURER_NAME_ID, (void *)zb_name); if (ret_name != ESP_OK) { log_e("Failed to set manufacturer: 0x%x: %s", ret_name, esp_err_to_name(ret_name)); @@ -63,8 +70,6 @@ bool ZigbeeEP::setManufacturerAndModel(const char *name, const char *model) { if (ret_model != ESP_OK) { log_e("Failed to set model: 0x%x: %s", ret_model, esp_err_to_name(ret_model)); } - delete[] zb_name; - delete[] zb_model; return ret_name == ESP_OK && ret_model == ESP_OK; } @@ -163,10 +168,10 @@ char *ZigbeeEP::readManufacturer(uint8_t endpoint, uint16_t short_addr, esp_zb_i read_req.attr_number = ZB_ARRAY_LENTH(attributes); read_req.attr_field = attributes; - if (_read_manufacturer != nullptr) { + if (_read_manufacturer != NULL) { free(_read_manufacturer); } - _read_manufacturer = nullptr; + _read_manufacturer = NULL; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_read_attr_cmd_req(&read_req); @@ -201,10 +206,10 @@ char *ZigbeeEP::readModel(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_add read_req.attr_number = ZB_ARRAY_LENTH(attributes); read_req.attr_field = attributes; - if (_read_model != nullptr) { + if (_read_model != NULL) { free(_read_model); } - _read_model = nullptr; + _read_model = NULL; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_read_attr_cmd_req(&read_req); @@ -245,20 +250,28 @@ void ZigbeeEP::zbReadBasicCluster(const esp_zb_zcl_attribute_t *attribute) { /* Basic cluster attributes */ if (attribute->id == ESP_ZB_ZCL_ATTR_BASIC_MANUFACTURER_NAME_ID && attribute->data.type == ESP_ZB_ZCL_ATTR_TYPE_CHAR_STRING && attribute->data.value) { zbstring_t *zbstr = (zbstring_t *)attribute->data.value; - char *string = (char *)malloc(zbstr->len + 1); - memcpy(string, zbstr->data, zbstr->len); - string[zbstr->len] = '\0'; - log_i("Peer Manufacturer is \"%s\"", string); - _read_manufacturer = string; + _read_manufacturer = (char *)malloc(zbstr->len + 1); + if (_read_manufacturer == NULL) { + log_e("Failed to allocate memory for manufacturer data"); + xSemaphoreGive(lock); + return; + } + memcpy(_read_manufacturer, zbstr->data, zbstr->len); + _read_manufacturer[zbstr->len] = '\0'; + log_i("Peer Manufacturer is \"%s\"", _read_manufacturer); xSemaphoreGive(lock); } if (attribute->id == ESP_ZB_ZCL_ATTR_BASIC_MODEL_IDENTIFIER_ID && attribute->data.type == ESP_ZB_ZCL_ATTR_TYPE_CHAR_STRING && attribute->data.value) { zbstring_t *zbstr = (zbstring_t *)attribute->data.value; - char *string = (char *)malloc(zbstr->len + 1); - memcpy(string, zbstr->data, zbstr->len); - string[zbstr->len] = '\0'; - log_i("Peer Model is \"%s\"", string); - _read_model = string; + _read_model = (char *)malloc(zbstr->len + 1); + if (_read_model == NULL) { + log_e("Failed to allocate memory for model data"); + xSemaphoreGive(lock); + return; + } + memcpy(_read_model, zbstr->data, zbstr->len); + _read_model[zbstr->len] = '\0'; + log_i("Peer Model is \"%s\"", _read_model); xSemaphoreGive(lock); } } diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index bd142344929..9bdeea5abe9 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -41,6 +41,10 @@ typedef enum { /* Zigbee End Device Class */ class ZigbeeEP { public: + // constants and limits + static constexpr size_t ZB_MAX_NAME_LENGTH = 32; + + // constructors and destructor ZigbeeEP(uint8_t endpoint = 10); ~ZigbeeEP() {} From 0cc8eab836cbc92cada1a82a996a806a919976ba Mon Sep 17 00:00:00 2001 From: Gonzalo Brusco Date: Wed, 9 Apr 2025 05:25:06 -0300 Subject: [PATCH 094/290] Add an option to force IDF's default UART clock source (#11191) * Add an option to force IDF's default UART clock source * feat(uart): adds function to set clock source * feat(uart): add uart clock source selection method * feat(uart): add uart hall function to set the uart clock source * feat(uart): add function to set the uart clock source * feat(uart): set clock source as necessary * fix(uart): missing class qualifier declaration * fix(uart): fixing a typo and non LP UART SoC clk src setting * fix(uart): variable name, typo error * fix(uart): retores previous identation reducing diff load * feat(uart): apply CONFIG_ARDUINO_SERIAL_FORCE_IDF_DEFAULT_CLOCK_SOURCE to LP UART * feat(uart): adds option for UART_CLK_SRC_DEFAULT * feat(uart): adds option for setting default uart clock source from IDF * feat(uart): documents UART_CLK_SRC_DEFAULT as option in header file * feat(uart): documents using the IDF default uart clock source * fix(uart): type missmatch may cause error * fix(uart): type missmatch may cause error, test for -1 * feat(uart): considering both HP and LP default uart clock source * feat(uart): improve the defined value for UART_CLK_SRC_DEFAULT * fix(uart): using uart_sclk_t as hal level parameter * feat(uart): apply default LP uart clock source * fix(uart): considers that it may set the LP UART as well * feat(uart): using UART SCLK enum for uart clock source values * fix(uart): using UART_CLK_SRC_RTC now * fix(uart): documentation using UART_CLK_SRC_RTC now * fix(uart): fix old commentary that is not correct anymore * fix(uart): wrong identation in code line * fix(uart): using uart number as argument instead * fix(uart): using uart number as argument in setClockSource() * fix(uart): using uart number as parameter in uartSetClockSource() * feat(uart): update Kconfig.projbuild to reflect functionality * feat(uart): removing Kconfig.projbuild option to force default clk src * feat(uart): removes kconfig option to force uart default clk src * fix(uart): replacing #if #endif by #if #elif #endif for the same enum * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Sugar Glider Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- cores/esp32/HardwareSerial.cpp | 18 ++++ cores/esp32/HardwareSerial.h | 34 +++++++ cores/esp32/esp32-hal-uart.c | 160 ++++++++++++++++++++++++--------- cores/esp32/esp32-hal-uart.h | 13 +++ 4 files changed, 182 insertions(+), 43 deletions(-) diff --git a/cores/esp32/HardwareSerial.cpp b/cores/esp32/HardwareSerial.cpp index 76135691411..6d762da21fb 100644 --- a/cores/esp32/HardwareSerial.cpp +++ b/cores/esp32/HardwareSerial.cpp @@ -607,6 +607,24 @@ bool HardwareSerial::setMode(SerialMode mode) { return uartSetMode(_uart, mode); } +// Sets the UART Clock Source based on the compatible SoC options +// This method must be called before starting UART using begin(), otherwise it won't have any effect. +// Clock Source Options are: +// UART_CLK_SRC_DEFAULT :: any SoC - it will set whatever IDF defines as the default UART Clock Source +// UART_CLK_SRC_APB :: ESP32, ESP32-S2, ESP32-C3 and ESP32-S3 +// UART_CLK_SRC_PLL :: ESP32-C2, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2 and ESP32-P4 +// UART_CLK_SRC_XTAL :: ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2, ESP32-S3 and ESP32-P4 +// UART_CLK_SRC_RTC :: ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2, ESP32-S3 and ESP32-P4 +// UART_CLK_SRC_REF_TICK :: ESP32 and ESP32-S2 +// Note: CLK_SRC_PLL Freq depends on the SoC - ESP32-C2 has 40MHz, ESP32-H2 has 48MHz and ESP32-C5, C6, C61 and P4 has 80MHz +// Note: ESP32-C6, C61, ESP32-P4 and ESP32-C5 have LP UART that will use only RTC_FAST or XTAL/2 as Clock Source +bool HardwareSerial::setClockSource(SerialClkSrc clkSrc) { + if (_uart) { + log_e("No Clock Source change was done. This function must be called before beginning UART%d.", _uart_nr); + return false; + } + return uartSetClockSource(_uart_nr, (uart_sclk_t)clkSrc); +} // minimum total RX Buffer size is the UART FIFO space (128 bytes for most SoC) + 1. IDF imposition. // LP UART has FIFO of 16 bytes size_t HardwareSerial::setRxBufferSize(size_t new_size) { diff --git a/cores/esp32/HardwareSerial.h b/cores/esp32/HardwareSerial.h index b1f6df17724..e974f112701 100644 --- a/cores/esp32/HardwareSerial.h +++ b/cores/esp32/HardwareSerial.h @@ -96,6 +96,29 @@ typedef enum { UART_PARITY_ERROR } hardwareSerial_error_t; +typedef enum { + UART_CLK_SRC_DEFAULT = UART_SCLK_DEFAULT, +#if SOC_UART_SUPPORT_APB_CLK + UART_CLK_SRC_APB = UART_SCLK_APB, +#endif +#if SOC_UART_SUPPORT_PLL_F40M_CLK + UART_CLK_SRC_PLL = UART_SCLK_PLL_F40M, +#elif SOC_UART_SUPPORT_PLL_F80M_CLK + UART_CLK_SRC_PLL = UART_SCLK_PLL_F80M, +#elif CONFIG_IDF_TARGET_ESP32H2 + UART_CLK_SRC_PLL = UART_SCLK_PLL_F48M, +#endif +#if SOC_UART_SUPPORT_XTAL_CLK + UART_CLK_SRC_XTAL = UART_SCLK_XTAL, +#endif +#if SOC_UART_SUPPORT_RTC_CLK + UART_CLK_SRC_RTC = UART_SCLK_RTC, +#endif +#if SOC_UART_SUPPORT_REF_TICK + UART_CLK_SRC_REF_TICK = UART_SCLK_REF_TICK, +#endif +} SerialClkSrc; + #ifndef ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE #ifndef CONFIG_ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE #define ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE 2048 @@ -344,6 +367,17 @@ class HardwareSerial : public Stream { // UART_MODE_RS485_COLLISION_DETECT = 0x03 mode: RS485 collision detection UART mode (used for test purposes) // UART_MODE_RS485_APP_CTRL = 0x04 mode: application control RS485 UART mode (used for test purposes) bool setMode(SerialMode mode); + // Used to set the UART clock source mode. It must be set before calling begin(), otherwise it won't have any effect. + // Not all clock source are available to every SoC. The compatible option are listed here: + // UART_CLK_SRC_DEFAULT :: any SoC - it will set whatever IDF defines as the default UART Clock Source + // UART_CLK_SRC_APB :: ESP32, ESP32-S2, ESP32-C3 and ESP32-S3 + // UART_CLK_SRC_PLL :: ESP32-C2, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2 and ESP32-P4 + // UART_CLK_SRC_XTAL :: ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2, ESP32-S3 and ESP32-P4 + // UART_CLK_SRC_RTC :: ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2, ESP32-S3 and ESP32-P4 + // UART_CLK_SRC_REF_TICK :: ESP32 and ESP32-S2 + // Note: CLK_SRC_PLL Freq depends on the SoC - ESP32-C2 has 40MHz, ESP32-H2 has 48MHz and ESP32-C5, C6, C61 and P4 has 80MHz + // Note: ESP32-C6, C61, ESP32-P4 and ESP32-C5 have LP UART that will use only RTC_FAST or XTAL/2 as Clock Source + bool setClockSource(SerialClkSrc clkSrc); size_t setRxBufferSize(size_t new_size); size_t setTxBufferSize(size_t new_size); diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index 75e2da013ea..d2e98a2341a 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -58,6 +58,7 @@ struct uart_struct_t { uint16_t _rx_buffer_size, _tx_buffer_size; // UART RX and TX buffer sizes bool _inverted; // UART inverted signal uint8_t _rxfifo_full_thrhd; // UART RX FIFO full threshold + int8_t _uart_clock_source; // UART Clock Source used when it is started using uartBegin() }; #if CONFIG_DISABLE_HAL_LOCKS @@ -66,21 +67,21 @@ struct uart_struct_t { #define UART_MUTEX_UNLOCK() static uart_t _uart_bus_array[] = { - {0, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, + {0, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1}, #if SOC_UART_NUM > 1 - {1, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, + {1, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1}, #endif #if SOC_UART_NUM > 2 - {2, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, + {2, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1}, #endif #if SOC_UART_NUM > 3 - {3, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, + {3, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1}, #endif #if SOC_UART_NUM > 4 - {4, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, + {4, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1}, #endif #if SOC_UART_NUM > 5 - {5, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, + {5, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1}, #endif }; @@ -95,21 +96,21 @@ static uart_t _uart_bus_array[] = { xSemaphoreGive(uart->lock) static uart_t _uart_bus_array[] = { - {NULL, 0, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, + {NULL, 0, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1}, #if SOC_UART_NUM > 1 - {NULL, 1, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, + {NULL, 1, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1}, #endif #if SOC_UART_NUM > 2 - {NULL, 2, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, + {NULL, 2, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1}, #endif #if SOC_UART_NUM > 3 - {NULL, 3, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, + {NULL, 3, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1}, #endif #if SOC_UART_NUM > 4 - {NULL, 4, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, + {NULL, 4, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1}, #endif #if SOC_UART_NUM > 5 - {NULL, 5, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0}, + {NULL, 5, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1}, #endif }; @@ -664,30 +665,40 @@ uart_t *uartBegin( rxfifo_full_thrhd = uart_config.rx_flow_ctrl_thresh; // makes sure that it will be set correctly in the struct uart_config.baud_rate = baudrate; #if SOC_UART_LP_NUM >= 1 - if (uart_nr >= SOC_UART_HP_NUM) { // it is a LP UART NUM - uart_config.lp_source_clk = LP_UART_SCLK_DEFAULT; // use default LP clock - log_v("Setting UART%d to use LP clock", uart_nr); + if (uart_nr >= SOC_UART_HP_NUM) { // it is a LP UART NUM + if (uart->_uart_clock_source > 0) { + uart_config.lp_source_clk = (soc_periph_lp_uart_clk_src_t)uart->_uart_clock_source; // use user defined LP UART clock + log_v("Setting UART%d to user defined LP clock source (%d) ", uart_nr, uart->_uart_clock_source); + } else { + uart_config.lp_source_clk = LP_UART_SCLK_DEFAULT; // use default LP clock + log_v("Setting UART%d to Default LP clock source", uart_nr); + } } else -#endif +#endif // SOC_UART_LP_NUM >= 1 { - // there is an issue when returning from light sleep with the C6 and H2: the uart baud rate is not restored - // therefore, uart clock source will set to XTAL for all SoC that support it. This fix solves the C6|H2 issue. + if (uart->_uart_clock_source >= 0) { + uart_config.source_clk = (soc_module_clk_t)uart->_uart_clock_source; // use user defined HP UART clock + log_v("Setting UART%d to user defined HP clock source (%d) ", uart_nr, uart->_uart_clock_source); + } else { + // there is an issue when returning from light sleep with the C6 and H2: the uart baud rate is not restored + // therefore, uart clock source will set to XTAL for all SoC that support it. This fix solves the C6|H2 issue. #if SOC_UART_SUPPORT_XTAL_CLK - uart_config.source_clk = UART_SCLK_XTAL; // valid for C2, S3, C3, C6, H2 and P4 - log_v("Setting UART%d to use XTAL clock", uart_nr); + uart_config.source_clk = UART_SCLK_XTAL; // valid for C2, S3, C3, C6, H2 and P4 + log_v("Setting UART%d to use XTAL clock", uart_nr); #elif SOC_UART_SUPPORT_REF_TICK - 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 - log_v("Setting UART%d to use REF_TICK clock", uart_nr); - } else { - uart_config.source_clk = UART_SCLK_APB; // baudrate may change with the APB Frequency! - log_v("Setting UART%d to use APB clock", uart_nr); - } + 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 + log_v("Setting UART%d to use REF_TICK clock", uart_nr); + } else { + uart_config.source_clk = UART_SCLK_APB; // baudrate may change with the APB Frequency! + log_v("Setting UART%d to use APB clock", uart_nr); + } #else - // Default CLK Source: CLK_APB for ESP32|S2|S3|C3 -- CLK_PLL_F40M for C2 -- CLK_PLL_F48M for H2 -- CLK_PLL_F80M for C6 - uart_config.source_clk = UART_SCLK_DEFAULT; // baudrate may change with the APB Frequency! - log_v("Setting UART%d to use DEFAULT clock", uart_nr); -#endif + // Default CLK Source: CLK_APB for ESP32|S2|S3|C3 -- CLK_PLL_F40M for C2 -- CLK_PLL_F48M for H2 -- CLK_PLL_F80M for C6|P4 + uart_config.source_clk = UART_SCLK_DEFAULT; // baudrate may change with the APB Frequency! + log_v("Setting UART%d to use DEFAULT clock", uart_nr); +#endif // SOC_UART_SUPPORT_XTAL_CLK + } } UART_MUTEX_LOCK(); @@ -716,6 +727,14 @@ uart_t *uartBegin( uart->_tx_buffer_size = tx_buffer_size; uart->has_peek = false; uart->peek_byte = 0; +#if SOC_UART_LP_NUM >= 1 + if (uart_nr >= SOC_UART_HP_NUM) { + uart->_uart_clock_source = uart_config.lp_source_clk; + } else +#endif + { + uart->_uart_clock_source = uart_config.source_clk; + } } UART_MUTEX_UNLOCK(); @@ -975,22 +994,52 @@ bool uartSetBaudRate(uart_t *uart, uint32_t baud_rate) { return false; } bool retCode = true; - UART_MUTEX_LOCK(); -#if SOC_UART_SUPPORT_XTAL_CLK // ESP32-S3, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-H2 and ESP32-P4 - soc_module_clk_t newClkSrc = UART_SCLK_XTAL; + soc_module_clk_t newClkSrc = UART_SCLK_DEFAULT; + int8_t previousClkSrc = uart->_uart_clock_source; #if SOC_UART_LP_NUM >= 1 if (uart->num >= SOC_UART_HP_NUM) { // it is a LP UART NUM - newClkSrc = LP_UART_SCLK_DEFAULT; // use default LP clock + if (uart->_uart_clock_source > 0) { + newClkSrc = (soc_periph_lp_uart_clk_src_t)uart->_uart_clock_source; // use user defined LP UART clock + log_v("Setting UART%d to user defined LP clock source (%d) ", uart->num, newClkSrc); + } else { + newClkSrc = LP_UART_SCLK_DEFAULT; // use default LP clock + log_v("Setting UART%d to Default LP clock source", uart->num); + } + } else +#endif // SOC_UART_LP_NUM >= 1 + { + if (uart->_uart_clock_source >= 0) { + newClkSrc = (soc_module_clk_t)uart->_uart_clock_source; // use user defined HP UART clock + log_v("Setting UART%d to use HP clock source (%d) ", uart->num, newClkSrc); + } else { + // there is an issue when returning from light sleep with the C6 and H2: the uart baud rate is not restored + // therefore, uart clock source will set to XTAL for all SoC that support it. This fix solves the C6|H2 issue. +#if SOC_UART_SUPPORT_XTAL_CLK + newClkSrc = UART_SCLK_XTAL; // valid for C2, S3, C3, C6, H2 and P4 + log_v("Setting UART%d to use XTAL clock", uart->num); +#elif SOC_UART_SUPPORT_REF_TICK + if (baud_rate <= REF_TICK_BAUDRATE_LIMIT) { + newClkSrc = UART_SCLK_REF_TICK; // valid for ESP32, S2 - MAX supported baud rate is 250 Kbps + log_v("Setting UART%d to use REF_TICK clock", uart->num); + } else { + newClkSrc = UART_SCLK_APB; // baudrate may change with the APB Frequency! + log_v("Setting UART%d to use APB clock", uart->num); + } +#else + // Default CLK Source: CLK_APB for ESP32|S2|S3|C3 -- CLK_PLL_F40M for C2 -- CLK_PLL_F48M for H2 -- CLK_PLL_F80M for C6|P4 + // using newClkSrc = UART_SCLK_DEFAULT as defined in the variable declaration + log_v("Setting UART%d to use DEFAULT clock", uart->num); +#endif // SOC_UART_SUPPORT_XTAL_CLK + } } -#endif - // ESP32-P4 demands an atomic operation for setting the clock source - HP_UART_SRC_CLK_ATOMIC() { - uart_ll_set_sclk(UART_LL_GET_HW(uart->num), newClkSrc); + UART_MUTEX_LOCK(); + // if necessary, set the correct UART Clock Source before changing the baudrate + if (previousClkSrc < 0 || previousClkSrc != newClkSrc) { + HP_UART_SRC_CLK_ATOMIC() { + uart_ll_set_sclk(UART_LL_GET_HW(uart->num), newClkSrc); + } + uart->_uart_clock_source = newClkSrc; } -#else // ESP32, ESP32-S2 - 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) { log_v("Setting UART%d baud rate to %ld.", uart->num, baud_rate); uart->_baudrate = baud_rate; @@ -1084,6 +1133,31 @@ bool uartSetMode(uart_t *uart, uart_mode_t mode) { return retCode; } +// this function will set the uart clock source +// it must be called before uartBegin(), otherwise it won't change any thing. +bool uartSetClockSource(uint8_t uartNum, uart_sclk_t clkSrc) { + if (uartNum >= SOC_UART_NUM) { + log_e("UART%d is invalid. This device has %d UARTs, from 0 to %d.", uartNum, SOC_UART_NUM, SOC_UART_NUM - 1); + return false; + } + uart_t *uart = &_uart_bus_array[uartNum]; +#if SOC_UART_LP_NUM >= 1 + if (uart->num >= SOC_UART_HP_NUM) { + switch (clkSrc) { + case UART_SCLK_XTAL: uart->_uart_clock_source = LP_UART_SCLK_XTAL_D2; break; + case UART_SCLK_RTC: uart->_uart_clock_source = LP_UART_SCLK_LP_FAST; break; + case UART_SCLK_DEFAULT: + default: uart->_uart_clock_source = LP_UART_SCLK_DEFAULT; + } + } else +#endif + { + uart->_uart_clock_source = clkSrc; + } + //log_i("UART%d set clock source to %d", uart->num, uart->_uart_clock_source); + return true; +} + void uartSetDebug(uart_t *uart) { // LP UART is not supported for debug if (uart == NULL || uart->num >= SOC_UART_HP_NUM) { diff --git a/cores/esp32/esp32-hal-uart.h b/cores/esp32/esp32-hal-uart.h index 4d686fdd23d..41b005aa151 100644 --- a/cores/esp32/esp32-hal-uart.h +++ b/cores/esp32/esp32-hal-uart.h @@ -97,6 +97,19 @@ bool uartSetHwFlowCtrlMode(uart_t *uart, uart_hw_flowcontrol_t mode, uint8_t thr // UART_MODE_RS485_APP_CTRL = 0x04 mode: application control RS485 UART mode (used for test purposes) bool uartSetMode(uart_t *uart, uart_mode_t mode); +// Used to set the UART clock source mode. It must be set before calling uartBegin(), otherwise it won't have any effect. +// Not all clock source are available to every SoC. The compatible option are listed here: +// UART_SCLK_DEFAULT :: any SoC - it will set whatever IDF defines as the default UART Clock Source +// UART_SCLK_APB :: ESP32, ESP32-S2, ESP32-C3 and ESP32-S3 +// UART_SCLK_PLL_F80M :: ESP32-C5, ESP32-C6, ESP32-C61 and ESP32-P4 +// UART_SCLK_PLL_F40M :: ESP32-C2 +// UART_SCLK_PLL_F48M :: ESP32-H2 +// UART_SCLK_XTAL :: ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2, ESP32-S3 and ESP32-P4 +// UART_SCLK_RTC :: ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2, ESP32-S3 and ESP32-P4 +// UART_SCLK_REF_TICK :: ESP32 and ESP32-S2 +// Note: ESP32-C6, C61, ESP32-P4 and ESP32-C5 have LP UART that will use only LP_UART_SCLK_LP_FAST (RTC_FAST) or LP_UART_SCLK_XTAL_D2 (XTAL/2) as Clock Source +bool uartSetClockSource(uint8_t uartNum, uart_sclk_t clkSrc); + void uartStartDetectBaudrate(uart_t *uart); unsigned long uartDetectBaudrate(uart_t *uart); From 7f609450186080b63225115ee7be21679c76c7e8 Mon Sep 17 00:00:00 2001 From: Jacob Williams <47766188+SaintSampo@users.noreply.github.com> Date: Wed, 9 Apr 2025 04:25:39 -0400 Subject: [PATCH 095/290] fix(board): Alfredo NoU3 pins_arduino.h uses uint8_t but it causes error with esp32-hal-gpio.h (#11206) * fix(board): Alfredo NoU3 include stdint.h * fix(hal_gpio): lets pins_arduino.h to use stdint and stdbool types * feat(pins_arduino): fixes lack of stdint in the right place * fix(pins_arduino): reverts all changes to this file * fix(pins_arduino): reverts all changes to this file * fix(pins_arduino): reverts all changes back to original pr --------- Co-authored-by: Sugar Glider --- variants/alfredo-nou3/pins_arduino.h | 1 + 1 file changed, 1 insertion(+) diff --git a/variants/alfredo-nou3/pins_arduino.h b/variants/alfredo-nou3/pins_arduino.h index 88bdbea0bb1..8b5a7d51b9f 100644 --- a/variants/alfredo-nou3/pins_arduino.h +++ b/variants/alfredo-nou3/pins_arduino.h @@ -1,6 +1,7 @@ #ifndef Pins_Arduino_h #define Pins_Arduino_h +#include #define USB_VID 0xAFD0 #define USB_PID 0x0003 #define USB_MANUFACTURER "Alfredo" From d3509ef98b2990dd7402ebc589d751a1b58fec07 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, 9 Apr 2025 10:25:58 +0200 Subject: [PATCH 096/290] feat(zigbee): Add battery voltage attribute support (#11210) * feat(zigbee): Add battery voltage attribute support * Update libraries/Zigbee/src/ZigbeeEP.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../Zigbee_Temp_Hum_Sensor_Sleepy.ino | 6 ++--- libraries/Zigbee/src/ZigbeeEP.cpp | 22 ++++++++++++++++++- libraries/Zigbee/src/ZigbeeEP.h | 7 +++--- 3 files changed, 28 insertions(+), 7 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 3eefd973dd2..e9d08d32175 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 @@ -85,9 +85,9 @@ void setup() { // Set tolerance for temperature measurement in °C (lowest possible value is 0.01°C) zbTempSensor.setTolerance(1); - // Set power source to battery and set battery percentage to measured value (now 100% for demonstration) - // The value can be also updated by calling zbTempSensor.setBatteryPercentage(percentage) anytime - zbTempSensor.setPowerSource(ZB_POWER_SOURCE_BATTERY, 100); + // Set power source to battery, battery percentage and battery voltage (now 100% and 3.5V for demonstration) + // The value can be also updated by calling zbTempSensor.setBatteryPercentage(percentage) or zbTempSensor.setBatteryVoltage(voltage) anytime after Zigbee.begin() + zbTempSensor.setPowerSource(ZB_POWER_SOURCE_BATTERY, 100, 35); // Add humidity cluster to the temperature sensor device with min, max and tolerance values zbTempSensor.addHumiditySensor(0, 100, 1); diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index 338a4107cf2..cf52a902983 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -73,7 +73,7 @@ bool ZigbeeEP::setManufacturerAndModel(const char *name, const char *model) { return ret_name == ESP_OK && ret_model == ESP_OK; } -bool ZigbeeEP::setPowerSource(zb_power_source_t power_source, uint8_t battery_percentage) { +bool ZigbeeEP::setPowerSource(zb_power_source_t power_source, uint8_t battery_percentage, uint8_t battery_voltage) { esp_zb_attribute_list_t *basic_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_BASIC, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); esp_err_t ret = esp_zb_cluster_update_attr(basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_POWER_SOURCE_ID, (void *)&power_source); if (ret != ESP_OK) { @@ -93,6 +93,11 @@ bool ZigbeeEP::setPowerSource(zb_power_source_t power_source, uint8_t battery_pe log_e("Failed to add battery percentage attribute: 0x%x: %s", ret, esp_err_to_name(ret)); return false; } + ret = esp_zb_power_config_cluster_add_attr(power_config_cluster, ESP_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_ID, (void *)&battery_voltage); + if (ret != ESP_OK) { + log_e("Failed to add battery voltage attribute: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } ret = esp_zb_cluster_list_add_power_config_cluster(_cluster_list, power_config_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); if (ret != ESP_OK) { log_e("Failed to add power config cluster: 0x%x: %s", ret, esp_err_to_name(ret)); @@ -125,6 +130,21 @@ bool ZigbeeEP::setBatteryPercentage(uint8_t percentage) { return true; } +bool ZigbeeEP::setBatteryVoltage(uint8_t voltage) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; + esp_zb_lock_acquire(portMAX_DELAY); + ret = esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_POWER_CONFIG, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_ID, &voltage, false + ); + esp_zb_lock_release(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set battery voltage: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + log_v("Battery voltage updated"); + return true; +} + bool ZigbeeEP::reportBatteryPercentage() { /* Send report attributes command */ esp_zb_zcl_report_attr_cmd_t report_attr_cmd; diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index 9bdeea5abe9..e13b3b59de9 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -81,9 +81,10 @@ class ZigbeeEP { 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 - bool setPowerSource(zb_power_source_t power_source, uint8_t percentage = 255); - bool setBatteryPercentage(uint8_t percentage); - bool reportBatteryPercentage(); + bool setPowerSource(zb_power_source_t power_source, uint8_t percentage = 0xff, uint8_t voltage = 0xff); // voltage in 100mV + bool setBatteryPercentage(uint8_t percentage); // 0-100 % + bool setBatteryVoltage(uint8_t voltage); // voltage in 100mV (example value 35 for 3.5V) + bool reportBatteryPercentage(); // battery voltage is not reportable attribute // Set time bool addTimeCluster(tm time = {}, int32_t gmt_offset = 0); // gmt offset in seconds From 8e8b1cbd31d0f27a66e84f5de6cb48366dc630b4 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 9 Apr 2025 10:26:13 +0200 Subject: [PATCH 097/290] Use CONFIG_BT_BLUEDROID_ENABLED for enabling (#11214) Co-authored-by: Sugar Glider --- cores/esp32/esp32-hal-bt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-bt.c b/cores/esp32/esp32-hal-bt.c index 5f1148bd492..1e5f73e324c 100644 --- a/cores/esp32/esp32-hal-bt.c +++ b/cores/esp32/esp32-hal-bt.c @@ -15,7 +15,7 @@ #include "esp32-hal-bt.h" #if SOC_BT_SUPPORTED -#ifdef CONFIG_BT_ENABLED +#ifdef CONFIG_BT_BLUEDROID_ENABLED #if CONFIG_IDF_TARGET_ESP32 bool btInUse() { From 2647cbbbc254a229fca5311e2f5c8f3ece811e25 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Wed, 9 Apr 2025 05:56:32 -0300 Subject: [PATCH 098/290] refactor(rmt): refactored RMT loopback example (#11221) * feat(rmt): refactored RMT loopback 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/RMT/RMTLoopback/RMTLoopback.ino | 49 ++++++++++++------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/libraries/ESP32/examples/RMT/RMTLoopback/RMTLoopback.ino b/libraries/ESP32/examples/RMT/RMTLoopback/RMTLoopback.ino index 17e7af290bf..5d0406aee0e 100644 --- a/libraries/ESP32/examples/RMT/RMTLoopback/RMTLoopback.ino +++ b/libraries/ESP32/examples/RMT/RMTLoopback/RMTLoopback.ino @@ -1,4 +1,4 @@ -// Copyright 2023 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -35,14 +35,11 @@ rmt_data_t my_data[256]; rmt_data_t data[256]; -static EventGroupHandle_t events; - #define RMT_FREQ 10000000 // tick time is 100ns -#define RMT_NUM_EXCHANGED_DATA 30 +#define RMT_NUM_EXCHANGED_DATA 32 void setup() { Serial.begin(115200); - events = xEventGroupCreate(); if (!rmtInit(RMT_TX_PIN, RMT_TX_MODE, RMT_MEM_NUM_BLOCKS_1, RMT_FREQ)) { Serial.println("init sender failed\n"); @@ -50,25 +47,41 @@ void setup() { if (!rmtInit(RMT_RX_PIN, RMT_RX_MODE, RMT_MEM_RX, RMT_FREQ)) { Serial.println("init receiver failed\n"); } + Serial.println(); + Serial.println("RMT tick set to: 100ns"); // End of transmission shall be detected when line is idle for 2us = 20*100ns rmtSetRxMaxThreshold(RMT_RX_PIN, 20); // Disable Glitch filter rmtSetRxMinThreshold(RMT_RX_PIN, 0); - Serial.println("real tick set to: 100ns"); - Serial.printf("\nPlease connect GPIO %d to GPIO %d, now.\n", RMT_TX_PIN, RMT_RX_PIN); -} - -void loop() { - // Init data - int i; - for (i = 0; i < 255; i++) { - data[i].val = 0x80010001 + ((i % 13) << 16) + 13 - (i % 13); + // create multiple pulses with different width to be sent + for (int i = 0; i < 255; i++) { + data[i].level0 = 1; // HIGH + data[i].duration0 = 1 + 13 - (i % 13); // number of Tick on High + data[i].level1 = 0; // LOW + data[i].duration1 = 1 + (i % 13); // number of Ticks on Low my_data[i].val = 0; } data[255].val = 0; + Serial.println(); + Serial.println("===================================================================================================="); + Serial.println("Preloaded Data that will sent (time in 0.1us):"); + // Printout the received data plus the original values + for (int i = 0; i < RMT_NUM_EXCHANGED_DATA; i++) { + Serial.printf("%08lx=[%c 0x%02x|%c 0x%02x] ", data[i].val, data[i].level0 ? 'H' : 'L', data[i].duration0, data[i].level1 ? 'H' : 'L', data[i].duration1); + if (!((i + 1) % 4)) { + Serial.println(); + } + } + Serial.println("===================================================================================================="); + Serial.printf("Please connect GPIO %d to GPIO %d, now.", RMT_TX_PIN, RMT_RX_PIN); + Serial.println(); + Serial.println(); +} + +void loop() { // Start an async data read size_t rx_num_symbols = RMT_NUM_EXCHANGED_DATA; rmtReadAsync(RMT_RX_PIN, my_data, &rx_num_symbols); @@ -84,13 +97,13 @@ void loop() { Serial.printf("Got %d RMT symbols\n", rx_num_symbols); // Printout the received data plus the original values - for (i = 0; i < 60; i++) { + for (int i = 0; i < RMT_NUM_EXCHANGED_DATA; i++) { Serial.printf("%08lx=%08lx ", my_data[i].val, data[i].val); if (!((i + 1) % 4)) { - Serial.println(""); + Serial.println(); } } - Serial.println("\n"); + Serial.println(); - delay(500); + delay(2000); } From be57376b6bfae6c3bb13d92c87b1e341cb5b84bb Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Wed, 9 Apr 2025 05:56:52 -0300 Subject: [PATCH 099/290] fix(usb): uninitilized variable warning message (#11222) --- cores/esp32/USB.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cores/esp32/USB.cpp b/cores/esp32/USB.cpp index 8fdd7a3ab71..269e9a76cb3 100644 --- a/cores/esp32/USB.cpp +++ b/cores/esp32/USB.cpp @@ -100,6 +100,7 @@ static bool tinyusb_device_suspended = false; void tud_mount_cb(void) { tinyusb_device_mounted = true; arduino_usb_event_data_t p; + p.suspend.remote_wakeup_en = 0; arduino_usb_event_post(ARDUINO_USB_EVENTS, ARDUINO_USB_STARTED_EVENT, &p, sizeof(arduino_usb_event_data_t), portMAX_DELAY); } @@ -107,6 +108,7 @@ void tud_mount_cb(void) { void tud_umount_cb(void) { tinyusb_device_mounted = false; arduino_usb_event_data_t p; + p.suspend.remote_wakeup_en = 0; arduino_usb_event_post(ARDUINO_USB_EVENTS, ARDUINO_USB_STOPPED_EVENT, &p, sizeof(arduino_usb_event_data_t), portMAX_DELAY); } @@ -123,6 +125,7 @@ void tud_suspend_cb(bool remote_wakeup_en) { void tud_resume_cb(void) { tinyusb_device_suspended = false; arduino_usb_event_data_t p; + p.suspend.remote_wakeup_en = 0; arduino_usb_event_post(ARDUINO_USB_EVENTS, ARDUINO_USB_RESUME_EVENT, &p, sizeof(arduino_usb_event_data_t), portMAX_DELAY); } From bd4b32522c09497f3005ab60a1081836b34ea6bc Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Wed, 9 Apr 2025 05:57:12 -0300 Subject: [PATCH 100/290] feat(usb): add a few more consumer control HID commands (#11227) --- libraries/USB/src/USBHIDConsumerControl.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/USB/src/USBHIDConsumerControl.h b/libraries/USB/src/USBHIDConsumerControl.h index e65e529a77b..a5458df288e 100644 --- a/libraries/USB/src/USBHIDConsumerControl.h +++ b/libraries/USB/src/USBHIDConsumerControl.h @@ -38,9 +38,14 @@ // Media Control #define CONSUMER_CONTROL_PLAY_PAUSE 0x00CD +#define CONSUMER_CONTROL_RECORD 0x00B2 +#define CONSUMER_CONTROL_FAST_FORWARD 0x00B3 +#define CONSUMER_CONTROL_REWIND 0x00B4 #define CONSUMER_CONTROL_SCAN_NEXT 0x00B5 #define CONSUMER_CONTROL_SCAN_PREVIOUS 0x00B6 #define CONSUMER_CONTROL_STOP 0x00B7 +#define CONSUMER_CONTROL_EJECT 0x00B8 +#define CONSUMER_CONTROL_PLAY_PAUSE 0x00CD #define CONSUMER_CONTROL_VOLUME 0x00E0 #define CONSUMER_CONTROL_MUTE 0x00E2 #define CONSUMER_CONTROL_BASS 0x00E3 From 3fcc316d3cd9d5c565c6e9b20a56d86e77f2537c Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Mon, 14 Apr 2025 05:24:30 -0300 Subject: [PATCH 101/290] fix(usb_hid): duplicated CONSUMER_CONTROL_PLAY_PAUSE (#11242) --- libraries/USB/src/USBHIDConsumerControl.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/USB/src/USBHIDConsumerControl.h b/libraries/USB/src/USBHIDConsumerControl.h index a5458df288e..7a59c70b6b1 100644 --- a/libraries/USB/src/USBHIDConsumerControl.h +++ b/libraries/USB/src/USBHIDConsumerControl.h @@ -37,7 +37,6 @@ #define CONSUMER_CONTROL_WIRELESS_RADIO_SLIDER_SWITCH 0x00C8 // Media Control -#define CONSUMER_CONTROL_PLAY_PAUSE 0x00CD #define CONSUMER_CONTROL_RECORD 0x00B2 #define CONSUMER_CONTROL_FAST_FORWARD 0x00B3 #define CONSUMER_CONTROL_REWIND 0x00B4 From 60c8206ee64ca73bcc1d6444b384f24a766b9637 Mon Sep 17 00:00:00 2001 From: Mathieu Carbou Date: Mon, 14 Apr 2025 11:08:33 +0200 Subject: [PATCH 102/290] feat(logging): Arduino log redirection (#11159) * feat(logging): Arduino log redirection * fix(uart): log will only use ets_printf() for uart and cdc * feat(uart_cdc): when CDC is logging, UART is silent * feat(uart_cdc): when CDC is logging, UART is silent * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Sugar Glider Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- cores/esp32/HWCDC.cpp | 1 + cores/esp32/USBCDC.cpp | 1 + cores/esp32/esp32-hal-uart.c | 10 +--------- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/cores/esp32/HWCDC.cpp b/cores/esp32/HWCDC.cpp index 170e323a035..062317d9f53 100644 --- a/cores/esp32/HWCDC.cpp +++ b/cores/esp32/HWCDC.cpp @@ -603,6 +603,7 @@ void HWCDC::setDebugOutput(bool en) { } else { ets_install_putc2(NULL); } + ets_install_putc1(NULL); // closes UART log output } #if ARDUINO_USB_MODE && ARDUINO_USB_CDC_ON_BOOT // Hardware JTAG CDC selected diff --git a/cores/esp32/USBCDC.cpp b/cores/esp32/USBCDC.cpp index 945021a79e2..c7bb4582d4f 100644 --- a/cores/esp32/USBCDC.cpp +++ b/cores/esp32/USBCDC.cpp @@ -455,6 +455,7 @@ void USBCDC::setDebugOutput(bool en) { } else { ets_install_putc2(NULL); } + ets_install_putc1(NULL); // closes UART log output } USBCDC::operator bool() const { diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index d2e98a2341a..5311aff4f37 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -1186,7 +1186,7 @@ int log_printfv(const char *format, va_list arg) { return 0; } } -/* + /* // This causes dead locks with logging in specific cases and also with C++ constructors that may send logs #if !CONFIG_DISABLE_HAL_LOCKS if(s_uart_debug_nr != -1 && _uart_bus_array[s_uart_debug_nr].lock){ @@ -1194,16 +1194,8 @@ int log_printfv(const char *format, va_list arg) { } #endif */ -#if (ARDUINO_USB_CDC_ON_BOOT == 1 && ARDUINO_USB_MODE == 0) || CONFIG_IDF_TARGET_ESP32C3 \ - || ((CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32P4) && ARDUINO_USB_CDC_ON_BOOT == 1) vsnprintf(temp, len + 1, format, arg); ets_printf("%s", temp); -#else - int wlen = vsnprintf(temp, len + 1, format, arg); - for (int i = 0; i < wlen; i++) { - ets_write_char_uart(temp[i]); - } -#endif /* // This causes dead locks with logging and also with constructors that may send logs #if !CONFIG_DISABLE_HAL_LOCKS From 9cad83bacf7262e09ee17ee7b6a7b2eb620e2467 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 14 Apr 2025 11:13:55 +0200 Subject: [PATCH 103/290] check for `CONFIG_BT_BLUEDROID_ENABLED` in esp32-hal-misc.c (#11234) * check for `CONFIG_BT_BLUEDROID_ENABLED` in esp32-hal-misc.c * overseen changes to `CONFIG_BT_BLUEDROID_ENABLED` --- cores/esp32/esp32-hal-misc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cores/esp32/esp32-hal-misc.c b/cores/esp32/esp32-hal-misc.c index 50e2973d27a..594acd38153 100644 --- a/cores/esp32/esp32-hal-misc.c +++ b/cores/esp32/esp32-hal-misc.c @@ -25,9 +25,9 @@ #include "esp_ota_ops.h" #endif //CONFIG_APP_ROLLBACK_ENABLE #include "esp_private/startup_internal.h" -#if defined(CONFIG_BT_ENABLED) && SOC_BT_SUPPORTED +#if defined(CONFIG_BT_BLUEDROID_ENABLED) && SOC_BT_SUPPORTED #include "esp_bt.h" -#endif //CONFIG_BT_ENABLED +#endif //CONFIG_BT_BLUEDROID_ENABLED #include #include "soc/rtc.h" #if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) @@ -243,7 +243,7 @@ bool verifyRollbackLater() { } #endif -#ifdef CONFIG_BT_ENABLED +#ifdef CONFIG_BT_BLUEDROID_ENABLED #if CONFIG_IDF_TARGET_ESP32 //overwritten in esp32-hal-bt.c bool btInUse() __attribute__((weak)); @@ -305,7 +305,7 @@ void initArduino() { if (err) { log_e("Failed to initialize NVS! Error: %u", err); } -#if defined(CONFIG_BT_ENABLED) && SOC_BT_SUPPORTED +#if defined(CONFIG_BT_BLUEDROID_ENABLED) && SOC_BT_SUPPORTED if (!btInUse()) { esp_bt_controller_mem_release(ESP_BT_MODE_BTDM); } From f1223663dd122b605603c1e072a33f3a6935f451 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Mon, 14 Apr 2025 13:54:47 +0300 Subject: [PATCH 104/290] fix(wifi): Workaround bug in esp_wifi_get_protocol() (#11239) * fix(wifi): Workaround bug in esp_wifi_get_protocol() * 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/WiFi/src/WiFiGeneric.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index aa994963514..3faf34fef34 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -602,9 +602,9 @@ bool WiFiGenericClass::mode(wifi_mode_t m) { #else #define WIFI_PROTOCOL_DEFAULT (WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N) #endif - uint8_t current_protocol = 0; + uint32_t current_protocol = 0; if (m & WIFI_MODE_STA) { - err = esp_wifi_get_protocol(WIFI_IF_STA, ¤t_protocol); + err = esp_wifi_get_protocol(WIFI_IF_STA, (uint8_t *)¤t_protocol); if (err == ESP_OK && current_protocol == WIFI_PROTOCOL_LR) { log_v("Disabling long range on STA"); err = esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_DEFAULT); @@ -614,7 +614,7 @@ bool WiFiGenericClass::mode(wifi_mode_t m) { } } if (m & WIFI_MODE_AP) { - err = esp_wifi_get_protocol(WIFI_IF_AP, ¤t_protocol); + err = esp_wifi_get_protocol(WIFI_IF_AP, (uint8_t *)¤t_protocol); if (err == ESP_OK && current_protocol == WIFI_PROTOCOL_LR) { log_v("Disabling long range on AP"); err = esp_wifi_set_protocol(WIFI_IF_AP, WIFI_PROTOCOL_DEFAULT); From 42ae2426affacf7162770b9399b486eb7954203f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 21 Apr 2025 18:32:51 +0200 Subject: [PATCH 105/290] fix C5 compile (#11255) --- cores/esp32/esp32-hal-uart.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index ca88edbca27..21540b3e95a 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -1157,7 +1157,11 @@ bool uartSetClockSource(uint8_t uartNum, uart_sclk_t clkSrc) { if (uart->num >= SOC_UART_HP_NUM) { switch (clkSrc) { case UART_SCLK_XTAL: uart->_uart_clock_source = LP_UART_SCLK_XTAL_D2; break; +#if CONFIG_IDF_TARGET_ESP32C5 + case UART_SCLK_RTC: uart->_uart_clock_source = LP_UART_SCLK_RC_FAST; break; +#else case UART_SCLK_RTC: uart->_uart_clock_source = LP_UART_SCLK_LP_FAST; break; +#endif case UART_SCLK_DEFAULT: default: uart->_uart_clock_source = LP_UART_SCLK_DEFAULT; } From e0d4d176ea8bcd64889f0c387203ffec45ecc47b Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 22 Apr 2025 03:16:32 -0300 Subject: [PATCH 106/290] ci(pre-commit): Lock versions to SHA and apply fixes (#11248) * ci(pre-commit): Execute codespell after formatting changes * ci(pre-commit): Lock versions to hash * fix(pre-commit): Apply pre-commit fixes --- .codespellrc | 2 +- .pre-commit-config.yaml | 34 +++++++++---------- .../USB/src/keyboardLayout/KeyboardLayout.h | 2 +- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.codespellrc b/.codespellrc index 756f7e9503b..d3b9b45cb1e 100644 --- a/.codespellrc +++ b/.codespellrc @@ -1,7 +1,7 @@ [codespell] # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check/.codespellrc # In the event of a false positive, add the problematic word, in all lowercase, to a comma-separated list here: -ignore-words-list = ba,licence,ot,dout,als,exten +ignore-words-list = ba,licence,ot,dout,als,exten,emac skip = ./.git,./.licenses,__pycache__,.clang-format,.codespellrc,.editorconfig,.flake8,.prettierignore,.yamllint.yml,.gitignore,boards.txt,platform.txt,programmers.txt builtin = clear,informal,en-GB_to_en-US check-filenames = diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f80261422b0..0d425c46eae 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: "v5.0.0" + rev: "cef0300fd0fc4d2a87a85fa2093c6b283ea36f4b" # v5.0.0 hooks: # Generic checks - id: check-case-conflict @@ -39,15 +39,8 @@ repos: ^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" + rev: "f6446549e5e97ec9665b9b03e75b87b445857f9a" # v18.1.3 hooks: # C/C++ formatting - id: clang-format @@ -55,7 +48,7 @@ repos: exclude: ^.*\/build_opt\.h$ - repo: https://github.com/psf/black-pre-commit-mirror - rev: "24.10.0" + rev: "a4920527036bb9a3f3e6055d595849d67d0da066" # 25.1.0 hooks: # Python formatting - id: black @@ -63,7 +56,7 @@ repos: 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" + rev: "16f5f28a384f0781bebb37a08aa45e65b9526c50" # 7.2.0 hooks: # Python linting - id: flake8 @@ -74,21 +67,28 @@ repos: - flake8-simplify - repo: https://github.com/pre-commit/mirrors-prettier - rev: "v3.1.0" + rev: "ffb6a759a979008c0e6dff86e39f4745a2d9eac4" # v3.1.0 hooks: # YAML formatting - id: prettier types_or: [yaml] + - repo: https://github.com/codespell-project/codespell + rev: "63c8f8312b7559622c0d82815639671ae42132ac" # v2.4.1 + hooks: + # Spell checking + - id: codespell + exclude: ^.*\.(svd|SVD)$ + - repo: https://github.com/shellcheck-py/shellcheck-py - rev: "v0.10.0.1" + rev: "a23f6b85d0fdd5bb9d564e2579e678033debbdff" # v0.10.0.1 hooks: # Bash linting - id: shellcheck types: [shell] - repo: https://github.com/openstack/bashate - rev: "2.1.1" + rev: "fbd7c2534c2701351c603ff700ddf08202430a31" # 2.1.1 hooks: # Bash formatting - id: bashate @@ -96,15 +96,15 @@ repos: args: ["-i", "E006"] # Ignore E006: Line too long - repo: https://github.com/errata-ai/vale - rev: "v3.9.1" + rev: "dc4c47923788a413fb5677de6e3370d514aecb78" # v3.11.2 hooks: # Sync vale styles and lint markdown and reStructuredText - id: vale name: vale-sync - language_version: "1.21.6" + language_version: "1.23.2" pass_filenames: false args: [sync] types_or: [markdown, rst] - id: vale - language_version: "1.21.6" + language_version: "1.23.2" types_or: [markdown, rst] diff --git a/libraries/USB/src/keyboardLayout/KeyboardLayout.h b/libraries/USB/src/keyboardLayout/KeyboardLayout.h index 0ef69dc7ab9..ee6b6b4e11e 100644 --- a/libraries/USB/src/keyboardLayout/KeyboardLayout.h +++ b/libraries/USB/src/keyboardLayout/KeyboardLayout.h @@ -5,7 +5,7 @@ only in Keyboard.cpp and the keyboard layout files. Layout files map ASCII character codes to keyboard scan codes (technically, to USB HID Usage codes), possibly altered by the SHIFT or ALT_GR modifiers. - Non-ACSII characters (anything outside the 7-bit range NUL..DEL) are + Non-ASCII characters (anything outside the 7-bit range NUL..DEL) are not supported. == Creating your own layout == From a8bead7efba4370c3860d241af910960fc4ec708 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 22 Apr 2025 03:16:46 -0300 Subject: [PATCH 107/290] fix(gpio): Fix GPIO warning message (#11268) --- cores/esp32/esp32-hal-gpio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index c681be077b3..90ad1e7f36d 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -185,7 +185,7 @@ extern int ARDUINO_ISR_ATTR __digitalRead(uint8_t pin) { #endif // RGB_BUILTIN // This work when the pin is set as GPIO and in INPUT mode. For all other pin functions, it may return inconsistent response if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL) { - log_w("IO %i is not set as GPIO. digitalRead() may return an inconsistent value."); + log_w("IO %i is not set as GPIO. digitalRead() may return an inconsistent value.", pin); } return gpio_get_level((gpio_num_t)pin); } From c110ca8295fbc38c6e48a404b69aed9739fdf952 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 22 Apr 2025 05:46:59 -0300 Subject: [PATCH 108/290] docs(language): Enforce English on contributions and issues (#11267) --- .github/ISSUE_TEMPLATE/Feature-request.yml | 1 + .github/ISSUE_TEMPLATE/Issue-report.yml | 1 + docs/en/contributing.rst | 3 +++ 3 files changed, 5 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/Feature-request.yml b/.github/ISSUE_TEMPLATE/Feature-request.yml index 0788288036c..8849a407a39 100644 --- a/.github/ISSUE_TEMPLATE/Feature-request.yml +++ b/.github/ISSUE_TEMPLATE/Feature-request.yml @@ -5,6 +5,7 @@ body: - type: markdown attributes: value: | + * Please note that we can only process feature requests reported in English to ensure effective communication and support. Feature requests written in other languages will be closed, with a request to rewrite them in English. * We welcome any ideas or feature requests! It is helpful if you can explain exactly why the feature would be useful. * There are usually some outstanding feature requests in the [existing issues list](https://github.com/espressif/arduino-esp32/issues?q=is%3Aopen+is%3Aissue+label%3A%22Type%3A+Feature+request%22), feel free to add comments to them. * If you would like to contribute, please read the [contributions guide](https://docs.espressif.com/projects/arduino-esp32/en/latest/contributing.html). diff --git a/.github/ISSUE_TEMPLATE/Issue-report.yml b/.github/ISSUE_TEMPLATE/Issue-report.yml index 1229df2d947..9dba5e0ca8f 100644 --- a/.github/ISSUE_TEMPLATE/Issue-report.yml +++ b/.github/ISSUE_TEMPLATE/Issue-report.yml @@ -5,6 +5,7 @@ body: - type: markdown attributes: value: | + * Please note that we can only process issues reported in English to ensure effective communication and support. Issues written in other languages will be closed, with a request to rewrite them in English. * 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) diff --git a/docs/en/contributing.rst b/docs/en/contributing.rst index 4093c60ec64..4ebe01cbf5b 100644 --- a/docs/en/contributing.rst +++ b/docs/en/contributing.rst @@ -15,6 +15,9 @@ Before Contributing Before sending us a Pull Request, please consider this: +* All contributions must be written in English to ensure effective communication and support. + Pull Requests written in other languages will be closed, with a request to rewrite them in English. + * Is the contribution entirely your own work, or is it already licensed under an LGPL 2.1 compatible Open Source License? If not, cannot accept it. From 03e9c45084c389436869f1ae649549e245866ade Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Wed, 23 Apr 2025 15:50:58 +0300 Subject: [PATCH 109/290] IDF master (#11204) * fix(esp-now): Update TX Callback * IDF master d930a386 --------- Co-authored-by: Jason2866 <24528715+Jason2866@users.noreply.github.com> --- libraries/ESP_NOW/src/ESP32_NOW.cpp | 5 + package/package_esp32_index.template.json | 204 +++++++++++----------- 2 files changed, 107 insertions(+), 102 deletions(-) diff --git a/libraries/ESP_NOW/src/ESP32_NOW.cpp b/libraries/ESP_NOW/src/ESP32_NOW.cpp index 6fd3ff0a0b1..83fec4c4529 100644 --- a/libraries/ESP_NOW/src/ESP32_NOW.cpp +++ b/libraries/ESP_NOW/src/ESP32_NOW.cpp @@ -129,7 +129,12 @@ static void _esp_now_rx_cb(const esp_now_recv_info_t *info, const uint8_t *data, } } +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) +static void _esp_now_tx_cb(const esp_now_send_info_t *tx_info, esp_now_send_status_t status) { + const uint8_t *mac_addr = tx_info->des_addr; +#else static void _esp_now_tx_cb(const uint8_t *mac_addr, esp_now_send_status_t status) { +#endif log_v(MACSTR " : %s", MAC2STR(mac_addr), (status == ESP_NOW_SEND_SUCCESS) ? "SUCCESS" : "FAILED"); //find the peer and call it's callback for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 1b935fd8acf..a0d78ebc47e 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-master-a45d713b-v1" + "version": "idf-master-d930a386-v1" }, { "packager": "esp32", @@ -61,7 +61,7 @@ { "packager": "esp32", "name": "xtensa-esp-elf-gdb", - "version": "15.2_20241112" + "version": "16.2_20250324" }, { "packager": "esp32", @@ -71,7 +71,7 @@ { "packager": "esp32", "name": "riscv32-esp-elf-gdb", - "version": "15.2_20241112" + "version": "16.2_20250324" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-master-a45d713b-v1", + "version": "idf-master-d930a386-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", - "size": "420636315" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", + "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", + "size": "422376381" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", - "size": "420636315" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", + "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", + "size": "422376381" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", - "size": "420636315" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", + "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", + "size": "422376381" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", - "size": "420636315" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", + "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", + "size": "422376381" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", - "size": "420636315" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", + "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", + "size": "422376381" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", - "size": "420636315" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", + "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", + "size": "422376381" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", - "size": "420636315" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", + "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", + "size": "422376381" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-a45d713b-v1.zip", - "checksum": "SHA-256:52aec557b9744e721770853c67c4ee6a391debd7bb779f654bea0e5113658786", - "size": "420636315" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", + "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", + "size": "422376381" } ] }, @@ -228,63 +228,63 @@ }, { "name": "xtensa-esp-elf-gdb", - "version": "15.2_20241112", + "version": "16.2_20250324", "systems": [ { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-x86_64-linux-gnu.tar.gz", - "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-x86_64-linux-gnu.tar.gz", - "checksum": "SHA-256:18774349d2b1c7d7f5ba984563f7022aef4a3df4b706ed8821c53266f599343d", - "size": "35179121" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-x86_64-linux-gnu.tar.gz", + "archiveFileName": "xtensa-esp-elf-gdb-16.2_20250324-x86_64-linux-gnu.tar.gz", + "checksum": "SHA-256:27b58ab12248e04277c4fdc74038cf0a001d5142df091ab94939ad35053738fd", + "size": "36361058" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-aarch64-linux-gnu.tar.gz", - "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-aarch64-linux-gnu.tar.gz", - "checksum": "SHA-256:77cb3b2c85d6cfbb40b7f99eebbc2b1c3f4fe13eba20b3da798bdbbc6eb8e87c", - "size": "34295046" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-aarch64-linux-gnu.tar.gz", + "archiveFileName": "xtensa-esp-elf-gdb-16.2_20250324-aarch64-linux-gnu.tar.gz", + "checksum": "SHA-256:24f85aa778e1605098a13ff7bd29d5760767faf012705c8915cb08b32cad0206", + "size": "35442104" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-arm-linux-gnueabi.tar.gz", - "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-arm-linux-gnueabi.tar.gz", - "checksum": "SHA-256:b87af0539de118eb9d43a4a89c8c1b0a6ab2557560015155104c44f91b5c4aa0", - "size": "30338727" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-arm-linux-gnueabi.tar.gz", + "archiveFileName": "xtensa-esp-elf-gdb-16.2_20250324-arm-linux-gnueabi.tar.gz", + "checksum": "SHA-256:c73e43038b6d50374cd0ee714370ce748189e0b00404d581babd2bb0115c4785", + "size": "31260410" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-i586-linux-gnu.tar.gz", - "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-i586-linux-gnu.tar.gz", - "checksum": "SHA-256:2c7531bd390928fed479999ac9089b39a25f56ca4f4cc330db7d7a633a37405b", - "size": "33906121" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-i586-linux-gnu.tar.gz", + "archiveFileName": "xtensa-esp-elf-gdb-16.2_20250324-i586-linux-gnu.tar.gz", + "checksum": "SHA-256:dc7b8aad0fb1c6a1abfdb8dff4f08221ea08a0f28fb837f181969ac1174d4dc6", + "size": "35067894" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-x86_64-apple-darwin21.1.tar.gz", - "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-x86_64-apple-darwin21.1.tar.gz", - "checksum": "SHA-256:ba2907be9a4c22c4e418f42ec84cf57401570a71dabbe69425227114ebf351a7", - "size": "52502302" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-x86_64-apple-darwin21.1.tar.gz", + "archiveFileName": "xtensa-esp-elf-gdb-16.2_20250324-x86_64-apple-darwin21.1.tar.gz", + "checksum": "SHA-256:398c429cfe696bad01d636c5488cadc87b20471c1b5ed02c60eee5ef2a775c93", + "size": "54992785" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-aarch64-apple-darwin21.1.tar.gz", - "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-aarch64-apple-darwin21.1.tar.gz", - "checksum": "SHA-256:893500d6de354a6870820b9398531d8cd37d1cd85f3ae9b1f8a4c070b8048707", - "size": "41892363" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-aarch64-apple-darwin21.1.tar.gz", + "archiveFileName": "xtensa-esp-elf-gdb-16.2_20250324-aarch64-apple-darwin21.1.tar.gz", + "checksum": "SHA-256:b6d85c0d76d653bb55f9d06b0cd509eab7e99db541c88b8c849c64827e9d74a9", + "size": "43538967" }, { "host": "i686-mingw32", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-i686-w64-mingw32.zip", - "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-i686-w64-mingw32.zip", - "checksum": "SHA-256:328181380fccb252105c51a86071edbc5ef63e0114540edc4f8b2d62acf44916", - "size": "31307770" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-i686-w64-mingw32.zip", + "archiveFileName": "xtensa-esp-elf-gdb-16.2_20250324-i686-w64-mingw32.zip", + "checksum": "SHA-256:f748d6b65fdf66733b82e12d0d85a05e3134122416280379df129cfebe2aa4b2", + "size": "32189419" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/xtensa-esp-elf-gdb-15.2_20241112-x86_64-w64-mingw32.zip", - "archiveFileName": "xtensa-esp-elf-gdb-15.2_20241112-x86_64-w64-mingw32.zip", - "checksum": "SHA-256:9c1949058d7aa1fa6f6f2d03173659b9f54e3c3940cbeebc1d56ae169c604ab2", - "size": "31420687" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/xtensa-esp-elf-gdb-16.2_20250324-x86_64-w64-mingw32.zip", + "archiveFileName": "xtensa-esp-elf-gdb-16.2_20250324-x86_64-w64-mingw32.zip", + "checksum": "SHA-256:e970fc3ec8a1d0acee2432e91e0a01b348613a0425aacfa981b2fc505fe920cc", + "size": "32290997" } ] }, @@ -352,63 +352,63 @@ }, { "name": "riscv32-esp-elf-gdb", - "version": "15.2_20241112", + "version": "16.2_20250324", "systems": [ { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-x86_64-linux-gnu.tar.gz", - "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-x86_64-linux-gnu.tar.gz", - "checksum": "SHA-256:bfca245b3d84244ad3b6156496728d916ac5ccc0d7f8e048194b7eba5cdbe047", - "size": "35297398" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-x86_64-linux-gnu.tar.gz", + "archiveFileName": "riscv32-esp-elf-gdb-16.2_20250324-x86_64-linux-gnu.tar.gz", + "checksum": "SHA-256:f9b172d8d72d0a1e2b0b80127df29263a0cb0d0c4e998e09c27031bfac09f3ec", + "size": "36528201" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-aarch64-linux-gnu.tar.gz", - "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-aarch64-linux-gnu.tar.gz", - "checksum": "SHA-256:8536da9e3093b8f25e0b5204b04ed4afea432d1fd262f2abb466016d3d750ea6", - "size": "34455317" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-aarch64-linux-gnu.tar.gz", + "archiveFileName": "riscv32-esp-elf-gdb-16.2_20250324-aarch64-linux-gnu.tar.gz", + "checksum": "SHA-256:68bb6a85fb58b8a738f799e8fb4fa1f56cfeffc4de803ceb03c8a33cb2cd919d", + "size": "35643464" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-arm-linux-gnueabi.tar.gz", - "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-arm-linux-gnueabi.tar.gz", - "checksum": "SHA-256:33a80d5e6604bb7d08b15492b8ec84c9176245e066d0bf8aad7570786ca44081", - "size": "31188203" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-arm-linux-gnueabi.tar.gz", + "archiveFileName": "riscv32-esp-elf-gdb-16.2_20250324-arm-linux-gnueabi.tar.gz", + "checksum": "SHA-256:673038ab9fb2b7391ff9252824194e3b9e40668efe9ce54d1e582a9d6c51f04a", + "size": "32154574" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-i586-linux-gnu.tar.gz", - "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-i586-linux-gnu.tar.gz", - "checksum": "SHA-256:ba448ecf2c80064013eaacb0e7be514a5ef17516f49ff3e50bc41c5578b8d88e", - "size": "34211289" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-i586-linux-gnu.tar.gz", + "archiveFileName": "riscv32-esp-elf-gdb-16.2_20250324-i586-linux-gnu.tar.gz", + "checksum": "SHA-256:62f05d5fe08145b25e423dd0b3f1ae260be99abf5462b8cfd918bf2231e26e30", + "size": "35410891" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-x86_64-apple-darwin21.1.tar.gz", - "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-x86_64-apple-darwin21.1.tar.gz", - "checksum": "SHA-256:bdd07c54fe3216eb5c34f92cac514eb4af777c951573f186c33408c75f56bb4b", - "size": "52831957" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-x86_64-apple-darwin21.1.tar.gz", + "archiveFileName": "riscv32-esp-elf-gdb-16.2_20250324-x86_64-apple-darwin21.1.tar.gz", + "checksum": "SHA-256:63ae12cfbab648e2d2ca7a700a0c615c4f36a6fbe6876c11ba108115ee0d60f2", + "size": "55359246" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-aarch64-apple-darwin21.1.tar.gz", - "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-aarch64-apple-darwin21.1.tar.gz", - "checksum": "SHA-256:9924f439ae77c3346e532a48a0d56330466c33ce1abd8d72b77f9f7f5c3b1196", - "size": "42227631" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-aarch64-apple-darwin21.1.tar.gz", + "archiveFileName": "riscv32-esp-elf-gdb-16.2_20250324-aarch64-apple-darwin21.1.tar.gz", + "checksum": "SHA-256:bfbe49774f839020cef988537da0a06896dfe4a382674c62285361ed9bd4aee3", + "size": "43926592" }, { "host": "i686-mingw32", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-i686-w64-mingw32.zip", - "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-i686-w64-mingw32.zip", - "checksum": "SHA-256:dcdafd30854b092671f555d844d94b0733e2ffcac8c026b4fb7b8a72ebef0016", - "size": "31971712" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-i686-w64-mingw32.zip", + "archiveFileName": "riscv32-esp-elf-gdb-16.2_20250324-i686-w64-mingw32.zip", + "checksum": "SHA-256:e8b84eec990ff514729b3770edf2b543f36670f43663ce0c3b624fb4884812ca", + "size": "32914955" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v15.2_20241112/riscv32-esp-elf-gdb-15.2_20241112-x86_64-w64-mingw32.zip", - "archiveFileName": "riscv32-esp-elf-gdb-15.2_20241112-x86_64-w64-mingw32.zip", - "checksum": "SHA-256:6ec8b3a073f2c5835321b4b560f8fc56180458204d071da139ff983436ea45e5", - "size": "31759225" + "url": "https://github.com/espressif/binutils-gdb/releases/download/esp-gdb-v16.2_20250324/riscv32-esp-elf-gdb-16.2_20250324-x86_64-w64-mingw32.zip", + "archiveFileName": "riscv32-esp-elf-gdb-16.2_20250324-x86_64-w64-mingw32.zip", + "checksum": "SHA-256:37c79178900c19ca7487c26af4b5ad6b0d3f34683bd0e9c2ddd39038c999e429", + "size": "32667353" } ] }, From 51023aea79060a9b864096fc7cc2c133c24c75ee Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Wed, 23 Apr 2025 14:20:05 -0300 Subject: [PATCH 110/290] feat(ledc): clear all fields added to ledc struct in IDF 5.4 (#11276) * feat(ledc): clear all fields added to ledc struct in IDF 5.4 * feat(ledc): use memset for all ledc struct * fix(ledc): typo - missing semi collon * 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-ledc.c | 38 ++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/cores/esp32/esp32-hal-ledc.c b/cores/esp32/esp32-hal-ledc.c index 0a3ec5a60c7..039fa1312f1 100644 --- a/cores/esp32/esp32-hal-ledc.c +++ b/cores/esp32/esp32-hal-ledc.c @@ -126,7 +126,14 @@ bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t c return false; } } else { - ledc_timer_config_t ledc_timer = {.speed_mode = group, .timer_num = timer, .duty_resolution = resolution, .freq_hz = freq, .clk_cfg = clock_source}; + ledc_timer_config_t ledc_timer; + memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t)); + ledc_timer.speed_mode = group; + ledc_timer.timer_num = timer; + ledc_timer.duty_resolution = resolution; + ledc_timer.freq_hz = freq; + ledc_timer.clk_cfg = clock_source; + if (ledc_timer_config(&ledc_timer) != ESP_OK) { log_e("ledc setup failed!"); return false; @@ -134,9 +141,16 @@ bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t c uint32_t duty = ledc_get_duty(group, (channel % 8)); - ledc_channel_config_t ledc_channel = { - .speed_mode = group, .channel = (channel % 8), .timer_sel = timer, .intr_type = LEDC_INTR_DISABLE, .gpio_num = pin, .duty = duty, .hpoint = 0 - }; + ledc_channel_config_t ledc_channel; + memset((void *)&ledc_channel, 0, sizeof(ledc_channel_config_t)); + ledc_channel.speed_mode = group; + ledc_channel.channel = (channel % 8); + ledc_channel.timer_sel = timer; + ledc_channel.intr_type = LEDC_INTR_DISABLE; + ledc_channel.gpio_num = pin; + ledc_channel.duty = duty; + ledc_channel.hpoint = 0; + ledc_channel_config(&ledc_channel); } @@ -256,7 +270,13 @@ uint32_t ledcWriteTone(uint8_t pin, uint32_t freq) { uint8_t group = (bus->channel / 8), timer = ((bus->channel / 2) % 4); - ledc_timer_config_t ledc_timer = {.speed_mode = group, .timer_num = timer, .duty_resolution = 10, .freq_hz = freq, .clk_cfg = clock_source}; + ledc_timer_config_t ledc_timer; + memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t)); + ledc_timer.speed_mode = group; + ledc_timer.timer_num = timer; + ledc_timer.duty_resolution = 10; + ledc_timer.freq_hz = freq; + ledc_timer.clk_cfg = clock_source; if (ledc_timer_config(&ledc_timer) != ESP_OK) { log_e("ledcWriteTone configuration failed!"); @@ -307,7 +327,13 @@ uint32_t ledcChangeFrequency(uint8_t pin, uint32_t freq, uint8_t resolution) { } uint8_t group = (bus->channel / 8), timer = ((bus->channel / 2) % 4); - ledc_timer_config_t ledc_timer = {.speed_mode = group, .timer_num = timer, .duty_resolution = resolution, .freq_hz = freq, .clk_cfg = clock_source}; + ledc_timer_config_t ledc_timer; + memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t)); + ledc_timer.speed_mode = group; + ledc_timer.timer_num = timer; + ledc_timer.duty_resolution = resolution; + ledc_timer.freq_hz = freq; + ledc_timer.clk_cfg = clock_source; if (ledc_timer_config(&ledc_timer) != ESP_OK) { log_e("ledcChangeFrequency failed!"); From 571c2f74f23532ab204bfe9c29d609911816e67d Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Wed, 23 Apr 2025 14:20:23 -0300 Subject: [PATCH 111/290] feat(uart): sets correct ESP32/S2 clock source for the example (#11286) * feat(uart): sets correct ESP32/S2 clock source for the 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> --- .../Serial/RxTimeout_Demo/RxTimeout_Demo.ino | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libraries/ESP32/examples/Serial/RxTimeout_Demo/RxTimeout_Demo.ino b/libraries/ESP32/examples/Serial/RxTimeout_Demo/RxTimeout_Demo.ino index 64d15d3d916..35d2da5c199 100644 --- a/libraries/ESP32/examples/Serial/RxTimeout_Demo/RxTimeout_Demo.ino +++ b/libraries/ESP32/examples/Serial/RxTimeout_Demo/RxTimeout_Demo.ino @@ -21,6 +21,15 @@ If UART receives less than 120 bytes, it will wait RX Timeout to understand that the bus is IDLE and then copy the data from the FIFO to the Arduino internal buffer, making it available to the Arduino API. + There is an important detail about how HardwareSerial works using ESP32 and ESP32-S2: + If the baud rate is lower than 250,000, it will select REF_TICK as clock source in order to avoid that + the baud rate may change when the CPU Frequency is changed. Default UART clock source is APB, which changes + when CPU clock source is also changed. But when it selects REF_TICK as UART clock source, RX Timeout is limited to 1. + Therefore, in order to change the ESP32/ESP32-S2 RX Timeout it is necessary to fix the UART Clock Source to APB. + + In the case of the other SoC, such as ESP32-S3, C3, C6, H2 and P4, there is no such RX Timeout limitation. + Those will set the UART Source Clock as XTAL, which allows the baud rate to be high and it is steady, not + changing with the CPU Frequency. */ #include @@ -45,6 +54,12 @@ void setup() { // UART1 will have its RX<->TX cross connected // GPIO4 <--> GPIO5 using external wire +#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 + // UART_CLK_SRC_APB will allow higher values of RX Timeout + // default for ESP32 and ESP32-S2 is REF_TICK which limits the RX Timeout to 1 + // setClockSource() must be called before begin() + Serial1.setClockSource(UART_CLK_SRC_APB); +#endif Serial1.begin(BAUD, SERIAL_8N1, RXPIN, TXPIN); // Rx = 4, Tx = 5 will work for ESP32, S2, S3 and C3 #if USE_INTERNAL_PIN_LOOPBACK uart_internal_loopback(TEST_UART, RXPIN); From 5262f5ad5ee5b9c0388a06f6061d1a571f3bca86 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 28 Apr 2025 12:45:12 -0300 Subject: [PATCH 112/290] ci(idf): Use included IDF examples in CI (#11240) * ci(idf): Use included IDF examples in CI * fix(example): sets Matter version to be 1.3 or higher * feat(matter): sets c++ 2a as default * feat(matter): Update README.md * fix(matter): instructions about using more than one sdkconfig file --------- Co-authored-by: Sugar Glider --- .github/scripts/on-push-idf.sh | 33 +++++++ .github/scripts/sketch_utils.sh | 2 +- .github/workflows/push.yml | 20 ++-- idf_component_examples/.gitignore | 4 + .../esp_matter_light/CMakeLists.txt | 3 +- .../esp_matter_light/README.md | 21 +++- .../esp_matter_light/ci.json | 11 +++ .../esp_matter_light/main/Kconfig.projbuild | 96 ++++--------------- .../esp_matter_light/main/idf_component.yml | 4 +- ...ig.defaults.esp32c3 => sdkconfig.defaults} | 2 - .../sdkconfig.defaults.esp32c6 | 63 ------------ .../sdkconfig.defaults.esp32s3 | 64 ------------- .../hello_world/CMakeLists.txt | 2 + .../hw_cdc_hello_world/CMakeLists.txt | 1 + .../hw_cdc_hello_world/ci.json | 5 + 15 files changed, 109 insertions(+), 222 deletions(-) create mode 100644 .github/scripts/on-push-idf.sh create mode 100644 idf_component_examples/.gitignore create mode 100644 idf_component_examples/esp_matter_light/ci.json rename idf_component_examples/esp_matter_light/{sdkconfig.defaults.esp32c3 => sdkconfig.defaults} (98%) delete mode 100644 idf_component_examples/esp_matter_light/sdkconfig.defaults.esp32s3 create mode 100644 idf_component_examples/hw_cdc_hello_world/ci.json diff --git a/.github/scripts/on-push-idf.sh b/.github/scripts/on-push-idf.sh new file mode 100644 index 00000000000..72e7c7f574e --- /dev/null +++ b/.github/scripts/on-push-idf.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +set -e + +CHECK_REQUIREMENTS="./components/arduino-esp32/.github/scripts/sketch_utils.sh check_requirements" + +# Export IDF environment +. ${IDF_PATH}/export.sh + +# Find all examples in ./components/arduino-esp32/idf_component_examples +idf_component_examples=$(find ./components/arduino-esp32/idf_component_examples -mindepth 1 -maxdepth 1 -type d) + +for example in $idf_component_examples; do + if [ -f "$example"/ci.json ]; then + # If the target is listed as false, skip the sketch. Otherwise, include it. + is_target=$(jq -r --arg target "$IDF_TARGET" '.targets[$target]' "$example"/ci.json) + if [[ "$is_target" == "false" ]]; then + printf "\n\033[93mSkipping %s for target %s\033[0m\n\n" "$example" "$IDF_TARGET" + continue + fi + fi + + idf.py -C "$example" set-target "$IDF_TARGET" + + has_requirements=$(${CHECK_REQUIREMENTS} "$example" "$example/sdkconfig") + if [ "$has_requirements" -eq 0 ]; then + printf "\n\033[93m%s does not meet the requirements for %s. Skipping...\033[0m\n\n" "$example" "$IDF_TARGET" + continue + fi + + printf "\n\033[95mBuilding %s\033[0m\n\n" "$example" + idf.py -C "$example" -DEXTRA_COMPONENT_DIRS="$PWD/components" build +done diff --git a/.github/scripts/sketch_utils.sh b/.github/scripts/sketch_utils.sh index e536da50111..befea255e0b 100755 --- a/.github/scripts/sketch_utils.sh +++ b/.github/scripts/sketch_utils.sh @@ -16,7 +16,7 @@ function check_requirements { # check_requirements local requirements_or if [ ! -f "$sdkconfig_path" ] || [ ! -f "$sketchdir/ci.json" ]; then - echo "ERROR: sdkconfig or ci.json not found" 1>&2 + echo "WARNING: sdkconfig or ci.json not found. Assuming requirements are met." 1>&2 # Return 1 on error to force the sketch to be built and fail. This way the # CI will fail and the user will know that the sketch has a problem. else diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index d98da24fc07..c8b8ddc2127 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -31,6 +31,7 @@ on: - "!libraries/**.properties" - "!libraries/**.py" - "package/**" + - "idf_component_examples/**" - "tools/**.py" - "platform.txt" - "programmers.txt" @@ -45,7 +46,6 @@ on: - "!.github/scripts/tests_*" - "!.github/scripts/upload_*" - "variants/esp32/**/*" - - "variants/esp32c2/**/*" - "variants/esp32c3/**/*" - "variants/esp32c6/**/*" - "variants/esp32h2/**/*" @@ -124,7 +124,7 @@ jobs: - 'idf_component.yml' - 'Kconfig.projbuild' - 'CMakeLists.txt' - - "variants/esp32c2/**/*" + - "idf_component_examples/**" - name: Set chunks id: set-chunks @@ -267,15 +267,23 @@ jobs: submodules: recursive path: components/arduino-esp32 + - name: Setup jq + uses: dcarbone/install-jq-action@e397bd87438d72198f81efd21f876461183d383a # v3.0.1 + - name: Build env: IDF_TARGET: ${{ matrix.idf_target }} shell: bash run: | - . ${IDF_PATH}/export.sh - idf.py create-project test - echo CONFIG_FREERTOS_HZ=1000 > test/sdkconfig.defaults - idf.py -C test -DEXTRA_COMPONENT_DIRS=$PWD/components build + chmod a+x ./components/arduino-esp32/.github/scripts/* + ./components/arduino-esp32/.github/scripts/on-push-idf.sh + + - name: Upload generated sdkconfig files for debugging + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + if: always() + with: + name: sdkconfig-${{ matrix.idf_target }} + path: ./components/arduino-esp32/idf_component_examples/**/sdkconfig # Save artifacts to gh-pages save-master-artifacts: diff --git a/idf_component_examples/.gitignore b/idf_component_examples/.gitignore new file mode 100644 index 00000000000..6052fd4e70b --- /dev/null +++ b/idf_component_examples/.gitignore @@ -0,0 +1,4 @@ +build/ +managed_components/ +dependencies.lock +sdkconfig diff --git a/idf_component_examples/esp_matter_light/CMakeLists.txt b/idf_component_examples/esp_matter_light/CMakeLists.txt index 16a7533f2a5..1430df8ff78 100644 --- a/idf_component_examples/esp_matter_light/CMakeLists.txt +++ b/idf_component_examples/esp_matter_light/CMakeLists.txt @@ -8,6 +8,7 @@ set(PROJECT_VER_NUMBER 1) # This should be done before using the IDF_TARGET variable. include($ENV{IDF_PATH}/tools/cmake/project.cmake) +idf_build_set_property(MINIMAL_BUILD ON) project(arduino_managed_component_light) # WARNING: This is just an example for using key for decrypting the encrypted OTA image @@ -20,7 +21,7 @@ if(CONFIG_IDF_TARGET_ESP32C2) include(relinker) endif() -idf_build_set_property(CXX_COMPILE_OPTIONS "-std=gnu++17;-Os;-DCHIP_HAVE_CONFIG_H" APPEND) +idf_build_set_property(CXX_COMPILE_OPTIONS "-std=gnu++2a;-Os;-DCHIP_HAVE_CONFIG_H" APPEND) idf_build_set_property(C_COMPILE_OPTIONS "-Os" APPEND) # For RISCV chips, project_include.cmake sets -Wno-format, but does not clear various # flags that depend on -Wformat diff --git a/idf_component_examples/esp_matter_light/README.md b/idf_component_examples/esp_matter_light/README.md index 06a22cdceac..b0173f6a437 100644 --- a/idf_component_examples/esp_matter_light/README.md +++ b/idf_component_examples/esp_matter_light/README.md @@ -59,15 +59,22 @@ Use ESP-IDF 5.1.4 from https://github.com/espressif/esp-idf/tree/release/v5.1 This example has been tested with Arduino Core 3.0.4 The project will download all necessary components, including the Arduino Core. -Run `idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults..idf" -p flash monitor` +Execute this sequence: + ` using linux rm command or Windows rmdir command` + `idf.py set-target ` + `idf.py -D SDKCONFIG_DEFAULTS="sdkconfig_file1;sdkconfig_file2;sdkconfig_fileX" -p flash monitor` Example for ESP32-S3/Linux | macOS: ``` -idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.esp32s3" -p /dev/ttyACM0 flash monitor +rm -rf build +idf.py set-target esp32s3 +idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults" -p /dev/ttyACM0 flash monitor ``` Example for ESP32-C3/Windows: ``` -idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.esp32c3" -p com3 flash monitor +rmdir /s/q build +idf.py set-target esp32c3 +idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults" -p com3 flash monitor ``` It may be necessary to delete some folders and files before running `idf.py` @@ -95,11 +102,15 @@ In order to build the application that will use Thread Networking instead of Wi- Example for ESP32-C6/Linux | macOS: ``` -idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.c6_thread" -p /dev/ttyACM0 flash monitor +rm -rf build +idf.py set-target esp32c6 +idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.c6_thread" -p /dev/ttyACM0 flash monitor ``` Example for ESP32-C6/Windows: ``` -idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.c6_thread" -p com3 flash monitor +rmdir /s/q build +idf.py set-targt esp32c6 +idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.c6_thread" -p com3 flash monitor ``` It may be necessary to delete some folders and files before running `idf.py` diff --git a/idf_component_examples/esp_matter_light/ci.json b/idf_component_examples/esp_matter_light/ci.json new file mode 100644 index 00000000000..f23a085285d --- /dev/null +++ b/idf_component_examples/esp_matter_light/ci.json @@ -0,0 +1,11 @@ +{ + "targets": { + "esp32c2": false, + "esp32s2": false + }, + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y", + "CONFIG_MBEDTLS_HKDF_C=y" + ] +} diff --git a/idf_component_examples/esp_matter_light/main/Kconfig.projbuild b/idf_component_examples/esp_matter_light/main/Kconfig.projbuild index 6e6abcb7fcf..3e0a35c5e15 100644 --- a/idf_component_examples/esp_matter_light/main/Kconfig.projbuild +++ b/idf_component_examples/esp_matter_light/main/Kconfig.projbuild @@ -3,100 +3,40 @@ menu "Light Matter Accessory" config BUTTON_PIN int prompt "Button 1 GPIO" - default ENV_GPIO_BOOT_BUTTON + default 9 if IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C6 + default 0 range -1 ENV_GPIO_IN_RANGE_MAX help The GPIO pin for button that will be used to turn on/off the Matter Light. It shall be connected to a push button. It can use the BOOT button of the development board. endmenu - menu "LEDs" config WS2812_PIN int prompt "WS2812 RGB LED GPIO" - default ENV_GPIO_RGB_LED + default 8 if IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C6 + default 48 range -1 ENV_GPIO_OUT_RANGE_MAX help The GPIO pin for the Matter Light that will be driven by RMT. It shall be connected to one single WS2812 RGB LED. endmenu - # TARGET CONFIGURATION - if IDF_TARGET_ESP32C3 - config ENV_GPIO_RANGE_MIN - int - default 0 - - config ENV_GPIO_RANGE_MAX - int - default 19 - # GPIOs 20/21 are always used by UART in examples - - config ENV_GPIO_IN_RANGE_MAX - int - default ENV_GPIO_RANGE_MAX - - config ENV_GPIO_OUT_RANGE_MAX - int - default ENV_GPIO_RANGE_MAX - - config ENV_GPIO_BOOT_BUTTON - int - default 9 - - config ENV_GPIO_RGB_LED - int - default 8 - endif - if IDF_TARGET_ESP32C6 - config ENV_GPIO_RANGE_MIN - int - default 0 + config ENV_GPIO_RANGE_MIN + int + default 0 - config ENV_GPIO_RANGE_MAX - int - default 30 - # GPIOs 16/17 are always used by UART in examples + config ENV_GPIO_RANGE_MAX + int + default 19 if IDF_TARGET_ESP32C3 + default 30 if IDF_TARGET_ESP32C6 + default 48 - config ENV_GPIO_IN_RANGE_MAX - int - default ENV_GPIO_RANGE_MAX + config ENV_GPIO_IN_RANGE_MAX + int + default ENV_GPIO_RANGE_MAX - config ENV_GPIO_OUT_RANGE_MAX - int - default ENV_GPIO_RANGE_MAX - - config ENV_GPIO_BOOT_BUTTON - int - default 9 - - config ENV_GPIO_RGB_LED - int - default 8 - endif - if IDF_TARGET_ESP32S3 - config ENV_GPIO_RANGE_MIN - int - default 0 - - config ENV_GPIO_RANGE_MAX - int - default 48 - - config ENV_GPIO_IN_RANGE_MAX - int - default ENV_GPIO_RANGE_MAX - - config ENV_GPIO_OUT_RANGE_MAX - int - default ENV_GPIO_RANGE_MAX - - config ENV_GPIO_BOOT_BUTTON - int - default 0 - - config ENV_GPIO_RGB_LED - int - default 48 - endif + config ENV_GPIO_OUT_RANGE_MAX + int + default ENV_GPIO_RANGE_MAX endmenu diff --git a/idf_component_examples/esp_matter_light/main/idf_component.yml b/idf_component_examples/esp_matter_light/main/idf_component.yml index 2b4ae4b34a4..e0286324591 100644 --- a/idf_component_examples/esp_matter_light/main/idf_component.yml +++ b/idf_component_examples/esp_matter_light/main/idf_component.yml @@ -1,9 +1,9 @@ dependencies: espressif/esp_matter: - version: "^1.3.0" + version: ">=1.3.0" # Adds Arduino Core from GitHub repository using main branch espressif/arduino-esp32: - version: "^3.0.5" + version: ">=3.0.5" override_path: "../../../" pre_release: true diff --git a/idf_component_examples/esp_matter_light/sdkconfig.defaults.esp32c3 b/idf_component_examples/esp_matter_light/sdkconfig.defaults similarity index 98% rename from idf_component_examples/esp_matter_light/sdkconfig.defaults.esp32c3 rename to idf_component_examples/esp_matter_light/sdkconfig.defaults index df6d6b0d585..43871661856 100644 --- a/idf_component_examples/esp_matter_light/sdkconfig.defaults.esp32c3 +++ b/idf_component_examples/esp_matter_light/sdkconfig.defaults @@ -1,5 +1,3 @@ -CONFIG_IDF_TARGET="esp32c3" - # Arduino Settings CONFIG_FREERTOS_HZ=1000 CONFIG_AUTOSTART_ARDUINO=y diff --git a/idf_component_examples/esp_matter_light/sdkconfig.defaults.esp32c6 b/idf_component_examples/esp_matter_light/sdkconfig.defaults.esp32c6 index f228f3158c8..9fe589613ef 100644 --- a/idf_component_examples/esp_matter_light/sdkconfig.defaults.esp32c6 +++ b/idf_component_examples/esp_matter_light/sdkconfig.defaults.esp32c6 @@ -1,68 +1,5 @@ CONFIG_IDF_TARGET="esp32c6" -# Arduino Settings -CONFIG_FREERTOS_HZ=1000 -CONFIG_AUTOSTART_ARDUINO=y - -# Log Levels -# Boot Messages - Log level -CONFIG_BOOTLOADER_LOG_LEVEL_ERROR=y -# Arduino Log Level -CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_INFO=y -# IDF Log Level -CONFIG_LOG_DEFAULT_LEVEL_ERROR=y - -# Default to 921600 baud when flashing and monitoring device -CONFIG_ESPTOOLPY_BAUD_921600B=y -CONFIG_ESPTOOLPY_BAUD=921600 -CONFIG_ESPTOOLPY_COMPRESSED=y -CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y -CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 -CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y - -#enable BT -CONFIG_BT_ENABLED=y -CONFIG_BT_NIMBLE_ENABLED=y - -#disable BT connection reattempt -CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n - -#enable lwip ipv6 autoconfig -CONFIG_LWIP_IPV6_AUTOCONFIG=y - -# Use a custom partition table -CONFIG_PARTITION_TABLE_CUSTOM=y -CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" -CONFIG_PARTITION_TABLE_OFFSET=0xC000 - -# Disable chip shell -CONFIG_ENABLE_CHIP_SHELL=n - -# Enable OTA Requester -CONFIG_ENABLE_OTA_REQUESTOR=n - -#enable lwIP route hooks -CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y -CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT=y - -# disable softap by default -CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n -CONFIG_ENABLE_WIFI_STATION=y -CONFIG_ENABLE_WIFI_AP=n - -# Disable DS Peripheral -CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n - -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - -# Enable HKDF in mbedtls -CONFIG_MBEDTLS_HKDF_C=y - -# Increase LwIP IPv6 address number to 6 (MAX_FABRIC + 1) -# unique local addresses for fabrics(MAX_FABRIC), a link local address(1) -CONFIG_LWIP_IPV6_NUM_ADDRESSES=6 - # libsodium CONFIG_LIBSODIUM_USE_MBEDTLS_SHA=y diff --git a/idf_component_examples/esp_matter_light/sdkconfig.defaults.esp32s3 b/idf_component_examples/esp_matter_light/sdkconfig.defaults.esp32s3 deleted file mode 100644 index 9c1aa36b6c9..00000000000 --- a/idf_component_examples/esp_matter_light/sdkconfig.defaults.esp32s3 +++ /dev/null @@ -1,64 +0,0 @@ -CONFIG_IDF_TARGET="esp32s3" - -# Arduino Settings -CONFIG_FREERTOS_HZ=1000 -CONFIG_AUTOSTART_ARDUINO=y - -# Log Levels -# Boot Messages - Log level -CONFIG_BOOTLOADER_LOG_LEVEL_ERROR=y -# Arduino Log Level -CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_INFO=y -# IDF Log Level -CONFIG_LOG_DEFAULT_LEVEL_ERROR=y - -# Default to 921600 baud when flashing and monitoring device -CONFIG_ESPTOOLPY_BAUD_921600B=y -CONFIG_ESPTOOLPY_BAUD=921600 -CONFIG_ESPTOOLPY_COMPRESSED=y -CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y -CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 -CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y - -#enable BT -CONFIG_BT_ENABLED=y -CONFIG_BT_NIMBLE_ENABLED=y - -#disable BT connection reattempt -CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n - -#enable lwip ipv6 autoconfig -CONFIG_LWIP_IPV6_AUTOCONFIG=y - -# Use a custom partition table -CONFIG_PARTITION_TABLE_CUSTOM=y -CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" -CONFIG_PARTITION_TABLE_OFFSET=0xC000 - -# Disable chip shell -CONFIG_ENABLE_CHIP_SHELL=n - -# Enable OTA Requester -CONFIG_ENABLE_OTA_REQUESTOR=n - -#enable lwIP route hooks -CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y -CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT=y - -# disable softap by default -CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n -CONFIG_ENABLE_WIFI_STATION=y -CONFIG_ENABLE_WIFI_AP=n - -# Disable DS Peripheral -CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n - -# Use compact attribute storage mode -CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y - -# Enable HKDF in mbedtls -CONFIG_MBEDTLS_HKDF_C=y - -# Increase LwIP IPv6 address number to 6 (MAX_FABRIC + 1) -# unique local addresses for fabrics(MAX_FABRIC), a link local address(1) -CONFIG_LWIP_IPV6_NUM_ADDRESSES=6 diff --git a/idf_component_examples/hello_world/CMakeLists.txt b/idf_component_examples/hello_world/CMakeLists.txt index 664d45871d0..af087cf42b6 100644 --- a/idf_component_examples/hello_world/CMakeLists.txt +++ b/idf_component_examples/hello_world/CMakeLists.txt @@ -5,4 +5,6 @@ cmake_minimum_required(VERSION 3.16) include($ENV{IDF_PATH}/tools/cmake/project.cmake) + +idf_build_set_property(MINIMAL_BUILD ON) project(main) diff --git a/idf_component_examples/hw_cdc_hello_world/CMakeLists.txt b/idf_component_examples/hw_cdc_hello_world/CMakeLists.txt index 16bb1063af3..1c3971f4dbf 100644 --- a/idf_component_examples/hw_cdc_hello_world/CMakeLists.txt +++ b/idf_component_examples/hw_cdc_hello_world/CMakeLists.txt @@ -9,4 +9,5 @@ include($ENV{IDF_PATH}/tools/cmake/project.cmake) list(APPEND compile_definitions "ARDUINO_USB_CDC_ON_BOOT=1") list(APPEND compile_definitions "ARDUINO_USB_MODE=1") +idf_build_set_property(MINIMAL_BUILD ON) project(hw_cdc_hello_world) diff --git a/idf_component_examples/hw_cdc_hello_world/ci.json b/idf_component_examples/hw_cdc_hello_world/ci.json new file mode 100644 index 00000000000..80669afc2cc --- /dev/null +++ b/idf_component_examples/hw_cdc_hello_world/ci.json @@ -0,0 +1,5 @@ +{ + "requires": [ + "CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y" + ] +} From 8ed97f6fa83caa19c093a4b694fc5f22662bdd39 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 28 Apr 2025 12:45:31 -0300 Subject: [PATCH 113/290] ci(release): Add package JSON with chinese mirrors (#11288) * ci(release): Add package JSON with chinese mirrors * fix(comment): Fix comment with proper description --- .github/scripts/on-release.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/scripts/on-release.sh b/.github/scripts/on-release.sh index 242cee93d0b..dafbf3d6a1c 100755 --- a/.github/scripts/on-release.sh +++ b/.github/scripts/on-release.sh @@ -35,6 +35,8 @@ PACKAGE_JSON_MERGE="$GITHUB_WORKSPACE/.github/scripts/merge_packages.py" PACKAGE_JSON_TEMPLATE="$GITHUB_WORKSPACE/package/package_esp32_index.template.json" PACKAGE_JSON_DEV="package_esp32_dev_index.json" PACKAGE_JSON_REL="package_esp32_index.json" +PACKAGE_JSON_DEV_CN="package_esp32_dev_index_cn.json" +PACKAGE_JSON_REL_CN="package_esp32_index_cn.json" echo "Event: $GITHUB_EVENT_NAME, Repo: $GITHUB_REPOSITORY, Path: $GITHUB_WORKSPACE, Ref: $GITHUB_REF" echo "Action: $action, Branch: $RELEASE_BRANCH, ID: $RELEASE_ID" @@ -339,9 +341,13 @@ jq_arg=".packages[0].platforms[0].version = \"$RELEASE_TAG\" | \ # Generate package JSONs echo "Generating $PACKAGE_JSON_DEV ..." cat "$PACKAGE_JSON_TEMPLATE" | jq "$jq_arg" > "$OUTPUT_DIR/$PACKAGE_JSON_DEV" +# On MacOS the sed command won't skip the first match. Use gsed instead. +sed '0,/github\.com\/espressif\//!s|github\.com/espressif/|dl.espressif.cn/github_assets/espressif/|g' "$OUTPUT_DIR/$PACKAGE_JSON_DEV" > "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN" if [ "$RELEASE_PRE" == "false" ]; then echo "Generating $PACKAGE_JSON_REL ..." cat "$PACKAGE_JSON_TEMPLATE" | jq "$jq_arg" > "$OUTPUT_DIR/$PACKAGE_JSON_REL" + # On MacOS the sed command won't skip the first match. Use gsed instead. + sed '0,/github\.com\/espressif\//!s|github\.com/espressif/|dl.espressif.cn/github_assets/espressif/|g' "$OUTPUT_DIR/$PACKAGE_JSON_REL" > "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN" fi # Figure out the last release or pre-release @@ -373,12 +379,14 @@ echo 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" + merge_package_json "$prev_any_release/$PACKAGE_JSON_DEV_CN" "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN" fi if [ "$RELEASE_PRE" == "false" ]; 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" + merge_package_json "$prev_release/$PACKAGE_JSON_REL_CN" "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN" fi fi @@ -388,6 +396,8 @@ echo "Installing arduino-cli ..." export PATH="/home/runner/bin:$PATH" source "${SCRIPTS_DIR}/install-arduino-cli.sh" +# For the Chinese mirror, we can't test the package JSONs as the Chinese mirror might not be updated yet. + echo "Testing $PACKAGE_JSON_DEV install ..." echo "Installing esp32 ..." @@ -445,11 +455,15 @@ fi 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 CN URL: $(git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN")" +echo "Pages CN URL: $(git_safe_upload_to_pages "$PACKAGE_JSON_DEV" "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN")" 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 CN URL: $(git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN")" + echo "Pages CN URL: $(git_safe_upload_to_pages "$PACKAGE_JSON_REL" "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN")" echo fi From 5df9b6402337dd555096efa0f9eef76f669560b4 Mon Sep 17 00:00:00 2001 From: Lewis He Date: Mon, 28 Apr 2025 23:45:54 +0800 Subject: [PATCH 114/290] Update LilyGo T-Watch-S3-Ultra and T-LoRa-Pager variants (#11299) * Update LilyGo variants * Update T-Watch-S3-Ultra variants * 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 | 27 ++++++++++++++------ variants/lilygo_tlora_pager/pins_arduino.h | 28 +++++++++++---------- variants/lilygo_twatch_s3/pins_arduino.h | 2 +- variants/lilygo_twatch_ultra/pins_arduino.h | 11 ++++---- 4 files changed, 41 insertions(+), 27 deletions(-) diff --git a/boards.txt b/boards.txt index f0df27762c2..7406e866b3f 100644 --- a/boards.txt +++ b/boards.txt @@ -6007,12 +6007,12 @@ twatchs3.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) twatchs3.menu.UploadMode.cdc.upload.use_1200bps_touch=true twatchs3.menu.UploadMode.cdc.upload.wait_for_upload_port=true -twatchs3.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) -twatchs3.menu.PartitionScheme.fatflash.build.partitions=ffat -twatchs3.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 twatchs3.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS) twatchs3.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB twatchs3.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 +twatchs3.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) +twatchs3.menu.PartitionScheme.fatflash.build.partitions=ffat +twatchs3.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 twatchs3.menu.PartitionScheme.rainmaker=RainMaker twatchs3.menu.PartitionScheme.rainmaker.build.partitions=rainmaker twatchs3.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 @@ -6076,6 +6076,10 @@ twatchs3.menu.Revision.Radio_SX1280=Radio-SX1280 twatchs3.menu.Revision.Radio_SX1280.build.board=LILYGO_LORA_SX1280 twatchs3.menu.Revision.Radio_CC1101=Radio-CC1101 twatchs3.menu.Revision.Radio_CC1101.build.board=LILYGO_LORA_CC1101 +twatchs3.menu.Revision.Radio_LR1121=Radio-LR1121 +twatchs3.menu.Revision.Radio_LR1121.build.board=LILYGO_LORA_LR1121 +twatchs3.menu.Revision.Radio_SI4432=Radio-SI4432 +twatchs3.menu.Revision.Radio_SI4432.build.board=LILYGO_LORA_SI4432 ############################################################## @@ -6231,13 +6235,16 @@ twatch_ultra.menu.EraseFlash.none.upload.erase_cmd= twatch_ultra.menu.EraseFlash.all=Enabled twatch_ultra.menu.EraseFlash.all.upload.erase_cmd=-e -twatch_ultra.menu.Revision.Radio_SX1280=Radio-SX1280 -twatch_ultra.menu.Revision.Radio_SX1280.build.board=LILYGO_LORA_SX1280 twatch_ultra.menu.Revision.Radio_SX1262=Radio-SX1262 twatch_ultra.menu.Revision.Radio_SX1262.build.board=LILYGO_LORA_SX1262 +twatch_ultra.menu.Revision.Radio_SX1280=Radio-SX1280 +twatch_ultra.menu.Revision.Radio_SX1280.build.board=LILYGO_LORA_SX1280 twatch_ultra.menu.Revision.Radio_CC1101=Radio-CC1101 twatch_ultra.menu.Revision.Radio_CC1101.build.board=LILYGO_LORA_CC1101 - +twatch_ultra.menu.Revision.Radio_LR1121=Radio-LR1121 +twatch_ultra.menu.Revision.Radio_LR1121.build.board=LILYGO_LORA_LR1121 +twatch_ultra.menu.Revision.Radio_SI4432=Radio-SI4432 +twatch_ultra.menu.Revision.Radio_SI4432.build.board=LILYGO_LORA_SI4432 ############################################################## @@ -6393,12 +6400,16 @@ tlora_pager.menu.EraseFlash.all=Enabled tlora_pager.menu.EraseFlash.all.upload.erase_cmd=-e -tlora_pager.menu.Revision.Radio_SX1280=Radio-SX1280 -tlora_pager.menu.Revision.Radio_SX1280.build.board=LILYGO_LORA_SX1280 tlora_pager.menu.Revision.Radio_SX1262=Radio-SX1262 tlora_pager.menu.Revision.Radio_SX1262.build.board=LILYGO_LORA_SX1262 +tlora_pager.menu.Revision.Radio_SX1280=Radio-SX1280 +tlora_pager.menu.Revision.Radio_SX1280.build.board=LILYGO_LORA_SX1280 tlora_pager.menu.Revision.Radio_CC1101=Radio-CC1101 tlora_pager.menu.Revision.Radio_CC1101.build.board=LILYGO_LORA_CC1101 +tlora_pager.menu.Revision.Radio_LR1121=Radio-LR1121 +tlora_pager.menu.Revision.Radio_LR1121.build.board=LILYGO_LORA_LR1121 +tlora_pager.menu.Revision.Radio_SI4432=Radio-SI4432 +tlora_pager.menu.Revision.Radio_SI4432.build.board=LILYGO_LORA_SI4432 ############################################################## diff --git a/variants/lilygo_tlora_pager/pins_arduino.h b/variants/lilygo_tlora_pager/pins_arduino.h index a7e03c759bd..fb57b5d493f 100644 --- a/variants/lilygo_tlora_pager/pins_arduino.h +++ b/variants/lilygo_tlora_pager/pins_arduino.h @@ -20,9 +20,9 @@ static const uint8_t TX = 43; static const uint8_t RX = 44; -//BHI260,PCF85063,BQ25896,DRV2605L,ES8311 share I2C Bus -static const uint8_t SDA = 2; -static const uint8_t SCL = 3; +// BHI260,PCF85063,BQ25896,DRV2605L,ES8311 share I2C Bus +static const uint8_t SDA = 3; +static const uint8_t SCL = 2; // Default sd cs pin static const uint8_t SS = SD_CS; @@ -75,16 +75,18 @@ static const uint8_t SCK = 35; #define DISP_BL (42) // External expansion chip IO definition -#define EXPANDS_DRV_EN (0) -#define EXPANDS_AMP_EN (1) -#define EXPANDS_KB_RST (2) -#define EXPANDS_LORA_EN (3) -#define EXPANDS_GPS_EN (4) -#define EXPANDS_NFC_EN (5) -#define EXPANDS_DISP_RST (6) -#define EXPANDS_GPS_RST (7) -#define EXPANDS_KB_EN (8) -#define EXPANDS_GPIO_EN (9) +#define EXPANDS_DRV_EN (0) +#define EXPANDS_AMP_EN (1) +#define EXPANDS_KB_RST (2) +#define EXPANDS_LORA_EN (3) +#define EXPANDS_GPS_EN (4) +#define EXPANDS_NFC_EN (5) +#define EXPANDS_GPS_RST (7) +#define EXPANDS_KB_EN (8) +#define EXPANDS_GPIO_EN (9) +#define EXPANDS_SD_DET (10) +#define EXPANDS_SD_PULLEN (11) +#define EXPANDS_SD_EN (12) // Peripheral definition exists #define USING_AUDIO_CODEC diff --git a/variants/lilygo_twatch_s3/pins_arduino.h b/variants/lilygo_twatch_s3/pins_arduino.h index b184dc9ba17..05543de27c5 100644 --- a/variants/lilygo_twatch_s3/pins_arduino.h +++ b/variants/lilygo_twatch_s3/pins_arduino.h @@ -44,7 +44,7 @@ static const uint8_t TX = 42; static const uint8_t RX = 41; -//BHI260,PCF85063,AXP2101,DRV2605L,PN532 share I2C Bus +// BMA423,PCF8563,AXP2101,DRV2605L share I2C Bus static const uint8_t SDA = 10; static const uint8_t SCL = 11; diff --git a/variants/lilygo_twatch_ultra/pins_arduino.h b/variants/lilygo_twatch_ultra/pins_arduino.h index c90c1ba584e..91797e687fa 100644 --- a/variants/lilygo_twatch_ultra/pins_arduino.h +++ b/variants/lilygo_twatch_ultra/pins_arduino.h @@ -22,6 +22,7 @@ #define DISP_D3 (45) #define DISP_SCK (40) #define DISP_CS (41) +#define DISP_RST (37) #define DISP_TE (6) // Interrupt IO port @@ -47,9 +48,9 @@ static const uint8_t TX = 43; static const uint8_t RX = 44; -//BHI260,PCF85063,AXP2101,DRV2605L,PN532 share I2C Bus -static const uint8_t SDA = 2; -static const uint8_t SCL = 3; +// BHI260,PCF85063,AXP2101,DRV2605L share I2C Bus +static const uint8_t SDA = 3; +static const uint8_t SCL = 2; // Default sd cs pin static const uint8_t SS = SD_CS; @@ -76,8 +77,8 @@ static const uint8_t SCK = 35; // External expansion chip IO definition #define EXPANDS_DRV_EN (6) #define EXPANDS_DISP_EN (7) -#define EXPANDS_TOUCH_RST (10) -#define EXPANDS_DISP_RST (11) +#define EXPANDS_TOUCH_RST (8) +#define EXPANDS_SD_DET (10) // Peripheral definition exists #define USING_XL9555_EXPANDS From 8d121e075fcd7e09787b02cfbd2929121930a428 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Mon, 28 Apr 2025 12:46:12 -0300 Subject: [PATCH 115/290] feat(rmt): fixes example to run correctly within IDF 5.x (#11292) * feat(rmt): fixes exaple to run correctly within IDF 5.x * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../RMT/RMT_LED_Blink/RMT_LED_Blink.ino | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/libraries/ESP32/examples/RMT/RMT_LED_Blink/RMT_LED_Blink.ino b/libraries/ESP32/examples/RMT/RMT_LED_Blink/RMT_LED_Blink.ino index 8c2b8db3cd1..1cdd2224ea5 100644 --- a/libraries/ESP32/examples/RMT/RMT_LED_Blink/RMT_LED_Blink.ino +++ b/libraries/ESP32/examples/RMT/RMT_LED_Blink/RMT_LED_Blink.ino @@ -1,4 +1,4 @@ -// Copyright 2023 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -13,16 +13,16 @@ // limitations under the License. /** - * @brief This example demonstrate how to use RMT to just blink a regular LED (GPIO) - * It uses all the different RMT Writing APIs to blink the LED by hardware, not being - * necessary the regular Blink code in Arduino. - * - * The output is the Blinking LED in the GPIO and a serial output describing what is - * going on, along the execution. - * - * The circuit is just a LED and a resistor of 270 ohms connected to the GPIO - * GPIO ---> resistor 270 ohms ---> + LED - ---> GND - */ + @brief This example demonstrate how to use RMT to just blink a regular LED (GPIO) + It uses all the different RMT Writing APIs to blink the LED by hardware, not being + necessary the regular Blink code in Arduino. + + The output is the Blinking LED in the GPIO and a serial output describing what is + going on, along the execution. + + The circuit is just a LED and a resistor of 270 ohms connected to the GPIO + GPIO ---> resistor 270 ohms ---> + LED - ---> GND +*/ #define BLINK_GPIO 2 @@ -232,7 +232,7 @@ void RMT_Mixed_Write_Blink() { Serial.println("===> rmtWrite() (Blocking Mode) to Blink the LED."); Serial.println("Blinking at 500ms on + 500ms off :: 4 blinks"); for (uint8_t i = 0; i < 4; i++) { - if (!rmtWrite(BLINK_GPIO, blink_500ms_rmt_data, RMT_SYMBOLS_OF(blink_500ms_rmt_data) - 2, RMT_WAIT_FOR_EVER)) { + if (!rmtWrite(BLINK_GPIO, blink_500ms_rmt_data, RMT_SYMBOLS_OF(blink_500ms_rmt_data) - 1, RMT_WAIT_FOR_EVER)) { Serial.println("===> rmtWrite Blink 0.5s Error!"); } } @@ -240,7 +240,7 @@ void RMT_Mixed_Write_Blink() { Serial.println("===> rmtWriteAsync() (Non-Blocking Mode) to Blink the LED."); Serial.println("Blinking at 250ms on + 250ms off :: 5 blinks"); for (uint8_t i = 0; i < 5; i++) { - if (!rmtWriteAsync(BLINK_GPIO, blink_250ms_rmt_data, RMT_SYMBOLS_OF(blink_250ms_rmt_data) - 2)) { + if (!rmtWriteAsync(BLINK_GPIO, blink_250ms_rmt_data, RMT_SYMBOLS_OF(blink_250ms_rmt_data) - 1)) { Serial.println("===> rmtWrite Blink 0.25s Error!"); } // wait (blocks) until all the data is sent out @@ -267,9 +267,11 @@ void RMT_Loop_Write_Blink() { Serial.println("===> rmtWriteLooping Blink 0.25s Error!"); } delay(5000); + Serial.println("Blinking OFF for 2 seconds"); - if (!rmtWriteLooping(BLINK_GPIO, NULL, 0)) { - Serial.println("===> rmtWriteLooping Blink OFF Error!"); + rmt_data_t blink_STOP_rmt_data[] = {{0, 0, 0, 0}}; + if (!rmtWrite(BLINK_GPIO, blink_STOP_rmt_data, RMT_SYMBOLS_OF(blink_STOP_rmt_data), RMT_WAIT_FOR_EVER)) { + Serial.println("===> rmtWrite Blink STOP Error!"); } delay(2000); } @@ -278,19 +280,19 @@ void RMT_Single_Write_Blocking_Blink() { Serial.println("Using RMT Writing and its Completion to blink an LED."); Serial.println("Blinking at 1s on + 1s off :: 2 blinks"); for (uint8_t i = 0; i < 2; i++) { - if (!rmtWrite(BLINK_GPIO, blink_1s_rmt_data, RMT_SYMBOLS_OF(blink_1s_rmt_data) - 2, RMT_WAIT_FOR_EVER)) { + if (!rmtWrite(BLINK_GPIO, blink_1s_rmt_data, RMT_SYMBOLS_OF(blink_1s_rmt_data) - 1, RMT_WAIT_FOR_EVER)) { Serial.println("===> rmtWrite Blink 1s Error!"); } } Serial.println("Blinking at 500ms on + 500ms off :: 4 blinks"); for (uint8_t i = 0; i < 4; i++) { - if (!rmtWrite(BLINK_GPIO, blink_500ms_rmt_data, RMT_SYMBOLS_OF(blink_500ms_rmt_data) - 2, RMT_WAIT_FOR_EVER)) { + if (!rmtWrite(BLINK_GPIO, blink_500ms_rmt_data, RMT_SYMBOLS_OF(blink_500ms_rmt_data) - 1, RMT_WAIT_FOR_EVER)) { Serial.println("===> rmtWrite Blink 0.5s Error!"); } } Serial.println("Blinking at 250ms on + 250ms off :: 8 blinks"); for (uint8_t i = 0; i < 8; i++) { - if (!rmtWrite(BLINK_GPIO, blink_250ms_rmt_data, RMT_SYMBOLS_OF(blink_250ms_rmt_data) - 2, RMT_WAIT_FOR_EVER)) { + if (!rmtWrite(BLINK_GPIO, blink_250ms_rmt_data, RMT_SYMBOLS_OF(blink_250ms_rmt_data) - 1, RMT_WAIT_FOR_EVER)) { Serial.println("===> rmtWrite Blink 0.25s Error!"); } } @@ -302,7 +304,7 @@ void RMT_Write_Aync_Non_Blocking_Blink() { Serial.println("Using RMT Async Writing and its Completion to blink an LED."); Serial.println("Blinking at 1s on + 1s off :: 5 blinks"); for (uint8_t i = 0; i < 5; i++) { - if (!rmtWriteAsync(BLINK_GPIO, blink_1s_rmt_data, RMT_SYMBOLS_OF(blink_1s_rmt_data) - 2)) { + if (!rmtWriteAsync(BLINK_GPIO, blink_1s_rmt_data, RMT_SYMBOLS_OF(blink_1s_rmt_data) - 1)) { Serial.println("===> rmtWrite Blink 1s Error!"); } // wait (blocks) until all the data is sent out @@ -310,7 +312,7 @@ void RMT_Write_Aync_Non_Blocking_Blink() { } Serial.println("Blinking at 500ms on + 500ms off :: 5 blinks"); for (uint8_t i = 0; i < 5; i++) { - if (!rmtWriteAsync(BLINK_GPIO, blink_500ms_rmt_data, RMT_SYMBOLS_OF(blink_500ms_rmt_data) - 2)) { + if (!rmtWriteAsync(BLINK_GPIO, blink_500ms_rmt_data, RMT_SYMBOLS_OF(blink_500ms_rmt_data) - 1)) { Serial.println("===> rmtWrite Blink 0.5s Error!"); } // wait (blocks) until all the data is sent out @@ -318,7 +320,7 @@ void RMT_Write_Aync_Non_Blocking_Blink() { } Serial.println("Blinking at 250ms on + 250ms off :: 5 blinks"); for (uint8_t i = 0; i < 5; i++) { - if (!rmtWriteAsync(BLINK_GPIO, blink_250ms_rmt_data, RMT_SYMBOLS_OF(blink_250ms_rmt_data) - 2)) { + if (!rmtWriteAsync(BLINK_GPIO, blink_250ms_rmt_data, RMT_SYMBOLS_OF(blink_250ms_rmt_data) - 1)) { Serial.println("===> rmtWrite Blink 0.25s Error!"); } // wait (blocks) until all the data is sent out @@ -345,7 +347,6 @@ void setup() { RMT_Mixed_Write_Blink(); Serial.println("End of Mixed Calls testing"); - delay(1000); Serial.println("\n==============================="); Serial.println("Starting a Blinking sequence..."); From 9193c9db1eaca6017df293134e3ffbfbe602541d Mon Sep 17 00:00:00 2001 From: microbots Date: Mon, 28 Apr 2025 19:27:17 +0200 Subject: [PATCH 116/290] Update boards.txt with updated CodeCell board variant (#11313) * Update boards.txt * Update boards.txt * Update boards.txt * Update boards.txt --------- Co-authored-by: Carl Bugeja --- boards.txt | 132 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 123 insertions(+), 9 deletions(-) diff --git a/boards.txt b/boards.txt index 7406e866b3f..7113bf4c248 100644 --- a/boards.txt +++ b/boards.txt @@ -43277,20 +43277,22 @@ alfredo-nou3.menu.EraseFlash.all=Enabled alfredo-nou3.menu.EraseFlash.all.upload.erase_cmd=-e ############################################################## -codecell.name=CodeCell -codecell.vid.0=0x303a -codecell.pid.0=0x1002 -codecell.upload_port.0.vid=0x303a -codecell.upload_port.0.pid=0x1002 +codecell.name=CodeCell C3 codecell.bootloader.tool=esptool_py +codecell.bootloader.tool.default=esptool_py + codecell.upload.tool=esptool_py -codecell.upload.maximum_size=4194304 +codecell.upload.tool.default=esptool_py +codecell.upload.tool.network=esp_ota + +codecell.upload.maximum_size=1310720 codecell.upload.maximum_data_size=327680 +codecell.upload.flags= +codecell.upload.extra_flags= codecell.upload.use_1200bps_touch=false codecell.upload.wait_for_upload_port=false -codecell.upload.speed=921600 codecell.serial.disableDTR=false codecell.serial.disableRTS=false @@ -43299,8 +43301,9 @@ codecell.build.target=esp codecell.build.mcu=esp32c3 codecell.build.core=esp32 codecell.build.variant=codecell -codecell.build.board=ESP32C3_DEV +codecell.build.board=CODECELLC3 codecell.build.bootloader_addr=0x0 + codecell.build.cdc_on_boot=1 codecell.build.f_cpu=160000000L codecell.build.flash_size=4MB @@ -43308,13 +43311,118 @@ codecell.build.flash_freq=80m codecell.build.flash_mode=qio codecell.build.boot=qio codecell.build.partitions=default +codecell.build.defines= + + +codecell.menu.JTAGAdapter.default=Disabled +codecell.menu.JTAGAdapter.default.build.copy_jtag_files=0 +codecell.menu.JTAGAdapter.builtin=Integrated USB JTAG +codecell.menu.JTAGAdapter.builtin.build.openocdscript=esp32c3-builtin.cfg +codecell.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 +codecell.menu.JTAGAdapter.external=FTDI Adapter +codecell.menu.JTAGAdapter.external.build.openocdscript=esp32c3-ftdi.cfg +codecell.menu.JTAGAdapter.external.build.copy_jtag_files=1 +codecell.menu.JTAGAdapter.bridge=ESP USB Bridge +codecell.menu.JTAGAdapter.bridge.build.openocdscript=esp32c3-bridge.cfg +codecell.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +codecell.menu.CDCOnBoot.default=Enabled +codecell.menu.CDCOnBoot.default.build.cdc_on_boot=0 +codecell.menu.CDCOnBoot.cdc=Enabled +codecell.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 codecell.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) -codecell.menu.CPUFreq.160=160MHz +codecell.menu.PartitionScheme.default.build.partitions=default +codecell.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +codecell.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +codecell.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +codecell.menu.PartitionScheme.minimal.build.partitions=minimal +codecell.menu.PartitionScheme.no_fs=No FS 4MB (2MB APP x2) +codecell.menu.PartitionScheme.no_fs.build.partitions=no_fs +codecell.menu.PartitionScheme.no_fs.upload.maximum_size=2031616 +codecell.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +codecell.menu.PartitionScheme.no_ota.build.partitions=no_ota +codecell.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +codecell.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +codecell.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +codecell.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +codecell.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +codecell.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +codecell.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +codecell.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +codecell.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +codecell.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +codecell.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +codecell.menu.PartitionScheme.huge_app.build.partitions=huge_app +codecell.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +codecell.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +codecell.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +codecell.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 +codecell.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) +codecell.menu.PartitionScheme.fatflash.build.partitions=ffat +codecell.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 +codecell.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS) +codecell.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB +codecell.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 +codecell.menu.PartitionScheme.rainmaker=RainMaker 4MB +codecell.menu.PartitionScheme.rainmaker.build.partitions=rainmaker +codecell.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 +codecell.menu.PartitionScheme.rainmaker_4MB=RainMaker 4MB No OTA +codecell.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota +codecell.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 +codecell.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB +codecell.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB +codecell.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +codecell.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs +codecell.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr +codecell.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 +codecell.menu.PartitionScheme.zigbee_zczr_8MB=Zigbee ZCZR 8MB with spiffs +codecell.menu.PartitionScheme.zigbee_zczr_8MB.build.partitions=zigbee_zczr_8MB +codecell.menu.PartitionScheme.zigbee_zczr_8MB.upload.maximum_size=3407872 +codecell.menu.PartitionScheme.custom=Custom +codecell.menu.PartitionScheme.custom.build.partitions= +codecell.menu.PartitionScheme.custom.upload.maximum_size=16777216 + +codecell.menu.CPUFreq.160=160MHz (WiFi) +codecell.menu.CPUFreq.160.build.f_cpu=160000000L +codecell.menu.CPUFreq.80=80MHz (WiFi) +codecell.menu.CPUFreq.80.build.f_cpu=80000000L +codecell.menu.CPUFreq.40=40MHz +codecell.menu.CPUFreq.40.build.f_cpu=40000000L +codecell.menu.CPUFreq.20=20MHz +codecell.menu.CPUFreq.20.build.f_cpu=20000000L +codecell.menu.CPUFreq.10=10MHz +codecell.menu.CPUFreq.10.build.f_cpu=10000000L + codecell.menu.FlashMode.qio=QIO +codecell.menu.FlashMode.qio.build.flash_mode=dio +codecell.menu.FlashMode.qio.build.boot=qio +codecell.menu.FlashMode.dio=DIO +codecell.menu.FlashMode.dio.build.flash_mode=dio +codecell.menu.FlashMode.dio.build.boot=dio + codecell.menu.FlashFreq.80=80MHz +codecell.menu.FlashFreq.80.build.flash_freq=80m +codecell.menu.FlashFreq.40=40MHz +codecell.menu.FlashFreq.40.build.flash_freq=40m + codecell.menu.FlashSize.4M=4MB (32Mb) +codecell.menu.FlashSize.4M.build.flash_size=4MB + codecell.menu.UploadSpeed.921600=921600 +codecell.menu.UploadSpeed.921600.upload.speed=921600 +codecell.menu.UploadSpeed.115200=115200 +codecell.menu.UploadSpeed.115200.upload.speed=115200 +codecell.menu.UploadSpeed.256000.windows=256000 +codecell.menu.UploadSpeed.256000.upload.speed=256000 +codecell.menu.UploadSpeed.230400.windows.upload.speed=256000 +codecell.menu.UploadSpeed.230400=230400 +codecell.menu.UploadSpeed.230400.upload.speed=230400 +codecell.menu.UploadSpeed.460800.linux=460800 +codecell.menu.UploadSpeed.460800.macosx=460800 +codecell.menu.UploadSpeed.460800.upload.speed=460800 +codecell.menu.UploadSpeed.512000.windows=512000 +codecell.menu.UploadSpeed.512000.upload.speed=512000 codecell.menu.DebugLevel.none=None codecell.menu.DebugLevel.none.build.code_debug=0 @@ -43334,6 +43442,12 @@ codecell.menu.EraseFlash.none.upload.erase_cmd= codecell.menu.EraseFlash.all=Enabled codecell.menu.EraseFlash.all.upload.erase_cmd=-e +codecell.menu.ZigbeeMode.default=Disabled +codecell.menu.ZigbeeMode.default.build.zigbee_mode= +codecell.menu.ZigbeeMode.default.build.zigbee_libs= +codecell.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) +codecell.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +codecell.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## jczn_2432s028r.name=ESP32-2432S028R CYD From b461e01e2214f4fbae62ee5e601609e75d48feb5 Mon Sep 17 00:00:00 2001 From: UltimumControl <70729135+UltimumControl@users.noreply.github.com> Date: Mon, 28 Apr 2025 13:45:31 -0400 Subject: [PATCH 117/290] New SPI invert hardware SS function in hall-spi and SPI library (#11297) * Add files via upload * Add files via upload * Update SPI.h * Update esp32-hal-spi.c renamed invert_out to ss_invert to be more intuitive * Update esp32-hal-spi.h Removed the out from the function name spiSSInvertout. * Update SPI.cpp Removed the out from the function name spiSSInvertout. * Update cores/esp32/esp32-hal-spi.c 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> --- cores/esp32/esp32-hal-spi.c | 9 ++++++++- cores/esp32/esp32-hal-spi.h | 2 ++ libraries/SPI/src/SPI.cpp | 6 ++++++ libraries/SPI/src/SPI.h | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-spi.c b/cores/esp32/esp32-hal-spi.c index 80928309670..9ae10c66167 100644 --- a/cores/esp32/esp32-hal-spi.c +++ b/cores/esp32/esp32-hal-spi.c @@ -74,6 +74,7 @@ struct spi_struct_t { int8_t miso; int8_t mosi; int8_t ss; + bool ss_invert; }; #if CONFIG_IDF_TARGET_ESP32S2 @@ -365,7 +366,7 @@ bool spiAttachSS(spi_t *spi, uint8_t ss_num, int8_t ss) { return false; } pinMode(ss, OUTPUT); - pinMatrixOutAttach(ss, SPI_SS_IDX(spi->num, ss_num), false, false); + pinMatrixOutAttach(ss, SPI_SS_IDX(spi->num, ss_num), spi->ss_invert, false); spiEnableSSPins(spi, (1 << ss_num)); spi->ss = ss; if (!perimanSetPinBus(ss, ESP32_BUS_TYPE_SPI_MASTER_SS, (void *)(spi->num + 1), spi->num, -1)) { @@ -435,6 +436,12 @@ void spiSSDisable(spi_t *spi) { SPI_MUTEX_UNLOCK(); } +void spiSSInvert(spi_t *spi, bool invert) { + if (spi) { + spi->ss_invert = invert; + } +} + void spiSSSet(spi_t *spi) { if (!spi) { return; diff --git a/cores/esp32/esp32-hal-spi.h b/cores/esp32/esp32-hal-spi.h index b77abff7854..7d56f0820d3 100644 --- a/cores/esp32/esp32-hal-spi.h +++ b/cores/esp32/esp32-hal-spi.h @@ -97,6 +97,8 @@ void spiSSSet(spi_t *spi); void spiSSClear(spi_t *spi); void spiWaitReady(spi_t *spi); +//invert hardware SS +void spiSSInvert(spi_t *spi, bool invert); uint32_t spiGetClockDiv(spi_t *spi); uint8_t spiGetDataMode(spi_t *spi); diff --git a/libraries/SPI/src/SPI.cpp b/libraries/SPI/src/SPI.cpp index 35e52f43e4d..ae207a7ff3c 100644 --- a/libraries/SPI/src/SPI.cpp +++ b/libraries/SPI/src/SPI.cpp @@ -144,6 +144,12 @@ void SPIClass::setHwCs(bool use) { _use_hw_ss = use; } +void SPIClass::setSSInvert(bool invert) { + if (_spi) { + spiSSInvert(_spi, invert); + } +} + void SPIClass::setFrequency(uint32_t freq) { SPI_PARAM_LOCK(); //check if last freq changed diff --git a/libraries/SPI/src/SPI.h b/libraries/SPI/src/SPI.h index adb3d1bc11f..628c2190f50 100644 --- a/libraries/SPI/src/SPI.h +++ b/libraries/SPI/src/SPI.h @@ -65,6 +65,7 @@ class SPIClass { void end(); void setHwCs(bool use); + void setSSInvert(bool invert); //use before setHwCS for change to be used by setHwCs void setBitOrder(uint8_t bitOrder); void setDataMode(uint8_t dataMode); void setFrequency(uint32_t freq); From 16fcdeb0be467d3d2c4dabb53db8cb346933c1f1 Mon Sep 17 00:00:00 2001 From: Luca Burelli Date: Tue, 29 Apr 2025 07:57:51 +0200 Subject: [PATCH 118/290] fix(arduino): restore proper pin remapping functionality (#11315) Commit 0773dd7619b1117bd59a068b69a76cdb22484f7c from PR #10841 broke pin remapping by moving its application too early in the definition process. This commit restores the original order of includes, ensuring that pin remapping is applied correctly. Signed-off-by: Luca Burelli Co-authored-by: Sugar Glider --- cores/esp32/Arduino.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cores/esp32/Arduino.h b/cores/esp32/Arduino.h index d21089cc3fe..9048249a873 100644 --- a/cores/esp32/Arduino.h +++ b/cores/esp32/Arduino.h @@ -41,7 +41,6 @@ #include "extra_attr.h" #include "pins_arduino.h" -#include "io_pin_remap.h" #include "esp32-hal.h" #define PI 3.1415926535897932384626433832795 @@ -251,4 +250,8 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); void noTone(uint8_t _pin); #endif /* __cplusplus */ + +// must be applied last as it overrides some of the above +#include "io_pin_remap.h" + #endif /* _ESP32_CORE_ARDUINO_H_ */ From d63b876f9372cd8679971cc17300cc4e9a252c39 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Tue, 29 Apr 2025 02:58:10 -0300 Subject: [PATCH 119/290] feat(uart): simplifies UART example based on MODBUS standard (#11309) * feat(uart): simplifies UART example based on MODBUS standard * fix(uart): fixes a uart example typo * feat(uart): replaces UART0 by Serial0 in the code * ci(pre-commit): Apply automatic fixes * fix(uart): typo error message in commentary --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../onReceiveExample/onReceiveExample.ino | 131 ++++++++---------- 1 file changed, 57 insertions(+), 74 deletions(-) diff --git a/libraries/ESP32/examples/Serial/onReceiveExample/onReceiveExample.ino b/libraries/ESP32/examples/Serial/onReceiveExample/onReceiveExample.ino index fe66b07b875..17d800b3b39 100644 --- a/libraries/ESP32/examples/Serial/onReceiveExample/onReceiveExample.ino +++ b/libraries/ESP32/examples/Serial/onReceiveExample/onReceiveExample.ino @@ -5,20 +5,20 @@ void HardwareSerial::onReceive(OnReceiveCb function, bool onlyOnTimeout = false) It is possible to register an UART callback function that will be called - every time that UART receives data and an associated interrupt is generated. + every time that UART receives data and an associated UART interrupt is generated. - In summary, HardwareSerial::onReceive() works like an RX Interrupt callback, that can be adjusted - using HardwareSerial::setRxFIFOFull() and HardwareSerial::setRxTimeout(). + In summary, HardwareSerial::onReceive() works like an RX Interrupt callback, that + can be adjusted using HardwareSerial::setRxFIFOFull() and HardwareSerial::setRxTimeout(). - OnReceive will be called, while receiving a stream of data, when every 120 bytes are received (default FIFO Full), - which may not help in case that the application needs to get all data at once before processing it. - Therefore, a way to make it work is by detecting the end of a stream transmission. This can be based on a protocol - or based on timeout with the UART line in idle (no data received - this is the case of this example). + In case that is not changed or it is set to , the callback function is + executed whenever any event happens first (FIFO Full or RX Timeout). + OnReceive will be called when every 120 bytes are received(default FIFO Full), + or when RX Timeout occurs after 1 UART symbol by default. - In some cases, it is necessary to wait for receiving all the data before processing it and parsing the - UART input. This example demonstrates a way to create a String with all data received from UART0 and - signaling it using a Mutex for another task to process it. This example uses a timeout of 500ms as a way to - know when the reception of data has finished. + This example demonstrates a way to create a String with all data received from UART0 only + after RX Timeout. This example uses an RX timeout of about 3.5 Symbols as a way to know + when the reception of data has finished. + In order to achieve it, the sketch sets to . The onReceive() callback is called whenever the RX ISR is triggered. It can occur because of two possible events: @@ -34,90 +34,73 @@ 2- UART RX Timeout: it happens, based on a timeout equivalent to a number of symbols at the current baud rate. If the UART line is idle for this timeout, it will raise an interrupt. - This time can be changed by HardwareSerial::setRxTimeout(uint8_t rxTimeout) + This time can be changed by HardwareSerial::setRxTimeout(uint8_t rxTimeout). + is bound to the clock source. + In order to use it properly, ESP32 and ESP32-S2 shall set the UART Clock Source to APB. When any of those two interrupts occur, IDF UART driver will copy FIFO data to its internal RingBuffer and then Arduino can read such data. At the same time, Arduino Layer will execute the callback function defined with HardwareSerial::onReceive(). - parameter (default false) can be used by the application to tell Arduino to - only execute the callback when the second event above happens (Rx Timeout). At this time all - received data will be available to be read by the Arduino application. But if the number of - received bytes is higher than the FIFO space, it will generate an error of FIFO overflow. - In order to avoid such problem, the application shall set an appropriate RX buffer size using + parameter can be used by the application to tell Arduino to only execute + the callback when Rx Timeout happens, by setting it to . + At this time all received data will be available to be read by the Arduino application. + The application shall set an appropriate RX buffer size using HardwareSerial::setRxBufferSize(size_t new_size) before executing begin() for the Serial port. -*/ -// this will make UART0 work in any case (using or not USB) -#if ARDUINO_USB_CDC_ON_BOOT -#define UART0 Serial0 -#else -#define UART0 Serial -#endif + MODBUS timeout of 3.5 symbol is based on these documents: + https://www.automation.com/en-us/articles/2012-1/introduction-to-modbus + https://minimalmodbus.readthedocs.io/en/stable/serialcommunication.html +*/ // global variable to keep the results from onReceive() String uart_buffer = ""; -// a pause of a half second in the UART transmission is considered the end of transmission. -const uint32_t communicationTimeout_ms = 500; - -// Create a mutex for the access to uart_buffer -// only one task can read/write it at a certain time -SemaphoreHandle_t uart_buffer_Mutex = NULL; - -// UART_RX_IRQ will be executed as soon as data is received by the UART -// This is a callback function executed from a high priority -// task created when onReceive() is used +// The Modbus RTU standard prescribes a silent period corresponding to 3.5 characters between each +// message, to be able to figure out where one message ends and the next one starts. +const uint32_t modbusRxTimeoutLimit = 4; +const uint32_t baudrate = 19200; + +// UART_RX_IRQ will be executed as soon as data is received by the UART and an RX Timeout occurs +// This is a callback function executed from a high priority monitor task +// All data will be buffered into RX Buffer, which may have its size set to whatever necessary void UART0_RX_CB() { - // take the mutex, waits forever until loop() finishes its processing - if (xSemaphoreTake(uart_buffer_Mutex, portMAX_DELAY)) { - uint32_t now = millis(); // tracks timeout - while ((millis() - now) < communicationTimeout_ms) { - if (UART0.available()) { - uart_buffer += (char)UART0.read(); - now = millis(); // reset the timer - } - } - // releases the mutex for data processing - xSemaphoreGive(uart_buffer_Mutex); + while (Serial0.available()) { + uart_buffer += (char)Serial0.read(); } } // setup() and loop() are functions executed by a low priority task // Therefore, there are 2 tasks running when using onReceive() void setup() { - UART0.begin(115200); - - // creates a mutex object to control access to uart_buffer - uart_buffer_Mutex = xSemaphoreCreateMutex(); - if (uart_buffer_Mutex == NULL) { - log_e("Error creating Mutex. Sketch will fail."); - while (true) { - UART0.println("Mutex error (NULL). Program halted."); - delay(2000); - } - } - - UART0.onReceive(UART0_RX_CB); // sets the callback function - UART0.println("Send data to UART0 in order to activate the RX callback"); + // Using Serial0 will work in any case (using or not USB CDC on Boot) +#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 + // UART_CLK_SRC_APB will allow higher values of RX Timeout + // default for ESP32 and ESP32-S2 is REF_TICK which limits the RX Timeout to 1 + // setClockSource() must be called before begin() + Serial0.setClockSource(UART_CLK_SRC_APB); +#endif + // the amount of data received or waiting to be proessed shall not exceed this limit of 1024 bytes + Serial0.setRxBufferSize(1024); // default is 256 bytes + Serial0.begin(baudrate); // default pins and default mode 8N1 (8 bits data, no parity bit, 1 stopbit) + // set RX Timeout based on UART symbols ~ 3.5 symbols of 11 bits (MODBUS standard) ~= 2 ms at 19200 + Serial0.setRxTimeout(modbusRxTimeoutLimit); // 4 symbols at 19200 8N1 is about 2.08 ms (40 bits) + // sets the callback function that will be executed only after RX Timeout + Serial0.onReceive(UART0_RX_CB, true); + Serial0.println("Send data using Serial Monitor in order to activate the RX callback"); } uint32_t counter = 0; void loop() { + // String is filled by the UART Callback whenever data is received and RX Timeout occurs if (uart_buffer.length() > 0) { - // signals that the onReceive function shall not change uart_buffer while processing - if (xSemaphoreTake(uart_buffer_Mutex, portMAX_DELAY)) { - // process the received data from UART0 - example, just print it beside a counter - UART0.print("["); - UART0.print(counter++); - UART0.print("] ["); - UART0.print(uart_buffer.length()); - UART0.print(" bytes] "); - UART0.println(uart_buffer); - uart_buffer = ""; // reset uart_buffer for the next UART reading - // releases the mutex for more data to be received - xSemaphoreGive(uart_buffer_Mutex); - } + // process the received data from Serial - example, just print it beside a counter + Serial0.print("["); + Serial0.print(counter++); + Serial0.print("] ["); + Serial0.print(uart_buffer.length()); + Serial0.print(" bytes] "); + Serial0.println(uart_buffer); + uart_buffer = ""; // reset uart_buffer for the next UART reading } - UART0.println("Sleeping for 1 second..."); - delay(1000); + delay(1); } From de72a03ca51cad7089ba67574f8d0fbece7ea43d Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 29 Apr 2025 04:46:44 -0300 Subject: [PATCH 120/290] docs(mirror): Add Chinese mirror links (#11317) --- docs/en/installing.rst | 15 +++++++++++++++ docs/en/troubleshooting.rst | 17 +++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/docs/en/installing.rst b/docs/en/installing.rst index d5392d4b5ec..35342020864 100644 --- a/docs/en/installing.rst +++ b/docs/en/installing.rst @@ -10,6 +10,11 @@ Before Installing We recommend you install the support using your favorite IDE, but other options are available depending on your operating system. To install Arduino-ESP32 support, you can use one of the following options. +.. note:: + Users in China might have troubles with connection and download speeds using GitHub. Please use our Jihulab mirror as the repository source: + + ``https://jihulab.com/esp-mirror/espressif/arduino-esp32.git`` + Installing using Arduino IDE ---------------------------- @@ -32,6 +37,16 @@ This is the way to install Arduino-ESP32 directly from the Arduino IDE. https://espressif.github.io/arduino-esp32/package_esp32_dev_index.json +Users in China might have troubles with connection and download speeds using the links above. Please use our Jihulab mirror: + +- Stable release link:: + + https://jihulab.com/esp-mirror/espressif/arduino-esp32/-/raw/gh-pages/package_esp32_index_cn.json + +- Development release link:: + + https://jihulab.com/esp-mirror/espressif/arduino-esp32/-/raw/gh-pages/package_esp32_dev_index_cn.json + .. note:: Starting with the Arduino IDE version 1.6.4, Arduino allows installation of third-party platform packages using Boards Manager. We have packages available for Windows, macOS, and Linux. diff --git a/docs/en/troubleshooting.rst b/docs/en/troubleshooting.rst index f6a241729f5..ea9a6db94d6 100644 --- a/docs/en/troubleshooting.rst +++ b/docs/en/troubleshooting.rst @@ -14,6 +14,23 @@ Installing Here are the common issues during the installation. +Slow or unstable downloads +************************** + +Users in China might have troubles with connection and download speeds using GitHub. Please use our Jihulab mirror as the repository source: + +`https://jihulab.com/esp-mirror/espressif/arduino-esp32.git `_ + +JSON files for the boards manager are available here: + +- Stable release:: + + https://jihulab.com/esp-mirror/espressif/arduino-esp32/-/raw/gh-pages/package_esp32_index_cn.json + +- Development release:: + + https://jihulab.com/esp-mirror/espressif/arduino-esp32/-/raw/gh-pages/package_esp32_dev_index_cn.json + Building -------- From 543fad2bdf24ccafe0be86d7fc7740613fc78035 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 29 Apr 2025 04:49:23 -0300 Subject: [PATCH 121/290] fix(spi): Add missing initializer for ss_invert (#11320) * fix(spi): Add missing initializer for ss_invert * 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-spi.c | 46 ++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/cores/esp32/esp32-hal-spi.c b/cores/esp32/esp32-hal-spi.c index 9ae10c66167..6b8e3f8c013 100644 --- a/cores/esp32/esp32-hal-spi.c +++ b/cores/esp32/esp32-hal-spi.c @@ -152,23 +152,23 @@ struct spi_struct_t { // clang-format off static spi_t _spi_bus_array[] = { #if CONFIG_IDF_TARGET_ESP32S2 - {(volatile spi_dev_t *)(DR_REG_SPI1_BASE), 0, -1, -1, -1, -1}, - {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 1, -1, -1, -1, -1}, - {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), 2, -1, -1, -1, -1} + {(volatile spi_dev_t *)(DR_REG_SPI1_BASE), 0, -1, -1, -1, -1, false}, + {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 1, -1, -1, -1, -1, false}, + {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), 2, -1, -1, -1, -1, false} #elif CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4 - {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1}, - {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), 1, -1, -1, -1, -1} + {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1, false}, + {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), 1, -1, -1, -1, -1, false} #elif CONFIG_IDF_TARGET_ESP32C2 - {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1} + {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1, false} #elif CONFIG_IDF_TARGET_ESP32C3 - {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1} + {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1, false} #elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 - {(spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1} + {(spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1, false} #else - {(volatile spi_dev_t *)(DR_REG_SPI0_BASE), 0, -1, -1, -1, -1}, - {(volatile spi_dev_t *)(DR_REG_SPI1_BASE), 1, -1, -1, -1, -1}, - {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 2, -1, -1, -1, -1}, - {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), 3, -1, -1, -1, -1} + {(volatile spi_dev_t *)(DR_REG_SPI0_BASE), 0, -1, -1, -1, -1, false}, + {(volatile spi_dev_t *)(DR_REG_SPI1_BASE), 1, -1, -1, -1, -1, false}, + {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 2, -1, -1, -1, -1, false}, + {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), 3, -1, -1, -1, -1, false} #endif }; // clang-format on @@ -180,22 +180,22 @@ static spi_t _spi_bus_array[] = { static spi_t _spi_bus_array[] = { #if CONFIG_IDF_TARGET_ESP32S2 - {(volatile spi_dev_t *)(DR_REG_SPI1_BASE), NULL, 0, -1, -1, -1, -1}, - {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 1, -1, -1, -1, -1}, - {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), NULL, 2, -1, -1, -1, -1} + {(volatile spi_dev_t *)(DR_REG_SPI1_BASE), NULL, 0, -1, -1, -1, -1, false}, + {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 1, -1, -1, -1, -1, false}, + {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), NULL, 2, -1, -1, -1, -1, false} #elif CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4 - {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1}, {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), NULL, 1, -1, -1, -1, -1} + {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1, false}, {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), NULL, 1, -1, -1, -1, -1, false} #elif CONFIG_IDF_TARGET_ESP32C2 - {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1} + {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1, false} #elif CONFIG_IDF_TARGET_ESP32C3 - {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1} + {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1, false} #elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 - {(spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1} + {(spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1, false} #else - {(volatile spi_dev_t *)(DR_REG_SPI0_BASE), NULL, 0, -1, -1, -1, -1}, - {(volatile spi_dev_t *)(DR_REG_SPI1_BASE), NULL, 1, -1, -1, -1, -1}, - {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 2, -1, -1, -1, -1}, - {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), NULL, 3, -1, -1, -1, -1} + {(volatile spi_dev_t *)(DR_REG_SPI0_BASE), NULL, 0, -1, -1, -1, -1, false}, + {(volatile spi_dev_t *)(DR_REG_SPI1_BASE), NULL, 1, -1, -1, -1, -1, false}, + {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 2, -1, -1, -1, -1, false}, + {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), NULL, 3, -1, -1, -1, -1, false} #endif }; #endif From b115acea40b2381bc00e07944d926fe726d05ef5 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 1 May 2025 02:15:03 +0300 Subject: [PATCH 122/290] IDF master (#11289) * fix(libs): Ensure compilation with ESP32-C5 * fix(i2c): Update I2C Slave init call * IDF master 465b159c * ci(simple_ble): Add check for BLE supported * IDF master 38628f98 --------- Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> --- cores/esp32/esp32-hal-i2c-slave.c | 7 ++ idf_component.yml | 18 ++--- libraries/BluetoothSerial/src/BTAddress.cpp | 4 +- libraries/BluetoothSerial/src/BTAddress.h | 4 +- .../BluetoothSerial/src/BTAdvertisedDevice.h | 6 +- .../src/BTAdvertisedDeviceSet.cpp | 4 +- libraries/BluetoothSerial/src/BTScan.h | 7 +- .../BluetoothSerial/src/BTScanResultsSet.cpp | 4 +- .../BluetoothSerial/src/BluetoothSerial.cpp | 3 +- .../BluetoothSerial/src/BluetoothSerial.h | 3 +- .../examples/SimpleBleDevice/ci.json | 1 + libraries/SimpleBLE/src/SimpleBLE.cpp | 3 +- libraries/SimpleBLE/src/SimpleBLE.h | 3 +- package/package_esp32_index.template.json | 68 +++++++++---------- 14 files changed, 80 insertions(+), 55 deletions(-) diff --git a/cores/esp32/esp32-hal-i2c-slave.c b/cores/esp32/esp32-hal-i2c-slave.c index 0e01259da61..1d92a55ae15 100644 --- a/cores/esp32/esp32-hal-i2c-slave.c +++ b/cores/esp32/esp32-hal-i2c-slave.c @@ -43,6 +43,7 @@ #include "soc/i2c_struct.h" #include "soc/periph_defs.h" #include "hal/i2c_ll.h" +#include "hal/i2c_types.h" #ifndef CONFIG_IDF_TARGET_ESP32C5 #include "hal/clk_gate_ll.h" #endif @@ -337,7 +338,13 @@ 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, 5, 0) + 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 + #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) i2c_ll_enable_fifo_mode(i2c->dev, true); #else diff --git a/idf_component.yml b/idf_component.yml index c1fc614cae5..f0e3f84b28d 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -57,12 +57,12 @@ dependencies: version: "==1.6.3" require: public rules: - - if: "target not in [esp32c2, esp32p4]" + - if: "target not in [esp32c2, esp32p4, esp32c5]" espressif/esp-zigbee-lib: version: "==1.6.3" require: public rules: - - if: "target not in [esp32c2, esp32p4]" + - if: "target not in [esp32c2, esp32p4, esp32c5]" espressif/esp-dsp: version: "^1.3.4" rules: @@ -73,32 +73,32 @@ dependencies: espressif/esp_rainmaker: version: "1.5.2" rules: - - if: "target not in [esp32c2, esp32p4]" + - if: "target not in [esp32c2, esp32p4, esp32c5]" espressif/rmaker_common: version: "1.4.6" rules: - - if: "target not in [esp32c2, esp32p4]" + - if: "target not in [esp32c2, esp32p4, esp32c5]" espressif/esp_insights: version: "1.2.2" rules: - - if: "target not in [esp32c2, esp32p4]" + - if: "target not in [esp32c2, esp32p4, esp32c5]" # New version breaks esp_insights 1.0.1 espressif/esp_diag_data_store: version: "1.0.2" rules: - - if: "target not in [esp32c2, esp32p4]" + - if: "target not in [esp32c2, esp32p4, esp32c5]" espressif/esp_diagnostics: version: "1.2.1" rules: - - if: "target not in [esp32c2, esp32p4]" + - if: "target not in [esp32c2, esp32p4, esp32c5]" espressif/cbor: version: "0.6.0~1" rules: - - if: "target not in [esp32c2, esp32p4]" + - if: "target not in [esp32c2, esp32p4, esp32c5]" espressif/qrcode: version: "0.1.0~2" rules: - - if: "target not in [esp32c2, esp32p4]" + - if: "target not in [esp32c2, esp32p4, esp32c5]" # RainMaker End espressif/esp-sr: version: "^1.4.2" diff --git a/libraries/BluetoothSerial/src/BTAddress.cpp b/libraries/BluetoothSerial/src/BTAddress.cpp index 6a6de6522bd..6dc05f3aafb 100644 --- a/libraries/BluetoothSerial/src/BTAddress.cpp +++ b/libraries/BluetoothSerial/src/BTAddress.cpp @@ -7,7 +7,9 @@ * Author: Thomas M. (ArcticSnowSky) */ #include "sdkconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) +#include "soc/soc_caps.h" + +#if SOC_BT_SUPPORTED && defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) #include "BTAddress.h" #include diff --git a/libraries/BluetoothSerial/src/BTAddress.h b/libraries/BluetoothSerial/src/BTAddress.h index a2af9247fb0..ece3ae83525 100644 --- a/libraries/BluetoothSerial/src/BTAddress.h +++ b/libraries/BluetoothSerial/src/BTAddress.h @@ -10,7 +10,9 @@ #ifndef COMPONENTS_CPP_UTILS_BTADDRESS_H_ #define COMPONENTS_CPP_UTILS_BTADDRESS_H_ #include "sdkconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) +#include "soc/soc_caps.h" + +#if SOC_BT_SUPPORTED && defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) #include // ESP32 BT #include diff --git a/libraries/BluetoothSerial/src/BTAdvertisedDevice.h b/libraries/BluetoothSerial/src/BTAdvertisedDevice.h index 63c19c908b6..53aa2629b56 100644 --- a/libraries/BluetoothSerial/src/BTAdvertisedDevice.h +++ b/libraries/BluetoothSerial/src/BTAdvertisedDevice.h @@ -5,9 +5,11 @@ * Author: Thomas M. (ArcticSnowSky) */ -#ifndef __BTADVERTISEDDEVICE_H__ -#define __BTADVERTISEDDEVICE_H__ +#pragma once +#include "sdkconfig.h" +#include "soc/soc_caps.h" +#if SOC_BT_SUPPORTED && defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) #include "BTAddress.h" #include diff --git a/libraries/BluetoothSerial/src/BTAdvertisedDeviceSet.cpp b/libraries/BluetoothSerial/src/BTAdvertisedDeviceSet.cpp index ed6076a3103..9afc28547e5 100644 --- a/libraries/BluetoothSerial/src/BTAdvertisedDeviceSet.cpp +++ b/libraries/BluetoothSerial/src/BTAdvertisedDeviceSet.cpp @@ -6,7 +6,9 @@ */ #include "sdkconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) +#include "soc/soc_caps.h" + +#if SOC_BT_SUPPORTED && defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) //#include diff --git a/libraries/BluetoothSerial/src/BTScan.h b/libraries/BluetoothSerial/src/BTScan.h index a08f68cd7c2..6fd2daf9f6d 100644 --- a/libraries/BluetoothSerial/src/BTScan.h +++ b/libraries/BluetoothSerial/src/BTScan.h @@ -5,8 +5,11 @@ * Author: Thomas M. (ArcticSnowSky) */ -#ifndef __BTSCAN_H__ -#define __BTSCAN_H__ +#pragma once +#include "sdkconfig.h" +#include "soc/soc_caps.h" + +#if SOC_BT_SUPPORTED && defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) #include #include diff --git a/libraries/BluetoothSerial/src/BTScanResultsSet.cpp b/libraries/BluetoothSerial/src/BTScanResultsSet.cpp index 3633c010eae..02459b081ba 100644 --- a/libraries/BluetoothSerial/src/BTScanResultsSet.cpp +++ b/libraries/BluetoothSerial/src/BTScanResultsSet.cpp @@ -6,7 +6,9 @@ */ #include "sdkconfig.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) +#include "soc/soc_caps.h" + +#if SOC_BT_SUPPORTED && defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) #include diff --git a/libraries/BluetoothSerial/src/BluetoothSerial.cpp b/libraries/BluetoothSerial/src/BluetoothSerial.cpp index 3d00504c1b1..b7eede93ee6 100644 --- a/libraries/BluetoothSerial/src/BluetoothSerial.cpp +++ b/libraries/BluetoothSerial/src/BluetoothSerial.cpp @@ -19,8 +19,9 @@ #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" +#include "soc/soc_caps.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) +#if SOC_BT_SUPPORTED && defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) #ifdef ARDUINO_ARCH_ESP32 #include "esp32-hal-log.h" diff --git a/libraries/BluetoothSerial/src/BluetoothSerial.h b/libraries/BluetoothSerial/src/BluetoothSerial.h index d59fbf1f714..8cb6edb876c 100644 --- a/libraries/BluetoothSerial/src/BluetoothSerial.h +++ b/libraries/BluetoothSerial/src/BluetoothSerial.h @@ -16,8 +16,9 @@ #define _BLUETOOTH_SERIAL_H_ #include "sdkconfig.h" +#include "soc/soc_caps.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) +#if SOC_BT_SUPPORTED && defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) #include "Arduino.h" #include "Stream.h" diff --git a/libraries/SimpleBLE/examples/SimpleBleDevice/ci.json b/libraries/SimpleBLE/examples/SimpleBleDevice/ci.json index d33a23f332e..3b6a150b31a 100644 --- a/libraries/SimpleBLE/examples/SimpleBleDevice/ci.json +++ b/libraries/SimpleBLE/examples/SimpleBleDevice/ci.json @@ -1,5 +1,6 @@ { "requires": [ + "CONFIG_SOC_BLE_SUPPORTED=y", "CONFIG_BT_ENABLED=y", "CONFIG_BLUEDROID_ENABLED=y" ] diff --git a/libraries/SimpleBLE/src/SimpleBLE.cpp b/libraries/SimpleBLE/src/SimpleBLE.cpp index 3c4ed915c05..3f1f2bbd1c1 100644 --- a/libraries/SimpleBLE/src/SimpleBLE.cpp +++ b/libraries/SimpleBLE/src/SimpleBLE.cpp @@ -13,8 +13,9 @@ // limitations under the License. #include "sdkconfig.h" +#include "soc/soc_caps.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) +#if SOC_BT_SUPPORTED && defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) #include "SimpleBLE.h" #include "esp32-hal-log.h" diff --git a/libraries/SimpleBLE/src/SimpleBLE.h b/libraries/SimpleBLE/src/SimpleBLE.h index 23c1cdb593f..df1ee751f10 100644 --- a/libraries/SimpleBLE/src/SimpleBLE.h +++ b/libraries/SimpleBLE/src/SimpleBLE.h @@ -16,8 +16,9 @@ #define _SIMPLE_BLE_H_ #include "sdkconfig.h" +#include "soc/soc_caps.h" -#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) +#if SOC_BT_SUPPORTED && defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) #include #include diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index a0d78ebc47e..63027704d8a 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-master-d930a386-v1" + "version": "idf-master-38628f98-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-master-d930a386-v1", + "version": "idf-master-38628f98-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", - "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", - "size": "422376381" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", + "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", + "size": "398323971" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", - "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", - "size": "422376381" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", + "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", + "size": "398323971" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", - "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", - "size": "422376381" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", + "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", + "size": "398323971" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", - "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", - "size": "422376381" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", + "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", + "size": "398323971" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", - "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", - "size": "422376381" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", + "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", + "size": "398323971" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", - "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", - "size": "422376381" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", + "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", + "size": "398323971" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", - "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", - "size": "422376381" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", + "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", + "size": "398323971" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-d930a386-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-d930a386-v1.zip", - "checksum": "SHA-256:0310daa4f08f807f2bf3babd2587c2694df64c70e367863eadf5020636b717ae", - "size": "422376381" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", + "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", + "size": "398323971" } ] }, From 158c7aec42a472604c108ce56a8a2b6361cb1cef Mon Sep 17 00:00:00 2001 From: "Limor \"Ladyada\" Fried" Date: Wed, 7 May 2025 04:03:54 -0400 Subject: [PATCH 123/290] Add new board: Sparkle Motion Stick (#11330) * add new version of sparklemotion * updated change as requested * fix * fix clang complaints --- boards.txt | 134 ++++++++++++++++++ .../pins_arduino.h | 40 ++++++ 2 files changed, 174 insertions(+) create mode 100644 variants/adafruit_sparklemotionstick_esp32/pins_arduino.h diff --git a/boards.txt b/boards.txt index 7113bf4c248..9158327f5f2 100644 --- a/boards.txt +++ b/boards.txt @@ -17353,6 +17353,140 @@ 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 -lzboss_stack.zczr -lzboss_port.remote +############################################################## +# Adafruit Sparkle Motion Stick w/ESP32 + +sparklemotionstick.name=Adafruit Sparkle Motion Stick (ESP32) + +sparklemotionstick.bootloader.tool=esptool_py +sparklemotionstick.bootloader.tool.default=esptool_py + +sparklemotionstick.upload.tool=esptool_py +sparklemotionstick.upload.tool.default=esptool_py +sparklemotionstick.upload.tool.network=esp_ota + +sparklemotionstick.upload.maximum_size=1310720 +sparklemotionstick.upload.maximum_data_size=327680 +sparklemotionstick.upload.flags= +sparklemotionstick.upload.extra_flags= + +sparklemotionstick.serial.disableDTR=true +sparklemotionstick.serial.disableRTS=true + +sparklemotionstick.build.tarch=xtensa +sparklemotionstick.build.bootloader_addr=0x1000 +sparklemotionstick.build.target=esp32 +sparklemotionstick.build.mcu=esp32 +sparklemotionstick.build.core=esp32 +sparklemotionstick.build.variant=adafruit_sparklemotionstick_esp32 +sparklemotionstick.build.board=SPARKLEMOTIONSTICK_ESP32 + +sparklemotionstick.build.f_cpu=240000000L +sparklemotionstick.build.flash_size=4MB +sparklemotionstick.build.flash_freq=80m +sparklemotionstick.build.flash_mode=dio +sparklemotionstick.build.boot=dio +sparklemotionstick.build.partitions=default +sparklemotionstick.build.defines= +sparklemotionstick.build.loop_core= +sparklemotionstick.build.event_core= + +sparklemotionstick.menu.LoopCore.1=Core 1 +sparklemotionstick.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +sparklemotionstick.menu.LoopCore.0=Core 0 +sparklemotionstick.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +sparklemotionstick.menu.EventsCore.1=Core 1 +sparklemotionstick.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +sparklemotionstick.menu.EventsCore.0=Core 0 +sparklemotionstick.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +sparklemotionstick.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +sparklemotionstick.menu.PartitionScheme.default.build.partitions=default +sparklemotionstick.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +sparklemotionstick.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +sparklemotionstick.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +sparklemotionstick.menu.PartitionScheme.minimal.build.partitions=minimal +sparklemotionstick.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +sparklemotionstick.menu.PartitionScheme.no_ota.build.partitions=no_ota +sparklemotionstick.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +sparklemotionstick.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +sparklemotionstick.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +sparklemotionstick.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +sparklemotionstick.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +sparklemotionstick.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +sparklemotionstick.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +sparklemotionstick.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +sparklemotionstick.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +sparklemotionstick.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +sparklemotionstick.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +sparklemotionstick.menu.PartitionScheme.huge_app.build.partitions=huge_app +sparklemotionstick.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +sparklemotionstick.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +sparklemotionstick.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +sparklemotionstick.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 + +sparklemotionstick.menu.CPUFreq.240=240MHz (WiFi/BT) +sparklemotionstick.menu.CPUFreq.240.build.f_cpu=240000000L +sparklemotionstick.menu.CPUFreq.160=160MHz (WiFi/BT) +sparklemotionstick.menu.CPUFreq.160.build.f_cpu=160000000L +sparklemotionstick.menu.CPUFreq.80=80MHz (WiFi/BT) +sparklemotionstick.menu.CPUFreq.80.build.f_cpu=80000000L +sparklemotionstick.menu.CPUFreq.40=40MHz +sparklemotionstick.menu.CPUFreq.40.build.f_cpu=40000000L +sparklemotionstick.menu.CPUFreq.20=20MHz +sparklemotionstick.menu.CPUFreq.20.build.f_cpu=20000000L +sparklemotionstick.menu.CPUFreq.10=10MHz +sparklemotionstick.menu.CPUFreq.10.build.f_cpu=10000000L + +sparklemotionstick.menu.FlashFreq.80=80MHz +sparklemotionstick.menu.FlashFreq.80.build.flash_freq=80m +sparklemotionstick.menu.FlashFreq.40=40MHz +sparklemotionstick.menu.FlashFreq.40.build.flash_freq=40m + +sparklemotionstick.menu.FlashSize.4M=4MB (32Mb) +sparklemotionstick.menu.FlashSize.4M.build.flash_size=4MB + +sparklemotionstick.menu.UploadSpeed.921600=921600 +sparklemotionstick.menu.UploadSpeed.921600.upload.speed=921600 +sparklemotionstick.menu.UploadSpeed.115200=115200 +sparklemotionstick.menu.UploadSpeed.115200.upload.speed=115200 +sparklemotionstick.menu.UploadSpeed.256000.windows=256000 +sparklemotionstick.menu.UploadSpeed.256000.upload.speed=256000 +sparklemotionstick.menu.UploadSpeed.230400.windows.upload.speed=256000 +sparklemotionstick.menu.UploadSpeed.230400=230400 +sparklemotionstick.menu.UploadSpeed.230400.upload.speed=230400 +sparklemotionstick.menu.UploadSpeed.460800.linux=460800 +sparklemotionstick.menu.UploadSpeed.460800.macosx=460800 +sparklemotionstick.menu.UploadSpeed.460800.upload.speed=460800 +sparklemotionstick.menu.UploadSpeed.512000.windows=512000 +sparklemotionstick.menu.UploadSpeed.512000.upload.speed=512000 + +sparklemotionstick.menu.DebugLevel.none=None +sparklemotionstick.menu.DebugLevel.none.build.code_debug=0 +sparklemotionstick.menu.DebugLevel.error=Error +sparklemotionstick.menu.DebugLevel.error.build.code_debug=1 +sparklemotionstick.menu.DebugLevel.warn=Warn +sparklemotionstick.menu.DebugLevel.warn.build.code_debug=2 +sparklemotionstick.menu.DebugLevel.info=Info +sparklemotionstick.menu.DebugLevel.info.build.code_debug=3 +sparklemotionstick.menu.DebugLevel.debug=Debug +sparklemotionstick.menu.DebugLevel.debug.build.code_debug=4 +sparklemotionstick.menu.DebugLevel.verbose=Verbose +sparklemotionstick.menu.DebugLevel.verbose.build.code_debug=5 + +sparklemotionstick.menu.EraseFlash.none=Disabled +sparklemotionstick.menu.EraseFlash.none.upload.erase_cmd= +sparklemotionstick.menu.EraseFlash.all=Enabled +sparklemotionstick.menu.EraseFlash.all.upload.erase_cmd=-e + +sparklemotionstick.menu.ZigbeeMode.default=Disabled +sparklemotionstick.menu.ZigbeeMode.default.build.zigbee_mode= +sparklemotionstick.menu.ZigbeeMode.default.build.zigbee_libs= +sparklemotionstick.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) +sparklemotionstick.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +sparklemotionstick.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote + ############################################################## nodemcu-32s.name=NodeMCU-32S diff --git a/variants/adafruit_sparklemotionstick_esp32/pins_arduino.h b/variants/adafruit_sparklemotionstick_esp32/pins_arduino.h new file mode 100644 index 00000000000..e0d94821736 --- /dev/null +++ b/variants/adafruit_sparklemotionstick_esp32/pins_arduino.h @@ -0,0 +1,40 @@ +#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 = 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; // not broken out, defined to fix compilation +static const uint8_t RX = 26; // not broken out, defined to fix compilation + +#define TX1 TX +#define RX1 RX + +static const uint8_t SDA = 13; // not broken out, defined to fix compilation +static const uint8_t SCL = 15; // not broken out, defined to fix compilation + +static const uint8_t SS = 19; // not broken out, defined to fix compilation +static const uint8_t MOSI = 21; // output to drive dotstars +static const uint8_t SCK = 22; // output to drive dotstars +static const uint8_t MISO = 23; // not broken out, defined to fix compilation + +static const uint8_t A0 = 2; // not broken out, defined to fix compilation + +// internal switch +static const uint8_t BUTTON = 0; + +static const uint8_t DAC1 = 25; // not broken out, defined to fix compilation +static const uint8_t DAC2 = 26; // not broken out, defined to fix compilation + +#endif /* Pins_Arduino_h */ From 15e71a6afd21f9723a0777fa2f38d4c647279933 Mon Sep 17 00:00:00 2001 From: Stian Coward <81033623+h-2-0@users.noreply.github.com> Date: Wed, 7 May 2025 10:50:32 +0200 Subject: [PATCH 124/290] fix(esp32): Add missing vflip status in esp32-cam example (#11335) Toggle switch for V-Flip will now indicate correct status in frontend when loading the webpage --- libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp b/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp index 81d643e37ac..cc924bd5b3b 100644 --- a/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp +++ b/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp @@ -478,6 +478,7 @@ static esp_err_t status_handler(httpd_req_t *req) { p += sprintf(p, "\"raw_gma\":%u,", s->status.raw_gma); p += sprintf(p, "\"lenc\":%u,", s->status.lenc); p += sprintf(p, "\"hmirror\":%u,", s->status.hmirror); + p += sprintf(p, "\"vflip\":%u,", s->status.vflip); p += sprintf(p, "\"dcw\":%u,", s->status.dcw); p += sprintf(p, "\"colorbar\":%u", s->status.colorbar); #if CONFIG_LED_ILLUMINATOR_ENABLED From 602f1f6e7fbc56e36068c9521272d64d40e4df30 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Wed, 7 May 2025 16:24:33 +0300 Subject: [PATCH 125/290] IDF master (#11342) * fix(ci): ESP32-P4 hosted compile fail (#11341) * fix(ci): Update changes for P4 and C5 builds with latest IDF * IDF master aaebc374 * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Jason2866 <24528715+Jason2866@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- CMakeLists.txt | 2 +- cores/esp32/chip-debug-report.cpp | 7 +- idf_component.yml | 2 +- libraries/WiFi/src/WiFiGeneric.cpp | 12 +- package/package_esp32_index.template.json | 128 +++++++++++----------- 5 files changed, 81 insertions(+), 70 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ba9c999d81..9e981130715 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -362,7 +362,7 @@ set(priv_requires fatfs nvs_flash app_update spiffs bootloader_support bt esp_hi if(NOT CONFIG_ARDUINO_SELECTIVE_COMPILATION OR CONFIG_ARDUINO_SELECTIVE_OpenThread) #if(CONFIG_SOC_IEEE802154_SUPPORTED) # Does not work! #if(CONFIG_OPENTHREAD_ENABLED) # Does not work! - if(IDF_TARGET STREQUAL "esp32c6" OR IDF_TARGET STREQUAL "esp32h2") # Sadly only this works + if(IDF_TARGET STREQUAL "esp32c6" OR IDF_TARGET STREQUAL "esp32h2" OR IDF_TARGET STREQUAL "esp32c5") # Sadly only this works list(APPEND requires openthread) endif() endif() diff --git a/cores/esp32/chip-debug-report.cpp b/cores/esp32/chip-debug-report.cpp index 281c7bdb62d..8592031ee3f 100644 --- a/cores/esp32/chip-debug-report.cpp +++ b/cores/esp32/chip-debug-report.cpp @@ -68,7 +68,8 @@ static void printPkgVersion(void) { uint32_t pkg_ver = REG_GET_FIELD(EFUSE_RD_MAC_SYS_2_REG, EFUSE_PKG_VERSION); chip_report_printf("%lu", pkg_ver); #elif CONFIG_IDF_TARGET_ESP32C5 - uint32_t pkg_ver = REG_GET_FIELD(EFUSE_RD_MAC_SYS2_REG, EFUSE_PKG_VERSION); + // ToDo: Update this line when EFUSE_PKG_VERSION is available again for ESP32-C5 + uint32_t pkg_ver = 0; //REG_GET_FIELD(EFUSE_RD_MAC_SYS2_REG, EFUSE_PKG_VERSION); chip_report_printf("%lu", pkg_ver); #else chip_report_printf("Unknown"); @@ -92,11 +93,11 @@ static void printChipInfo(void) { case CHIP_ESP32H2: chip_report_printf("ESP32-H2\n"); break; case CHIP_ESP32P4: chip_report_printf("ESP32-P4\n"); break; #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) - case CHIP_ESP32C5: chip_report_printf("ESP32-C5\n"); break; + case CHIP_ESP32C5: chip_report_printf("ESP32-C5\n"); break; case CHIP_ESP32C61: chip_report_printf("ESP32-C61\n"); break; case CHIP_ESP32H21: chip_report_printf("ESP32-H21\n"); break; #endif - default: chip_report_printf("Unknown %d\n", info.model); break; + default: chip_report_printf("Unknown %d\n", info.model); break; } printPkgVersion(); chip_report_printf(" Revision : %.2f\n", (float)(info.revision) / 100.0); diff --git a/idf_component.yml b/idf_component.yml index f0e3f84b28d..642bc54143d 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -105,7 +105,7 @@ dependencies: rules: - if: "target in [esp32s3]" espressif/esp_hosted: - version: "^0.0.25" + version: "^2.0.0" rules: - if: "target == esp32p4" espressif/esp_wifi_remote: diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index e669ba81c12..6ae451d1cb7 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -252,13 +252,23 @@ static bool wifiHostedInit() { if (!hosted_initialized) { hosted_initialized = true; struct esp_hosted_sdio_config conf = INIT_DEFAULT_HOST_SDIO_CONFIG(); +#ifdef BOARD_HAS_SDIO_ESP_HOSTED + conf.pin_clk.pin = BOARD_SDIO_ESP_HOSTED_CLK; + conf.pin_cmd.pin = BOARD_SDIO_ESP_HOSTED_CMD; + conf.pin_d0.pin = BOARD_SDIO_ESP_HOSTED_D0; + conf.pin_d1.pin = BOARD_SDIO_ESP_HOSTED_D1; + conf.pin_d2.pin = BOARD_SDIO_ESP_HOSTED_D2; + conf.pin_d3.pin = BOARD_SDIO_ESP_HOSTED_D3; + conf.pin_reset.pin = BOARD_SDIO_ESP_HOSTED_RESET; +#else conf.pin_clk.pin = CONFIG_ESP_SDIO_PIN_CLK; conf.pin_cmd.pin = CONFIG_ESP_SDIO_PIN_CMD; conf.pin_d0.pin = CONFIG_ESP_SDIO_PIN_D0; conf.pin_d1.pin = CONFIG_ESP_SDIO_PIN_D1; conf.pin_d2.pin = CONFIG_ESP_SDIO_PIN_D2; conf.pin_d3.pin = CONFIG_ESP_SDIO_PIN_D3; - //conf.pin_rst.pin = CONFIG_ESP_SDIO_GPIO_RESET_SLAVE; + conf.pin_reset.pin = CONFIG_ESP_SDIO_GPIO_RESET_SLAVE; +#endif // esp_hosted_sdio_set_config() will fail on second attempt but here temporarily to not cause exception on reinit if (esp_hosted_sdio_set_config(&conf) != ESP_OK || esp_hosted_init() != ESP_OK) { log_e("esp_hosted_init failed!"); diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 63027704d8a..aa21a192509 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-master-38628f98-v1" + "version": "idf-master-aaebc374-v1" }, { "packager": "esp32", @@ -76,7 +76,7 @@ { "packager": "esp32", "name": "openocd-esp32", - "version": "v0.12.0-esp32-20250226" + "version": "v0.12.0-esp32-20250422" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-master-38628f98-v1", + "version": "idf-master-aaebc374-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", - "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", - "size": "398323971" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", + "size": "404569749" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", - "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", - "size": "398323971" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", + "size": "404569749" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", - "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", - "size": "398323971" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", + "size": "404569749" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", - "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", - "size": "398323971" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", + "size": "404569749" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", - "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", - "size": "398323971" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", + "size": "404569749" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", - "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", - "size": "398323971" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", + "size": "404569749" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", - "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", - "size": "398323971" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", + "size": "404569749" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-38628f98-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-38628f98-v1.zip", - "checksum": "SHA-256:efc30a38cccff38c36a86fd3db78aeb13594da60ccf49bc7971b7a9f849abcdf", - "size": "398323971" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", + "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", + "size": "404569749" } ] }, @@ -414,56 +414,56 @@ }, { "name": "openocd-esp32", - "version": "v0.12.0-esp32-20250226", + "version": "v0.12.0-esp32-20250422", "systems": [ { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-linux-amd64-0.12.0-esp32-20250226.tar.gz", - "archiveFileName": "openocd-esp32-linux-amd64-0.12.0-esp32-20250226.tar.gz", - "checksum": "SHA-256:914c726342ba5828e53f41aa454f01f317c42d8e6772d3d874593a6960fc4729", - "size": "2414924" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-linux-amd64-0.12.0-esp32-20250422.tar.gz", + "archiveFileName": "openocd-esp32-linux-amd64-0.12.0-esp32-20250422.tar.gz", + "checksum": "SHA-256:eb1fa9b21c65b45a2200af6dcc2914e32335d37b6dbbd181778dcc0dc025e70a", + "size": "2445546" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-linux-arm64-0.12.0-esp32-20250226.tar.gz", - "archiveFileName": "openocd-esp32-linux-arm64-0.12.0-esp32-20250226.tar.gz", - "checksum": "SHA-256:c44ee99a9209c0234dbbcec86339fd685f5c61a763b29c33eba590bf62db2296", - "size": "2293923" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-linux-arm64-0.12.0-esp32-20250422.tar.gz", + "archiveFileName": "openocd-esp32-linux-arm64-0.12.0-esp32-20250422.tar.gz", + "checksum": "SHA-256:f70334a9b12a75b4d943e09fa5db30973037c39dbb54d6fa9f1a7118228b3d1c", + "size": "2330926" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-linux-armel-0.12.0-esp32-20250226.tar.gz", - "archiveFileName": "openocd-esp32-linux-armel-0.12.0-esp32-20250226.tar.gz", - "checksum": "SHA-256:21ab6af3cf05f9290f4d59f1f381d5094dd2755fc528d3d2feb9334348fc0d8d", - "size": "2436071" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-linux-armel-0.12.0-esp32-20250422.tar.gz", + "archiveFileName": "openocd-esp32-linux-armel-0.12.0-esp32-20250422.tar.gz", + "checksum": "SHA-256:4ac34d6fd1af86aeda87c8318732f8d691c300c285c7fd2f5037c432c63fbbb3", + "size": "2470732" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-macos-0.12.0-esp32-20250226.tar.gz", - "archiveFileName": "openocd-esp32-macos-0.12.0-esp32-20250226.tar.gz", - "checksum": "SHA-256:0b5751699e93b6d101381611c96216ddff8c7dfd16425c610993fa27993f9a0a", - "size": "2525387" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-macos-0.12.0-esp32-20250422.tar.gz", + "archiveFileName": "openocd-esp32-macos-0.12.0-esp32-20250422.tar.gz", + "checksum": "SHA-256:9186a7a06304c6d9201cbce4ee3c7099b393bf8d329cda17a68874f92308f6ce", + "size": "2548730" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-macos-arm64-0.12.0-esp32-20250226.tar.gz", - "archiveFileName": "openocd-esp32-macos-arm64-0.12.0-esp32-20250226.tar.gz", - "checksum": "SHA-256:8bffbbb594b27a4971a3922792135f8c836fff26991f7f450094386920263531", - "size": "2568843" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-macos-arm64-0.12.0-esp32-20250422.tar.gz", + "archiveFileName": "openocd-esp32-macos-arm64-0.12.0-esp32-20250422.tar.gz", + "checksum": "SHA-256:2cc39318d52f393233ff1f777871aebe5b97b3fbad29556a238489263401b774", + "size": "2593819" }, { "host": "i686-mingw32", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-win32-0.12.0-esp32-20250226.zip", - "archiveFileName": "openocd-esp32-win32-0.12.0-esp32-20250226.zip", - "checksum": "SHA-256:aaf3c955bb4eb47805a1ba108dfd07a8a56ce720cb40194a354362b5f0961230", - "size": "2960226" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-win32-0.12.0-esp32-20250422.zip", + "archiveFileName": "openocd-esp32-win32-0.12.0-esp32-20250422.zip", + "checksum": "SHA-256:ecb4f8533fa9098d10000f5f7e8b8eaa8591015b824b481078ddb2b37e7aa6f2", + "size": "2988859" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250226/openocd-esp32-win64-0.12.0-esp32-20250226.zip", - "archiveFileName": "openocd-esp32-win64-0.12.0-esp32-20250226.zip", - "checksum": "SHA-256:79baf35325117a53093b62f6b9bee677dd12275d7066e3f8a274d2a80e986b6e", - "size": "2960225" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-win64-0.12.0-esp32-20250422.zip", + "archiveFileName": "openocd-esp32-win64-0.12.0-esp32-20250422.zip", + "checksum": "SHA-256:e9eae8e1a8d0e030cd81dcb08394a9137cb7338a6211dfabcdbdfb37b58c5a23", + "size": "2988858" } ] }, From 210edfeaa6cfa64d1a7bd51abd5c6e1ac30692a8 Mon Sep 17 00:00:00 2001 From: Unexpected Maker Date: Tue, 13 May 2025 19:46:15 +1000 Subject: [PATCH 126/290] Added new Unexpected Maker SQUiXL and EDGES3[D] boards. (#11350) * Added new Unexpected Maker SQUiXL and EDGES3[D] boards. Signed-off-by: Seon Rozenblum * Seems we are being picky about board names now ;) Signed-off-by: Seon Rozenblum * Seems I have to have SPI pins defined for SQUiXL, or compiling breaks Signed-off-by: Seon Rozenblum --------- Signed-off-by: Seon Rozenblum Signed-off-by: Seon Rozenblum --- boards.txt | 306 ++++++++++++++++++++++++++++ variants/um_edges3_d/pins_arduino.h | 46 +++++ variants/um_squixl/pins_arduino.h | 23 +++ 3 files changed, 375 insertions(+) create mode 100644 variants/um_edges3_d/pins_arduino.h create mode 100644 variants/um_squixl/pins_arduino.h diff --git a/boards.txt b/boards.txt index 9158327f5f2..1f48e0308ef 100644 --- a/boards.txt +++ b/boards.txt @@ -3643,6 +3643,155 @@ um_bling.menu.EraseFlash.all.upload.erase_cmd=-e ############################################################## +um_edges3_d.name=UM EdgeS3[D] +um_edges3_d.vid.0=0x303a +um_edges3_d.pid.0=0x82DC +um_edges3_d.upload_port.0.vid=0x303a +um_edges3_d.upload_port.0.pid=0x82DC + +um_edges3_d.bootloader.tool=esptool_py +um_edges3_d.bootloader.tool.default=esptool_py + +um_edges3_d.upload.tool=esptool_py +um_edges3_d.upload.tool.default=esptool_py +um_edges3_d.upload.tool.network=esp_ota + +um_edges3_d.upload.maximum_size=1310720 +um_edges3_d.upload.maximum_data_size=327680 +um_edges3_d.upload.flags= +um_edges3_d.upload.extra_flags= +um_edges3_d.upload.use_1200bps_touch=false +um_edges3_d.upload.wait_for_upload_port=false + +um_edges3_d.serial.disableDTR=false +um_edges3_d.serial.disableRTS=false + +um_edges3_d.build.tarch=xtensa +um_edges3_d.build.bootloader_addr=0x0 +um_edges3_d.build.target=esp32s3 +um_edges3_d.build.mcu=esp32s3 +um_edges3_d.build.core=esp32 +um_edges3_d.build.variant=um_edges3_d +um_edges3_d.build.board=EDGES3D + +um_edges3_d.build.usb_mode=1 +um_edges3_d.build.cdc_on_boot=1 +um_edges3_d.build.msc_on_boot=0 +um_edges3_d.build.dfu_on_boot=0 +um_edges3_d.build.f_cpu=240000000L +um_edges3_d.build.flash_size=8MB +um_edges3_d.build.flash_freq=80m +um_edges3_d.build.flash_mode=dio +um_edges3_d.build.boot=qio +um_edges3_d.build.partitions=default +um_edges3_d.build.defines= +um_edges3_d.build.loop_core= +um_edges3_d.build.event_core= +um_edges3_d.build.flash_type=qio +um_edges3_d.build.psram_type=qspi +um_edges3_d.build.memory_type=qio_qspi + +um_edges3_d.menu.LoopCore.1=Core 1 +um_edges3_d.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +um_edges3_d.menu.LoopCore.0=Core 0 +um_edges3_d.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +um_edges3_d.menu.EventsCore.1=Core 1 +um_edges3_d.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +um_edges3_d.menu.EventsCore.0=Core 0 +um_edges3_d.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +um_edges3_d.menu.USBMode.hwcdc=Hardware CDC and JTAG +um_edges3_d.menu.USBMode.hwcdc.build.usb_mode=1 +um_edges3_d.menu.USBMode.default=USB-OTG (TinyUSB) +um_edges3_d.menu.USBMode.default.build.usb_mode=0 + +um_edges3_d.menu.CDCOnBoot.cdc=Enabled +um_edges3_d.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 +um_edges3_d.menu.CDCOnBoot.default=Disabled +um_edges3_d.menu.CDCOnBoot.default.build.cdc_on_boot=0 + +um_edges3_d.menu.MSCOnBoot.default=Disabled +um_edges3_d.menu.MSCOnBoot.default.build.msc_on_boot=0 +um_edges3_d.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +um_edges3_d.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +um_edges3_d.menu.DFUOnBoot.default=Disabled +um_edges3_d.menu.DFUOnBoot.default.build.dfu_on_boot=0 +um_edges3_d.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +um_edges3_d.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +um_edges3_d.menu.UploadMode.cdc.upload.wait_for_upload_port=true +um_edges3_d.menu.UploadMode.default=UART0 / Hardware CDC +um_edges3_d.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +um_edges3_d.menu.UploadMode.cdc.upload.use_1200bps_touch=true +um_edges3_d.menu.UploadMode.default.upload.use_1200bps_touch=false +um_edges3_d.menu.UploadMode.default.upload.wait_for_upload_port=false + +um_edges3_d.menu.PSRAM.enabled=Enabled +um_edges3_d.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM +um_edges3_d.menu.PSRAM.disabled=Disabled +um_edges3_d.menu.PSRAM.disabled.build.defines= + +um_edges3_d.menu.PartitionScheme.default_8MB=Default (3MB APP/1.5MB SPIFFS) +um_edges3_d.menu.PartitionScheme.default_8MB.build.partitions=default_8MB +um_edges3_d.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 + +um_edges3_d.menu.CPUFreq.240=240MHz (WiFi) +um_edges3_d.menu.CPUFreq.240.build.f_cpu=240000000L +um_edges3_d.menu.CPUFreq.160=160MHz (WiFi) +um_edges3_d.menu.CPUFreq.160.build.f_cpu=160000000L +um_edges3_d.menu.CPUFreq.80=80MHz (WiFi) +um_edges3_d.menu.CPUFreq.80.build.f_cpu=80000000L +um_edges3_d.menu.CPUFreq.40=40MHz +um_edges3_d.menu.CPUFreq.40.build.f_cpu=40000000L +um_edges3_d.menu.CPUFreq.20=20MHz +um_edges3_d.menu.CPUFreq.20.build.f_cpu=20000000L +um_edges3_d.menu.CPUFreq.10=10MHz +um_edges3_d.menu.CPUFreq.10.build.f_cpu=10000000L + +um_edges3_d.menu.FlashMode.qio=QIO +um_edges3_d.menu.FlashMode.qio.build.flash_mode=dio +um_edges3_d.menu.FlashMode.qio.build.boot=qio +um_edges3_d.menu.FlashMode.dio=DIO +um_edges3_d.menu.FlashMode.dio.build.flash_mode=dio +um_edges3_d.menu.FlashMode.dio.build.boot=dio + +um_edges3_d.menu.UploadSpeed.921600=921600 +um_edges3_d.menu.UploadSpeed.921600.upload.speed=921600 +um_edges3_d.menu.UploadSpeed.115200=115200 +um_edges3_d.menu.UploadSpeed.115200.upload.speed=115200 +um_edges3_d.menu.UploadSpeed.256000.windows=256000 +um_edges3_d.menu.UploadSpeed.256000.upload.speed=256000 +um_edges3_d.menu.UploadSpeed.230400.windows.upload.speed=256000 +um_edges3_d.menu.UploadSpeed.230400=230400 +um_edges3_d.menu.UploadSpeed.230400.upload.speed=230400 +um_edges3_d.menu.UploadSpeed.460800.linux=460800 +um_edges3_d.menu.UploadSpeed.460800.macosx=460800 +um_edges3_d.menu.UploadSpeed.460800.upload.speed=460800 +um_edges3_d.menu.UploadSpeed.512000.windows=512000 +um_edges3_d.menu.UploadSpeed.512000.upload.speed=512000 + +um_edges3_d.menu.DebugLevel.none=None +um_edges3_d.menu.DebugLevel.none.build.code_debug=0 +um_edges3_d.menu.DebugLevel.error=Error +um_edges3_d.menu.DebugLevel.error.build.code_debug=1 +um_edges3_d.menu.DebugLevel.warn=Warn +um_edges3_d.menu.DebugLevel.warn.build.code_debug=2 +um_edges3_d.menu.DebugLevel.info=Info +um_edges3_d.menu.DebugLevel.info.build.code_debug=3 +um_edges3_d.menu.DebugLevel.debug=Debug +um_edges3_d.menu.DebugLevel.debug.build.code_debug=4 +um_edges3_d.menu.DebugLevel.verbose=Verbose +um_edges3_d.menu.DebugLevel.verbose.build.code_debug=5 + +um_edges3_d.menu.EraseFlash.none=Disabled +um_edges3_d.menu.EraseFlash.none.upload.erase_cmd= +um_edges3_d.menu.EraseFlash.all=Enabled +um_edges3_d.menu.EraseFlash.all.upload.erase_cmd=-e + +############################################################## + um_feathers2.name=UM FeatherS2 um_feathers2.vid.0=0x239A um_feathers2.pid.0=0x80AB @@ -4735,6 +4884,163 @@ um_pros3.menu.EraseFlash.all.upload.erase_cmd=-e ############################################################## +um_squixl.name=UM SQUIXL +um_squixl.vid.0=0x303a +um_squixl.pid.0=0x82DF +um_squixl.upload_port.0.vid=0x303a +um_squixl.upload_port.0.pid=0x82DF + +um_squixl.bootloader.tool=esptool_py +um_squixl.bootloader.tool.default=esptool_py + +um_squixl.upload.tool=esptool_py +um_squixl.upload.tool.default=esptool_py +um_squixl.upload.tool.network=esp_ota + +um_squixl.upload.maximum_size=1310720 +um_squixl.upload.maximum_data_size=327680 +um_squixl.upload.flags= +um_squixl.upload.extra_flags= +um_squixl.upload.use_1200bps_touch=false +um_squixl.upload.wait_for_upload_port=false + +um_squixl.serial.disableDTR=false +um_squixl.serial.disableRTS=false + +um_squixl.build.tarch=xtensa +um_squixl.build.bootloader_addr=0x0 +um_squixl.build.target=esp32s3 +um_squixl.build.mcu=esp32s3 +um_squixl.build.core=esp32 +um_squixl.build.variant=um_squixl +um_squixl.build.board=SQUIXL + +um_squixl.build.usb_mode=1 +um_squixl.build.cdc_on_boot=1 +um_squixl.build.msc_on_boot=0 +um_squixl.build.dfu_on_boot=0 +um_squixl.build.f_cpu=240000000L +um_squixl.build.flash_size=16MB +um_squixl.build.flash_freq=80m +um_squixl.build.flash_mode=dio +um_squixl.build.boot=qio +um_squixl.build.partitions=default +um_squixl.build.defines= +um_squixl.build.loop_core= +um_squixl.build.event_core= +um_squixl.build.flash_type=qio +um_squixl.build.psram_type=opi +um_squixl.build.memory_type=qio_opi + +um_squixl.menu.LoopCore.1=Core 1 +um_squixl.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +um_squixl.menu.LoopCore.0=Core 0 +um_squixl.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +um_squixl.menu.EventsCore.1=Core 1 +um_squixl.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +um_squixl.menu.EventsCore.0=Core 0 +um_squixl.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +um_squixl.menu.USBMode.hwcdc=Hardware CDC and JTAG +um_squixl.menu.USBMode.hwcdc.build.usb_mode=1 +um_squixl.menu.USBMode.default=USB-OTG (TinyUSB) +um_squixl.menu.USBMode.default.build.usb_mode=0 + +um_squixl.menu.CDCOnBoot.cdc=Enabled +um_squixl.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 +um_squixl.menu.CDCOnBoot.default=Disabled +um_squixl.menu.CDCOnBoot.default.build.cdc_on_boot=0 + +um_squixl.menu.MSCOnBoot.default=Disabled +um_squixl.menu.MSCOnBoot.default.build.msc_on_boot=0 +um_squixl.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +um_squixl.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +um_squixl.menu.DFUOnBoot.default=Disabled +um_squixl.menu.DFUOnBoot.default.build.dfu_on_boot=0 +um_squixl.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +um_squixl.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +um_squixl.menu.UploadMode.cdc.upload.wait_for_upload_port=true +um_squixl.menu.UploadMode.default=UART0 / Hardware CDC +um_squixl.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +um_squixl.menu.UploadMode.cdc.upload.use_1200bps_touch=true +um_squixl.menu.UploadMode.default.upload.use_1200bps_touch=false +um_squixl.menu.UploadMode.default.upload.wait_for_upload_port=false + +um_squixl.menu.PSRAM.opi=OPI PSRAM +um_squixl.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM +um_squixl.menu.PSRAM.opi.build.psram_type=opi + +um_squixl.menu.PartitionScheme.default_16MB=Default (6.25MB APP/3.43MB SPIFFS) +um_squixl.menu.PartitionScheme.default_16MB.build.partitions=default_16MB +um_squixl.menu.PartitionScheme.default_16MB.upload.maximum_size=6553600 +um_squixl.menu.PartitionScheme.large_spiffs=Large SPIFFS (4.5MB APP/6.93MB SPIFFS) +um_squixl.menu.PartitionScheme.large_spiffs.build.partitions=large_spiffs_16MB +um_squixl.menu.PartitionScheme.large_spiffs.upload.maximum_size=4718592 +um_squixl.menu.PartitionScheme.app3M_fat9M_16MB=FFAT (3MB APP/9MB FATFS) +um_squixl.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB +um_squixl.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 +um_squixl.menu.PartitionScheme.fatflash=Large FFAT (2MB APP/12.5MB FATFS) +um_squixl.menu.PartitionScheme.fatflash.build.partitions=ffat +um_squixl.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 + +um_squixl.menu.CPUFreq.240=240MHz (WiFi) +um_squixl.menu.CPUFreq.240.build.f_cpu=240000000L +um_squixl.menu.CPUFreq.160=160MHz (WiFi) +um_squixl.menu.CPUFreq.160.build.f_cpu=160000000L +um_squixl.menu.CPUFreq.80=80MHz (WiFi) +um_squixl.menu.CPUFreq.80.build.f_cpu=80000000L +um_squixl.menu.CPUFreq.40=40MHz +um_squixl.menu.CPUFreq.40.build.f_cpu=40000000L +um_squixl.menu.CPUFreq.20=20MHz +um_squixl.menu.CPUFreq.20.build.f_cpu=20000000L +um_squixl.menu.CPUFreq.10=10MHz +um_squixl.menu.CPUFreq.10.build.f_cpu=10000000L + +um_squixl.menu.FlashMode.qio=QIO +um_squixl.menu.FlashMode.qio.build.flash_mode=dio +um_squixl.menu.FlashMode.qio.build.boot=qio +um_squixl.menu.FlashMode.dio=DIO +um_squixl.menu.FlashMode.dio.build.flash_mode=dio +um_squixl.menu.FlashMode.dio.build.boot=dio + +um_squixl.menu.UploadSpeed.921600=921600 +um_squixl.menu.UploadSpeed.921600.upload.speed=921600 +um_squixl.menu.UploadSpeed.115200=115200 +um_squixl.menu.UploadSpeed.115200.upload.speed=115200 +um_squixl.menu.UploadSpeed.256000.windows=256000 +um_squixl.menu.UploadSpeed.256000.upload.speed=256000 +um_squixl.menu.UploadSpeed.230400.windows.upload.speed=256000 +um_squixl.menu.UploadSpeed.230400=230400 +um_squixl.menu.UploadSpeed.230400.upload.speed=230400 +um_squixl.menu.UploadSpeed.460800.linux=460800 +um_squixl.menu.UploadSpeed.460800.macosx=460800 +um_squixl.menu.UploadSpeed.460800.upload.speed=460800 +um_squixl.menu.UploadSpeed.512000.windows=512000 +um_squixl.menu.UploadSpeed.512000.upload.speed=512000 + +um_squixl.menu.DebugLevel.none=None +um_squixl.menu.DebugLevel.none.build.code_debug=0 +um_squixl.menu.DebugLevel.error=Error +um_squixl.menu.DebugLevel.error.build.code_debug=1 +um_squixl.menu.DebugLevel.warn=Warn +um_squixl.menu.DebugLevel.warn.build.code_debug=2 +um_squixl.menu.DebugLevel.info=Info +um_squixl.menu.DebugLevel.info.build.code_debug=3 +um_squixl.menu.DebugLevel.debug=Debug +um_squixl.menu.DebugLevel.debug.build.code_debug=4 +um_squixl.menu.DebugLevel.verbose=Verbose +um_squixl.menu.DebugLevel.verbose.build.code_debug=5 + +um_squixl.menu.EraseFlash.none=Disabled +um_squixl.menu.EraseFlash.none.upload.erase_cmd= +um_squixl.menu.EraseFlash.all=Enabled +um_squixl.menu.EraseFlash.all.upload.erase_cmd=-e + +############################################################## + um_tinypico.name=UM TinyPICO um_tinypico.bootloader.tool=esptool_py diff --git a/variants/um_edges3_d/pins_arduino.h b/variants/um_edges3_d/pins_arduino.h new file mode 100644 index 00000000000..f54ceb52ea7 --- /dev/null +++ b/variants/um_edges3_d/pins_arduino.h @@ -0,0 +1,46 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include +#include "soc/soc_caps.h" + +#define USB_VID 0x303A +#define USB_PID 0x82DC +#define USB_MANUFACTURER "Unexpected Maker" +#define USB_PRODUCT "EdgeS3[D]" +#define USB_SERIAL "" + +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 = 34; +static const uint8_t MOSI = 35; +static const uint8_t MISO = 37; +static const uint8_t SDO = 35; +static const uint8_t SDI = 37; +static const uint8_t SCK = 36; + +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 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/um_squixl/pins_arduino.h b/variants/um_squixl/pins_arduino.h new file mode 100644 index 00000000000..4546cdb124a --- /dev/null +++ b/variants/um_squixl/pins_arduino.h @@ -0,0 +1,23 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include +#include "soc/soc_caps.h" + +#define USB_VID 0x303A +#define USB_PID 0x82DF +#define USB_MANUFACTURER "Unexpected Maker" +#define USB_PRODUCT "SQUiXL" +#define USB_SERIAL "" + +static const uint8_t SDA = 1; +static const uint8_t SCL = 2; + +static const uint8_t SS = 42; +static const uint8_t MOSI = 46; +static const uint8_t MISO = 41; +static const uint8_t SDO = 46; +static const uint8_t SDI = 41; +static const uint8_t SCK = 45; + +#endif /* Pins_Arduino_h */ From 6f92b604f62568eced0e519b01d17af00b80ebe4 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 13 May 2025 11:46:58 +0200 Subject: [PATCH 127/290] IDF release/v5.4 (#11212) * fix(i2c): update i2c_ll_slave_init for IDF 5.4 * IDF release/v5.4 8ad0d3d8 --- cores/esp32/esp32-hal-i2c-slave.c | 4 +- package/package_esp32_index.template.json | 128 +++++++++++----------- 2 files changed, 67 insertions(+), 65 deletions(-) diff --git a/cores/esp32/esp32-hal-i2c-slave.c b/cores/esp32/esp32-hal-i2c-slave.c index 46c3a4d58c2..9d39c1c783d 100644 --- a/cores/esp32/esp32-hal-i2c-slave.c +++ b/cores/esp32/esp32-hal-i2c-slave.c @@ -335,10 +335,12 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t } #endif // !defined(CONFIG_IDF_TARGET_ESP32P4) - i2c_ll_slave_init(i2c->dev); #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) + i2c_ll_set_mode(i2c->dev, I2C_BUS_MODE_SLAVE); + i2c_ll_enable_pins_open_drain(i2c->dev, true); i2c_ll_enable_fifo_mode(i2c->dev, true); #else + i2c_ll_slave_init(i2c->dev); i2c_ll_slave_set_fifo_mode(i2c->dev, true); #endif i2c_ll_set_slave_addr(i2c->dev, slaveID, false); diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 19254d11682..8d95f2a59ae 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-2f7dcd86-v1" + "version": "idf-release_v5.4-8ad0d3d8-v1" }, { "packager": "esp32", @@ -76,7 +76,7 @@ { "packager": "esp32", "name": "openocd-esp32", - "version": "v0.12.0-esp32-20241016" + "version": "v0.12.0-esp32-20250422" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-2f7dcd86-v1", + "version": "idf-release_v5.4-8ad0d3d8-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", - "size": "352347498" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", + "size": "353625670" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", - "size": "352347498" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", + "size": "353625670" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", - "size": "352347498" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", + "size": "353625670" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", - "size": "352347498" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", + "size": "353625670" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", - "size": "352347498" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", + "size": "353625670" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", - "size": "352347498" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", + "size": "353625670" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", - "size": "352347498" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", + "size": "353625670" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-2f7dcd86-v1.zip", - "checksum": "SHA-256:11f1271fe5e2857155d90384690069e4d33f0f97a4c04e7474b29a7cbc7ededd", - "size": "352347498" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", + "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", + "size": "353625670" } ] }, @@ -414,56 +414,56 @@ }, { "name": "openocd-esp32", - "version": "v0.12.0-esp32-20241016", + "version": "v0.12.0-esp32-20250422", "systems": [ { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-linux-amd64-0.12.0-esp32-20241016.tar.gz", - "archiveFileName": "openocd-esp32-linux-amd64-0.12.0-esp32-20241016.tar.gz", - "checksum": "SHA-256:e82b0f036dc99244bead5f09a86e91bb2365cbcd1122ac68261e5647942485df", - "size": "2398717" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-linux-amd64-0.12.0-esp32-20250422.tar.gz", + "archiveFileName": "openocd-esp32-linux-amd64-0.12.0-esp32-20250422.tar.gz", + "checksum": "SHA-256:eb1fa9b21c65b45a2200af6dcc2914e32335d37b6dbbd181778dcc0dc025e70a", + "size": "2445546" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-linux-arm64-0.12.0-esp32-20241016.tar.gz", - "archiveFileName": "openocd-esp32-linux-arm64-0.12.0-esp32-20241016.tar.gz", - "checksum": "SHA-256:8f8daf5bd22ec5d2fa9257b0862ec33da18ee677e023fb9a9eb17f74ce208c76", - "size": "2271584" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-linux-arm64-0.12.0-esp32-20250422.tar.gz", + "archiveFileName": "openocd-esp32-linux-arm64-0.12.0-esp32-20250422.tar.gz", + "checksum": "SHA-256:f70334a9b12a75b4d943e09fa5db30973037c39dbb54d6fa9f1a7118228b3d1c", + "size": "2330926" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-linux-armel-0.12.0-esp32-20241016.tar.gz", - "archiveFileName": "openocd-esp32-linux-armel-0.12.0-esp32-20241016.tar.gz", - "checksum": "SHA-256:bc9c020ecf20e2000f76cffa44305fd5bc44d2e688ea78cce423399d33f19767", - "size": "2414206" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-linux-armel-0.12.0-esp32-20250422.tar.gz", + "archiveFileName": "openocd-esp32-linux-armel-0.12.0-esp32-20250422.tar.gz", + "checksum": "SHA-256:4ac34d6fd1af86aeda87c8318732f8d691c300c285c7fd2f5037c432c63fbbb3", + "size": "2470732" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-macos-0.12.0-esp32-20241016.tar.gz", - "archiveFileName": "openocd-esp32-macos-0.12.0-esp32-20241016.tar.gz", - "checksum": "SHA-256:02a2dffe801a2d005fa9e614d80ff8173395b2cb0b5d3118d0229d094a9946a7", - "size": "2508089" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-macos-0.12.0-esp32-20250422.tar.gz", + "archiveFileName": "openocd-esp32-macos-0.12.0-esp32-20250422.tar.gz", + "checksum": "SHA-256:9186a7a06304c6d9201cbce4ee3c7099b393bf8d329cda17a68874f92308f6ce", + "size": "2548730" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-macos-arm64-0.12.0-esp32-20241016.tar.gz", - "archiveFileName": "openocd-esp32-macos-arm64-0.12.0-esp32-20241016.tar.gz", - "checksum": "SHA-256:c382f9e884d6565cb6089bff5f200f4810994667d885f062c3d3c5625a0fa9d6", - "size": "2552569" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-macos-arm64-0.12.0-esp32-20250422.tar.gz", + "archiveFileName": "openocd-esp32-macos-arm64-0.12.0-esp32-20250422.tar.gz", + "checksum": "SHA-256:2cc39318d52f393233ff1f777871aebe5b97b3fbad29556a238489263401b774", + "size": "2593819" }, { "host": "i686-mingw32", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-win32-0.12.0-esp32-20241016.zip", - "archiveFileName": "openocd-esp32-win32-0.12.0-esp32-20241016.zip", - "checksum": "SHA-256:3b5d615e0a72cc771a45dd469031312d5881c01d7b6bc9edb29b8b6bda8c2e90", - "size": "2946244" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-win32-0.12.0-esp32-20250422.zip", + "archiveFileName": "openocd-esp32-win32-0.12.0-esp32-20250422.zip", + "checksum": "SHA-256:ecb4f8533fa9098d10000f5f7e8b8eaa8591015b824b481078ddb2b37e7aa6f2", + "size": "2988859" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20241016/openocd-esp32-win64-0.12.0-esp32-20241016.zip", - "archiveFileName": "openocd-esp32-win64-0.12.0-esp32-20241016.zip", - "checksum": "SHA-256:5e7b2fd1947d3a8625f6a11db7a2340cf2f41ff4c61284c022c7d7c32b18780a", - "size": "2946244" + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.12.0-esp32-20250422/openocd-esp32-win64-0.12.0-esp32-20250422.zip", + "archiveFileName": "openocd-esp32-win64-0.12.0-esp32-20250422.zip", + "checksum": "SHA-256:e9eae8e1a8d0e030cd81dcb08394a9137cb7338a6211dfabcdbdfb37b58c5a23", + "size": "2988858" } ] }, From bc08c49579d083503d8db77254d62dcb36f0057f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 13 May 2025 12:25:39 +0200 Subject: [PATCH 128/290] Update version for wifi remote (#11344) --- idf_component.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idf_component.yml b/idf_component.yml index 642bc54143d..98dd5c9b9d9 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -109,7 +109,7 @@ dependencies: rules: - if: "target == esp32p4" espressif/esp_wifi_remote: - version: "^0.5.4" + version: "~0.9.2" rules: - if: "target == esp32p4" espressif/libsodium: From 8d5a026c986aa6edc09a003267ee65946a7f6046 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 15 May 2025 10:56:48 +0200 Subject: [PATCH 129/290] IDF release/v5.4 (#11357) * IDF release/v5.4 8ad0d3d8 * IDF release/v5.4 fd37cd46 * IDF release/v5.4 fe753553 --- 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 8d95f2a59ae..ba63dd3beb5 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-8ad0d3d8-v1" + "version": "idf-release_v5.4-fe753553-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-8ad0d3d8-v1", + "version": "idf-release_v5.4-fe753553-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", - "size": "353625670" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", + "size": "353685379" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", - "size": "353625670" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", + "size": "353685379" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", - "size": "353625670" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", + "size": "353685379" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", - "size": "353625670" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", + "size": "353685379" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", - "size": "353625670" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", + "size": "353685379" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", - "size": "353625670" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", + "size": "353685379" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", - "size": "353625670" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", + "size": "353685379" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-8ad0d3d8-v1.zip", - "checksum": "SHA-256:19b58817f57c5bcf06640b2e789144f44c298ad8c5c26ff95fd52e63a3be9cfb", - "size": "353625670" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", + "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", + "size": "353685379" } ] }, From 69cd5a0a664e96afb7007efe061bc80fef6f72cd Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 15 May 2025 11:10:00 +0200 Subject: [PATCH 130/290] IDF master 7cf5dacd (#11358) --- 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 aa21a192509..e3b42431cbf 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-master-aaebc374-v1" + "version": "idf-master-7cf5dacd-v2" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-master-aaebc374-v1", + "version": "idf-master-7cf5dacd-v2", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", - "size": "404569749" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", + "size": "405095217" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", - "size": "404569749" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", + "size": "405095217" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", - "size": "404569749" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", + "size": "405095217" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", - "size": "404569749" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", + "size": "405095217" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", - "size": "404569749" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", + "size": "405095217" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", - "size": "404569749" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", + "size": "405095217" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", - "size": "404569749" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", + "size": "405095217" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-aaebc374-v1.zip", - "checksum": "SHA-256:5baa0bbeae58973fd6bd4004332eb554b723a1e67f1af389840fac8081c2e21e", - "size": "404569749" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", + "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", + "size": "405095217" } ] }, From 5540afa1ea9ab070d85e1d4fa3338e6c6ce12405 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Thu, 15 May 2025 11:13:32 +0200 Subject: [PATCH 131/290] feat(ci): Run push CI against IDF v5.5 --- .github/workflows/push.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 026e0b8fc0d..68148fbcff7 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -248,7 +248,7 @@ jobs: # See https://hub.docker.com/r/espressif/idf/tags and # https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-docker-image.html # for details. - idf_ver: ["release-v5.4"] + idf_ver: ["release-v5.5"] idf_target: [ "esp32", From 13cd0d3c3fb6d6f719c55cdb671d6807874427b5 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, 15 May 2025 11:14:58 +0200 Subject: [PATCH 132/290] fix(rainmaker): Fix the 8MB partition scheme (#11363) --- boards.txt | 190 ++++++++++++++--------------- tools/partitions/rainmaker_8MB.csv | 4 +- 2 files changed, 97 insertions(+), 97 deletions(-) diff --git a/boards.txt b/boards.txt index 1f48e0308ef..98e6b7eef1d 100644 --- a/boards.txt +++ b/boards.txt @@ -449,7 +449,7 @@ esp32h2.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 #esp32h2.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 #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.rainmaker_8MB.upload.maximum_size=4096000 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 @@ -647,7 +647,7 @@ esp32c6.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota 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.rainmaker_8MB.upload.maximum_size=4096000 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 @@ -933,7 +933,7 @@ esp32s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota esp32s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32s3.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) esp32s3.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB esp32s3.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 @@ -1110,7 +1110,7 @@ esp32c3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota esp32c3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32c3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32c3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32c3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32c3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32c3.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32c3.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32c3.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 @@ -1318,7 +1318,7 @@ esp32s2.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota esp32s2.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32s2.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32s2.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32s2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32s2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32s2.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32s2.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32s2.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 @@ -1501,7 +1501,7 @@ esp32.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota esp32.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 @@ -1681,7 +1681,7 @@ esp32da.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota esp32da.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32da.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32da.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32da.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32da.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32da.menu.PartitionScheme.custom=Custom esp32da.menu.PartitionScheme.custom.build.partitions= esp32da.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -2144,7 +2144,7 @@ esp32s3-octal.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_ esp32s3-octal.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32s3-octal.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32s3-octal.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32s3-octal.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32s3-octal.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32s3-octal.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) esp32s3-octal.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB esp32s3-octal.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 @@ -2731,7 +2731,7 @@ esp32wroverkit.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB esp32wroverkit.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32wroverkit.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32wroverkit.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32wroverkit.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32wroverkit.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32wroverkit.menu.CPUFreq.240=240MHz (WiFi/BT) esp32wroverkit.menu.CPUFreq.240.build.f_cpu=240000000L @@ -2966,7 +2966,7 @@ aventen_s3_sync.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4M aventen_s3_sync.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 aventen_s3_sync.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB aventen_s3_sync.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -aventen_s3_sync.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +aventen_s3_sync.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 aventen_s3_sync.menu.CPUFreq.240=240MHz (WiFi) aventen_s3_sync.menu.CPUFreq.240.build.f_cpu=240000000L @@ -5202,7 +5202,7 @@ um_tinyc6.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_o um_tinyc6.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 um_tinyc6.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB um_tinyc6.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -um_tinyc6.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +um_tinyc6.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 um_tinyc6.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs um_tinyc6.menu.PartitionScheme.zigbee.build.partitions=zigbee um_tinyc6.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 @@ -5896,7 +5896,7 @@ lilygo_t_display_s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmake lilygo_t_display_s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 lilygo_t_display_s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB lilygo_t_display_s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -lilygo_t_display_s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +lilygo_t_display_s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 lilygo_t_display_s3.menu.DebugLevel.none=None lilygo_t_display_s3.menu.DebugLevel.none.build.code_debug=0 @@ -6018,7 +6018,7 @@ lilygo_t_eth_lite.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_ lilygo_t_eth_lite.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 lilygo_t_eth_lite.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB lilygo_t_eth_lite.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -lilygo_t_eth_lite.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +lilygo_t_eth_lite.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 lilygo_t_eth_lite.menu.DebugLevel.none=None lilygo_t_eth_lite.menu.DebugLevel.none.build.code_debug=0 @@ -8374,7 +8374,7 @@ sparkfun_esp32c6_thing_plus.menu.PartitionScheme.rainmaker_4MB.build.partitions= sparkfun_esp32c6_thing_plus.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 sparkfun_esp32c6_thing_plus.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB sparkfun_esp32c6_thing_plus.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -sparkfun_esp32c6_thing_plus.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +sparkfun_esp32c6_thing_plus.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 sparkfun_esp32c6_thing_plus.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs sparkfun_esp32c6_thing_plus.menu.PartitionScheme.zigbee.build.partitions=zigbee sparkfun_esp32c6_thing_plus.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 @@ -8784,7 +8784,7 @@ sparkfun_esp32_iot_redboard.menu.PartitionScheme.rainmaker_4MB.build.partitions= sparkfun_esp32_iot_redboard.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 sparkfun_esp32_iot_redboard.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB sparkfun_esp32_iot_redboard.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -sparkfun_esp32_iot_redboard.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +sparkfun_esp32_iot_redboard.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 sparkfun_esp32_iot_redboard.menu.CPUFreq.240=240MHz (WiFi/BT) sparkfun_esp32_iot_redboard.menu.CPUFreq.240.build.f_cpu=240000000L @@ -8964,7 +8964,7 @@ sparkfun_esp32c6_qwiic_pocket.menu.PartitionScheme.rainmaker_4MB.build.partition sparkfun_esp32c6_qwiic_pocket.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 sparkfun_esp32c6_qwiic_pocket.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB sparkfun_esp32c6_qwiic_pocket.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -sparkfun_esp32c6_qwiic_pocket.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +sparkfun_esp32c6_qwiic_pocket.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 sparkfun_esp32c6_qwiic_pocket.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs sparkfun_esp32c6_qwiic_pocket.menu.PartitionScheme.zigbee.build.partitions=zigbee sparkfun_esp32c6_qwiic_pocket.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 @@ -9298,7 +9298,7 @@ nina_w10.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ot nina_w10.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 nina_w10.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB nina_w10.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -nina_w10.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +nina_w10.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 nina_w10.menu.CPUFreq.240=240MHz (WiFi/BT) nina_w10.menu.CPUFreq.240.build.f_cpu=240000000L @@ -9509,7 +9509,7 @@ nora_w10.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ot nora_w10.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 nora_w10.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB nora_w10.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -nora_w10.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +nora_w10.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 nora_w10.menu.CPUFreq.240=240MHz (WiFi) nora_w10.menu.CPUFreq.240.build.f_cpu=240000000L @@ -10481,7 +10481,7 @@ lolin_s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ot lolin_s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 lolin_s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB lolin_s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -lolin_s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +lolin_s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 lolin_s3.menu.CPUFreq.240=240MHz (WiFi) lolin_s3.menu.CPUFreq.240.build.f_cpu=240000000L @@ -10981,7 +10981,7 @@ lolin_s3_pro.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_n lolin_s3_pro.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 lolin_s3_pro.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB lolin_s3_pro.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -lolin_s3_pro.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +lolin_s3_pro.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 lolin_s3_pro.menu.CPUFreq.240=240MHz (WiFi) lolin_s3_pro.menu.CPUFreq.240.build.f_cpu=240000000L @@ -12361,7 +12361,7 @@ dfrobot_firebeetle2_esp32e.menu.PartitionScheme.rainmaker_4MB.build.partitions=r dfrobot_firebeetle2_esp32e.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 dfrobot_firebeetle2_esp32e.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB dfrobot_firebeetle2_esp32e.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -dfrobot_firebeetle2_esp32e.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +dfrobot_firebeetle2_esp32e.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 dfrobot_firebeetle2_esp32e.menu.CPUFreq.240=240MHz (WiFi/BT) dfrobot_firebeetle2_esp32e.menu.CPUFreq.240.build.f_cpu=240000000L @@ -12614,7 +12614,7 @@ dfrobot_firebeetle2_esp32s3.menu.PartitionScheme.rainmaker_4MB.build.partitions= dfrobot_firebeetle2_esp32s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 dfrobot_firebeetle2_esp32s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB dfrobot_firebeetle2_esp32s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -dfrobot_firebeetle2_esp32s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +dfrobot_firebeetle2_esp32s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 dfrobot_firebeetle2_esp32s3.menu.CPUFreq.240=240MHz (WiFi) dfrobot_firebeetle2_esp32s3.menu.CPUFreq.240.build.f_cpu=240000000L @@ -12975,7 +12975,7 @@ dfrobot_romeo_esp32s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainma dfrobot_romeo_esp32s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 dfrobot_romeo_esp32s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB dfrobot_romeo_esp32s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -dfrobot_romeo_esp32s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +dfrobot_romeo_esp32s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 dfrobot_romeo_esp32s3.menu.CPUFreq.240=240MHz (WiFi) dfrobot_romeo_esp32s3.menu.CPUFreq.240.build.f_cpu=240000000L @@ -18176,7 +18176,7 @@ nologo_esp32s3_pico.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmake nologo_esp32s3_pico.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 nologo_esp32s3_pico.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB nologo_esp32s3_pico.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -nologo_esp32s3_pico.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +nologo_esp32s3_pico.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 nologo_esp32s3_pico.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) nologo_esp32s3_pico.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB nologo_esp32s3_pico.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 @@ -18895,7 +18895,7 @@ esp32-poe.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_o esp32-poe.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32-poe.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32-poe.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32-poe.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32-poe.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32-poe.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32-poe.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32-poe.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 @@ -19038,7 +19038,7 @@ esp32-poe-iso.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_ esp32-poe-iso.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32-poe-iso.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32-poe-iso.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32-poe-iso.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32-poe-iso.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32-poe-iso.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32-poe-iso.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32-poe-iso.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 @@ -19316,7 +19316,7 @@ esp32s2-devkitlipo.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker esp32s2-devkitlipo.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32s2-devkitlipo.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32s2-devkitlipo.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32s2-devkitlipo.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32s2-devkitlipo.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32s2-devkitlipo.menu.PartitionScheme.custom=Custom esp32s2-devkitlipo.menu.PartitionScheme.custom.build.partitions= esp32s2-devkitlipo.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -19511,7 +19511,7 @@ esp32s2-devkitlipo-usb.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainm esp32s2-devkitlipo-usb.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32s2-devkitlipo-usb.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32s2-devkitlipo-usb.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32s2-devkitlipo-usb.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32s2-devkitlipo-usb.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32s2-devkitlipo-usb.menu.PartitionScheme.custom=Custom esp32s2-devkitlipo-usb.menu.PartitionScheme.custom.build.partitions= esp32s2-devkitlipo-usb.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -19766,7 +19766,7 @@ esp32s3-devkitlipo.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker esp32s3-devkitlipo.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32s3-devkitlipo.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32s3-devkitlipo.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32s3-devkitlipo.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32s3-devkitlipo.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32s3-devkitlipo.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) esp32s3-devkitlipo.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB esp32s3-devkitlipo.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 @@ -19924,7 +19924,7 @@ esp32c3-devkitlipo.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker esp32c3-devkitlipo.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32c3-devkitlipo.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32c3-devkitlipo.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32c3-devkitlipo.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32c3-devkitlipo.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32c3-devkitlipo.menu.PartitionScheme.custom=Custom esp32c3-devkitlipo.menu.PartitionScheme.custom.build.partitions= esp32c3-devkitlipo.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -20097,7 +20097,7 @@ esp32c6-evb.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no esp32c6-evb.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32c6-evb.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32c6-evb.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32c6-evb.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32c6-evb.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32c6-evb.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs esp32c6-evb.menu.PartitionScheme.zigbee.build.partitions=zigbee esp32c6-evb.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 @@ -20280,7 +20280,7 @@ esp32h2-devkitlipo.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=314 #esp32h2-devkitlipo.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 #esp32h2-devkitlipo.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB #esp32h2-devkitlipo.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -#esp32h2-devkitlipo.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +#esp32h2-devkitlipo.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32h2-devkitlipo.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs esp32h2-devkitlipo.menu.PartitionScheme.zigbee.build.partitions=zigbee esp32h2-devkitlipo.menu.PartitionScheme.zigbee.upload.maximum_size=1310720 @@ -20455,7 +20455,7 @@ esp32-sbc-fabgl.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4M esp32-sbc-fabgl.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 esp32-sbc-fabgl.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB esp32-sbc-fabgl.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -esp32-sbc-fabgl.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +esp32-sbc-fabgl.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 esp32-sbc-fabgl.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs esp32-sbc-fabgl.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr esp32-sbc-fabgl.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 @@ -20698,7 +20698,7 @@ m5stack_core.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_n m5stack_core.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_core.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_core.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_core.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_core.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_core.menu.PartitionScheme.custom=Custom m5stack_core.menu.PartitionScheme.custom.build.partitions= m5stack_core.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -20874,7 +20874,7 @@ m5stack_fire.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_n m5stack_fire.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_fire.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_fire.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_fire.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_fire.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_fire.menu.PartitionScheme.custom=Custom m5stack_fire.menu.PartitionScheme.custom.build.partitions= m5stack_fire.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -21048,7 +21048,7 @@ m5stack_core2.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_ m5stack_core2.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_core2.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_core2.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_core2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_core2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_core2.menu.PartitionScheme.custom=Custom m5stack_core2.menu.PartitionScheme.custom.build.partitions= m5stack_core2.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -21222,7 +21222,7 @@ m5stack_tough.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_ m5stack_tough.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_tough.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_tough.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_tough.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_tough.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_tough.menu.PartitionScheme.custom=Custom m5stack_tough.menu.PartitionScheme.custom.build.partitions= m5stack_tough.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -21389,7 +21389,7 @@ m5stack_station.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4M m5stack_station.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_station.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_station.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_station.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_station.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_station.menu.PartitionScheme.custom=Custom m5stack_station.menu.PartitionScheme.custom.build.partitions= m5stack_station.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -21868,7 +21868,7 @@ m5stack_stickc_plus2.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmak m5stack_stickc_plus2.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_stickc_plus2.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_stickc_plus2.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_stickc_plus2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_stickc_plus2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_stickc_plus2.menu.PartitionScheme.custom=Custom m5stack_stickc_plus2.menu.PartitionScheme.custom.build.partitions= m5stack_stickc_plus2.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -22275,7 +22275,7 @@ m5stack_atoms3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB m5stack_atoms3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_atoms3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_atoms3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_atoms3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_atoms3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_atoms3.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) m5stack_atoms3.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB m5stack_atoms3.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 @@ -22508,7 +22508,7 @@ m5stack_cores3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB m5stack_cores3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_cores3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_cores3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_cores3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_cores3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_cores3.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) m5stack_cores3.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB m5stack_cores3.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 @@ -23050,7 +23050,7 @@ m5stack_unit_cams3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker m5stack_unit_cams3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_unit_cams3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_unit_cams3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_unit_cams3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_unit_cams3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_unit_cams3.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) m5stack_unit_cams3.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB m5stack_unit_cams3.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 @@ -23347,7 +23347,7 @@ m5stack_paper.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_ m5stack_paper.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_paper.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_paper.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_paper.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_paper.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_paper.menu.PartitionScheme.custom=Custom m5stack_paper.menu.PartitionScheme.custom.build.partitions= m5stack_paper.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -24065,7 +24065,7 @@ m5stack_stamp_s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4 m5stack_stamp_s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_stamp_s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_stamp_s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_stamp_s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_stamp_s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_stamp_s3.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) m5stack_stamp_s3.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB m5stack_stamp_s3.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 @@ -24302,7 +24302,7 @@ m5stack_capsule.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4M m5stack_capsule.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_capsule.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_capsule.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_capsule.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_capsule.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_capsule.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) m5stack_capsule.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB m5stack_capsule.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 @@ -24542,7 +24542,7 @@ m5stack_cardputer.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_ m5stack_cardputer.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_cardputer.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_cardputer.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_cardputer.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_cardputer.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_cardputer.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) m5stack_cardputer.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB m5stack_cardputer.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 @@ -24779,7 +24779,7 @@ m5stack_dial.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_n m5stack_dial.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_dial.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_dial.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_dial.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_dial.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_dial.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) m5stack_dial.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB m5stack_dial.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 @@ -25016,7 +25016,7 @@ m5stack_dinmeter.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4 m5stack_dinmeter.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 m5stack_dinmeter.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB m5stack_dinmeter.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -m5stack_dinmeter.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +m5stack_dinmeter.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 m5stack_dinmeter.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) m5stack_dinmeter.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB m5stack_dinmeter.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 @@ -28841,7 +28841,7 @@ bpi_leaf_s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no bpi_leaf_s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 bpi_leaf_s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB bpi_leaf_s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -bpi_leaf_s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +bpi_leaf_s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 bpi_leaf_s3.menu.CPUFreq.240=240MHz (WiFi) bpi_leaf_s3.menu.CPUFreq.240.build.f_cpu=240000000L @@ -29598,7 +29598,7 @@ fri3d_2024_esp32s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker fri3d_2024_esp32s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 fri3d_2024_esp32s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB fri3d_2024_esp32s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -fri3d_2024_esp32s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +fri3d_2024_esp32s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 fri3d_2024_esp32s3.menu.CPUFreq.240=240MHz (WiFi) fri3d_2024_esp32s3.menu.CPUFreq.240.build.f_cpu=240000000L @@ -31365,7 +31365,7 @@ wifiduino32c3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_ wifiduino32c3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 wifiduino32c3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB wifiduino32c3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -wifiduino32c3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +wifiduino32c3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 wifiduino32c3.menu.CPUFreq.160=160MHz (WiFi) wifiduino32c3.menu.CPUFreq.160.build.f_cpu=160000000L @@ -31596,7 +31596,7 @@ wifiduino32s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_ wifiduino32s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 wifiduino32s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB wifiduino32s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -wifiduino32s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +wifiduino32s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 wifiduino32s3.menu.CPUFreq.240=240MHz (WiFi) wifiduino32s3.menu.CPUFreq.240.build.f_cpu=240000000L @@ -32809,7 +32809,7 @@ kb32.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota kb32.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 kb32.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB kb32.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -kb32.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +kb32.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 kb32.menu.CPUFreq.240=240MHz (WiFi/BT) kb32.menu.CPUFreq.240.build.f_cpu=240000000L @@ -32987,7 +32987,7 @@ deneyapkart.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no deneyapkart.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 deneyapkart.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB deneyapkart.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -deneyapkart.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +deneyapkart.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 deneyapkart.menu.CPUFreq.240=240MHz (WiFi/BT) deneyapkart.menu.CPUFreq.240.build.f_cpu=240000000L @@ -33165,7 +33165,7 @@ deneyapkart1A.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_ deneyapkart1A.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 deneyapkart1A.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB deneyapkart1A.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -deneyapkart1A.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +deneyapkart1A.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 deneyapkart1A.menu.CPUFreq.240=240MHz (WiFi/BT) deneyapkart1A.menu.CPUFreq.240.build.f_cpu=240000000L @@ -33428,7 +33428,7 @@ deneyapkart1Av2.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4M deneyapkart1Av2.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 deneyapkart1Av2.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB deneyapkart1Av2.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -deneyapkart1Av2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +deneyapkart1Av2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 deneyapkart1Av2.menu.CPUFreq.240=240MHz (WiFi) deneyapkart1Av2.menu.CPUFreq.240.build.f_cpu=240000000L @@ -33597,7 +33597,7 @@ deneyapmini.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no deneyapmini.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 deneyapmini.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB deneyapmini.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -deneyapmini.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +deneyapmini.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 deneyapmini.menu.CPUFreq.240=240MHz (WiFi) deneyapmini.menu.CPUFreq.240.build.f_cpu=240000000L @@ -33787,7 +33787,7 @@ deneyapminiv2.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_ deneyapminiv2.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 deneyapminiv2.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB deneyapminiv2.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -deneyapminiv2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +deneyapminiv2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 deneyapminiv2.menu.CPUFreq.240=240MHz (WiFi) deneyapminiv2.menu.CPUFreq.240.build.f_cpu=240000000L @@ -33956,7 +33956,7 @@ deneyapkartg.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_n deneyapkartg.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 deneyapkartg.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB deneyapkartg.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -deneyapkartg.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +deneyapkartg.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 deneyapkartg.menu.CPUFreq.160=160MHz (WiFi) deneyapkartg.menu.CPUFreq.160.build.f_cpu=160000000L @@ -34704,7 +34704,7 @@ tamc_termod_s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB tamc_termod_s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 tamc_termod_s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB tamc_termod_s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -tamc_termod_s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +tamc_termod_s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 tamc_termod_s3.menu.CPUFreq.240=240MHz (WiFi) tamc_termod_s3.menu.CPUFreq.240.build.f_cpu=240000000L @@ -35402,7 +35402,7 @@ XIAO_ESP32C3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_n XIAO_ESP32C3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 XIAO_ESP32C3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB XIAO_ESP32C3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -XIAO_ESP32C3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +XIAO_ESP32C3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 XIAO_ESP32C3.menu.CPUFreq.160=160MHz (WiFi) XIAO_ESP32C3.menu.CPUFreq.160.build.f_cpu=160000000L @@ -37138,7 +37138,7 @@ unphone8.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ot unphone8.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 unphone8.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB unphone8.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -unphone8.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +unphone8.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 unphone8.menu.PartitionScheme.max_app_8MB=Maximum APP (7.9MB APP No OTA/No FS) unphone8.menu.PartitionScheme.max_app_8MB.build.partitions=max_app_8MB @@ -37294,7 +37294,7 @@ unphone9.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ot unphone9.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 unphone9.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB unphone9.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -unphone9.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +unphone9.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 unphone9.menu.PartitionScheme.max_app_8MB=Maximum APP (7.9MB APP No OTA/No FS) unphone9.menu.PartitionScheme.max_app_8MB.build.partitions=max_app_8MB @@ -38023,7 +38023,7 @@ VALTRACK_V4_VTS_ESP32_C3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rai VALTRACK_V4_VTS_ESP32_C3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 VALTRACK_V4_VTS_ESP32_C3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB VALTRACK_V4_VTS_ESP32_C3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -VALTRACK_V4_VTS_ESP32_C3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +VALTRACK_V4_VTS_ESP32_C3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 VALTRACK_V4_VTS_ESP32_C3.menu.CPUFreq.160=160MHz (WiFi) VALTRACK_V4_VTS_ESP32_C3.menu.CPUFreq.160.build.f_cpu=160000000L @@ -38174,7 +38174,7 @@ VALTRACK_V4_MFW_ESP32_C3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rai VALTRACK_V4_MFW_ESP32_C3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 VALTRACK_V4_MFW_ESP32_C3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB VALTRACK_V4_MFW_ESP32_C3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -VALTRACK_V4_MFW_ESP32_C3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +VALTRACK_V4_MFW_ESP32_C3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 VALTRACK_V4_MFW_ESP32_C3.menu.CPUFreq.160=160MHz (WiFi) VALTRACK_V4_MFW_ESP32_C3.menu.CPUFreq.160.build.f_cpu=160000000L @@ -38405,7 +38405,7 @@ Edgebox-ESP-100.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4M Edgebox-ESP-100.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 Edgebox-ESP-100.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB Edgebox-ESP-100.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -Edgebox-ESP-100.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +Edgebox-ESP-100.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 Edgebox-ESP-100.menu.CPUFreq.240=240MHz (WiFi) Edgebox-ESP-100.menu.CPUFreq.240.build.f_cpu=240000000L @@ -38775,7 +38775,7 @@ nebulas3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ot nebulas3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 nebulas3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB nebulas3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -nebulas3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +nebulas3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 nebulas3.menu.CPUFreq.240=240MHz (WiFi) nebulas3.menu.CPUFreq.240.build.f_cpu=240000000L @@ -39001,7 +39001,7 @@ lionbits3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_o lionbits3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 lionbits3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB lionbits3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -lionbits3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +lionbits3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 lionbits3.menu.CPUFreq.240=240MHz (WiFi) lionbits3.menu.CPUFreq.240.build.f_cpu=240000000L @@ -40299,7 +40299,7 @@ atd147_s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_o atd147_s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 atd147_s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB atd147_s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -atd147_s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +atd147_s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 atd147_s3.menu.CPUFreq.240=240MHz (WiFi) atd147_s3.menu.CPUFreq.240.build.f_cpu=240000000L @@ -40482,7 +40482,7 @@ atd35s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota atd35s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 atd35s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB atd35s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -atd35s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +atd35s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 atd35s3.menu.CPUFreq.240=240MHz (WiFi) atd35s3.menu.CPUFreq.240.build.f_cpu=240000000L @@ -42111,7 +42111,7 @@ waveshare_esp32_s3_touch_lcd_169.menu.PartitionScheme.rainmaker.build.partitions waveshare_esp32_s3_touch_lcd_169.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 waveshare_esp32_s3_touch_lcd_169.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_lcd_169.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_lcd_169.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_lcd_169.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_lcd_169.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) waveshare_esp32_s3_touch_lcd_169.menu.PartitionScheme.fatflash.build.partitions=ffat waveshare_esp32_s3_touch_lcd_169.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 @@ -42310,7 +42310,7 @@ waveshare_esp32_s3_touch_amoled_18.menu.PartitionScheme.rainmaker.build.partitio waveshare_esp32_s3_touch_amoled_18.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 waveshare_esp32_s3_touch_amoled_18.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_amoled_18.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_amoled_18.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_amoled_18.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_amoled_18.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) waveshare_esp32_s3_touch_amoled_18.menu.PartitionScheme.fatflash.build.partitions=ffat waveshare_esp32_s3_touch_amoled_18.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 @@ -42509,7 +42509,7 @@ waveshare_esp32_s3_lcd_169.menu.PartitionScheme.rainmaker.build.partitions=rainm waveshare_esp32_s3_lcd_169.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 waveshare_esp32_s3_lcd_169.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_lcd_169.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_lcd_169.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_lcd_169.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_lcd_169.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) waveshare_esp32_s3_lcd_169.menu.PartitionScheme.fatflash.build.partitions=ffat waveshare_esp32_s3_lcd_169.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 @@ -43022,7 +43022,7 @@ aslcanx2.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ot aslcanx2.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 aslcanx2.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB aslcanx2.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -aslcanx2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +aslcanx2.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 aslcanx2.menu.CPUFreq.240=240MHz (WiFi) aslcanx2.menu.CPUFreq.240.build.f_cpu=240000000L @@ -43812,7 +43812,7 @@ codecell.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ot codecell.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 codecell.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB codecell.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -codecell.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +codecell.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 codecell.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs codecell.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr codecell.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 @@ -44189,7 +44189,7 @@ waveshare_esp32_s3_touch_amoled_241.menu.PartitionScheme.rainmaker.build.partiti waveshare_esp32_s3_touch_amoled_241.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 waveshare_esp32_s3_touch_amoled_241.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_amoled_241.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_amoled_241.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_amoled_241.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_amoled_241.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) waveshare_esp32_s3_touch_amoled_241.menu.PartitionScheme.fatflash.build.partitions=ffat waveshare_esp32_s3_touch_amoled_241.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 @@ -44394,7 +44394,7 @@ waveshare_esp32_s3_touch_lcd_43.menu.PartitionScheme.rainmaker.build.partitions= waveshare_esp32_s3_touch_lcd_43.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 waveshare_esp32_s3_touch_lcd_43.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_lcd_43.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_lcd_43.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_lcd_43.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_lcd_43.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) waveshare_esp32_s3_touch_lcd_43.menu.PartitionScheme.fatflash.build.partitions=ffat waveshare_esp32_s3_touch_lcd_43.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 @@ -44593,7 +44593,7 @@ waveshare_esp32_s3_touch_lcd_43B.menu.PartitionScheme.rainmaker.build.partitions waveshare_esp32_s3_touch_lcd_43B.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 waveshare_esp32_s3_touch_lcd_43B.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_lcd_43B.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_lcd_43B.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_lcd_43B.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_lcd_43B.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) waveshare_esp32_s3_touch_lcd_43B.menu.PartitionScheme.fatflash.build.partitions=ffat waveshare_esp32_s3_touch_lcd_43B.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 @@ -44797,7 +44797,7 @@ waveshare_esp32_s3_touch_lcd_7.menu.PartitionScheme.rainmaker.build.partitions=r waveshare_esp32_s3_touch_lcd_7.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 waveshare_esp32_s3_touch_lcd_7.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_lcd_7.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_lcd_7.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_lcd_7.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_lcd_7.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) waveshare_esp32_s3_touch_lcd_7.menu.PartitionScheme.fatflash.build.partitions=ffat waveshare_esp32_s3_touch_lcd_7.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 @@ -44996,7 +44996,7 @@ waveshare_esp32_s3_touch_lcd_5.menu.PartitionScheme.rainmaker.build.partitions=r waveshare_esp32_s3_touch_lcd_5.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 waveshare_esp32_s3_touch_lcd_5.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_lcd_5.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_lcd_5.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_lcd_5.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_lcd_5.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) waveshare_esp32_s3_touch_lcd_5.menu.PartitionScheme.fatflash.build.partitions=ffat waveshare_esp32_s3_touch_lcd_5.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 @@ -45195,7 +45195,7 @@ waveshare_esp32_s3_touch_lcd_5B.menu.PartitionScheme.rainmaker.build.partitions= waveshare_esp32_s3_touch_lcd_5B.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 waveshare_esp32_s3_touch_lcd_5B.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_lcd_5B.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_lcd_5B.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_lcd_5B.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_lcd_5B.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) waveshare_esp32_s3_touch_lcd_5B.menu.PartitionScheme.fatflash.build.partitions=ffat waveshare_esp32_s3_touch_lcd_5B.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 @@ -45394,7 +45394,7 @@ waveshare_esp32_s3_touch_lcd_4.menu.PartitionScheme.rainmaker.build.partitions=r waveshare_esp32_s3_touch_lcd_4.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 waveshare_esp32_s3_touch_lcd_4.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_lcd_4.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_lcd_4.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_lcd_4.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_lcd_4.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) waveshare_esp32_s3_touch_lcd_4.menu.PartitionScheme.fatflash.build.partitions=ffat waveshare_esp32_s3_touch_lcd_4.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 @@ -45602,7 +45602,7 @@ waveshare_esp32_s3_touch_lcd_185.menu.PartitionScheme.default_8MB.build.partitio waveshare_esp32_s3_touch_lcd_185.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 waveshare_esp32_s3_touch_lcd_185.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_lcd_185.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_lcd_185.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_lcd_185.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_lcd_185.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) waveshare_esp32_s3_touch_lcd_185.menu.PartitionScheme.default.build.partitions=default waveshare_esp32_s3_touch_lcd_185.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) @@ -46179,7 +46179,7 @@ waveshare_esp32_s3_lcd_185.menu.PartitionScheme.default_8MB.build.partitions=def waveshare_esp32_s3_lcd_185.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 waveshare_esp32_s3_lcd_185.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_lcd_185.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_lcd_185.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_lcd_185.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_lcd_185.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) waveshare_esp32_s3_lcd_185.menu.PartitionScheme.default.build.partitions=default waveshare_esp32_s3_lcd_185.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) @@ -46416,7 +46416,7 @@ waveshare_esp32_s3_touch_lcd_146.menu.PartitionScheme.default_8MB.build.partitio waveshare_esp32_s3_touch_lcd_146.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 waveshare_esp32_s3_touch_lcd_146.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_lcd_146.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_lcd_146.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_lcd_146.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_lcd_146.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) waveshare_esp32_s3_touch_lcd_146.menu.PartitionScheme.default.build.partitions=default waveshare_esp32_s3_touch_lcd_146.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) @@ -46653,7 +46653,7 @@ waveshare_esp32_s3_lcd_146.menu.PartitionScheme.default_8MB.build.partitions=def waveshare_esp32_s3_lcd_146.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 waveshare_esp32_s3_lcd_146.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_lcd_146.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_lcd_146.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_lcd_146.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_lcd_146.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) waveshare_esp32_s3_lcd_146.menu.PartitionScheme.default.build.partitions=default waveshare_esp32_s3_lcd_146.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) @@ -46890,7 +46890,7 @@ waveshare_esp32_s3_touch_lcd_185_box.menu.PartitionScheme.default_8MB.build.part waveshare_esp32_s3_touch_lcd_185_box.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 waveshare_esp32_s3_touch_lcd_185_box.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_lcd_185_box.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_lcd_185_box.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_lcd_185_box.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_lcd_185_box.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) waveshare_esp32_s3_touch_lcd_185_box.menu.PartitionScheme.default.build.partitions=default waveshare_esp32_s3_touch_lcd_185_box.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) @@ -47123,7 +47123,7 @@ waveshare_esp32_s3_lcd_147.menu.PartitionScheme.default_8MB.build.partitions=def waveshare_esp32_s3_lcd_147.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 waveshare_esp32_s3_lcd_147.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_lcd_147.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_lcd_147.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_lcd_147.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_lcd_147.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) waveshare_esp32_s3_lcd_147.menu.PartitionScheme.default.build.partitions=default waveshare_esp32_s3_lcd_147.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) @@ -47360,7 +47360,7 @@ waveshare_esp32_s3_touch_lcd_21.menu.PartitionScheme.default_8MB.build.partition waveshare_esp32_s3_touch_lcd_21.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 waveshare_esp32_s3_touch_lcd_21.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_lcd_21.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_lcd_21.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_lcd_21.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_lcd_21.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) waveshare_esp32_s3_touch_lcd_21.menu.PartitionScheme.default.build.partitions=default waveshare_esp32_s3_touch_lcd_21.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) @@ -47597,7 +47597,7 @@ waveshare_esp32_s3_touch_lcd_28.menu.PartitionScheme.default_8MB.build.partition waveshare_esp32_s3_touch_lcd_28.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 waveshare_esp32_s3_touch_lcd_28.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_lcd_28.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_lcd_28.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_lcd_28.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_lcd_28.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) waveshare_esp32_s3_touch_lcd_28.menu.PartitionScheme.default.build.partitions=default waveshare_esp32_s3_touch_lcd_28.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) @@ -47831,7 +47831,7 @@ waveshare_esp32_s3_relay_6ch.menu.PartitionScheme.default_8MB.build.partitions=d waveshare_esp32_s3_relay_6ch.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 waveshare_esp32_s3_relay_6ch.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_relay_6ch.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_relay_6ch.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_relay_6ch.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_relay_6ch.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS) waveshare_esp32_s3_relay_6ch.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB waveshare_esp32_s3_relay_6ch.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 @@ -48071,7 +48071,7 @@ waveshare_esp32_s3_touch_amoled_164.menu.PartitionScheme.rainmaker.build.partiti waveshare_esp32_s3_touch_amoled_164.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 waveshare_esp32_s3_touch_amoled_164.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_amoled_164.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_amoled_164.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_amoled_164.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_amoled_164.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) waveshare_esp32_s3_touch_amoled_164.menu.PartitionScheme.fatflash.build.partitions=ffat waveshare_esp32_s3_touch_amoled_164.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 @@ -48273,7 +48273,7 @@ waveshare_esp32_s3_touch_amoled_143.menu.PartitionScheme.rainmaker.build.partiti waveshare_esp32_s3_touch_amoled_143.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 waveshare_esp32_s3_touch_amoled_143.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_amoled_143.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_amoled_143.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_amoled_143.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_amoled_143.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) waveshare_esp32_s3_touch_amoled_143.menu.PartitionScheme.fatflash.build.partitions=ffat waveshare_esp32_s3_touch_amoled_143.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 @@ -48475,7 +48475,7 @@ waveshare_esp32_s3_touch_amoled_191.menu.PartitionScheme.rainmaker.build.partiti waveshare_esp32_s3_touch_amoled_191.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 waveshare_esp32_s3_touch_amoled_191.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB waveshare_esp32_s3_touch_amoled_191.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -waveshare_esp32_s3_touch_amoled_191.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +waveshare_esp32_s3_touch_amoled_191.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 waveshare_esp32_s3_touch_amoled_191.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) waveshare_esp32_s3_touch_amoled_191.menu.PartitionScheme.fatflash.build.partitions=ffat waveshare_esp32_s3_touch_amoled_191.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 @@ -50083,7 +50083,7 @@ cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_ cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker_8MB=RainMaker 8MB cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker_8MB.build.partitions=rainmaker_8MB -cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480 +cyobot_v2_esp32s3.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4096000 cyobot_v2_esp32s3.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) cyobot_v2_esp32s3.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB cyobot_v2_esp32s3.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 diff --git a/tools/partitions/rainmaker_8MB.csv b/tools/partitions/rainmaker_8MB.csv index 6d65333063f..6bad399968c 100644 --- a/tools/partitions/rainmaker_8MB.csv +++ b/tools/partitions/rainmaker_8MB.csv @@ -1,7 +1,7 @@ # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xe000, 0x2000, -ota_0, app, ota_0, 0x10000, 0x3ED000, -ota_1, app, ota_1, 0x3FD000, 0x3ED000, +ota_0, app, ota_0, 0x10000, 0x3EA000, +ota_1, app, ota_1, 0x400000, 0x3EA000, fctry, data, nvs, 0x7EA000, 0x6000, coredump, data, coredump,0x7F0000, 0x10000, From 3f63a4929f6cb7165e78d47c4478f62a76e00e9e Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Mon, 19 May 2025 13:54:12 +0200 Subject: [PATCH 133/290] fix(build): Add dependency on esp_http_client --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e981130715..3288f16f39f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -356,7 +356,7 @@ endforeach() set(includedirs variants/${CONFIG_ARDUINO_VARIANT}/ cores/esp32/ ${ARDUINO_LIBRARIES_INCLUDEDIRS}) set(srcs ${CORE_SRCS} ${ARDUINO_LIBRARIES_SRCS}) set(priv_includes cores/esp32/libb64) -set(requires spi_flash esp_partition mbedtls wpa_supplicant esp_adc esp_eth http_parser esp_ringbuf esp_driver_gptimer esp_driver_usb_serial_jtag driver) +set(requires spi_flash esp_partition mbedtls wpa_supplicant esp_adc esp_eth http_parser esp_ringbuf esp_driver_gptimer esp_driver_usb_serial_jtag driver esp_http_client) set(priv_requires fatfs nvs_flash app_update spiffs bootloader_support bt esp_hid usb esp_psram ${ARDUINO_LIBRARIES_REQUIRES}) if(NOT CONFIG_ARDUINO_SELECTIVE_COMPILATION OR CONFIG_ARDUINO_SELECTIVE_OpenThread) From d85b75c2196533eb728b6a59e321d600ac57f0dc Mon Sep 17 00:00:00 2001 From: qhddz Date: Fri, 23 May 2025 00:31:31 +0800 Subject: [PATCH 134/290] add dfrobot lorawan esp32s3 board (#11362) * add dfrobot_lorawan_esp32s3 board * Update pins_arduino.h * Update pins_arduino.h remove duplicate macro definitions * Update pins_arduino.h * update board.txt * add other menu items * delete OPI Flash * Update pins_arduino.h * Update pins_arduino.h --- boards.txt | 206 ++++++++++++++++++ .../dfrobot_lorawan_esp32s3/pins_arduino.h | 34 +++ 2 files changed, 240 insertions(+) create mode 100644 variants/dfrobot_lorawan_esp32s3/pins_arduino.h diff --git a/boards.txt b/boards.txt index 98e6b7eef1d..ccb32b95da3 100644 --- a/boards.txt +++ b/boards.txt @@ -13023,6 +13023,212 @@ dfrobot_romeo_esp32s3.menu.EraseFlash.none.upload.erase_cmd= dfrobot_romeo_esp32s3.menu.EraseFlash.all=Enabled dfrobot_romeo_esp32s3.menu.EraseFlash.all.upload.erase_cmd=-e +############################################################## +dfrobot_lorawan_esp32s3.name=DFRobot LoRaWAN ESP32-S3 +#dfrobot_lorawan_esp32s3.vid.0=0x303a +#dfrobot_lorawan_esp32s3.pid.0=0x1001 + +dfrobot_lorawan_esp32s3.bootloader.tool=esptool_py +dfrobot_lorawan_esp32s3.bootloader.tool.default=esptool_py + +dfrobot_lorawan_esp32s3.upload.tool=esptool_py +dfrobot_lorawan_esp32s3.upload.tool.default=esptool_py +dfrobot_lorawan_esp32s3.upload.tool.network=esp_ota + +dfrobot_lorawan_esp32s3.upload.speed=921600 +dfrobot_lorawan_esp32s3.upload.erase_cmd= +dfrobot_lorawan_esp32s3.upload.maximum_size=1310720 +dfrobot_lorawan_esp32s3.upload.maximum_data_size=327680 +dfrobot_lorawan_esp32s3.upload.flags= +dfrobot_lorawan_esp32s3.upload.extra_flags= +dfrobot_lorawan_esp32s3.upload.use_1200bps_touch=false +dfrobot_lorawan_esp32s3.upload.wait_for_upload_port=false + +dfrobot_lorawan_esp32s3.serial.disableDTR=false +dfrobot_lorawan_esp32s3.serial.disableRTS=false + +dfrobot_lorawan_esp32s3.build.tarch=xtensa +dfrobot_lorawan_esp32s3.build.bootloader_addr=0x0 +dfrobot_lorawan_esp32s3.build.target=esp32s3 +dfrobot_lorawan_esp32s3.build.mcu=esp32s3 +dfrobot_lorawan_esp32s3.build.core=esp32 +dfrobot_lorawan_esp32s3.build.variant=dfrobot_lorawan_esp32s3 +dfrobot_lorawan_esp32s3.build.board=DFROBOT_LORAWAN_ESP32S3 +dfrobot_lorawan_esp32s3.build.usb_mode=1 +dfrobot_lorawan_esp32s3.build.cdc_on_boot=1 +dfrobot_lorawan_esp32s3.build.msc_on_boot=0 +dfrobot_lorawan_esp32s3.build.dfu_on_boot=0 +dfrobot_lorawan_esp32s3.build.f_cpu=240000000L +dfrobot_lorawan_esp32s3.build.flash_size=4MB +dfrobot_lorawan_esp32s3.build.flash_freq=80m +dfrobot_lorawan_esp32s3.build.flash_mode=dio +dfrobot_lorawan_esp32s3.build.boot=qio +dfrobot_lorawan_esp32s3.build.boot_freq=80m +dfrobot_lorawan_esp32s3.build.partitions=default +dfrobot_lorawan_esp32s3.build.defines=-D{build.band} +dfrobot_lorawan_esp32s3.build.loop_core= +dfrobot_lorawan_esp32s3.build.event_core= +dfrobot_lorawan_esp32s3.build.psram_type=qspi +dfrobot_lorawan_esp32s3.build.memory_type={build.flash_type}_{build.psram_type} +dfrobot_lorawan_esp32s3.build.region= + +dfrobot_lorawan_esp32s3.menu.FlashMode.qio=QIO 80MHz +dfrobot_lorawan_esp32s3.menu.FlashMode.qio.build.flash_mode=dio +dfrobot_lorawan_esp32s3.menu.FlashMode.qio.build.boot=qio +dfrobot_lorawan_esp32s3.menu.FlashMode.qio.build.boot_freq=80m +dfrobot_lorawan_esp32s3.menu.FlashMode.qio.build.flash_freq=80m +dfrobot_lorawan_esp32s3.menu.FlashMode.qio.build.flash_type=qio +dfrobot_lorawan_esp32s3.menu.FlashMode.qio120=QIO 120MHz +dfrobot_lorawan_esp32s3.menu.FlashMode.qio120.build.flash_mode=dio +dfrobot_lorawan_esp32s3.menu.FlashMode.qio120.build.boot=qio +dfrobot_lorawan_esp32s3.menu.FlashMode.qio120.build.boot_freq=120m +dfrobot_lorawan_esp32s3.menu.FlashMode.qio120.build.flash_freq=80m +dfrobot_lorawan_esp32s3.menu.FlashMode.qio120.build.flash_type=qio +dfrobot_lorawan_esp32s3.menu.FlashMode.dio=DIO 80MHz +dfrobot_lorawan_esp32s3.menu.FlashMode.dio.build.flash_mode=dio +dfrobot_lorawan_esp32s3.menu.FlashMode.dio.build.boot=dio +dfrobot_lorawan_esp32s3.menu.FlashMode.dio.build.boot_freq=80m +dfrobot_lorawan_esp32s3.menu.FlashMode.dio.build.flash_freq=80m +dfrobot_lorawan_esp32s3.menu.FlashMode.dio.build.flash_type=qio + +dfrobot_lorawan_esp32s3.menu.FlashSize.4M=4MB (32Mb) +dfrobot_lorawan_esp32s3.menu.FlashSize.4M.build.flash_size=4MB + +dfrobot_lorawan_esp32s3.menu.LoopCore.1=Core 1 +dfrobot_lorawan_esp32s3.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +dfrobot_lorawan_esp32s3.menu.LoopCore.0=Core 0 +dfrobot_lorawan_esp32s3.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +dfrobot_lorawan_esp32s3.menu.EventsCore.1=Core 1 +dfrobot_lorawan_esp32s3.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +dfrobot_lorawan_esp32s3.menu.EventsCore.0=Core 0 +dfrobot_lorawan_esp32s3.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 +dfrobot_lorawan_esp32s3.menu.USBMode.hwcdc=Hardware CDC and JTAG +dfrobot_lorawan_esp32s3.menu.USBMode.hwcdc.build.usb_mode=1 +dfrobot_lorawan_esp32s3.menu.USBMode.default=USB-OTG (TinyUSB) +dfrobot_lorawan_esp32s3.menu.USBMode.default.build.usb_mode=0 + +dfrobot_lorawan_esp32s3.menu.CDCOnBoot.default=Disabled +dfrobot_lorawan_esp32s3.menu.CDCOnBoot.default.build.cdc_on_boot=0 +dfrobot_lorawan_esp32s3.menu.CDCOnBoot.cdc=Enabled +dfrobot_lorawan_esp32s3.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 + +dfrobot_lorawan_esp32s3.menu.MSCOnBoot.default=Disabled +dfrobot_lorawan_esp32s3.menu.MSCOnBoot.default.build.msc_on_boot=0 +dfrobot_lorawan_esp32s3.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +dfrobot_lorawan_esp32s3.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +dfrobot_lorawan_esp32s3.menu.DFUOnBoot.default=Disabled +dfrobot_lorawan_esp32s3.menu.DFUOnBoot.default.build.dfu_on_boot=0 +dfrobot_lorawan_esp32s3.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +dfrobot_lorawan_esp32s3.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +dfrobot_lorawan_esp32s3.menu.UploadMode.default=UART0 / Hardware CDC +dfrobot_lorawan_esp32s3.menu.UploadMode.default.upload.use_1200bps_touch=false +dfrobot_lorawan_esp32s3.menu.UploadMode.default.upload.wait_for_upload_port=false +dfrobot_lorawan_esp32s3.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +dfrobot_lorawan_esp32s3.menu.UploadMode.cdc.upload.use_1200bps_touch=true +dfrobot_lorawan_esp32s3.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +dfrobot_lorawan_esp32s3.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +dfrobot_lorawan_esp32s3.menu.PartitionScheme.default.build.partitions=default +dfrobot_lorawan_esp32s3.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +dfrobot_lorawan_esp32s3.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +dfrobot_lorawan_esp32s3.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +dfrobot_lorawan_esp32s3.menu.PartitionScheme.minimal.build.partitions=minimal +dfrobot_lorawan_esp32s3.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +dfrobot_lorawan_esp32s3.menu.PartitionScheme.no_ota.build.partitions=no_ota +dfrobot_lorawan_esp32s3.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +dfrobot_lorawan_esp32s3.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +dfrobot_lorawan_esp32s3.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +dfrobot_lorawan_esp32s3.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +dfrobot_lorawan_esp32s3.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +dfrobot_lorawan_esp32s3.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +dfrobot_lorawan_esp32s3.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +dfrobot_lorawan_esp32s3.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +dfrobot_lorawan_esp32s3.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +dfrobot_lorawan_esp32s3.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +dfrobot_lorawan_esp32s3.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +dfrobot_lorawan_esp32s3.menu.PartitionScheme.huge_app.build.partitions=huge_app +dfrobot_lorawan_esp32s3.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +dfrobot_lorawan_esp32s3.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +dfrobot_lorawan_esp32s3.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +dfrobot_lorawan_esp32s3.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 +dfrobot_lorawan_esp32s3.menu.PartitionScheme.rainmaker=RainMaker 4MB +dfrobot_lorawan_esp32s3.menu.PartitionScheme.rainmaker.build.partitions=rainmaker +dfrobot_lorawan_esp32s3.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 +dfrobot_lorawan_esp32s3.menu.PartitionScheme.rainmaker_4MB=RainMaker 4MB No OTA +dfrobot_lorawan_esp32s3.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota +dfrobot_lorawan_esp32s3.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 + + +dfrobot_lorawan_esp32s3.menu.CPUFreq.240=240MHz (WiFi) +dfrobot_lorawan_esp32s3.menu.CPUFreq.240.build.f_cpu=240000000L +dfrobot_lorawan_esp32s3.menu.CPUFreq.160=160MHz (WiFi) +dfrobot_lorawan_esp32s3.menu.CPUFreq.160.build.f_cpu=160000000L +dfrobot_lorawan_esp32s3.menu.CPUFreq.80=80MHz (WiFi) +dfrobot_lorawan_esp32s3.menu.CPUFreq.80.build.f_cpu=80000000L +dfrobot_lorawan_esp32s3.menu.CPUFreq.40=40MHz +dfrobot_lorawan_esp32s3.menu.CPUFreq.40.build.f_cpu=40000000L +dfrobot_lorawan_esp32s3.menu.CPUFreq.20=20MHz +dfrobot_lorawan_esp32s3.menu.CPUFreq.20.build.f_cpu=20000000L +dfrobot_lorawan_esp32s3.menu.CPUFreq.10=10MHz +dfrobot_lorawan_esp32s3.menu.CPUFreq.10.build.f_cpu=10000000L + +dfrobot_lorawan_esp32s3.menu.UploadSpeed.921600=921600 +dfrobot_lorawan_esp32s3.menu.UploadSpeed.921600.upload.speed=921600 +dfrobot_lorawan_esp32s3.menu.UploadSpeed.115200=115200 +dfrobot_lorawan_esp32s3.menu.UploadSpeed.115200.upload.speed=115200 +dfrobot_lorawan_esp32s3.menu.UploadSpeed.256000.windows=256000 +dfrobot_lorawan_esp32s3.menu.UploadSpeed.256000.upload.speed=256000 +dfrobot_lorawan_esp32s3.menu.UploadSpeed.230400.windows.upload.speed=256000 +dfrobot_lorawan_esp32s3.menu.UploadSpeed.230400=230400 +dfrobot_lorawan_esp32s3.menu.UploadSpeed.230400.upload.speed=230400 +dfrobot_lorawan_esp32s3.menu.UploadSpeed.460800.linux=460800 +dfrobot_lorawan_esp32s3.menu.UploadSpeed.460800.macosx=460800 +dfrobot_lorawan_esp32s3.menu.UploadSpeed.460800.upload.speed=460800 +dfrobot_lorawan_esp32s3.menu.UploadSpeed.512000.windows=512000 +dfrobot_lorawan_esp32s3.menu.UploadSpeed.512000.upload.speed=512000 + +dfrobot_lorawan_esp32s3.menu.DebugLevel.none=None +dfrobot_lorawan_esp32s3.menu.DebugLevel.none.build.code_debug=0 +dfrobot_lorawan_esp32s3.menu.DebugLevel.error=Error +dfrobot_lorawan_esp32s3.menu.DebugLevel.error.build.code_debug=1 +dfrobot_lorawan_esp32s3.menu.DebugLevel.warn=Warn +dfrobot_lorawan_esp32s3.menu.DebugLevel.warn.build.code_debug=2 +dfrobot_lorawan_esp32s3.menu.DebugLevel.info=Info +dfrobot_lorawan_esp32s3.menu.DebugLevel.info.build.code_debug=3 +dfrobot_lorawan_esp32s3.menu.DebugLevel.debug=Debug +dfrobot_lorawan_esp32s3.menu.DebugLevel.debug.build.code_debug=4 +dfrobot_lorawan_esp32s3.menu.DebugLevel.verbose=Verbose +dfrobot_lorawan_esp32s3.menu.DebugLevel.verbose.build.code_debug=5 + +dfrobot_lorawan_esp32s3.menu.EraseFlash.none=Disabled +dfrobot_lorawan_esp32s3.menu.EraseFlash.none.upload.erase_cmd= +dfrobot_lorawan_esp32s3.menu.EraseFlash.all=Enabled +dfrobot_lorawan_esp32s3.menu.EraseFlash.all.upload.erase_cmd=-e + +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.0=REGION_EU868 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.0.build.band=REGION_EU868 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.1=REGION_EU433 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.1.build.band=REGION_EU433 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.2=REGION_CN470 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.2.build.band=REGION_CN470 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.3=REGION_US915 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.3.build.band=REGION_US915 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.4=REGION_AU915 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.4.build.band=REGION_AU915 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.5=REGION_CN779 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.5.build.band=REGION_CN779 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.6=REGION_AS923 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.6.build.band=REGION_AS923 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.7=REGION_KR920 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.7.build.band=REGION_KR920 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.8=REGION_IN865 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.8.build.band=REGION_IN865 +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.9=REGION_US915_HYBRID +dfrobot_lorawan_esp32s3.menu.LORAWAN_REGION.9.build.band=REGION_US915_HYBRID + ############################################################## firebeetle32.name=FireBeetle-ESP32 diff --git a/variants/dfrobot_lorawan_esp32s3/pins_arduino.h b/variants/dfrobot_lorawan_esp32s3/pins_arduino.h new file mode 100644 index 00000000000..c690cac069f --- /dev/null +++ b/variants/dfrobot_lorawan_esp32s3/pins_arduino.h @@ -0,0 +1,34 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +#define LED_BUILTIN 21 + +static const uint8_t TX = 43; +static const uint8_t RX = 44; + +static const uint8_t SDA = 8; +static const uint8_t SCL = 9; + +#define LORA_ANTPWR 42 //RXEN +#define LORA_RST 41 //RST +#define LORA_BUSY 40 //BUSY +#define LORA_DIO1 4 //DIO + +static const uint8_t LORA_SS = 10; +static const uint8_t LORA_MOSI = 6; +static const uint8_t LORA_MISO = 5; +static const uint8_t LORA_SCK = 7; + +static const uint8_t SS = 17; +static const uint8_t MOSI = 11; +static const uint8_t MISO = 13; +static const uint8_t SCK = 12; + +#define TFT_DC 14 +#define TFT_CS 17 +#define TFT_RST 15 +#define TFT_BL 16 // Backlight pin + +#endif /* Pins_Arduino_h */ From 9090b46da5ac3f955ac7ed6301422ba236525b8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Tue, 27 May 2025 12:13:28 +0200 Subject: [PATCH 135/290] feat(esp32): Zigbee power outlet example (#11296) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(esp32): Zigbee power outlet example Zigbee power outlet example * feat(esp32): Zigbee power outlet example Change username * feat(esp32): Zigbee power outlet example Remove old comment * fix(zigbee): fix power outlet compile errors and update example * fix(example): Update readme * fix(example): Update ci json file * ci(pre-commit): Apply automatic fixes * fix(): precommit codespell --------- 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_Power_Outlet/README.md | 61 +++++++++++ .../Zigbee_Power_Outlet.ino | 101 ++++++++++++++++++ .../examples/Zigbee_Power_Outlet/ci.json | 7 ++ libraries/Zigbee/keywords.txt | 1 + libraries/Zigbee/src/Zigbee.h | 2 + libraries/Zigbee/src/ep/ZigbeePowerOutlet.cpp | 58 ++++++++++ libraries/Zigbee/src/ep/ZigbeePowerOutlet.h | 41 +++++++ 8 files changed, 272 insertions(+) create mode 100644 libraries/Zigbee/examples/Zigbee_Power_Outlet/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Power_Outlet/Zigbee_Power_Outlet.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Power_Outlet/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeePowerOutlet.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeePowerOutlet.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 14fcb19b6da..c8277b32471 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -301,6 +301,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp libraries/Zigbee/src/ep/ZigbeePM25Sensor.cpp + libraries/Zigbee/src/ep/ZigbeePowerOutlet.cpp ) set(ARDUINO_LIBRARY_BLE_SRCS diff --git a/libraries/Zigbee/examples/Zigbee_Power_Outlet/README.md b/libraries/Zigbee/examples/Zigbee_Power_Outlet/README.md new file mode 100644 index 00000000000..996aa36d1a3 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Power_Outlet/README.md @@ -0,0 +1,61 @@ +@ -0,0 +1,68 @@ +# Arduino-ESP32 Zigbee On/Off Power Outlet Example + +This example shows how to configure Zigbee Router device and use it as a Home Automation (HA) on/off power outlet. + +# 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` definition. By default, it's the pin `9` (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 Coordinator Zigbee mode: `Tools -> Zigbee mode: Zigbee ZCZR (coordinator/router)`. +* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee ZCZR 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 device flashed with the example `Zigbee_Power_Outlet` is not connecting to the coordinator, erase the flash of the device before flashing the example to the board. It is recommended to do this if you re-flash the coordinator or do some big changes in the application code. +You can do the following: + +* In the Arduino IDE go to the Tools menu and set `Erase All Flash Before Sketch Upload` to `Enabled`. +* In the `Zigbee_Power_Outlet` example sketch call `Zigbee.factoryReset();`. + +***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_Power_Outlet/Zigbee_Power_Outlet.ino b/libraries/Zigbee/examples/Zigbee_Power_Outlet/Zigbee_Power_Outlet.ino new file mode 100644 index 00000000000..d9fe1b7aefe --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Power_Outlet/Zigbee_Power_Outlet.ino @@ -0,0 +1,101 @@ +// 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 simple Zigbee power outlet. + * + * The example demonstrates how to use Zigbee library to create a end device power outlet. + * The power outlet 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 Ludovic Boué (https://github.com/lboue) + */ + +#ifndef ZIGBEE_MODE_ZCZR +#error "Zigbee router mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +/* Zigbee power outlet configuration */ +#define ZIGBEE_OUTLET_ENDPOINT 1 +uint8_t led = RGB_BUILTIN; +uint8_t button = BOOT_PIN; + +ZigbeePowerOutlet zbOutlet = ZigbeePowerOutlet(ZIGBEE_OUTLET_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 + zbOutlet.setManufacturerAndModel("Espressif", "ZBPowerOutlet"); + + // Set callback function for power outlet change + zbOutlet.onPowerOutletChange(setLED); + + //Add endpoint to Zigbee Core + Serial.println("Adding ZigbeePowerOutlet endpoint to Zigbee Core"); + Zigbee.addEndpoint(&zbOutlet); + + // When all EPs are registered, start Zigbee. By default acts as ZIGBEE_END_DEVICE + if (!Zigbee.begin(ZIGBEE_ROUTER)) { + 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) == 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 state by pressing the button + zbOutlet.setState(!zbOutlet.getPowerOutletState()); + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_Power_Outlet/ci.json b/libraries/Zigbee/examples/Zigbee_Power_Outlet/ci.json new file mode 100644 index 00000000000..23decd7127c --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Power_Outlet/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=zigbee_zczr,ZigbeeMode=zczr", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" + ] +} diff --git a/libraries/Zigbee/keywords.txt b/libraries/Zigbee/keywords.txt index 586d2bdc677..4d4cd7d0606 100644 --- a/libraries/Zigbee/keywords.txt +++ b/libraries/Zigbee/keywords.txt @@ -30,6 +30,7 @@ ZigbeeRangeExtender KEYWORD1 ZigbeeVibrationSensor KEYWORD1 ZigbeeWindowCovering KEYWORD1 ZigbeeIlluminanceSensor KEYWORD1 +ZigbeePowerOutlet KEYWORD1 # Other zigbee_role_t KEYWORD1 diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index 7f44d7813af..1840a5262bb 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -16,6 +16,8 @@ #include "ep/ZigbeeLight.h" //// Controllers #include "ep/ZigbeeThermostat.h" +////Outlets +#include "ep/ZigbeePowerOutlet.h" //// Sensors #include "ep/ZigbeeAnalog.h" #include "ep/ZigbeeCarbonDioxideSensor.h" diff --git a/libraries/Zigbee/src/ep/ZigbeePowerOutlet.cpp b/libraries/Zigbee/src/ep/ZigbeePowerOutlet.cpp new file mode 100644 index 00000000000..b96ba672c04 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeePowerOutlet.cpp @@ -0,0 +1,58 @@ +#include "ZigbeePowerOutlet.h" +#if CONFIG_ZB_ENABLED + +ZigbeePowerOutlet::ZigbeePowerOutlet(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_MAINS_POWER_OUTLET_DEVICE_ID; + + esp_zb_mains_power_outlet_cfg_t outlet_cfg = ESP_ZB_DEFAULT_MAINS_POWER_OUTLET_CONFIG(); + _cluster_list = esp_zb_mains_power_outlet_clusters_create(&outlet_cfg); + _ep_config = { + .endpoint = endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_MAINS_POWER_OUTLET_DEVICE_ID, .app_device_version = 0 + }; + log_v("Outlet endpoint created %d", _endpoint); +} + +//set attribute method -> method overridden in child class +void ZigbeePowerOutlet::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) { + _current_state = *(bool *)message->attribute.data.value; + stateChanged(); + } else { + log_w("Received message ignored. Attribute ID: %d not supported for On/Off Outlet", message->attribute.id); + } + } else { + log_w("Received message ignored. Cluster ID: %d not supported for On/Off Outlet", message->info.cluster); + } +} + +void ZigbeePowerOutlet::stateChanged() { + if (_on_state_change) { + _on_state_change(_current_state); + } else { + log_w("No callback function set for outlet change"); + } +} + +bool ZigbeePowerOutlet::setState(bool state) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; + _current_state = state; + stateChanged(); + + log_v("Updating on/off outlet state to %d", state); + /* Update on/off outlet state */ + esp_zb_lock_acquire(portMAX_DELAY); + ret = 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(); + + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set outlet state: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; +} + +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeePowerOutlet.h b/libraries/Zigbee/src/ep/ZigbeePowerOutlet.h new file mode 100644 index 00000000000..1ddb19587c7 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeePowerOutlet.h @@ -0,0 +1,41 @@ +/* Class of Zigbee On/Off Power outlet endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +class ZigbeePowerOutlet : public ZigbeeEP { +public: + ZigbeePowerOutlet(uint8_t endpoint); + ~ZigbeePowerOutlet() {} + + // Use to set a cb function to be called on outlet change + void onPowerOutletChange(void (*callback)(bool)) { + _on_state_change = callback; + } + // Use to restore outlet state + void restoreState() { + stateChanged(); + } + // Use to control outlet state + bool setState(bool state); + // Use to get outlet state + bool getPowerOutletState() { + return _current_state; + } + +private: + void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override; + //callback function to be called on outlet change + void (*_on_state_change)(bool); + void stateChanged(); + + bool _current_state; +}; + +#endif // CONFIG_ZB_ENABLED From 542274d5ea5a20df5f93f317ea0b06ad5749eb68 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, 27 May 2025 12:13:47 +0200 Subject: [PATCH 136/290] feat(zigbee): Remove static variables, improve binding, new example (#11316) * feat(zigbee): Remove static variables, improve binding, new example * feat(example): Add missing header * 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_On_Off_MultiSwitch/README.md | 110 +++++++ .../Zigbee_On_Off_MultiSwitch.ino | 274 ++++++++++++++++ .../Zigbee_On_Off_MultiSwitch/ci.json | 6 + libraries/Zigbee/src/ZigbeeCore.cpp | 297 +++++++++++++++--- libraries/Zigbee/src/ZigbeeCore.h | 24 ++ libraries/Zigbee/src/ZigbeeEP.cpp | 56 +++- libraries/Zigbee/src/ZigbeeEP.h | 23 +- .../Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp | 45 ++- .../Zigbee/src/ep/ZigbeeColorDimmerSwitch.h | 7 +- libraries/Zigbee/src/ep/ZigbeeSwitch.cpp | 45 ++- libraries/Zigbee/src/ep/ZigbeeSwitch.h | 8 +- libraries/Zigbee/src/ep/ZigbeeThermostat.cpp | 62 ++-- libraries/Zigbee/src/ep/ZigbeeThermostat.h | 7 +- 13 files changed, 862 insertions(+), 102 deletions(-) create mode 100644 libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/Zigbee_On_Off_MultiSwitch.ino create mode 100644 libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/ci.json diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/README.md b/libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/README.md new file mode 100644 index 00000000000..7ec806a5a62 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/README.md @@ -0,0 +1,110 @@ +# Arduino-ESP32 Zigbee Multi-Switch Example + +This example demonstrates how to configure a Zigbee device as a multi-switch controller that can control up to three different Zigbee lights independently. The switch can operate in either coordinator or router mode, making it compatible with Home Assistant integration. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## Hardware Required + +* One development board (ESP32-H2 or ESP32-C6) acting as Zigbee multi-switch controller +* One or more Zigbee light devices (loaded with Zigbee_On_Off_Light example) +* A USB cable for power supply and programming + +### Configure the Project + +The example uses the BOOT button (pin 9) on ESP32-C6 and ESP32-H2 as the physical switch input. The switch can be configured to operate in two modes: + +1. **Coordinator Mode**: For running your own Zigbee network +2. **Router Mode**: For Home Assistant integration + +#### 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 Zigbee mode: `Tools -> Zigbee mode: Zigbee ZCZR (coordinator/router)` +* 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` + +## Features + +The multi-switch example provides the following functionality: + +1. **Light Configuration** + - Configure up to 3 different lights using their endpoint and IEEE address + - Configuration is stored in NVS (Non-Volatile Storage) and persists after power loss + - Remove configured lights when needed + +2. **Control Commands** + - Control all bound lights simultaneously: + - Turn all bound lights ON + - Turn all bound lights OFF + - Toggle all bound lights + - Control individual lights (1-3): + - Turn light ON + - Turn light OFF + - Toggle light + +3. **Network Management** + - Factory reset capability + - Open network for device joining + - View bound devices and current light configurations + +## Serial Commands + +The example accepts the following commands through the serial interface: + +* `config` - Configure a new light (requires light number, endpoint, and IEEE address) +* `remove` - Remove a configured light +* `on` - Turn all bound lights ON +* `off` - Turn all bound lights OFF +* `toggle` - Toggle all bound lights +* `1on`, `2on`, `3on` - Turn individual light ON +* `1off`, `2off`, `3off` - Turn individual light OFF +* `1toggle`, `2toggle`, `3toggle` - Toggle individual light +* `freset` - Perform factory reset +* `open_network` - Open network for device joining (only for coordinator role) + +## Troubleshooting + +If the End device flashed with the example `Zigbee_On_Off_Light` 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` +* In the `Zigbee_On_Off_Light` example sketch call `Zigbee.factoryReset()` + +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_On_Off_MultiSwitch/Zigbee_On_Off_MultiSwitch.ino b/libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/Zigbee_On_Off_MultiSwitch.ino new file mode 100644 index 00000000000..63e342b2cd0 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/Zigbee_On_Off_MultiSwitch.ino @@ -0,0 +1,274 @@ +// 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 simple Zigbee multi-light switch. + * + * The example demonstrates how to use Zigbee library to control multiple light bulbs. + * The light bulbs are Zigbee devices, which are controlled by a Zigbee coordinator/router (Multi-Switch). + * Settings are stored in NVS to not be lost after power loss. + * Configuring and controlling the lights is done via serial input. + * + * 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_ZCZR +#error "Zigbee coordinator mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" +#include + +#define ZIGBEE_ROLE ZIGBEE_ROUTER // ZIGBEE_ROUTER for HomeAssistant integration, ZIGBEE_COORDINATOR for running own network + +/* Zigbee switch configuration */ +#define SWITCH_ENDPOINT_NUMBER 1 + +uint8_t button = BOOT_PIN; + +ZigbeeSwitch zbSwitch = ZigbeeSwitch(SWITCH_ENDPOINT_NUMBER); + +int buttonState; +int lastButtonState = LOW; +unsigned long lastDebounceTime = 0; // the last time the output pin was toggled +unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers + +// To be stored in NVS to not be lost after power loss +Preferences prefs; + +zb_device_params_t light_1; +zb_device_params_t light_2; +zb_device_params_t light_3; + +void storeLightParams(zb_device_params_t *light, int light_number) { + char key[10]; + snprintf(key, sizeof(key), "light_%d", light_number); + prefs.putBytes(key, light, sizeof(zb_device_params_t)); +} + +void loadLightParams(zb_device_params_t *light, int light_number) { + char key[10]; + snprintf(key, sizeof(key), "light_%d", light_number); + prefs.getBytes(key, light, sizeof(zb_device_params_t)); +} + +/********************* Arduino functions **************************/ +void setup() { + Serial.begin(115200); + + // Initialize Preferences + prefs.begin("lights", false); // false means read/write mode + + // Load saved light parameters + loadLightParams(&light_1, 1); + loadLightParams(&light_2, 2); + loadLightParams(&light_3, 3); + + // Init button switch + pinMode(button, INPUT_PULLUP); + + // Set Zigbee device name and model + zbSwitch.setManufacturerAndModel("Espressif", "ZBMultiSwitch"); + + // Set binding settings depending on the role + if (ZIGBEE_ROLE == ZIGBEE_COORDINATOR) { + zbSwitch.allowMultipleBinding(true); // To allow binding multiple lights to the switch + } else { + zbSwitch.setManualBinding(true); //Set manual binding to true, so binding is done on Home Assistant side + } + + // Add endpoint to Zigbee Core + Serial.println("Adding ZigbeeSwitch endpoint to Zigbee Core"); + Zigbee.addEndpoint(&zbSwitch); + + // When all EPs are registered, start Zigbee with given role + if (!Zigbee.begin(ZIGBEE_ROLE)) { + 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() { + // Handle button switch in loop() + if (digitalRead(button) == LOW) { // Push button pressed + // Key debounce handling + while (digitalRead(button) == LOW) { + delay(50); + } + // Print bound devices + Serial.println("Bound devices:"); + zbSwitch.printBoundDevices(Serial); + Serial.println("Lights configured:"); + Serial.printf("Light 1: %d %s\n", light_1.endpoint, Zigbee.formatIEEEAddress(light_1.ieee_addr)); + Serial.printf("Light 2: %d %s\n", light_2.endpoint, Zigbee.formatIEEEAddress(light_2.ieee_addr)); + Serial.printf("Light 3: %d %s\n", light_3.endpoint, Zigbee.formatIEEEAddress(light_3.ieee_addr)); + } + // Handle serial input to configure and control the lights + if (Serial.available()) { + String command = Serial.readString(); + Serial.println("Command: " + command); + + if (command == "config") { + //wait for light number, endpoint and ieee address + Serial.println("Enter light number (1-3):"); + while (!Serial.available()) { + delay(100); + } + int light_number = Serial.parseInt(); + Serial.println("Enter endpoint:"); + while (!Serial.available()) { + delay(100); + } + int endpoint = Serial.parseInt(); + Serial.println("Enter ieee address:"); + while (!Serial.available()) { + delay(100); + } + String ieee_address = Serial.readStringUntil('\n'); + ieee_address.trim(); + //convert ieee address to uint8_t array (format in string is 00:00:00:00:00:00:00:00) + uint8_t ieee_address_array[8]; + int index = 0; + bool valid = true; + + // Check if the string has the correct format (8 hex pairs with colons) + if (ieee_address.length() != 23) { // 8 pairs * 2 + 7 colons + Serial.println("Invalid IEEE address format. Expected format: 00:00:00:00:00:00:00:00"); + valid = false; + } else { + for (int i = 0; i < ieee_address.length() && index < 8 && valid; i += 3) { + // Check for colon at expected positions + if (i > 0 && ieee_address.charAt(i - 1) != ':') { + valid = false; + break; + } + // Convert two hex characters to a byte + char hex[3] = {ieee_address.charAt(i), ieee_address.charAt(i + 1), '\0'}; + char *endptr; + long value = strtol(hex, &endptr, 16); + if (*endptr != '\0' || value < 0 || value > 255) { + valid = false; + break; + } + // Store bytes in reverse order to match Zigbee standard + ieee_address_array[7 - index++] = (uint8_t)value; + } + } + + if (!valid || index != 8) { + Serial.println("Invalid IEEE address. Please enter a valid address in format: 00:00:00:00:00:00:00:00"); + return; + } + //set the light parameters + if (light_number == 1) { + light_1.endpoint = endpoint; + memcpy(light_1.ieee_addr, ieee_address_array, 8); + storeLightParams(&light_1, 1); + } else if (light_number == 2) { + light_2.endpoint = endpoint; + memcpy(light_2.ieee_addr, ieee_address_array, 8); + storeLightParams(&light_2, 2); + } else if (light_number == 3) { + light_3.endpoint = endpoint; + memcpy(light_3.ieee_addr, ieee_address_array, 8); + storeLightParams(&light_3, 3); + } + Serial.printf("Light %d configured\n", light_number); + } else if (command == "remove") { + //wait for light number + Serial.println("Enter light number (1-3):"); + while (!Serial.available()) { + delay(100); + } + int light_number = Serial.parseInt(); + uint8_t ieee_address_empty[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + if (light_number == 1) { + light_1.endpoint = 0; + memcpy(light_1.ieee_addr, ieee_address_empty, 8); + storeLightParams(&light_1, 1); + } else if (light_number == 2) { + light_2.endpoint = 0; + memcpy(light_2.ieee_addr, ieee_address_empty, 8); + storeLightParams(&light_2, 2); + } else if (light_number == 3) { + light_3.endpoint = 0; + memcpy(light_3.ieee_addr, ieee_address_empty, 8); + storeLightParams(&light_3, 3); + } + Serial.printf("Light %d removed\n", light_number); + } else if (command == "on") { + Serial.println(" --> SIG Input : All Lights ON"); + zbSwitch.lightOn(); + } else if (command == "off") { + Serial.println(" --> SIG Input : All Lights OFF"); + zbSwitch.lightOff(); + } else if (command == "toggle") { + Serial.println(" --> SIG Input : All Lights Toggle"); + zbSwitch.lightToggle(); + } else if (command == "1on") { + Serial.println(" --> SIG Input : Light 1 ON"); + zbSwitch.lightOn(light_1.endpoint, light_1.ieee_addr); + } else if (command == "1off") { + Serial.println(" --> SIG Input : Light 1 OFF"); + zbSwitch.lightOff(light_1.endpoint, light_1.ieee_addr); + } else if (command == "1toggle") { + Serial.println(" --> SIG Input : Light 1 Toggle"); + zbSwitch.lightToggle(light_1.endpoint, light_1.ieee_addr); + } else if (command == "2on") { + Serial.println(" --> SIG Input : Light 2 ON"); + zbSwitch.lightOn(light_2.endpoint, light_2.ieee_addr); + } else if (command == "2off") { + Serial.println(" --> SIG Input : Light 2 OFF"); + zbSwitch.lightOff(light_2.endpoint, light_2.ieee_addr); + } else if (command == "2toggle") { + Serial.println(" --> SIG Input : Light 2 Toggle"); + zbSwitch.lightToggle(light_2.endpoint, light_2.ieee_addr); + } else if (command == "3on") { + Serial.println(" --> SIG Input : Light 3 ON"); + zbSwitch.lightOn(light_3.endpoint, light_3.ieee_addr); + } else if (command == "3off") { + Serial.println(" --> SIG Input : Light 3 OFF"); + zbSwitch.lightOff(light_3.endpoint, light_3.ieee_addr); + } else if (command == "3toggle") { + Serial.println(" --> SIG Input : Light 3 Toggle"); + zbSwitch.lightToggle(light_3.endpoint, light_3.ieee_addr); + } else if (command == "freset") { + Serial.println(" --> SIG Input : Factory Reset!"); + delay(1500); + Zigbee.factoryReset(); + } else if (command == "open_network") { + Serial.println(" --> SIG Input : Open Network"); + if (ZIGBEE_ROLE == ZIGBEE_COORDINATOR) { + Zigbee.openNetwork(180); + } else { + Serial.println("Open network is only available for coordinator role"); + } + } else { + Serial.println("Unknown command"); + } + } +} diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/ci.json b/libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/ci.json new file mode 100644 index 00000000000..e79a477da11 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee_zczr,ZigbeeMode=zczr", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y" + ] +} diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index b93542159a6..6e9cc63a1da 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -5,6 +5,7 @@ #include "ZigbeeHandlers.cpp" #include "Arduino.h" +#include #ifdef __cplusplus extern "C" { @@ -30,6 +31,7 @@ ZigbeeCore::ZigbeeCore() { _connected = false; _scan_duration = 3; // default scan duration _rx_on_when_idle = true; + _debug = false; if (!lock) { lock = xSemaphoreCreateBinary(); if (lock == NULL) { @@ -40,6 +42,7 @@ ZigbeeCore::ZigbeeCore() { //forward declaration static esp_err_t zb_action_handler(esp_zb_core_action_callback_id_t callback_id, const void *message); +bool zb_apsde_data_indication_handler(esp_zb_apsde_data_ind_t ind); bool ZigbeeCore::begin(esp_zb_cfg_t *role_cfg, bool erase_nvs) { if (!zigbeeInit(role_cfg, erase_nvs)) { @@ -173,6 +176,9 @@ bool ZigbeeCore::zigbeeInit(esp_zb_cfg_t *zb_cfg, bool erase_nvs) { return false; } + // Register APSDATA INDICATION handler to catch bind/unbind requests + esp_zb_aps_data_indication_handler_register(zb_apsde_data_indication_handler); + //Erase NVRAM before creating connection to new Coordinator if (erase_nvs) { esp_zb_nvram_erase_at_start(true); @@ -223,6 +229,13 @@ void ZigbeeCore::openNetwork(uint8_t time) { } } +void ZigbeeCore::closeNetwork() { + if (started()) { + log_v("Closing network"); + esp_zb_bdb_close_network(); + } +} + static void bdb_start_top_level_commissioning_cb(uint8_t mode_mask) { ESP_ERROR_CHECK(esp_zb_bdb_start_top_level_commissioning(mode_mask)); } @@ -234,6 +247,8 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { esp_zb_app_signal_type_t sig_type = (esp_zb_app_signal_type_t)*p_sg_p; //coordinator variables esp_zb_zdo_signal_device_annce_params_t *dev_annce_params = NULL; + //router variables + esp_zb_zdo_signal_device_update_params_t *dev_update_params = NULL; //main switch switch (sig_type) { @@ -267,7 +282,7 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { } else { // Save the channel mask to NVRAM in case of reboot which may be on a different channel after a change in the network Zigbee.setNVRAMChannelMask(1 << esp_zb_get_current_channel()); - Zigbee._connected = true; + Zigbee._connected = true; // Coordinator is always connected } Zigbee.searchBindings(); } @@ -287,6 +302,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._connected = true; esp_zb_bdb_start_top_level_commissioning(ESP_ZB_BDB_MODE_NETWORK_STEERING); } else { log_i("Restart network formation (status: %s)", esp_err_to_name(err_status)); @@ -340,20 +356,60 @@ 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()) { - // 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; + log_d("Checking endpoint %d", (*it)->getEndpoint()); + if (!(*it)->epUseManualBinding()) { + if (!(*it)->bound() || (*it)->epAllowMultipleBinding()) { + // 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) { + log_d("Device not bound to endpoint %d and it is free to bound!", (*it)->getEndpoint()); + (*it)->findEndpoint(&cmd_req); + log_d("Endpoint %d is searching for device", (*it)->getEndpoint()); + break; // Only one endpoint per device } } - if (!found) { - (*it)->findEndpoint(&cmd_req); + } + } + } + break; + case ESP_ZB_ZDO_SIGNAL_DEVICE_UPDATE: // Router + if ((zigbee_role_t)Zigbee.getRole() == ZIGBEE_ROUTER) { + dev_update_params = (esp_zb_zdo_signal_device_update_params_t *)esp_zb_app_signal_get_params(p_sg_p); + log_i("New device commissioned or rejoined (short: 0x%04hx)", dev_update_params->short_addr); + esp_zb_zdo_match_desc_req_param_t cmd_req; + cmd_req.dst_nwk_addr = dev_update_params->short_addr; + cmd_req.addr_of_interest = dev_update_params->short_addr; + // 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) { + log_d("Checking endpoint %d", (*it)->getEndpoint()); + if (!(*it)->epUseManualBinding()) { + if (!(*it)->bound() || (*it)->epAllowMultipleBinding()) { + // 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_update_params->short_addr) || (memcmp((*device)->ieee_addr, dev_update_params->long_addr, 8) == 0)) { + found = true; + log_d("Device already bound to endpoint %d", (*it)->getEndpoint()); + break; + } + } + log_d("Device not bound to endpoint %d and it is free to bound!", (*it)->getEndpoint()); + if (!found) { + (*it)->findEndpoint(&cmd_req); + log_d("Endpoint %d is searching for device", (*it)->getEndpoint()); + break; // Only one endpoint per device + } } } } @@ -380,6 +436,30 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { } } +// APS DATA INDICATION HANDLER to catch bind/unbind requests +bool zb_apsde_data_indication_handler(esp_zb_apsde_data_ind_t ind) { + if (Zigbee.getDebugMode()) { + log_d("APSDE INDICATION - Received APSDE-DATA indication, status: %d", ind.status); + log_d( + "APSDE INDICATION - dst_endpoint: %d, src_endpoint: %d, dst_addr_mode: %d, src_addr_mode: %d, cluster_id: 0x%04x, asdu_length: %d", ind.dst_endpoint, + ind.src_endpoint, ind.dst_addr_mode, ind.src_addr_mode, ind.cluster_id, ind.asdu_length + ); + log_d( + "APSDE INDICATION - dst_short_addr: 0x%04x, src_short_addr: 0x%04x, profile_id: 0x%04x, security_status: %d, lqi: %d, rx_time: %d", ind.dst_short_addr, + ind.src_short_addr, ind.profile_id, ind.security_status, ind.lqi, ind.rx_time + ); + } + if (ind.status == 0x00) { + // Catch bind/unbind requests to update the bound devices list + if (ind.cluster_id == 0x21 || ind.cluster_id == 0x22) { + Zigbee.searchBindings(); + } + } else { + log_e("APSDE INDICATION - Invalid status of APSDE-DATA indication, error code: %d", ind.status); + } + return false; //False to let the stack process the message as usual +} + void ZigbeeCore::factoryReset(bool restart) { if (restart) { log_v("Factory resetting Zigbee stack, device will reboot"); @@ -444,63 +524,194 @@ void ZigbeeCore::scanDelete() { _scan_status = ZB_SCAN_FAILED; } -// Recall bounded devices from the binding table after reboot +// Recall bounded devices from the binding table after reboot or when requested 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"); + // Clear all bound devices since there are no entries + for (std::list::iterator it = Zigbee.ep_objects.begin(); it != Zigbee.ep_objects.end(); ++it) { + log_d("Clearing bound devices for EP %d", (*it)->getEndpoint()); + (*it)->clearBoundDevices(); + } free(req); return; } + // Create a set to track found devices using both short and IEEE addresses + struct DeviceIdentifier { + uint8_t endpoint; + uint16_t short_addr; + esp_zb_ieee_addr_t ieee_addr; + bool is_ieee; + + bool operator<(const DeviceIdentifier &other) const { + if (endpoint != other.endpoint) { + return endpoint < other.endpoint; + } + if (is_ieee != other.is_ieee) { + return is_ieee < other.is_ieee; + } + if (is_ieee) { + return memcmp(ieee_addr, other.ieee_addr, sizeof(esp_zb_ieee_addr_t)) < 0; + } + return short_addr < other.short_addr; + } + }; + static std::set found_devices; + static std::vector all_records; + + // If this is the first chunk (index 0), clear the previous data + if (table_info->index == 0) { + found_devices.clear(); + all_records.clear(); + } + + // Add current records to our collection 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, + "Processing record %d: src_endp %d, dst_endp %d, cluster_id 0x%04x, dst_addr_mode %d", i, record->src_endp, record->dst_endp, record->cluster_id, record->dst_addr_mode ); + all_records.push_back(*record); + record = record->next; + } - 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)); + // If this is not the last chunk, request the next one + if (table_info->index + table_info->count < table_info->total) { + log_d("Requesting next chunk of binding table (current index: %d, count: %d, total: %d)", table_info->index, table_info->count, table_info->total); + req->start_index = table_info->index + table_info->count; + esp_zb_zdo_binding_table_req(req, bindingTableCb, req); + } else { + // This is the last chunk, process all records + log_d("Processing final chunk of binding table, total records: %d", all_records.size()); + for (const auto &record : all_records) { + + DeviceIdentifier dev_id; + dev_id.endpoint = record.src_endp; + dev_id.is_ieee = (record.dst_addr_mode == ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT); + + if (dev_id.is_ieee) { + memcpy(dev_id.ieee_addr, record.dst_address.addr_long, sizeof(esp_zb_ieee_addr_t)); + dev_id.short_addr = 0xFFFF; // Invalid short address + } else { + dev_id.short_addr = record.dst_address.addr_short; + memset(dev_id.ieee_addr, 0, sizeof(esp_zb_ieee_addr_t)); + } + + // Track this device as found + found_devices.insert(dev_id); } - // Add to list of bound devices of proper endpoint + // Now process each endpoint and update its bound devices 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] - ); + log_d("Processing endpoint %d", (*it)->getEndpoint()); + std::list bound_devices = (*it)->getBoundDevices(); + std::list devices_to_remove; + + // First, identify devices that need to be removed + for (std::list::iterator dev_it = bound_devices.begin(); dev_it != bound_devices.end(); ++dev_it) { + DeviceIdentifier dev_id; + dev_id.endpoint = (*it)->getEndpoint(); + + // Create both short and IEEE address identifiers for the device + bool found = false; + + // Check if device exists with short address + if ((*dev_it)->short_addr != 0xFFFF) { + dev_id.is_ieee = false; + dev_id.short_addr = (*dev_it)->short_addr; + memset(dev_id.ieee_addr, 0, sizeof(esp_zb_ieee_addr_t)); + if (found_devices.find(dev_id) != found_devices.end()) { + found = true; + } + } + + // Check if device exists with IEEE address + if (!found) { + dev_id.is_ieee = true; + memcpy(dev_id.ieee_addr, (*dev_it)->ieee_addr, sizeof(esp_zb_ieee_addr_t)); + dev_id.short_addr = 0xFFFF; + if (found_devices.find(dev_id) != found_devices.end()) { + found = true; + } + } + + if (!found) { + devices_to_remove.push_back(*dev_it); + } + } + + // Remove devices that are no longer in the binding table + for (std::list::iterator dev_it = devices_to_remove.begin(); dev_it != devices_to_remove.end(); ++dev_it) { + (*it)->removeBoundDevice(*dev_it); + free(*dev_it); + } + + // Now add new devices from the binding table + for (const auto &record : all_records) { + if (record.src_endp == (*it)->getEndpoint()) { + log_d("Processing binding record for EP %d", record.src_endp); + zb_device_params_t *device = (zb_device_params_t *)calloc(1, sizeof(zb_device_params_t)); + if (!device) { + log_e("Failed to allocate memory for device params"); + continue; + } + device->endpoint = record.dst_endp; + + bool is_ieee = (record.dst_addr_mode == ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT); + if (is_ieee) { + memcpy(device->ieee_addr, record.dst_address.addr_long, sizeof(esp_zb_ieee_addr_t)); + device->short_addr = 0xFFFF; + } else { + device->short_addr = record.dst_address.addr_short; + memset(device->ieee_addr, 0, sizeof(esp_zb_ieee_addr_t)); + } + + // Check if device already exists + bool device_exists = false; + for (std::list::iterator dev_it = bound_devices.begin(); dev_it != bound_devices.end(); ++dev_it) { + if (is_ieee) { + if (memcmp((*dev_it)->ieee_addr, device->ieee_addr, sizeof(esp_zb_ieee_addr_t)) == 0) { + device_exists = true; + break; + } + } else { + if ((*dev_it)->short_addr == device->short_addr) { + device_exists = true; + break; + } + } + } + + if (!device_exists) { + (*it)->addBoundDevice(device); + log_d( + "Device bound to EP %d -> device endpoint: %d, %s: %s", record.src_endp, device->endpoint, is_ieee ? "ieee addr" : "short addr", + is_ieee ? formatIEEEAddress(device->ieee_addr) : formatShortAddress(device->short_addr) + ); + } else { + log_d("Device already exists, freeing allocated memory"); + free(device); // Free the device if it already exists + } + } } } - 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; + // Print bound devices + log_d("Filling bounded devices finished"); + free(req); } - } - - if (done) { - // Print bound devices - log_d("Filling bounded devices finished"); + } else { + log_e("Binding table request failed with status: %d", zdo_status); free(req); } } diff --git a/libraries/Zigbee/src/ZigbeeCore.h b/libraries/Zigbee/src/ZigbeeCore.h index 06c3ec4551a..69c91c63ac4 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -8,6 +8,7 @@ #include "esp_zigbee_core.h" #include "zdo/esp_zigbee_zdo_common.h" +#include "aps/esp_zigbee_aps.h" #include #include #include "ZigbeeEP.h" @@ -100,6 +101,7 @@ class ZigbeeCore { uint8_t _open_network; zigbee_scan_result_t *_scan_result; SemaphoreHandle_t lock; + bool _debug; 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); @@ -156,6 +158,7 @@ class ZigbeeCore { } void setRebootOpenNetwork(uint8_t time); void openNetwork(uint8_t time); + void closeNetwork(); //scan_duration Time spent scanning each channel, in units of ((1 << scan_duration) + 1) * a beacon time. (15.36 microseconds) void scanNetworks(uint32_t channel_mask = ESP_ZB_TRANSCEIVER_ALL_CHANNELS_MASK, uint8_t scan_duration = 5); @@ -166,8 +169,29 @@ class ZigbeeCore { void factoryReset(bool restart = true); + void setDebugMode(bool debug) { + _debug = debug; + } + bool getDebugMode() { + return _debug; + } + // Friend function declaration to allow access to private members friend void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct); + friend bool zb_apsde_data_indication_handler(esp_zb_apsde_data_ind_t ind); + + // Helper functions for formatting addresses + static inline const char *formatIEEEAddress(const esp_zb_ieee_addr_t addr) { + static char buf[24]; + snprintf(buf, sizeof(buf), "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", addr[7], addr[6], addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]); + return buf; + } + + static inline const char *formatShortAddress(uint16_t addr) { + static char buf[7]; + snprintf(buf, sizeof(buf), "0x%04X", addr); + return buf; + } }; extern ZigbeeCore Zigbee; diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index cf52a902983..1d3df126ce8 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -7,11 +7,6 @@ #include "esp_zigbee_cluster.h" #include "zcl/esp_zigbee_zcl_power_config.h" -bool ZigbeeEP::_is_bound = false; -bool ZigbeeEP::_allow_multiple_binding = false; - -//TODO: is_bound and allow_multiple_binding to make not static - /* Zigbee End Device Class */ ZigbeeEP::ZigbeeEP(uint8_t endpoint) { _endpoint = endpoint; @@ -22,6 +17,9 @@ ZigbeeEP::ZigbeeEP(uint8_t endpoint) { _read_model = NULL; _read_manufacturer = NULL; _time_status = 0; + _is_bound = false; + _use_manual_binding = false; + _allow_multiple_binding = false; if (!lock) { lock = xSemaphoreCreateBinary(); if (lock == NULL) { @@ -562,6 +560,54 @@ void ZigbeeEP::requestOTAUpdate() { esp_zb_lock_release(); } +void ZigbeeEP::removeBoundDevice(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { + log_d( + "Attempting to remove device with endpoint %d and 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] + ); + + for (std::list::iterator it = _bound_devices.begin(); it != _bound_devices.end(); ++it) { + if ((*it)->endpoint == endpoint && memcmp((*it)->ieee_addr, ieee_addr, sizeof(esp_zb_ieee_addr_t)) == 0) { + log_d("Found matching device, removing it"); + _bound_devices.erase(it); + if (_bound_devices.empty()) { + _is_bound = false; + } + return; + } + } + log_w("No matching device found for removal"); +} + +void ZigbeeEP::removeBoundDevice(zb_device_params_t *device) { + if (!device) { + log_e("Invalid device parameters provided"); + return; + } + + log_d( + "Attempting to remove device with endpoint %d, short address 0x%04x, 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] + ); + + for (std::list::iterator it = _bound_devices.begin(); it != _bound_devices.end(); ++it) { + bool endpoint_matches = ((*it)->endpoint == device->endpoint); + bool short_addr_matches = (device->short_addr != 0xFFFF && (*it)->short_addr == device->short_addr); + bool ieee_addr_matches = (memcmp((*it)->ieee_addr, device->ieee_addr, sizeof(esp_zb_ieee_addr_t)) == 0); + + if (endpoint_matches && (short_addr_matches || ieee_addr_matches)) { + log_d("Found matching device by %s, removing it", short_addr_matches ? "short address" : "IEEE address"); + _bound_devices.erase(it); + if (_bound_devices.empty()) { + _is_bound = false; + } + return; + } + } + log_w("No matching device found for removal"); +} + const char *ZigbeeEP::esp_zb_zcl_status_to_name(esp_zb_zcl_status_t status) { switch (status) { case ESP_ZB_ZCL_STATUS_SUCCESS: return "Success"; diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index e13b3b59de9..fe22f31faaf 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -66,12 +66,15 @@ class ZigbeeEP { return _bound_devices; } - static bool bound() { + bool bound() { return _is_bound; } - static void allowMultipleBinding(bool bind) { + void allowMultipleBinding(bool bind) { _allow_multiple_binding = bind; } + void setManualBinding(bool bind) { + _use_manual_binding = bind; + } // Set Manufacturer name and model bool setManufacturerAndModel(const char *name, const char *model); @@ -98,6 +101,9 @@ class ZigbeeEP { bool epAllowMultipleBinding() { return _allow_multiple_binding; } + bool epUseManualBinding() { + return _use_manual_binding; + } // OTA methods /** @@ -138,6 +144,14 @@ class ZigbeeEP { _is_bound = true; } + virtual void removeBoundDevice(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr); + virtual void removeBoundDevice(zb_device_params_t *device); + + virtual void clearBoundDevices() { + _bound_devices.clear(); + _is_bound = false; + } + void onIdentify(void (*callback)(uint16_t)) { _on_identify = callback; } @@ -157,8 +171,9 @@ class ZigbeeEP { esp_zb_ha_standard_devices_t _device_id; esp_zb_endpoint_config_t _ep_config; esp_zb_cluster_list_t *_cluster_list; - static bool _is_bound; - static bool _allow_multiple_binding; + bool _is_bound; + bool _allow_multiple_binding; + bool _use_manual_binding; std::list _bound_devices; SemaphoreHandle_t lock; zb_power_source_t _power_source; diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp index 68f287153cb..935d638324f 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp @@ -6,7 +6,8 @@ ZigbeeColorDimmerSwitch *ZigbeeColorDimmerSwitch::_instance = nullptr; ZigbeeColorDimmerSwitch::ZigbeeColorDimmerSwitch(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_COLOR_DIMMER_SWITCH_DEVICE_ID; - _instance = this; // Set the static pointer to this instance + _instance = this; // Set the static pointer to this instance + _device = nullptr; // Initialize light pointer to null esp_zb_color_dimmable_switch_cfg_t switch_cfg = ESP_ZB_DEFAULT_COLOR_DIMMABLE_SWITCH_CONFIG(); _cluster_list = esp_zb_color_dimmable_switch_clusters_create(&switch_cfg); @@ -17,20 +18,39 @@ ZigbeeColorDimmerSwitch::ZigbeeColorDimmerSwitch(uint8_t endpoint) : ZigbeeEP(en } void ZigbeeColorDimmerSwitch::bindCb(esp_zb_zdp_status_t zdo_status, void *user_ctx) { + ZigbeeColorDimmerSwitch *instance = static_cast(user_ctx); if (zdo_status == ESP_ZB_ZDP_STATUS_SUCCESS) { log_i("Bound successfully!"); - if (user_ctx) { - zb_device_params_t *light = (zb_device_params_t *)user_ctx; + if (instance->_device) { + zb_device_params_t *light = (zb_device_params_t *)instance->_device; log_i("The light originating from address(0x%x) on endpoint(%d)", light->short_addr, light->endpoint); - _instance->_bound_devices.push_back(light); + log_d("Light bound to a switch on EP %d", instance->_endpoint); + instance->_bound_devices.push_back(light); } - _is_bound = true; + instance->_is_bound = true; } else { - log_e("Binding failed!"); + instance->_device = nullptr; + } +} + +void ZigbeeColorDimmerSwitch::bindCbWrapper(esp_zb_zdp_status_t zdo_status, void *user_ctx) { + ZigbeeColorDimmerSwitch *instance = static_cast(user_ctx); + if (instance) { + log_d("bindCbWrapper on EP %d", instance->_endpoint); + instance->bindCb(zdo_status, user_ctx); + } +} + +void ZigbeeColorDimmerSwitch::findCbWrapper(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx) { + ZigbeeColorDimmerSwitch *instance = static_cast(user_ctx); + if (instance) { + log_d("findCbWrapper on EP %d", instance->_endpoint); + instance->findCb(zdo_status, addr, endpoint, user_ctx); } } void ZigbeeColorDimmerSwitch::findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx) { + ZigbeeColorDimmerSwitch *instance = static_cast(user_ctx); if (zdo_status == ESP_ZB_ZDP_STATUS_SUCCESS) { log_d("Found light endpoint"); esp_zb_zdo_bind_req_param_t bind_req; @@ -39,22 +59,23 @@ void ZigbeeColorDimmerSwitch::findCb(esp_zb_zdp_status_t zdo_status, uint16_t ad light->short_addr = addr; esp_zb_ieee_address_by_short(light->short_addr, light->ieee_addr); esp_zb_get_long_address(bind_req.src_address); - bind_req.src_endp = *((uint8_t *)user_ctx); //_endpoint; + bind_req.src_endp = instance->_endpoint; bind_req.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_ON_OFF; bind_req.dst_addr_mode = ESP_ZB_ZDO_BIND_DST_ADDR_MODE_64_BIT_EXTENDED; memcpy(bind_req.dst_address_u.addr_long, light->ieee_addr, sizeof(esp_zb_ieee_addr_t)); bind_req.dst_endp = endpoint; bind_req.req_dst_addr = esp_zb_get_short_address(); + instance->_device = light; log_v("Try to bind on/off control of dimmable light"); - esp_zb_zdo_device_bind_req(&bind_req, bindCb, NULL); + esp_zb_zdo_device_bind_req(&bind_req, ZigbeeColorDimmerSwitch::bindCbWrapper, NULL); bind_req.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_LEVEL_CONTROL; log_v("Try to bind level control of dimmable light"); - esp_zb_zdo_device_bind_req(&bind_req, bindCb, NULL); + esp_zb_zdo_device_bind_req(&bind_req, ZigbeeColorDimmerSwitch::bindCbWrapper, NULL); bind_req.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL; log_v("Try to bind color control of dimmable light"); - esp_zb_zdo_device_bind_req(&bind_req, bindCb, (void *)light); + esp_zb_zdo_device_bind_req(&bind_req, ZigbeeColorDimmerSwitch::bindCbWrapper, this); } else { - log_v("No color dimmable light endpoint found"); + log_d("No color dimmable light endpoint found"); } } @@ -70,7 +91,7 @@ void ZigbeeColorDimmerSwitch::findEndpoint(esp_zb_zdo_match_desc_req_param_t *cm .num_out_clusters = 3, .cluster_list = cluster_list, }; - esp_zb_zdo_match_cluster(&color_dimmable_light_req, findCb, &_endpoint); + esp_zb_zdo_match_cluster(&color_dimmable_light_req, ZigbeeColorDimmerSwitch::findCbWrapper, this); } // Methods to control the light diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h index dbe50a20230..ada1f75fbb4 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h @@ -47,10 +47,13 @@ class ZigbeeColorDimmerSwitch : public ZigbeeEP { private: // save instance of the class in order to use it in static functions static ZigbeeColorDimmerSwitch *_instance; + zb_device_params_t *_device; void findEndpoint(esp_zb_zdo_match_desc_req_param_t *cmd_req); - static void bindCb(esp_zb_zdp_status_t zdo_status, void *user_ctx); - static void findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx); + void bindCb(esp_zb_zdp_status_t zdo_status, void *user_ctx); + void findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx); + static void bindCbWrapper(esp_zb_zdp_status_t zdo_status, void *user_ctx); + static void findCbWrapper(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx); void calculateXY(uint8_t red, uint8_t green, uint8_t blue, uint16_t &x, uint16_t &y); }; diff --git a/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp b/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp index 86c68ae1870..38fd7d370fb 100644 --- a/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp @@ -7,6 +7,7 @@ ZigbeeSwitch *ZigbeeSwitch::_instance = nullptr; ZigbeeSwitch::ZigbeeSwitch(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_ON_OFF_SWITCH_DEVICE_ID; _instance = this; // Set the static pointer to this instance + _device = nullptr; esp_zb_on_off_switch_cfg_t switch_cfg = ESP_ZB_DEFAULT_ON_OFF_SWITCH_CONFIG(); _cluster_list = esp_zb_on_off_switch_clusters_create(&switch_cfg); @@ -15,18 +16,40 @@ ZigbeeSwitch::ZigbeeSwitch(uint8_t endpoint) : ZigbeeEP(endpoint) { } void ZigbeeSwitch::bindCb(esp_zb_zdp_status_t zdo_status, void *user_ctx) { + ZigbeeSwitch *instance = static_cast(user_ctx); if (zdo_status == ESP_ZB_ZDP_STATUS_SUCCESS) { log_i("Bound successfully!"); - if (user_ctx) { - zb_device_params_t *light = (zb_device_params_t *)user_ctx; + if (instance->_device) { + zb_device_params_t *light = (zb_device_params_t *)instance->_device; log_i("The light originating from address(0x%x) on endpoint(%d)", light->short_addr, light->endpoint); - _instance->_bound_devices.push_back(light); + log_d("Light bound to a switch on EP %d", instance->_endpoint); + instance->_bound_devices.push_back(light); } - _is_bound = true; + instance->_is_bound = true; + } else { + instance->_device = nullptr; + } +} + +void ZigbeeSwitch::bindCbWrapper(esp_zb_zdp_status_t zdo_status, void *user_ctx) { + ZigbeeSwitch *instance = static_cast(user_ctx); + if (instance) { + log_d("bindCbWrapper on EP %d", instance->_endpoint); + instance->bindCb(zdo_status, user_ctx); + } +} + +// Static wrapper for findCb +void ZigbeeSwitch::findCbWrapper(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx) { + ZigbeeSwitch *instance = static_cast(user_ctx); + if (instance) { + log_d("findCbWrapper on EP %d", instance->_endpoint); + instance->findCb(zdo_status, addr, endpoint, user_ctx); } } void ZigbeeSwitch::findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx) { + ZigbeeSwitch *instance = static_cast(user_ctx); if (zdo_status == ESP_ZB_ZDP_STATUS_SUCCESS) { log_d("Found light endpoint"); esp_zb_zdo_bind_req_param_t bind_req; @@ -34,15 +57,21 @@ void ZigbeeSwitch::findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t light->endpoint = endpoint; light->short_addr = addr; esp_zb_ieee_address_by_short(light->short_addr, light->ieee_addr); + log_d("Light found: short address(0x%x), endpoint(%d)", light->short_addr, light->endpoint); + esp_zb_get_long_address(bind_req.src_address); - bind_req.src_endp = *((uint8_t *)user_ctx); //_endpoint; + bind_req.src_endp = instance->_endpoint; bind_req.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_ON_OFF; bind_req.dst_addr_mode = ESP_ZB_ZDO_BIND_DST_ADDR_MODE_64_BIT_EXTENDED; memcpy(bind_req.dst_address_u.addr_long, light->ieee_addr, sizeof(esp_zb_ieee_addr_t)); bind_req.dst_endp = endpoint; bind_req.req_dst_addr = esp_zb_get_short_address(); - log_i("Try to bind On/Off"); - esp_zb_zdo_device_bind_req(&bind_req, bindCb, (void *)light); + log_v("Try to bind On/Off"); + //save light params in the class + instance->_device = light; + + log_d("Find callback on EP %d", instance->_endpoint); + esp_zb_zdo_device_bind_req(&bind_req, ZigbeeSwitch::bindCbWrapper, this); } else { log_d("No light endpoint found"); } @@ -59,7 +88,7 @@ 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); + esp_zb_zdo_match_cluster(&on_off_req, ZigbeeSwitch::findCbWrapper, this); } // Methods to control the light diff --git a/libraries/Zigbee/src/ep/ZigbeeSwitch.h b/libraries/Zigbee/src/ep/ZigbeeSwitch.h index 5c527bec6e3..0e7011c3312 100644 --- a/libraries/Zigbee/src/ep/ZigbeeSwitch.h +++ b/libraries/Zigbee/src/ep/ZigbeeSwitch.h @@ -37,10 +37,12 @@ class ZigbeeSwitch : public ZigbeeEP { private: // save instance of the class in order to use it in static functions static ZigbeeSwitch *_instance; - + zb_device_params_t *_device; void findEndpoint(esp_zb_zdo_match_desc_req_param_t *cmd_req); - static void bindCb(esp_zb_zdp_status_t zdo_status, void *user_ctx); - static void findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx); + void bindCb(esp_zb_zdp_status_t zdo_status, void *user_ctx); + void findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx); + static void findCbWrapper(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx); + static void bindCbWrapper(esp_zb_zdp_status_t zdo_status, void *user_ctx); }; #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp b/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp index 357bcaed1bc..633a60d0ff9 100644 --- a/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp @@ -10,7 +10,8 @@ ZigbeeThermostat *ZigbeeThermostat::_instance = nullptr; ZigbeeThermostat::ZigbeeThermostat(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_THERMOSTAT_DEVICE_ID; - _instance = this; // Set the static pointer to this instance + _instance = this; // Set the static pointer to this instance + _device = nullptr; // Initialize sensor pointer to null //use custom config to avoid narrowing error -> must be fixed in zigbee-sdk esp_zb_thermostat_cfg_t thermostat_cfg = ZB_DEFAULT_THERMOSTAT_CONFIG(); @@ -29,21 +30,39 @@ ZigbeeThermostat::ZigbeeThermostat(uint8_t endpoint) : ZigbeeEP(endpoint) { } void ZigbeeThermostat::bindCb(esp_zb_zdp_status_t zdo_status, void *user_ctx) { + ZigbeeThermostat *instance = static_cast(user_ctx); if (zdo_status == ESP_ZB_ZDP_STATUS_SUCCESS) { - if (user_ctx) { - zb_device_params_t *sensor = (zb_device_params_t *)user_ctx; - log_i("The temperature sensor originating from address(0x%x) on endpoint(%d)", sensor->short_addr, sensor->endpoint); - _instance->_bound_devices.push_back(sensor); - } else { - log_v("Local binding success"); + log_i("Bound successfully!"); + if (instance->_device) { + zb_device_params_t *sensor = (zb_device_params_t *)instance->_device; + log_i("The sensor originating from address(0x%x) on endpoint(%d)", sensor->short_addr, sensor->endpoint); + log_d("Sensor bound to thermostat on EP %d", instance->_endpoint); + instance->_bound_devices.push_back(sensor); } - _is_bound = true; + instance->_is_bound = true; } else { - log_e("Binding failed!"); + instance->_device = nullptr; + } +} + +void ZigbeeThermostat::bindCbWrapper(esp_zb_zdp_status_t zdo_status, void *user_ctx) { + ZigbeeThermostat *instance = static_cast(user_ctx); + if (instance) { + log_d("bindCbWrapper on EP %d", instance->_endpoint); + instance->bindCb(zdo_status, user_ctx); + } +} + +void ZigbeeThermostat::findCbWrapper(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx) { + ZigbeeThermostat *instance = static_cast(user_ctx); + if (instance) { + log_d("findCbWrapper on EP %d", instance->_endpoint); + instance->findCb(zdo_status, addr, endpoint, user_ctx); } } void ZigbeeThermostat::findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx) { + ZigbeeThermostat *instance = static_cast(user_ctx); if (zdo_status == ESP_ZB_ZDP_STATUS_SUCCESS) { log_i("Found temperature sensor"); esp_zb_zdo_bind_req_param_t bind_req; @@ -56,37 +75,34 @@ void ZigbeeThermostat::findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uin /* 1. Send binding request to the sensor */ bind_req.req_dst_addr = addr; - log_d("Request temperature sensor to bind us"); - - /* populate the src information of the binding */ memcpy(bind_req.src_address, sensor->ieee_addr, sizeof(esp_zb_ieee_addr_t)); bind_req.src_endp = endpoint; bind_req.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; - log_d("Bind temperature sensor"); - - /* populate the dst information of the binding */ bind_req.dst_addr_mode = ESP_ZB_ZDO_BIND_DST_ADDR_MODE_64_BIT_EXTENDED; esp_zb_get_long_address(bind_req.dst_address_u.addr_long); - bind_req.dst_endp = *((uint8_t *)user_ctx); //_endpoint; + bind_req.dst_endp = instance->_endpoint; log_i("Request temperature sensor to bind us"); - esp_zb_zdo_device_bind_req(&bind_req, bindCb, NULL); + esp_zb_zdo_device_bind_req(&bind_req, ZigbeeThermostat::bindCbWrapper, NULL); /* 2. Send binding request to self */ bind_req.req_dst_addr = esp_zb_get_short_address(); /* populate the src information of the binding */ esp_zb_get_long_address(bind_req.src_address); - bind_req.src_endp = *((uint8_t *)user_ctx); //_endpoint; + bind_req.src_endp = instance->_endpoint; bind_req.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; - - /* populate the dst information of the binding */ bind_req.dst_addr_mode = ESP_ZB_ZDO_BIND_DST_ADDR_MODE_64_BIT_EXTENDED; memcpy(bind_req.dst_address_u.addr_long, sensor->ieee_addr, sizeof(esp_zb_ieee_addr_t)); bind_req.dst_endp = endpoint; + log_i("Try to bind Temperature Measurement"); + //save sensor params in the class + instance->_device = sensor; - log_i("Bind temperature sensor"); - esp_zb_zdo_device_bind_req(&bind_req, bindCb, (void *)sensor); + log_d("Find callback on EP %d", instance->_endpoint); + esp_zb_zdo_device_bind_req(&bind_req, ZigbeeThermostat::bindCbWrapper, this); + } else { + log_d("No temperature sensor endpoint found"); } } @@ -96,7 +112,7 @@ void ZigbeeThermostat::findEndpoint(esp_zb_zdo_match_desc_req_param_t *param) { param->num_in_clusters = 1; param->num_out_clusters = 0; param->cluster_list = cluster_list; - esp_zb_zdo_match_cluster(param, findCb, &_endpoint); + esp_zb_zdo_match_cluster(param, ZigbeeThermostat::findCbWrapper, this); } void ZigbeeThermostat::zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_attribute_t *attribute) { diff --git a/libraries/Zigbee/src/ep/ZigbeeThermostat.h b/libraries/Zigbee/src/ep/ZigbeeThermostat.h index 7895115e1d1..acdcd68e512 100644 --- a/libraries/Zigbee/src/ep/ZigbeeThermostat.h +++ b/libraries/Zigbee/src/ep/ZigbeeThermostat.h @@ -48,6 +48,7 @@ class ZigbeeThermostat : public ZigbeeEP { private: // save instance of the class in order to use it in static functions static ZigbeeThermostat *_instance; + zb_device_params_t *_device; void (*_on_temp_recieve)(float); void (*_on_config_recieve)(float, float, float); @@ -56,8 +57,10 @@ class ZigbeeThermostat : public ZigbeeEP { float _tolerance; void findEndpoint(esp_zb_zdo_match_desc_req_param_t *cmd_req); - static void bindCb(esp_zb_zdp_status_t zdo_status, void *user_ctx); - static void findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx); + void bindCb(esp_zb_zdp_status_t zdo_status, void *user_ctx); + void findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx); + static void bindCbWrapper(esp_zb_zdp_status_t zdo_status, void *user_ctx); + static void findCbWrapper(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx); void zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_attribute_t *attribute) override; }; From 07d662a7fc71c6e8354f686e378c330eccb498b9 Mon Sep 17 00:00:00 2001 From: Vlastimil Hajek <29980246+vlastahajek@users.noreply.github.com> Date: Tue, 27 May 2025 12:15:41 +0200 Subject: [PATCH 137/290] fix: crash on watchdog timeout on iddle task (#11376) --- libraries/ESP_SR/src/esp32-hal-sr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/ESP_SR/src/esp32-hal-sr.c b/libraries/ESP_SR/src/esp32-hal-sr.c index 06db7236541..eb87ef636c1 100644 --- a/libraries/ESP_SR/src/esp32-hal-sr.c +++ b/libraries/ESP_SR/src/esp32-hal-sr.c @@ -192,6 +192,7 @@ static void audio_feed_task(void *arg) { /* Feed samples of an audio stream to the AFE_SR */ g_sr_data->afe_handle->feed(g_sr_data->afe_data, audio_buffer); + vTaskDelay(2); } vTaskDelete(NULL); } From 6c3528ac69dc7eef064a5e0efd92ce73c69f0ed1 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, 27 May 2025 12:41:38 +0200 Subject: [PATCH 138/290] feat(zigbee): Add support for Binary input EP + Analog EP extension (#11339) * feat(zigbee): Add binary input and analog extension * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat(zigbee): Remove setBinaryInputReporting * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Me No Dev --- CMakeLists.txt | 1 + .../Zigbee_Analog_Input_Output.ino | 39 +++- .../examples/Zigbee_Binary_Input/README.md | 75 ++++++ .../Zigbee_Binary_Input.ino | 112 +++++++++ .../examples/Zigbee_Binary_Input/ci.json | 7 + libraries/Zigbee/src/Zigbee.h | 1 + libraries/Zigbee/src/ep/ZigbeeAnalog.cpp | 219 +++++++++++++++++- libraries/Zigbee/src/ep/ZigbeeAnalog.h | 10 + libraries/Zigbee/src/ep/ZigbeeBinary.cpp | 144 ++++++++++++ libraries/Zigbee/src/ep/ZigbeeBinary.h | 85 +++++++ 10 files changed, 690 insertions(+), 3 deletions(-) create mode 100644 libraries/Zigbee/examples/Zigbee_Binary_Input/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Binary_Input/Zigbee_Binary_Input.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Binary_Input/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeeBinary.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeBinary.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c8277b32471..9efe4ec38bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -301,6 +301,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp libraries/Zigbee/src/ep/ZigbeePM25Sensor.cpp + libraries/Zigbee/src/ep/ZigbeeBinary.cpp libraries/Zigbee/src/ep/ZigbeePowerOutlet.cpp ) diff --git a/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino index e31407cc8be..db8a62b091e 100644 --- a/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino +++ b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino @@ -39,6 +39,9 @@ uint8_t analogPin = A0; uint8_t button = BOOT_PIN; ZigbeeAnalog zbAnalogDevice = ZigbeeAnalog(ANALOG_DEVICE_ENDPOINT_NUMBER); +ZigbeeAnalog zbAnalogTemp = ZigbeeAnalog(ANALOG_DEVICE_ENDPOINT_NUMBER + 1); +ZigbeeAnalog zbAnalogFan = ZigbeeAnalog(ANALOG_DEVICE_ENDPOINT_NUMBER + 2); +ZigbeeAnalog zbAnalogPercent = ZigbeeAnalog(ANALOG_DEVICE_ENDPOINT_NUMBER + 3); void onAnalogOutputChange(float analog_output) { Serial.printf("Received analog output change: %.1f\r\n", analog_output); @@ -57,15 +60,43 @@ void setup() { // Optional: set Zigbee device name and model zbAnalogDevice.setManufacturerAndModel("Espressif", "ZigbeeAnalogDevice"); - // Add analog clusters to Zigbee Analog according your needs + // Set up analog input zbAnalogDevice.addAnalogInput(); + zbAnalogDevice.setAnalogInputApplication(ESP_ZB_ZCL_AI_POWER_IN_WATTS_CONSUMPTION); + zbAnalogDevice.setAnalogInputDescription("Power Consumption (Watts)"); + zbAnalogDevice.setAnalogInputResolution(0.01); + + // Set up analog output zbAnalogDevice.addAnalogOutput(); + zbAnalogDevice.setAnalogOutputApplication(ESP_ZB_ZCL_AI_RPM_OTHER); + zbAnalogDevice.setAnalogOutputDescription("Fan Speed (RPM)"); // If analog output cluster is added, set callback function for analog output change zbAnalogDevice.onAnalogOutputChange(onAnalogOutputChange); + // Set up analog input + zbAnalogTemp.addAnalogInput(); + zbAnalogTemp.setAnalogInputApplication(ESP_ZB_ZCL_AI_TEMPERATURE_OTHER); + zbAnalogTemp.setAnalogInputDescription("Temperature"); + zbAnalogTemp.setAnalogInputResolution(0.1); + + // Set up analog input + zbAnalogFan.addAnalogInput(); + zbAnalogFan.setAnalogInputApplication(ESP_ZB_ZCL_AI_RPM_OTHER); + zbAnalogFan.setAnalogInputDescription("RPM"); + zbAnalogFan.setAnalogInputResolution(1); + + // Set up analog input + zbAnalogPercent.addAnalogInput(); + zbAnalogPercent.setAnalogInputApplication(ESP_ZB_ZCL_AI_PERCENTAGE_OTHER); + zbAnalogPercent.setAnalogInputDescription("Percentage"); + zbAnalogPercent.setAnalogInputResolution(0.01); + // Add endpoints to Zigbee Core Zigbee.addEndpoint(&zbAnalogDevice); + Zigbee.addEndpoint(&zbAnalogTemp); + Zigbee.addEndpoint(&zbAnalogFan); + Zigbee.addEndpoint(&zbAnalogPercent); Serial.println("Starting Zigbee..."); // When all EPs are registered, start Zigbee in End Device mode @@ -95,9 +126,15 @@ void loop() { float analog = (float)analogRead(analogPin); Serial.printf("Updating analog input to %.1f\r\n", analog); zbAnalogDevice.setAnalogInput(analog); + zbAnalogTemp.setAnalogInput(analog / 100); + zbAnalogFan.setAnalogInput(analog); + zbAnalogPercent.setAnalogInput(analog / 10); // Analog input supports reporting zbAnalogDevice.reportAnalogInput(); + zbAnalogTemp.reportAnalogInput(); + zbAnalogFan.reportAnalogInput(); + zbAnalogPercent.reportAnalogInput(); } // Checking button for factory reset and reporting diff --git a/libraries/Zigbee/examples/Zigbee_Binary_Input/README.md b/libraries/Zigbee/examples/Zigbee_Binary_Input/README.md new file mode 100644 index 00000000000..6ca3aac7119 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Binary_Input/README.md @@ -0,0 +1,75 @@ +# Arduino-ESP32 Zigbee Binary Input Example + +This example shows how to configure the Zigbee end device and use it as a Home Automation (HA) binary input device with two different applications: HVAC fan status and security zone armed status. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## Binary Input Functions + + * The example implements two binary inputs: + - HVAC Fan Status: Reports the current state of a fan + - Security Zone Armed: Reports the armed state of a security zone + * By clicking the button (BOOT) on this board, it will toggle both binary inputs and immediately send a report of their states to the network. + * Holding the button for more than 3 seconds will trigger a factory reset of the Zigbee device. + +## Hardware Required + +* A USB cable for power supply and programming + +### Configure the Project + +The example uses the following default pins: +* Button: `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_Binary_Input/Zigbee_Binary_Input.ino b/libraries/Zigbee/examples/Zigbee_Binary_Input/Zigbee_Binary_Input.ino new file mode 100644 index 00000000000..de0cf606dcd --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Binary_Input/Zigbee_Binary_Input.ino @@ -0,0 +1,112 @@ +// 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 binary input device. + * + * The example demonstrates how to use Zigbee library to create an end device binary sensor device. + * + * 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 binary sensor device configuration */ +#define BINARY_DEVICE_ENDPOINT_NUMBER 1 + +uint8_t binaryPin = A0; +uint8_t button = BOOT_PIN; + +ZigbeeBinary zbBinaryFan = ZigbeeBinary(BINARY_DEVICE_ENDPOINT_NUMBER); +ZigbeeBinary zbBinaryZone = ZigbeeBinary(BINARY_DEVICE_ENDPOINT_NUMBER + 1); + +bool binaryStatus = false; + +void setup() { + Serial.begin(115200); + Serial.println("Starting..."); + + // Init button switch + pinMode(button, INPUT_PULLUP); + + // Set analog resolution to 10 bits + analogReadResolution(10); + + // Optional: set Zigbee device name and model + zbBinaryFan.setManufacturerAndModel("Espressif", "ZigbeeBinarySensor"); + + // Set up binary fan status input (HVAC) + zbBinaryFan.addBinaryInput(); + zbBinaryFan.setBinaryInputApplication(BINARY_INPUT_APPLICATION_TYPE_HVAC_FAN_STATUS); + zbBinaryFan.setBinaryInputDescription("Fan Status"); + + // Set up binary zone armed input (Security) + zbBinaryZone.addBinaryInput(); + zbBinaryZone.setBinaryInputApplication(BINARY_INPUT_APPLICATION_TYPE_SECURITY_ZONE_ARMED); + zbBinaryZone.setBinaryInputDescription("Zone Armed"); + + // Add endpoints to Zigbee Core + Zigbee.addEndpoint(&zbBinaryFan); + Zigbee.addEndpoint(&zbBinaryZone); + + 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("Connected"); +} + +void loop() { + // 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(); + } + } + // Toggle binary input + binaryStatus = !binaryStatus; + zbBinaryFan.setBinaryInput(binaryStatus); + zbBinaryZone.setBinaryInput(binaryStatus); + zbBinaryFan.reportBinaryInput(); + zbBinaryZone.reportBinaryInput(); + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_Binary_Input/ci.json b/libraries/Zigbee/examples/Zigbee_Binary_Input/ci.json new file mode 100644 index 00000000000..ceacc367801 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Binary_Input/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" + ] +} diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index 1840a5262bb..87e735ba6db 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -20,6 +20,7 @@ #include "ep/ZigbeePowerOutlet.h" //// Sensors #include "ep/ZigbeeAnalog.h" +#include "ep/ZigbeeBinary.h" #include "ep/ZigbeeCarbonDioxideSensor.h" #include "ep/ZigbeeContactSwitch.h" #include "ep/ZigbeeDoorWindowHandle.h" diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp index a95668b7afe..6e073c345bc 100644 --- a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp @@ -13,7 +13,33 @@ ZigbeeAnalog::ZigbeeAnalog(uint8_t endpoint) : ZigbeeEP(endpoint) { } bool ZigbeeAnalog::addAnalogInput() { - esp_err_t ret = esp_zb_cluster_list_add_analog_input_cluster(_cluster_list, esp_zb_analog_input_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_attribute_list_t *esp_zb_analog_input_cluster = esp_zb_analog_input_cluster_create(NULL); + + // Create default description for Analog Input + char default_description[] = "\x0C" + "Analog Input"; + uint32_t application_type = 0x00000000 | (ESP_ZB_ZCL_AI_GROUP_ID << 24); + float resolution = 0.1; // Default resolution of 0.1 + + esp_err_t ret = esp_zb_analog_input_cluster_add_attr(esp_zb_analog_input_cluster, ESP_ZB_ZCL_ATTR_ANALOG_INPUT_DESCRIPTION_ID, (void *)default_description); + if (ret != ESP_OK) { + log_e("Failed to add description attribute: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + + ret = esp_zb_analog_input_cluster_add_attr(esp_zb_analog_input_cluster, ESP_ZB_ZCL_ATTR_ANALOG_INPUT_APPLICATION_TYPE_ID, (void *)&application_type); + if (ret != ESP_OK) { + log_e("Failed to add application type attribute: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + + ret = esp_zb_analog_input_cluster_add_attr(esp_zb_analog_input_cluster, ESP_ZB_ZCL_ATTR_ANALOG_INPUT_RESOLUTION_ID, (void *)&resolution); + if (ret != ESP_OK) { + log_e("Failed to add resolution attribute: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + + ret = esp_zb_cluster_list_add_analog_input_cluster(_cluster_list, esp_zb_analog_input_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); if (ret != ESP_OK) { log_e("Failed to add Analog Input cluster: 0x%x: %s", ret, esp_err_to_name(ret)); return false; @@ -22,8 +48,55 @@ bool ZigbeeAnalog::addAnalogInput() { return true; } +// Check esp_zigbee_zcl_analog_input.h for application type values +bool ZigbeeAnalog::setAnalogInputApplication(uint32_t application_type) { + if (!(_analog_clusters & ANALOG_INPUT)) { + log_e("Analog Input cluster not added"); + return false; + } + + // Add the Analog Input group ID (0x00) to the application type + uint32_t application_type_value = (ESP_ZB_ZCL_AI_GROUP_ID << 24) | application_type; + + esp_zb_attribute_list_t *analog_input_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_INPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_err_t ret = esp_zb_cluster_update_attr(analog_input_cluster, ESP_ZB_ZCL_ATTR_ANALOG_INPUT_APPLICATION_TYPE_ID, (void *)&application_type_value); + if (ret != ESP_OK) { + log_e("Failed to set AI application type: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + bool ZigbeeAnalog::addAnalogOutput() { - esp_err_t ret = esp_zb_cluster_list_add_analog_output_cluster(_cluster_list, esp_zb_analog_output_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_attribute_list_t *esp_zb_analog_output_cluster = esp_zb_analog_output_cluster_create(NULL); + + // Create default description for Analog Output + char default_description[] = "\x0D" + "Analog Output"; + uint32_t application_type = 0x00000000 | (ESP_ZB_ZCL_AO_GROUP_ID << 24); + float resolution = 1; // Default resolution of 1 + + esp_err_t ret = + esp_zb_analog_output_cluster_add_attr(esp_zb_analog_output_cluster, ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_DESCRIPTION_ID, (void *)default_description); + if (ret != ESP_OK) { + log_e("Failed to add description attribute: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + + ret = esp_zb_analog_output_cluster_add_attr(esp_zb_analog_output_cluster, ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_APPLICATION_TYPE_ID, (void *)&application_type); + if (ret != ESP_OK) { + log_e("Failed to add application type attribute: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + + ret = esp_zb_analog_output_cluster_add_attr(esp_zb_analog_output_cluster, ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_RESOLUTION_ID, (void *)&resolution); + if (ret != ESP_OK) { + log_e("Failed to add resolution attribute: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + + ret = esp_zb_cluster_list_add_analog_output_cluster(_cluster_list, esp_zb_analog_output_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); if (ret != ESP_OK) { log_e("Failed to add Analog Output cluster: 0x%x: %s", ret, esp_err_to_name(ret)); return false; @@ -32,6 +105,26 @@ bool ZigbeeAnalog::addAnalogOutput() { return true; } +// Check esp_zigbee_zcl_analog_output.h for application type values +bool ZigbeeAnalog::setAnalogOutputApplication(uint32_t application_type) { + if (!(_analog_clusters & ANALOG_OUTPUT)) { + log_e("Analog Output cluster not added"); + return false; + } + + // Add the Analog Output group ID (0x00) to the application type + uint32_t application_type_value = (ESP_ZB_ZCL_AO_GROUP_ID << 24) | application_type; + + esp_zb_attribute_list_t *analog_output_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_err_t ret = esp_zb_cluster_update_attr(analog_output_cluster, ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_APPLICATION_TYPE_ID, (void *)&application_type_value); + if (ret != ESP_OK) { + log_e("Failed to set AO application type: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + //set attribute method -> method overridden in child class void ZigbeeAnalog::zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) { if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT) { @@ -120,4 +213,126 @@ bool ZigbeeAnalog::setAnalogInputReporting(uint16_t min_interval, uint16_t max_i return true; } +bool ZigbeeAnalog::setAnalogInputDescription(const char *description) { + if (!(_analog_clusters & ANALOG_INPUT)) { + log_e("Analog Input cluster not added"); + return false; + } + + // Allocate a new array of size length + 2 (1 for the length, 1 for null terminator) + char zb_description[ZB_MAX_NAME_LENGTH + 2]; + + // Convert description to ZCL string + size_t description_length = strlen(description); + if (description_length > ZB_MAX_NAME_LENGTH) { + log_e("Description is too long"); + return false; + } + + // Get and check the analog input cluster + esp_zb_attribute_list_t *analog_input_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_INPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + if (analog_input_cluster == nullptr) { + log_e("Failed to get analog input cluster"); + return false; + } + + // Store the length as the first element + zb_description[0] = static_cast(description_length); // Cast size_t to char + // Use memcpy to copy the characters to the result array + memcpy(zb_description + 1, description, description_length); + // Null-terminate the array + zb_description[description_length + 1] = '\0'; + + // Update the description attribute + esp_err_t ret = esp_zb_cluster_update_attr(analog_input_cluster, ESP_ZB_ZCL_ATTR_ANALOG_INPUT_DESCRIPTION_ID, (void *)zb_description); + if (ret != ESP_OK) { + log_e("Failed to set description: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeAnalog::setAnalogOutputDescription(const char *description) { + if (!(_analog_clusters & ANALOG_OUTPUT)) { + log_e("Analog Output cluster not added"); + return false; + } + + // Allocate a new array of size length + 2 (1 for the length, 1 for null terminator) + char zb_description[ZB_MAX_NAME_LENGTH + 2]; + + // Convert description to ZCL string + size_t description_length = strlen(description); + if (description_length > ZB_MAX_NAME_LENGTH) { + log_e("Description is too long"); + return false; + } + + // Get and check the analog output cluster + esp_zb_attribute_list_t *analog_output_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + if (analog_output_cluster == nullptr) { + log_e("Failed to get analog output cluster"); + return false; + } + + // Store the length as the first element + zb_description[0] = static_cast(description_length); // Cast size_t to char + // Use memcpy to copy the characters to the result array + memcpy(zb_description + 1, description, description_length); + // Null-terminate the array + zb_description[description_length + 1] = '\0'; + + // Update the description attribute + esp_err_t ret = esp_zb_cluster_update_attr(analog_output_cluster, ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_DESCRIPTION_ID, (void *)zb_description); + if (ret != ESP_OK) { + log_e("Failed to set description: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeAnalog::setAnalogInputResolution(float resolution) { + if (!(_analog_clusters & ANALOG_INPUT)) { + log_e("Analog Input cluster not added"); + return false; + } + + esp_zb_attribute_list_t *analog_input_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_INPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + if (analog_input_cluster == nullptr) { + log_e("Failed to get analog input cluster"); + return false; + } + + esp_err_t ret = esp_zb_cluster_update_attr(analog_input_cluster, ESP_ZB_ZCL_ATTR_ANALOG_INPUT_RESOLUTION_ID, (void *)&resolution); + if (ret != ESP_OK) { + log_e("Failed to set resolution: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeAnalog::setAnalogOutputResolution(float resolution) { + if (!(_analog_clusters & ANALOG_OUTPUT)) { + log_e("Analog Output cluster not added"); + return false; + } + + esp_zb_attribute_list_t *analog_output_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + if (analog_output_cluster == nullptr) { + log_e("Failed to get analog output cluster"); + return false; + } + + esp_err_t ret = esp_zb_cluster_update_attr(analog_output_cluster, ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_RESOLUTION_ID, (void *)&resolution); + if (ret != ESP_OK) { + log_e("Failed to set resolution: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.h b/libraries/Zigbee/src/ep/ZigbeeAnalog.h index 03fbc678b6e..e0c3fc11c5a 100644 --- a/libraries/Zigbee/src/ep/ZigbeeAnalog.h +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.h @@ -31,6 +31,16 @@ class ZigbeeAnalog : public ZigbeeEP { bool addAnalogInput(); bool addAnalogOutput(); + // Set the application type and description for the analog input + bool setAnalogInputApplication(uint32_t application_type); // Check esp_zigbee_zcl_analog_input.h for application type values + bool setAnalogInputDescription(const char *description); + bool setAnalogInputResolution(float resolution); + + // Set the application type and description for the analog output + bool setAnalogOutputApplication(uint32_t application_type); // Check esp_zigbee_zcl_analog_output.h for application type values + bool setAnalogOutputDescription(const char *description); + bool setAnalogOutputResolution(float resolution); + // Use to set a cb function to be called on analog output change void onAnalogOutputChange(void (*callback)(float analog)) { _on_analog_output_change = callback; diff --git a/libraries/Zigbee/src/ep/ZigbeeBinary.cpp b/libraries/Zigbee/src/ep/ZigbeeBinary.cpp new file mode 100644 index 00000000000..aa37ceb3020 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeBinary.cpp @@ -0,0 +1,144 @@ +#include "ZigbeeBinary.h" +#if CONFIG_ZB_ENABLED + +ZigbeeBinary::ZigbeeBinary(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID; + + //Create basic binary sensor clusters without configuration + _cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(_cluster_list, esp_zb_basic_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(_cluster_list, esp_zb_identify_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + + _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}; +} + +bool ZigbeeBinary::addBinaryInput() { + esp_zb_attribute_list_t *esp_zb_binary_input_cluster = esp_zb_binary_input_cluster_create(NULL); + + // Create default description for Binary Input + char default_description[] = "\x0C" + "Binary Input"; + uint32_t application_type = 0x00000000 | (0x03 << 24); // Group ID 0x03 + + esp_err_t ret = esp_zb_binary_input_cluster_add_attr(esp_zb_binary_input_cluster, ESP_ZB_ZCL_ATTR_BINARY_INPUT_DESCRIPTION_ID, (void *)default_description); + if (ret != ESP_OK) { + log_e("Failed to add description attribute: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + + ret = esp_zb_binary_input_cluster_add_attr(esp_zb_binary_input_cluster, ESP_ZB_ZCL_ATTR_BINARY_INPUT_APPLICATION_TYPE_ID, (void *)&application_type); + if (ret != ESP_OK) { + log_e("Failed to add application type attribute: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + + ret = esp_zb_cluster_list_add_binary_input_cluster(_cluster_list, esp_zb_binary_input_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + if (ret != ESP_OK) { + log_e("Failed to add Binary Input cluster: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + _binary_clusters |= BINARY_INPUT; + return true; +} + +// Check Zigbee Cluster Specification 3.14.11.19.4 Binary Inputs (BI) Types for application type values +bool ZigbeeBinary::setBinaryInputApplication(uint32_t application_type) { + if (!(_binary_clusters & BINARY_INPUT)) { + log_e("Binary Input cluster not added"); + return false; + } + + // Add the Binary Input group ID (0x03) to the application type + uint32_t application_type_value = (0x03 << 24) | application_type; + + esp_zb_attribute_list_t *binary_input_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_BINARY_INPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_err_t ret = esp_zb_cluster_update_attr(binary_input_cluster, ESP_ZB_ZCL_ATTR_BINARY_INPUT_APPLICATION_TYPE_ID, (void *)&application_type_value); + if (ret != ESP_OK) { + log_e("Failed to set Binary Input application type: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeBinary::setBinaryInput(bool input) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; + if (!(_binary_clusters & BINARY_INPUT)) { + log_e("Binary Input cluster not added"); + return false; + } + log_d("Setting binary input to %d", input); + esp_zb_lock_acquire(portMAX_DELAY); + ret = esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_BINARY_INPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_BINARY_INPUT_PRESENT_VALUE_ID, &input, false + ); + esp_zb_lock_release(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set binary input: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeBinary::reportBinaryInput() { + /* 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_BINARY_INPUT_PRESENT_VALUE_ID; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; + report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_BINARY_INPUT; + report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send Binary Input report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + log_v("Binary Input report sent"); + return true; +} + +bool ZigbeeBinary::setBinaryInputDescription(const char *description) { + if (!(_binary_clusters & BINARY_INPUT)) { + log_e("Binary Input cluster not added"); + return false; + } + + // Allocate a new array of size length + 2 (1 for the length, 1 for null terminator) + char zb_description[ZB_MAX_NAME_LENGTH + 2]; + + // Convert description to ZCL string + size_t description_length = strlen(description); + if (description_length > ZB_MAX_NAME_LENGTH) { + log_e("Description is too long"); + return false; + } + + // Get and check the binary input cluster + esp_zb_attribute_list_t *binary_input_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_BINARY_INPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + if (binary_input_cluster == nullptr) { + log_e("Failed to get binary input cluster"); + return false; + } + + // Store the length as the first element + zb_description[0] = static_cast(description_length); // Cast size_t to char + // Use memcpy to copy the characters to the result array + memcpy(zb_description + 1, description, description_length); + // Null-terminate the array + zb_description[description_length + 1] = '\0'; + + // Update the description attribute + esp_err_t ret = esp_zb_cluster_update_attr(binary_input_cluster, ESP_ZB_ZCL_ATTR_BINARY_INPUT_DESCRIPTION_ID, (void *)zb_description); + if (ret != ESP_OK) { + log_e("Failed to set description: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeBinary.h b/libraries/Zigbee/src/ep/ZigbeeBinary.h new file mode 100644 index 00000000000..5a543604970 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeBinary.h @@ -0,0 +1,85 @@ +/* Class of Zigbee Binary sensor endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +//enum for bits set to check what analog cluster were added +enum zigbee_binary_clusters { + BINARY_INPUT = 1, + BINARY_OUTPUT = 2 +}; + +// HVAC application types for Binary Input (more can be found in Zigbee Cluster Specification 3.14.11.19.4 Binary Inputs (BI) Types) +#define BINARY_INPUT_APPLICATION_TYPE_HVAC_BOILER_STATUS 0x00000003 // Type 0x00, Index 0x0003 +#define BINARY_INPUT_APPLICATION_TYPE_HVAC_CHILLER_STATUS 0x00000013 // Type 0x00, Index 0x0013 +#define BINARY_INPUT_APPLICATION_TYPE_HVAC_OCCUPANCY 0x00000031 // Type 0x00, Index 0x0031 +#define BINARY_INPUT_APPLICATION_TYPE_HVAC_FAN_STATUS 0x00000035 // Type 0x00, Index 0x0035 +#define BINARY_INPUT_APPLICATION_TYPE_HVAC_FILTER_STATUS 0x00000036 // Type 0x00, Index 0x0036 +#define BINARY_INPUT_APPLICATION_TYPE_HVAC_HEATING_ALARM 0x0000003E // Type 0x00, Index 0x003E +#define BINARY_INPUT_APPLICATION_TYPE_HVAC_COOLING_ALARM 0x0000001D // Type 0x00, Index 0x001D +#define BINARY_INPUT_APPLICATION_TYPE_HVAC_UNIT_ENABLE 0x00000090 // Type 0x00, Index 0x0090 +#define BINARY_INPUT_APPLICATION_TYPE_HVAC_OTHER 0x0000FFFF // Type 0x00, Index 0xFFFF + +// Security application types for Binary Input +#define BINARY_INPUT_APPLICATION_TYPE_SECURITY_GLASS_BREAKAGE_DETECTION_0 0x01000000 // Type 0x01, Index 0x0000 +#define BINARY_INPUT_APPLICATION_TYPE_SECURITY_INTRUSION_DETECTION 0x01000001 // Type 0x01, Index 0x0001 +#define BINARY_INPUT_APPLICATION_TYPE_SECURITY_MOTION_DETECTION 0x01000002 // Type 0x01, Index 0x0002 +#define BINARY_INPUT_APPLICATION_TYPE_SECURITY_GLASS_BREAKAGE_DETECTION_1 0x01000003 // Type 0x01, Index 0x0003 +#define BINARY_INPUT_APPLICATION_TYPE_SECURITY_ZONE_ARMED 0x01000004 // Type 0x01, Index 0x0004 +#define BINARY_INPUT_APPLICATION_TYPE_SECURITY_GLASS_BREAKAGE_DETECTION_2 0x01000005 // Type 0x01, Index 0x0005 +#define BINARY_INPUT_APPLICATION_TYPE_SECURITY_SMOKE_DETECTION 0x01000006 // Type 0x01, Index 0x0006 +#define BINARY_INPUT_APPLICATION_TYPE_SECURITY_CARBON_DIOXIDE_DETECTION 0x01000007 // Type 0x01, Index 0x0007 +#define BINARY_INPUT_APPLICATION_TYPE_SECURITY_HEAT_DETECTION 0x01000008 // Type 0x01, Index 0x0008 +#define BINARY_INPUT_APPLICATION_TYPE_SECURITY_OTHER 0x0100FFFF // Type 0x01, Index 0xFFFF + +typedef struct zigbee_binary_cfg_s { + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + // esp_zb_binary_output_cluster_cfg_t binary_output_cfg; + esp_zb_binary_input_cluster_cfg_t binary_input_cfg; +} zigbee_binary_cfg_t; + +class ZigbeeBinary : public ZigbeeEP { +public: + ZigbeeBinary(uint8_t endpoint); + ~ZigbeeBinary() {} + + // Add binary cluster + bool addBinaryInput(); + // bool addBinaryOutput(); + + // Set the application type and description for the binary input + bool setBinaryInputApplication(uint32_t application_type); // Check esp_zigbee_zcl_binary_input.h for application type values + bool setBinaryInputDescription(const char *description); + + // Set the application type and description for the binary output + // bool setBinaryOutputApplication(uint32_t application_type); // Check esp_zigbee_zcl_binary_output.h for application type values + // bool setBinaryOutputDescription(const char *description); + + // Use to set a cb function to be called on binary output change + // void onBinaryOutputChange(void (*callback)(bool binary_output)) { + // _on_binary_output_change = callback; + // } + + // Set the binary input value + bool setBinaryInput(bool input); + + // Report Binary Input value + bool reportBinaryInput(); + +private: + // void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override; + + // void (*_on_binary_output_change)(bool); + // void binaryOutputChanged(bool binary_output); + + uint8_t _binary_clusters; +}; + +#endif // CONFIG_ZB_ENABLED From 7bafc1b19b522e4cf09c409e6e952faffab82c8b 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, 27 May 2025 13:10:18 +0200 Subject: [PATCH 139/290] feat(zigbee): Add AC DC ElectricalMeasurement support (#11384) * feat(zigbee): Add AC DC ElectricalMeasurement support * ci(pre-commit): Apply automatic fixes * ci(): fix precommit codespell * ci(pre-commit): Add spaces between numbers and units --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Me No Dev --- CMakeLists.txt | 1 + .../Zigbee_Electrical_AC_Sensor/README.md | 87 ++ .../Zigbee_Electrical_AC_Sensor.ino | 162 +++ .../Zigbee_Electrical_AC_Sensor/ci.json | 6 + .../README.md | 87 ++ ...Zigbee_Electrical_AC_Sensor_MultiPhase.ino | 192 ++++ .../ci.json | 6 + .../Zigbee_Electrical_DC_Sensor/README.md | 85 ++ .../Zigbee_Electrical_DC_Sensor.ino | 137 +++ .../Zigbee_Electrical_DC_Sensor/ci.json | 7 + libraries/Zigbee/src/Zigbee.h | 1 + .../src/ep/ZigbeeElectricalMeasurement.cpp | 979 ++++++++++++++++++ .../src/ep/ZigbeeElectricalMeasurement.h | 105 ++ 13 files changed, 1855 insertions(+) create mode 100644 libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor/Zigbee_Electrical_AC_Sensor.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor/ci.json create mode 100644 libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor_MultiPhase/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor_MultiPhase/Zigbee_Electrical_AC_Sensor_MultiPhase.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor_MultiPhase/ci.json create mode 100644 libraries/Zigbee/examples/Zigbee_Electrical_DC_Sensor/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Electrical_DC_Sensor/Zigbee_Electrical_DC_Sensor.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Electrical_DC_Sensor/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeeElectricalMeasurement.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeElectricalMeasurement.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9efe4ec38bc..d53d612962d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -301,6 +301,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp libraries/Zigbee/src/ep/ZigbeePM25Sensor.cpp + libraries/Zigbee/src/ep/ZigbeeElectricalMeasurement.cpp libraries/Zigbee/src/ep/ZigbeeBinary.cpp libraries/Zigbee/src/ep/ZigbeePowerOutlet.cpp ) diff --git a/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor/README.md new file mode 100644 index 00000000000..fe032049c90 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor/README.md @@ -0,0 +1,87 @@ +# Arduino-ESP32 Zigbee AC Electrical Measurement Example + +This example shows how to configure the Zigbee router device and use it as a Home Automation (HA) AC electrical measurement device that reports voltage, current, power, and frequency measurements. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## AC Electrical Measurement Functions + + * After this board first starts up, it would be configured locally to report AC electrical measurements: + - AC voltage in volts (0-300.00 V) + - AC current in amps (0-10.000 A) + - AC power in watts (0-3200.0 W) + - AC frequency in hertz (0-65.000 Hz) + * Holding the button (BOOT) for more than 3 seconds will trigger a factory reset of the device. + * The device reports measurements every 2 seconds with simulated values. + +## Measurement Precision + +The example demonstrates how to set up proper measurement precision using multiplier and divisor values: + * Voltage: 1/100 = 0.01 V (1 unit = 10 mV) + * Current: 1/1000 = 0.001 A (1 unit = 1 mA) + * Power: 1/10 = 0.1 W (1 unit = 100 mW) + * Frequency: 1/1000 = 0.001 Hz (1 unit = 1 mHz) + +These settings ensure accurate reporting of measurements with proper decimal precision in the Zigbee network. + +## Hardware Required + +* A USB cable for power supply and programming + +### Configure the Project + +Set the ADC GPIO by changing the `analogPin` variable. By default, it's the pin `A0`. +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 Router Zigbee mode: `Tools -> Zigbee mode: Zigbee Router` +* 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 Router device flashed with this example is not connecting to the coordinator, erase the flash of the Router 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_Electrical_AC_Sensor/Zigbee_Electrical_AC_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor/Zigbee_Electrical_AC_Sensor.ino new file mode 100644 index 00000000000..9e8656119d6 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor/Zigbee_Electrical_AC_Sensor.ino @@ -0,0 +1,162 @@ +// 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 electrical AC measurement device. + * + * The example demonstrates how to use Zigbee library to create a router device that measures + * AC electrical parameters like voltage, current, power, power factor and frequency. + * + * 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/) + */ + +// Recommended to use Router mode, as this type of device is expected to be mains powered. +#ifndef ZIGBEE_MODE_ZCZR +#error "Zigbee coordinator/router mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +/* Zigbee AC measurement device configuration */ +#define AC_ELECTRICAL_MEASUREMENT_ENDPOINT_NUMBER 1 + +uint8_t analogPin = A0; +uint8_t button = BOOT_PIN; + +ZigbeeElectricalMeasurement zbElectricalMeasurement = ZigbeeElectricalMeasurement(AC_ELECTRICAL_MEASUREMENT_ENDPOINT_NUMBER); + +void onAnalogOutputChange(float analog_output) { + Serial.printf("Received analog output change: %.1f\r\n", analog_output); +} + +void setup() { + Serial.begin(115200); + Serial.println("Starting..."); + + // Init button switch + pinMode(button, INPUT_PULLUP); + + // Set analog resolution to 10 bits + analogReadResolution(10); + + // Optional: set Zigbee device name and model + zbElectricalMeasurement.setManufacturerAndModel("Espressif", "ZigbeeElectricalMeasurementAC"); + + // Add analog clusters to Zigbee Analog according your needs + zbElectricalMeasurement.addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_A); + zbElectricalMeasurement.addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_A); + zbElectricalMeasurement.addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_A); + zbElectricalMeasurement.addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR, ZIGBEE_AC_PHASE_TYPE_A); + zbElectricalMeasurement.addACMeasurement( + ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY, ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC + ); // frequency is not phase specific (shared) + + // Optional: set Multiplier/Divisor for the measurements + zbElectricalMeasurement.setACMultiplierDivisor(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, 1, 100); // 1/100 = 0.01V (1 unit of measurement = 0.01V = 10mV) + zbElectricalMeasurement.setACMultiplierDivisor(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, 1, 1000); // 1/1000 = 0.001A (1 unit of measurement = 0.001A = 1mA) + zbElectricalMeasurement.setACMultiplierDivisor(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, 1, 10); // 1/10 = 0.1W (1 unit of measurement = 0.1W = 100mW) + zbElectricalMeasurement.setACMultiplierDivisor(ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY, 1, 1000); // 1/1000 = 0.001Hz (1 unit of measurement = 0.001Hz = 1mHz) + + // Optional: set Min/max values for the measurements + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_A, 0, 30000); // 0-300.00V + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_A, 0, 10000); // 0-10.000A + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_A, 0, 32000); // 0-3200.0W + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY, ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC, 0, 65000); // 0-65.000Hz + + // Optional: set power factor for the measurements + zbElectricalMeasurement.setACPowerFactor(ZIGBEE_AC_PHASE_TYPE_A, 98); // 100 = 1.00, 0 = 0.00, -100 = -1.00 + + // Add endpoints to Zigbee Core + Zigbee.addEndpoint(&zbElectricalMeasurement); + + Serial.println("Starting Zigbee..."); + // When all EPs are registered, start Zigbee in Router mode + if (!Zigbee.begin(ZIGBEE_ROUTER)) { + 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("Connected"); + + // Optional: Add reporting for AC measurements (this is overridden by HomeAssistant ZHA if used as a Zigbee coordinator) + zbElectricalMeasurement.setACReporting( + ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_A, 0, 30, 10 + ); // report every 30 seconds if value changes by 10 (0.1V) + zbElectricalMeasurement.setACReporting( + ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_A, 0, 30, 100 + ); // report every 30 seconds if value changes by 10 (0.1A) + zbElectricalMeasurement.setACReporting( + ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_A, 0, 30, 10 + ); // report every 30 seconds if value changes by 10 (1W) + zbElectricalMeasurement.setACReporting( + ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY, ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC, 0, 30, 100 + ); // report every 30 seconds if value changes by 100 (0.1Hz) +} + +void loop() { + static uint32_t timeCounter = 0; + + static uint8_t randomizer = 0; + // Read ADC value as current to demonstrate the measurements and update the electrical measurement values every 2s + if (!(timeCounter++ % 20)) { // delaying for 100ms x 20 = 2s + uint16_t voltage = 23000 + randomizer; // 230.00 V + uint16_t current = analogReadMilliVolts(analogPin); // demonstrates 0-3.3A + int16_t power = ((voltage / 100) * (current / 1000) * 10); //calculate power in W + uint16_t frequency = 50135; // 50.000 Hz + Serial.printf("Updating AC voltage to %d (0.01V), current to %d (mA), power to %d (0.1W), frequency to %d (mHz)\r\n", voltage, current, power, frequency); + + // Update the measurements + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_A, voltage); + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_A, current); + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_A, power); + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY, ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC, frequency); + + // Report the measurements + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_A); + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_A); + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_A); + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY, ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC); + + randomizer += 10; + } + + // 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(); + } + } + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor/ci.json new file mode 100644 index 00000000000..15d6190e4ae --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee_zczr,ZigbeeMode=zczr", + "requires": [ + "CONFIG_ZB_ENABLED=y" + ] +} diff --git a/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor_MultiPhase/README.md b/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor_MultiPhase/README.md new file mode 100644 index 00000000000..3714a05fa4f --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor_MultiPhase/README.md @@ -0,0 +1,87 @@ +# Arduino-ESP32 Zigbee AC Electrical MultiPhase Measurement Example + +This example shows how to configure the Zigbee router device and use it as a Home Automation (HA) AC electrical measurement device that reports voltage, current, power, and frequency measurements across three phases. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## AC Electrical Measurement Functions + + * After this board first starts up, it would be configured locally to report AC electrical measurements: + - AC voltage in volts (0-300.00 V) for each phase (A, B, C) + - AC current in amps (0-10.000 A) for each phase (A, B, C) + - AC power in watts (0-3200.0 W) for each phase (A, B, C) + - AC frequency in hertz (0-65.000 Hz) shared across all phases + * Holding the button (BOOT) for more than 3 seconds will trigger a factory reset of the device. + * The device reports measurements every 2 seconds with simulated values. + +## Measurement Precision + +The example demonstrates how to set up proper measurement precision using multiplier and divisor values: + * Voltage: 1/100 = 0.01 V (1 unit = 10 mV) + * Current: 1/1000 = 0.001 A (1 unit = 1 mA) + * Power: 1/10 = 0.1 W (1 unit = 100 mW) + * Frequency: 1/1000 = 0.001 Hz (1 unit = 1 mHz) + +These settings ensure accurate reporting of measurements with proper decimal precision in the Zigbee network. + +## Hardware Required + +* A USB cable for power supply and programming + +### Configure the Project + +Set the ADC GPIO by changing the `analogPin` variable. By default, it's the pin `A0`. +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 Router Zigbee mode: `Tools -> Zigbee mode: Zigbee Router` +* 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 Router device flashed with this example is not connecting to the coordinator, erase the flash of the Router 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_Electrical_AC_Sensor_MultiPhase/Zigbee_Electrical_AC_Sensor_MultiPhase.ino b/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor_MultiPhase/Zigbee_Electrical_AC_Sensor_MultiPhase.ino new file mode 100644 index 00000000000..e219113468e --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor_MultiPhase/Zigbee_Electrical_AC_Sensor_MultiPhase.ino @@ -0,0 +1,192 @@ +// 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 electrical AC measurement device with multi-phase support. + * + * The example demonstrates how to use Zigbee library to create a router device that measures + * AC electrical parameters like voltage, current, power, power factor and frequency across + * three phases (A, B, C). This allows monitoring of three-phase power systems commonly used + * in industrial and commercial applications. + * + * The device measures: + * - Per phase: voltage, current, power, power factor + * - Shared: frequency (common across all phases) + * + * 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/) + */ + +// Recommended to use Router mode, as this type of device is expected to be mains powered. +#ifndef ZIGBEE_MODE_ZCZR +#error "Zigbee coordinator/router mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +/* Zigbee AC measurement device configuration */ +#define AC_ELECTRICAL_MEASUREMENT_ENDPOINT_NUMBER 1 + +uint8_t analogPin = A0; +uint8_t button = BOOT_PIN; + +ZigbeeElectricalMeasurement zbElectricalMeasurement = ZigbeeElectricalMeasurement(AC_ELECTRICAL_MEASUREMENT_ENDPOINT_NUMBER); + +void onAnalogOutputChange(float analog_output) { + Serial.printf("Received analog output change: %.1f\r\n", analog_output); +} + +void setup() { + Serial.begin(115200); + Serial.println("Starting..."); + + // Init button switch + pinMode(button, INPUT_PULLUP); + + // Set analog resolution to 10 bits + analogReadResolution(10); + + // Optional: set Zigbee device name and model + zbElectricalMeasurement.setManufacturerAndModel("Espressif", "ZigbeeElectricalMeasurementAC"); + + // Add analog clusters to Zigbee Analog according your needs + zbElectricalMeasurement.addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_A); + zbElectricalMeasurement.addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_A); + zbElectricalMeasurement.addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_A); + + zbElectricalMeasurement.addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_B); + zbElectricalMeasurement.addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_B); + zbElectricalMeasurement.addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_B); + + zbElectricalMeasurement.addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_C); + zbElectricalMeasurement.addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_C); + zbElectricalMeasurement.addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_C); + + zbElectricalMeasurement.addACMeasurement( + ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY, ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC + ); // frequency is not phase specific (shared) + + // Recommended: set Multiplier/Divisor for the measurements (common for all phases) + zbElectricalMeasurement.setACMultiplierDivisor(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, 1, 100); // 1/100 = 0.01V (1 unit of measurement = 0.01V = 10mV) + zbElectricalMeasurement.setACMultiplierDivisor(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, 1, 1000); // 1/1000 = 0.001A (1 unit of measurement = 0.001A = 1mA) + zbElectricalMeasurement.setACMultiplierDivisor(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, 1, 10); // 1/10 = 0.1W (1 unit of measurement = 0.1W = 100mW) + zbElectricalMeasurement.setACMultiplierDivisor(ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY, 1, 1000); // 1/1000 = 0.001Hz (1 unit of measurement = 0.001Hz = 1mHz) + + // Optional: set Min/max values for the measurements + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_A, 0, 30000); // 0-300.00V + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_A, 0, 10000); // 0-10.000A + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_A, 0, 32000); // 0-3200.0W + + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_B, 0, 30000); // 0-300.00V + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_B, 0, 10000); // 0-10.000A + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_B, 0, 32000); // 0-3200.0W + + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_C, 0, 30000); // 0-300.00V + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_C, 0, 10000); // 0-10.000A + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_C, 0, 32000); // 0-3200.0W + + zbElectricalMeasurement.setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY, ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC, 0, 65000); // 0-65.000Hz + + // Add endpoints to Zigbee Core + Zigbee.addEndpoint(&zbElectricalMeasurement); + + Serial.println("Starting Zigbee..."); + // When all EPs are registered, start Zigbee in Router mode + if (!Zigbee.begin(ZIGBEE_ROUTER)) { + 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("Connected"); +} + +void loop() { + static uint32_t timeCounter = 0; + static uint8_t randomizer = 0; + // Read ADC value and update the analog value every 2s + if (!(timeCounter++ % 20)) { // delaying for 100ms x 20 = 2s + uint16_t voltage = 23000 + randomizer; // 230.00 V + uint16_t current = analogReadMilliVolts(analogPin); // demonstrates approx 0-3.3A + int16_t power = ((voltage / 100) * (current / 1000) * 10); //calculate power in W + uint16_t frequency = 50135; // 50.000 Hz + Serial.printf("Updating AC voltage to %d (0.01V), current to %d (mA), power to %d (0.1W), frequency to %d (mHz)\r\n", voltage, current, power, frequency); + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_A, voltage); + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_A, current); + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_A, power); + + // Phase B demonstrates phase shift + current += 500; + voltage += 500; + power = ((voltage / 100) * (current / 1000) * 10); //calculate power in W + + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_B, voltage); + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_B, current); + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_B, power); + + // Phase C demonstrates phase shift + current += 500; + voltage += 500; + power = ((voltage / 100) * (current / 1000) * 10); //calculate power in W + + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_C, voltage); + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_C, current); + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_C, power); + + zbElectricalMeasurement.setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY, ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC, frequency); + + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_A); + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_A); + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_A); + + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_B); + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_B); + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_B); + + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_PHASE_TYPE_C); + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_PHASE_TYPE_C); + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_PHASE_TYPE_C); + + zbElectricalMeasurement.reportAC(ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY, ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC); + + randomizer += 10; + } + + // 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(); + } + } + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor_MultiPhase/ci.json b/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor_MultiPhase/ci.json new file mode 100644 index 00000000000..15d6190e4ae --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor_MultiPhase/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee_zczr,ZigbeeMode=zczr", + "requires": [ + "CONFIG_ZB_ENABLED=y" + ] +} diff --git a/libraries/Zigbee/examples/Zigbee_Electrical_DC_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_Electrical_DC_Sensor/README.md new file mode 100644 index 00000000000..e8922fc1a79 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Electrical_DC_Sensor/README.md @@ -0,0 +1,85 @@ +# Arduino-ESP32 Zigbee DC Electrical Measurement Example + +This example shows how to configure the Zigbee end device and use it as a Home Automation (HA) DC electrical measurement device that reports voltage, current, and power measurements. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## DC Electrical Measurement Functions + + * After this board first starts up, it would be configured locally to report DC electrical measurements: + - DC voltage in millivolts (0-5000 mV) + - DC current in milliamps (0-1000 mA) + - DC power in milliwatts (0-5000 mW) + * Holding the button (BOOT) for more than 3 seconds will trigger a factory reset of the device. + * The device reports measurements every 30 seconds if the value changes by more than the configured delta. + +## Measurement Precision + +The example demonstrates how to set up proper measurement precision using multiplier and divisor values: + * Voltage: 1/1000 = 0.001 V (1 unit = 1 mV) + * Current: 1/1000 = 0.001 A (1 unit = 1 mA) + * Power: 1/1000 = 0.001 W (1 unit = 1 mW) + +These settings ensure accurate reporting of measurements with proper decimal precision in the Zigbee network. + +## Hardware Required + +* A USB cable for power supply and programming + +### Configure the Project + +Set the ADC GPIO by changing the `analogPin` variable. By default, it's the pin `A0`. +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_Electrical_DC_Sensor/Zigbee_Electrical_DC_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Electrical_DC_Sensor/Zigbee_Electrical_DC_Sensor.ino new file mode 100644 index 00000000000..4324a7b3ce5 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Electrical_DC_Sensor/Zigbee_Electrical_DC_Sensor.ino @@ -0,0 +1,137 @@ +// 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 a Zigbee DC electrical measurement sensor. + * + * The example shows how to use the Zigbee library to create an end device that measures + * DC voltage, current and power using the Electrical Measurement cluster. + * + * The device reports: + * - DC voltage in millivolts (0-5000mV) + * - DC current in milliamps (0-1000mA) + * - DC power in milliwatts (0-5000mW) + * + * 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 DC measurement device configuration */ +#define DC_ELECTRICAL_MEASUREMENT_ENDPOINT_NUMBER 1 + +uint8_t analogPin = A0; +uint8_t button = BOOT_PIN; + +ZigbeeElectricalMeasurement zbElectricalMeasurement = ZigbeeElectricalMeasurement(DC_ELECTRICAL_MEASUREMENT_ENDPOINT_NUMBER); + +void setup() { + Serial.begin(115200); + Serial.println("Starting..."); + + // Init button switch + pinMode(button, INPUT_PULLUP); + + // Set analog resolution to 10 bits + analogReadResolution(10); + + // Optional: set Zigbee device name and model + zbElectricalMeasurement.setManufacturerAndModel("Espressif", "ZigbeeElectricalMeasurementDC"); + + // Add analog clusters to Zigbee Analog according your needs + zbElectricalMeasurement.addDCMeasurement(ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE); + zbElectricalMeasurement.addDCMeasurement(ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT); + zbElectricalMeasurement.addDCMeasurement(ZIGBEE_DC_MEASUREMENT_TYPE_POWER); + + // // Optional: set Min/max values for the measurements + zbElectricalMeasurement.setDCMinMaxValue(ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE, 0, 5000); // 0-5.000V + zbElectricalMeasurement.setDCMinMaxValue(ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT, 0, 1000); // 0-1.000A + zbElectricalMeasurement.setDCMinMaxValue(ZIGBEE_DC_MEASUREMENT_TYPE_POWER, 0, 5000); // 0-5.000W + + // // Optional: set Multiplier/Divisor for the measurements + zbElectricalMeasurement.setDCMultiplierDivisor(ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE, 1, 1000); // 1/1000 = 0.001V (1 unit of measurement = 0.001V = 1mV) + zbElectricalMeasurement.setDCMultiplierDivisor(ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT, 1, 1000); // 1/1000 = 0.001A (1 unit of measurement = 0.001A = 1mA) + zbElectricalMeasurement.setDCMultiplierDivisor(ZIGBEE_DC_MEASUREMENT_TYPE_POWER, 1, 1000); // 1/1000 = 0.001W (1 unit of measurement = 0.001W = 1mW) + + // Add endpoints to Zigbee Core + Zigbee.addEndpoint(&zbElectricalMeasurement); + + 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("Connected"); + + // Optional: Add reporting for DC measurements (this is overridden by HomeAssistant ZHA if connected to its network) + zbElectricalMeasurement.setDCReporting(ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE, 0, 30, 10); // report every 30 seconds if value changes by 10 (0.1V) + zbElectricalMeasurement.setDCReporting(ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT, 0, 30, 10); // report every 30 seconds if value changes by 10 (0.1A) + zbElectricalMeasurement.setDCReporting(ZIGBEE_DC_MEASUREMENT_TYPE_POWER, 0, 30, 10); // report every 30 seconds if value changes by 10 (0.1W) +} + +void loop() { + static uint32_t timeCounter = 0; + static uint8_t randomizer = 0; + // Read ADC value and update the analog value every 2s + if (!(timeCounter++ % 20)) { // delaying for 100ms x 20 = 2s + int16_t voltage_mv = (int16_t)(analogReadMilliVolts(analogPin)); + int16_t current_ma = randomizer; //0-255mA + int16_t power_mw = voltage_mv * current_ma / 1000; //calculate power in mW + Serial.printf("Updating DC voltage to %d mV, current to %d mA, power to %d mW\r\n", voltage_mv, current_ma, power_mw); + zbElectricalMeasurement.setDCMeasurement(ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE, voltage_mv); + zbElectricalMeasurement.setDCMeasurement(ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT, current_ma); + zbElectricalMeasurement.setDCMeasurement(ZIGBEE_DC_MEASUREMENT_TYPE_POWER, power_mw); + // Analog input supports reporting + zbElectricalMeasurement.reportDC(ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE); + zbElectricalMeasurement.reportDC(ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT); + zbElectricalMeasurement.reportDC(ZIGBEE_DC_MEASUREMENT_TYPE_POWER); + + randomizer += 10; + } + + // 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(); + } + } + } + delay(100); +} diff --git a/libraries/Zigbee/examples/Zigbee_Electrical_DC_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_Electrical_DC_Sensor/ci.json new file mode 100644 index 00000000000..ceacc367801 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Electrical_DC_Sensor/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" + ] +} diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index 87e735ba6db..b2e2e5dd027 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -24,6 +24,7 @@ #include "ep/ZigbeeCarbonDioxideSensor.h" #include "ep/ZigbeeContactSwitch.h" #include "ep/ZigbeeDoorWindowHandle.h" +#include "ep/ZigbeeElectricalMeasurement.h" #include "ep/ZigbeeFlowSensor.h" #include "ep/ZigbeeIlluminanceSensor.h" #include "ep/ZigbeeOccupancySensor.h" diff --git a/libraries/Zigbee/src/ep/ZigbeeElectricalMeasurement.cpp b/libraries/Zigbee/src/ep/ZigbeeElectricalMeasurement.cpp new file mode 100644 index 00000000000..8fa456c967a --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeElectricalMeasurement.cpp @@ -0,0 +1,979 @@ +#include "ZigbeeElectricalMeasurement.h" +#if CONFIG_ZB_ENABLED + +// Workaround for wrong name in ZCL header +#define ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_POWER_ID ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DCPOWER_ID + +esp_zb_cluster_list_t *zigbee_electrical_measurement_clusters_create(zigbee_electrical_measurement_cfg_t *electrical_measurement) { + esp_zb_basic_cluster_cfg_t *basic_cfg = electrical_measurement ? &(electrical_measurement->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = electrical_measurement ? &(electrical_measurement->identify_cfg) : NULL; + esp_zb_electrical_meas_cluster_cfg_t *electrical_measurement_cfg = electrical_measurement ? &(electrical_measurement->electrical_measurement_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_electrical_meas_cluster( + cluster_list, esp_zb_electrical_meas_cluster_create(electrical_measurement_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE + ); + return cluster_list; +} + +ZigbeeElectricalMeasurement::ZigbeeElectricalMeasurement(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID; + + //Create custom pressure sensor configuration + zigbee_electrical_measurement_cfg_t electrical_measurement_cfg = ZIGBEE_DEFAULT_ELECTRICAL_MEASUREMENT_CONFIG(); + _cluster_list = zigbee_electrical_measurement_clusters_create(&electrical_measurement_cfg); + + _ep_config = { + .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_METER_INTERFACE_DEVICE_ID, .app_device_version = 0 + }; +} + +/* DC MEASUREMENT */ + +bool ZigbeeElectricalMeasurement::addDCMeasurement(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type) { + esp_zb_attribute_list_t *electrical_measurement_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + + // Set the DC measurement type bit in the measurement type attribute + measure_type |= ESP_ZB_ZCL_ELECTRICAL_MEASUREMENT_DC_MEASUREMENT; + esp_zb_cluster_update_attr(electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_MEASUREMENT_TYPE_ID, &measure_type); + + int16_t default_min = -32767; + int16_t default_max = 32767; + int16_t default_measurement = 0; + uint16_t default_multiplier = 1; + uint16_t default_divisor = 1; + + esp_err_t ret = ESP_OK; + // Add the DC Voltage attributes + if (measurement_type == ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE) { + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_VOLTAGE_ID, (void *)&default_measurement + ); + if (ret != ESP_OK) { + log_e("Failed to add DC voltage: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = + esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_VOLTAGE_MIN_ID, (void *)&default_min); + if (ret != ESP_OK) { + log_e("Failed to add DC voltage min: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = + esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_VOLTAGE_MAX_ID, (void *)&default_max); + if (ret != ESP_OK) { + log_e("Failed to add DC voltage max: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_VOLTAGE_MULTIPLIER_ID, (void *)&default_multiplier + ); + if (ret != ESP_OK) { + log_e("Failed to add DC voltage multiplier: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_VOLTAGE_DIVISOR_ID, (void *)&default_divisor + ); + if (ret != ESP_OK) { + log_e("Failed to add DC voltage divisor: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + + } else if (measurement_type == ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT) { + // Add the DC Current attributes + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_CURRENT_ID, (void *)&default_measurement + ); + if (ret != ESP_OK) { + log_e("Failed to add DC current: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = + esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_CURRENT_MIN_ID, (void *)&default_min); + if (ret != ESP_OK) { + log_e("Failed to add DC current min: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = + esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_CURRENT_MAX_ID, (void *)&default_max); + if (ret != ESP_OK) { + log_e("Failed to add DC current max: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_CURRENT_MULTIPLIER_ID, (void *)&default_multiplier + ); + if (ret != ESP_OK) { + log_e("Failed to add DC current multiplier: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_CURRENT_DIVISOR_ID, (void *)&default_divisor + ); + if (ret != ESP_OK) { + log_e("Failed to add DC current divisor: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + } else { //(measurement_type == ZIGBEE_DC_MEASUREMENT_TYPE_POWER) + // Add the DC Power attributes + ret = + esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_POWER_ID, (void *)&default_measurement); + if (ret != ESP_OK) { + log_e("Failed to add DC power: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_POWER_MIN_ID, (void *)&default_min); + if (ret != ESP_OK) { + log_e("Failed to add DC power min: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_POWER_MAX_ID, (void *)&default_max); + if (ret != ESP_OK) { + log_e("Failed to add DC power max: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_POWER_MULTIPLIER_ID, (void *)&default_multiplier + ); + if (ret != ESP_OK) { + log_e("Failed to add DC power multiplier: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_POWER_DIVISOR_ID, (void *)&default_divisor + ); + if (ret != ESP_OK) { + log_e("Failed to add DC power divisor: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + } + return true; +} + +bool ZigbeeElectricalMeasurement::setDCMinMaxValue(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type, int16_t min, int16_t max) { + esp_zb_attribute_list_t *electrical_measurement_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + + esp_zb_zcl_electrical_measurement_attr_t attr_min = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_VOLTAGE_MIN_ID; + esp_zb_zcl_electrical_measurement_attr_t attr_max = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_VOLTAGE_MAX_ID; + if (measurement_type == ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT) { + attr_min = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_CURRENT_MIN_ID; + attr_max = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_CURRENT_MAX_ID; + } else if (measurement_type == ZIGBEE_DC_MEASUREMENT_TYPE_POWER) { + attr_min = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_POWER_MIN_ID; + attr_max = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_POWER_MAX_ID; + } + esp_err_t ret = ESP_OK; + ret = esp_zb_cluster_update_attr(electrical_measurement_cluster, attr_min, (void *)&min); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(electrical_measurement_cluster, attr_max, (void *)&max); + if (ret != ESP_OK) { + log_e("Failed to set max value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeElectricalMeasurement::setDCMultiplierDivisor(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type, uint16_t multiplier, uint16_t divisor) { + esp_zb_attribute_list_t *electrical_measurement_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + + esp_zb_zcl_electrical_measurement_attr_t attr_multiplier = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_VOLTAGE_MULTIPLIER_ID; + esp_zb_zcl_electrical_measurement_attr_t attr_divisor = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_VOLTAGE_DIVISOR_ID; + + if (measurement_type == ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT) { + attr_multiplier = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_CURRENT_MULTIPLIER_ID; + attr_divisor = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_CURRENT_DIVISOR_ID; + } else if (measurement_type == ZIGBEE_DC_MEASUREMENT_TYPE_POWER) { + attr_multiplier = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_POWER_MULTIPLIER_ID; + attr_divisor = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_POWER_DIVISOR_ID; + } + + esp_err_t ret = ESP_OK; + ret = esp_zb_cluster_update_attr(electrical_measurement_cluster, attr_multiplier, (void *)&multiplier); + if (ret != ESP_OK) { + log_e("Failed to set multiplier: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(electrical_measurement_cluster, attr_divisor, (void *)&divisor); + if (ret != ESP_OK) { + log_e("Failed to set divisor: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeElectricalMeasurement::setDCReporting(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type, uint16_t min_interval, uint16_t max_interval, int16_t delta) { + uint16_t attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_VOLTAGE_ID; + if (measurement_type == ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT) { + attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_CURRENT_ID; + } else if (measurement_type == ZIGBEE_DC_MEASUREMENT_TYPE_POWER) { + attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_POWER_ID; + } + + 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_ELECTRICAL_MEASUREMENT; + reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; + reporting_info.attr_id = attr_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.s16 = 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_err_t ret = esp_zb_zcl_update_reporting_info(&reporting_info); + esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to set reporting: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeElectricalMeasurement::setDCMeasurement(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type, int16_t measurement) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; + + esp_zb_zcl_electrical_measurement_attr_t attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_VOLTAGE_ID; + if (measurement_type == ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT) { + attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_CURRENT_ID; + } else if (measurement_type == ZIGBEE_DC_MEASUREMENT_TYPE_POWER) { + attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_POWER_ID; + } + + log_v("Updating DC measurement value..."); + /* Update DC sensor measured value */ + log_d("Setting DC measurement to %d", measurement); + esp_zb_lock_acquire(portMAX_DELAY); + ret = esp_zb_zcl_set_attribute_val(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, attr_id, &measurement, false); + esp_zb_lock_release(); + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set DC measurement: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeElectricalMeasurement::reportDC(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type) { + uint16_t attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_VOLTAGE_ID; + if (measurement_type == ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT) { + attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_CURRENT_ID; + } else if (measurement_type == ZIGBEE_DC_MEASUREMENT_TYPE_POWER) { + attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_DC_POWER_ID; + } + /* 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 = attr_id; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; + report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT; + report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send DC report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + log_v("DC report sent"); + return true; +} + +/* AC MEASUREMENT */ + +bool ZigbeeElectricalMeasurement::addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type) { + esp_zb_attribute_list_t *electrical_measurement_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC: + // Non phase specific dont need any bit set + break; + case ZIGBEE_AC_PHASE_TYPE_A: measure_type |= ESP_ZB_ZCL_ELECTRICAL_MEASUREMENT_PHASE_A_MEASUREMENT; break; + case ZIGBEE_AC_PHASE_TYPE_B: measure_type |= ESP_ZB_ZCL_ELECTRICAL_MEASUREMENT_PHASE_B_MEASUREMENT; break; + case ZIGBEE_AC_PHASE_TYPE_C: measure_type |= ESP_ZB_ZCL_ELECTRICAL_MEASUREMENT_PHASE_C_MEASUREMENT; break; + default: log_e("Invalid phase type"); break; + } + // Set Active measurement bit for active power and power factor, otherwise no bit needed for voltage, current + if (measurement_type == ZIGBEE_AC_MEASUREMENT_TYPE_POWER || measurement_type == ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR) { + measure_type |= ESP_ZB_ZCL_ELECTRICAL_MEASUREMENT_ACTIVE_MEASUREMENT; // Active power is used + } + // Update the measurement type attribute + esp_zb_cluster_update_attr(electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_MEASUREMENT_TYPE_ID, &measure_type); + + // Default values for AC measurements + [[maybe_unused]] + int16_t default_ac_power_min = -32767; + [[maybe_unused]] + int16_t default_ac_power_max = 32767; + [[maybe_unused]] + int16_t default_ac_power_measurement = 0; + [[maybe_unused]] + uint16_t default_ac_min = 0x0000; + [[maybe_unused]] + uint16_t default_ac_max = 0xffff; + [[maybe_unused]] + uint16_t default_ac_measurement = 0x0000; + [[maybe_unused]] + uint16_t default_ac_multiplier = 1; + [[maybe_unused]] + uint16_t default_ac_divisor = 1; + [[maybe_unused]] + int8_t default_ac_power_factor = 100; + + esp_err_t ret = ESP_OK; + + // AC Frequency + if (measurement_type == ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY) { // No phase specific + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_AC_FREQUENCY_ID, (void *)&default_ac_measurement + ); + if (ret != ESP_OK) { + log_e("Failed to add DC voltage: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_AC_FREQUENCY_MIN_ID, (void *)&default_ac_min + ); + if (ret != ESP_OK) { + log_e("Failed to add DC voltage min: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_AC_FREQUENCY_MAX_ID, (void *)&default_ac_max + ); + if (ret != ESP_OK) { + log_e("Failed to add DC voltage max: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_AC_FREQUENCY_MULTIPLIER_ID, (void *)&default_ac_multiplier + ); + if (ret != ESP_OK) { + log_e("Failed to add DC voltage multiplier: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_AC_FREQUENCY_DIVISOR_ID, (void *)&default_ac_divisor + ); + if (ret != ESP_OK) { + log_e("Failed to add DC voltage divisor: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; + } + // Add the AC Voltage attributes + else if (measurement_type == ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE) { + esp_zb_zcl_electrical_measurement_attr_t attr_voltage = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSVOLTAGE_ID; + esp_zb_zcl_electrical_measurement_attr_t attr_voltage_min = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_VOLTAGE_MIN_ID; + esp_zb_zcl_electrical_measurement_attr_t attr_voltage_max = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_VOLTAGE_MAX_ID; + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: + // already set + break; + case ZIGBEE_AC_PHASE_TYPE_B: + attr_voltage = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSVOLTAGE_PHB_ID; + attr_voltage_min = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_VOLTAGE_MIN_PH_B_ID; + attr_voltage_max = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_VOLTAGE_MAX_PH_B_ID; + break; + case ZIGBEE_AC_PHASE_TYPE_C: + attr_voltage = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSVOLTAGE_PHC_ID; + attr_voltage_min = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_VOLTAGE_MIN_PH_C_ID; + attr_voltage_max = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_VOLTAGE_MAX_PH_C_ID; + break; + default: log_e("Invalid phase type"); return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, attr_voltage, (void *)&default_ac_measurement); + if (ret != ESP_OK) { + log_e("Failed to add AC voltage: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, attr_voltage_min, (void *)&default_ac_min); + if (ret != ESP_OK) { + log_e("Failed to add AC voltage min: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, attr_voltage_max, (void *)&default_ac_max); + if (ret != ESP_OK) { + log_e("Failed to add AC voltage max: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + if (!ac_volt_mult_div_set) { + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACVOLTAGE_MULTIPLIER_ID, (void *)&default_ac_multiplier + ); + if (ret != ESP_OK) { + log_e("Failed to add AC voltage multiplier: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACVOLTAGE_DIVISOR_ID, (void *)&default_ac_divisor + ); + if (ret != ESP_OK) { + log_e("Failed to add AC voltage divisor: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ac_volt_mult_div_set = true; // Set flag to true, so we dont add the attributes again + } + } + // Add the AC Current attributes + else if (measurement_type == ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT) { + esp_zb_zcl_electrical_measurement_attr_t attr_current = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSCURRENT_ID; + esp_zb_zcl_electrical_measurement_attr_t attr_current_min = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_CURRENT_MIN_ID; + esp_zb_zcl_electrical_measurement_attr_t attr_current_max = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_CURRENT_MAX_ID; + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: + // already set + break; + case ZIGBEE_AC_PHASE_TYPE_B: + attr_current = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSCURRENT_PHB_ID; + attr_current_min = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_CURRENT_MIN_PH_B_ID; + attr_current_max = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_CURRENT_MAX_PH_B_ID; + break; + case ZIGBEE_AC_PHASE_TYPE_C: + attr_current = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSCURRENT_PHC_ID; + attr_current_min = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_CURRENT_MIN_PH_C_ID; + attr_current_max = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_CURRENT_MAX_PH_C_ID; + break; + default: log_e("Invalid phase type"); return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, attr_current, (void *)&default_ac_measurement); + if (ret != ESP_OK) { + log_e("Failed to add AC current: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, attr_current_min, (void *)&default_ac_min); + if (ret != ESP_OK) { + log_e("Failed to add AC current min: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, attr_current_max, (void *)&default_ac_max); + if (ret != ESP_OK) { + log_e("Failed to add AC current max: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + if (!ac_current_mult_div_set) { + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACCURRENT_MULTIPLIER_ID, (void *)&default_ac_multiplier + ); + if (ret != ESP_OK) { + log_e("Failed to add AC current multiplier: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACCURRENT_DIVISOR_ID, (void *)&default_ac_divisor + ); + if (ret != ESP_OK) { + log_e("Failed to add AC current divisor: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ac_current_mult_div_set = true; // Set flag to true, so we dont add the attributes again + } + } + // Add the AC Power attributes + else if (measurement_type == ZIGBEE_AC_MEASUREMENT_TYPE_POWER) { + esp_zb_zcl_electrical_measurement_attr_t attr_power = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_ID; + esp_zb_zcl_electrical_measurement_attr_t attr_power_min = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_MIN_ID; + esp_zb_zcl_electrical_measurement_attr_t attr_power_max = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_MAX_ID; + + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: + // already set + break; + case ZIGBEE_AC_PHASE_TYPE_B: + attr_power = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_PHB_ID; + attr_power_min = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_MIN_PH_B_ID; + attr_power_max = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_MAX_PH_B_ID; + break; + case ZIGBEE_AC_PHASE_TYPE_C: + attr_power = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_PHC_ID; + attr_power_min = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_MIN_PH_C_ID; + attr_power_max = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_MAX_PH_C_ID; + break; + default: log_e("Invalid phase type"); return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, attr_power, (void *)&default_ac_measurement); + if (ret != ESP_OK) { + log_e("Failed to add AC power: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, attr_power_min, (void *)&default_ac_min); + if (ret != ESP_OK) { + log_e("Failed to add AC power min: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, attr_power_max, (void *)&default_ac_max); + if (ret != ESP_OK) { + log_e("Failed to add AC power max: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + if (!ac_power_mult_div_set) { + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACPOWER_MULTIPLIER_ID, (void *)&default_ac_multiplier + ); + if (ret != ESP_OK) { + log_e("Failed to add AC power multiplier: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr( + electrical_measurement_cluster, ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACPOWER_DIVISOR_ID, (void *)&default_ac_divisor + ); + if (ret != ESP_OK) { + log_e("Failed to add AC power divisor: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ac_power_mult_div_set = true; // Set flag to true, so we dont add the attributes again + } + } else { //(measurement_type == ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR) + esp_zb_zcl_electrical_measurement_attr_t attr_power_factor = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_POWER_FACTOR_ID; + + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: + // already set + break; + case ZIGBEE_AC_PHASE_TYPE_B: attr_power_factor = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_POWER_FACTOR_PH_B_ID; break; + case ZIGBEE_AC_PHASE_TYPE_C: attr_power_factor = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_POWER_FACTOR_PH_C_ID; break; + default: log_e("Invalid phase type"); return false; + } + ret = esp_zb_electrical_meas_cluster_add_attr(electrical_measurement_cluster, attr_power_factor, (void *)&default_ac_power_factor); + if (ret != ESP_OK) { + log_e("Failed to add AC power factor: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + } + return true; +} + +bool ZigbeeElectricalMeasurement::setACMinMaxValue( + ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type, int32_t min_value, int32_t max_value +) { + uint16_t attr_min_id = 0; + uint16_t attr_max_id = 0; + + // Check min/max values are valid for the measurement type + switch (measurement_type) { + case ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE: + case ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT: + case ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY: + if (min_value < 0 || min_value > UINT16_MAX || max_value < 0 || max_value > UINT16_MAX) { + log_e("AC measurement min/max values must be between 0 and %u (got min=%d, max=%d)", UINT16_MAX, min_value, max_value); + return false; + } + break; + + case ZIGBEE_AC_MEASUREMENT_TYPE_POWER: + if (min_value < INT16_MIN || min_value > INT16_MAX || max_value < INT16_MIN || max_value > INT16_MAX) { + log_e("AC power min/max values must be between %d and %d (got min=%d, max=%d)", INT16_MIN, INT16_MAX, min_value, max_value); + return false; + } + break; + + default: log_e("Invalid measurement type"); return false; + } + + [[maybe_unused]] + int16_t int16_min_value = (int16_t)min_value; + [[maybe_unused]] + int16_t int16_max_value = (int16_t)max_value; + [[maybe_unused]] + uint16_t uint16_min_value = (uint16_t)min_value; + [[maybe_unused]] + uint16_t uint16_max_value = (uint16_t)max_value; + + //TODO: Log info about min and max values for different measurement types + switch (measurement_type) { + case ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE: + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: + attr_min_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_VOLTAGE_MIN_ID; + attr_max_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_VOLTAGE_MAX_ID; + break; + case ZIGBEE_AC_PHASE_TYPE_B: + attr_min_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_VOLTAGE_MIN_PH_B_ID; + attr_max_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_VOLTAGE_MAX_PH_B_ID; + break; + case ZIGBEE_AC_PHASE_TYPE_C: + attr_min_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_VOLTAGE_MIN_PH_C_ID; + attr_max_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_VOLTAGE_MAX_PH_C_ID; + break; + default: log_e("Invalid phase type"); return false; + } + break; + + case ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT: + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: + attr_min_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_CURRENT_MIN_ID; + attr_max_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_CURRENT_MAX_ID; + break; + case ZIGBEE_AC_PHASE_TYPE_B: + attr_min_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_CURRENT_MIN_PH_B_ID; + attr_max_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_CURRENT_MAX_PH_B_ID; + break; + case ZIGBEE_AC_PHASE_TYPE_C: + attr_min_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_CURRENT_MIN_PH_C_ID; + attr_max_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMS_CURRENT_MAX_PH_C_ID; + break; + default: log_e("Invalid phase type"); return false; + } + break; + + case ZIGBEE_AC_MEASUREMENT_TYPE_POWER: + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: + attr_min_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_MIN_ID; + attr_max_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_MAX_ID; + break; + case ZIGBEE_AC_PHASE_TYPE_B: + attr_min_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_MIN_PH_B_ID; + attr_max_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_MAX_PH_B_ID; + break; + case ZIGBEE_AC_PHASE_TYPE_C: + attr_min_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_MIN_PH_C_ID; + attr_max_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_MAX_PH_C_ID; + break; + default: log_e("Invalid phase type"); return false; + } + break; + + default: log_e("Invalid measurement type"); return false; + } + esp_zb_attribute_list_t *electrical_measurement_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + + esp_err_t ret = ESP_OK; + ret = esp_zb_cluster_update_attr(electrical_measurement_cluster, attr_min_id, (void *)&min_value); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(electrical_measurement_cluster, attr_max_id, (void *)&max_value); + if (ret != ESP_OK) { + log_e("Failed to set max value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeElectricalMeasurement::setACMultiplierDivisor(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, uint16_t multiplier, uint16_t divisor) { + uint16_t attr_multiplier = 0; + uint16_t attr_divisor = 0; + + switch (measurement_type) { + case ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE: + attr_multiplier = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACVOLTAGE_MULTIPLIER_ID; + attr_divisor = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACVOLTAGE_DIVISOR_ID; + break; + case ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT: + attr_multiplier = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACCURRENT_MULTIPLIER_ID; + attr_divisor = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACCURRENT_DIVISOR_ID; + break; + case ZIGBEE_AC_MEASUREMENT_TYPE_POWER: + attr_multiplier = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACPOWER_MULTIPLIER_ID; + attr_divisor = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACPOWER_DIVISOR_ID; + break; + case ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY: + attr_multiplier = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_AC_FREQUENCY_MULTIPLIER_ID; + attr_divisor = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_AC_FREQUENCY_DIVISOR_ID; + break; + default: log_e("Invalid measurement type"); return false; + } + esp_zb_attribute_list_t *electrical_measurement_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + + esp_err_t ret = ESP_OK; + ret = esp_zb_cluster_update_attr(electrical_measurement_cluster, attr_multiplier, (void *)&multiplier); + if (ret != ESP_OK) { + log_e("Failed to set multiplier: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_update_attr(electrical_measurement_cluster, attr_divisor, (void *)&divisor); + if (ret != ESP_OK) { + log_e("Failed to set divisor: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeElectricalMeasurement::setACPowerFactor(ZIGBEE_AC_PHASE_TYPE phase_type, int8_t power_factor) { + uint16_t attr_id = 0; + + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_POWER_FACTOR_ID; break; + case ZIGBEE_AC_PHASE_TYPE_B: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_POWER_FACTOR_PH_B_ID; break; + case ZIGBEE_AC_PHASE_TYPE_C: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_POWER_FACTOR_PH_C_ID; break; + case ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC: + default: log_e("Invalid phase type"); return false; + } + + esp_zb_attribute_list_t *electrical_measurement_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + + esp_err_t ret = ESP_OK; + ret = esp_zb_cluster_update_attr(electrical_measurement_cluster, attr_id, (void *)&power_factor); + if (ret != ESP_OK) { + log_e("Failed to set power factor: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} +bool ZigbeeElectricalMeasurement::setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type, int32_t value) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; + uint16_t attr_id = 0; + + // Check value is valid for the measurement type + switch (measurement_type) { + case ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE: + case ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT: + case ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY: + if (value < 0 || value > UINT16_MAX) { + log_e("AC measurement value must be between 0 and %u (got %d)", UINT16_MAX, value); + return false; + } + break; + + case ZIGBEE_AC_MEASUREMENT_TYPE_POWER: + if (value < INT16_MIN || value > INT16_MAX) { + log_e("AC power value must be between %d and %d (got %d)", INT16_MIN, INT16_MAX, value); + return false; + } + break; + + case ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR: + if (value < -100 || value > 100) { + log_e("AC power factor value must be between -100 and 100 (got %d)", value); + return false; + } + break; + + default: log_e("Invalid measurement type"); return false; + } + // Convert value to appropriate type based on measurement type + uint16_t uint16_value = (uint16_t)value; + int16_t int16_value = (int16_t)value; + int8_t int8_value = (int8_t)value; + + switch (measurement_type) { + case ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE: + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSVOLTAGE_ID; break; + case ZIGBEE_AC_PHASE_TYPE_B: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSVOLTAGE_PHB_ID; break; + case ZIGBEE_AC_PHASE_TYPE_C: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSVOLTAGE_PHC_ID; break; + case ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC: + default: log_e("Invalid phase type"); return false; + } + // Use uint16_t for voltage + log_v("Updating AC voltage measurement value..."); + log_d("Setting AC voltage to %u", uint16_value); + esp_zb_lock_acquire(portMAX_DELAY); + ret = + esp_zb_zcl_set_attribute_val(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, attr_id, &uint16_value, false); + esp_zb_lock_release(); + break; + + case ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT: + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSCURRENT_ID; break; + case ZIGBEE_AC_PHASE_TYPE_B: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSCURRENT_PHB_ID; break; + case ZIGBEE_AC_PHASE_TYPE_C: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSCURRENT_PHC_ID; break; + case ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC: + default: log_e("Invalid phase type"); return false; + } + // Use uint16_t for current + log_v("Updating AC current measurement value..."); + log_d("Setting AC current to %u", uint16_value); + esp_zb_lock_acquire(portMAX_DELAY); + ret = + esp_zb_zcl_set_attribute_val(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, attr_id, &uint16_value, false); + esp_zb_lock_release(); + break; + + case ZIGBEE_AC_MEASUREMENT_TYPE_POWER: + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_ID; break; + case ZIGBEE_AC_PHASE_TYPE_B: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_PHB_ID; break; + case ZIGBEE_AC_PHASE_TYPE_C: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_PHC_ID; break; + case ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC: + default: log_e("Invalid phase type"); return false; + } + // Use int16_t for power + log_v("Updating AC power measurement value..."); + log_d("Setting AC power to %d", int16_value); + esp_zb_lock_acquire(portMAX_DELAY); + ret = esp_zb_zcl_set_attribute_val(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, attr_id, &int16_value, false); + esp_zb_lock_release(); + break; + + case ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY: + attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_AC_FREQUENCY_ID; + // Use uint16_t for frequency + log_v("Updating AC frequency measurement value..."); + log_d("Setting AC frequency to %u", uint16_value); + esp_zb_lock_acquire(portMAX_DELAY); + ret = + esp_zb_zcl_set_attribute_val(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, attr_id, &uint16_value, false); + esp_zb_lock_release(); + break; + case ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR: + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_POWER_FACTOR_ID; break; + case ZIGBEE_AC_PHASE_TYPE_B: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_POWER_FACTOR_PH_B_ID; break; + case ZIGBEE_AC_PHASE_TYPE_C: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_POWER_FACTOR_PH_C_ID; break; + case ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC: + default: log_e("Invalid phase type"); return false; + } + // Use int8_t for power factor + log_v("Updating AC power factor measurement value..."); + log_d("Setting AC power factor to %d", int8_value); + esp_zb_lock_acquire(portMAX_DELAY); + ret = esp_zb_zcl_set_attribute_val(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, attr_id, &int8_value, false); + esp_zb_lock_release(); + break; + default: log_e("Invalid measurement type"); return false; + } + + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set AC measurement: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeElectricalMeasurement::setACReporting( + ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type, uint16_t min_interval, uint16_t max_interval, int32_t delta +) { + uint16_t attr_id = 0; + + // Convert value to appropriate type based on measurement type + uint16_t uint16_delta = (uint16_t)delta; + int16_t int16_delta = (int16_t)delta; + + switch (measurement_type) { + case ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE: + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSVOLTAGE_ID; break; + case ZIGBEE_AC_PHASE_TYPE_B: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSVOLTAGE_PHB_ID; break; + case ZIGBEE_AC_PHASE_TYPE_C: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSVOLTAGE_PHC_ID; break; + case ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC: + default: log_e("Invalid phase type"); return false; + } + break; + case ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT: + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSCURRENT_ID; break; + case ZIGBEE_AC_PHASE_TYPE_B: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSCURRENT_PHB_ID; break; + case ZIGBEE_AC_PHASE_TYPE_C: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSCURRENT_PHC_ID; break; + case ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC: + default: log_e("Invalid phase type"); return false; + } + break; + case ZIGBEE_AC_MEASUREMENT_TYPE_POWER: + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_ID; break; + case ZIGBEE_AC_PHASE_TYPE_B: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_PHB_ID; break; + case ZIGBEE_AC_PHASE_TYPE_C: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_PHC_ID; break; + case ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC: + default: log_e("Invalid phase type"); return false; + } + break; + case ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_AC_FREQUENCY_ID; break; + case ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR: log_e("Power factor attribute reporting not supported by zigbee specification"); return false; + default: log_e("Invalid measurement type"); return false; + } + + 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_ELECTRICAL_MEASUREMENT; + reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; + reporting_info.attr_id = attr_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; + if (measurement_type == ZIGBEE_AC_MEASUREMENT_TYPE_POWER) { + reporting_info.u.send_info.delta.s16 = int16_delta; + } else { + reporting_info.u.send_info.delta.u16 = uint16_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_err_t ret = esp_zb_zcl_update_reporting_info(&reporting_info); + esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to set reporting: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeElectricalMeasurement::reportAC(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type) { + uint16_t attr_id = 0; + + switch (measurement_type) { + case ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE: + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSVOLTAGE_ID; break; + case ZIGBEE_AC_PHASE_TYPE_B: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSVOLTAGE_PHB_ID; break; + case ZIGBEE_AC_PHASE_TYPE_C: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSVOLTAGE_PHC_ID; break; + case ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC: + default: log_e("Invalid phase type"); return false; + } + break; + case ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT: + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSCURRENT_ID; break; + case ZIGBEE_AC_PHASE_TYPE_B: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSCURRENT_PHB_ID; break; + case ZIGBEE_AC_PHASE_TYPE_C: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_RMSCURRENT_PHC_ID; break; + case ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC: + default: log_e("Invalid phase type"); return false; + } + break; + case ZIGBEE_AC_MEASUREMENT_TYPE_POWER: + switch (phase_type) { + case ZIGBEE_AC_PHASE_TYPE_A: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_ID; break; + case ZIGBEE_AC_PHASE_TYPE_B: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_PHB_ID; break; + case ZIGBEE_AC_PHASE_TYPE_C: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_ACTIVE_POWER_PHC_ID; break; + case ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC: + default: log_e("Invalid phase type"); return false; + } + break; + case ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY: attr_id = ESP_ZB_ZCL_ATTR_ELECTRICAL_MEASUREMENT_AC_FREQUENCY_ID; break; + case ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR: log_e("Power factor attribute reporting not supported by zigbee specification"); return false; + default: log_e("Invalid measurement type"); return false; + } + /* 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 = attr_id; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; + report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_ELECTRICAL_MEASUREMENT; + report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send AC report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + log_v("AC report sent"); + return true; +} + +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeElectricalMeasurement.h b/libraries/Zigbee/src/ep/ZigbeeElectricalMeasurement.h new file mode 100644 index 00000000000..74d4a718fe2 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeElectricalMeasurement.h @@ -0,0 +1,105 @@ +/* Class of Zigbee Pressure sensor endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +// clang-format off +#define ZIGBEE_DEFAULT_ELECTRICAL_MEASUREMENT_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, \ + }, \ + .electrical_measurement_cfg = \ + { \ + .measured_type = 0x00, \ + }, \ + } +// clang-format on + +enum ZIGBEE_DC_MEASUREMENT_TYPE { + ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE = 0x0001, + ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT = 0x0002, + ZIGBEE_DC_MEASUREMENT_TYPE_POWER = 0x0003, +}; + +enum ZIGBEE_AC_MEASUREMENT_TYPE { + ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE = 0x0001, + ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT = 0x0002, + ZIGBEE_AC_MEASUREMENT_TYPE_POWER = 0x0003, + ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR = 0x0004, + ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY = 0x0005, +}; + +enum ZIGBEE_AC_PHASE_TYPE { + ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC = 0x0000, + ZIGBEE_AC_PHASE_TYPE_A = 0x0001, + ZIGBEE_AC_PHASE_TYPE_B = 0x0002, + ZIGBEE_AC_PHASE_TYPE_C = 0x0003, +}; + +typedef struct zigbee_electrical_measurement_cfg_s { + esp_zb_basic_cluster_cfg_t basic_cfg; + esp_zb_identify_cluster_cfg_t identify_cfg; + esp_zb_electrical_meas_cluster_cfg_t electrical_measurement_cfg; +} zigbee_electrical_measurement_cfg_t; + +class ZigbeeElectricalMeasurement : public ZigbeeEP { +public: + ZigbeeElectricalMeasurement(uint8_t endpoint); + ~ZigbeeElectricalMeasurement() {} + + /** + * @brief DC measurement methods + */ + // Add a DC measurement type + bool addDCMeasurement(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type); + // Set the DC measurement value for the given measurement type + bool setDCMeasurement(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type, int16_t value); + // Set the DC min and max value for the given measurement type + bool setDCMinMaxValue(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type, int16_t min, int16_t max); + // Set the DC multiplier and divisor for the given measurement type + bool setDCMultiplierDivisor(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type, uint16_t multiplier, uint16_t divisor); + // Set the DC reporting interval for the given measurement type in seconds and delta (measurement change) + bool setDCReporting(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type, uint16_t min_interval, uint16_t max_interval, int16_t delta); + // Report the DC measurement value for the given measurement type + bool reportDC(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type); + + /** + * @brief AC measurement methods + */ + // Add an AC measurement type for selected phase type + bool addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type); + // Set the AC measurement value for the given measurement type and phase type (uint16_t for voltage, current and frequency, int32_t for power) + bool setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type, int32_t value); + // Set the AC min and max value for the given measurement type and phase type (uint16_t for voltage, current and frequency, int32_t for power) + bool setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type, int32_t min, int32_t max); + // Set the AC multiplier and divisor for the given measurement type (common for all phases) + bool setACMultiplierDivisor(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, uint16_t multiplier, uint16_t divisor); + // Set the AC power factor for the given phase type (-100 to 100 %) + bool setACPowerFactor(ZIGBEE_AC_PHASE_TYPE phase_type, int8_t power_factor); + // Set the AC reporting interval for the given measurement type and phase type in seconds and delta (measurement change - uint16_t for voltage, current and frequency, int32_t for power) + bool + setACReporting(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type, uint16_t min_interval, uint16_t max_interval, int32_t delta); + // Report the AC measurement value for the given measurement type and phase type + bool reportAC(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type); + +private: + uint32_t measure_type = 0x0000; + bool ac_volt_mult_div_set = false; + bool ac_current_mult_div_set = false; + bool ac_power_mult_div_set = false; +}; + +#endif // CONFIG_ZB_ENABLED From d960f61e0a4c14bdd8b68bf0895265abcf86d68c Mon Sep 17 00:00:00 2001 From: Jacob Williams <47766188+SaintSampo@users.noreply.github.com> Date: Tue, 27 May 2025 07:15:54 -0400 Subject: [PATCH 140/290] fix(board): Alfredo-NoU3 changed default upload mode from Hardware CDC and JTAG to USB-OTG (#11403) * fix(board): Alfredo-NoU3 changed default upload mode from Hardware CDC and JTAG to USB-OTG * feat(board): Add Alfredo NoU2 * Revert "feat(board): Add Alfredo NoU2" This reverts commit 35ba26acd9da17477f3ee14a1e3f63fd11df5f8d. --- boards.txt | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/boards.txt b/boards.txt index ccb32b95da3..4b6aa7e58c5 100644 --- a/boards.txt +++ b/boards.txt @@ -43777,8 +43777,8 @@ alfredo-nou3.upload.maximum_size=3342336 alfredo-nou3.upload.maximum_data_size=327680 alfredo-nou3.upload.flags= alfredo-nou3.upload.extra_flags= -alfredo-nou3.upload.use_1200bps_touch=false -alfredo-nou3.upload.wait_for_upload_port=false +alfredo-nou3.upload.use_1200bps_touch=true +alfredo-nou3.upload.wait_for_upload_port=true alfredo-nou3.serial.disableDTR=false alfredo-nou3.serial.disableRTS=false @@ -43791,7 +43791,7 @@ alfredo-nou3.build.core=esp32 alfredo-nou3.build.variant=alfredo-nou3 alfredo-nou3.build.board=ALFREDO_NOU3 -alfredo-nou3.build.usb_mode=1 +alfredo-nou3.build.usb_mode=0 alfredo-nou3.build.cdc_on_boot=1 alfredo-nou3.build.msc_on_boot=0 alfredo-nou3.build.dfu_on_boot=0 @@ -43818,10 +43818,10 @@ alfredo-nou3.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 alfredo-nou3.menu.EventsCore.0=Core 0 alfredo-nou3.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 -alfredo-nou3.menu.USBMode.default=Hardware CDC and JTAG -alfredo-nou3.menu.USBMode.default.build.usb_mode=1 -alfredo-nou3.menu.USBMode.usbotg=USB-OTG (TinyUSB) -alfredo-nou3.menu.USBMode.usbotg.build.usb_mode=0 +alfredo-nou3.menu.USBMode.default=USB-OTG (TinyUSB) +alfredo-nou3.menu.USBMode.default.build.usb_mode=0 +alfredo-nou3.menu.USBMode.hwcdc=Hardware CDC and JTAG +alfredo-nou3.menu.USBMode.hwcdc.build.usb_mode=1 alfredo-nou3.menu.CDCOnBoot.cdc=Enabled alfredo-nou3.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 @@ -43838,12 +43838,12 @@ alfredo-nou3.menu.DFUOnBoot.default.build.dfu_on_boot=0 alfredo-nou3.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) alfredo-nou3.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 -alfredo-nou3.menu.UploadMode.default=UART0 / Hardware CDC -alfredo-nou3.menu.UploadMode.default.upload.use_1200bps_touch=false -alfredo-nou3.menu.UploadMode.default.upload.wait_for_upload_port=false alfredo-nou3.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) alfredo-nou3.menu.UploadMode.cdc.upload.use_1200bps_touch=true alfredo-nou3.menu.UploadMode.cdc.upload.wait_for_upload_port=true +alfredo-nou3.menu.UploadMode.default=UART0 / Hardware CDC +alfredo-nou3.menu.UploadMode.default.upload.use_1200bps_touch=false +alfredo-nou3.menu.UploadMode.default.upload.wait_for_upload_port=false alfredo-nou3.menu.PartitionScheme.default_8MB=Default (3MB APP/1.5MB SPIFFS) alfredo-nou3.menu.PartitionScheme.default_8MB.build.partitions=default_8MB From fa275971cdd8fd5a3bf22ea8dd5c7c16ebff4c9f Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 27 May 2025 08:16:13 -0300 Subject: [PATCH 141/290] Update gen_esp32part.py (#11391) * Update gen_esp32part.py * change(tools): Push generated binaries to PR * fix(formatting): Apply formatter * change(tools): Push generated binaries to PR * fix(gen_esp32part): Remove unnecessary generator * change(tools): Push generated binaries to PR * fix flake8 (#11393) --------- Co-authored-by: Jason2866 <24528715+Jason2866@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- tools/gen_esp32part.exe | Bin 6389808 -> 6084184 bytes tools/gen_esp32part.py | 180 ++++++++++++++++++++++++++++++++-------- 2 files changed, 146 insertions(+), 34 deletions(-) diff --git a/tools/gen_esp32part.exe b/tools/gen_esp32part.exe index 5bd12c6360d5a2ff487005fe8afc3e594b445d88..2e7b1001bb0b0c04d80635b8650cf090f5571603 100644 GIT binary patch delta 1380883 zcmc${349dA^EbRb$&x^h4UmNp0&E~)FdTt!BqTtVY+yn*5bpaj5K)jTyMS_RU=w5+ zSAj;y6K_Sl&2Lwf&WkC_-i2iWjZ_R81sQ>@}_dM_Oyl+0bGhJQX zU0q#WT~*yZY$;q7aO%Bl!rC+;n62wK!0~2$59hh8@yF`^f4XYQ@i9n0T{ZdmW%W7k zxChTG)o&mBL4A%puBgw+$FHc*DaQ}s`E=EU;}`Hemo?$oBY3trI{El5^*Q!<4W7dv z%9}}T=81wiYTD{_ruQf6k~;!k*g!WsNT-`u9-xa^7u&K~ zVp)JL9eDMB#{^wO;JVo8^+Iqj-43)9fh=kdt=#=*Lfu^!OrK_(rqlIFKn*CU>xAbn z-cN{jPNo(oLk0&znZjOSH;Mz|O!O8Rj} z1f44wFS&RTUAcG-%fzc^YD=9?bn6@PxWL5tZz~0zMfx*Kx+O}d&7b@5r`W( zjUM0RUpKI@GrUdE61I)M5EL(rdzJ4GN@EFJ2yWl#%^_6!i1N}9-YvLS%mK8NnRG*W zq&@LgWl5~)9!0$Um^*{-AN|5le%^kcLoMYHdGBiE)!+f%=7fN}ec-K>6RPM?y;ZtG zJ-T0-6so-EFXiWKxmNNh4`}!xThC`TykF>@!{vsirsu5n)n6@FJJN<9Y?wO0w@1(^ z10X@tUeUQPdCG*nqT3jbYOJp5aZ|ITDrIZCda>xLOjoNJN>pA(NpvHc4{Fpp_7Li{ zx|YV7MCp+7uv$XxY_#YeL!JGQuWHmT=H(yN&c-VjvWXhCnh!N<&h!0^L{l}vweH0$ z%kLl!EmPZigLe+eVJrEPkQTi@Qy|XHTWmp)m~h?xxi?w4I+!Ze57KaLczByC-)X?B zyX*QK5+hs~%$1N*p;b12HFTn(I*Uf^5PEN#;MtSKL&LJ$oZba=$&>VrvIHU_ssm>z z`W!PC6U+1sUl^7h_4xN{XWA%7MYY`*v?h-6(_!r#y0aQ}1#OgdTJ|a}`wLWpLDgZ} zdTv1GcFu!#+JP6H@&ph?=@gA^8)br4YNl4|X*^KspdO{lfNYhHpr?-mx|6gUG5u$N zB}-hq=$1M~@Fn4qY#d)3p3`yGIl!%PiOP*ZsNUraCVaJtR{=mRKT}`bVTX7FgDLvt zclC5XsAYevWxvDI4T)?YpKs{IJ}lX2XuyQPbpBSvxDKDI{HwCMEf{^b@lSM6@t{B6 z=E`eY7NA#n`^IyHnP&b>MG=8!15W(7)_h~Yt$w%m^MM8Of$)`k#zKDO+BuCiX zcYRYwlj9&l%lrWv9GRc-bxnsvx9ZPS&8}0v7)VT0TTetgk-WC);*hfdYNZ(9&jpE%L=C<(YM8d$+5VKfzx$<_J6c@GC|~lXJk=F>YDx` zl)?e^b);TGcvK)7h*MFJzNH*Mr^I5Pp=c+F z0>U&PpsK5&*D6&)1^bLQ-d8KUi3)S1eOc1K)M{&Z-{^wzvyqo2odiJ-poHSS>GN$T zk@h~TK_dye2vAg=j0$|lJ}9xBRvpg*{Gi}RTY)l?3aZeF8Z?hLYFRD(!1*^VSFxM? zftYU0!#BhvvQvD2%mnrXk8Ksry79DD6QU-4j0(2==JR=@P+c3Oyg_)`R`Ox1AQrrh zI8VxZSL=SPhTm>&3Tgu`E4|WqT$`?}mXB;RJ}x{}9gL(C%D?E%JtRVT_fMY>OJAs1 zS*Fqzz)!TfujS9gCHKY%Or^T{X9YF{>q{PKYU{AN-is4WI-OzL>L}o>e$s>lns4?I znrtzgSgd3wUEbb}>M6c#i!*Fnrc1bGZ-gf^8@BCFxCLxw3$Q1^3Muxb8#YvmSXKJ= zV!HGqpP{%L*b9`)giBfKkTu~@zM+jpr{h~pZH0?H`M*qU*^~UH zsjc|>Ko#BIPF2-aRL|rHQThVa&7?sH_|@k#OBJ3a0hIMmom}=F&@S<5v27d;!qC5Y zvmVqb>%AC9*QyBWDTpba1J0q!Y*dNL6@EplHH2!#suIwXcukG&fJiHEP#@f3`|16b z_I{e)FKO?W>AgmKFUPyp^;ujxT5>28bG7!0u7j7BcMp2G>OQos4z_^Xi-!Kk&i<{G+2%UK8_jB2ZM6UQ(53 z>Ps~62In(O=g^ryCj+f;N#nVO;+f#Tc{@xYbjA1^hDLd{1JCyz zAk9;e&}-`1tU9ER*E;IDW}K@5+bLbN?l!DgwU|2O9g7kV)MYllCo{mCip)`UnZK=7 zYx9>ByseQb)@2ewNe7C{%m&Mm)lX8@Bs~tyiEt0G<&>COtPab{0tg-^mtmVqKpL|L zDN9B{7d1=^u&3h}h!De~iS%^mS;09~;!7eMo5^Tf$}X^nV2TQx5lqPDfD&AU-_f6x{fo)R6f z-C+_X8>?K?Fs509U;2OhL{VN!z!ub;BN`dFX(LECRFT;@ZHnS40 zsu-aW<3WKUU-bF>%(D$9#@Q`c%d^lx(gD%oQY{C49+D#7<9)_wHwthiz7yT5MQKPn zVct%p`;3c_;e(0l2zLGQ4#?Jv@>0pn7o^h@N94(-CFQ9sFCs7Jf&ULQ`RuHf`fW%-0&MIMdL-ET*Oz_V% zIw49K$rTK|nO(r!rkE3NZzjzWwiXYi9Vo7s$}^y)P}LVYL-BDPpL$;d2g8a8b-cR6 zZ5qcXNl2C3&}ntkL%{S1!-|CI5s2y09m|dAeue}MO(F5?wsSfrbt8OXSs>apmBpXz1ml8Oee6U&Y&?_X7)AhTVG3exCYgz>1O zxg}_pDm{^?ls^$~nv|~QJw?4!&UYfbr_}z4gK1PA?Ez~?2}Lt_hlwrw88jG^Fg>}H zdS?q&tk6WeFkgILy^=_C%l(wvwSBx{#}syuXLM{YB;Lm#?wAoWbTyhtsDV9X=i56z z!p86p_xBUy!4{eUCglSNE}R>CPt|~WA}*KcdajR7=e&j0|1nkR7pYKD`Vu4cCuxJ{ zeu6z!ggpM|{mlg7eZKGh`(Q6!y5G!7d6$H#jI+YyOd^ju2OK0 zSf*-{abjMj=!&VJnjv>tHORrF!nC%;Uqo=M=V|TRL|SSyfcW$oKe)&e4unha!zuOj@^|guz71hG9dwR8G}S1tY22lofcc z*tZzTy@%6BY*!f^S6|uSiU6SP6J15BogqqJ-%&N`N*Wq5Z*N3ARGUKQJ8JE=&>Bux zZlGamFWukXL7vnl1(xR{U52+_wo1?yE^R|5<^*QHUSUb~0k_f{s^lR@ZnJ_lm#3Ho zJ+JN3G~~)kw4zE%Gv2(bX{H{F7U_Fi9YGu7Ow#@Jh8VXf2;<}Y{cz>X`d?NKNbqH^h7|r(bK8Yh+Pu}bEW##RWo>&>*7c>SO z^qtGetIBa_jKvJ-#@|b9$F}lgiDH+J(sVi_Q0krmc&BveKRiSG@`2r~&ByPltNU<2 zf8D6G2Y;tq65GVT>vkWU1%3CP2sEX3Pi7BsTX(VZR#dkG*mcjwc&GHBzdQ?(F65r> z@rdp;Novnt;>k&!!p62^IzxmdE)nfS^7%XS>6Oe)*EwzfY;DjlIc{7=v3{%423JbNNd{~z}MiNyz6+1ic} zotI1?uJ>&Wmvq`^T*YbeJEU}J%h&dZXt$f7xa0>9X2aOcfvjhImP%tQQ~(lKz@ z{`!pJ(^ADDOfr zMfbws)FttRpPi^w14g1z8O?8|_Gy?YT{laY6`isq z)mnC-Z@+h{d3!@uWQ^Xe;P=v&?qH6gk(Ov*b1aAhQB7T>TnvZl;38H(1RI9%|CP@IOMWk_U6 zrR3&irIxDxgp;E1pJRd76)q7Iq`&#RpApCGYR}q>dD$_1Wdy37HT^*aiM= zzmbiV=hW6Cm1{P&b&F=__DpZiCOU?Z9bPqlWRk(5td4CnE&j1tkkg89xXr*@u zN!K)z+Zgg3&rUbRd!9u!>KMF(D|mrD&=EaRo;X>z{8K2F;?UhWPmc|WK&E#qlFgsv zyVFe}*HOm12I;`(_{DTn*!M_#CaQjl@d9sdjt$#KkS-eJ7|#Uc1A^!@$WC4W$g>1F zq522LH~6c7tR%=A8e|o(24p%x7HW{i{5Bw?2_kBc@jPKbY*;cuqBV$xj~fsh-j*Pj zRD0Xl$yy ze?UGVNCOSBoj(G|GXyyWI~E*yp1%OdVuEbeAWQiHK*kefsRo(MZvv7=kRcjG4KgL+8UPY~nMXMijv64*UHXVDHng z!)3n3VhX!Npl3AD75*I>IZBY38suvpk{KJeogjTQ$UdF|$ZG@%)gasWgMe%x$eG_& zLSErd1G1bTTQtZTz88?01X-y;X7gVG8BCCo8e}qWGZ397NCyof@*F@q5abrZv8uE! z85kQLL6CzQB=Q-)d7vrmDvTx1iyG(#{|d$aMUXifq=xGU#fI%7NV*1rtp~^^f;7<} zpYdscJWr7Gx75bo;!gomM38M7WG(+3kU0cdtw9!W@1R(g%frNu85h)0i>)6P;cRS1 zV$RqwEs{?7jE9i}Xip9Lvmd%mgZB0S*SRlV^tFG3KPnE6eh1@70dPEgMk^s<5SydA zSNL~gOZFbG62XB!zz)`+j9dm5RDEVR7Z!5lGkM!^7^h0^&c$LqW^bNVS`VSPM zX=oF;D?X!3EvIf|Aa0=U|ETz{0w1{Jf$K9)CnPAKXh3pR$Z)lozMY!LTrTjhvoA;YY56^R2!^((GtTQA#n-6(?fo?Lgx8Lbw{{?>#u~*q zf8LrKyk4y;>?7 z5_ArwVjE5~@w zuvU(bRb)i;^ie8duOaOzR!3Vu`5ckD77*zc_!g_S0@kXCkJcAFtD-%mra^|JZ>=JX z1t0{oCp+1`4!~D|1sVjnuE)n!Lf!<=Hsq9jdKANnG- ztv~JcUH$^)5Rr7vhI1_GA3?TS^|va9T1qJloJCEfC#m|0Z70y?qEqSNVF40je(bRz-R0jrlDO# zT9t|sk&Yl0q_XU{vjo0jLuXtC;327;U={Uyz>v5G1dXEO8bHtp07YdQ;B-C4hZ^8n zwa(YH#1~qw$!A=r0XCm)sMd&xXd!=T#M1r&fSb3cL)tM+gGpszeuYn^{@7=T(opKn zP_@d_1;q0*(ap0=giX=g>wN6UHjVUZv7(_9aOYZ}X?o*b6<1w8S}Bhqfk|R`3RJkmKH;55zs^?ka2d>*TnXrVEgkLV6O%+c|(x8k-I zYXAsrCk>EOUr|d9@bA;a;qbXUV%$2R<)8fZaUZhHe8l)s%*Njt-+ye6M~J+fbaIm= z{hU+OAlBPfelTDU0Om7>0+3mB!%h=Dov_@af~gFoAl+yDdA8cgAT=Wg^nJ(EC$wg} z_>>6`wqJDuqYi1J5PGA>p=a)cp0T#ozRjE3NiPkBCrtoQ>(;MuR7-a8gm>8lblZ0LE=@n%s|gK6zlDMGsM}L;S<~ z(Z7f=SSwTgU^Mt9U_Rqe6`-F<2<{;mxPJWXq(CafgXP^?7e%}|!#Q1gh8M6R^ zUH&z)RbQ(knE=?L$3xj)TIXv?6A?4OWSl|{7wDN1+vr7<@NPl!UA_iM7bT04e3oyW z5*xMs~Dj98YplTKR6Z69f2}5&;@=IHSHsaQG-!o&(52g6!5HIQ9g{RD!J2Ak+CffD9l=o(37hzXGHaL3(PCM6RC>UK1op zgET4PJ*Jz&t~dcY{X6M+<8OT0^w_Wy1bJ73oa9dd@(DqfX^`#wb3mRU$WRTko_nXq zvUxmg#;8_D^C47r)xKBv5Za*Dj~^tlKB`RSjv1LPlOKnozzj>VN=Hc%nXo$TB)d&n zz|YR;E&Se?N98YRUYI86>^H^Aa?;wOuiRXi7Ob=1;G6UNvK?H>AK2`%6;$m>5&M1Z z-XZd7X-naj2i=ZQ=8@)6=F#Rc6#ukJ=dvV4J=15Eu3|@6xrB2Y+KC!N(GO^uwiPKP zPNxpjupvW1mqS`w#DTh8<#i*iX4qQZZ&;~DFk$-dMs(Q9UT=9p_M2l;Q4tpe7 z2FHNwV!|0Q^}7X+sTvv~sl&>7^t-rh@ys0QuvOZt_Lw47D~eDsb+0{FO!!W8?q#+v zS#F0<4EV#)CS7M}gIxSsrTw)31N4svtLmwx=&Kf;US|JMbWZ~I8L{|=q1X;qd4sI( zPP2U0fS*N)h?GF2h`F6hjs19;I=P>wxp@k0zTlO z2RmKc1(&Xj3i_3TKlj=s(jCS~48Lml-0~T#_?Hivu(5RGpNj@m zQR3ie(Zi`in1h!;+=l&|pL^JN--4#tWIlyn)%ix)Fitw4giuIM^H!)}E^jrfJA0Go z&dQG(4fj+%@30jwiuf)D8~R-5!4?pwlB7kJlsqA={w-UPl$X}e_zQZgkk^d^j zKuEelgZ2A)jIHx?S_O5sJathB`+)y6zhk##RiLVsPY45jc@Iyt<28b}MRmsdDW$QB zc1UrbFEKB$v&i*e9cB^;4TaoN6M;YQg9V+N?@;YTn8vr1fhrDlrtEtjZre1r!39FC zQaa$I3my+5tcUZGKIv$d!BQc*GUqAh(QCp8)G#vr7(3KCp&>0+cKeaeCaKk!n)7h` zjNl#Q&>-f+m)K+2ZT_tN{;25Tf-WB`PXnLv?I9#4qv$|X;9~x@y)XNmM=fmacybuQ z4LhfUF+SrlU{TQZF{D5k6>J5NVVjc-0qjmq7bQLxucAArFf-`@IbL9<&o~#=z<^I8 zxX;*-DplX6sMY^tku)meD0ASnTV3f5tn)7r4}H|Qjvv8SIl9IsU=rYYhx z_ScGlP&50PgVRYg3+cB}+8rX zeAC&@5%C8}=J9e*usP|8b^lW;X-J?ssoE-~;bh-`TIOENq#uXP7*0=_kDhCD+!w#!A z4SSN6fYDJ={l=1C*1W)kwi`;Gc;ZnOUAZ2ITIn!`xiVA5_H@?Mq}DIwZJvCHO)POe z`IsQIh$_*qJIe&qlO-3{FK28!pRpk|)QWX7%au75*yfV=HbgTvhgUwGFZ|M^r0X*+ z8H}cExg&n<@)8_k{Z)=)*(Hsh9WJnRKI!>REQzmqel~UpZ{qjWlIbs)1)_G{A&Y+rXRFJ=cEzXOv+A2=qp+E@ZWfcUF8XH zRX$7Cjcq zQ<)21V`=K-#rsnmvAcdsIe(e=+L~Z`{VW+&_TfqwpeQr&1FMp}z5zf}CVj_OY>kZg z3Z{tC1bIbeHoel~C;sNvT;b*=esk-nuDMM}b%r&>LwN&>B#JlM?n5U$r&XAxTSm!qd=6Rl=m<4+HEG`ZI~XVZG{4b_b=_# z=zU!Z%~{R|Ip6Hy8vn;Z+;CEo4xPEk*3 znXCVjxe1xg8zhyb=-+UatpEIXq3thuFcMUI=>p!AkA7st#&FfVg{9&%R+oHG)=XfC z)$iFSr2fdIz1@YNANlURi`kbvdEXFW;CjA#UyM+7p1-wkhVaok9=5-~P`IvS$o@jc zX7cKaZb6Z=QT2!oJgD;h`xno`ZpQ&E4G-c4*3wKo6p6e*v<4^qRcyky$dzh=M$v^G2;@@9-Be^VIgQd6*lIv2xatq^Ppi5_zCie217{6h zM788nliR5&bym=P~-R<7cfh_bcu@UM9SMvZVaPTz%tC z!4y2m*`&M>4$)AGk8$&r3;Gw2A|=22nh;a+>({jc>(0I3O%d82 z;?^@Q*^hkYnV9rjqd>naKvZuH(Ppi4S_JCVUs2)aV7z{*zA{lN-&@CIoJA3(JrI8v z-*@IdHjQ686U+MZ@Uv}&s>+h?XTt)+I#&?U_tEd+!|QJtOQ!uWiwUpn<44c$WdGu> zA5U~yF^?vm>So4Rr3TnxLL*hm^Lq%q*IY3$m}R*dBz;2$cIG_py3j{xIFIkYkS&Cs z<4t~gQ%Kp*cl;F7ruPBNuNq}y0op>qh0r4~g6eLPGQ5EQ_EZ1ypYMZhTIKVOlFX6L zqrP$_Z0#my>#JOMQ)7p)GqxMGP|?TBNMWHKB^JbEJ4FwC7*rB=_lpnM8Yx4{f#}SO zSFu-Aaknx|c`+9QvEa4wERo7*~kGIn#qjW zG=FdE-QMAp$&>cN6tsoo#0|Qib@Qe*wQ6C!=={@XGgzex9M^eg9|E%yEL_5S?+%_L zwQA8uDI;?2J7s}T5e+O-hRNGN^ZBwQp9LrCh`21nhqX`?InpK31>0DZeo^nA;K~=G zg^@e4&^WXj3`JnI&YD*cfkPXHA}VWGjazv*pz*WCFyMNoRAEgmH$2_~AW>?X>A=yB zUO70?5hE6#urB1vwZtS-+?-&5-Z2f!;KO{@lL2lb$GI*a*v7hB#m8|I(8J6_<0YQ zu>T=qLR&QLxdDB3#hD!$;nmY4SWLK$F~!}Vn>Rh@kazen|LxL@CS#~r7qyrwpGjqW z*5!7>#z*+t%f_&?6wT7+&+13`$Ct+l-|XTcKgT<2A*E}rQniITjey1>C4>eV@_9({ zAPOZX!0k92EegCxYl{Df0nd|zxQ+4xMbV$Dtg2v zphKXm7vuCRg53$2$(3S4xmf;7f3e)tKeZNYw%mbeA{!B{2{| zmt=X%)6B%j{*n~G6%0?h0T*_$^EPgA__fQ+PlCRHD-uF9srb6ghzU|roVZ)F7_iH1Bg;_)jd!NtzElv3Ln$~C~-}zhb7Wd`*8=Yg) z1~5c10VGw*PkzMOwGyR9%1<-=C{5bbq0|5blzx4LwtV(=YqNb9h+B@Ox* z`s>2ssxcu|TH5)Zew8(A&<%!ma3;6ZPT;T9w(is?GwD3tNm`4M$i)3s>33XTwl`5; zn^<4}+o03i9Xd>YDWA3PM%Qai%BLR_ABF})FB^&mG@wL~=whDUcr_bJ+hn6@ zZk8_b0l#;atq-!)=-fhVd8g-x0_D>yKt#$ik5W72S07|@a0M;~;gI;Fa{5d*Xw)}` zl@83c9lrxJKlOA$h@o_^IbpAQ;W^)&dfKpZDrL`Wcz1TW2RA5n$o|@}(oES`?#bR$ z`t3}X#hQ?EOWm_5z*%17Hsh4FeWBd%Vb;4n) z{4}+Pd(T6&I$eeJ*vtH}jS%Y)2_IAp!(uue2533wH z$c~sd_fJwCAZj!INZpAmatOXPY4(45Mt{Q7Jyj` z^HWg>hiWh;FUG-H&@DKK+q;P>_y&^sh~4y9unn+e752R!mbTzEz|vJ1%rq6xvfxR; zL>0CZF!}RYEGT>-qyXSt75o}M`)706GmC``8>qpj0=@ubOpKduSlL~J%_P_Z1eqD@mhLtzu%-O7yquN>Pv-d#Howeo#dS~tUg(2qDgA3Y# z_m3@V0inw`C+x{jEs9$W3RRJDmLKp2I1gZ%3Noi2El8swm-d?tA6B>{gU!<6)MI98 zpJ9EuIn^UwG{|KkRU{DQ=LAh4oCks-93j7YPC`Fg9k^XZvkxdZj`3bx4c?KR597p` zpAuz@PFJ0h0x1K7kf!Z;W4N z>w{mx*2SEvEbM8n$V_Ai40NK!lX7$H9h^t7_>I9_K4EKsNTTR!B<=V11h&U}TrGO; z=6Bxj2t`dr+=U2(0$a;>3d+@wu-0;H6pJeD8Nj--;H8^&y6$D3r{&p!YyjI<`mVrs zFk$f~IX{qzY<%g5fvlVb&wlG}thY)(Z9rHv-_WoIm+lTGtckDPjrC0Fp+edt$Xd1jwt}=$w#hK2%qoSXuYqz)$&nfY6lIlK$h#uhg80=Nfa82~ zF*!iE50WK)mA>Yv@+V5dKakvO0jE0`ugYVM%)*|KUox`RvE}=}?FCHk-_#EO}ZB*0lXg5N7WX;;!h18|BJ~k{Avw!=LEwnw9A7?kY(1tde6}vF<^| z_{@e*+Ao*4Ms1f{uwlIl;?ZI<@LUBw@MiT?qj#dTB$yKE$&2FcutTdAr7MUu?8?A6 zR#{T_%eH9Nv-P}S8=MtB6+JRb2b3QXgh}0R)B9k(2e@X*mC-D@EpVEf4ZEtWaN;yn zMfwX~Y)dvV7=e0a9*%&^AH=bi&B&yqzlQg8t2=A^K)9Wj&k4DtixZS>s3B`;T{p6qx7E3FuQLN2K zxSmPq5m>t8?<~cMrvHGYxOrJOW|Po_R3UF_!{VaPMuMeFAlXaeEQZpCI6xPT zUMI%|@~T+&klwSAOzJuTY?%9BvI?g||JPXc(i)Xji`%leMr{ya)L13I)t05!vF6`x z!J58))@*EE$C`9lA1Z6^7P&n7p22_5n&s`ln$L+fJKFsNYr^ALwBgYxTSK$k3`Jt{ zc61fUz2n$ZdXG#@sEK0}1kdB8ecQvJV-00r97|)Aq0gR0hUGt(u*J2Y+vD~Oa z(1>o2WnvLIZP=BSvTHFWgtKV1fN*v^q6f?PLE(qqn~i6huIoB zYjNZDj5>!7DQk_;BnR;g0F)YQC@NKpkGHjQ)=sn4IBW9^#ajU)C-#ui7cP?LWq-k$ z5J%5?6@9K_q%FzmnPK~o>fcO1Z&GsxXRY4;D3yExUrqAPbY{m#Xf<^`jS(4(pboY) z6g^@=L2_0K3v=kc1U$uAJI@y5tSzvGIcx2!RYIWwaEsXU=K%9$-plvI#4WoEFgg?dR;otisL=(i#s z(t;YzVOVH#>8$9{g11HUP zBoe6`A!68_wi%^xqO<`K8tSVwr}~zb!F&z(VX&+QM-jOLmXukd;mLHo(V}Zfp6g$5 zLooJeH(kmWVQ@yRSRCrPO}oT68iKQ=kDLM@$pN%dLH81qzvr-rBja-1)8hmy%nqwN z^ArNNin0sV4xQ{IqOfBVLwgD(p4rKS~3mWtE@(f*3( zTeR;q_&oo@6Fear4iHHi=dtH=D$`IJs?neZvDEFb?a)-9bCd#dPAL&(6u@%Wvn*2P zDGGz7*U@x`BtsoZ_;MChkWr(_jSEM9qO3$zW$F^qE_t(Q@V%K^AQ#=MQyinF9I5c*MS!SuBl5!2F#aSps(5g-LqMOA9m(TCLj z_d<(UnSVXeg!b90e->Jjg_d5}i(} z*OI61(UOvW@7{Yg+rjrbfs+5?F`O2-11v<|zFPvNwUn8*MOPy;Gc7q@R?K ze?bWim$KykDXh8hZMAIf1O@(mGkHoUW^`13<@5QKOej=K;gV#Cpsr5I)U3|@9t-|m zN~ZH&N~VUCj9YC_bVBj-uw~s24r?Wps5)L>6rtno{1Sy zVbRyzt!PTe4p_ZZe=f^eCP)RH%n4T#3Pe&flVRQ!-&j6I8eyVi#i~AlS)5{yus11u zG)iX+^zFecJm_yl6dc#2V#9nd6RTX!lRu*^k=IzDf&Cw9mcEG4;KV zBA{${&ZyC0riW9N_2tZW&+{5()TcDh?T0YUYiOFo13*-p6oSStD3`+yW%^w$Z1%!^ zx`RVA7_%8O_^{F!XltSSiw`WuJw*THoQ7k@usLbGNBbw9C=I}14~VcwW=Um*kE!Eb zt_BTU!5D5cGrKUV1L}r5>F)8S;WkUb2usut_vSmZbLL}pv$L=ni*(=|I!(~}^Mmy> zRJmt{YIe+!-F34R0qoO;(yTtJ9b<7XKVWe$gzYhX(H(nck>8#%CshB}_KbttuoFxn2TwMM)<3_`%q&%27W_2~MGj!UZ zGV8J{h!7sNHNbDRJhd#nX_88~@<180J&QOLkKzdVaf zgFDM`!z_npHQ8FL+{mF%yERif?7rhD8H(r(#9gLN5ScpvURtVgLA7;?v47?_bto!+ zuc^}tB65$7^KaA#HINRgzsBlNjh)-7om7OaBsy0DU!YD&z@DhPD?O?PI_-+`>1R~> z3K=_wqIXc0708BCtg!yYI~Nw`#n2mj{$g?BWP@rxD1&#Ac%)X^A}EsKFp$9})p~lu zJ0Uv*yJCVp(_iV;|FqH@pZhCS!y~G->Z?@k7ejFZYW66gl&bffReN7=3p$|U|AYfT zDjr6k#s_p!2YDn$42rVmr3aI_r+)VZ447I9>^xlUTE68!>^fqaTGxkx%6lE)KnD?( z6L3>A0Hyy`E9>t@)&q!`XhzoDdOePdNHk4U3H-}6nfy1`ptWjS-7&S4m%xsCs{iUA zsIusvJ*qChMV8haTb(W^OKZ?SEAoGGNQdLF$6XF->99V#7h^Eoi)t)xhkPK3b&C25 zo^$F~hGKXDIwc*kNY4(urJj_-da#(hhw4|`#}&#C&bK&RlN4wRL+J=8-aYxyyF2}QcaJ?x z^@M?#xu%-D%EN>K)eObEhZOHla--@jKU4ld*T_sIC!jJv^`xqLPuc?vrGMrRa4l8A z7HL+e%ml@fFiX5q9%`SKDILx%zU){&?w>3`OY*d+dn~|qngwWOkJgz4um~`>TKH$S z=+p^yCSYbjb!O_3rJMcU4mnyoFU+a`+udV#jzWT65cK`|wO@A4t=z zz;IFWo28BKC91i%CD9Z_BtaV!Ih8C?N3TSSW*}w;RA#2`U%DM*XEhYlC;cobdGI9H zsp_>L*y2deS6#`Y$~0{BiPFG3KIBPo*RNksSzR*}v-F!sCe^xi@O^8OPd33;y<{hhGLO4D8+6_k66^6<37VtWhN#LdC@QtGo@Nf zO15YydJ1S5-yHOE;9a`&Uuy3vKSCXO$H=5CTR!k_T{Bpcv*hEctgFM@mPq?Atkt8+ za`2q2)g&L(0)x#uPt$egqDtEgGFmNCHAw=Lo!@7@%W6$eevD+a-fE50tX3;~tX@QW zsX}2we^rN+1f$My^$Y3S<~8{Kr{-7I&bdq5wUW1{vFXBB*X5RdS+v7{aAH^##eUtO z!ez#*Ai`enVwJ>TIt0|-BAKyIH>{5+HMF|2(+#D`%2!*-HIyoCQ56|hc3eT&z#TT{ zI@4)B0I&eZS64(*y7hNM)Ds&B@Y&*`sNr0vyuU9SHo#kg$e){!h3RMBsY3)6+Np!+ z?4z^m&C(ukBXl#D9J%9)#a;M1>}v})IN;;wdV}C2B*LALv-`33u!);oHAFCY{lTJ? zYS>kfa@Ek-f@>|sC+wj)0S86*h+H`O-q;+;rK1WZiR!gVoE}-nJyzi0BlpKIT5$kU zq)l^3ICce>#wAmc#v+|=mBvJ68n$5utc*a_xT~a_VS_{qS-x_D54aJS9%#Q>mu=WqRhY&W+XFM# zm<0fDq53TMFd@s3c^ryi4O=aUzCCLM^O`ElYC(ReKT9wqp(%vM({aizN?HDe96SIU zgXR5Me6}ra-WKK>0iSAO+)Nza%AJC9c6SX4_0yzYh03MH1`;8e6V1CxZ(}zp#!zbR zlkZf_`Q~<&a<6ojK48g5|Ch$C&;RvtoB#HIG;SlXNdMm-w*zKoWR>z+Ga~Q1RJrsI zU&G_-@L8h8ov|2t`d>7>zNes(GcW#Teq~0V0_>t5#I3hIg=vlH790*0VT|c6*W$Ye z+KiEwXANM>ge{xoiv!r>roA7kp`C0*Yv~J61;MK=aov&!`qzw(0rI*G)?Qfuj=VjC zJrtb!q3X(alfP}v+66mt5Jjgnnjw$0u&Pd9qg;PmaN;w(uQ^Kj6sTCF6SDrx0M2#fMpLeVCm98#Lg z-)6EX_~7ZJMiObJ(up-}A54sc-(W*f1*UneD2)p)Ttbl&D)cP4hp~iuo04u`@u(V6 zwf9Z(A$pKhn5wgNA*3anz~a1P?g99iA`YwWS*TZIRqmn8`Fo%tv)cVA69Z1A{<-vs zRGH-MriFFxqvCB1+d{G=h7hc1*!jIdbZ0Zska0+Kk7H(^8qPV5O?$phX&OzJ*#CZb ztybx~Q7#_HIyBKgLzE6e6nl(`*0E{N$e#~n{hJ2kIFdCFpDs7%zfU)HTMfM?8wRoQ zVMDRd`Okljd_Z0}h|LzpPm<3MVsEk%d5y>lhDwt=iK$=OmSy4Sgke{+yL>zxcnlJq zi-UDGt8@@%b(YjzS@$l~7%o`#DO{eYvt>G$ce>w>V{t+C#pLWP)*^b0hK9u|2q6}O zFUyCMmDla7y#eylEF5eL__eWIBeEv)t}GTg1RGtjV$ghPxOB$}yVLwgw2bzZ`=L_n z?0I{Cm4cxv1#nL9qM*%S)2la~aYy$OhD^_JW%hb0RyPmpKj zu(ySs2js{hm}2jakyD4Ti7j%*=ybbDhP@G%)ifpD_^J&)H$Fz*0<=y)JgqinNuIIV z79mY4qSYr?Iif=2u!kYJ)ddZ{P5X&58_IeJZC=$VSb5P;!GYH`3bMz^yN9xOh4n|| z*}0%##3-5PvMJG5N7hl$7zR?@z&aAX9;uP=IR7US=Bv zE=oF%?YISxIBUZeMY_!hb%*(C@J(&WQXZ&=s8{?Rg|%yubw_8KsqV0I$W6LokxsfF z#gU)#tmBHUKit7Aw}`8=nN>sFF^#j`fu~a=Y`qr*<+w*+RmFjy3?HT)7;?+%NIkZ& z%02k9v$pXf({}hnI&Wv_CEF#GI-VLK;+z@TIp0a?f!;{or<*(^wVcQp>9mlX{A3ZlMcC}lxX1Nl*tIBT~X>$e_B&DJlG>&R}4sIuE9N& zYZzKrMkjnOhR$Q-{5uo?j$|u~rqXI%g$n^4H^Q}amc@ZWd`^51u;TY>I3wzDn1*Az z2gmcrt2ljs=g;%Ua4p@)5A%FlEI&S+B{cu?0?Bk3q%r0dL5K6A4ZK5?`BUTr!&z*2 zGZ#?;y)`C6S?H2)4QC6YTd4(zY4&JkKf2&oG6zS=MI%_hu*dFz9HZpw5p2%z5f`x> zNT(O|Q=WT;RB42m`b9xQF|}29WGskRoGLU}Og+6QM43YgDe#mxPE2Ukm`b|!ZSnA4 zR7R*-;Or~%QzKbi;~ysxDjfi&k5B23o{{$f9JcsngbQ(=BV)0$ELXk`kWl@y+;S9a z)vyQTS>=FwF~K3}*PX+SkZ*QlT2Wj&XggV&-Ug|a%Yvm!m%aeG_!fos9l(ggJQU6j0{yXVH|JCMTe>3AO3 zyxc<)v2N^q#en(!@axnqy|0F{^))}pw@0xDg7D>8{L=%^$q$ZZCdZB#;QjUn2*L%0 zuqnV4rO*(i859Oe4%N~DI9GvhR;SDY51o61Mdu$;c9@7^iO5!79|BZo`*wK8QV_`{lARtZm3!cjQbv3sE?hwQ_uw z121rOK|H>36M_Gu@W07}Pc9;`&<(r3DGQ?Pxt8Pw@wCG`I6~RvM^~@SC=VBcBz&Ba z=D^LvU?|QS`cpOyC zGAtTm-W5>Y0$=TVP`!EVs>SuL-|!>pJU9ggZjFc%Q?D)@gYWpL)MQ5}4gJ)J?$BP! zVaMIX5J@dhi0w{-u*{Za=9|aN&Kf^$na~}eO>~WjqOA>mCpwRZ&4i2yGtMVs12rE1 z3Wjt<-R&^Dhc!~pkX`XCb*yNTymK7OG}hjNrhy%01cCl(6`do}?Z4b&L$Froi zwfUF|oqWb$@$|fi9w-v5!yc;J0@QrkELhBX1T)zme6|c z(~y+9!xObx(rHqU(iMwz)n_buP@X%1b!PGMOA}akM-~`Hq>=j~4EG(-;Ww&me_?l?h|7snZ7@ zv~ARRm^H`nfhmnQw?xDOKtmV~?PGVzu7}a*or%MRw9{-Da{x^qGc?Xr42^S6`HT@5 z35>Ue_SQiIP<+PUW~i`4Cq65Y;X^p&JOT%!zQ<2a4TTWSAoVp8r{F=xTWE7#84PLg z2GT_t@K23MMiAZ3ee)*4PTN#qXxo1_+p&p2T8BV1(TWM{tvGCd|+{m*`2=Id8@^uK(n*Vgv2ZO1o`Aw zu!;r1e^7OVTs8$Zb|DTZs+=l{OBcXXw{hc_bdTp(r5TnToEamz=>uVr&MI3_w-m3u zg9ko7N&*BcB@uyXSF#dmLQ?BbL*;Q`xZ=Itl;wDFCbu;dU%@~r^N_-jq5$sh$1CUB z;H(bme6^UN=m>B$o>k$1WPVE85O_S!+5kflyajCDl>s!6K)3XUm9GGlZ{9vpm%p)z0kOoC(Sm&mB?4_WBm!-7@RghfUIW7aWwyrose5dp@}pB& zM3@ySQZSSBQM+JLpXeXcX=rjg%nJo-RFNN=QNZEz2$>T->1uhOL zA0g2lVu~+&6aQeLogGZ^m>1)4X&(mh1ZcQfVA2mHrDQzF$EM;Nf@_Bc%1=DN+J!bo zdB1*WCV%<>>)h@XKKH6Yya;LF3r))R+2k z2N0(R1`VQ$aKM#znduAFB5sG`GQyj9#U+F^`PV$w)G-gAY0;2Xm3L0>wL2&y`0vfF8z)-+&ySF(qq+pS(?tG6L7mAM7>=A#VuVaI$=vnZfxtS zgyJ8W@iVtEI^%6+UXv^zo6aJ~-cS+EIHFCLwD#YG9a`lcdaSTkYq#22e$3nMPP<6I z<87+7OLQTPv+8F2lNwS0j;ePFa$;o`s~se_v%z14^j(Rr2r( zPcSAf3;#v{?rb1_dD)WuP&_UuK5+8Ry zl81kq!q0)3W_0d9yQIQDzum^6T}9cYUPYmsC=bw0lyCob6XkH-O_VeLXK$i7?!Joh z|HDlb`J-8^>HpWaPmcb-yM0o9*X@%^_4dgTx_z?$KfQg@MfxPJ1`}Dkee#BS6Ggn| z_Q@7}Le(!%Tl>jv9zn3a@UJufzqn~KkY@hC`kN;Ir!Jc4)hjA=)5I(Uza%%A!;%66 zUcx^fQq!fSJbeyp5%Ag(ftPuj3#V7fIdfUdFtXF!qwrxkTuR&`m(PKBc5{(>IZ*h1 zk-TLtYbCds%c25)KCG2%ua>h48GfWLD$*GCmK;2fb!u^|5A+9&CJ+641DVP5<6*U7 zh3$Jv&Y8!$HM_AAJF54q%TQr5J?Q#xwY*^-yPy3c@1Dn^o6dqCpqb&t6=0^%STRh# zgbc@it28nWpWHf#d%*XbeN~ys-E3{KhBb!9M8ptVf+;_YJm8?psiu!Q@$K1rE`9Fij^Ek~@7px? zK5LT)FJMW+9~WfD0@jjkl3!SWYeAdjLkn03fnSiXEnxBeUC&{kN|aj7uYi%4r+)ws ztGmZuirXY-rJgYqAtnHg4Q)>w9#S(b^tQHAR^(dR!42Cak1t>ggyiSsqXn#M)DnDa z7nR}D3JsM2uwS}`lFIxaWuuLK+;~!VGEr~^8KIezFl4jjQ#Lj-;AVw3@?8pL(azEu zzS0c^{~y-A1iYzg`#0yLfdUOF(9jkr6k4EAhDsSyLZKamIm3fez4-p@2xeC=^9FF%Ctgl&N{YwNKi@9p3xD?>)Y+ zyw_fP&AUSB{Q~nkh5q88h3ar37jE?WBH0g4fw>+y9SC?I=nCP>oDs+je(n zw?0s+oJLIL_4V#YA}$bvP5~Ur@^u`&Jjq|09K-14A-qVlYo+3A2njIag9DfYq}nM< z-8cl-FOrIXfDAa~w4|-^Bi@VgMVF{4)Tf)`Zxp1XMZ{$Lf$0_t>4SaAsEJeaP#d8a zN$5ok^&;rE3ll2TjrpinI{&~Ni-mE6Rs@UquH&0BdnoCR;O#xTenkkmeJ3A-Rtx6I zPz5Wuvoni@1kt&lwOb-QAXwR>ON4^38IRG%=%(`>hjY%xqvt?VFBf8?QfrBCLEA zyQAOS3zFR#l!w`19UDZ@lNnnfOxG*lw50qxm|a<&FX4L{xzbgDIFZRpL+QmAnAMUPX(VWQ`x*=TAp1ZX(~kU2|*a(R$IVdNdo9oyad}Tj8BX$nm z)qyHqS;)el0eF=avV>=Z{*$MZy^nmw*%9KuX?RwJdUugxs4JaJ?o=A4FdFlLekLKilz3QjpKX#>U1VnQ$AzIP*zU3Uxds=UyY zC-m!hyB8IbftoX1xvPfF&%*|5<7IE;3C75wi<(E}?1;iiaoq8=kR8ku`t;krmI_u# zaxu8vaHSNMOu(q+nt>RSe+R)*lB6wVo%4mh(escO1N>4oiaH7bL2@PJ^l$fJQ}cyB zgH!=M1gfwM=%S28O<#6JEjUxs`=K)2PY%yGly9r_Il|t^7Y2yk7qV*l{l&=|@`Z8Y zzTRxqYC-CJ3D>*8{!@|=+u=7t@DH=+Rtw4c>oAS|lH^&aQ^Ss~7J7GoDW9xD&d9n) z394|$#+vJwkFU_j@3IwP0nltvVnYg-{_HY@APf`-ey-MM9K-G@5c(K8K|W_Ae?SEG>-!z_hXq)mcXqJ71wuxr z2hD<}VS-6;L;zX?#(T{y!XwNPbKGpo3%G=Ag9ja=ON(w#w#Dnno)gvUv zeg{br?~vQxn1HyU=+X04Ej`MvVx~f2V8Uo5xnniTT`iydlVL758y;9BHp(VEx&Wa0#+aiB>pM+)?VP=fu)H62}5FM&q!R_WU2+^EPY^W^s zpD}S0-=Sduw~dgrEnMfXhn2s&GjT0swU;-rb=4Pot~fDvb&=(8JnXi7`I8dkG=S;FiEU^gq?pD@Ob?>)_ENinBVke(mG+8 zu#1(h6W(*}3Pp`D>Q|oaitC)74)+^mDa7uPLMd$-(j?EkP+t^~)InMI8}1M-J?PP& z=f4p6?s||Ax$&QP2g*yXL6{fmconuku51Opt1spmg9#J!%2DWLFyc2?8>)!gjpEo?K%0=;l!6EG=3z?s)Jy;iwRH zY&PK|pl_u%f{ooM47nZBUJZ1jBt`71Jc3xp`#3%_Df6Ph0VEJNrrA zowj|35`d3*8ud$_82h{I(~ZJpS108(ZkO{u9ft4(mE7omvNr_8=W)rKApw>VBPNZ@ z1eKmRJ1y=e!5JZEqy;KaN9{XsLDiMue?J1oO*cuN6`*vhmE{|Of}mb;z%Vk?q-^U# zD_Konl`VM2rog5_c9=o3f=!69z5rEVh*aET%)yKD#7$)$Vqa|%qUNYZ5M;v<3rTWH zst*Hnga9o}QJP)?{G>v;rXF%m+MnG}11Z&RqaJO+G!yBd183#$NP)~z7(ZL^gS@|W z<~>x-cV^*#7mO_Pd7=H370vZeR8HSo_4~-)QZ?w%TdU4gs~)RX?Fv@CnEm5<;n5y9 zvRXRX0Sz~S*vAMSw99|`?QG~~A!giuo}-aY+{tu8(lwbC+^m}n4V{y1p0PG}S*Y>> zib~o`g>9hX`3P0LLho`Z`Rm8@tyVzU(a4@es&5WIj30&}4sZcS1Iisn_;oKl56_}A zn+2)I*#~av)(;@=(XF|5`I>(!o5+ON)Ga&*@77fAc>vp*3g!4y)C#&a)#e#zbC-uI zUg8V9!=Hk@t_>vM&Ues>rED7$dd;GR=#7Oy%4Fp75sg5EDaroSUL{9xr6F;SW^NC_ zS6h-HDE}6el^^V4h0+;i>55(w4x)iysM;n2i+TZU&)TYIb}ETc+DgS$SbHA3%clrm{<0%bss8yQQV9R`<}GZ2n8o>7*f_G77z14>hxy zUMR%NdZ>%X(n~6JP}UE`Gnz8_2IIZCt42yhUsBMt5PYU?|N2Htx9@FkI=ZE4-8cA* zy?K&;+%7(LUo!Fm;Y#Kz&~2cGf&nLa5HC_BVCXufp#zauP-vUa(D+*|NpC_O2%bd1 zgnHmN&C9h@_M#lR*`c}Yc{OGok5Mi@P|99;8S@ankc&T#D8MT?I6Ej0AmOG)IF$$* z`Pn5 zaBQLM9m{m<&?q+4`0z6PK>RSXRCykU_$?%#>hZGP4A@YZWB)-{r0W@K%E#9f3?@pQ^ z>=3)`(oIJw6-hp7PtkpbDxAHb$Y?#JaiZIBu6v9O-_TYZCKNc%hBn$saMVSm0>&q3K0LY!uh118(Q*7G9WPufOE}{o1T3A9K=E9o`7iAq zZe?XBF&*Jos1vWq?UfDl38=g=_aYl4T-WZv53wC6IfatUwK&dGk`b^3W|hOR00SY- zl@O#88_xfYY*0Q$1q20YBwh;&whkT)Zh$XdX2ov^lGr_hb$C#mwRstnMI+(=XxOj|d&;Q1)>^?^fL=O|L)YkQVKM_kOvQO# z-66cH+czR%9^W%Zxb>CXi2eK2JoT{my(x5w_yvd?Tk42Xj&qZL9?d_S+GQibE*lq4 zWz+sH+@H4aWy0yidNUnPI$T-@amdpl7OpSk61>AoW=ozNHIE^$0&9<2j!$8~|6NFS zy@vSe>P<^F?@}n%Dqy;r6=2~kXWOX%G0Fz=vl-(;qJ zTj)EAa2M*%l@x6&A2&k~W?cl&b}b}_j^Ay`MRrdzP?pjjB3!$yn?0F5_O>vv z&$dh%CL~uNmjFHHe@k))5Z99?_aiOMf-Z70+y1sNx&xLJTMd}2kg>+M1&i=88@&Z` ztS2+s%q_x{o+1T&bnj1tokQ>+fN?9L&jaSKZe|C!2;Dosx)}&@22LbYvz4Ch?8+9n zG`;m#AQ0RJD*rCYF>l#X6p;Hq3}fiG3&=+L9f$Rz-yeS_L|Ls|xEw620wU;QOE-=% z)Lt~#r!NH-0N~XdiUq=py>JeGLWsc|v(-gG_RZC}ww-)RK`Xz256#9B1jWc31L#!V zpwF^C8qcu0YKI?ORjQ_~Ae$U_-y1Jd+7dNwp_=v}el!ZqUMRzT^wPZLfh)g93_2I4 z;~O~m_y$0x#LwfrN=H}8ow{=aGUKegakyoEP~?3SL5a6ff;NvYhf1j=hf)sQCCO<~ z9PugwSVX@@DFl41SI>FiI-~Lrm}v(^Pc*x3_S!o_g8m7lHp@yDvE%OugC8AENqtb- zzn>RZCPA%0RkzCNfyFy&&XpA2x5svnHpu2!^S9f;lU13D$l4z<*@;ne)HX&RH7#DSC zW3~!oTw`olHZrBkuft4OfK2|7za>9$opQoJhY*=zEU@gv6eIXJ7&J=B47cp8L3U*& z63Avk!g}DYYjNB%VKaA5TV0-`{ zXj(^7ITJqOER~?PO2buoq@jU(3Z!qa3#J#KFf>310-e2s5Mb#&VbthEQ~^O4E@QcZ zp;G1<0poc*f>sKLP&3SZ4Ph*?Uk-PqedDF!lF7;`k-hky(7iX{$D=w~1VrJI&h0#gviLk@~#z=DRPT&oCPO{>LM6MJf z+8`^aX*#5AzNXP^UIE7K@cTljYtMS@t9TS|$!!NNly!S<2b-Q;!)Yzs@v2Oi2tp89 z;(tSex*$uERSP_YfRls1iKecVX96d%krN90O+jir2%dwZg5U{cuQ@b;-T#5m)tErn zoyZltBSSPrw54D_**B7TJ`lS1{Og~be%4B};fo8qOGKc-nN{4_24>8Etz#u0K=%La zDVEk=jAR`?6b5x%0Ryz0yCFk>G5^AKEaOAL0aUsBL!rNR*|X{_Zkxbvd?<_%&zsa) zJZgdttS5WqBcW55L5KiEK6v01PWkV}L?k}T6_<9j#S-c!B8Fu@`vy zdwP~DK$%7G)qXEv?2IS57TFKR^{j0>F9>yT&V|wSJ_8Lkz0yVHB<&}WJ~s~%2!a1p@;RWCPips>9JZFfJXfv zR0uMC*@~n%GD>B>r*wCm@t!V-zLOIOw7QnnJXM^lq}#is%I+N+a}!8a}Lcc zJl;Liuygfi@(9#2pvZvGQeSLkb3PU32?tr_rx5Pm#V&jbm0mn+_n9!*)#efnJX1l; zy9LS>9Ff778OkrMFImc&)|a`;vDOz!IneqtRoU74vP5~m<;9bW30GcjeJ{cQ6&dd? zNRwh=4p|Rr5#gLDr3%{=iFHV9MB+J~NIWD~P(AlKx5p_~E)0Ousv{s#Z%HGNstVw$ zgsu|SwE;*ejHJwK;VTE?`SINqXq7{^B8&$H*BjErdoWL=1#wb1n>yHVVNYNB6AMc^ zJmm-y@GVl-|1=H+_%UTK5@_v@Q5Gy!wXz&NLz!YENb;Z5Tu(Fy&||NrLZbc4XNYrA zzJ^MzTaQTqKmY9-@bP4Xz65pBYIblh4Tow-c_Sa+J+Jd@*a^S^xO|GzZsJ>sP*Cos zih%rdghoo0BAECQ9fEJB7GEY=uSfM{r4r)8;M*wGfOT*~P-REZctPG1>I&9kDpj6V zYxz$uQOSWcQ)+kW_CQ&`V{EWms1({LD_Uxms8*dahH8}?{VBNnR?iWH-jyFL0_iuE zNpC5mSIe|h%MjzY7fVTzusPSjHR1oMLtxo)$&h|;hlHMup>O%eYKk*FP5MEk_a=f`;PJ~Y^3bDvX z{jf_Y&h~W4#0e)?s}lQ(-X4iIbJ3#RKAcmq<5(M?i+Z!6TVIeNA3&^WdL@ct0eAF- zBP?hQtT1U1x8hTZn!}Ly3SMw-9nTXrlQ5hHt74M&v`5%HjpG5s4p1=J<^#^qY)_)^ z1LVvG)v^R8yEY)};;U^iG1=u>Jt_zRXA*LBqBpFl&^l&Gfi-0`Y+r2V8_N}*wXu!G zeI8C_A;putVGU^o^DD;qAIMIbAHM)L*yhuY*QN3jtXaT zKMe7Y(9gl>Cpa2f8-C!1R3gSwaeAS(*z|6iv%RJLf%F1A``ci?Y})T7HgXrdD!BY8 zYWiIiVXOHDz$9t54_j*~Ml)niETP z(9()!+V*~30VFRaQ2*J?#fuL5ijf^$8A!DySVp*MF5qjZ&UzJ>W1Sd zZY#wg_L`ak%^hyA)|(_puR_qMxmVgdb!f%qf2>TaZ_ZF)uOIEdCl`={uV4rrr_mHg z#fOw^D8~60RQebybqq&A{~-K_gnN+SkDbyoF%b=xLTe4pd%G~vQh-Mq4rV>^jI%A2 z*Tfo4lGk2KbMbkMXvkfDG)3cVE0_9Kqf7@V_lS)FA@7P5XHgIaSckK z2zK4h4iNuHT34+P93n6k_Rj%=8$eK|ytb6qSMr8bS{eW{k^@@I1L!?~8i_@gf;)>x z)BOUA`V@9iixNPorEPLvuyj~u!JQRm!!wSd{v_7=!!4I<8{1AA+ zJtLa}B!yImh%E`7)20#{<46lMex;Xdu}w-+yH&>D$UQ5zuNdzQX_sDLFG+2_5d`N` zQu76n-@tFk_!{M)pdrfkurjBbP1_?3AM`S^BsX}HlyW=Cc0gX{l_nb+M{FLbs7`;+tg^&X$1dsYqoAildfEycX)FZzH}Va*`p> zfd}-i-Xt3G=dx~lh196Z%{=#c`~(?k|F2k|7ul10h2B$l_8?+~==9S*PJ*1o57aYc zso!1M%nJeKX_QC!BZQI~A1s7G#lWnbWS&Y{8u(K#MDhijMjBhi_ zxf>rh^a7Df4oh5r88F6Uc2(@NtO@(Af(UN=dbC_cFc-^7)qRkkg0Jko zgnhhU7^>Q^u3XF++%8`v-DIoBFD|*jZCHK1RfhNL-a%8nb)W;8uw3Y&{pVA>Xhf%f zD>}Q0oB3q~%O*9K?SMHV1JWf0k$ zQ%zV2!<5w9ma*r`g!u4z7#xVXfxw~|$qgqvP$n!E^PFsKxiCHI08lYWMZFRFXeQGj_mWQ=a~g z#k4HJ8Ac&ZH@Vp8N}=cY4}qLA<OTx-LUuV-gN3(0{e0O zLSl(0<72y=@wz>+46zC_%@u}qUdSgQE5_`t=9NYSE8SGf0+mAKn97wgU=jm1?cq!^ zx%ftT;(J1D)89df@hAZpLQjbPQmEaug5|QNcXhkjK4(35I7r##3N?XkdJZd`F06cD`|XaYIr{6-!c%B8{;q^EH*R6ow=&wO*7Ged7%{mPASdN3`9ukK1gWxU+`;`te zF2m!N#EFPX1p%m4hB*!#@t(NMjvNwVJ`HV97al*e`LNLa zKlWhE56wMzD4zE~OnZXee^}@@7pEy&CN-G(QqB-qK}ha0G27kP-l=y_2o*Uu0-c$d z%~fZj^oNXRJdK|m&h!88rKF(Gi5qi5k<3lseWd`>#420%ws?FS#Gsv(5fj`RC zfwa%IlnZ*;{S|}hM1(H<(l8o{!Z24XI?^n1wnDnhheU_LRC{6tLa!uD2LnsFHNb7Q zqgQ}qL9)iGRBDL@PMop=1UiibIt~*`ry=(yp1XA^(vq6)d(l34B;AA+tMo-yHcr)iq?M+=Cpjn4|Maou;|-@LEH)1<(^GRekXtPv8l zE9a?l)i2`N_cb^ye>SSe%n2jps@<9OD9p*PKcOC=3%*7DuibKhZhcHWKy$tzn<;*P z<~>FS=xr8~Ctxe%Z11w27}hdhKlG1K{`5O;Vla7#*ty98-1lUk?Sn%$L2s;a!{YpwfMnzM_7-4ZcGpBsr`OR{d8J0>-+F zD*pNcUk!URE66u=HJ)4J@lQoXlfCgH(XSd}17pzdK z&}TSKSKvMdXNm=T&gyY~o$Uq-8?%dKCdyW1;7^nz(h?}63_xIj>P++XMW69_<&a7J zhK^>`_(&m|0s4h>;M`I<6E0gPlnD@HB5s&VBQFW{eS$m~_nmWz7Cl7E(9GV!9|Rm* znrV5JX~lGPWR8(EDqJ9dTL#?0%Hc1Lx~bl^@a*@$Lk+g3ZGzE@f8(ub_kqOqEf2Ve zYqM7+fD-zetW~~|dSe%Xr-4|w1~L5u#;kgpT4%d}@wZ?3h~yQu=y*mA!ewRDq1UfJ zLaUWghbydOk#RmAv4sW^2^@J7QCBt|K}p6B_iY5tA!pVR-L}*f=o#?2k?=304&kG2 zuvW0d6S&-GA{EIvmsn1W9=OA~t=!>Eu!oPF5c&w~Sm6nfl~Y(5-o%1z_A^Qvm&S^k zhI9bvZUWFMkYJ+nAnWlBjDx>smT#ac-pt(J;4X>jtO$wX+Bs^u6}^JxcD9zA!=g?i zOYIdl_N0(}*L<0-_JgIA#A7NVcE4Cg!(0wb(tvTzYHiSsK0#+NaZ zn4|tGR^tp2HbB6*@mKccNf@U_v%gNlb|#9As1?!-u6ckCI#G_(eMKi&UM&Wi$%<-) z^stE_-pF+)ugFos(rSePJw^Z|V9Lkkz}sMrpq4c3IIIM&vpc>O2KAjoiw-l40jgB{ zF7?&fmGW#a#6N|{g);UQK0uF9j2~A|5d0W=Uux{rhxs%_LvMWSl|`9%jB7ds(9D~Uy6=ebGVkWPLG z<}`-9J?IEXMOb7xf9HD}T7ARXXOZf5oi*?);-ti4B0DdCtM)O|d^{6(P)^8ME? zIv;E49z}`32<2LLouRdd(YT4P4 z2n2YP+SH@#&>pDW{u5IIc_6p^Axj@w_ok8N9M1a1e9lkMTsIU6jzm;3jjS&~bLV}5 z34|pkNuUjR@8Si`i!=?t`d-4D`)n^4UnPtllg#~jPDydK(ow(Ne9C4>KZU|rrx{on zhkv9leUcK8F11s4LSOG1VqlONrI$D$!k-+A5njLb98WIbvv~_7^*y zH!qb9OXb2>=Z~0-8UFU!8Pot$MLW89(Iy}BHP9N-Vja0iddHwl3~}8=mX`JU-{s7#9r>V^dcdOWZmLt0RrekT)bi zJhwWwUwyH7qm`PX4#m+qxJ>^(!O)=qca)SiTc_x%XAyq?r<5W(y2`8G1yh%=GxUT_ zTc~2XpPfD}L{4XF7RbtqZpn5shG)~I)Qa~Z0Wm=7otXg)@p~V8qxqJ%bDp4XU zkXpDlo=)D}i$c*^U2gHzg3z)w6nF@qGE;i4Xj3K*W|lexFkJZvE23)Pz=EQ?+){ny8kUhY88$VeY%}nQn zRB>GiTYL_xdGBnt^&IR&8fUU9{0be|&*y|^#kIw3*-wZ>(1Shy6XM4G_Aop5lQ3Cq zx}Oa{FFf4FCi^UMJ$voEFx-{q)Z1|QY+@z{VkbZ_j_Xv(yR!&K^re5V%f%Fh;H671d_u&Do1gsvz#tW=|f9kIyf-gE=R z1sGl5L3ck$azP`XTcI$tpo5$df~cKiF4yvoI77^3D@2&P%sve*4C0QCMOWC&kb1 zW%94WAknsf?fO;75I@?t`8Q!sYFlv0fR;`v2vO=>NB%b=ZssoXuMZf{9VdjaOf}>t zpTN$zx0o&{hN~d;IBXyL`)@)VuC^;fO@lk#L#O{8QC9hHVU|@_NxHG+LV07YuD$z#F+YvFa{Yoz47w5SOJ0%z89a|DY zo+E`N@pWU0oNeHOrP0t^{g^tuVPk4aLCWX;(3pF*-Ye-0)?(~pRog`OxwwBxgVDxI z0=hzGMOLzP_&oj%T0L*fTQKfJh;E$c@wbupBTknRyL=Tf@4kh@ip%1iA1~lVkqjAE z;iH+^y}=#_Y2>fYFsZxCJ-dx_3XN|P((JQ~4BOk%+5@RRl>jTNCifN5 zum;mYv07@l&?&Jhqp)H(3Tux45U7f)@u$!{Yb_qYdXevYq+1JJ5HWPI7EWq|pg~Pz zPy?Y`OD;&@XFkPK#^?%zo79O2Df6w}{C$RuBY*q}e^0}916nUEjxQRMt6pRT^T)H} zitF0QM?2JjO}8aN=1{WeBo5%5Zs<}`#=xp+nMI<|N|vkL_kfPBFrz;y8#tFt?#FHQcF*r(JXub6C48fVI+= zxXl{p1TYbcv5RrqRx2i|b@omTWI|e8LR!4ID}t04*R}7fx&Hcf$d2KH1ScRrxE0Vo z5I$6KjOv>X`jB$(B62bfI~h1=9`Yc=sviPzfq=G)G7NdB`=ITr=}|?+ypsS5((l2x zOci#}K!}xAmVxXB9Sa2*4Q>?}3ytO}-L4z>A)6a*wg;B(`_pE!$tEEt4Zwu^g@1+C z67jz56bjV`>7gOdk7YsStsER=SF}Q?^z0+2VnPP<#M;3{1 z$vc|_rCG`Wh>(KOza2}6FnkQ%$qIHS1y>^oPfb`=3`rE?KWS!@q2i{Ko$Z~k?%S52iJZexLczCJd#`D*pMdAzlgR; zF3R!`%+#PYK4Qs5hW^ED>ly&rNgbYUjKyG zis%nTw&L^JOzrS9$)_x)`%NqEMhvsV7+#XqJ6^{fdx%LIP5_al=r42e^&p_@q?MEH zUPt_JgqQ6IoQx$<9zZwTjV|0G4`nuPkU*y8XZ;B~33~nU?g`;dOFOAqfxZohmmt?u z%&fM2rrILlRvGQ(G}_Dg+d(WKt{a_?Se2>GLER3z9}5=@1#Qj}V2TAGnnj?C7UN=) zy0bQa2uXMS3}Y`qK>}^=l@iDAJ;3ag!YUOTm`9@u7>$q+5Ud;pzvGRQVnW9RWNo&I9rQVC(^Krnls|-g*OT`JEn|J@fOA+z>nlA#`DD~XE`%h~ z4*|^#&t3i08G>rsWcTXE;2GN6RQ&ibUVdD`GJJkK3_1bbH=8WP64YAdvzao8X6*H= znUHAbeThPL?_k%RS8fF4u{QaY8@ZE1U_1m=(Gl#XA)oY!J`Zx)Q8Gb&V8&p^Nl7#BChMO= z$|#=da&+Tv6i5jer`=TP2Q(;j+_ol<_l$2ncNt`R4TgNWTNPnCJ0cI@^eS|@z=m0v zkP)j3M9m)R5XmsJ(qtw4e~ZQ@!~JlUXX2!-vuZpuovHaZSki))Ig5 z60h(Qjyuu96|_KGeg>CR-vi*oaIruIucPBYyj&6iMNW~k4_3V7F4*~cbvy8bnfn|+Ua6ZBfdiaC z5dPK2F$jo@$Zjrnrf(i5ZD(ImQ^a4nj|pma!l;W^JCv&JjcR`fOU6ZaKTJ>HHUEeN zWiK5dyyvhu^TkqKm`4=lzF2JPWueC$921HZ%!gYKH^sk!9Nh3gwM0PNmbH8X+7ZMs zjWTe}2wqHfB4I$Ya>HZf%0_64u!0x{Yp5bHM`G*$=bu z-JN`L58(%sdl)|!@5Ii^EF55Vu)CNE_&ls_9-*vWGL8XIr_+ckT+0VXufWJ_gYlW@ zJeCj9i3~iF7aS$tU~;VFyw^I)aT>O&LFnf?!l8n^r~qF$R}h^YGtT4gb0I!Af5a-D zghiR^#70LzGA$)RNVqx(K^=sMAFmXlETdx$0|-<7#ZPTTyP<^E4m?OONOrRT7>e!h zBDEvgv~hBRD@=CN_L02$vOMxuA*wZC?1o-q_dHLKr8+O6OM8%k0E_z~_MsldqDNDJ z^Z>JI_`$SV@Z*)ViVskV9L+UQtNhqz;Mx>2g}o z)|mW~^?mrquq(FcRj@_Q z!LgVOvb|B6_byEh;@k&x^(pMNtMC^N8-r;t%Q%U@-|=@De*p~-R6hO^i@OG1Xy<$E zv1`JH$gh8DQUjC+c!2V2kRz8X`+j0wuER}!=tVZ}I=p2zU@y~&9J>ql8CcEH``P^K zf;l$h68eCi5gK>EF1dyfrBX^ujc_a4J6QR3VNgW7f8f;R8Zv0qxrS`i`>ZKjj0Eg( z5N$QnMf^+E)6ySl*il0?#H24d2k-1j^qgUbmYjpnk?5LW5WsFy0TIa4?*~Arazb1i zC}etVB1q@XnclyNR)pE40Hpg6jTBr-tT%n1#W11bZ+NxJ#omdrh6z>jQ5Z=jmN<13 zbZZ~SeeTrhDd=%?FrFLJTFfv+EGI~efJ+5uxCES~C*Mj|eM3le1*u_}D81cUW-FG7 zm+}3C1tzu=q;n0?II&74vXPrbg5=(f6Ax{6=G?|1r7c>KD}1ja&9YZLmr~=fOAR|_ zVM!jxl#G>dK_cwwo`fam>6~tc?bR+=mQ4`_2k0Dr1xR6-0D=Xk$XLPz1m9E6v?u7~ zFSRH+5+$2*x~CboANk*xJfduAE!iknCmwNz=ASa;FF+?D0)U(~jJS)qSoa$wIJ!Za z_J74pX`HMoWrlz-T^zHIWe0>0#lgQmZxs8wh%J<6mrALbA<)XKc^|Ld2?0;Wes^OB z! ziANcW`$nW;&1584+}F*9HCFxo)_2ge;9|8J zt7pzZt7k=pGa@CEc8@o+Ldlv#t$=B40<-GJ{gP#VgYs4;yC{eeB0|))6~#FH3vctI z|Df+n9Hcz(IGZMlUBwl{cRVVJzXHHhx6N1 zl1wu~9h0m8fh2A4`HwA#L?~4<3ss)D?6hT zBgOlVvqqgbxSQbu20?<0jC!2Cv*8(ty@Dxv9T&;A5toUh2C*;Oh$dI3H&sn+F1iX$ zY`6{KpKS8eI4^%}bpTY^bHw8D8as_3$wv|NY%k-lN)3^|1ZIOkVVwfHiKC$2D0N>m zEIJMu8(DHEq2gghgl1-z!khzza&eGU!A1&?6*|xk`*yGg+KJHm+>(G z?vFP?3ZNapn)>hY8FqJPn*I3>w$}Dour^fo$PTuzofsp=FJq_MiCygpL&3ED06VP+ zaQGob4X}3=9C3=Uf-nZ^mUfbv4{%mYz&IQVQP}zoo@G-pnu?w+@4Ga>i#Gj7ATxtTm7l%JPPPXRvJ^?pJjjYy znZAQ~n`<TO|#q9RL+QHleU0l>{!7%wv?9$i#kSUduGML?G3im^gTp{z<-xdvToe3tm71m}b=xzkuD5gQA2wW+KUuX97Cp$@f{=M7=mRGX4oF zY%^F-b4EnHyKBNL>~+1^HRXY`!5xPga$o88RFaZEzNJsE@ki>D^43c<1Y(;Lh;43s znf<00lf>1Z?uhLub{52m+t_e}I6&ya?l*{$eFN{3sk=hNTV6SiQ=7Tmkhd2Pc6mf; z0$5}7h_4gaO9rvK>vg=U)?$zes@EHWot!SEjPT-%!>)X~8Uw;~^;Fhdnx|Ak{A9YN z_*0mQ$_IQ6-|CE_{!6u*f56C3Tts3fhSDZH(Q@G@kwUC;Jq&iY9rr{xuQJiL#DcXedm@N?| zn%A__WyBLZwIs`yGSV>hg9Pb?^MomY3qVexf_`j9jXMBeS~Mn3xKc>@qperdk^PuOcQtfOt8QP zDsTeUvdFhOp4E1N#kqfICJD|s;4OcU1725n=I=_y;Ih+G!sa^0;b-_<2nmT}QlanQ ztUI$Pw%i1MC;k)o#f9=oXQZbf@U_D;0iS?h4t)Djs1^8rewKY@6qChm8`wpoI76KDJ)6{3 z9NMSb_cZm`a$}WV&r*S~vBZs9>2(b)b^FI8XayDPv}{Umhha15(@ zP+5S~gK8ARzq*Q&IO97uHc}kgyZ?7BwGKj-=33L5Yn{ZNjTF1aYl4-6m$)@R5{Q^O z%_4<$Jj}7^makM2q(U0aglf3G`jwMIxCTR9(IV z-{-6Cc9KV-)w|%^Y>VOcGN6=fXe}%r5#xhH@;Br)Q$_zpXJ>fKN~e?{T>wJFh{nO6 z#X;ac7A%>Dt&I|g$EwE4Ny$Z4s6!x9iB>+wdDTo`e1^c8QDSc~*TlqVF-|CD{i4Nm z*SX)pB!i9v#CK6T+?3ydh4McM&s}iB4z1+rg-zl3p0@Mz=r(O;PTEza21N!^&&rfAqYbwcF#C9 zqUR?p5G^LPbz{ZXA3V6B!I*%nD+-ol(SF6@Obt&acF!h}p9$tIWzhX}j~)b8Y)LmU z&Ul@34lvYci6rH$OlFfUVq_S>O~?##+wz}gHQmI-?$dwcGeCR3i?V!V>x|`kS=a93 ze8XdyA`GIx+P7HtTz4_4=bvkN-yo{^+Ot@SdH=!JJVep+VQCot(7fX%X;(> z$GQemS|3b=|5K26oQwvYsM~R@g;XG00eC6ID5r))ypP&0RA#G#4bL;+*|jl92P-7!2%@)$%k zSPtJ2{FgxT6VX4Ew)~4Gwkk%9?l_rTAJ9cgTWMnN#)xs^(l^e7)I6vEZ|QdX1IGiUVBaN^SL~ zg(^p9P`i*hzwjDWc8=n*A?}MW8PfnqL&*#VKWOX(pYj|!_vnOx#>E7KpDkDzUiw~? z=A&sXrDC2G|r=;#?Y-CV*DIOk!Bc4kt{sKTAr4ls5kptVE{V#s&u@+!%w9wBu7kmY^^4e!Os_ zrW4Z9Mud`<5^eU2q#&{L z$y6&du?eHf0oJn1hd^j5X7)^+I3Voo5$YhYoN^(T?T8b{bYBVwGeUV?F>$ZvQeUd~ z5#CeQ=dzCRVz&qfPn-6b#)^2bt;f2v zSK`IRotNgLlBt85X)AK88()fLT%m za%^v>yt9&B?kf%w7P9z$VytZevb+1Hbi+1qUu$x9F4qmjGv);%$*-U%@EhINZa5># zbzNGLKSVNu2}QcET_=$mIGb|arD*2uCt5o1b%XwZug=q9VD2Dze(fNu>xaYU<%8^6 zKe3Ovj~ z>s0w6tp$f^1LpkaWjo#;Ahs2Hf7p+&QIG~cz7$|w?kmR(WaKqCbxOBI?BGB#G0a(k zF2l-Cr^rj0HW8F({9!gQQ5@S#X#{bQ*Fak%|6S^?jHT7DEF*=E(sn6ZlPC@spF70% zB;wGuva^ZefKCt51OSu~8=b1mS;D#x5_<^~nR$@dW8#U${Af|dIJv2vBCtG8+$W_U zQ-xw4{jXg}Qlk3}O&~F{k`i@wl<3h{;zy|kAYu9sbzyG~61#LOMVb(FoaY#P9lk?w z^F|kTc#zmXxort*P%T>kO7J{~A^S`bIJW!ayg(4GiWEXiE9*X-FI7vP@v=aA@HT zm;no2!Hd52NV66H7?P>2hDnIU6zv$xJ{ThQ7TU7IL&QG94R&#e7@s|WI)E<4M9~Af z6w@}?rI?0((3OBQ^t?vB0*M*63m^*b@iB3R9oERkY!6&4{w7L^hn&BYUtkrK2BgS2 ztR&!xK$&z;z$zKb*vg?|_YEtfLjuOsb!^vAF>7dd(A5ae4;%{&0bvNvh9a1?`Zp@Q z-ytw0(uOm9=?+wThDk|cuY^M&fsqW^^AV*JrMCxQh2jBGk9idjqY8LEu-@ko`r?Uv zp$+>W3DV19&$9hV;<&_V|7fn-0mVJE^W2K%%SBY^cU1LY4t=Mtc-fHK#7EOC2Y?lD zdJ2Z;OQDqIa=IV^p#Hd1cXcF~M6BWu=^>3aF=zx1T#H?**s74-h#%x&pNtT@iGNhFgCoSKal=8eAUsJs zxKDDvv=i)l>Q|+F|2?2cr>uk!Eq6sMk6xJ(+N|n;f-4j9utUo0IV^6Z_?S5FOSW#L zI9vRvnEf>pp84P__kS!KD7o)d0L@9{Xx9wqj_u! z?D{A%N}NBRbv20zozjtx{eX-JJFeS*L&K(+#DQ9dhvgQ!2SKhguYHfrI3G6dI{vId~m_#{yJKH*1?9ukEC+TY$n_>}-x8H;; zd^3U2Z+ZvTU#deSvgRa08Mx2~gac3?j2;1U%C+--V<95=`yyA)gOwDUX#Bmpit!q| z0tluUE_ugemzF!fN6Z-!=Omw{R!u0JwLdY#A`u71c+PuLS$A_;gt)!HOQ=c+(%|3p z?`DI6D++n#601$hDXh~t)PYl#BiYuKxv4ZD$fNHRqD~idyZ9H>yHqOhwxdPY&HR+y z`eBoaQ|y8kG(d8#bi5iptU?A_^IOsPEgeEGt6GgQf~uj=m&AQ0$GnP~;2VCtdRH3y z4A+3;M;@hEmY&o+d_lR#gSG!#zsX!`8%&@!VcmISE%8mEGobjU$E($jzlB`Q9iPzB zacEUKvyaD!*2tekPSBiJe=ev$ipbihiqDEOa@b3$;$U&xC03a#_Re~*a|_-3@uN5* zw@Th6p&7#(tcYc>z~2W}x!=KTm;5zStLXu2o_dTPAPq>}h6h+)5)s$l;?2}535Z~U zxgA9*pmBBeAG3*L#U7$h!{&|^`@003IC5GzsMRH0)o~F>yF4v?EvCwSE!24%iX8q6 zuvJ_aV$*`q(O2-dvmufe95P5|$z1G+k=$9KfWM+}zaIsre@wJcTYnqNSK;kA^@&J~ z*z_8uv=TE(@!lyG%ZuP0UDQZ~vK+0-Q^RHO-(|{<*+9kZ)#vx|?7r4v@llK6t?zQG zGd)j+Qi&2}B9%Z$8jlq2|C|OF>Yc1r9!C9YOW9;Fq1v8YX##fZ*@ z)_-zc(B!o1hr1j=Kfc|_wvQ8gSOd#gq_QlH)OP-|6Q9r`b5Yi35ZYNZ=hb|#- z`a5Z2EZn&&(!?Lc`{%F^EaHbDr?L zVx`L$jPGyJ%BSu-}6A-Qqw#x^y z*IVQc2p5C>5V6`4D3Q}cGQBfH?Aju`w%F=P53#`o(P}=qsFuBWyBIGdvAws81H>NL zOt~FGPD$P$bd4o@S?{~G;C!T2ztp#dqHn;0odDt??+`r!6?1+KsAj~&oQiMRlHrMq zw1ji*9%nA>o9&*=0xPxwra<}1jH$Q6H3BCapti2pm|o7dWw58#_@Tf@8D-!Y2uTYN z<;eAAEV5+6m@*VquDlG~mLKp=(i@~=z{^z9L0dc_@x*|_Sz7sXG@VH0y94L~Tq}o5 zyJ&e3)=(qGl{jG>b;Z%~GFVO2DH!rf@nb!AL5?qe3L>(fY$i?C^Lc;eWUD03avzWpp0g(1ewR!k3NGTGz+ZSCU$ele_Gr>_OcW!I!of8P)UIlIex*C2+sX-4O&e? zoN>b*d;TVvk`;qqsZ95Vh?cKt|GFDoKL7o5*!e{#uy`g)v;3 z*ZbBZ3$Ex&{MKqdWieoHY5&O3*5l%h9M|H#7VnHehIewniqOJ$SV`1~&`g%ZBCixM zm*ljy%6H~(@@q4akD04-+Q@f$H=!HHEO960!^eNN#+|ev{M+##EFF%ed+^N?sHA#y z^7Qroo$5xw^$@^=diTTLO&W{#h{ast{1a9)>&vOjE)9X3dkddE3n%leo;@@s{A6L2 zzN465z)Bhd)V&ga2qbZaT>AfS(p+fiUuG>5)_?zpS!5} z@!lS=z*#okD%U`a%;D*F+5WsbH88x(akWjCX{rF(#lD^ZZZA5e>44bfMd==7%s^>A zEqe)M_KpO!NM0{(p+v-)!s*pi{JT!__Si$kU`MZfavv7-JVNZ3!$JCZohL7bGW(Zb zJ|lH6;)8V8g&6i&b+n_3{I2GqTFhtuWt4{18GPq9>>Yttsd-D{U%|%ZrsQM)(lEtq zZE0AYwwC7M=7vCNw&Js*C!c`YlTQ#%o0i}YTNTwljCAFV4md*W@xy^T2fT43u=5be zWC{>=mUp|Y3H$|c2$mT&`!vHIZ4?tU1&xdhQ|CsZXLBT+SO@`2aV+T1@DXvw+i z^V~o20FjKh2cKVW2s|WUF7M^-tG!W{&ZN23fBO23fK+@Qwu5=Q>QPGaK3De${qR{Q zp^FyAOA*f~TkoVkd1)jW<|BqRzn~K`M?;YC+z%ar)x$gNvm-|k5)66U0JJwjgX>ms zxEUIHQ82h$AOSJXP?}K7UJKcY{Dp16wc>tyK#W4U20JcYUdtyFAY?OqTm?E6j>_pC zHIb--4DFE&^FilHG8c5^Z6*A|QB6)xjLetE>dDKehBYT4k^Vf#_D;P+6@6VqPK?d9@Ed=xW<Y{`Ba8nl9BI%SJ+;>TjZ;k z&%iS<$1%$y*JhaaJ3G7Iew9iBbkYP*KDA=;hM0h_bO|A{j{CkpDAaHUnBAfJSgf+yoacb>lY!1`Sxb zdl~>E2p4|n)s>Q_re?S(pWXr&mcsHpAb@?CB2Y)T*i_f_@{K^EHD2QQfDnWs|2G_% zL4;C=uN9v1$GvFda$<5#5V-aYT3Q zB_KN2{{+)jPPrA+JwsF8jOoH~Qqtkz+l{TsCvF?xqp<5Dx#dl0$qw@9R-9z_x;C|7 zq{Ghd2_xk_iBj$r>vM8C$r$TfoBkSW;(`v`oH6tge5AHfl2W6O|2Lv3m67>4m5BK^95~W z7CK#wajB?e5l{(Fyako~7fe$2zsDrBxm7IEj8py{lkm0(lek(?N!Bf>1a2t6V8A52 zvHvk9;q~5%Ns?4dLP6sQlPn=jlGTDqTpX2@si?&H@5{{5N4w0{WquWBjN-W3f4f* zQ&3bi4_H>1K8o2>V|1XCVh8zN_ulvR!25l_?;pQEfA4%g_gw3`*ZHv5UVE*z*G5Zm z-FaO{@jtc_dM@ayHTAA-n|ga~0NIWkJl_ei2QoL`;WSI$7;r zl=^)NL0Gik$(rtSsW{arM5 z!hp#)e()Df?PC>uKx4kC$Pb4oVP3)MgPwgX=5g{mj>84zcCYluVpgKaRb$mX^cK)V z^jPk|S%WbL9F~bK4)uzCzSjx^i^`Qu}H0+#IEA&$I+wG4v4-bc`+NBx#XgpCjha<$>OP7iGv@ zO7Ew(+-&XOT^WhKwhpt<5f|o0%E@;rBmDG@;&RPhO4yyT+IdLtG&Y4^+9O0`Ywj)U z{%CErij~7-wK>Umnv*;yAKg>)onQEb!2C%?KAjT^noPMr_|qvvu|@s~8xu?yf>23V z?@hpKJ$Rc2ZyOGOTnU%a4pT?WSzV?DmZ|hz+;J+-&f0YzE;jn~imgI#F8+ae_`!RQ zw>TDhF>9BkUYzRLbjh|s72X3qY0kzq6h~ZI5{`O)#tD>`gp)C6*6yW6UhV5zS#(UU zi_X^5-#Wc#@6?5bmm=UBpFTh7822@8hFN~xp;lv@aG)OJgr@!4B)+36KO6M~DfZ3& z8dGMp6-AH~`=)8U`RCSFl49Rv;v0Pzzd+N&zSDJfpUx7&XyFz1Lt&(ki`~Q+rXjwg zhDBjmco+-5$HpxBCfYNb+Dqf=^6XuV7zd4UX5{yrxX;Zr%zO4{er5 z<|#JkA~2+KGhR|a6hY7E7_v#no{s?$MX^pt7XWi{8ij8T46&Xs;3I>qFrnB1-hJ=> zN{*YaylYN*4rva$_c_@zUs-JZ^;wg!Tb@4vSFgte{r;@H{~oMDOm)b|?@@;~<|n*&=YWBAC~hUcoc$c-sV z??A&%A-SnaQKCDf`~#T`nos|uo&S(mQk1TD-3~^*i8HR)cLL1b4j3S#`;GVbMu9G- z*;b4cQAWPu;H!ds#oPhDtwEhZnmUamvbv+M*mClZR^QfAD#X9(fAmkKa#^YpqRgBu zA5K*UbxHgX3j&{DIQP(V$Opw}_eTCC_opfmrcLsvRArWO+Z*z>1=z%z9WU=)piJt9 z*9YJ*$?2VjT`J@gC!1jq5VYvu^1uQm*1bjB+o0|Gp$%F4?6j0ptDla}9iAts^)&MI zI$0I>{1s*grbw|#Ze{L8+G0%a7h^?x7j{ul1P`KhCU`6#<|B!CeIC7E%4E{qZr0g! zjdl3YPWB<11G}c0#tueKmYWwUqq`&)rzc~6$KPRzKZ}7}GDV`cljj#IW0ie=vQHWo zXIJ^jC27i3_hA}UtZ`_2Op2pD^PJue*lkiAdLf1eH+ZK2)3P?)rnK)$|1?osai!%K z8&0>-U#N-n{&o==#LKOO^xjsIjb7#PG#Af{D4rMTjYoi#zi8wSmJ!|)a7PO4jB%4D z()%lG=%E#5eELfi+au!<>c*gEm{EEM0j(h)Cu1;9hw7q77x#sH3gy_1Q%xCTdRk6V zoA>PkC=S{Rees<(SNques>iB0f!GEYv9NM=^7!5cME7gP^x%CB^8IwYiFA1qMQape zlg2E1IcvpyQqvgq@G+RT*T=L~A8UL;c1ob93uct?cE&PfAdx=sw=rn7rk{nn`PiEb zwP&8qTY;Bwi$gv0BD~MADbl;?cR4Ks4KF=b-k+g_x_3W<@Mxu@Fr41O#Wp2uxau_o z{qeR~Y>~yj9;m5R+q45AywTgKfO7*K8!>(CIdg%wRTs4M z#Y2eajJFk=NU249JC<;R775+GyH3hDUg}y-N||`!$|pP51(*cLjxwb*@NlzhnzeT{x35<`zrgy%=!N`ZRrx z_QC=XeJStiOT~5^Z4~Rd94nt)gl$Il_vE%k*gpBnKjqm)ip_px0(roV#^XDv0iOaz z7Kd$g_<8R@cZKhqcVS(i*N(Q^-0JHKg|^2^8zXqibqAVGe!)4_6-P&#+6pe4T*2PkaX2&I;%6dIyoeD|1$Wg=eJ&jkIQ7@^ zbdCMu0W)@6^sT#yRi1u(@W|*V?AVI8N9He4#sz(W!<9LN(_`eJB}!b-!`D=vF|zwo z#W6A*!P(o1+%ODCleGq(?0s#p*0$G`L8Q1hb= zFWDyTray_b$zwQ>^(^EO%-6T(hI+#ruV~+&D6q78$HMFp7ci+Symg(?KeVGnhIz$x zZbD%`AVQJgreiqZ^=zVNjl{XIuf}?65BSkZy`sk3Zq!9>`7HsfWN`s&G-?nAUyjiRT3ec%jx`1;kv)J(~>$6l;8xo-8u7f`Ako}_y$JAUnL#9KVi zR1n;i=+7)5`vU&h|Abid`7L>k$9Up#ZA^}<11%bs~297Ee0 zqTp!&7yTWrA@!OIbhr<~jbmX~cz$TVEV*ClW$TXzZhFx@4<5bSVSPZ*DE>kwc-*78 zkI194*lQMcM~@>~QE#Z2nObpY0o0l=~v&5gC}HM5e!u%GC~LcUiE7w|hMQiLM{|@(NxP@g?I`{Lm1UeK{+L#lC{wLGF_9R7 za=xxip+RkRLW%HMT)CrgsKpem2+K~(`OB5weg}}<3$Mw7<=83QC|_N!Ob&PjcOZ0( z^rb`X3>E3k#RU_VCQU1pSan!ItE>r8I)~HgB-G~?j2p4{y1wxwPHW@~_{>PHZ&XY^ z^7$3Y_@E`%ta3(5?+T?y_qc1S1kBwxWz(^0D7i@Q3fX(5(o4BVl@nGf-TlvmX*C?= z{f|sri5Jd)uc2}-Jn)Nrb)_=W^r8H6rP3{E=9gC^pEE+5@|579QP)(_BV^w^C0tqY zi*)2EH~DwP)r(dWBNM5sQbdLAmgzj}ENRV9x_S;EQvf616kka&ffTC$120$`@A)D18`eeh4}j zddcdWB+Q-QD2u~h|L(NgM5}|?s%8|j*NMkz(rgH){mHD1fifn6j%QeZ0osJtV~*m@ z;dYAI^7a)6wunTNS^e9A&$vXwh+QrCv{(d8v}R$G&Igr{1P`viq?o@~q~lXr!xB8$ z;fGVcFRip$dLv8NGkh$z^#u0l;pGg=w2u>19H?+IA*OZ3dHrp!1njfxl`#0MrFWd% z^`O$*v4!U1Y!2Lzv^a3w7m}9f$vTW9hjt#O)L)p3TNlo*rNgT&Z=ad6aqM8!nHI}h zyi|DxlU^ zCmIpq2oYDWM11>n@KIT^M(H*Yg@CEhcswDrTv$Q5iTQhZXi380A0072t-yW|L`$j0 zfT5`=1nPvCA2?`3Ed$poqucjFx0mQ?y6}{ovR3Jv_$x+#iJreNWNM>8z0MpSy&CC2 zHL6+%&H>bF5TiqCWHdS~8iGq;T`jdjZBA!i?A*Pw8X+p{@lBJp*wV9Ews$Mzl?&@- zf?JuU;B10_xN!{y&XGIZN_4<@dO3z3!3y7zcjPNQWLUlusO()O2j=7H>%LXeov$P) zSwrO^SSn{`OK-jsr|is=!`3N7lqrwNx$BhBu*k=7H)uwtyE``CZfx@%=3N{vH?G6$ zAk)HS`8uVib$B?9N^q%~X_s&6P4csKxLaS6UDhiP$k3ijQ0BllaLazbx}X`KY0=KS z(xy-JITZAEGyn|qUO9I4GExW9Wm!i(X2f2sVB$*g1a-pJB2wTeh~C(N$w6Ge!{*hE zsq)-<1)r+M*se+2SliBfpfAiF9R+_jt{CclSc@SL*M~m$W9*^b)?FJ=pQUl?KsSkFP)r)=>CYK~FTnvM5wY??9%Z+}J4B=ZyBw(gQ=afNA;y*kNd;dhgb) zg1m>U*Ya^SysK|k8V$Q(T%UVQLa}V@j2XEL*i~b+S9XA=VVUjz1S6SxV?$f3n?{sq z>3gtC4TpteaXc1dd(28lC9G>1g}xxCtFd3L*^T{bE7EW<$%UsvaHm+;LPx1C??(-E z8V;?+F<H;HjOLo0VR7RK#DZ}%cFGqXR(f}N5!M-&2ycdE=Fo+jdHB$~JIGHTR{FZh z>o1nM{Vf)9GkmlJT5x1PCIu}s`(FT~FK74jT?TiF{etoU3CGVRs5O*~I{4`S5cybt z7RklFzabfxrjSpyIGTb!CO;d4TsAF=L%+mY<^&kJ z!NV_>IbT8!LH591Bl6etyrxeMdPBE|PIFU7c9psvxjzm5F~S+zPj?q|Do6|OM`Z8< zVz>I>^qY{+vEvVpg7@IBzj7f+{{DzEd_aTdbgplshRJwNh(Pf35v;ZUX)QSG(BC@9 zDMd=(iDi0}L#d(=?QzIg5Hu6b{2ly+jMc;W52F4Cd~^?RgxQc`In}eQgM6z<8Rzb! z#~Bi)q4hi1g{%pLJ2WtQQ28t>!}7<_=V1G*<(uCx{EXXEMoDfj1Q&EMK%3ebjudzw zz_f3Z!_vEu+7V?fs71F8A=|lRJ18T=uy@4x9)vYM&KnftTS2CyjsV{;0_4hK?9KfU zihX~4^XtCLr-r)8e0liLl|V~jEQS#Kj{o!nH2W+MW0Dqjr$XK!H-FCUKMKi)&FBw- zmcqw$+o0#Q5Ki^{C*ir}znb=)J8`h~+~u`(`%a$f|C8>g|EuI@{X5iv+-O1jE;NPw zP9A=43i<(vhVl${kL~+)?xEV6Jih#ssC^esg?!f@kD!Du;ISLKpw zCwj(xmzSZ3Ko^_57ehDSn_!LCHe!6OWT5tN3k=#7j({eSuZQ8Q$%lq=*ZI}DoOR~} zIyIco%6+EgEgZ=ohYsExyThK3p%D(TtNB2{lo8tx=Q7~XBy^H8djoo(cuO2^Mm7CK z3Z@+fj}taP&vC*Iu#6++2Nbp?{!o+k1KLs8)Lxs}z?=ytV{qVIP0e>of9%HwDJeL~3i-v@B%prO#od$n@Y6JhV|6 z9HRMfMbM`>V$oG2M+iasJ*GG?DTt8ew8xY|(HQ|BS5>#7bm9VPGU6d|{cuOAtfO+Y z;tpq}d!nuX1ku_WP=ouQ)$-QNaO?cNa_3`8cX|3TWn6c>kD`@2Tw`vdT61P5XXd@~ zY^|xAn(?|x<}Wpcnik4+k1M0Qeln9!O{8~pJoB(;Fsa)6(M);daV2iZUObJ`cVzHH z(5QWaW*Za^Pm^P?HvtRomcl;;-JWU6`DZz<1P{p0G&!pT0% zOLldX!V`{Ncb~v23_|oC36SrUV9WNYU<~-uRxQBf5uSF)=E4XXOk$SDY>!?W>2fq- zA2mJ}g|$%an6Q`e(1iiS2pkwT97jV=jyCP48I0n|QG7f#v8GP+6>s?V^{gGz00!)w(83mOO#?$hJD<>rW^)#t;~?EPbhaP zC+5jnPb#;JI)!?pm$BO8007Gdh1kOPsuB1@7uTYCKBtGrO3h6(++e|X!x>rqq|$4| zHn_nHzIfF-J_1u+q4+LWAsym__e(5~(-R=pk=zco0OPt4OytqgDAXiyXg(U*fHaCaWKMBZ=qEVdRiGVIcZ^Q>n^hKw8W0NS+^U9 zmrUrT!7(FpeZ7$&SQP7g!&`*ip`^-7!a4Fsyh$PQrKgp#rf=n$r}0$bFMB_Ovl;ZU zv+wgm@rHXnJ=pSN#i(kW0f$qT_h3q(wK{*SS>*mg-3Ph%Uc$;b#$DwTTo|TeC9mcy zAFSBN7Sx%`ec~)}mMVA*NP#gL9&Gw7?%q|Ny8m#iy-^)0Esc90FK6uOBvg4cf%l&u5 zttdGEXVVaap{U{@>_C>BDX)27HO31yeO<6s_f^?cvRoe~<67J9)|` zz7cQc;7q${=rPp%Svw`!ljNl7=4c#U?ENR6)o~Ng&BU1b?t(Sh3a%!4V?G<#Q@+LB zF}?(bGDrmkHu3ejftX~>Ejtijfh6Nj7>~ec*#&(kmSzwvPSi`GZ?xixB3nN_uMb>$ zd;EF@YtybIlu!az8ZM7XT2>YY3+aZ(8`4!GKqP=wnKwM;)AP zdAXpa-ReQ34r*s@T3#MieQ~eN)#HF~F5FT1AMjnoCNvZ4-Pq58(2}9j=?xjC4gj^| z+rP7%vsu~f9*7aIC1SrNLf`h0iJa>9Ib?@Ec10&xz@XjfFnLS`L0t&B!C~vDb9%1# z@$9)&ALP!*9Cg3yeur>#^a;-&_uPEy0*05{U4!8!l7fhA>b2jufb<@p@PfwO#cq_9 zVMoFFGzF5{P|>y|y+gZt^F<0!)cPG7=8H8GTwSkP;x2vtof(O}W~C?o`ocg)raP!6 z@^E$F=11KIHDGAC(FTyNpw>az#*cd-7xzFk4QQNVi5mS9ONgUB*(G;AkF}Xyk7N0w zz~N&;H7YJlzQtR2J*BG@t!8!A6S~R=Dj#l_XTtj z^34~N_@4SeGS;DwByR%RQOg~HDHwTKUR0v)PO{c~>pN=9x^Elt{`QD5ly^*HM;AD3 zrh+wgfmfKJDM+!M14iO-5iq>KsVN;Pcw3n)Q^?Zlu@pO;O%riVTRpM1g2wam?H84B zHw*=JO7X-La^vuHbrd_D-Yr-#!Ffj;;q)lRRHoLD^?j%#OtM~#HCwUwdtE;_rY=Ct z8leSg5FefVsS!mdSUQ1?Nhd$y&TJ}ZRPoJFFOF5kpWD@;pv9CM=~x#)nQj`0pj*%4 zZVryZXzEIQx6W#^L?W7&qrt6D#AbWwDj(duV6 z`t!vSC_W%wTY(9uaP92??ZWVGCxt*puip9frg~UD{}N6X*qkJlmz9;uq#*g=%gQ_@ zt)2YxWo3|$8D9~8%F^6JhQEUO%UeR_gjbY4{SWuRV5d0Q=H06q@*=#yU`R|yX4ha( z&mkODJT5X(KJ<$6@4k28&c-oag=F4$_^|w; zT-l?9?x}p|HKo*~jEa*}-@qKLeUDuAhVpnH&m=A2f1`6rjPZRKY(*Cs=pz#pu%kfU zv{f0dBu>l`FrHCt;#NC%O3gon@XDhYq9VEcdm8v?>Ch~rEX7U!COeMjGS#M zk@Y?0|hdntQU@ z+Z?EsZG^Y?&vH?Pa?^;Nr0{Iar>ZM{DMkdMEsgoK4(bwKf7Euf%d@}qZ^t|1jO+T_dO?O7%- zyo)L2HEpdjjpQu6!R7-DlsU6gZnU6btDc$>WMTZS)+koSv@+^^gE!WWyYTn)>(iFM zCL3p#=$fZY`ZeL5*;wi+Ctz1J9teFti7Se$ zi{>Vdnd@hc$S&_GH;+Kl(2RpVs@Uc6N7dl&_P2DG_F=kB#Zx*qW|(C57PY5r*r9B2BRp*S&%j^) zoA`q#AtK+!pOgOb>92(T>glhM{%qUvmr{+t=Dql{*W$12GyFBupDh66q%!)m(V2!N z^oJC{G0yxKW#jONBqIQPKunY*4#hu`uH^?u3_S%Ca)7YtuYMc;tnZPI{whAKwC+^w z?R>34K6aB#+N(6ZYOhsHGIXC38gP#oA%=-GktMP!WA-Wdh+Oo?N^s@O1Ik}X3H8HO zI}#@v8JifJ8AYUSZ)LPGMl(7Xo8&)2)C2CaTXg4`s{I<6 z)2kBn^S0qF%xPReKXbGmANzNUU{+ufLHpTmbRZ(zaC;l>WNsulnYodmOy=}BNx!@s z{13(>f>Cg~y(nY{baSU)3G;R`EL6Qc6}6}RwzAsb6>WGGbE9Bu+t}AJr@ExyVZ&Zt zMl>VzYgve|+c@*K;olovt_o9o()YhiBKhu*4JkzpUr+^|n(-jDs~Gw;T{ zjJb_@9k^Eiy;y*#IS2KzU zl~cmiqb52zuiF51n3A`*a>@X8fGMf3?^9tE`i7H6>(Q^oQgFMTHbL#^zjJ5)66ahP z?&Og{YWI0|sBDJn|KYV7?zCBUxcPrYVLf$SQsk0>YWK>LfvQzeGEY~&e3RP2q-;1T zw+&Kn9u#r*e~y_l>o_Yr4OYjyug^5;Tj1YlLc}o^(XI;^wI2o}H*kzMG>##Mh86qu zag~7>g=l&VL^Q;>L+3ii8{yIbN3+17MnjBiG{n$GLyT@T#4t%iBLWO*^Z}QQ7@}I; z7#(TWMz|O<-QXM}Dvdka=xtN@`eck?9KsmM7{wUPIF>O^N4IdYBAGFh(Z!h0xPh^R zaT8-H<7UP(#x0EHj9VEi7`JPPPP~d0)r@tFCm2sN8WDWW{CmdV7{ye*M68UVj1i1c zjM0pC!cdgElNFha)Qp5&GE9weSFoy@v7WJ!v4zo^sK;$%jApbmIvAad$&4wCnT*+t zc{;j9J}ZhCOBhQT%NeT~>luv*8ksjUVoR~soUDuyjM0ov#xxDl`Dd{rkFkWYim^Va za?o(~jOuRwN)_eYim7WbekIfN7!BOS+`v-i25x3V+6V+CV1V*_I|qj?tBEu&r5M4_9<{1!p8>^NHO8WuTQcNER&U`&y* zuy&U+tzfKXtY?gvp?mi-Z(%ei>-tc}NJa-^GGiuV9-|Rn#T}Y|x2V<)qJgo6(L7y` zAcE1(n8KLHSi)G&Sk35V6r6!jMk4{y8kduARy(;f*)ETmUovEkQ z#u&}$U`%1mX3S?S(Q%S60xD+`KldCxA!Uq>jG=ew zdM9HEV8YbdjF^a>gpgxrqB_~%ZOzvm7!M$!%#8t&jk)o7 z8NuA>n4*~*qh~vF;{nCNobpINC-bWh)XA(c9)MGr8-veG=Ei6>n>p<;qF)|!V|bp= z+;~1HVs6!)ixTGgU>A4IQdStXQ^uT1o_^)bjYp~q=Ga24{i>ML_9psOGp8FO{py$- zquqMu+VGwpy&70y44)gB8^dKUbK{Y#nRzcQcnsW_8&6PT9k*GwH#6_U+{&DuA1Hot zf*XbLNEFHrj3*Ww^Zpz_1aspNEt2^_wvT3h6LULrSC8h72h6wsrjOoD+!5H=USS@|TxD)&?!&x}+n6tNr*7{Seym7g5AB#| zGdDBOXWpK9JrA1#n3u49AoDWjLCh74__Z-Y248BlC{Tjjps4bE7Nm z%)FW12QwE1dXa}Pw=(a-+(w-0Ka>@b>>!M}oq0FrPUhX2r!eoqJezq>=K0KfF)v}> zn|T?yHuYj-MFl(P!@Qa~9T`c#dglF@H!=@r-psr|b5W?5zyRh}=5%5k{cMFi^>Py{ zBH6(p=62?TnLC*eVV=T#DDyn#!{BLrI3DJ=3|(*Fu#?#`60aoVwi_AAJ06(&58-Eh-PkQ?qD9vJem0<=9$dnnCCN( zXI{d5GV?O#w=s8Dup)sK)y$_buV+4$c_Z^g=FQBfF&7W(Ili5_mAR9-jX53kho4(S zvVt~X($CI(HghNQyO^giPiLOZ{66OS%(Ix6Fki>KjJZi0k>L8PV1*A4QH-HdJLc7F z-=29rbARTI%mbM>Gq*AqkLV@RnYopDFmby6ZLH|R4kDR%V{T{OlX)`pA7P*|+zxIJ?#bARSG=7G#3nRj!u!p@2q=E=;pX%$paCiC_@s?1~V&%B6v zAoEh@-I$j%k6~WT+->4fW<4v~GjC+>&%Bv=H)B-#sGj2(=Aq0@Hl!B62p~3LL z+-rDX-oo4zsk=9OxXzh}GWTa5!Q2$3yN@>9GsnkR^!vX*E0PTl(Yl9B=Kjp{4EwRV zeUV|$ywtF_>-Ob_J@YDq$LaQU;M3?C)8C;h8Vm=CI`Soyg|VD3_#2c~hr43G-&=uQ3a~t#18b_mwWQFm7U}t`qJvf=~ zW}d>lj(IYdnDGde&Gyf+eG&8fn1`}^?HP|cwK8_F&~U&-O!ZB_3byCAAgY zXGH{Gm&VjeDSI#;vs2jKm>MZ(`z-cvXM1C+rHbt{**=r2$e(!~*;D-|vLc@Y7{BAOlSWG?tI87D(%KL^_v zF*l}0jJcd-wl^Ae9w#`E-Dk4BF*8!Mjvp$G$)Y@V;9?IA8~~4mL=oG+&Gx0tjhT^r zb|1v{UW+ds{` zh4~%KOWhoxl@;bPJwel%=W&9DG7n|@93ud>AHh6=?emx$lTo)ak7oPz%-v=AdW0QW zVazs7VD4ZK#mtkL&tP802^h&dlkHbAk7oP+%=6fOk6-a{qxLQn6G4Ren~IU zT;`$7?_^${uiJMbPM1mqJ9vg2L^Ges+`(KjuiyYWGf!swjm)dp=@A%Hu9k6^ypxc@hDgkkI;njPHD+{O|1W$s}6 zH0H_7cQMaozL$9(^9trg%&WBWhq9CvAG3pU<_DO2If31nSF!zE=Ak^kKhM05?e{Qm zWd0HJ7Uu4MvBLU_US$7Z-pmnpXCA@!&oYl@K96}hm(VEY4z_=QxploBzMXlpZtoV4 zvZ9^?h-RM20pv4pVEZx5^VohJ^A=8U59UQ|Kc9Ii^QFv%79PsKCo9U?!9C2YIKt5e zXZzL6jineH^E$R)z}(FKdogcd`xNFCWKZ=U#R@Mwc!9atq8HhN%pDxyK<1%rznFOh z^JUDVnX86>=3g;S2G<@cOIVS~4qjrO$9x;}BId6%FJ(TNdHI&gJ!{oFgT~~u0Q~dTa<%1AzknZV++It`L$9J|A8Ebd<1z7@-$>Jj+LJP83E}B z34xd(KfupP$Uex+`1r_kkc|*G$Fo59d^1E(H(~NkT^&bq$|W1 zaxY{yBn6THu|pyuogpU3a~~;U6J#UgVTc=&3%L)H3YiVLdzT_+LXsepArl~@A%h`( zAYBLGZ_;i>jD?Jb41)}W*dSq$PLP1z$`gG;Wd5tFwOzzs6!%{Bi9TV(eJpn3{B!PA z|vE=b3GEq|9!kn*?2+JV!y4-Dq_eY()7DI;R$F1$0zBddi&1% zuD{W_7DU4hx|v!KjW_BvcV6fmCIq`EV{sauy&^wH={AAqP${AGYgCa<_8OzdA;Lpt@I;`Cb);2vq0cXaIN%06H2*aT^#(I@=GbUa)$* z&~E9`&|TM7qR1V+uJen0bE|sW5GU>d!xk(@ap9NZBO3dHXY0|560|WYhm34j>Vm9v zc|64@Q6|5sj_qVVsER)D5s879gqRP?f4!-W?BryT5o%yKf2?qAMP?44w~8I=I_Wq4p*BXW(ysKDqDiC%T_#?_+g!^fAx0`kcfQ zRlgyKo5Q++Pce%rzhQkJ?r|)DkNCg1&xe2VlYdw~^A6$y?s!Li%WXq<`7osFh@Qsl zxv2y0StI=;wYp4eCwyIIk$;;In;^fDd#b~kei|=_?k^65?62q7`!V?|!hfV+q{+u5 zd?pI{?Kbte;&V*ycvtO3_~pCmpqu9&MVSeg*GK+;HuLT}3j>_|8Fn7nnn`c|i? zdfi=h3VPU7jNj_zAKTTWsZK4mQU0PHmqB+IQb-Q{eT2U&P-}^#8v&`}0NV0v{^XPI zsV{fRKdwh)U4h6U`N!qt_to*88Vo(2cLqTkj>~7>S8rC#pU9){t6e&oKhgbF;2xFn z09wN*^5XmI3T68za%rX7rEfLcU%?aOGCWrsydIo%aQClDb-LpCRQ^$^_Uh#LR1dGL zLWnaE=m%A)lik}%Z^rGRHdMUv9`1$j!_r*U~@hdQWJ8r_(`hdpEuq`0>7 z)(_S7CdIK&?%Jsi==S1e)FdQ@12Bd8i?FCb5jIj@*{SyJwBcP0s}OM9A41HAz~9J^ z)bakx-$DdI^7hFGK2jf?J~~hgbcKk1X~Cj*RA+HN%}^%sl)%=eqbQ(XCBz0IQcOpE9qg<8l7 zXl$QtPN7oDi&H6oB6h8uQmyv&pO|kFZ$glQ71e4l|3;XL*O|mFJw+q;z94+?w8-xs3ZN4Z8C{2PiwsI9`)9~$TF}PoZWM zX=LW<*G%F(BpHzm!-0FlcdH@(bD&rN8NXky*sI=r%NK9rJf^qswG~bYckjZ~2@e%H z0nUz{O(I|c`T#^2Jz0-%>o${ov04rDk9`~2g&;7h_~@&Om(m|mK zSy!uu`>)!C>W6T;{4c|7*?o=ESGMoJj(-6A1G@VK`_uvU#fMCy4DyLlC|V!XMTBh& zY3|(EvEEW0lpUB7;4}sMBL!9wJl)#dp)s)DzuKJLF2&C&>-MQbt~Qcs$MIDs$c6oK z{>N$;|81X{#6bue$$L{#FYMq~!HgaP(+@N$# zJpx6Kv>?%AW`O8{yKIk*>P7#u}B3Ca9UPxdt~{g0}HJ9ElR z*Hwy)I;!>==BEljY<~1hLAbuS9pScA{k$UTAc0MKSl4lR-%+){zv83PCFSQcQ9gE5 z?Unj=xgx3{YwL8>22ZZ`B4nmEfD$1iJ2vW%Nq(XXAIm-rDdoVg=V1|M(Jj*=I+^+i zWI08RRGgIQMtSb2+I3v}HpScYCRzgIbwo?3wY>GX+IyHq4@BPsH?$tOq4gLU;%qNt zKUO>Uo<~z25Sr>Bq@VXY4MhI;mRFnopJwn$Id)y!aH0^ z>C2a=E=r#*>eZP!sY{np{x8<&!Wvg_Rcw3#3 zxojm9@uEC+LhU~2cS@nIOI)^ek<*nkTRf@G_%AwNMcO`7yP4jRF`uae?>S_eyewx) z>b1OyM-&8!a2Tk&c&(+Rj`l(RQOka}iOm$_#+h(B!=s*gx(#3;5cjTt$ zta7I3WKbC`U6?*;S?*HQl~^tRjT9yH^qZZ!*o6X|fmi;r(r;gIFLExbeP?8)r)P^8 zigQwKPEPt#E%TJ|vHw+=$b1C8=Z?pSKu=kd{uxr4`i`E-F?am4A}E8LreE zS8jH~(u`%Z#ZlAbob+_A4e=N1W?^a;sl-64l}XE%E?<_FKFO7nrDrWi43ag7GOSje zI%;J6(%dB+x?a!Ak)j{IP{aCt#c}I}`23B26SqyO?~ZyRs&wX1j88P>?9cJeO$iD|?+(Lqn`&H)}C+ zl$v$t(v_%LA%2xpPpaL0D<}st@uV8obDNs5oD;e%XEH7lgycknLIDfAeCebb(mj}J zbjB)NQA=hnUXmWWoRUr^u}L0>gWFz57;)(fau+R1&oTVINCm2AT`wOLvV~HlCj~Ea zW>X@ryD09EL%+o9&flqt>8UHyC*>@5Ek=pYK=m(Pwp570avrR4oMi5o>Ol8bzB99y z$7W?MTZqYZG9xzaeNgcYF@&tM^Tf1TOESeTT}X{!*bWtNM6IVF~=&f0}3~Ras#55o3o9Jpzb1nuyB4baf zecT&R$9jRyTz0J(F~#gN9g&b7c4%k;g} zuE;l0BR3j2j%dGD`19$)(;C+0HoZZtctAxyv$gUOy~z_dYg8N(Ri-77Rj9vIN)V-& z%Mg_)`pF5W)evWnmVQ{xSo{DY6DzcU^$OZ)!uz^hSG&lJc=Xz-CU&*1J|d>2rj*5}Ci&O4><{M$9F>jQm^;ZYPdtor*>}pCLWh7}bIhPv*TG>%S3b95r zPfyp2Z?<0JS8HS%RY?5OwA(W%TeRX+N9((Rvd5#Ue`S|O^^mE3c8b2rZ<0U1s&>6gR#KpIEcdzudViB9t_H1*s~LkL=et^M8li{{18HGnAN}pY}3ics+be_288q# zz~3Ng&S{d7lGU|u)^ zgPUv1XZRvHbjH#e;rao{DVE9zABBvCnebIeBFuz624dj`W*aaU;y}jS*VgdV8`k$| z-S3l|P#uVv@MlOp%!I=S;b9x*NFWYF)B?%|uEl!W5Uhz^TYFQrH8^7(kFW`{6^S6+ zHx%_>2Lgkrk3>U*Swomf-vIm_(gHK#<|vdFA}9k68?D!6B=A)T6?Fx0VKj0KH`%}z zh#h7z2FHg(D98E0vyj!$H;%!Mr`vBuYXoru+sELIDVVLm?;vF`Hv?yl#Y*H+v;$!B zI3$kDz`w@huvC}@_7ZJ}Y=t@Bj!0w?gK^Tmk%x^r%0v z0Cfr>Goiq6tqKVu)YnDPDZy;4p%V7O9U>2I2xmbyz)Uzl-Hk>Ck^*u8LUrE^%*fCq z$Of)jB*baB$p?ln=0*pMycY?Cp70{18D?=G&iuMxZ*-BsS$K%qfDEJnkK#s}1@pCa zRaJC%yRI$5(qilx$YD4lJP-LAX2QQ9zrieW(MVV55nNk{Rka1#vnx?OSd1lXft156 z@`Sj56-o%^eBf3HRkyJi>!#J&j0aHP52E{onQ$G%4m07~kYt!EfSXtAIW7Y(S&KSG zpxMA4C`BKbZNU2>Q4|^Q3`Fa0fj#r}MB9L6h3L@W2Iv-*Ae5qNpy?sb8BkwJRyAA+ z{xv)hu7|Y1Tmr0sP&=pwHav_b0DUv??nm@+Qh=2Zt=k4h7wLLCa3^HbC+PpHVVGKs z;zBN+z`r5+Fw03z7+Q3UCud%Or65ZnR10UBIHHh-8)uD8uPXs;> zA$5ID*Y7z#|YB z+?)WaSf8g1L;xRyQ1~Ulmm!phEkO7COlUEG51U0jc8oxx5s(eohs}||5p2!|J`SOP zN`SAic`NX~E%jSIGaR}w?1aS0cdc@JdV#r?zX9Ms@h}N|OyM3;Q(*u}KZ@f`T^Ff?n zpi_Vc!gURLQ5OOqIf=U*^hLlu5K2%ju7H%C1c>GV_!NY4wi&3L*7ZI>=c@1l)1Q{KxdEE3k>)jcSX1f1a5(R4Kv}`i@KRG6GBx(xQWe# zS6XntXh8ojF5~V5p%IG>xDOJA2I<}~2^KM@exN(ykwUwSbn0>36f#Dx9+ zh92(2fiFYoKC%U9zk;fQp70J~66G+@1pe;EAC3E3fTK+z<{5f*Y8J0Eb&lA{qygMgqrl)Xigo6R;6v71CG5>yMU#?GSC&{t1(qu8-2#|w+?z=267 zt+hu0*WHd>z)>Oa${pCm0yknhb~iw1+;;+4I>RJFp(mU+Q`b9z7a-J-zXv{iCvuE- zQv`I(GKmPdcLMiAoNidu!LV>P2--m!uwAlA&Y|aBd2cZOQ z2JU9F7g(@R&rLPZFHLu229`i*1V#7Xk750n-iT3?-k28{lI&aRJHq`ATP zABK60^*T-gZoe0GgVYhGU>EcEFcbPM!3K%bC>7wOrTP^S2iyXo$Osd#4{9g52i|nQ zN%VmGXkbT|ex(Eh-+EBLQYwH0R-^vu(u!DZ5+@;aDV_#yT%(&yfJJcQKtP0j^G({d z9uBOAA5)cK6{n8bPrRb?UY zvkgcP+&2IdHlqHi=n`SL*gN7BajX7P!F_}AeS&(fmt4GBD>61qkB)2JtqL}0)(dc;w{9Eo;-KwZFLrHBAs zY$WiX5XwzC@YJ)20Deyck35HK9p-xAs?B=hRs)}bP}g1x^m*Q--7g52y+8><|L^mn zN&Kq}Jr_Ke1ASl8Q*8#Wdl@-}z7Ti`LU+OzV8$!DITQH67QOMV20r^wG+4Ob4E#5w z5#~nVu74r&vuG>82VT{yW;O5`H~uI$rNC`$-VXeU&CS5U<+__8z-5qn1ey)p#ritn z6$nKpUNecY5K1Va3zCh938P*|I4~1-eZwRoVRnbY5D%exasanNLSfMe?6FmkI0Bf= zX2Pf0Tnb$Mrb%pqd-@c`KOvNvD&T;(5Ek_Gb&92sEih*TPeLfJW?=WXQU51k5&pJG z+yfDfxORchLBe6)44m?gN$d3zfvMYcvkO=W`5Jy3ff4Vbt-y>En#FPmB?6~5YoEa& zGftouM<5h2PIuP6he2lBc3jgBZr44O0Qa%E4)`s^fkb$LmiKfwR^T!SdCmszXMH^| z@O?BWxQ_rn38DMKCSW6kt`x$gDpUvDBm;ki)Y1IUZ!o;^f!-*#0uMo`#U2KB-l0bv z4D>)s;duiv=|kiWW+%`Kp#cctdpq^Ws(>9nLT?B+Lx3T>P(m<=0`G!Q2Id0Y&*3ll z9Euuv5|R(|X<(n-Xw@)>0}CK?VJ-yTQH_=ia|$pYLbF_ixiu&O=<|R>_vnd;1WE`s z#!}!rq=)5$xWVdL6p=dAeT1Xw?c{bCRN}_6Y5A?y31#C_O-m@Qx_zH;tK7J6F z93n0OzI6x<4dx1<<(NsFfY}OspkD7kRs)|sj)o1tn}Jh5aqGpN_=!n;1EFGU20r?! zZr%iZ;sojy9yS3tf2Ma(IAL6zf;gbZDdWQSxt>eHcfUlvLcbmO;VEo%g?T6Ni_^Nf z0ho9O?c+Q;JvR(rlh6PXXlg_x@ZbX+bsk+P%u&F>U*o!lhatd$|3Rt1909C=P+bx} z_>ErdtAUPhbu-};5OT8#c(+$i=v?4G{tr`U0aiuxzx_jZOE*YLN_Q$DCDPJe(hYj( z?(UNAZV`}fL<9s0LAo0W-#O3o{IB23b=`dKot>SXot>St=bZVT1%jG`g7SfR1hNO- zeh&^}d;n?)?)zX&0QzTRz>)v_IN-y79&!lopnza`1OdlRz(@+p83&v`1veVN!&rX~ z4hHxpz=#WQYJiWv0N4NGC1^fym$D4VaSeJiSiuGO^5)+c6?s7RJ1~;L(gD}*!8oxA znjKK*@!z309#9zq4|xL8)d0_dU=_Lm6oCVAg&ds3IyxPYE(Tt8q7n3)Un zZGdDL@c;CD@N@SNHJCtt7!&{V;OFll>rn6yR_G>RDkhi>3U-zbI0uvs`~u)-tbZ%i z19*uI|IfYN4d4+Dm_Z8ioB)d9{+lNpa1!Rh&ZYq|z-;HqrNyy+qCqww>u|U?q!zv1UI?&L6eiP6U%u`hYd7J>@ zC_tDe@Q8pmK(PGwfR>aXC>5kz1Ae1|heQJpqYgC)Q1t@~z(Altuu;z+(2xcmQUubC z0o&-|LGK1l3P`~O|Ia%f7~z<~^h1!22zU+zdmn+w0uPx7g7v2bKq)Zcbs6N51=I$D zm9GQ%>KQ!b=@z*Bo2H_Vh%Qj zJt9dR2-egZfZITBApHdJ06aMf)`t+eKt*}MR8f$Q2p9=w%EI2VB?Fp*8ME@xZE(*I z%sLRPmu>?33I5x0V00FShp>S>Zh#x2phCcJ0%nVWoq$6Bc{-E$zm`|8 z803NRObQ$%xGlQ?jF=}3IbGm^Y4+t zs1K$9!)~$v|Ea&QDZ%MF;M9Qp{}6b{E_fdZXlDmHGDx=vJO_gH4+zvAoKqm!j=ur= zzWcZL-T*Q={F}}UsQsVU0Sx=khXV#WgD7dRgJ3{!SFkhCVf_FN+`!R+bYs934^UCy z*8r`(;33Aq!wB^Tf(;=4z(9P!&cF&7rGdDBmj!eK!Uetu5Xbl53gH5Nf_YdvV2~dO zHU~Z!5D~N}%^v9OfW!fykAQR%z(pWjkiHCf90FPbq@RR<>z^+4-^=VNU?mW2_^blF z1A?{6J>Wsuzv+nKU6^8cnZBm6Vf*((+tJ;(!NI#53F zFpeaEO6-C0e;gRoMEHNcy91ACg9HP?b{r2l0<-`&SOe5c0uzFP*9WWtf?ck#r=N`j z!ScfxnG7lm^27uF1^TB#DWFAwU>?Q*AlQdi@qp{l|5o&*f)0`mPQyNEQZT9d|0Y($ zn4AlGGDwH<1c(iI^E}YBK(PA;7$Xb7$Sn>Z)xQ0!{j;a7H1kzzF0O|q04sfFqoO|G5kAV9M zbO8K6PlBud_q0L)Q-Ll(dK(~X4LHaH(B}XvYQXuY0Sk3tp`#wW*Z|)Hcn$=skXi#g zBnL;5x`6Y5Nrb&VKITQOfbUY z0b%Jd%KztKgoXLRzN&>07M%t2Fv23hVEJL}{?Eg>^q+_E{67yP6m#(34Pb9!AUmJdChl5?CG>)Bp3Zzz|sY2QC;^VT1*Hhyo8IEZPE=A4cTie?5$_ z=z|L|_`p~(4DLu^nP9O2^FXlk1e^2^8Tlu@wO0!%4z6`t3&|f2Hou3g6%`-xH5{}6 z5uzgp?m`j4N73MqYZnp1j0$ez|6A5MMS?I(|8KoN4>F{T;eX4_x?maif6LQ0$PjC= z?f-2r=zt8-1LgkTaxz%PLi*ow*a87!>jD81+gDyLkPWwpq==@7xrnPsvPiASy2z=> ztH{47yePgXy{N9Jt*EDHxX8E~WTZj(=V@(ebvsB;FknA10zLwV80TB3>24vdDmaz; zm&TV`*ErR9)qr$K@Y)aVwB_^F@^$jP^8NF}^NmZKO8iU0OX5q?OY%#~O6p45N`_0O zOBPDjN_I+4N^VLZr6i@yX|3Bx3~AWANKexqw~J{w0{H^90-XZm z0_y^&0s~xUgsNJc(sRbqZ zgZHuksQGCs`$&Os8m%+?NR)7T(`9RACuNXw+;W<7F3=ompedX{GsJ@?r~`*T4G#ST z95!wRO$AqlWQAGNkx+@AR@nUy7C;`9l8{VP0t)ViqR zcP>2?g6RYvG%MO-w}-VupK{W8{cCS<<|*Wgz}|N z>_u(S& z_{6_CSpG$)4eQW#l5x*_qxNnI`9Mnv&agy`+G3T+O0D~2Zp zfs;YbTslT0HqW|Nlx;DA+)oUF4bwBu`5;y96QA-E4&x7;=Ph~eU7f@pe4p@JTj#fb z_e4E+Om^NH`8HmEhPfx>2i=^YscX4NK@Y?bHjFW9Hlm&3i#2N(kPhw7YP;3C(s}L z9vmMZLGxB=My`7GOaPnqckJ%!qjLRtE{C#k9u6-*efqBQwzQ?A;lchG=j~x* z@fDNmht(giJs1a=lSio-zR-xO6Ga(oP(s2#;6B6HFV+3RvytnvCBL^S(+wrL^7h)q z8T#`Wc@W)x7wLuaFLsZ93wVdCV_=Ls~^QS8D4TW;dRP-ja!b09>Gg37oVAblSbRJo8NQszt4F-zD5{Z(k^aSHa zIO2GU5FAm=D(#MQ!`I!Iwr4Vqf5kUd|8^@KZ=A`6JU;$dF6vqO#7Ld<0fjnXIpnD> zo>-Zs#mfkdqf#l+UzrkFC6bP;o#XZ4pE@@E>fuc>KDiP;Xx1}(WeO%ILMzQPc*~TT zj{o}CLPeEj&I9j$Hp+GWg%0DZUGoImbMd(*;jM*{4?niwE@$h_j(*GaqX}Tb4loIz z?6Tpjos4JqN2(!bLR=^iZgeHT64_2cmug3lDwkFh=M1C^ct0~bkKFiJKw5x0yJ^+H z@9K(jy`8Eb@7}(^6K8*_3{`1#G&gI}s0tWBF?J?pd(0x4CF5qC-$XBhyUlz~&c4;m z$*V0XJttl(#y;B<@T5%Tkta@jKjn!Ovl!8EKB~yq{RLmrk?zT8gcI9e1>4`3Z)+xU z4WDUrimD_9VS0-T(mUb!yj(LGK}Ly}D67QrPtAWzb$%3^*vPt7g$C8Y$@-GqJ9tFf zglhe?oJsKP9^*sq+um32kn!5z4k4i%5jgpoo zH0z@YO{jW)Yjgi4XRgWDk#@$?*5>a~5=kN7WoCJdVD|LPRuJ#mNahO&RO8sNnALbC z-;w28&GeX5Ethv+U%Yo7aTrHkIq3IoC8YiajY_>&9xkf2g+G!WO2ofzC{2{IADLH} zSbY0ESgkCwJJ@B@YnVH^qJ~LPPmEj&k7~HvOU?*Cup0HVQmdxn=F`Wekt5>_;hxHV zx*7!qgo;OGn}y_WpIx6l@$%H1`t*uPV0ANq=aur073;(pOXUSGMZ%DeacA$5$B(1P z1>K2D>pX{Pv;c0&vAN4I}=<({eNj&n>$n0%kBH_|C%SeokYcV zRa2{Us304}q1B#rjFf(0H{|LpS>Lbytv1vY{+K!T{V&|OCJS`m>&KzrTPF%_51r3j z5$g~{sgnZjq_2u3NE9awiN9<-e>zlkG=C;?@C99KV#m1LWK6Nz9AfVZ5#PfSnq9h`9v^|eenx6J*oi&uR)6MkrV_d;q|1cz`Aw{4+Vc2H!TVyZ&^sHZ z<0tukmdfRn9?jnmR`7OA9E_?d-Eod5I_0i4H4Dznyo^LtuAxlJ8+R3LL0_?Q9!TfJ zW1DkK51(F~hVwKRyf?DIIGXt+m-Dqd@_LfiE9{W!Z0W2j|lj zH|6UHteihzG8tod562+~rQH>RVL6M}gjOEfl{p@RFPR!=Jil`oYU=#iGG8Y%b&NRoi>a;g85Upj6xluL$+hOP z9RWwdSM}?rfahx4gxLg84~@(`_zk;f33^pK2~_qdulZ4-lxg+MjRRfN4?0m76UOZ7 zhjD~j{*&ScZO!i+34%R34;wsxbYrEg?mGBpb-P}55z6QvI>=?jFJfJzAtJ25{zjUj z+(f%5`lXq`q zULHH-yhY|iAGOAl>Q+p&djmH zvT@$VxZvki-(lsqULO*VpvqUT>o^lZadeU@rD4a&qnHyzBS-4L~` zPgdN0K%HJP7<-SJg`U&bBHr$|dv

%4yIp{fS5aF_KJK#9@bDdhF0?P5VfriCONA zv#y4}p)gcx3Hzra$7tAN=+fyQj%QL!^5^%=*Uve2Cj<&bUEiS)GYLC4&Kmor9ujsN z*G8^1bS)_|vYxuPTFZHP%FVveS~f6*CsL03-HPZ$e?youfDz@{5A;IdrfM~C?qB<11XCQgAot&qwm9h#aI<(sQbWj_U zq@(j^tMpcf){>*WY{-pJX6v32Z@U=6Wz&pas zo0hh%>qZ_1OT!HUD9BCe ziz8SKzU@+zZ?2ki4j$5ur!X<)oG*?gJJF8!W4VW=u^xiY0^!{gta*CARs?6|-BaHX zv!wW$3mVc#yXk~6BUHWP34acE@|7zS?|wfUsy|%jwttxEem;3QU;WnTudPOGo|eOg zE4NdC9RH!ANY&<|8JGM-{sePhL;br-gfYfrN|7eJSshcj-|i3CHEi)c9%=DxqkKNm zQo7Zm`c}#NV(4jD`kNd5mkoPWdcmJ~zLB!mPVVsdr~0SIsYojspg+Rt>mwm{2li1R zLO*To&;(-&1Yw@Mx6rP(2*I5~E6DN0P?^an^n6jeNkIo^}Q7h9?(!S?*(0y>A7Hz2X^B+%bhHPEl-2*EBt03 zWUE}UuDZFwkGrc+FUT}7J$+m|?F9G__*&5!N+;Mq&wG45x&5eVtw9TY zhD#IBqxu4&&5gYPJz+TxnT;+oI$AD^&Q&a?#eG!%Bdkj3;Q#n`^6 zCnF75a)^DdT^45RZ}DJT7=IBLx8|j(Woyj>iD?@43KL}VFZodR9x*ba;$r)?2?F7Z zAQx6rYfmXP5*iKu$OC1~#hHTd6kT&Df5OlmFLPap`=bz!yNf>;cU8Ob(i%pmKpz*M zgc$JY*3L?e7abBbH6PuP%Npx=%^gTQ{}#A{{OKhE|FrubrXeH#ceRJY+7pp474s!p#q4RZE{gB)}Y~qF*3sWH= zjax0vJ#KtJ@ycd9iAQVD`RPXKflhp{ps`%C=;{^soQ+kN#eh!O=BM{YYO~+N#Qxa# zN&)TK&o0|BbFI~H=a0HPM84kpzbDPw1oKJ1{>t*`+%~itx1ynv$qIpM=(FBqEKjX-{S0bbxWNdw!YlCx6rzXey)J+ z(>XeX9t4eYM^~!xU9|qKc*$ghuO86AH@a{+U8tC;AykE!G9N1oXVvAr(d2mv;py}! zx@P9YUXm$ty1jWD9`pEAi#4VpRdY=5Z$|x#oMo4AI~=@21k*?aoehJSiM7!_TU!xU zF3|z?*QE}movgTL^TCm5zpJ5`xIZys>p!kQZS#>iSE1-6EU8wW32Tynk-r|UXdX#0 z40ll`-M(?`rKT=UtT#&aL3{KKLM@#?4a6<0#%e+;L5t*A@@qkxa>rFQCCEimrcb@$ zwn9Iesi9*C-S?2+L?shBz=Ty zIu1*3&-dPamERL|7jiA|S^qqLfFkG}o9tpD4~Jp>L3%o0W%lGXVGyCuqh_?*ynCp)7k2)xQ3JOu1@~3J&4z4zGo=nW%*Z*%wH}LlJv0MqFHw38>Ef(dnpAkgv}wIfoWK8nVgtJNG5b#NZD3)vACkoUpxH7KHxGx*jCtU z&skxtMv_4$ASCEA;iTKei|dZr>3Nh?~-Yh_{FwX!@rSui>e7%M0STZq|et7q~~9t~)J%f%ExHQ;S!T)QMxgO)Xg&i&loMc$Ra>!D+N< zt*B=sYX37QI=t&HGzMzQZ++9#gGP3gaV}z|Rs%PHFdkToGTezronYLXjjbjdrM*KN zDVJ=)ZDf6uug)j!@&`oL1UPYMc3LAz{rs!ygo00j_YFOMgf(#_J7h8ruZxg342S5b z0N39hDXKBQLo(|%tFZLDq};lns%ArK_40Zl1($gg1U?&wjKWYmv*N&6teuoU*g6Q3 z>_}H`;hw^%y`?Cdny(36$jPrTY%@*Am5GT)*6#wB5co+UK`?j8H}+Vt9(Z+EP4t5-TCj`Z_d`tI2Z!jo5!m>nU> zG{#YR$d49vBEKI{i`^Tni>LJ1n(td$+)U7rE%}#Jx{~KEof;p^&#dRk=jIE>5Z4Fc zD0@?PPIR#9kX`+e`wQ`s76cM*Z7E(KsW>Ta-2KJdmwa(SKs5JQ{@RU%+}a{MN(C*B z%tS`{_rgg*9R_7g)fddgz@9fVD+^L{FYR`H2PK(SGuL-|phi&bCY~~bE&8BVDQ$tZ z+1jX9UABPh_RaV9Xcn?L_cR9du5YC^)~*;?Te&Rpo~%`Q@w_k#tVWoZ31ZVJ5wgv~ za;+8(v1>4at7ec3b9PzRs6^Cy-Oh*geI{CFs`|?vOoNZ+D z?jXf9&rxa;5om~1f#wgE&=8^vL1xUeph6z3-$GW%deoGgCS3wH(YI30M#_JxC|dr` z$?g@XVH^!7qX=8SKH7TCeeBPYiFS zG~*}OlGv@^opUO@8(9h<>$9ga$!br}i6;m*vkhrXv2>ufN5Z$`@Kj0=IJxm?VTuHS ze14Zs_+l05<9r7PdU8oG{zEMD$1L$-$o#Ieg?sfj^7LCu?^B`{hUt8MlwVOFO^R0c z+j!M);}3+X@}Yk!NYe}nvty(9ZASfyjpCzDQc@lZ3jRC@5u_!3$8R>R>#8sgF(Rul zcV$O(4rqr4tbSNi`7Y5GGiO9$E2<@Tki-Hh`(XKQfj4;S17t8A%U0mp@;VMvfNtmR zjVU~H_uU&Vi*0Fv@rJCvK^$!+beJ7yr zK`^Eo7`-iT>+I4ntlsCvR2i>G?mB0IF7c9Kx@1G~_2emuO6~KMVfQP3!w+zrR%+aW zyiXH!2|M|AQfuMk>>7Lt1jSTDG2Y_&#r&ckx-7)rYY<04?-6C5bj?Rj=98JKjI(3- zXr6s<1YL|SAaqxrQybB0{+lro^drXe-iFoAe2(9iDRVQQ4==E&>C)kYf% zkV)U33jXAf6+MHrVm~AMP12EO4{e;1OuLKD5D993@nMQEmCd%RM6KFP7Q#R}VZ&vu zFm$4PVG|!H^&tsTM`mETY@?*FCy9Ok&RS=!r2l2WZOd=JmJv?YwSevfLKzlqi(k%3 zJ^SXU1t#d}>+Om?HSS90oJ*GERfG*3d(s&6oCoH({Yr??oAHQMd+eC3rXnG;Y~kjE z1y3kCnajGT-y-T-f-C(RWAxAjlBt5s7Y;8?f25o*Vq1gAlskFMxbrWAEf^T2y@o%H z>2vt{pYj(em>8BB>LbQ>pp}r+A7jk9Zdb~%YfIKMafF!gd{@#p$fj>%>{l!e-@1u@ z{qXC@asgd?-VCL9fVB4^_q?l8Vk1jpa)BB&`ughcCF)N&+kj&9%v&!n2{9@o#;?sG z0~r0k0`$>lvCceDBTbgO0tfjS#? zQw==jx0F$~PI*JTSIN3s8Vyx|Yud2+6`RWhcAa?l$+;6XD#RKrma| zp}3U_b2;?r5ykk7Ha&=JwFv1EN#;LIG!)F?goQnvlDLmDwPU2IZv5)gB~tPNSKr*W z-@7@xYmH5*PjG)xZE%Qmy|4IMq*Qf%ZhiCG+!nK(>r=>?4Mzls5hD1Qi>`@oTW}S_ zA9$7!@Z%EYhwt917FXmqM1>Qx>5R{nXHfZRjmVhm(qhwg?0X2w;t;EE8o9`EtXEDM z&2z~d^umKdqQ?(aFLmp`+L)2Dk>gf3iM$;@>Wjp28fx5(=B!|vdz7wFxkTDzJ6s#s z3l9Cp2|15ic%U(S{1B*J{_-=)MvC5OUCtC{sDvmD$)wDBb2MtOl>r|5s-~THTNxvq8ZkLylpKz5+x+%F8lnm_Mri6@=0v0M+;Asoe{DlfE__DHSA?&>$lj zEcnzRhF)8V6ES>YlFloy$Yhp>C(ICU&ZIY$g2{C}6!Qppj*~?v=*}Wc-s0$40ioc9 zYJe3Pxm^Ow1I>)cH-l?w^wfz?ycPYo=gw%gM|N0NNlE;V|ZlhpNejzOszH|A4 zc_f{1K`%xXt1A%x-nED`PFCOF9De|sXgf*K)#laCvfG`g>;=&!(9e45-p#-ft&)WzQ36=b`p)o}sp}3QY7l6I^Oubm6W99qw0QiDJ2_ZB6^U<-dnWZ8#ASED||gM1dF z^|g&$)un&d#SBuw1KpE|8sr?;zriOn!7NWV?CobL^p-;uf7R_GZC=7roKKIPzt~Vl z|B7h$$1*Vn@}x)f8g9zB7!#`fL?N%Dl;zp@oyef?7b+G1ESVASukp`k!I6r(W_^jlr4Y}0ya(HEtWiKSrDd~1$ACz+HOZ1^2dn6s#Apy0$qq&kc@)J_K?^fZ|7xqpNvaDXS%H0tWcgG+c-bYlvmCI zyIBn#he_@Tu7s^3A=L1sT2N#meeNgL}OHl#P|^A_OP z@SZHBKzJwY#*tb(w3G`L<-HUO-*QFTvt&6xSw|%8S30jHSiebDSG=+j9_ial!Bmar zy{}n{!2E`@+awQlBVqUzNxdR@&8&=4!RU?RJt9h1y=WoFbW&*g{K#m)R=K>&Mla&I z*Ql-5P|>n8=2pyymm_?aLg^?s{XXi}SUfZ?KQS6z61KyT>b;Ui72O+z>3JsFUt9|L z-p@BTMri6Q-3mc>X|4iVj+0aC;_3%f|B%07iJ}*xX5CVRzIUWD<4l;O|sZ@^fs{9vc^sPe@Gp|RJ zXn_dR=lHbSCD1I5)a5XPT+M+jfqQKKZy)g|2^okVjz3>~d@A$w`v?~y;)XbfqER-@ zOW)yFL>r>~yv2Cu1M6j?UMYpv`UOuTexrysradsy{dO$=MX@<|8%E%zVCdnZ^y*nR z!Eb6U@(s#N+0`z2-5(4FC4UFY=)NGHFuF)TwT2RW5Bn+)Wl@K6W>i*@EmxKda|#n7 zFc6!jbY#jV&fo>>c$lAZ=fx`UCXG%hPB;}kDq3X1V;_hck{AXGMxKm$-9k8b3@lfN z#w6l95bx9)kgnoR&NhO6A@AJ3r_Q*sp%NJWt-6VEE63X`hy}H{dDgS)e3LaQgEmKf zZf^HA>EY`XbZ3M}t|J(yGnII#9bM&?p9=8?RqU(82*y!^aD(%(65~Nidvda#Lb;$V z&HKrFmiXHbRur5I;jiiAIqXdwP7V|mr8dhmH)~}=2yIQ76YdfSa;5GA@##N{?kS~> zBuiD`LnOK7GwRyqwaS!3$AVtXHO@6g(Glr+?xw#Pg*HYl5;+J)Qcf&Y>UG4a))oiZo@Lizk zz>g*UQXHR4p50k$y3(xtWU5DVjYYl+AGA09f{wN^@OfXjvFWJ4UaIw-`xSdxC34F@ z`?PwV?gV8qKEln_l(|5^pQJn1&&8_z=t`~H;zhf4Jou(%_D=rGkDNnx-?yf?aB?e} z2ac{@*i943-(-)uI?Qp)bBh*ViTy0$FR{1QI}z+Hdmp>~y1qInKY4zY*?G?@BH4+~$5xg}K90;X zY0g5~!?S~ih-7(qiYQ{`(y*Cp1e_4)$Dn##-(7csuI7oU;3Z;?+|N60X&j5hoZqvE z54NY~r-ZROXS#NHv$Q9dCV&4)d6hPmV}!0_76H-SYkA<(`Qc-Yw3OxknQ}Vf^qhE# zEe~1)9ZrH{gs`Z*beg*7QU1)c{DOo(FQFw`=lPqxG5`IEl54dZ3QJP8h2bbXLmEZX z_TeW%v#i6_GTH{fm_}*>w`Fcmxwx?Xl2CXFuU9Ut6WZjjAj=fxdqPp<5 z8Okb4YWuFf@_c!*a==9F&{aIy>384xB9AFLU^f6YXqFBM30oXVw8R@@aaM9OzNlFc4@ z@lx;7-aP-kut&$A5WZG~!kAAt82Cm|tetk~dVU0Nf0|?>W=4{$>)R-eN2h)qwda2?j*JN=@AV0=OR}R9DNGb&J|j^`-qid#CTf>}hA-zC z^Pr)S#f5vSIUzoee>RnPhWjN$BOGpw4I?gFPwT)g>&6C&?+~(^&l4c`9lV@gSIBX*vVXl%{yPsMG1 zLSwQVShMjLGU=N;(dZf?4zcoRmU?`{#ktIS0j9iv%yo|ZqsJ=fM4qq z{by}ri(B~DR9p-Ua&aaf2RooCnbj$>c7^o3LpNACM9~*DtG`FQ}SbS#TJeci#y;5t8BIF&-qPa(f=f?E9c{l5XDrl%ocX){} zV;@Amet4md#dp_)ElQfr5~_LMFR43W$z@$` z^FplFLK9&{wB`#Bj(MMm?V=j?Xu6R+Eq*2y`{D5krjJH8a}d?5kQ}R%7}Brw4e;!7 z#*R=-;#}6xl{57$79V@IPP0SrJuETQ27Ar#UL4@XPv%cORIS}`at0b$nh?_wM!gTiLT&u-(61;o7~;>HM|DUn-~~8oaFcfxq;W&@H8u9V)lKX0_qxhrzR~ zd83>Q<@~2dvI!1XUo={{B;IhceWe~)XO4D+R(-c*lgOskD&892I*MD`WJ%$dRx9FK+8VJ~}Ug5Ax*~ z9JVssIo~pDxm%85fjTt))3FTf_u~;}!C^8P-We`ofU1;Pet>O zH7#+p$aBG$TlmB-P>w}Z_LF{9{Vk(4(Y*ndjQ93WPWp-dc1gW4d=_*vN`7lYFVk_B zT#zi8_NliL2Q#hV(jRkADt&O$0e)NgNv7#52)7(IRs z$ErtbD5O+r2qpWC`_@`nS`lMVeO!=yH>LFV&ixvC=lM6`+tobEXPlm?+io@mB~usO z(TLLQq}}q(Cq5NIDY<$oA4_v*cWpK?eHdNPN;Z{Bwi1=biqmuV1C26C+Z|GeEz+}> z`p5NgUTyI=YSg4Dw6j+|n@6#Et1CS3=-7OB$nHVC|KZixJF|>s$Wp)0kwW|7l~&p3 zD29bCXsbqN-iq(4`T_e%OUPyKTch|~%eT4`OM}P@9xXv)10D?qj>WI^98i`fazit7 z1D_LZe$Ri2W&4%p9n;d6E9oB`Epdlo+YbE0*gfYq9`RVcv!;uER32q@^D7z)Lq&Zb z7>SYBJ^eq$VafcF;_rL8F63rt8n(C~77??!*a@{g!u6vzkz2njdl0{&;!tROE;5+g z&b0kYSA@*Tj-8!lQigfdlBR0Ay5o?Rqo*9!9&#O`wZyRtHqC=47xtL z71`gO`r30N)kB$IwVO3;9yaCG$1O&LY#eN6MY1hM%n`8FGnyT3aPhR8QHxwfUc4?Z z?1G0Hy-~j!KoLAoVqn2KUqPsqxas|v`WXekU%V$7#f*d*_hxj0{zPQ2T<&F@L_D`% z2uf>$3L^8{49mJ5ht2S^csI z-;ztER)J{>YmJzdYiv$l@XY=!^{40Dzq6=Yj+LAYe|Mt`-EZxoFWo;ybO$e}4AGWe3^ z%p+4LYK)R{e52|K8Typ0SVyADWy{OrOsHd@)rXnxjhha!x1RPAy0u)sE#PxP$G*BP zgVsSm_m;Ikp>Li|OiHi2jJS{ScQNQMP0Ex;DcX}VpIXF!v6$ZP+Y~73Jo6~0l^c@^ z*v*Yi4f+wklp2J*o7C$PFQAWIdoRR>QYzlK9y$Hqb?=9b-VVGzf^I01 zR2J%9J|AshHOXp}9j!cu)|a7;%7WH*ve;j4>l}KmmwO`Z19T{)5I&8UKhglM~y7a)AB# z=`-!Jth$Z^)0{7VvN8o-5BFpr|0Hbf&%_3KRk-7-j5L0v{YFnSR$^a4_Nbw}&O|Me zoy1GQC^J9HQN`yqM2pq-{8J^bQpgIQ7qzR2PR-y&=b4?PzDfAtQ&qFS9o+IJP=Ar$ z{m*LcXp|Q3n3*fjx4EX!C?-l~(>PU)xgSHD#^rSj(we>@ zW^L|xRaQo?X5Bkb$Ip9?A=tD6A<`R*gXU9Gz4W_&WbNIkasyK)8@9PKSgwsZYv7-L z-)yYQ(|)3DsQI01C_+1h(EUZwduSEcyG}%|*JM8`S{T{M?j>d1-NOZ1WJvv&;O33d zf)~#Mygumgq9tJbU7uLy$U(HPuY%*}f+P1cNY!%dBVv5TfAIlrpQaG?G;bP@ht00G zCvJ<5Z}B--wt0Wr8$qt%c?!(Kmp(5B;i?t#-lXy|Kc)R3C##NNUl|>Ht49h|GZBe@ z!!*V)#IBWQTl$EsRf@OvWJE;Gn9Xt3!<%;bVsdB1rCEnrr1WK02-WBp3IRU3#8=^i zB5pP4;q#`KdhHr)Z7oO`B@PJB_2NpckG*`Yv5YH%bZT`xm-p1u2fTa9+!_=}&^5MQ zivDyPx*Rfusiirp9bzkg&g+PUQkyEQr>=9ZukiXc?<`*s2tN81?~yk$bdFPeK#Ve% zPG;OY)$B>z*ZSq7<0syYPuPxwy9!4WjL_x=L|d zVdUV!&HhHI-T+%IsPtT$wvJ)*!F9AW-fBSEeoN!68SCs39J8x%*Zz3EXVBTxbTn^# zwh{H7`OKb}()A4UpKJ(I8ql5*&qbRSQg6@ArDL0RhcXmFj|!$BKatHvM17HyqaKE9 zKlBzO2Ofw;T3$PT4R{%36@k~my0!t|%F@Q$xDw3F<_I4k$BKqJZUwZYF8fhgYP%ks zv56+#`qk?@W&4RE_h{4JyiDrxUeddJPWFAaZ`S%$SI!@!sJ;;VFb=%`qv*7$wjo5X zzK~zzF}m_O;k>ns-W=Iz=6I8C5!q-(tOboGjyjei9~WO%`coyz@ZKd?hJ|^aV)VLD z?x$+f_Y%Uw!iSe3-jhlOafMSB1l@y&@aL_v2qIDU6rXMl(gvrD1d}8lW^C51oSg3r z8oN4@i6?H55w?;RyP*mRb$BJAR%#?p*J47UuJ}fky69epremg~4o}Uf%i(AG*&vT=Uxu z*fU!d-<@HZF)Ye+m@g|wDPF3sR}cM+UX>&WcSqiV8hK8}^~wO~F_!CV{NupM#2Xhfx!{IX zw^q}A$-4r5`k!&x@#v>UL!5X#G-6R7dB{iZiH0!(g)Y}cZdMpf3=nX)?#i*kWppH` zoN?T$OBa3Q8{=ANmI&jCwfT_KO_Zg`Cglur*3Y<{I)WUauln76d_xU|+qdVm8*7iK z|18|d*Kqy%?TE-}MnARfNHOa3c0Xl6@lp$En1ge@p$QvX7zHUU^CYEW!>&0{*UhFi&tvD7_CT7nTi!> z`VPao29-W(ScXN-joRBxnlj+Nc>Uudv_>=E=B6&gqP31P+{aWov48J9n%Vp{Gg+=# zf&W{MZ!fc)iBM^9RRhEMJbX{C%G^7S21zY5Q*7&XYN09iVdm{`&o#qc%95lq?6_6} z`NrOf7!spH&uMUf_Oj>bXaB64ESw*HC@9Mrrx-OsH}*09ir^-Hi3~Mw4^=e z5t2s~!IA9dkYcP!8ls1#cutx*lo9B8tB4<+4Qdo;A$E^3HiP3)&P;?;u2yP6sYEOC|-+XmJwicx+ zhE!g)kqt`>_mN<&VUP{%l*PR2_1S2IW@aQ~01a|{x+huU=8wrx+_*0il@8`CzQwtJe>wlQtnwr$(i zzE$6D)$UfER3(*v`H|$#eNHY}Hc`{W|Fj3?N^Q*vorG2>$=(ZI@jWu>h)^hKYF5gZ|LuC;XB{ZQ z*p~3ZEu>sY?Qp`_c^&w#gs`d0w5X~4avZSxd8V_Q}lpXj?s31HK4DU=W6&C_;kGCAT1ACf4}$25B#T zOBe_zo-kBPj^F{1ZEfIIi$<72R4c4O6Bz|bjY`vC*=q%=`SE9Bo1`-Tgs$tJi?0+m z-w)WsTM7JR2d_o2aOf8_zQTgbg7Iq*sG=7kCNI+&%7$$W2!;#dqDWv?x??d&5yb?P zYnXVD_zSE--V&!#8ZJ>Jh*Bi`psy6-hgtrl=}{PmeJkjrqY`3{$~iV=l8r#0=5QLBF!+4jLXqK%56 ziQo@WS0@lP!}~4TpQ}#VEVkFx;e&p5J*bn9HuCkU-*4DM#{5vjIM4>UeQx7F=LDpGbvf4O$9Cz8T%uq7pk`9df&c>LZFN>O$xmz~??SgKnvF#AjPY=rYyOjCRUEB^ z?nEoOuYK|vT6EB`NKZQt1{1~?Rl-3<5ZIII? ziOW)gAqbmasCecLXB`FbaDS~1pOi`_gqnNv0U-QlQ1t9?N2HPv)8e>YS*TCbFX5j; zO-hoLV*@LISPA#wNnfQN@V6xI)1{=QyM`|xDe}Z`( znJqVx6(?(u*A*>AfeaOxn3w=RcKD)uf5n0?gpmo4g63W|fLePQ?=iz^1vnytxV?M& zr*X~I{#TBdym^6d?0%b(w>QI;Ne4|jrC1OjRd5j8H;A8fpb`H{ISPnfU?2zOL}}$B z?LmA)j1C7bdn6X7O9vpLu|-0E5EXy&(*_519cOq#w0wI(+#3WM^7VZ%L#7ubrN?_O zHbi%*3c-w8j)^qh+Px?i9A3m1Uxgkkc;LlxiSY!S0)?mTyPeQ7JsSdj4Nn;MHd3Yy zc9m(Q$e}}c)zg&dsDSF0T56=rxmnp9u~suO?Blf5=+x2KfD2!KoCL4Mql%6U8P&Lh*bcDw;d9^nhrmg0Ie!S6F_EDg?2b zopZH+k}#(Q!L8t!^f$gyXvAhcu)SAMSIv2XlpHKX*`zrX4AEO3xGHW9qMUIR=CULM z{e9JFH%BsDmmovz_ywpdRai1eN@>M;h@6`pllCIN+2+B2p2c_A4=g|}gwHQ1A^agq z>vX{@tF$z=j03dUKYknLo2!pVh)RtPzG7LY@Ir6QTqJXhFl7-nPE8cN`STLV28qhL z6%n1-%s4PdZ$OtAQeuxS@l3!uTF~^1jPb*%_I0DBd4i=KUC%Jgqgdwqm{}G3qCSLw zqT=X)rph6?cBKD2631xw7QT4OzG|sYr~GA3WFde%^#QnpqjOF2m;0#iz?=OClSWc$ ztpIC&RX-T}?+Rx!#tEx_P0w3+o{EIl%cCiF$mcM{OY2?DrAA8L%KNPY?wjeNvW&lr zf6(jkGQ=GB1I-5K`Sfseyc^Dyl4M9XapSGfR(Zmu1Vmo66n%zEuoe{u)g zkNGBXxbd%+BaFZNTfT zd-9$6mHiO<=W1Sz zpc*}RIj8>ZMUF0WSjes{%9nmY9q!D}X8 zI_VT@wU@>k_C{Y+c84MhLZx8D3lnPjKHm)6jcWfcXk&afHWE^QZ0u!WJ;&ED4WvW# zTCAi~eJ-l`N_OZ{X@HP{R3eer~Pie5A z^jLkoA^uDIRksP7v6qJG=-!Vm2QVnF^TOSpfBkUkRKlV)g?MTo;qEYPzgHi^CR^mQ z=HN-6eEp20#C%A|?DFFoAZf5Hb@p>Nv|w60bh5N5CLu-ybFKI$SwKp4(osK9!~V!t zbWgLIXBnPUQ{?h_&iFajK9yS?_NUXT)oRAVNkQVEuc0|9)BLz4{y#O!ZZFxH>*GU)k3^KB!bcy~ z`c`WL{YzPC}4Db#(~K)9!~8id}a%~CX}Eo^dFsR`X2RO6@RXsQjPdw*0}Wmd%`Zn z7X^rI*cZ;-^??oexVAX0Al6rkff5oy+P&o(jh$GmHZAMfgXhhLnJLjf4{kd*+FVNF zK@H*4|0wVxLK|i}ErFYDhkz(+3az6mxQ4Uwt76GO_Ab0{)&&rQKq@AnH4l8mTN;dX zo*4Hbju)NW$Na3V1hId6dJk@B*o52B4;-hx*N|wZg-d_@C(FlayNzLG*J!IZRM83$E6PG3l7XzC|(cc z408jY7MC#?9I!-8lBX04jYgQciJtRZc42>_JQ zfnM+bN|Hd0HZy%n^Pc9HXF8}tp9U3l4^?)jqO+i(zWJQyY0n*wdmY<{?q81tBgeeR z3E>cSBZ;Xbe&gh)g7?L&ICSIh!+o1jKf12$G?Vjaat1iq985xd3$4PCMj4;yVwG_{ zL8}$P`T-C=mBeKufg07$7fC{-#~qoBr7^5k6av zd0fCuA+0e?I!>QzR+z9E=N7@~$`K9>1E@hCCs6H-9Vy%B^YvbfyOpaw_G~)I)TLQp z6EP-?O+28pX*i#>No}X*eJy#M+eF;uUf`^_1(be3kV7^-0Rp|!m;X%yf$^fYLSBLK zZr1E|zpr6h5+y>OTm1RKqDV)E-66?#x5;8hoW&uK$wYWp3Pa4imoOn5F~nhaImyFS z%JveJDFzy#7)~=nocIJ@mr*{hTRe=$enhGMCXmN#wPTna5?mx0CxxImqyO38u&y2q zXwcP2_aJkqu*hJx(2Zy(EDd1e>LzE$cXmVm9;}TT zW@H&Sm#`(@-dE%l@hZy8mlZeN!h@P23lG!fSP?&QCOA^2oyOEG;KwG7mGoo>(!mJl z#%v$|>ID@;%-hW;Q3TTdpc)))_zvxL(=E}gh6-EyGAN0uXuS!4QeH4 zSTdSYkZ^wLO!ebSr``VNDp)@F%?M#d>ChM-d>L+D5r#xh6U(j+4#k$*JA4u4FQ)JQ zkE)KmlOCR3R&_RP>(b-llEe5v{X;vzO&P9Adqpu=CX$&tM2}HoM8KQMn9EKL@7G|k z*G#L9yeA+roTbA4iY5*OQC|VB9J4z}vcn z*c$$;c^y$|kFuK~k%F?{Trc8z80-B(rA_7F?w5hXkhRwLEdLw5m9<;G;8I)D8K%e_ z5%~wBrHM0xg0uHX>@n%$nrx$Bp-%IF4JJ=~QGeUdpEF#iwi1;3Bx{h~5KGluESQ;+ zx+!(?C+|ztzhht{YEL>-fM0~zEZKj?R}o@!;-JA#k%&{oP_~y1h`M<_jqZFV6tPO< z$Uo2{xGqmM{5xE4%ZlUl@|ItYi=4E1NBJ?8@xRn)Z zPx#d@Rux|ov)=U%AO`Ns=vHt3EY!NLMzd=AUYdr=AE8IhTY$q-20C&`h$@QWp(vVXL)d6`YLeS$V!VWA8n}iLaWa~UhgD3s@Qi;nYFgi7s zvu;N^(k26A)8<_8K-N(4xd%kOzb{(yHD@D%msr$&DmD4?sN4XXUd+f$NO-}Utub-# z<;P;meF~G@5CZZ^Xch;=ej3t7la<9QEo)%p^JIt<4=*9ZN7oI1UblP?|Fr$#s1e!2 zqP;;wX~tGe)RQ`yb{W#Q@2=`9p{KkJ-Wr$6ox=fjB`)|KfKo*7bQFJAWqtvzBDF2E z-9FZy#p7LzOTb_3d{^rH_AnSFrNE8-t7TtY_x&b^9NJ(fPQ44g)#R2id%1^Pu&S;c zPGBtk&e~YQmd2CN59$N$hHW=RcNS-WnM7TuhdPl(SAKUD*=TT*nzq?zV zKX4L*?IciKow=<`xq1O^P@>!0`t7WdZT{6crCJ{^=c@GGPb^bh;u+n}1Okuu<=W7H z>hWVc%p0-Ac@EpJz6_)A_TJuP!2N_bC@o=qwCO!QJVJHu;5ybq4%+nLTXDS8Wvf^U zhD*^ND8;=nT(jj#4aaHp%)E0Yc{r)_k4B1Mz|Yuq3qCvA!d(5UKfFl%EGJenGmtrx z5n5HTZKZxGUT*O#qBW?P;#$09cE{0SuJ}m#c;hD|B76MKcWz@Eetd3@Rb>#Z{C_Xp z-dwFn7-cA-7O;c^c{qJ>3jfi8Kw7MC=65Z60A^63U{^Fh+O@U2^i|v~>A~0#DHqT+ zU-};RPKENA%ek^Ro?H{~hF|_-C`vCvg#Ixdy*}{vGs@H7-2LvHmlX=W5kdoRe&S6E z8>}D0vqUQn%{Xq5)25;6WA@cKq^uHCw4mq|qkLeW*;uEqNkWfq0!`zUL%#(C51X>%xhD%m{= zQ1>DpaO9z#yid0h7RC);n$=Dw9%?*Rp}R-mnG&M}IhqUJgk` z3Y@u|rJ$aas{Ajw>m83Gu4&DZ5RK{nw+Pw~hoR>3OrEZelX0$fslT+E6;Y2mfZ)iY zQhq;~rQ^@htyyYZ4I9eyiS=0u3$PsA0EDH1-fX==Yupz@^AuTGO8#J+w_5b{-ESG1 zyV)$^-!)y287td?zv8iV`L5TR!66=Xg2ynfSE+F&!gxml-R*cYFfO?+1#FR4hkrG> zY1p?3I1uVhC*l+yI9$@!K8zst0qS6Li$m8<<``mA9a1s#=;&P$ zSTE1zsH_Qkncq<(vf!T(t+Ajw&9B6U{vVXz%s3yUP~RMC*9lIEE>49904fuq&>sRG zq9zaL0q#gDNMY|&?86?&l_Ue+gFOH*YKsn=)f z^?2XH?9W39i9-#bRrKAFH&gp|#5k%>s3_hYv|g(2XV zEh!@r0?JVDjvz*WWH3Hco)f>xFmVK7&@&dQUCzNbZJQQlo43>nASKQb^ygWy?NMC% zDBvvUE=Gr#%8pw+(&OK%YA9oee335XpB1jzSv+V`wX*}PhdeAzDaW4+)$jy1#>j}c zw4SSOdZi?oEpEw6xPE0r(^BoasxyJ|RadxVWP5!yV~c^Js<$BzLYR(9*_jK6m?|Qq zy^^9aVP{GlVVYhwz!guT+17$-yb1c-eJ-;i#{6(opZj-)^$layUVkb}SW7Z9Q9XR8 z_e?!?_1d@ohxz4{9juMhE8$(2(2%Cn1`^ogPT z74i$3=yM!z$%e4u;S&<+{J5SVSF5tPV2koNr}mvR^WkecAjHmN9AfxRKko%$&|)Kc zy|YyHg37ILvc{sju=aSv&gUzEDw74kBZdHu(7G>8w+%Hz?-5uZizj}@ea2uEA)jl_xSG{uE_cNp?FmE9inY&0Ro@_9Yd()g?p*92a z(8=04ITQgHte`vF{O_Q6Vn?XH0fU(p5hpWLZwV4%Ua^CVX z3)WNnJ2uqm%jS)ZibG1sEiC!Q5~AEIq~$k=F#4`#t%-}r_5M|FNS@5lq{>Fr1%~&j z{A0a<$9n%+o}|mqU8%x~IeHaHkC4S@BSd|?aYlq{fFe(dFHeemp}-!>5^7E(L1cWg zscTVMLq$ZExTWIv0-V*$5Ot>>x~isdoSi#EWqXm+XeYR_I(B^)8S|{C7qbAXsNVzm z$f75+Uh#@3&y}uX$B@I0KT-%HaD-`xQfL{xcAlYUnJ zFUWF&6?FaPdb;8M7(X(Hn%fvK!spvINlCgz)Vz+{r!2}GhucM?r0@>VMq_y&A&6`q zG%R&VJ1_WUV$B&mW4D-fkA*Nqc)jgt0fQE8K=f@#%MJ2AzpWqcO`1FBE`D64ltc3H zxHJU^H!mYIch~H?^u#^JPE(Z9%B5fBTwO`wzL@f&O=(aBQQdwx=`xhFyy@zFXyx+w z20@+W#+Uo1gvdnc!Oh65F=irZYid}#tz%Ow)!tI1-!E$Xwqsw@76i1pQgnlf;7lM3 z@S^n>?9oihUGs;TWx4sFA>ygzX4(!CTl>K(x*QlSt{xLyE_rOEd{ZKVT@rfyW3F@qzG#D4qF*t~({eI` zXccm+66=bNb9OdRHr?bJcsxM#Vd!+)Q1c-~ zcKVQ9vb?z(e+=TBRtV}p(dA@A#dntB&khskXP!B|c>5&g1RVI`UF*_AI1(@eYCG4| zsMiD_2$%AC!$kRnU#N}+iNY+N0S>{y=RK;)JU=W>n!zhD>;#UlMTjjQpjX81P0Eh0jbNlqSsH~%^mR*X3BUoPip?-RnSd++)I{*OwSk?pE4A-k-7 z53S=joIMq(hjnnaYXAo4ES$Z*-yya1-){E(k^!elF~DcBORumh(#F3{VjX`YrHBzz z=5Ke*$JTlwqawXdZpig#nNd%>_;)NqqZE<~#v!$2KK6@nQdj>*;Oel6pbrId|u0O46LzvSXTyfM)et^-d)%?jG}d>4smcfk?l5`qa=x^6k~u zur7PEb5PXL$r_iME!=hHA3x!&E3d>~S6=8`NgWux(qVhInpM-+a=b^cNs}3;r*6(@_#xq_!Or!y^%4%Oem>3j)K8 z)r~cT!Buo3FN&B0w2D|9JZckG^h!BDH3uf#lp3YjgoMD7Ela}TAmsp&B-GY@kmM<- zrvMGxM=AIy9k&^I#Y!vN40X zfz9XX=|mR#(RLT^rL+``B!yiCH=LjvUwjmX^B{GG*Y0zsAY zmONiFVE3e>F*K6SvG$L0mUc~4l|v_0FY0q*PM1z~OHt9z+hj_<)%&D_=R5B$_XlP< za!tOp1Q6jd51-fl@@`&UhA?0*ovyEpV78W~z*s*_hc=hN(2+1J)O2mpnEy{O0WhPF~V@SbNaZFHDyKcgefo&o>{~x(b zo_v%V1;(5V9I5S^7#W?JY(kO>-P<->c=EGv_xT%e{rIl8eb_R^Hm!Z-oa4>+?3)wz znNElT7f8b1bG=P^0>%z$J|iSXF1!_@-l4=ZthWje)81ZJ)hkX1Pz8!2<-dfOfPF|) zup;g&_9*2`Y}iTeg@aSzZhln4Q>uobO%`z)$P` zRabmML$w`(gEBFbb2~VS7kE=fGcxoAYa7Z1Hfq!o*AXcPmc7p{be|TU>IpppJGmE& z1o9y-f^tG^a9>6QyeYdqg?wAoqwdt=aFj49U5_v~1nf``Kamu63 zq~8Zkooa!Gli$_F-Ip0@nI48y+y!*gZd~k06+PgN#||J#!X2THvxYu{%WlNJn6Dg?cJM=t12;55T%`z;xjq(1r1H@xfTY4S9Nq{KtgtF?%fiLqIY> z{UA!=9V*HH;13`<3TL8V4n_NGYv8lT%wH2=IC&;#w$>Rbk77<9{9}hveGthjYb!apJ0CG>aQJZ1#YsD~U#S7TCI;BEgp9e%b`^`J z4qANDywqg;`J>Hhd_e7?&!81;s4gFD_?!?OL}@rK1ruSi?W4H^Qjw?cS&;wl_(mg1 zb@#kIo$hmf4KFkKwD&=BXf+V@?NXHbv~z@)f#%;NA!xwjuO!93F^A_7Me=WgoHpCZ z0!^6#?5RuYKr?3qmXL$f4Cbx)EN{X-2A@C@l)<29N#MkTrIk=>B!l}%z-r_I!AMzW zTE`XwND2KzCk)_^EPnGzW85$XC~&vHzk+_^?8Fe~!pN;Z^{9Z<$cC1JfQt~~6mvpa zvSs`Ei$T~^gwOi<8QK)v(fg~JYm?1nEe4VR&i`eFbwd<$gl;Rx33=3mZLNUvz^bI1 z3?q_2YNa#ALT1~rD8tX0s6@Ln6e8;sL0-^^T}}AafVkmu-pG{^&GfOxD=+zL%Y;}d zBJY7c{&MP3Af|xO6LkQ!s&5o@=A-}g4ma3)F!80~gwRmw5X(6khz&xG@l;IC`J1chx1TO9 zCyw(9;)2*~KZ3=<77i|_W-&E|A=d>^vI-l(;e{taynbXv^#4S_YxjvX1;jiirWTKy zYD$UUo=6Sp{YhlLKV`T$NsSK+GJTl+nG*zPh$NX7$x75;)fmhG$(hG^7?*7D-_TK$ zyEnZAG!RK)Q&Lo-EKezQmU3~Ahw5ffyJWn*K-x9vRDBU7l?JUeqAz9=f5?If4R6JlOH@TT3ewqkp7JO4w0@ zRiK4PB#*^EQ=h6|xEQ5ALkNn=502b0P5=zTUg#mb-iShSl$otRheJ6ov01iq`ZxYX z5A;m~bw$*4c-}8+{SIQ&HX-Y2d1*%zt#y?hPf^U}t-tgtEbrFj3P%XeO+()BQ0h2bPl(-J+*?*{VqNsa)I(kC z#>|J8aiUBX8z{%F<&^&hsmS{@>JNL3U5VlR{=FhOXpQ{xF8 ztv0cF0_%bccKct*_;Y6DjL8ldPrG|7r$4dxrkMq9MwsHBs?r*n*aa6G8BKE;e@;4R zuUP3E4>J}sBa*iCmdsknH*I8Pw(Lx+eTx*0Wsg9Ek7M)FjCgY<;Xsk}ic1g_k?#q| z4)nl_7|77)4jRo8*RKX+_KqQKX=|-0(P*XT0XPOZqJ0@*}3W`_0by zLRbEJxW=Fj0v&ZdSWUg<{npXFyJ!hHgap6fNGD>0hq)zDibKOAYso{=tswX{FtE%^ z>tO;SAn;F4%TEJO3o7^y7s*03Bl$Y;e)F z370g(9@+iTI?Rg?VIb0LhcqW{%|Dj&B3Cqe_wIyH90b09!r#%S~{qj6sK^2++cnFXQLA=-CD3w z$8&h~9KYKM%aX+bCN2_N1~YOx3|txyBP^F1fE&yu1C(`^y*Fy6%4vVw<3@#HqZxn1 z;p|9}8%`8h_L{=QW8ITO1(pc@D}g-k(ejl}eza+A(42#}#Xvw^#3I)ELGsp9Li5^S*v&eO^`0 zZ8e!#sB`G3mTPACZ7EkJ%e5D|*^Sm^$D1{!41(#|%jhLQ-4AEo@tov?Ngk)UEAJBJ zs2mQoS6U!H=h1=bOu=#K19ltbBdxpvwkLeo8R8;(e7*TP*we8RgwxHAj0WE{gT;Tp z_Z|Zhc5O+|81%cA$JGUpnG$qtHpyuj#Fn}l^RjRf%mH=^77{OadLLlAFU@iV+^g`v zv+*z$DUb|?JvC$|^X7S&o8q>>p9O7_u^)Cf6;@Mrgy6_H=|GGPm?-S?5n2+2j|LMG zl4x1_(Y(G6eb@OBlp$B==FzmtN8~46((_bP3;O zhstVzR#=0iw*8*v!K2}(h2=~ugNr~J{4!Hlptt3?Jpd^$E<#s8SA=7~F4_%R+p#P>3jhY^C)47o#fpGLC>q@6GKNPlBF_x=Z}+-l=1|J^~C zj^^82CUJ#7oQMA4o8#J5!L-#ZRa4!3<+ph?M3l8RRS2(Wn!9GMcURUGoGNhs9*4Z$ zY1e&DQs2YeZ8S+X8vn5WHMJyiAy7QT+Ah>jYaA15E@9gN9Gj}Y!NsD?AG&SlT>_p1 zLw5pK;sV5Sa;d*HdV&)_b=p>Rh*fh32NqnZrm`eL$L-JFL+S+ve{Kjqja27V@wFyh zdss|-}|12EkTDPVineJmCrO>C_vL) z`s!^7){Rcdvg2d@)aicMan5WhOl;`QCP)*uC8ZRrJ(=`+CaC%+@IE^L<^JVqK%J5k zVZB}j3_d?BGjP=RU@;t6*gNoPQD0w1^JAdRGc3(H^3W&R7Kj$A)7nUX_n+%UAzj3@ zg%-(<^}77TbvO#^ZTLhEJMZRynr@XppwzPn&N_{l2(3{GP^c$AVK#H{&uuufWh{>i*N!y zMjq!&^2wbdQoD6`&m$=KJp~?9d|~CKgf~VyZ%j4f6-0A&uQDp&kiFWY&Znc-PXBI+ zW+}wt`(_vu7|s@`c6Ya33rp)YtGKnV6-1f+ZI@|YhgS63);F8>W2$1O*(Wl(AD5DZ-|MVv zjrg8#sUY^NMT7;39vu{}Md>|rGwM%(J$<*|Gl8~?%8iNMCYxt>i&nL>-=aHm94q{) zF|1@kfFqHMI-`x$6gV4*6!`W%YK@E2smT`8(QWcvTj86zu=8HxRuoBNoMN!L+q%7dj(VPnWxNIyu)R0wHv+7r5yT2Nq9YLlB+RM`k6Nlk`I ze3y_8mvGhlv-$gPV<8B0dYh5-tp;;7k;T9@8qOcM^#GIR?9v8qnksR zh4A%V1bdYGgsfKt`}ad)s{|qQLc-7i+dG))&)M>>e~Hhu@YgQ?k_VT8EHfKfSF3GB z0;kiKuH?3`KF#{`f6q;jxC)x(x20%*2!3E+Iv2djRECu5C(b=ht1a(yO;rdah!b4K zN6;XZ*Q`919Zhk?#$;LyA&pk@;?Wl#=-_k!G{bdQK0^Yd5J5kx8NM+6sBljVml#V! z<1SD#KB4EW0zs*n^*ujW?edY6V*_R^j7Hk5+{dW<&lyueNrVNaQ zK^+(E+`^U`wNI~P0oU=o;j{RPmd*(n0q9jT;|*SU1^Rn~n-10ot3{jRP;3S`6~>_a zScq0hp-glx<%_8TpZ2-yZmNAf4#oM5XQRRXY8ksH_GtGE4Q34Bjv;FK#P>!?l)hyB zg2;Dn)OS`!;_jK%9=pHUAco*817#uzkf}mZL2tQ6kEl zX@~dKwqnSjTI2PM*SsUalof}fb}E+!YE zzGH58e1+&K#5mGu)$kZ|H;q{mQN(XM0p7aBXYFb#GhsmM7-X{KKpB#kqVHdy?)6&kn|ef-5?lRU-meS$U1nI>)XLQ5RZD&IMaPd3(~NonZDN*gT4 zv1%xMY-rNJ{g0O&mHyT3*S#&->UZS7n|YZ*lE|Hz)qeFi zSf}fAUmh)fN)}+Q%V(@r^F_<0xmw%?OMK?u>XSnzA*0VZH*>ylqjwLD z!xy~iZ-IJr4-xT4r?&gn)R)gG>qjz4*$a3+^tHYF_JKS)buPq6=c7UG8U)nax;bjY(8(BmFlPT=OZ0mb>+%=u03Ro{5qG7S4km2 zqt(4$q1rCS=XjrqRcdx~{SK#U3==u}nT`?E+mvF3Tyy#=K5nEjB`++Vr)hOU_sOg(5LS}N3cmIgwNW^{!R7qyss~SOR z>(;NxHt^};Vj7@aEw7_-)~3n0IcanyR?W)RZL*Gja2h&0cEpQg-D^fq0_u=2&mx$8!zC}#M=J*T{BNnx+ zcKhliD$mqAziamoPC*+;pm^GymPwf!aiZ5 zS)n`?%X69I5p=S|W@nqmahV~oRuCa7r~A=799G#rrOM8?zeJ_snmllhc)A)>7XJsH z7kQyJ_YbFX)WxHfwhFIH7wXsZU(P-IKZvHo>1(dpcUCyIwk7FWyt+%A4ddcVS`aoj z$aYTpOPemV;yy9NfnM}9+a>azgmu4uWzM-Fu+7~_#MLwUPxz`LcTchb)il~m-i&hV zX@3{}X00;mC+*c@)ir$*<&P5~<mj!2=QI-FsQW-#4=sTJG0uz1EsIO&sE9X>L0}zcH~mZm8zHkvD!5 zfM~;;K*_}QLB}!zWAW_*EPAG$xCz7r4Z3i_xTY6z+WNnAM4EV*Xu`B=9CDUzx_Dyj z)xOj_@IDXUNK|#sw$OM!M=3f>vB_7(Lb;<3!EMM0Uh-6T$eadzP}XtBJ< zC75K+F#}Ud*&ASo)FNnOcj{2|$Z=g`ZK0uB@GBVI75uB*aYy?erLO^-ZE)_If7rx> z)qO5dyIIaCEFR-Lb739#p3I!rUtTsFn}wK9D>2IGyPF$O&O6GAkv!9~yOrg1C>Y6& z@5~0l%|_XQs!K0Ib+>(nsq zPp!+A^z~}aC0ubWj!TbaE$fEG@J*pzM{$rTL6cM>{gFO^CxIilTi5Gv({L*}YQS~u zjPjEq{*2jC%~0$IafjbA^B#n)iHVu=z62?yG8qbR3V*)$hgH4kFi6^J91vwsZ|0$hnSX=XFDV-Rh(+Wy1D8{^=%@V@x$3Hk{ z1$;xFC=eq|V}kNxgW&q&!VDcqT$N59v-s$w{n!O!^5vk3{oqyHL8aePEK=rMsAZnO z8%i3Wl;K}v(Cj(67$uoy83IYnT`4fOhPAq%9Nyrl<}QnA?5SI&W-;3PU zt9F76&0+N$C6f@0*Y(o3k7K602K&-8zBU^m)jF3mbG&P=G1tES__S-vh1Z}jrC-Ia zdW(5}giG-20=>fduQSSYJ$Q=3;7Ky}F?4G4@4giC?U7>MCgSds(&)B=J13GR7sTq} zI;pZ#(dC?q6>D{~B6H7}tu2rJ{d0Imi9zBNW-`4oD|yw?M1s181)3xJ`Zb&INwG%Y z#@TmAAn#?-0z_8ozQ=_f+F9iCYkI1rTaJBF9(Ep;-f*;)$0$2T#lO4AH&0n@?wtdF zDKw3-Ca^B(&G}_&2v$q&SfftBdo#DB0)*N(%><+@LLM(TQNQnJr^6g2yJW{v?Nrk} zGgC`tcx8(8`lr!cq(IYfqAS_;7N#RmK=}pkF!%Kx81i!b2Rvrlo)pmzE9o|z08NnL z;R@#&d-l9UuKg^@*KU;~xa3vhyN+zeg~GIDf7iXMZwWtPwivbd6Fs>C`4*zPj?aPX zh~_->cDbmERzEbW)RdfZx4i$f&2qXzP?JA;CoJ?js2ay>d$ql~NW+wrakd%=FxV5u z&2P`BZgWFE4swD3#ZwW%Beu1Nzqa?;Z2{ zzESSZnIM7U%3n4f%_495T)|!DI;v|=yC#?VDnXeA#Ffww)7|r)M!v?HUz%wFy?oWI zvz^m;VF_$>{E-u;#_8}?CW>?kLsg55K6*LX)w5KTg)hFJBkgVEje0ik74Aaqiu%xu_;i7ejL#+K1G-Tr#MV4aKkqQ4Hi$#)w-?lQS36(0P7(Z!? z@~@|I7uMf_?(OUMukH75-)^3JzUli+=WBuI4d-d+tIlIw{N>O8F_!JONlsYV!Kr4p z|1*}qB>sNPP*$}&rJydkA7+AutI5%XTqxec^}cw-OPk^iW%%a>C$fm64Q(LB!jitD zvA?{uV49oZ0JPFu(G4pJoMHUS#`EN<&y4l%)?OI*UG%o0NEUa55rUx6Z_aHizl7uL z$>8qxiR`oXV?^$7h$y9nMOK>NRP5Xoy3H0+Cf3Op&~$@ZrQVHXP%pc{)1v+ z;lnWnhI{%3_zf!w&5y|louk2hUI#!8E=L_finPZG0YjVy!>f5|mJ@10dpHOa*Jc4; zu6P)9gV5=O;QaLP_ZFTg@LD}!ST+8T42Gcp)7=pwI+~h@Cf|4R$Avd{@WUnUG4+4O zp4j=WfLz3&+ z0}w(xfY$>MGuV)xA!v(YrDwmwDO`zJLvoS+G(zD02+k#nRv#|!$Ls3tjiU@OM_Q>E zNkU;xr^OJ@jf3gc;f^tQ5sGI5lqW-!Ct+P~_^j?<|7Q%DV7MZHg!_D+$-Osudy37` zwK)5Zv3jJm84LEGQ_Bx(FLcI-%$1_^;z}@tE$7z# zYjq~SkSKNN1`^^N)AWBY+5cI+z;6>_mgzgR`kavCdsH?lpiAhswWrtj@nV%3_t7Gv zU1@FS3}H77vfZRpSjP&}4v`m~(dO41)aT;Q&vJv^)M3$YMu z9-xsuNq{Xl#VbgwX*k>r@$gzPf*Ft^O(n z7cTxy0pbTOX9d^QPwa4GhR|3CaY$x4%EvtgL@hM;qixA;gFtnPWB6;rXG+Y^M1vPs z0N2KJS&K4aK5}E8d={vqMZvOm#;RM!ba*Plmn#?wsIr{smNHW7y|3IETu2#PNa3lV z2i^Nk1~!ulL^oyGTPsUdOK3Xqr36$8EetM{^W6>4E)+o>hX!{gSg4eS7ElHZz6Mtv zg)BS+Q@rKgz#h@yJ-r(J(DDW;@+Y^8UzOGH-y^X3xA)aFu>3FEb6752pq$=1&^zeu z;oh5{@4r%l<(&k`3XaL*ZD`u>lc(X^+W?ydOW*?TE$?HfAG?iH;%OqH3>ta_{%e$% z_$DSfSGz9y|62_Io!R^ULA6N(D{X41nw0(rqK-rjr!siILqtfBw187%v&LDS*aLry zkRsb6T}(}NCF1`F)y6>qT$|}_;UlN_q5kRpu-fP;;UVE4R@-bTN4I9$v-W=0FH#To zRW=Q;`v)yT2dvQK zVp5Koi%CjLBNMSCB%}^P3lyIY;}}NDPUvhZf$4HPf7_P(jB(7EN5sE7@As#&YcNo% z4H#!ajF6D{MEkRya39tVdZo-fTwK~F6 zpWwMV7!v~+=xXMW+9?hH>k8Jd5^zIeB#SNH2uAm`nGwB$e37}6799;55@?Qv{xWM~ ziQIRVFz-yuGXaH4fys>TzXoqXI&KUraSQSQS1dEUin;lgJ#ougSd5x3-BfiTFhOR`I| zL>4Lt!Lhb}Qwn4kIeMGBAr7+)g+RvEn^b~X<=hDS;j!gFkPug}d>*L%E{n$eZd#h4 zYJvL4p?`#Ou^AuJxp5>Ys#7mb#*^uL&I5&BQ|hgl7)33N!S--*phbH+JE=lxx0YJl z@7e%encri@*%2kvi2RQWbJDhh4_!B3?!L(1n7*mER`OTrQoG7tDUH7y3`rD6wh-h+ zk}&2G43Kq~qL++FtGM%+(_4z;c8t;%NM74K)1+`y zb0?x%H&!Vcc-4Jvy5Q=y>dx1V^~;}8{(OJxrJ=j$VFYNSii0@P2HJ)5@s`eV-rG0z zDk4N@5!a~mE3{f55+T|a)pD0K^_3f zO<%=-u1`uxPfOFmeD;h6k~Y75B|dRZ_dGszMW7KvEkq*5Vx1*fu+>0ZWFJW1JZGV> z<{fo_(nJcy{Sm!)$|2A9jO?%~hM~N9SPKz?K8AztwnKVSKDwXczlxS2eq0;prdHyF zS)c}K9!+|N4w`W-+&lyM^_x38MS6hMQE3oArB1u;L@$bCB;qD*yUmz2yG&3VS;Y*7 zB&um`+4_0}lta&rwWT;R++_C_HuuXSlc{Rn4g#=<66|6QTI^W9oTVwp)3{Yjb|+!= z0@6I|pxctqlw|voO#^SI)$)Kkb&bb8e}$I9nh`zS<4cj(1H-%@El?-3AR}ONKgxMy zGX{1zJ5R=MjWL{UiStThZwqOh`7Zj~Ei*2rNy$IDU_I<3o6^Tq!@(=gXq8yY$+Xnb zRWX+*qvJSQw%k4~vWQa~PAXy~;W3@8X%FPDtpdc`t5~7?Kl;4f7P$Qnkd1*p zF7^}UzS;t=lCXN;OGEfUxP5RWKl{c(MRG*(9s5zCrxrae4w)&}jM2!AkPsZ0a z(;<+uGJbYL*N2VlOiAfTg8aEP?zQ0nmp7t#W@lmn{An`^EV6XayHLxojvyD)Yj#Na z9!pXe``-Wi#HrpSI2V!)ztp@?%z_Z_03)2cb6&v zQ4A@xP@9O17+m_{;cuczMW?o|j^uG}8$HtV*C546dX5&WB6i|fzqjNdd!o3qefDyg zhb0uUBeY2d;*Mih#qUvKxC&IpS~bDY)A8zx*F7MAXMPh=3Id!C8gpNjbLwFS$euDP zP+DZL5cN~y&%@Kj7&Ln9*VJfDH>sYEe1BbNzBXxeNausT)@5w!+{Qzq)bp%)N0;*K zk56;!J2t{q(xNFitas!d*Y-d%yha*`ocG@ZPh@fG>7(FS6W(6R3X}`@S~Z$W`;RG~ILY+ptN~0+HJ?%^Ut_BX4SCi&xBGsjI2J@6Uv4eaw&}cbAkw+V#A(h|wfPC8 zsZp_}&X|@Rb}>FL0awWz*Ha8)2kYL6(jKCD$X58cpOdFil>LEr^`=*Zy>a!u|99u; zo;g}-`H_sCrg(#*^2G9XDrx@N7@UF?E_tzF*WA^9+6RCnmGxcyYthALAW@zLxtRW_ zrnE;XWGo&`PfU^QXum79 zcI{|b!1`DJ?i=It>wOI3>MbXhvBgq+o08Vnt0Z#nDB>T;al~mx^bmFc+YgPM#i|D9 zum)G%odsAO7iRjhtawond@*ZbI_MZnuu(a3Dp3YF-WG5(VgyIphH$-Z`!BwouFpWf za!nX^@BUQihIbfejOQrnF~1M$Rmd+=vQ-T|%;c=V>rOlGA{$+#VfL^3YYOdYf~!L8 z6I-12J{!BntmzFGT*VE@vXrEoVfmtWefejRO93aJsj&&4mb(Fkv2T&8BiQfGs9{A2 z_u5-9>ob#_*_p4yAer4a`CpCd!|!licw`WqFnlyTCirjI5%%`kOm`j|>~jZd$V;_7 z)O9)UNm2*rLX)~3u6Ya1?wJ09!r~h<=EzNspO&WI?3YP)N-CqDpTY`!jEJMVs^Ehd z1OT47qi(=xM~T)$-G{?9$l%!3E=g7k;zDq!IGHr&{e?jKPC2qxhw|%9<1$3ne4u}x zyLJ$>Pb1}DgB&<%ELAmlDSJO68VA=vhHQxW!Dj#`4@}6vxxsxP#eFmS(9rU8Gp>H=^>UM6Q<7gxk9974uzCq3|@y(`gt z-`GwY=7@1vygZ6u#B#p^dB{2p;R_oa{{}N53|aL<7-bYxndSz~|8{DxX5vAJ@XW#A zPRHGb8|M7f-69wFyq$;_d6R6jf(ig}x4`O9>XW0VafhztQk72*MkGQB^kY`=o|)B|{6MRN_GOgIaw6uQB3*geY!s`r?Ww z9jbB3$P(R*?`7#;BOL;4mPmZ-(&d8DPFT|2>qY~(WA}~pE4!N+qB2&~t$TSI4!&!k z15ZZ;9bDt1q8U(ZU3*0Y{rGy0PXTi;&>>yZz6Vms<=GeW^oimg-W(&ZO9ne9a;_I+ zL@``X8!KY+B~WUFowZKWeQ56$>fNOx)dhPoI+(+c$*u=^5Ybbve)&9E-P+9$0cd*% zzill80HPyUw>jpOUPFJ>=C~^KTER%3sO(}V7@vr<*BbzK4&TmO0Y&-w)c)K&>6 z$R2jy?UgLmEdcbjWuF5s>=`dFXJVqpo<|wxVBKgJHdm&4WDRdE-8G+ySNh0g$OBpQ z%3f1@@j2`YsP*vKVEg;wdzWcBHAJV3lS)TO&W*T##liaX&8EI^@T5$kyP~ee`mG6f zw}pN@q#}jDVIqRJWvO<(h4U$QMwG0^F!^-my#bDqAfOqa#qqgRmHphqfY;Sw;M5!&~nn^8AO@dQI)93f8fZqb$n!|89!Ub7~xF#b}vFV5N47L%%|;I?L=XV zqk{UR!&mO&rRAMEmV4?5Y?V;3G>IwMhvPZu>{nz9SC?)LC!fGa>&n4`tHwdTbvF+v zmmaJc-~>IVI8&$8q7>gUm(JlwMJ98I&fRqnR@UJbQKE=%H8+7VTv!C+(x5S{4d zDdVT)d{(3wbsF6i$g)5TGu-fGnC*zf$ztbl1RN`|A2$il_wLiyl$9=>VZ*#ZtFC%q z`4;8S2sWzvD3$2swRFTzBmr8af%{dvkGAeaWs?KgS>P(;as4af<4ztig@@xLs}NXS zxbweP+wkx(IA#Lt-nj4-An8(dZs5uWiN1FaKdv!;1iP$v9x$%dy9Mx_ zak@3=3d-SwEEaz#Ty0zveSKJx)n&x309ny4kRIFUu0^vOHZkyc zOlA8W&+~=`dRKn&?j;7JM!fw#&l!rb2XB-AHLM5io2olJ0gXsySvfQH z2Ur`sfLadLE#ov^eb=MLZqA=9@xh1&v4Q@`=9xLNo8`~1>t=bUq^=O=cGC7GR9Weg z5WLWzYaJ+c%U(IW8`-Sv+W)2QbU4dKESH2LNaE@~WBB|CTwIl-Cv4A~;3}U2hO&WkUNEdnH`?JH^I;P{vdbQ^y6#`@ZP6J< zYXOao)iCeU*<>|N`tJA<_{m*}n9U0Mt&D#BmVKME#sx|>Cgyeg>q|T5ux3;aDiruN zG{xO%Fk@idNc82QH z0_wU4vHxgV`S~TZ-&pZnlN%E4-b z;NQE!TC%17#u56R9y^4$cqJ-pQ{c`PRm5uxd4wvF+p?849hs6yl1R=jTf~WkE93Fng*~CITA(cDe!St77R5fV%Ne1mh|9hb`%0iq6 zjvJlK$IM-5_~4{Mernz18KK%Y7HQ}edl@h1%{+vPwT;BsrZUIu+hQLyq0U$ys-uK9 zsufKua&Q;`3vTbHL21>wND8^P7L{G2z1uQTO>@htQ2svi?uQDAggVJ-sfxOUR=<Eok#3)WPi`w z4Y_&!dGQESaPJXo<^_9lr8rI&pDrPdy`TfGp;75DmWJB=El#FbjBspUNO^-Kj24a5 zQ++gm_I1IaDv(T7+24s0I8@sUM8lQKd28qs;+;RT0dJ-U-f^oNOq2!KfA+zS1~ynp znBP4JNla}_kU26u+6^k0F2rdWe5dW|zHE<8a6edP6{^eqPXn_YsN?Bn_$)BX#mshN ztgW9dOgd9II4#P;8HAyXEytL?0IjZ6*F#Im1exZA@U%3EfPdQeq7W;# zY8^z=K3^n7j0B=uJn4wV1#PK}YG;DyihwlB^c<98(xrbY_bxxu@gkt_#3#RMhx)C0 z3W0ojMK&q+iKXZ>+>MO|S%*V&Tn6;m>bc;3!D-ar3j;$vf%}I4Zi5^@(AgyN+jV^u z0ju-lQ#SeMWPeq*6*F8U5L@dM%{dK|nDmbL!G`X>1Vv8+8{y`8d0<3o@o;@)2C)a@ymD!i9BV!aWTZ;^R=lVEP z8+a{G$=h=N%OAH^pSIi1M%Otf_?+C6H=A1DnJHqNp>j-_D zwQHwWwW!=QGh&^16dn;wc_)fXGsK z+R-dNCO_KxufZ&^S=o7yZYq4F79sq$Q#VrA+a<7Jt!h;VmX_0JgnJD8s%=&VqZfO< z_E%9ef?wAu$b*e6X$lXjcBfy>{mpJ%4Dx!=`iH0URRys{OQ-r#c2o{ENbAs5M<{Ln zr{)>e)~emT+@JROm54bVzlP7w0OQNtp~LL$&GuZ2dBjbkGw*?<9-9=`15jPJm%9V| zge_>65QNW$Pu&=9cRPfAoCe(zH76tSe4=Wr8^!5MRXlcuS2CD56rQAs3z+3Mn24IB z4>Cp9)C4`|uNoh)?bLo<9o`muVHfM`beRtxh_Q*9>q!skzN}qsqa3h@0BZm6BhrlL zMwu!u*J-cgAmouK)8pu%k(vj+qAr|8!YaRJ9fHSF9Mv9yfqLD2{FI{(u|TPOMQd)! z;^#olZpC!8?jkg+4h-`@*nVqvb`n7XJwA73N&=Q{-XUVv3lrZ1U$9zL;(z~3X1NkK zpRa$&tZeekij0Z(&;BF19zEj1lsYjKJIaoYwO%|b4h3CCSsKL(og{*Unz&xPTrp8b zO-APMyE|y^&TsqL>#Jw``klHP>lgq6<`?{2rlHm>wInaIdS9`(MK$|)Ar@`e19!l>uJgu%-S zL`0tZJ1?a=?3Y&!FgP5ciX(C)&@mRng!d59uO8w9@b3K<;NLGJkU(q#8FIyvC%T*0 zgnfeL@Sy}O;Q($s;mdA`PpK5zZ%bLGn`=hm-nkPtMx$cHohXKhnl~Vh+5mW4BT(Fxe-QuE?FaBrY^Cke77zq`-4{Dm%K`P7 zK@m=847IVm$Uto$gNpsR!7$OMO1<=#8yhI{5Mw;kK1rndomr}@`1*bEjWHcn8)V`=BHkMh! z8_M~>5#V&36>dIQp2!>G`3p-k9`5klu7w(sbtDN#sGvb|Cd))3!oSx=0Mhr6!#m7D zfIg5AN_G&I*~Ikyz7P|++=vS&+04g!D5pvrLge$qzx}5aKST^tY0pm z4cstvUg-+ioSRRLdRDOPzmcWVZ-bV%Uy+fK$rN+ae1UDrmi{W_Oj_BRBo)keCJNzA ztbyG=<#yk){hEgpeBR$lbqw;f*X>xM23(M?Fd|(Xj{M&N{NJ(shWu@`c}Q;IkC8nt zDQ9@^zk4r)`OMDx+-0^_upeN(e|OlnoL9yaj|#qdH6j3ZjE_ zR<}i~EoiC>d{6vEQz}Q~%1I$|*iUQ|jwJr;v^kW`OW3;%2w%jZ6dtaE4W0&GFajwI z#19dk-x58^k#LivUhVJ5)42>4VPSWj!e7G)0hoT#qQvlJ~R#8F>gql%o)&+|8; zH6j5mL`4-*sV1FaHy;Z(ahB64dH_ zO)N1+LaIvW+BB^Ng$(<`gQkWGV>w8)v6Qho9_E3ka=l0{x}QD zz+<2pfdAQoShjdL8O%w9SYV23lgcy;dNG=fNba5~{6bnqWm?KawFXgq00vJy3f-uPpH%Bfy6>}IV z*j+A?5CRV-Ht6rxoU?ppQ0{XFw8m@Onf7h;ObT1xivU?iz7#@$-E%tcoYgWI!V%M} zuMmYdnpu9k^M7r%<#40Q=^pi{Ian!1+c^tV1L(M1S+0e2EY#$Dk*v|G1Lu zi1m6g_0o@>ixj@A1o~nv5M?q^L9w=pwc(8v3RxpTQ$mjY!!uBJviXA zXhah|k}Jfn_D{SPkG$QnI#X;2iAq2?P9tiQ1~m#|L0U;cL`W1Ba__;>8?eTe8A>Z= zEllPg3WoiS{Qm2pR4_hBF1T+aAaICqPz*}gC3;7k1sQ7Rp(_?|4pUCUjDsD~`%(ue zQ@WB(Z|b_{?#Z%toqG>fX(P)Ca!4Kv)wSA zr%>Qg=a-~lEMO`HsiTyfI#^j&&KISAZ;5<$Uqw{97eYA}O%2U0W2)L?*KYD(S*NX< zV76I9a5Z7Qed&E;Uy2=siaKl)FG^JGNMX00!I`s9(D7($%JG4^py!LFszJK#V>6$& zvhK-sBkPa;Ypnm()mE{zaVI+JBH|pGjW7T!PbRX(9-!7xtqALh&Q4QRalX}ZC*61w zEm7{nKa_m0B7MAwp~o+lip76ufM)M*lxsB*?Fwh+3?XXlu<1IoPkzU%Rkz1_b}WV2 zu`h@s!zSd&lSuc<;E}76Co;34(n)O~27zsg(sxrdM-_GBAdKjJ_S+L)33lN0pRl4& z`adr)NlC!u4ihV2xq`l0 z+LL!Hp)8@w<<2!v{zZ+-w2{DmL@>UtPKvy^tl(vYsC?nvpiZm5DKsn6bJ<}ZCmY2V zoiyK$JOQxSd+Fyty|3?UBf`5s$s0_27N!t=ai@ChxUFWGf0kTDwQu|+rXv?qK2KGI z4cJdH^V^tSr=_a`wH?*s!u`q?BE5q`J32^<@ZN)BI|%ug`CnT5SQUtcGRZg$i=>6U zr2ZRv1acWoq~97vD9^zr2UJYBhLA*WxYfnGtm-F*`7#dR`Wr~m zknpY*b-~DtnQmk?R2q4iFw*{dYkcVbj3#i8Cosv!l*e9F?oK3X=9t@F#8U;>jnFW5 zuzdyP-m%W$c-+`&zKNO z_JB4>G-UDI!y?xvzC<9sUuC{mcYrRj2^Jb_uCW_S6{5M_BCU>jXA_D}s2%**&1vW` zNsn(rq)8}TerrZ~>+J^6i=P3Qepg0KQK7%zOD8{hg@NEO&^IPx6r#EFw_RhE~Kz1>!HK8()O)!B|TK#@@3mAOhD`!Tx-4{4!aKsN1Vp5+zxSG z8Cv$Z?~?XvN+?k`8b=jBW(pC1sc2y&gUm|655Hz!evq5&XwsZFZOFWBle?o2$xFH$ z<27I4++3DskygoKToC^mgR72FgS(i`V($v>xB zWu2>y;q%v4KA)t6qVJ;iJECvk`(_U}K&Swa5e={A7C!N5|#vBgllmlD@k znSGz*>FrwNR-R4s*RWxl`s{#=j4@omy-KkL7 zHU=n_o^Q=mY*3&0&()%R4uHkC-IhF480J(#{oS9M9fdvdYrZ@97YUGT39RzwLHcM! zT$l(;xI3F)MjOD(EqmN-cZyNPx1(D^SJngOv~-zt;>@EPLH3krouFqQskq>tnJ>;E zngG$1R{uJ0FMUGaTX;yyGwknbL#1(4>4<y^CnSUDHoUZ2@ADkyh0DH=$^ZC1cXabZL<3xtU^a~8vZ!)P^=S+vzP1vn-i$*?^rIf2n z%)Gn8tq?3>5gN|Kh$&R4*e=gA-X-IEy{X2Kmev>UP{anX^?*#AKwh6ak`a!l@ zok>x9&`y#&!*X@c+4ZB~mfl>ivcO#6sVzHE&L$lt@-*uB$Kht^KgsMw3 zjzKrtbMU58?!KSO&a!fIbIh=i&9-G^(Soda-j zX??oOjV~N4FG3#!VLzs%9B^5>n%_Rj?kzzUQBfO9eSjWGbu~f&*Wt>kzdWzg3rIf$ z{PLsW*P~!QhwoPN%1_F5yE5Lo9l4-sxKx$8+!X5_#tfAN>x|l32y;!ZXtZeJgsW_Q zbzjW3@yB5KlcoClu(4i#Ufk`M;`g@{4J{duq*D{aUlO|t9Vh>lH~gcBMdGMB zJwns(3*jmDrB`$4nS=Z_R{@Haogy?9`S7nUx?h?6GE#@Hhi`c`6JN7fcC-=|LJALD zmS)OU#{7y!%$quS0#Rq%qVy0zq(XjfIVw>spAYx>nNaigOL@a$f$~j4Uko5%&_htS zSv#_a55awQ$Hr@vrO8+hfUjreNQ z2>0~>B(QnG1?Pm>Ps0$BCkPP3jlk^=%>i(WD~6cY9)5H{sH_C`_b?9soy_nMj9CL? z4}CsEz;ry*4ZQ)?KF!^@{%NP%aQpM;*&)dm*UfI1S@#H&u- z#;;}<)W?igA*qBbgqb zhAwyzf(-j|9;`hE?dZ5ABrR?!ln9S1Am~4b1h$V-JV<&BH$S~3O+9(LS@Hn$jTM9?$Ms3z%0z)qd(bT#Cc9M`K}|Ej}DNwla5rOWr~ zLt8dHR5YwsUYU96D+5rSzYtP3`@w|6z$DhFlXWnYZ2UW6Etk1WHRXi?y_cw{@w`Sk zj_-TkUU6E$P-?vk(Cnan?(1bWpPZ~eew8Gw?nzjuaQ>0m%F{EykBCGKz1sZtuJe_` zN(tACum-7Gohl+XYY4aAl+yZ1v;4|NQ1tV-GX6;c`=umR5DVz=9Td`VzB~r6N#D-E zIQScE@8C)^p~qA^lGK#s^q;JZ<}msPl|PjZo+9iwqOYDi@rZ z?J~rwe(-nFr#yv4~tc*T}3 zCSJCOIepJStr^xlHaVlw_Vum-9lq^(1OQ7jcZy3|MFxCdPhD8<2=U7!l~m;A0bggN z@356Y|NXwH{_?=x_(%AvF)d?x=eye$tuM2y9*95TV<=JI*184*YAb?cZ_^P)+6=BG za8*;zl(I`MFKwhMO{xT@^UHqgZ{Kc}|)o zB;`R)>?@Y8wKvpedwhofea%CSk5y#Al5hBO@Mo^HXeuo2z!rxPm^)j#N&Q^Bp^+n{ za-4#iT6!}59Gl8dQ$T+neHY%g;X{KX7}bJfh@(biBB(YQz_TSY-Lhm{IBv-tVgTFI zWd>k)Jv*4`t&-5_I_5ASJU=PMt*mb=F0)7q?5v-|r2R1I_&obsq7jtVBnk9ir}QvQ z8N)E^DJH8rCp&t4R3z!tH&FZ1^_*j9$^77Yg(n~~b@2A~2-%eECfmcxR@HUx@VX8H zuQL3zZf^e)+rhiyfOM+f?K>4iO0qM=rwv#;xr#+_yG5~LrycMqaun|wtpebt%#*#KR<-nFPZVZmW z*-c0rV{*+SVC}HUKDJjo4B&9V)j2A zoc@q>mnP@;nLNhy;n%P(N)#PY_;6d*A;GUWBE&W;973gd@^x^^TPKa&hXZ`k_WPKw z!DZ{rOA1NUorTfD~e;=S~A5!xLAjo6Uf= zE<8q|V~wlMcPGKqO}b$hI`i|1c5%dJVnYgA`?hei*Dxn(OFdp;Pj>KGulX&Neehk+ zMnrnu;?y+Yu4ELF_gl&H*85fl^zfksE;PgN9Jya}mYZv`ls0;r6j0$7B(MA2X+<@+ zT{eB$cIjV>+3Wob#d-r4cGEPO>EB0QuaJJuKmhyX?-Lba8`caA%2hBZ1~mNjy*1>5 z?v*Ft?Bq;`E=F9Wy!S6`vu#e1d&*$GYB2`Zj$_hht0R(=k^>x$WjLS76A^?1d2#pW4R}0 zA>G`ngG=5!UJ&n#7;%6W<^m0#*adIfwWg{zO*L)U4iC=Exey;50@*Y1xaySC!1q@o z{Tiw#$|{MT$!oO`)=O+9GF={fRLOxaeo4<%o65F4+b?5{2550A01?&a)hm{*?XmOZwBKc9}S8k}}|71=Gr zQ^oCzN8+Jk-H;j?@#nH@!9&cmAVjE>{bLKopAGY`C003YUOE(gD2dq_rRXojjL)(R z&F<`gng#PFz?+4HeZ<)SI|BYuk=)MBKmLC798C0i->0CuoFghBhW^2BAk&N!Us6tT(*0muh|aY?`UZt>QCutc+K~S_FSVN2TME)-Lez z82et*KUtvEA|Kw+&Tj*W8Tsdtwb@B(S!<7im#&r+0F*dZBxL-vX52$0ABG%*ZU34) zmi#u$ZBJo*Rfnt<1e>x9EW+$Q{Gyjc^cD2WoG#4SM6YTcLsYCVh~GRQto8jOh6`m3`rB z;3|?TfF+rZrj2a4R@utcKOOmVJ`eFzq^=!~YrOgw2T$mkt4@dB>(5y!8_UOC*7EOz zEt(%s0%drtGzMn4NehI#%+9~VG%>|dq&|HGm0c@IM#q|7=lNv%H1AhvalsJb+b&4r z9upA^X0O&x$^5QA$+n%6T7!n zYUIw89w)sz-*f}UK+LRWTJ_xOH#%{(Lru`7Ulv0)Wrx8W>%|jlRB{l_m%ABaiJx>b zwf)p7_s85W;Y=?;sYA+&>X~gi3n1N%No{A&QO2X!6`-AElhqS052B+s#e0VEyi~=X z0C;fnv-;10Lv2^W7Rba6{g!rvVJCfm1jlq_b==nJpNb=!#N~qpaay>m+E1z)hh@)` zhhLnwG70aRT^%M`25;)Omv<3mvYWt>X1I4lCowH;Ih0sE z1~*XSYSPI|oV&EAqnyyy!;P4*ijQj*fEie`qNJ+K8SQ$!q#w0A_6`8(s{_mChn9Ln zYN^W3-$>^@8=yf!LCq(}HOH371i} zn!D5zLcaI|@|6J;XmIVb{r%eW+;;uVFPF`IJaO^!TxG6qa@RR2gef6`*q2+@C{v6SzJ-H0 zdT#%%m&L;#bp}8A0GvG=^4cI^35;R%|F*AlW5Cly6qw}%mn^Kp{s#-e?+)N!(EsWE z*T*^xCI8diP1^{Jm|>e@^Z}w_i5atHZ6%yR2U-V$ffb5l5Yqe&4Fn794vGe0*AVc| z@|y$53g{WQ6YM4fNR$@j0Tg`AEI^A`1WKEpN{&8IPWc|8IAK9b&6;U3R)`oP0YKet z9iYWtiBqWn2Nygc&88}mCeIWP1|C<6rjkpc@JY!)R0(Z7AC)6^)QSM+j5X>S$w?h7 zflxdF{ni16J%W3uBo+ROEC188dKsiIqc`}K)F*?;D6)T zP!@0auBx={Pvp#UOMdCUCmG5}iXk!rLig|g*FFG{P)7i51K*>D8(#sFw~+@*0Z6V5 z-HFUB_kyoVCrTMuy(}WW1K{f7I8e{}VB0*m-_2l}tTz+CtshnvTseNDw)ejUu=#MN z&jvvV9x%3t#YN$GhC?V5vxo)w25_*TLB;?61#lEh?nc zr%>ig_>8(_;9DV75G^?n(y7v3tP~_B|0sfY5q}|+K$+kC-(OheK`5rV)JPl0jls;+ zDDxmRjo5nF{DDNG#hcBn2?y967Q@kZEl=;FFuC3M^DHDg-a++0aJA$&`MjwtSSHjz z3xK0-fd5>qKhsAnb4C0_vy>1ns9b9It&48Y)Wr{74Mhk=}h9cv+le=JnjjM$48U4Dm>aIM>$|n1vv)u4h5ql#dKH z0|8R4`Jju>G^yM4pXmm#icyR1ct%!UCxu!GdgT47UWPG`H%xIs_HjWR6q$+?YM@qT zIui{GTV@7Mza<7`=o+>uvfjT!EjrAJ-ak6AztBahhfPC_0KgEv3~0gq%rzser4t2N5)o48t;KIghj9)kMK5$V5yx~XXtFK$f6cJ=UqS)5lC#JF zU!!W|Oer1^;LFPvtyk@LEwBA%aXUKm?b;$69?1R{qkDzr*d@en6-#OPlw7rSxwAg$f&tPLX4fk6;@5abx}+-72Z)4_HHL~GsIAxbY!jm>grKvY1^*! z=YdQ$g4>FQ_65mvemmJ1c+WV;E$zFfySeRp6Jk=^-Rntkku`~XkGP2}pI2IF0d@UT7EH!u|7u{Qb2D}z><;6}~NCynHK&huEe|4O_v-S6grWelCZBQ18V5N2*Ykvo^arqbl# zC{$umc2HK{fBKk~4v1Ky#RmQW`ugCUFo<`gZk+M$(Cu~v*4E}V=#90|89#jcNYCo= z8gHrH^baAm*HAX@>riV^MTH>jV1q*M>F+21%6(ck#-ZcjY%K^q=B^emb_E5oiGYm2 zRZBpzr(#{n!_EUG0|Owo;P6(1c1Nsht8pp|5Q2@4SF=fxEQfgQ*=73yBV_$)6eJ`h z{>xwyZ;Wp9M)skTB2WV!Y$&1rUMb3O(|TDM`z6%=e+RoG05s3*YgGQ3VabUXrST~S z7uAch_93Dq{0Xo1+hh&cTCQ;1!x32*MIJqmxLpN!MO#qX9; zZL|xXYv?;Uh@U-)R&6}@-C9U~1aWZ7&xhudBS%x=snDnL1xKWR*C2Um+7H?lD%R@r zoGf0q?9_N^(oxNeeP2K0`_~QDIxV%XlNb!k3J%&Mmt~xLs(p?DbLv$q2EC?371f%y zsMI~qE2QYi!-t!;7b@%BVDX-^WiFC?m)8yw&qKYgOGrrIoC=ac3Lq^(?5uhP{_wug zyx*kp;E?_E@#0?98^l~#Pyub^?{QtwY$!uqnMas%spedf38{9Psh<1E8mOTDpU0%-lzIM40s=yj2_!}()$Gr4$1L697y+u5h`|KaML zqQiLOw%w#bW7}?$#zteOjcwa@Cbk>fwr!`eZQD+E{_nf?x7YsWU{2<2u+}`k>$$I6 zj*^F0I+qXqR6LD^v!7RZv^}rY+rtX(HM@1x&H(-T7Q%umaRHRX5^;t5paq7dnamdYN zHEr};J40^!5r~Kdu%?|{%SWbyr&X4-k!tbl~xvF3>49SO0}%uk-x=vlfp-Z>K;n zvc@p}8z>$LHZGR%d-iUBrD1?s^A5As%1T$C34+n=cw2$5ozZf?z(cZm0wQg@ZG0EM znPh|ta+!0Cf0jT!Vz!#u3exqN!f_GfN!Hi~s}aB8tF`A{%iD7myOc5}I;^b>Ih`m>+3XtrTUBB(-MWQ>kF>NBRivwTW4AIi~n%1k3B8zN((K%u%ew6l1%c z39u;6=HPq2sA(EH_cQOUH&waYRQ=T!rYv^RCV4h~w4?V>(0LHZOPEQ~*%Gc1?NA!v zX+Jbf$U?^_zDyiz7g_z>33*O+c|vvaWZ<+e6#_*?`*Y+uyf7~os5l~#27mTF?4Bmo z5n90V@fwA8s1^FYL8dX`ng@m>c^yB`5CABaM?0_hb$8vce@bZEOH6i@)to017byLp zR~YXY=)`crMEenmcgW6pq@^S+ZQNm&Sg*8Zdej^HmEfMbWK(&Zpu7~HbBs*gadPJ^|95T5TrDtu zz&z8db!2d4O!(Oy>Sx{CFZ{vQalqkbS0yrxOc;y6JpePQ{;ztbm+Xp|f@w+SQX)Q= z%YxP|<)^7`RF(UkrBAqSb@?IUJa_9vP?@p;tkKi*X$HdlXxlQW!#gQ=Ki6xOaY3yJ zRX}Qd%?n?b$L@9pLz15T12~wz!;JBK z8h)cm$!o4|zj~8LRyC+3!TA|H2>!QBXU*0MtA(DR!UD!dtAO*Gkz9LP z$qdixqTU;oJXcVwpb4(u9^m2Xy3^Oi4o!fRc+u#zjGVo?a&zL$Wm2;Gol1}Gwj@sj zZ;bmqKM4kN`3ODSRvP=9GxHN)^5D6D=Sh0x(|A;T&uol4+F^i@=g7-c6K@&UQDg7e z^kfR=r`GXBw-gKxsAg8Kl^Yx(dd}XUC4F=fU&&uhl8=DXVfS~V3g8f?GqwLxgC0xl z4=Ub8qz2G)9er$r7n#4Cb%OWtrp8yr&AA0JxuItV zB)#GOHzNBrhk6By{7Y3)bbX%!Uv32wqHK-#Q!@;`ZIug1X?m7Y{k|D&{l{Hxc7(sU zt9*i(b{9osWBMQTE!z!6TobOwk>9N08eVQ%o2g0ztgivF<-F{cy9QG`f*e?1mU>^S zsKmz1#7wU8l6|gFBJoP__GbVTIp=gEfg4KeQUY; zdU)1BZ@?y}+?THSFp@s5=32xrl3w*GI!4-)QL^LD<3nyrT4#1WtLEcEJzDoy;bqIB zLbl?C{Z*YYVI?<3vxslsqKkM{UrmIi#HOQLnYe7ma;Xosz|ewI8bU&A z*g#BJ1ZIZ;@~WAw@*4Ds%RT8cb|&E^v7r zH$e0p#WU06=s7n5@cwYNRkoNP)>{AO?hrh&;4wd5i21dyZ_s#W?56w|$?$z8Vfug&LekottK&i!MN4|OLOA3uY+R@JD*KUkX zzxFe1S%ZLmiO&cFm+u`JH1c6rS#;=XuGnE`itdkZ(QP^YGX?g~+Cw9pgZF~@s3xO? z!9oXV4s2b7Y-9x(d>8HB!(pss251`ecF8U^ysyjODx8YGzYnq5<}1-GGI$w00kjHX z;faK+m2*Cvwx>+N>rE@an$YzRtk+8;^X6ID%Br?Sq_~aQKN1;8*(R)RgIlT=c_un< zq%LNgid*$U%csF7db6BQgQG*61unF$S9yP(65(qEEGA+V_7cpt-A7iVo+V$#*d*0o z=vWo_3-u=BJ`f_5`}iMfVj*p<0}v{Mt7QR7#@4G~hgPdRdM-;&8;$E1Hmj-YEuS70 z@2RCoMh78SXzc%c5M)ZE*8-)T=Pj&dP4d^Miy@m7B;IC(hFI6a+? zn_qb8Tt*=k6KXNKoxZ1?+wm63oE}P_88@dsTkD~02Io|S5G?_*KyGGHQef#~@yM`M_qy7bo$wYM6 zMwTw8qac;h`gJLVe&6n)>yK7WMk2%Mw6}x3!ZxGYnlA*G+}dy+*@NJvv)@)eoc;BkGMhoM!DszA=rsI}u`w>Jw?fVmTrK`g`%LSag)~gdE+9HI^o2L6Sus z@I7Kg^#cY6Zj#US7JNL6h1r0bF*}ZQHdPMRZ8Q150v~;2z{@7BtqdWiMptq6sJ#eA z{oSyb@~!hU_YX0|ni{8g@Jd)4%Y}_AXk<*&`y+{a5g|sI@yp6ab}wF&U7?JuesxY6 zt*L7%7L8u57O`U1Zz@CdynEQYm(}BYo_3{bAZb^xU%6O{<@Gl68LSiY==t$OP3h&^ z*5E1?WWowDfZy7RG9y1u=66EIQ@%o8h4|TK6(GSRd287I`^@@dpanreNk|*!@$FfC zo%c_{jz*gpN`~d&h0d}9M{=z4*V_u1as>RFEziS<3$vP2E+r^mA_mUo6x1yX3|2a- zXigu$KOYk^lzD5pnwQmHgeI!2{?SR6OSRK-lBg~NDo#+VZdNg~&X%7YFQEhG_fw}( z7%_Dwzw3Mq$0RZ(_tysvU=cFFcCByaIO#C7c+^6nqH<3snY>hol`M&GoW#$#6XfayX()SK!ByXFzkMw(?Brr;5!w=oBx@10#E99Yi~U)Yb( zZ%~{bfX*`2*1FTLL^_av=_9Mn!)@3Jo12QgYTqt)PC>IY@z2)5zoXG*G#V`9xN7l- zaW$H(|phDdqDKTCapY0M0zwB6&XjwAJ{@sCIw!>S)Cu=+RhmE*0&DUU21@%!{X2% z8t!LRr9n*J1Q)k-F)eO6l(!kB=26=WPP;L+g@0aVdEWZEjvCF{Q%1aJ zvoG~FzUN}K{rjT9UY;sjRu`9DisT&yDq`=l&|h_s8G0oW1SEW|{fs#GQ+&;$ErBx@ zhR9Jzr~s1i;RjZI|MfA3XEX2?6#j_VCBxc$y>Ur=tdOH{e0WA(aQ}OCuS{isQBn~a z2BsOC#;e}^@&+|)DB*9F7Bcs4a`Vd?xXT7z=pLp`^Bd|3Dw*Ext;^z)*TzV#Jy&_@GUuUIiZG%9g41_zB7>OH3cckTSfohUuz1@G4c^*tqbf%xQj z@te$;63hfE$+!_sGp_ff@*za;L%f9-lB)Bvn~=la+jY+M=zZ-@wbm7W;#1DZgPqMx zlP4}V!ZK`!0wa!6XSWaukC)ZKT6C(POC38eg6-FA9-_wrA~e98ijdm-^UwSR3+rDl zWc`Qh$Xuh)G+;py=@|IF95-E0zqG3ZP#xnU6GQ?r1LK85`5_>46Hd?1E(+1&A@Zr4 zNKf(DZN_AlAb<2@4u15(K1|wB$3eKaST(TI{Fq?>D>2>Mlgc4wbw~(zj{W5e1pPe}N2U zhf`*4ChwQd3`%g@&!0?%tvf=N8A(f`k!|YtCOT+)IUDo9Wyezvrxa(3$dG=;3|hFp ztMEBR+;ERe=*R_1Kcc6MHZAXK44SmH{5-}$4GmC3ae52Nmr@$ur0r0*WSpdoNzpDR ztV3Cv#&L9ey_-inEtG_FHAvP;#`Yk){+PRMlsT_Clv&McDy*_LUw8pnE~L@Skwa)Jd@dcTs=gOKl-amYqY8@n-UVOwTNH>oDLLfKJ27r}pnw!TL(( zc?*oa=G*%R?l851pyx&&XPCymJuG_Voo){o(XT;yXXcJgR>NnWZMhNu}zgO z8#&njQ|*dHtw+VVJ;U=ZCR?7wDsw3#iEMD=-%6=2$+!W+kF!sDS7d`4h9>Y56&lC*@IQ=&X!y-L&(*LbHmv8oc;4P>H=vh#BMIy0cvY z>!xyV-KD?T<5e-G&?QV_Lm7=xOFHIlD0H=NP`t!m0U%^G`G)q)|M+{af$k_P)NE2%-zq?ZZ|P%Yr}XX6N$8x>i>L^+*EN?b$R zRLm>rZ=1d4AM9Q$Zmvz5XP9rcyCstKCV%{+#R=NBXQ=v<=;*UPa%#15onD@B)GQj6 zm@WsS_(GPdP-)yM&aFZY4G$jba!ta3U_zKxVJvUdL@Pd&>kmQQfx+RbGb%ihmBKZI z1=QW5&QUs(dzODPtlH^hhW|(aMH!pwV^gV@k`A@~rQR|*=ikq2>EgaA8ae}(1UN9J z+{gpiwr!*xo(xxetMcay&d7+XYag9u=J+$%LSLO0SHt z|G-{F1*zF9ssDk!O2VV?_z6*H$Kc4Z2%v%zM9@l9(0(LgFq9ZbvS@Oa#ZZ#S!ooFv zA>XJ;NK~s0^4`*9g$c7BpC`UxZ~Nu5bWq*nM#ldh>nU4D4fuirNCA*W<}iNd*=7v> zAJ{AW+evNRh#C7pE0vDFZ8Oy+foQgF?nu6@JwF-+rH?q79HXx*9A{z(F%qNl1jipV zDy*uJp`i+vzCKln6Z4(0r?=(a*|=6_-{+_-HwEWPgHHB+nMH#XS9U>JEProhj3jg< zwDeHF@>Y3nW4lWt2sp$zoj^6;Luk5T&q8A3E`jYJ??g@j0_4~6Pw=~48{UeXmQFrC zaKH!`o}lkG0esLa_@%+R_@<0zdg_zFG|nHa7!+wQ`i-;cnQ7wB_#cNkekcj{YnN3D=++zVH5<(=AlONJZrH{7e?^ z)@3~9<>hU4kN%uZBFQty2&Rn7JTV{huT_B?U{eA2^jHlJ|HF`zPYTXVA;W*RN=AbIQGnf z^$K`zwS2P&({YYr-UB~z-ZF#l#FmZr=H|@!G8S9c0KJo)QYKH?J%l&x8-3!Uh{!|dz zK4v%WZ_)xj^w7CJDBlLV8A?WcQm^4au)aN!2u3`^e$%cq(C`)1dmsl{$x=izL^uH_ zqR$+OBzB=egX%2zVL`~wfTB$u8UjOO+PbUb12DuZM`%`Jc7FA4-HY)30>kH;)kQR|0YSIOLiGr#Ii|5K@3@$+N z2WZJKp@e3(pFD|tioOXJ8qMy4RjAeVf&XUp>3%K)B2nms3&(H`GTF@m_VLu>#&8y0 zQyTiO=Bt60d2ygVQfKJJ%jomImC2RCatSO#=)*sd+1@7NEQMPEg=7o&IowH5H#$?W z&J*|lvUneS=90!D{Q*?uj1J|;>c`)DgSYq-rM}cp|&NFLWa-u4D80vp~B#|72LoGmzES?{N01ni+Y4*{?=9#~mG6Wdk z>Q-kUWAuOtOZMD!Yn~M=nK~oyQR69tW9Tb#h%~Ewm+gh>m!%F3K@WJw7DqrvVE42| z3&n~^2*hM!SR>Jo3Ls(%6@na_*6%z}@h0-wXay?kNXZ@Lx8 zYyU%OPinM2M5@|LX}x;z8x8oX#b~*+1}JnNvn&a$ydNZ6cud+*x{7^|q69yq4Q%#X z=`WAGn+zjNxB)fAgOv2Os7$cVK_&%YuTua2~1%M$xDBe(nTdK+V-er z-)d4!XWsjib-nU#4@BCJc~T$q`P^b(|6*@(tpe@0YMPL8M4t65eig)`24w1w#9K$x z-idH>b2m)QQL=>qEyq6^A2IYEV(!kM)HcskMftQhj2L6h2s}gN4l`z~RPz)bm)rre zn=W7fKce}DtuDccF0+YPYGRqW58fMwFTGHHXG25*Y=o>Zg5QKh@bXFHd___8IJ19a8`YE1@S2Pdo_i!F}_t=TKMN zht_~3S*aR?VkJ)N`sIpyc@xZ2&7G$Pbq=)(BrW%_slvNL8`!xD$9vO7;bRkG^TQ2t zi0u|7h4|SK2_qLj>6UZQj1rlkf(C(qDcfnM!4C3@*l80;gi2YabL_gDFwu!71!`wo zWNs8i&U2a)s=xd5Bb>we`~E(Yv}95VkSm$~-B9m09GfavCu9K`n_Hht3I$iL%#wlz z;Nc1vn1YV@@PJuB2AvHt7{V{{gDotA3s*0m{X>RgF^H~8ujm{8^EZWfXLt9L1w8YO z-c3PIJLn$?R6p8(Hsf<6v_2-^^w3eDnP6>bpV;p-Ph0%yzc7JZjzei?-Qhr+1Ur z^1fYQQHPo@X{L%N0tB+_zH1>|w3e9mWrPetk`}Z1t-GMjm+_x2u=4N81fD5yKKqUE z7b`;8rJ6~{)6US$&RtRzy}B}lwF*~J)k(&9m%MwEugxJz-Rjc!-u(k(m5IV|rFrz% zeIj``zsj^KtM;;x;pUu`7RKF!xwdJo5{3*O99Mx!GsI#1?$d*A$Hn4Jd_t?)u7Nt! zzN>l@wYR$UNa1h7x>nG{0ofn`HGu)aZ+OyJ=(&DQLa0p0>Q1(DSOa)0URj&g(xKvy zA+I|=w?5<#-K7302ii%BW}@Kt=LDT!z1r$L&0YhuEjzMnFU9DXT#@#Zi6h>xK}Cp? zj+SZF)O&b?hwJh>4LOV{w=>)qrD@UWaHbXJBMylx4Cc4 zge$QZyj8|0E#f14dkI5D2r&z!)GG9>z1~VA=e}vKE)G0fCjJ+w9r`$zrF(Ez@5v_$ zODuqu{)t71f`ltE50@v}W9+aVTU}YsCTgtBwt;BxE50>8toOqYXV)dj=L^(kewEAi z55El@`avWXc4`6V?XFtkuA+jGzl(Y~ROHAzw#qKzQ{8){w-5azn{aPeGLMz-X3Sp< zbAk|fW=0N6Lb-RdNH05p`>n#iXMR3lPb0UU6C8Vsh@I-81wfHGA6CZ!r;P=RK(VGwA#IjhjBAU27dn z(d|Lys(I}3$mpj=tL38Wle439k&Hu6=*_YI=@9z@*-LP0tg8m(KS52fjUl; zdfqL!tlL4qQ#zeBW|3%c2=w=$)1oG%=utT1yCvWV-1=u*qtFn&=)&2a^&4xT9<1B` zI4tWMA&y~+Nl7TI<9C`##9J2+k4=OhNr4q28VQNtvpp#hOE zP3d&6N?vS@JxY&!m;2BR%BK@bT}E3*`o_Mre^K`=A1EyqZ|p=c0)IG*J3g@NAKI2H zMAZOXg9N;eRrjGg8(K9g)sALH$#k@c7jFy#9re&2++@(@uRIldSS2KvC1qf2O#8#&GgaxSa3FKDK;$Rp-0FkYnzhzgLGuQ1 zcDzQ7q7+B&f6>(Dywli>o`zHsG-fJPXR$fk z*(fS`-QhkD;U#B~{Gjg5yaUY{EijLST2u^gji&zw^N~Pw0J1!J8>1gug}ewI$LF@CnThZRxo9Hj>K>0N=1?%cSOd5HVJQnY6i~Wx`pT+>*eZ zk*K<*{z(jhCEX(RXT0FRGlrNjD~aWWo1p1HuMSFxt?Z%UoAdO(2%v0-jKV=ekL=kV zu?rybgw{HO|8v;g?Z`Hf^|k)qu}UlvD>;lL<%uA?Mz#UEiYh;wO!*;{QxjDWqES9E zGA;UERE4y7wEB+AN)XD~72dlV{;QZ>45y2;n-=j4r{g$6ym3W9yL}k5;|kOWZhA!s z&tJ}sE`h6f8Z{9!ft?%wsx(wCURS7hGq5w1=*wjmLC3ZA`v7fl1I#hf9utc4DDIfM zT6Zf%qizV+It~;z?Fg4y7tT;~lC*-)Yn5i5Eg9tavK>g@6^i3cbkkD}siS9G1ooOatzztNGg_%>`S z__QCYlC}6f(jurh9ng9VGY}$tC6Axn5wsI3{jNS@^ScS$g)^u=pz$2;6I7<|b>ecv zmEa!=MVbq5xYdO?`x)Jofm|5dXG2aCP80u!NHwTfmmH4g)E?vfCm3=)9khtl0L(Me^c29ymj;h1sV!gCry%!ecNqzf^kv{wj8gD4}YK zlI8gv#M!RI(nU4ZQ8+c- zc5roDxZ@EdhiPd+1K$Rd->4Jp(9|iuvnWfAt9tJKgOO=em^WvE^s}V)=1gQ0;i(7x zw({NvuN}dVC2K`R%f!;%>^M(BzcKKcj>n1 zm;~TiJQRNL;hsOv1#mF`=r6wRU2`ZQk}muagRHwHAln!FP;^?KKUaCHmpr|sZjdwI zQ^?*v4hV)|<@-dgjd~;-HNd7#Y{u`_Y$R}#rTEUMi#sQ%wRAru9_`<=Z?@Yon!-Y% zp1nIx{^lAay|{Q?AL!(wPzzRIvstmz#A_d|SM`nNLpx#dzu z6aq^fm;4r$*qL0BJB5vp7CXUw;$~RV(v?!N4&YEmZQXEo_?MTynP5k!q};0k|B|y!T>oEP-}quJ>!(0J z(@sc9zIc<2I4)Po@4P&*-Xp8Mae8x2KOtJ3%9!uJ-3ZU$9*Uo@Uw*iw(B1Fr5V77C zU;=G%(xrr{G(XL}cD1i95g*qF%V!YgPgOIR&1KM+rM*&LswsaEaG|M!Y|42x(t)2%4^ zl59XXx_V?C+3{|6tO-I)hDT9woNrQfE(0IZJ&Osf$%L(m1}CtT9Ujv83z1f2l>J^b zD{uO4$K6aj(@te$aLw|&^l*H`&Y5@dT~=%~vf+t1bPDS&jFl#8xf;n~b0~`o_C<$y z8CDeT8cSmJjaJA7k&jjh9G`Q>-1<*DUQ7KSa|8B}mGgy`$eB4l0Lo`#)U*GUUxBkF~Hfr;brY6;jJ2 z&DFzJweB3UE%cgOjgv(qcx&gcRm{KeHhD`|)gLT}8mUR07JFk&zim2sMFK~7mT8&h z?{#&!33QJ-tBLj#UK*P&jY@5Ky@}@ym4JdXiCK++(QDZqI(>QQVnZ99QSZjY37D@E zyT$iLYn(NuP*t}Y;zB`vtK!eysupfTqlh02O;jTX9u)>QjZeqCC=;!Gc2IxQnLcbk z!+y*gR%{q{)x&m(DctFtasv^x#01FB_|}F(`0c+r&rJEpb&7vuy8d|DZjancyV>SB zmBM$Id0_+2-1!+B9nEJL?S};x)B?<4I@h+$d2E|_HD`W;2(%EmcQ3OA zK+5!P(O)%$@N6#J{{Q2TgNOlLM1q|z)+sz zA)2FV3@X00Skr)7(kYpAi-~GF_ThRKZNmKy zz6?i23WX8zJ_gXH)}?k}4HXte`R z#@n{WyFRU~#>jL2h;{P<=?Kmk3BMuz?VqhhaRkkO>^*pyG`#0|N-0Ck%e+@cMDrxj z@Mp2!q)L2IoOpuEKH&5lGCZz?Bwb3+)PD*`CCx=ab?yL6^PRF(N(Hb%4<4a>d+VgV zDp1Rc?R-G4701|OOYv@$&|1sbcZ`GZmE^{JBmN zd?u#FFORW3qy;A-Ez;UhZ{3W52-Ss!qY=!*i(*NWYs=ZomaQwRO|-|53l;K?De`wu zRw0dtH2^5Rx>+ZIHQ0Y6rgpM=T7Rdok(aFI8gV)&J;i~~tGKWRHk~bx4+_$KOAzz? zZKE{Aj^%=vz|-`X`XDAp%V(~CDd6DW%fXb0I`|VnaA+I(jklgA*q7=LfW1 z$Vg8)lHLvSJz~iJ^BLoY<)JBXy+#hxJkQ$1hJh(%3<^D)u)15(3#xc8;jjR$?fjeo zSFTDo3k6MaX}@0`SV9unjSy|kopE64R1mRd{&tUTlh@w~)b}Va?j~%^QZ?fFj1}}a z^XUe9Q=A_*?(?1!p4-bw#OBkj6cd;2lh0zH;Oy3JDW(OPLs?CVw{U4*ReWym8M3<) ze`|V@uqWjNr8wI~1_4O>k|2ujbbc`O_C7$=mTcAf7hJ*}%j zYobjO$L{gCMb1lP-Y8O0YDC3U4kbbapLx0*R=1TmX`>L|9k^r)c&LUJrLI-TlxXi5 zN~8oNy@8eFxyc`nmkKojrw`@5!SnSw9XZdM@KrKZLo?H!4EW;%YYJ|kYJXpVRn6JA zat8bwl*G&|jDuHl*r%j_^sf{Rnrnq6v5i{_^#KJxbyhquzvHP1c~qKu!8mV}rGw6P zP8#^k_0DMb)?+eQAr;Q&FUTiA^ZXE=>KPI#(T{QbjaOH}{4Va}hy z>JjMCeyiK*-m_T>%iM5CUl550D#~HkHt|_-)-Yw?33~5W zc|SF-accl=1D{VR7lj8!yM$4+Z5#2HkEv%_Ne8Q`aP!I=c(op8mo)dp_H}^<+kxLL z?gASn;>>jB_}a_{(b60!9~~pGSo*~~GsSmMzTCjecu*71j1oov^yzv5tCK?G&rmT* zTeng^uL@D0^7t_|k{z7K7T@czUFt>KloNQ-1ncnrhPKNa#}g0CqI!%qdesr7zpbh8 zDuBiD=|7h-y0u9vYt9PC32XB0aKhk!vH)6=y!zGD6uwu79Yk&{q^NB;((Gpnwkmm0nI=Y*Rw zn}vg^wehI7d;y^%lJM4E>kXe~7efQ1Nx?Z^kyk0Kd9jx0qFTD`W9l1bR^e7!eUoNn zkrog8r4##xIkv;Y+zu<(P``#W`C`?L98sk>zv?_+a{+I%lt#;CGj$+IumcsJr=6nj zT37?N?1jZcP4d@A9^=w^)smxOe&6CRV(w1`NwkwN-!)oeJs)pXbDTOU+WQmn=Bfyz z(s=bH0lEDP+Tzh4{0D5IIpQ}TpSZ)lHj{E|(3dxABFJBHVvU4DS+L*?f>L77B0}Wj zW^y4UB*;-J8Wl-ka%ikb$P&WX-Zru0U+$j0y(e!!y@0IC$7ddgUym7&nI0D{hyR@( z)06TJ2|z$WKv1ab>OgFkUV?U00oO*_934Ma+~4x{aoKj8#NHLB^q)$J3|jyq3*`p~4gv^o zulIyiO~kDN^K3FH7z*}R9g>@XW5a(fvxq=)78u7Q?7fON$o~bXFsiq@2r%@GITYcr zTR?JJYMUbwsj(weWlSq+tPKJJB3wT*r!>{pD7dmTTz{~rU^Jog<74Zc2y#MwMQh0s zsqtmabO$S%8T{NSm3ZR#0XQGRB)Wi@6Kw95-Nyl21O*Ye z4Doj8iaJi$Ht1I@7IizcYjP9aBCvyYCBfRw3G=YeMEH1RX@g{mFADGA6838u)yhfJ ze+66fD2Tuh#-~DvnvUyHsbvS7A`W|>wRqc>^>lP(3T$>iyQUN82hk_A#xO7a%lFr} z6G0m1w+gcLK>FH1q7JL~c6nQk$$&pvPUb>HBX{#vuc~@5@&E7K{o=4bxwfLiw49%6 zu8ah1m_h$xScu26!`*4PejUz2V#n+vZXXEG>>}1Jn2u#o>2CF6>+d{P*)EW4{GAyo zW8ZASD$WS6VY>=%J!7T_-@Z7kttfy+vbTG+ZBk{22oJVNPqN;^KWv^SCt6Mvv22n%GGgp_YFwhUeX zF~1F&4(%EStmhibC{7VnK8f=AmQST`Aau){uSZ?~EZNc0n5c`T*$RPt8Js z-|SwN3E?HaMmFjoL23r=d7wO|%IZjjM&15jC^m%NKbWr$9ZW7KC2(3LYx#HJ2qM@O z|9>dfAWFo~SVS`)0#8AkT0#4yy&g_HfTM>f^g3n`n+MAs+W&4S*^USaT<#k`BiZDq zW-yLyIA?z-)cePtpwYq=@CTZ*8{=ps85ty*Vc$8mi0t23M>hKm-zXs*rNDbeO5C%M zDqr!rPSv}ccpT^Yi%_yS)EA5uc)R91=&9x#EEQ!O>J?hU(*3_-EIv-~&39Ony$vjE zHugd?vJm=f%v11e9(T}@8>|1bK>_%Bu3xpv$)Di}!C*vQElk{tqjU2m3Z4uIt^{5! zXaOkxeY&QgG0_85#-rK>^eETMUL9>QkWcssYF#El3PRh-x4* z;QV(sUa^!tncf+*LHdWJaq;2|h7xrhZ!gNbT1me;=Qol)m41}-%bRD|F<+Vg-Z_<2U z4A%~vf4HJ0B8mF}&AI8c<8ta#WCCi?ytGy| z_H!b9iY`^Tm=9#fWRUs=25Sy{NHBYMWn8J_Olq4y+BZHGd$=zVMnnAl%6Bz0FV`== zi<0AQkCZpzC!xmp%Wrx&=d~AUYU`JZKinR!FoO!U*E*Vjjw0Q^HUE5@P&X0X@mxoW?QGxf6X-h%JCDVs<@l`nXDdOuO2jp{wdB(zTk#yn8K;jJHz&&XGQJ}%iwY6uG4J)# zD%)k?^$*$sGk@uZR8sLS?4hzdY)q=4LuH&!5eP1%G4E1NxLb40iQamyPK+!P(AXEU7_a<=f?&7>f(Ha}Lcb*mw8qN`O8V{al`kjb z4^BXL)YW`_0oic=K7>?JXj&ifv=A5v4$B~nv~82XFyG(BBRj;SK~oGtE+d8zE^1C3VZ_uMyxPLC3Jsa|H48K=IWhtE@Z)>ZA zJQYK}BpUw91*(G-f$C>m?Zb>1XR6=A)M{Nex4$m-40HhGMBP}OR0BfpbT1q$>pP`z zOyld4Ay4ynu>A@~q|l_$qaJVN9VRF2JLNEk$1=I?$&Bnn3IjR(^h!Jio0 zW6e7Up;tlbAUGr<;%yemb+l_w3d{|gDZE>^PMibktuYB1Zmgceol;!m1|e-st0yII zbD71l`C3Q(o>N|oI)#MVo5-FUR6Ct!- zGwNj0d5eQ*`%t{9Gh7edKu>`=2@bb2YDG&Yi*Sj~0|y8GX}qiDk;Ja?V(B)tLW+%x z^1Qjj6mKP(M#jhe8P3C!zXgnqcM`CXcEMfyk@zUV_wAA?Q|&#D!c{@caLr{Iezy@Y zm~Cx2N6)y)C@`1C6R%+M4ZT14(T_N=RIK?L1N?HEyH@Js+T;mKVi?utem*ZiJh3`a z)pI6%7k`RxS*{2(thqTI@^bD&aeYhu$G%Wc)h&NPp`4?nnxsQmx*?R)a ze%DnCKluXZx^4Hj8BmxyUd1dz~&|=^_6^IHw)&Lt>xx2)nm3?nb@OEg$p%r z3pv}|i+OO*Mws9-z0TEL63ThXtg;wK@bz+q`Dx>Pza4^UaVDEeLOHdnP^|+1g}m!J zv!Ix*TG)=W@#je&VpU1qv0y#VBL9O`L zOsW)9Wf`u$uBPlSlxGD)ZDBgFagZ)Inon7-lO2V90m5GVL9C z3qi~S=4c1$Iz%ALE>E@vIbUkz$BSBR?^)^NeuHNQ?p<7lDLA*pSYOJ!CNHTr{L@a& zl3iO@!Q3>)bS}JEV-2gw>R-&Q^vj*Ane|g{@lMzeaD3oqE18Zf>}xXI<1*;%MxV1u zVP72PU_DeR-N zJ%UXud}){oNte^*t@(D`x?Uq8RB$&FK_MP1ZpIjac_}08d}bzk1$WB^FJ{=o!#u$Z_8bz;LgAT{ryM&!@>l}Gr0%=;C&dUU&zgciGe}}Pf-oX8&I;Y9& z;!|Pc*Dwt9?O!-gUT9$V8s)=Y)&H3V|8TPvq2he0WHEos!dSu?!qUZcXa-Z z4+n1^pqrjnXtH4!i;!RXjTM>rH-6Pztb;BT$Rb3FV`T=$OHcG}hPKp#eN z6KBo5HqlP(Ks?nRPKqiXm&HoJ!q?oa1UL7#j2xOMmK*1^u(DsHCdI>Gx4`>39z;t+ zvb!&=8nonsa`=+2$LlftKPWb6O(au4_YENYkHwZy>hL1pH*x=pd?u_E{wIb7u+KNL!B>SJVF0=4+Cw^%ID z^59WgsLi6W$cpI!X-cNgJ@N7=9e|^k zUQ!C5FPBqQdKZ}boLSelwis4vG08U~en7zwj zrAdA59%Lf*{IvK}Agu>Se%XzQL6uQaKSKTl^zj~$H=t8A_(_a^CU)e5Q~wje`VBOu z1@BNzom-3ZQFYLD*2GyA2Z1$lbqz<+;bjHO>1t2sEtiV zA&09D&e-MZQ_y791Z{;(=EDK)pvQO=u@eK&O#C5H1S$niHVpmGzj$|gMZb{Pfe%gQ zDmbDCrp@{v<7a{X3A@Lu7CV2ZlZPX z^X}r(+3PM2doPtqw#bx9_8=tUTDd>V_dRG$$%PR)-M6vmYPm$Cs91X!aO^*gZJp*nn`AG|bI{xAbGYWXv2x9bjnoRf$IIV3X?}F2Iwf9uY~~4B2ilRf$sXF~4(oQs)+*T1FX^Mb`Hg#|igEUqt?T&!We( zhr{&d8bZ>bZ&@fMQ>R96f{zkUZRW8uD>ySEv0ei1M$f-eWq;Y~B~-fJ40gM`75`Mz zE=GYpVshouMQRDKaj$TnD7O5ZpHIURHP)E|u&UxQo@N7cVe3qD$qg5&@|9B;op$mp zUrg-2AJreFU%bT_(yq;Yn&!V}r6Zdj1Y)u1#J-AAg(e(-GlIZ!qbS-If17pI;CRk> zC7T7F(w3Za?HjX`59iDF0tPcK_gfPPw-zzUhwl|));cgNJ8jCB_L-5QYx^ffEZIEH zKfNGruKE}UFGw@D-m?bv`u=s=Zq;60i{F%(<0?`uZnX2>txvBF;Xcw~qz*g}LbpzL z5R8sIx9tW@T`7Y)s7Ot4*yk}TpW)b-yMzL>;nO?+`dSv^i=kx+HN!Fnl;*ICi7ZBE z*nd&4U$Sik9LpBVz#5XDgnN_OTfCrTYU|{htmsU)sDvn=tF)=BhAWbLnGvyyXST!y zA?>TTFFkl29$QPUHCGnK>p*bTq_B%ed&Fw7>rS{?yB)}RI)>x(7}WWbB|Kcc)NcUa zI~WfP&nv}VagPbk^;_a{GcTs!J5rpIl-Cx9N*lg`{IDfhaS6$E$6+oOXMFTtZQsqE zf90CX5gN9UBK&Ir%~##NkNxH8Wm}Yx!7$&+GFN3Hot}I2&p0z?q)PC`l$!vDC0Sxq zuXMx;V5lwQ4Sj-Kba~Sv6I+?%X~qN)ATf*;W*rz25c1Xz@NWWsLKYg2jzOT%)l%-} zaa|?Ue|N6fQRX_AO<)pxOnW{$-5?1Pw^i!-PS+MDq6`{w6%b#t_uGVwqo8fL_rV|L+9$K9NBg^ZHod0a0G}iD+t5s-BD|!iVr4xfgz%dIj^QNVx)jsN)gE}l(i97+G z*gp%wFZOSLgs7sUaby+wAK3I4;l5?wMIT?2;NhM3_tm3BNw*LrR6*pu*J83&q>5WD zWZgTod}pX9#Jza_v9aNJz(@u#^o#mE&d|lZ#%a|1$M^o(_18`)F9~;94YUjOX{z5> zEOFG$R5ol%fzzOm(af$pm2T|H-(OM#$K!6<9%BxYqf&HmK~*eoUF$sDDk+`$wQ`8c zHed=v$8*A|$Z=LWhe>0%`MNu1bM{_QjpjPo_`c|hj%Z|@j9b+FC6E9}u2}TvdR_8y zos(?gm8?|Tp3iJd-hMWYbyQlNA_ha1b6Pp>N^d`#p|{tLS0YPb>ra5Am0Og!*Y6gZ|2jtn0Cc`6GviTQ^yJJYJ!gb6~M|W_AuF~1U{rv#o zHTGiuQ>2z{g8bUzG7WGW!y3?6NOICxGHwb+u+NLq*eeoSZBz=OyOOcX8&SC#FWwfa z{)gE9_sDgo5~_qPOq@du#3r93Ur%^g`U#`zU#mHub4Yj@_IKsn`<%O*c1`J7#zy(24!U+K z-#I#tjNW#;4_SbeZFOh^0Zf+-cNfHAd$}ho#B@5zE3?m8V&ndy>!zLFAtkV=-(d#- z+=LH0MBhBlsvN8$9IXI$rWpg9ZERN0pzW%~>yu}h6EqP2XQ8DjB33gJ!Nyz9C9vDho1C;{!);`XS~YU4 zaiU6lJjg-FL|&_xP~K=hn}CQ`qbC93CUq!yM{bfQv^D?bcnp9q|T=`uj zc<~94FZ&nFdVbJik8+@Yc<`CJl1bD$4coA)NCi*_Ub^Kv=;kEW>?pspgh*`etqJ;< z2U$gIs%F~a$!zX9)xG=mCQA|6Xc1N$sbFf1h?%Ug`Di;a zPEwN=DIJ!m8*Mmcx#IK?i2Q` z27ug(!<+m|6*VmCbKJaXR;WgNCim~zAq&y18{DXh`Gh9(4Ts)_VcUp8GMj;e`aWud z+PimC30D5j+h^VW=!~azi@IY-aH&IuBpJDe{Ml)}FY%uM!yBF4R`9`Bp6tJo7+)!p zKHoc?W!~FK5?0sdjX#C*oJXGa;c4y?!+@TGf&Lrtl=0yl(6j72y=R~+r=zeX)+4Nm z>2d$&*EL4cB|i0J>H_sm$Wrh%%QFk~D^8Z}&bL<{cRSX0SFZyuWdgl;k4G*fz^Ml;A-!rvbK|Bqq$k!*( zgSDzw`*NR3$Ds_{?WH>Q^lTS1StcU-L4J|dkHZFi=YyN{2`_aAJGGV*=~4`h;sQa3 zkD`5LFyvE&HRl(;bp(W5JJ65{-70^&7Rg+a~`tW z^+7V#OyJ{K7eQ^^MsMW=lw$$kWPClfoAarCFzy4nCCUaU>F>Z>VVlt-1 zXL1kJlOn@8kgU#$?7s_+jyNjL8ZX<$&TLetMlu;JYDH(`yom6JzaZGd=7m(Cl)d@I62PiTlAY!ato3m&FBAGU>CyDLt8;6 zAbwz;_4839rh5$>{RuYb0^SiW7c(u2-!k)mxFcW4jaW<0w@%=H#sa}^?b;B%8>O3#I%5=v^`xrArJxeW&|uDel$ zsJ>qa>1Pc;d0K{E^>mNnKY;b&X)g(%X8AnZIQQ39`+c()K}z9J2XLM^o3lLVvr7y; zI~RzK5i1NcmBbn&7*O1g3szRqy^!2Wb%i+%+gv+R6hD@ztW;;dntFEslY<-IY&&$i z4+pE0S)CLOn#S|^H#nD5#1edOoZibE>Ec|A5;RgO*YHc6UnP+ra%e$`zz7|lGjZv3 z^Zr@s#NE(8^`&G>;43xfSG`!_gZFP%uBi_?+Row!#&xR#V}Pf#A7KwsD@ZfP)rP!b z;oM%hDC@o7I)#>O;Hl!97CU0C?X35EUu@zGSK{)s8yc_sk)9=_X`BtwZ~FYPPot>G zAlRx?KV3(&`xklo{s7g&bkW#drdnEPqnkhYs@`hxN^fsTfTzcm(c}UClRQ20+w}A8@y}EwL zpRfCRYa_SrKS5!c>6gDSSj{gC)^-sviR3}42^xqe9bj588m6m>`HPIegf$RpGN2McTHrea3t<-*j;@bps$SbS_>eAU_9Z}MS!^qy#*^v=4? zINZqE-l_-R@h5@-zj|eZ$P9oQMtd5}^JyLANb$M~YtxNJ#+o63WPsdT z1uBdaHPQ2uP#p<_lPuV)!HH6(?}Um?PD+}?ZPcr#{vsNwtaQKtVYy%|Qrnpy+>xek ze|9Miqy^l=ux=)yB1aw}z3x~+3KXExh0fhj8>B8mQyM@{Gbxj4#lpNYfwE{pA^VE{ zGP8>XEIDBNOp})N0!3G%F@y)w5ugdD@wf{%c`K@&m6NJF0);+Z0}W$CX?{SoXR+)d zyOhNU(WUM{&F4S_g38*!9Vu^P{T2mbc0%|E2sLblJ>;0D|NDQ}OJ(6U4-<|aih>*# zSjcY}J?bB-SP+Hq%cwtIpK*c&>_+-RCNMnEp}Hwo$)N;>2-fsrJY(NkYiuFkIDLJ5 zo4b6``H8wzd}l!(k@IVbhd_KGVnL_iiGG5ffe3@`fir`6fy)7jfkd*tN?#x0gP2jm zXuxbC#=_X4ZvFBNWv+tTf~)$r#oc8I!hsFr0KNnw2O$T21arE7=SO1uZ%CK?=una0f?~gILKcR zZ4fOYUX8C8ZeLswLXbXwuiqdlV5A^>U`jtsNr=Fwze0HAZ9<`Uf}V(c#6eI4O?)G> zzkLf>%YqE^4@86hMh+?=s1VCc3Qot5u_otkMi&T)6#kcc%7u)@sY6x> zVJ5;W0KRo26U_M65#x(v&IH_b-x`C^2E!AR3}G?)CG-D_#Wq4z=TDABH$qtEmm=02 zLezj-7V5JL7sXN}2^XA&$zdA8@k66h4+vlEvg~3g@@GuVK+^mG2pnqev4V zQLL}G+l9n{XN(hRC}0=@rQswQh!k>cGs5e21SFLwiIocyzCl5!Vj zHWVe$drFWm10cd&SjE0Fk5zH{F0{-I9Ui|E&CA&7;?-~GA}^vhr#yhJLRv= zf``t9ZD&b#rwfv(%N>vXD(NkYix**t!w_~UsHN~r1o;smSSX#x8;1I$_8&uPSr}t& zHGuJN?j>OAR+n*`!@^*#9D9&Zu|7OY5+yFu&`qY8v%*o#0Lz_fUtk$)L8%1KBA}Qd zZKn!CpFKWb{nH7la0(kk8nsoP)zmuP5|4Uk?{_YH3G?y2J#6fYo_jp=0h*d3Nosef z{cUI$KV!gfE{BeRkcqlNYVHC&V;ZsyJh0Vv5tetI@hgof&F;tKtt8gNTaPHy}CDcj4h8wF3<|I^4E5wj=_bW!Fq^5jjHlPbx$oLQ!bd5n{ zs!5ZhxQCtBaRg&bKv`pIFDoYLzX~?u;*0#-w2EvIpBxO2%|Y#nG=B%;n;tx(NcnEHPm?36g8cVvBN`P&VMrGKshKw;?4XKUFIglie~LBWOE&<(~;2UF@^+b!LvHx z9dRUycFzje@c>+WC5g?kqfVUEpi zzZTvNMlOWjH%M->fKU?J*rq@r;E7lj4+0Wg8ioq$k*1Ig%^I#UOV9patNIfYKPq^O6y2P_r#|s7rEZ{H+ff@SI%wC9K)#%tzFKGq zpgf|0mIfCfYA;lU6w@V0fCiOR5F@I8gQxGQ79T(Yf9sf=!~GkS6V(5Dcg3LU4<^D9 zhveg;5rC7dQ~f54GLnx=;kHILW2h#|BZZ%$GbDuy@1MYMxkXyBz)i;t8-+0&Ok^|3 z#YM1TR<;uOh6GkbY!Z?o@(nCy=h~lv4=IH!SPcGLrYoYmHWoHJ)t5XD`*$v6^$~L$ z4EJ~aoAB$FcnN(coNx3q(D@tN1UI&GJ?4|@t&Ja#xiNx=gsR^G} zSlmMYXC>ztlYNI`kz0+d_G}^K&#ZS5Gih1=u)JU`Q4x#Fjx?FQx&$shd-_p}QsuZI z?db;yXMbHf4c>p@6+hHn{xx&_9G?b7Kt*>Z`W7Ti1(5}3K*@$g0x1<~RQn6*%l`%` zvANm3xk-;hSf5N3j6_Dq@QAiG$6rSdOb7JnKO%3_6Saz!bvIz9@+6tZW~9^zf;hLioWMAIRi*mC07rC2;xF z2z!70Eo1ivcUDT3ZW@&*1L<)PC;%Okbq$lwm*5{ZfuulF`Zhc#KLML;BqXX#NI zw%3{1?+!0*H!9WRZwnJrsKH1K>^AAzycg#Jtt3X6f9AMmHo49mc69p)*aw&LczPY+@Xh?Rd1-|IsR1x>vnSGECAH2R z^M6}g?cOX)s5U_<)8h>23CG61>nh|e`!dq)a`QHtn#C_W`7!_bl=CLryBU#2dYGCs zlYXK57W@7&7Ee#mO;5Xep{04DFbEs5l&FuLC#>1ys zpqV^b;||o;eAz0!Eaa+XYB$b<%R#5=&Tx}h8m^D(t2%M;POX%l5)}jMn+ew}M{nF^ z6ZuIYh$hbj%F<2iULK!J6*In`h5eS5b2cg{YSqz?_m^q5sDQBZxd@VSiwD3tw^1)* zXRahwBV9Z6eA+IyVe@Tz>p|W5y)4}|I=(DhxiPYdTf0+7gNvASew$xhkKaj@$&1|b z;_7M<;m6Fkh^s54D34lstk@vrK{vKzc2b@he!QqOVtNpiCGs+iSZtcmIGR$#&32p=ctj=8Sxvr@E) z(yDf=Ppi+IhU^!d%-T0{8^Ujh(Qq=q1EWG(1@lR-6kYb)##9o7k@PGy*uOJN?C~2w zBn82l1aXCP3Y690R1q4$GMMZjxaDsqphqh~n29_n9+hG~|(+SQpJuW_lt z0PRB7A@IzKK?w6xxrf1coqv|w3MZ~lezJ!ik@mve`QQmU&aAkO`0Il)E`)9{A>znv;HEgi7@7|*jEo6v- z4k1SM7$OCiw8Vb1ekLk)eZgaThM?mbTV4DB3sCzq>hMsHdMUGC_FCLD=E7v{@|f!! zw-FVXdbhWB@DI`O%YHt8*QQY0TCgNK)R^V(xWy*!UTOV(h>yeWCdx1eZl$L?nX0Z2 zMV+^0!$4`R?d4df>WS2|4uzipIwkb4OLq1oo}Gs!{MY@UFWNC$qvFjyYxkqM?btJJ z5b&cli8~Kn`Ht#T#`-UQoM-x)P5yaj`;|#c!={D%?03&0HgwN%^aJbUd9{0fzIhsD zX~Cu>vqbE+k$dfk@r^c!*~Z%M`M(`nU=$c993pCJ_QC7>4{*grZRafQ+D=@*MiL0Q zWvA*PMAK?t?!z7d9VubO936HQFuL_(6M*r465Y{SY%1BX=ea85tlREEc?0*z_Zi1e zkHVP_ZIs0;3C7zkQf$bop%8(UkC2d4%Ef2A)sVKn)2k!aplmq407q&tZtU`JJElDu zGs{&6WdW+U2*x3qP$^3lmVE;}AVNniu3xELGa?se?WLE}T;NZ5z}*!vow{ zbT^6L(a60^Sq|3aIt;*EM##Ct1xcp!Q+E%3{zip`{cvy;h?c6>b%PrCimB{m{r6E!?5mi zU7c#e7MB}myGFCM=w1v^cC43wwy0%Nj?8H+hmt_y^WvgE<)mte9&nprFvabcbmMN4t6-o}m5gWwlFY%` z0@bp@US;*@|LdEX5};#XsBZwCq4sI(o_x?P8K4QfEZ?k-l?JL}s#a)slY{Y{k1&g^ zh)k9QLUBk5bs>tsO9KTDlb+GHJL9h?oM6E8=Nncp9laCH;6g}zt_ok z6K~S)m*7@yhsw5j6peR(P_65In-V~sHl*n}_viX_j^#5Mrl@NqfM8VmnJZShz^IwsaqJps`z)&cEw0aE~Z%a;`1i9?I`Mf zzEKN{xq2KyDekrRxC|Js)=CJgq$IjxPR2yT^3U+;@Aex&RXw?}%OuhNd3-f3J8& z7s9CCCB;5eac-0mYq{@TTU^i}U5a$8r0W_b+kavh)0ejOLDCv{JQ_?qOQ)p6P7mW= z**B1fl^{Xd@JuZYGZASG8EAA)xwNrujZyQ7jk$GbWWy~siojBBgcz|c6~Yz6@ugX} zU64jdvE-c=UIYE!!K*rO)~6UMb+qA%Rx1XN4-PONjZMzx_bVE|ZVOS5xmI~Q%3WcX z=bq{-Pr76JYAr-r`U`H>2vSB$d@I^(s-M|c9s?emJWbm@^_Eih&n(F>o{3u4*J-tU zE2V;tHQ$e9%07Am8s0;&wVS^GO%1_lY((==@9+pYwguFRk38Kqmj(9GB}J%73GaDm zc&LFl2Z-U<1D0e9HMQk%t~$tR^oH7+#v~`nidNUjqXlq6TBe_v%X7`0>F(|~v*7Ep z&9g!mhLFx0p5kAZOv*l*+{5y0#j;ku3@M^gu7^giP9v$7{R1=*OeFd{>uz?l{^~N@ z)Y-?EQGf)6B~n_OEM{~4-y5CC@vqX`&Tx~;K(BYzic4TYm@ZvtD#@qY_Z>?0a8w^@ ziFT4@lB54xR?5_aJ)xbSP-4qnpz>bbpcSBs{fjER*B|TE&V=-QBVmUw$^+ zEFcY`;Mkd+J>OzGz7oj2vV#E4l(%1*6+;u}uB4D!%|}kLSkcyYy0WoTSdZay9??)X zbS;B2kftU3q(t+&9O=`Bzk>BUWDJwm)uxNXBDh@(qoIAs&iHydx}WyYwrtbvMx*}6 zZz1Z67Jc`yseg|wlSRsotB6@iIy#uislaRf80SrOSF7IyQ&<|;i9=SaoHMS}r^kAK zn_K>mK(Q8T`*#eInvA*v4=s)Ik;8PO4nc6gQ{^O`PF?k~u_3R(>`@^2#~vr);=hK+ z4bJzF;PmLX;6IV)c5Tw-&n!tR)yu;!BOyr#*%FzRDca$?Y=>Eu4jLYr=^mmzg#ePV zfac123Bie{zDJ&lB>VNb_8Z3Q#>4BsANp?($8$h9rmTWO%?-nDn`?7GK11hStey(jcWiMc9wS zfhCnhHF6?u>dbOd=rO<6`mtux!Q|65d*5tZAKV(NQ(Q_)3iEgB%9WlnZt+J*;VqE9 zmBq_z^!Y|3B*5@5r$d?JU}o%~z_WAX;Od4IT@jze;?#+UFMmP)yd_JE6R`c!{6ze^%;?A#u&b{cvv?#>Gl=CmDj0u=*K?wEUKuj*S$ zQd%Z$lsZ(2y0v0GI%ezRtQbRMCmVsqq?$IjuPgZPBy5+ z(0?uIjDW3!nlfFR14yi|C%Ec#^#2l$NluPgab3PiGbBC9$B3y~1V|5VI^qDC9rT{G zceOF4qmt9n?wB&{j)Mx7)=rsG8uu0Raz(IVnE;{ZnTg6?@bNV^;SiG$oCFB{om?+USgR zz%m7=PNi}I(43LUt7yj6M^+(@1T@;;q3eI~DN0_SM|9=%LxhBQ(j^XyH6Cv}gePzl zRV1t>6}Kl=z`fb-ata+K!JU{}OC^iu5Qy`@N~K>@{vJLzXC@Y0zJ2TMX)!Mzpx?wO&}pY|pP^lT8=J&_Z4@u$ zz5EU@Q6`hfn&J|*RHjPnnl#i`95OJSTy!fI(J9WSeYS4y>C3Xab9xs@woAa3z%Nu7 zo_MLjh~#o_`buU+-B+F(21PzZtab?@1w^HFHI% zp^7dU;H_9;6g>a;T9-56rp}p!N3WqG;juyZue(HH2<*FZ(Ti(rUCB+5$mqkg4@FZ@ zu-bSHrH`&pTLattB4y)og||_0A?_z7>li$5GFiIDZjia=5 zWlx)zGdPVGmBAUE@j*PubHojriex^}5B!N4C#1_)xFPezRJW65S63=KxP5d!{PRKu zy>=gs&lm47s6PL5*JvOqYf8FKaSUQR(hct<(#lmBKREUQRPlpfHRFXPG*#DC_25*+ zL;T@+?se1~{Sj&Gy-ss9xrT+obiK5!a^&JzglZbs#xQS81ePR{z}iV0?~~mq2iPka z%z$3BDJPrQtfFZqYpU(OzaYDgfZ5MTlcTA_MMN)nD5&xYdU@XF~UTP z^1p&zldv0D_G_*X&^j{S>z^4B4a;Eyr zR??HMtM~OBCpf$PB+y;U?!ML4@2SNwva>AVxdqwU+&J1$Hqw5Aou+zi`I%9r{-(JD zem2O1l1j>)=xQn8weN4846Vh;$IUgbc=w!HRs%aZL)5XW)W2(cx>;^EI8(VkFGabz zaJlAHy|B=77@E7AG7sz036#TOElB@*u-4={JNbmgRN7T-&ske+KdUu9S$Q;h*Pt~p zSQ&JcVyAsN%anYOwWfwUw^9FX+w>$d{I~-@>8RXu|DJq|8ig(Pg7jsSh)cUA!v0B2=bT=Y@1FKmsIZ82(aOGF;Gin$y?LbIU=F&NjVe%)HiV%0kuH z^R7pf0#esv!+a}sK=Ibqy)I+jV9(>+YJp4^r@Z-JZTBJk^{5$739ozJ>*-VKKXx$= zd>c)R6JCXn23ymvo|LogAq^*qPc||xA9eC;MxJFyqw^Z$9`%^^E!E@cgDx!i)IP?l zj->gIijqlFt#>`(5jym@zAET*+|-ECmb0^>bXIVBC*TC>rVcw1xQf;%!$q1RWG2`+-EXRjADM~|oOCw;lEuDvD=c8t; zTW@xQ6+thQo{Y+JDcEU_V68@`p`iW})EH8cgbjO8rj$TMA><|1R4AhOiLNmHnOR-X(Q*08^Z9xC z=+$}nIhJv3D(`44rc`Zw@Eyb_T4Wh72(Ay>Hg zq52^YmGy|WQ2U>;7ulD3n3UN4E{&%_ki7-5p_WZchckjOR(*i2PkEYeEo!~VcaZn5 zh}R@QMbTA09qHC4w1tr_eF-LrQg>&Jb#e5q5R=LuL-3s=h`CB*0WW0>BiLo=R6=le zdboQrcaZO?T@Yjpe&2rUf&KU6_Lo+FV(gA2A5n>b?hm!psasAB64e@*qp>;uySO;t z%L1p$ysj5#-n6L9PMIj93u z2vElnAZ_9h^T^>A5X4IJA>sq2FDU-kCEaGqkyJ$oxOnhoKX==U+~7jPLH)1xOV0# zj%tpz5=B@!AE?!V0ZP&AT6VX!$=l;lrrvutQ6re!Xdu2;e;a`ZpIW%_R(Cmk?-W6; z!nsCgNQ`C=1>*+W;)$aTtfqa*pnZ+ifPtmYb;DG&bGFfT^WyZJFIzK*y68YUmu8Qz zf$@pLh>!zWn%p|b3>rCtc}!3e*g5>wSL14w*sq?sh5WH5`bdm*J8%3yRsG)r2Y&wS z!ZLNQexB@+I<9KYUnM-ko9gynf5WyR+=)STC1K7jW%32*&MoEGg5gmIb@8PQ)D%#K zJ4!=rj5DnL()!Beq}`MFY}+u?Lw|eU;u|Iip4Hp}q2dRiVE8GvkR(VzxJ1};>`AxLyAOmOxQJ8_-*frKf61=fmKluH^3Fn~0 zyQPDhj#cSH1%0ywL0_JpiPhn}{|E&2m`VA%bvlCjehd6gV>3RG}=4F35YaM)agkt)D7a21io*M^b5v$%yu`q*w*N2x{2dA=l|hhkWi( zUco_;$w4xL@17T}i=gIH`Q!a_UtKBDpn^@!_@RIX0o9jKkgnL=#&vFTeVt3l)}W8_ z4?kb-xs9ycGEKJYjw(&VI!B7+pN*_0OYPoc<#?B#Hb0>|QpX zv(v-0_fz-3qdBitOmj%jm;^GD?bEfUGVs!Z#LeA&ZsZ{C`6;nuO9TJs&H=u5(Y3A< zJ06HR?2j_M5sB0Ie{OnKS6=C0xWa;6`V7p3L%k!_Eav#|G5kIHG$2P4BhBgPU)uk= zZ3d$bS~G-jy4)*2JQ%Fl7@ELAP@}LRozEkz>NKX?{lEJhV z5j3>{NxU+02TBMAM9MUZi+~I!y(9?nT(%^<$ZbHI(~mzye@Hgi0e zfxUp@Ne)3t=-WFePGB)scf(2f#i1(HG5cm*{1jnY6@g(~gF5>7Q5b3H(51{}eezbt zirFQk-b7Q+Q~s1Pi#R(?gSEY94SW3B=ISlA+bBSushGTEsRAr6Ycn_5ccOYFo6T{) zRcI&q<_Ys%l)SYA+=gc)|7f<=SsKrJ!V96S6|buzl;=-o2p|`2#6<1whDLtJ;Tmo_ z2$${1SQ4Mss1O`;wX&^9Z~VK;YUrXw6?u4djRmB2h!~p^U0Fm4x!tEepM-LL0Sb|W z>I?!wv{8wu3AN^L0k;A?n);myxC$0E*WFl8PcXl4yc3j80gM7n=fw=Ad2e+6lf-Um z5hCCC$*sI`4#3gwfjxsfM?VAZj6oK1I!PuAftI&e3nQ2XeqyGtYAC?0qUtGwpx%OG zFG%0vA-Wk4%8C$YUFn_pZ^S?+G7~)W7@j)LB?qC2c#~?AahTgz^5=1J>1%AjydcJl z!Yy%dQG!2=Qwe9-?>mIYT!lGeWg_U{HOw0=*_Oi+e_*8~CmE*?qJ<6~9ZG0M_v9Xq z9Y&Thk|PD5@=+vk6Z2*WGKLR#yxn9v!p;FUB)*pV*X7kSkFR1Nf9|$UGc|?Y0`Ym9eOO1{rsQTd**3vq2PFM_HvToo4j%WP zn~jG~hGvs!zg>KaQ*`@oX;H|(=v<1E3jUs2Lw$qc)luReAa={JyM{KqE{7QH8> zmNZbC>T2ug_l_P_I}JwTqPCbfGn6AOPnsOgICj!yU(s`4TJJs4 z*x4?PaNh@B$z(t*Y2~zzk67i`Zk^~CTSCRclJVczE|Id`TiN82`n^xz6^tA6ff{P= zap<3c1)(cZJ2>`!l&s`n?_NKcxVngD~8#xKGJBtyO9}Kd)D-aM= zvBiLLm+fNQ*)6%AawH_LYZ;^X*#GJt1g$v##lXqAHgIGwq6`v{pp)qI1bYBMX_-w} zkVh8%tlDD9_8(x1f3=_(=Ihfk^Z!|7NarFs&GI8Gj_qvKxWi#DGavuUfB9KjeP6Dj z>o%8*)|K%Tnnm_;VAG8TQmH{d3^V&OawOUf5n%slDIHd^Xjav)FD>h9^)76~AA4Vh zj=KBH$mbW9ci%G5pV_ARHz_NdhUhF|_$?~^wx-MB+;gp&iZ`~(u|b*uUGUE0()9F* z44f*kz#0m%y}#v@z|1qK3b^0y!<8a%SKh=HXCHlJreJ%OkId`+n|O~XBIbWOs#1}% z^)utb%ZsgHKHTZxD^ zIg5E4iMcjCqs#NrL?t6`*+U>K62|4)!9sY1r0m$K*(pno9^a9!9ni94hOOo-%Fs&d ztUjs#Nt^1eTlZa)Foc{yy5sUBUd_8OhTK}W;^cIuk+yWD(wf+d4ppE>a_^0jmepl3 zyNaD~g_mW=?Dm&`Ki#zt=AzpPu41%GmUTeQL>wcmMiN5GV^CHcp5$5e+?5QqM{LD5 zHkq;4FX&HxlO-h$A7B!8zI=U!l8kcXhgYV~i#n(#{vd%m!9)y`4>ca4zS|w8%hFDhuMtBGUd%H`Wh9aogauai0%BJ`dbeL>AD^Y7 zk)E#~kM&JA;y94aF8+$4h$mcPVWwkhX;8zL0JfpRqeSvp%~B}5ik7%VA$OD~c z1!wep6T81Rwg9)m zZPr%m{Y*K2>fASbyP@dSgZYS4v)Y`36t?smqhoLFq|1AKp925yQ2}OLKJ01X!Th9Pc)?G*!--IiM*AA6Mm|S& zk^yP_4J^J?PQ>)tnC+HKlql$YeUTnSIJWI595c$Z!YZJ?ntBFk<#8vL zddxlI~}4_%6BMeJ(=yF+UNqwb;FgVj@~Q z||nNVw)4&>0n~pwrzW2+qUgJ zYoDrfR@JHcF1ow=ru)C>>i@-qS{CxgaB{=8D$2k$Uf#IG$g}A!tN$|X`h4kK`0vXX zElsIhR56BE$Uac@G$O*m>AqaDz{^{=s{k+WmDv1#gzBVoa%aXY>Iu0tut4~=sLQ>l z0Jv84?@2$Tc}8W>@?Czp++as{1k@Y2zhoY;jftSj`OqFEvfbgCad_2{P)c|xKi2++ zeD%rd6|a=C$~^qbXUo^Ib*ZD*YKxD(X4<#fU@|_ojZllFR+^);?pD`tcQG$Vx*Uv9 zEbm%#w2DyX<;1;Bb*XXPww$T|+w)659e@`j*3W6W%d#%}8nDkf@=)oSxE2<|`khq{ zTVBO!lCGzN=CWt^H#{#mOq3ppr{hEEyQs{@V?=ifBoifzR-_BxM!|XmrKyCOsCl-H zv&ljyDc9!}jcnnjlM&*HY7H+2v+7YB5ZY~!xhM4?0;UJS5nMb%V0VTa_WY<*4WQVw zgNN2J{YIlU;C)r$U|?(5^2u0Y;8n<&etJdT&4@3m6BBy*8F%0BYiixH1rI2^5~rW( z8E?gM=#7{soHe%?#B#9L*32~f@8-P3S$lg_h)L1Ev9Ek@7ijCs+R*z7vYvko-gvn| zH9*o2Zx-(xKC*s}JK(H%hQ_(i0M;^X!7>Gly@tKs$kw`7xzQxihrW5w_#H59yJ7_) zA7=(u-8ZYER1Pc`K{2ir*+Mq^UP?EeJOXP=eR3aqXBS8Ff1pWWM21@gCkNM&ct}wt zZf8!WbA#wF)z&PI#zt$g{HKLX4v-AKbtfk{DP`ftFBO%*Kx`4Q%Rbw61D?5W(^hm( zKXXGG6f#9IxRzGhb0>25h$#;&|3qvNj6ZTdfGfjLUzw?lg~|Q&g#88Muaaq+*E6go zKX3h9_5s;qd)?r%$iAGARF})h4rWC~a))nI+tz3Iq zlWo=xE``M2M*|KO!vgPq5=g4YDs4=)+V^z23$k^O){z+7QzP9F;2b?@Lms`{+B>t% zNnPpIFwuK_xX$rZ>1E1Ghvl?y{;~S%IKN@Mdqv7LM_FR>=wsP~cI7lhB>U4Zq<3)@zNEwa^xq5 zVBFyf=y&k_-X*&!0zT?8FstWox~-iU)3&`BnkI4|@^?P((&^+}HI{GLDP=CavWcn* zXA@s(Za!&jQ@?E!*l$&RB+#oF>t=0K>ErS_oi`na*g8C6w34!?DlU(e*gf4*?t>?6 zS+Tb=89A`jy^T=I*i4B$z(28>N5Tgz{+-xblK9#3Xfn;@22?E=h%tyi|7%+h5DaL; zCDMcn=+)1KR07WsW;;F>=*alm0OPo?SbjC3)<~l*tEp9DIAynms`Ng*_{HATG}qg- z^MIh9EV(?n{U8rzv&D+OQFb%2Q8j5x^BwDu8@YYc`7tO7$P1)#tW=k!Np+hSUgyfE*qHmn&+I{x62&pQUwbAtNf1~5yCX)y z+>vF=O7jMzjy9FcGc@dWA!NDgmQ%foyosQ_;zKKED>LD1<-Skw?Z3vy90*mFs*Pl4 zvkat&1g`ME-k7CpImr8iU9mNubk`L>a`VFtYZf1?f~uTpI{H|DMt&_YK!y7)uK5{O z>Hd%k0Ctk(2Cc6_5ttmzU`}-&%s?mQ2uYs6>9;y(B3u*MJel>|Kg3TNf?K2c(@ z&v>ZhQk0ZlYVM(FyatrSyL9T9KOJ@)v&XKjAnbF%X`ebc&;DQ^KU;y}(o0^Ozi*J3 z0Af=&oV$`Duzpfx;!KLX{*Kv%KH4rRTup^sO?q@~?%$2NXtIH#x>>@YBu7t|h>o2z zi(OjR+_Rvjq^{Ux4HhJv9JZOf9Q&Ar9wpot(sq`DNh#xNC;|Xq zhOD04i*xB;2KvVQVv9+TT~uk4(H}b&0N3!^@#jy&LPaC<n*3Qt!qOst^?I@&~$e{)F0-bb0%9$EeaDn zG4hf#P-Uxq4)~kYcn=PEs(PMJ-Rza@hp+iG7vi2esD9H3&g6>G;Kd4&o~X&S0}oo6 zISy(OMZ=9a9qP8n%|n-}vt|(@PrcC=@h3GShi~(#l9tS|Usjyz55*UnGIFvgO6= z9^6mgk3tS9xhlR+i+MS8&w1XDQ^(6)%ViMu>va`MZTu>S;kO13^Vtk(09^6BtK*n) zO{9pW?1i=b;mgkY^!QdSL4!siOk9QwOCP7kw#`W)mJ zQuJ0}UB>kCvbu)q9mzH-w81tVv3s7F+Sz(QFiRAuj;<%c1vK_lwEVxH*)YSe9p~3! zEc8jR4k_qRNRxr*Lo|vs02={;9%0%!);E*VS6Si8^FKlVa^F#+qYjYQW@xGkFgwmV zlTSfT{VEr=1G-LCOGzzGzJr#O*Zd=o?UxK9o=zP9N)VNrYk29=uYVH3Z2(mI9|7YB zxvXE&Fl!4csfS(Z;=~0O{*6@g?6Q>=DMc1bz?I|RSVX>x0qH0}DA`o6o^*7kvH8=I zcydnvrPy^VO0wV=ZoDT~U(wxLq~=>K|A*PXCZpf?MIK928CWaa4KVdL?7U1bhvm<4 z<0-Oq?sK26{H9rM#-+QYe3Kq}#Q%s0&toutS&8k>eg4~o*#*sb4{m>5^mSf_ogA-< z^G@3H9&rCLnj*OYw#Mp6npw=$x`>L5kITjKG zF+uzK9SW&m6#^d?c@`E@Dc`h^r06DK?%rd--i23}`k4-a)OQVaNH;rgFGrU4rr9o3 z@7+}KsQmhVPf2kJ%AV&bX^5VMnVagK=VbkNWNhGjC=GWEihD>-Wz6Bc{w{`A@KP%g zp`Fc{8c)=Fq?*y>{NI2Zt}jT&-D(6V1OgsEl?g`d&Q@Z5w9xWCyZM#3+0NIv*XBR? z6=(E;YSr(+N#xJj?Vo=O`Zp<(hgG5qg9G>jyr3jC`fHm`7$+Dm_>{SnKS-Wvp_&Su z?&!x-OUqN&MtJeQOS=w;BH?x04MIM}Dh3?;i9;C)+cEg;j{I$AEgp{l9+hzClBien zY#LviiIwblFhIQ9&(xkDEuOFd$^G^r;?UCaP=wG9D5MG+WyFKIQHZ?QkzP8IQ)*!mRf|Fz{`1l zo9p%kfQV5!NrjfH-h9OSrNz-P)Nf>8@{*lcbJIt@9O|kO?$Q6%$!=@j?3~0L0p=WH)<`+5jeK?w(D)*ij2gwP&qmE(`TWnK z?)LOD;eoy@yc1k0H?FZuo8OKjTa`0reX>5L~`|2>qBy?rCw z@U$iFx}p4FgzTa!g=dCV@nJ@?VzINZ`qf;LS#jI@OyJoW|ag zwXlb`s>(KijVMQiY`x1Dnb+P!%q^{e8WopimwH05(B_GCtZ z-ngfVQq@<`EvjSSIZycpM2{HrLH7BcP$B8@KmO64y(uu zBb&g`$?@yN4+5IpkIV@L+MgtZY8gWTMbwID;#(NP;I}YkjEWLyj~zqs_a_Ksx~I)6 zpzF$e^XY{@$V_f>a(r^~@;~zn3YgM{1{Xxe+-|l-R)&-Hg}I-ahE~x3)Br7sdu#Hd zAN_3V@PrQZ3on@SKN*15CW@6RWU>b}#^Xy1%U7^Jl(T7p#tp3)nVQOHE$vs3eD&xM zwfaQA)s@`D9R7^Vd^fR@HvY2tn@uHNe^QmugDm1RifIN1O=6-?Bw3|U1yHYgN`MZB zW2*Ns^svBV844&VC|!ZL=UBY+gZOrdU_lNIZ#fzM=~~M4L3#aUP3E?rXVw6@>K*-3 zyI%61Paiw|g=ao1DMEpw9-eu*Ci9)L-87Gj_*)?n#QK#pXlrFfkwDW(-Ubv@n zesfGyga01jKPR96XkL>M+FHpV38YfX1P%!Nw-(54F5hYp29S;e5J`|b zkSwTY#DBLjfUtlNfGtz|H-v$G41lC_63K-CaB1N70Xzasad{}c(;&EzuwGcHWVP8=QFu#W;i5JRG8`J{O zO34PsPtpL|gP-BVU$ZNz1Eo)i=%yhoaWEt-*xe`}u@_PkeYrn#$sHM%gInOF?PlFk<^A2G2XIx=r+ zwjlgGy#9|O2Z>KBu5Ww_Fhitdz|Vi+uws;=S#E)+ojRjFl70^QOSpmE(^%(_Gz6gj z2i$+pmpJHP*O;`d4`!C6xU4phPp)IYSm(q32kG~_@*xCl!20^$cb!P!y1`ewHyvRg zg3G@S!A;ZO6@oz@YM8PPly@3`(%^Q!`lf(@?pgS&pdBf4-Yy^o89(o*G8MLY{?8p` z9P^@oe0hYw+6H4iG3-CRAFFZRSepK&fse=hWFT6~QT)7kYl5JqjGJtra;TAy3kBhQ z1#=Maw9*g@fLKZt1*+{xSmF;Xu(qOAcBsGlONAgS7SzzpkS4G-$>WPb%lHV8z8sGF zk$l@qxq&SAZXgBVvU3kNJr1($s6;w0Fz&;`9yw|dIpUC-BLq+^Iao7-hK|mD=vk2x z8|3GjWmev8$c*MlIJ6Y)^fbpR&k?_f>Ml%bE=*)Jf$*QO(|^D)<9kC$*<$QNA@+jr zIk90u)4<-2#3jN=O=~@UE?DQzKe-rU@tFGD$|^ljBjvvb^08Y~JfAqF z&?_n4^H-4bkhl*zR$EA+_BV;(87g#Lmoip354Rojyhx=h#_QQa(0A>NKp28H&w!7za_@02 zd6AC4ICO?LLp^looa22RbbUF$%o|EDA?)4OdrBwFP`y}@^SOAD8{>!a-25ahZ#sT( zP?|y}DWP}vAuz(ikp^<*@zRDyAj7hyNapVb>Vy9IOFnuaMIky}Le>G`@gn73hlKGc zfSs^@qYnwylFJvLJwBh>bi;51?Hdl6%pRePwYN#orQInu~6Vh>ra)TS5+fh&vcynyWDVC}$ZE%^ggO zJ9oIbNA(sa(DwdWf6NJZ^^OGj1)13lVx}eNL zLamb>?WbB7BR$e$-I6`rX&cc6!)QC~Y9Dc|-(`5-jm`xzfo}qsvdfYxxA0r*;W+cF zF^-7T-|*ixv}WsE^l#yH5h;zw#8c__`0xAZEf8rNU91~tE`uKh$C2nW9tHFoG+CSIz-=zrszk7Z6=5wW9UyVn<4Mn*&HJGR`@$_E2!%s}?z>PYE%Ja+5 zL#$Jf)EC*^dC>>xOcHAqYX)3x+4n{4Cqb|9@U*ev>B6C*^~q}t;j-)s@<~2^Km6Or zc==W^;q?tavxcV+bBMdgWstoFLl<0Cm?BtB*}}uY>UiIdB=L`97@52b3b>hkXwHuj zvJMEkpb*CpFmeCnT?R8h z?&mazh_WnzCR??TqL$I zP0-zX!~QPb$~eu`rTui?`Ev{vWAP4oyiXoGKa1_%+(Cns(!#YSB&=k=Ox|}@DEku# zM=<(~EHe~gb@^@XT`N!C`qdxL9!#(rTT=SN2P#>BZoK+E?fSW@=i3q?TQ$?3GZi&& zL`cQw!#f`>MHe*hJ0GjrlJ!&2@=vBrKKjH;*hi1wZHC2dx8kLhWH#3;!(ewGc&hF`bhAy4`n$nSlQP!KVyFeeV664LD^djAdiLjD; zEt)4_sd(%2(MR8td3-kl;+Nfm2*f_|ZR_ek9QEN*PjcIi9;ycP4_*`v<>HqrR$OE- zM`@Tm2-H;L3=3A4KVro{_PU3EUe5K(e)E4fBIFa=OljWgY#S}TR~S!&4zGU#9-37#$GksfO!<Iz)1l_pj9-NU0;27gWny^8BhBPpy&DB7h4`Fh+@ciBgcBz=E;@Gd671FnJ3xcW z4^H}z+P%A<1@FI0MRzS^F82IpjTZ-e>I%X~9>nkYtuMnY9mG(NhtH!Ako;!W@4d3j z1|RaxCM3~53lX0?>;m5eC7uX+Y1OrMb&=M2xf0{tZtk)4tCtfa)TUN&s!9 zGFr7n!SDk2mKyfKrfWpwUi@RT=qXQAXos6F(9Brj_S?D{PkAX%nCFFr%SY=R z?mhs?cFmS&bb_3~{8~A|J=+@~>lq|*n`AKpZ|#t`YctO8l9WvEv2b6&3Vu|o!??9! za_w5RZG1;+Ho}55kh*mXXJ+sh>-hRp-WY&bs>EyvuhS-VUuk=cLfS&mD#?NGBVknn zq^VLYqcxeW^^;*FE2TCu47T@ww>(@Mg;tPSYh$dmZVKhq^nS4H(10v}R5gnMyeA0KC*q*G@dtsRqeEaW}X^3Vpj;xWFdyjz$bsBYZl zg(sW0lvtO);`7OqqOo}0c;#{-5O|&?dTCF;3GHc-UAgLxPVGo3M=>+*!F#`Kuc8fZ ztmRklYRt0zkbY(5yzB3={+if%WsLq{u|X3pU5cq;Ir+Pe&AT<84pU>?HV}^GYvwSx zGdPD)>jp`8iN^|b{VhGeC@U6{w!*gxv4&-?${b!Dr-^1R98C`+Df`)yQZ*S2wUZ}7 zExOZ8*y{7F+@MDc`IJn{n%e*Kw%`(a{{eGUPUuqIyo^f}zZcUO z-TigLFw!>s`%yl*GUpi%Z(S67J%jD&PfMthd+7Ux?pGi1M%eX`$zR)6U}dX4iq|^q zRr_5HI=Y*x`us-(ElYgV3on7{%$^$sckap>FZ0Rk#^^KcK6A6Og=RoTvDRQwBxCIx zYrhy`#}fAxAOH0$2Dw2uRrl3gc`E7?I^xEnqNn4WGTTVQ(@=T>DJCej85cR)r81`x zDR^sD$YC}xS=Al8NW4R!$%tdJ5|f+qv>mwxTYSAo8sJg{7qTwehz`kfn^m`P5a!vf z&;F;kl$3Ik^~k2+%JM;zfR^NtMLcnz)z*0Pusxh|IwSBfHy<@l6uOVO747nsa+&_geixR$t{ zxR#P(I+?C|CKpO%*}@cx63fZK%ol_z!C(k8+)Gy#_#<4{?lmjQ zLt9^`rc+^X9r-0G+T;Ds-g%MgOf|8Dk+wZ8(5Dwz}T=9Iqfr~Y6&puviI*ng%vxNn0w_(3RE`H{#+~;FZzPQu=KxN^xhZO;jt%HE>z%Fy!QXbHg&!<@=H=y?RSQ|I4mm zc|V_4vTpdLa53R8rByE0^AH{x>e#foulaJ0)0co+pKgWV?E<<_*@7~$wI+Fj$m~v_ z3BQesr&-ZyV#gyZDL3{Ky!bg8gO8_Jtme$8ru|ddbyhTXCvT2yYjrgi74513+7;ZL zrk(sQDdXz>< zg=#!4Dc;!*&M0XqdD{x5`)lyuP7+|iN;|+7e0X*jPS;5a(U$x}NflCrY2h`i+qpW< ziT<<@MR9S)tzh^T0q#Y4XeVDmln3!xr_Zev@?bKam}~HoM|tH@Ec>!L}EVPLv*I=-G^4bH`G-q z>!+P6BQM=0_{+EF0)%dJV#2JmBGQjE#5dWD1+`v+8qZkESjV8fE&KwDSolZ#k9Kfc zv~3HlZ;&-ky=WR8G;S)7xqMzjxf_I!ft_Y}tC?T5m8FhvKxJb#8U`wG4v(U^8{pnW z8FW|!?q5M91f_;om9T|hm3^ouldvx^-g-a9Rl%bQmh$PjFk^B{@10h>n6Mg%?Nhos zbMQiSs+1#?@)%mQX|$A3d8xkU`4CjbR<@ujb?l9?Eys}1go$5;XVGcseXO}%j{+C? zD^gq1S+_s2&n512iX{^ez(=Cv2;tnT=P_3K5qXO!$WnHE=T$<#l^8Cva zN>`ZoT{$L5xHSRidaKK#GtulaUvWaUySGT1R zE-H&6;FfuqN0Q*b9XXGmtdxtIJio8P_pUCiPCLHQl(=W3lCFw6{+K&`iGwQl;Dp3< z66hYqD!b8s`x6XsF$`a7-@p~0CLT_OB|<`o^NQ;6TvuiQLL1A4Ka%AuUhP+Ic#XiF zcUr~Kqs$0gkS)s8Lq`8@>uiN5PUo74IdF3)VZzhs5+?tEFCTAxXq;&`3vo$QP<}_z z$>&N7?A2L1i-e6HP`eu$$U0!dnbj3VHyu@U?b?b-C65E%PtIyCUQ-$*=A5Gl8gzXA z!4hxuND7o-ZT_A}sj!Q94teg*S8Ks``G7Z#{wtuW%G#tMzA3NngPr!Ya;atE+5K8c z#Rnr;T=Kt>hKBG*T;^!p4$Z?<{O5H%{c7mtyP~fJR3wv+A_b=Bi_ihVoJ429N}mx+ zP1>Tx$O+h!%}gXM*|%HED#n_`mVCAJzH@0KxVKN&N;sNpY|7eeZ0kKq3iDD)7r7cj zWq_4@c%ckzD@t8T*jEp-4@J<4d|~NteT#E9N@#}Dtqw7Rah_{u?|p={vAhpG{zEH1 ze4G$pXEH42bmoK^!|lqzLmOY>%sXgl-89|dT?Ondc!Q2^ zIr%8v)YGTa-Y@7pc10CjZ_O`+jQ4V!mT0@Fw(6cZOhryumalWT0z2xpEF{J&He+yC zVe(`pr}&m0>83ZMaUSv09!%hmE{XuIg8ke0ob2~3TY;cDJ~b>AniGukujjc%dWX6o zBcP={f^2RhX{NdQ*+Kwy#Ea7fI=R86A-`u=lFi#*ElzKAr7GXj`OW!4e7;0nMEmuW z>jzXi4mqO7_`CZmUGI|+Ft0Az$+O;U8CmPSB)JuoyXX?M<1j3(`TEFpd}m6WCS<$V zs?KlSg-mlGDZ*s)jquu9DO6BkAug{O9~kPieJ1If!<5)-&y^m%rJ<3Gf4T`s)w;b~ zo8klxC&&;_98M)F>rYR!)_7HK^fwo3P;Aw(2xA!z>M1k1Q2VN3$7Z28yj?ou7*btl zes)NUUA^MjQ}4Afho1@@EWWweFvR32Rb@(4lrq73m$`fW4)BCvZ$VTyHq{Le04BhX zO0HO0>mKO2&$;E=>e{0k2YVF7AF8IC2bcYDc=l{L_^(2}reK#5Tz2-;mCdq~AQlX#A6%Qqbh7<85jTBmjRjmG<2}4(#1X7#(k*ie-w-%8LE!QPs^&A;B1$HxtKHd8dt9K^e z?h4Vr=|Vv=Iy<^G+*vhhYqwV&ZYm~0{oxw?mAoQ;!ZpSh^GueYTD&S^&CwJk<}AS% zrGN8*lY9KhJ4vr;agZt=D9jbK6eN@tBOb;V<+H9@S!cMzR|rQT`Y^jd0+96a2f=yD zG%<2L-qim-Jh+Q1UZ0zgi@wD$mNe_~nEIZ!8bf1Eae>?Ut6A`oIX1VHAW4Ev^(YF> zv$HU7{w#DtkYelQlb)JBh|xOIKZz@I>{%%0WSPIi-5Boo{v_MsatL20g)%0B-U5H( z^d;|P{b_7yuk%xgx1WsV1K=P|8!2tLT;efnR>&rM?A5VZHRZi&FP!dvKs8v{s@|3D?YW^2u34^+A@m%z~8br337!*G1aL zfZY)1RIAS%k?^Sc9Jx|@qvhRc8b7_KE~&1b`|vUHrpd;O$36L?A0Q&BaWgI(yH{Oy zS^AHDWV3j|Yx(6q#gVnNnw{X}zu@s~sb_lSv0Q$A_#wn1eDIzuQ>13@=r_~eDC$;O za3@=hc9txX#&P6hPN&sof0E(5ANBVqN3bk-MTjt-P;wrpa3GC|nt3I6rvUSD^atHN zcntzJ2@X9b?CMwd6Tt5CGZyMTHauQf79=34H$<3NwCcO<0{aH_hW$e{!TOE2+>Lqx1$Z6mn@tBX;sxheVSz)3P zDjMJ8rsz?%4cP3TdwXZp)o3|T(RiP6f68|$P?${p9aY4pvaqY6?voODU~2aJ?z405 zCD|f7)m;;F6f-F`wdCN7nDI%PVNv|oQAcSjq_^#1o1l-)Qk3&hshlvkPSa8Wy(&j> z#TIC>PiihmCwBJhH#u*}V*X$yMtyrOv9Q4RWUs(KR>1TKqdQK^o>;6AVsWtc8l+;hrRM z_PSiKHcKgxQ#`X+hoi^AYInWx)2pYpZc~B$jIFPc`aL?|(&pG*byj>6y_M%To@Js@ z1yY`y4?E^0{)K!P$Cguo4{=+FJ*%vdtj+j!nUyI2QYN7%mL$DH$y&DO88)5M&Fzr* z8-OO&{xP8j`;7f6zyO1Xy_n(YaCK>&uU11rCp2rS7tqgzIuo;&uLHR*** zjn*z%_PCBcL8&<7KCLQi-oUL2zwQ|)5pbDV#NhwcGNRv{RCLcUUEe9$4B5fRi*w<< zo{3RN(s@6fwH|!nX*k&%#GPSM7i;TUlq+S)quv~0PP-{K)wrnEM$giq#;FoZX^~s6 z7(E#KhmjzcRmB)=EnAU}nkA80|eK@NN1pUunzVt^HLpPaa}pmoTU4+O3yA`%P? zIbtZq8Urf4BoUH1g--}{a{oUhK%7ES6t*%pj{Nlg-kxg4l0gNPGyM<^jTxwWmCZz? z>1O`n)%-f=p||HG9)9nBJF>lC#4TJCrv@kpKL#jtnAny2cIUVKU%Ymo2QpyV#w|p5 zY0z43K{4N-qqgusZfNH~{tBdzAMxH-UOqwf5-tP@C(G7|S_@wMqp3*f{j;;qB-#Ck zl}+tNhX4l>aDC;iWwqzEG|qYy1{w3nLqAss z2ePp2{cS<*W6I^yrrQg!!}=4}=h&h?#EHs0d1v3}-I|TK?TV zLgz;kcCDkFdmB}7P&vNn5`Mr~Ax_tqXLaD-M=mqFrS=8ZEjrvwU?6WWg+WvoHS5x2 zhBi|io)ldF)KuZp)=O<|t=m`6O9ptqge*YgOw3ppsu3mCOYLv|%@S>3E#P@*PFDg@ zd0&rahMci1f7s0K(isA>n40w~)YAT!%B=qXUi2rZ{&;=I{=3=Epx5#`$^{lbmQ#x! z51_gh_^h($@`u668T^MYp;IH6b`GUh4~ja{Ow;rNu7~MQzT1W5Rx1#W>5u+(pi%JpPODpocu$ zINe14N7+<|METK^8stZ?If*f&UumR)E5tSupN7!lvakbcjbSW6zyVDiQ*`w(6LXLz zGym;A6@3o}0sCj?Y|uRw_@#`1`cDrW?rWJ+er4DR5iuQMQ+kXdes5o>-_bj?xb^g? z^X1c`x;@Mnh5u$!Ys^TdUH7paC&+A~T%BWSQI%}wZh(DH_^}iu zGA$BfKrZA@ewQlQQcD8}2vkHP@SnCWHf%1~sA3$x{V}3vf}RS7DB>XdLOs4D#!S2@ zATt6BqIs}tvU*${nl-_&%6vBBA5`ihM=%g4f7OTpd?tlI z{|n#7{|Dc`T6KKVbe(e<0+5Nqa$Ppnv5|}w!P21i4aKc~)`jGCQ6Z0p@L6dnAuO#$B8i%fEeoJ z$ID=p|9f;!KSWM#kbVEj4{W=#C(^aJ`or=&8>gsU7Y4}Dx!uj(p(qJUj!BeUGS0`2glJp(9Af#rkzw&_`ToD7BMtdGP?Ti5`pb z9vjb3#co7oY=|{BSz0;!>P&h<{R$+Qg613=f9P8IM+^LIVFaooD*6|DdgO}1dB!x$ z_wP_(prb!vuSo}E^ZqoNMUAE2R}#ylWr{yQ9JuHzj&sLL>eE*DCjfjGB};-B!3k#@dc z(!jHp16)zM5w)LJC|F~YZRcNAa2DxSj0Q`5+-jfW!`NeH4~$|z&m4EZ^az3cu7({V z(^r+$rxEP(k7!#Nw;iMar$;-gbL$K^_jPq$EKgG}v3IK8i;#tEkNWSCWAi$|*KpWAjFUtM>p#&f z>N(x5zZrX3QBIZqek`2#NRhiLRhBN&QRC?zeVwtiTpL3Lt-6?fU{>RJZdWP-XQat> zx_U_HI9VZL_Igg@5G*W}RgJo?4_OMObWrJ;B5O!#CvAd}ZJ z|5eHA6@sxTDpB?veo_B!b6&Ib6i~?_x-fe%4=tfv$q|;KWa8Y|k+1_{;BH4cAJu6> z{v;42XhnjpbDR+8W5PyF3+%~rds^cpd#LoM!W*F-L(osbS!DC&`rBVZ?Q2{j2?^QN z`DR4~*7kwC^GdP7%{&~|`4P|->GWu0kF>es)T;R zYO~N+B=2Dfz_bo zvQ7|bVw*o!a^uY>E{KiLNp-)0%7NgtvBWJhArC&+_-4urqNR*@%O;F7GGXCvlQ*bc zM$y=-4Jzd^az2a#hcvvRz?MMen~I7zP<4I0H&iur-Xz{e85Ga39t(-s&lb5igR@a5PsbxjUVB}0^_#?9t>|fnrRnkP(Hzl&wh;b>X=c%#M2m(Htb@J>F zO8To4gLF1qrs6b+pSz2Ud{QMpn46yX#kZ_sbL3T4o0fo1{Sl^2<|OvjPl>83Oj7wP9v%5Rt2a>q>wjO7f~h0EJyrc!U=(n@-G zSPkRDD%qq(^?LPkk%_GMma(yC;cw7t)8G_B^jL>Z89$%8@-X;GPVNj(wi`oipb zV98sZajZF`bs(KVjUwI`Mg2{&9S^Vks#sPh z&CKoC!}qG}4N;nS_Y7v^{Jm_A*{s67W{t%PlIUp$0aM~)pg~yEXwEvo>CQ>T-VgNr zG$Tirq59Pt5uH3uHiTR>6`i+7g26tHX?!9XVH!olfD9$GXsh)zY^xP%h&|;LD!-ps z-DttD^EC5Y7KJJ1ah!>N#)J)IWElVCb>DUhLFi`g7#9wny;M5Ad>xcP>w<^g&URM_ zCaX@_w*u)*AejAyh}HV*!0sdY?Ok*@IIloeY&kXiuQoL6)ownt@rY{})C3YkQkb9S z7A?ultwe(Cin7UC*9I@1rvuubRdj=<-!uCU*Azx`?Z4ma?4QbV>~1=_8F68;M8iUF zyFbbv`kQn6Z$nGEz54S*$auNJUgz5W6!iN>cz+Nw0alB7^|^TGJ}QBugn5J=RPgBXg8=FdrmZJ!aoNu&PAaOxk<( zus9BF=6UtfNvNAiKhNRChCecJ&yy6y2aYrXm(%g5te@>Nzir^QPmxgaoDS)v(eCXT zJ7hUj10BZ2uFozh-Po78LDz0|5j|O(BNJ~f@H^U~XkL%hRo=QSs_d58O#z6{6JU^<>oH zYUX~iiWDgnIE(@$y1L>wmTXR*%}(~h=IkDQRaZ{c+X_P1ODf@T1=sL&_(=JLWdUze zZ+YZY=-^I9DO@_qQ}B3?PtvQnZzb%m1q$yB&4tK9wPd`bOc_7a!oun(gHS9Wcs;mE zIMuX=*r2~l<>YBIVJBdien_3MwV5O6z)9;MNLwE-D1l)d>i#;p`mGac0D%CH@EtR% z51A@f1TQy)0UcqMOV!tj-R}y@aT)mQ2i|IX$t%QX=G74#`QD+kaZ6}F;5CIz!ra~X zoNUy}z6#Acy_mk1n}>7cMDYSRWc=iQU$SP*sJ#djUeh&SsqRxbuufq@BGTJy`a3tp z!8>@>=28}$iKozJTt{sSc_CQk93hymahzQ(ZJYHQcMT|V7izwp1U*s89spb)GwqIc z3e>qf595yY47wWL4ARqJ&-Xv1vjzAyq}|+0EhEnxOZgdQO#+G@(cItUaG-4C)a4Pb zJq|(F6*;yCN(c58;Z4>J;iI6Nw@=%a<)T<^Hs`YT)>ei{mvw8a4+C~{7wpU+ABqJn z+H_xQbJ{~9U4s4kOi*4Wn}HQ)!zUxrs}yJZjdIP{)b&7KBKs~d0rG&Rb*#k8Vk#UJ zn&;bIm*4-8%K9Ul*VZEe4ui?N^6Ka{D-BkQ3CJ$ladBwe`x`!o_u(rQGBRn!5jU}s zy>ZkBo}Af<)6P<{aweveJG;bS2kvuByxcA1SS6Bs6eww=d2_uc#=udZ{rs_ALfnqR zV_Rtn2H%nAQoC7;_KNT>P9yG6Se{q3Bz&}Z7bm83u-(2x$EP%5bDO`EEHcLWr(_bV zPsI2Od2rLYTPh$dxD%e|?OWDYo}`uRn$g}!Uaf%Os4rxEdr_#VogbE)eK6;wF_Li(IWGZp%^VULYm^%m(JvLP7BtxM_7-2f@f&yYch>t%q`SFj%vN6BR8NP4^nJ zeisr(VB`{dI#{z&bK=CEU>kVs*Zqh#GUWHI?v}rOn<40{1q!kGO3l!xZEdQ%P@KSZ z!nMOP6qmj>#M1EOOl+3AW%bFeuiwyvppO>(K_@qlpG<5gdT^kQPuh% z*+;Ww^=6j$nuxQ6x?$Ac!Le2#<; z8na2g2hQ%Nbf!7AoZqFcs^ET3#YdKhU3?P)Dub3oyxLbuu+FCFxTu(2cyYK$^7eGMP#WBJx6S4z zMS4qV2TI~kVTjofs)LFG--E;w*0g>&=g~we5hrNSedjxbm4w&H)*T}P@%c&d_F z(Phj))owF%Zzwg=n+h9CvGAsrTuvgsO!`>$1|(Rnr&0JTz6m3~rD$W)tCc18whuOm zs;|E3S|0kDZ`HCVi@3Y|+jI?iEw#tpoftlen)`+HJ4$ZJRN(OewYyzAoYX*Laix&^ z1$02{cSWJuQ~77D3W}y0>Tl!MHA>MYT7Gz~CEM+Bm#R-(EL;9|7_$OK%?suRWt*TR zDIoevnw)6ymUSPQck2;^rJnS0D|2N=EI^E#XjMTgz18N_*RcRG;5}LG0npqg5TI)W zG$mvALa8sY6(UNHuJWHI<{w5*@TC+vL^S2bTVnbzEIcFaECJzhQwyMqLL}(B0vY3~gc6)oH=cnO! zx!wy49JZX;8|V!uTMyghipX2qvIuNjpBb*bA!Yu}_P*24dU3^Ds2p2@x;9)I(fPxH-Gd+RvxTQjv4sax@q5Kbue@2Xj{i7{L?CgtHPEm z5Mk4SrH`^g1?aPd^Zu{d^DeIBYnUmp9}N?{>pi{lxER8jC3hW>^f-Hoj;JOg)e$YgtASy<9)atc7MrL@EIzB%*Oa{>*5%W z%7#(}JB>wR89F-p9h1&&k5$fYX=x1gsp=W&R7;Us=J$lBS+UaF{4!6k1!HhSq11Px0&TTc&a* zz2w}Q=Jg3rsC7G|ziLFEWiE2(F|MLqCslME;b;bCm&$UqZS(EbQCnM)z7=czuw8fq z%D;FfHkZ%<8C*5WOXJANyHrVNeb3@ycUb~d#)Hzq=kW1-fYH`qFioh{Ot-&|ZPv7# z%e6JfMczh9?KI2k#1qW=^sy1KJVNI%Ft?&IgvAc_J)XVVf_u?u#xD#_(u3KbyDUhxKt?!5xV zgZQ*+RP}*}Gz_tkUyUn@AJ*jcCdHufq->&legU}la1e_~Bq6VZJvR_OBJl{XQ zC$aFxLhI*s`u%%0Q`#i0#6(zfvSiYa@$<(#jHDM-IG!9t_+!I!Q!C78cg+CSGu#An?b{Esbrg<~9CXvX(>mMtUC?Jwp+fcNFh&@P54 zK$}ANx8%Sjp1X8DK;tyli39QV!O74{*wj(D$n|#4T|y>6wBJcatELrDVh0+bGMrSLKT7lNw3Cyr8P1MAIHLz_+;Q zg?hp*)K9^_3uvwS$nSRxDI%~Js*oL6Y&AqnMse(LTd+^s^ z*}>LhAAhupL#WGsj6{8!B)^A4tbvTUuDN$X9^VsD$3$K8>io2m_{nRl9s~V1;8FC; z_E64@hNkkpZd=+~-0~s7$!LsAe172IsS8bFI7(&O=DjoeDDY96!v@QB)Q@u0qL|EX zylR@cnAm2bVd)AuYF=1Lz*i14NC{~YCLr(yr{Ko zET4Z-J>CWpchbU${X6yuCH(&WpF#<2CIgaqMDC6RYGxq`Fox74g~iRSJ&nvLqe?2k zI6zrxi}g-RY9hwuQ%v@A?%q(nJL8`G9Er9KW|ZOAZqCx+D6~J|W1dmrJeyZzzCm9C zemLMr)j)X%D;%aSTe9SoS-|E5(uW-=m!(>`hi~gB0sU?3SzPeOv{rwoH!O__9n;lK zWmDkPRJ$+tn|CJn^_|g+kP`mg(1yi1Gd(?Rh!iI=5YetX1^k8HZ03ZO-^>F3CXsfd z`Yx9Jk_@A%;e*QqzQ*IXQT;Lw7UCGSVAxK8h)_WNFy$QAhsnCsMZBcT2lZ+81 z8zK!OWYZ?Bi2%ZdNSZUbn-&-akQq>56W|Jv6{s7$9(N(c0;m~yJ&qn?UkqS)AR|aF zD&PiSOrROi8w!vQP(79&A73k9d8k~@9)L4YJrF+R3)qgTFN|O}84$1fy)dw+p6`_v zBKH8Wy^t0n`vB-Ii1dvxNUS`jByVCBzGz;_yP~CDv}(xjk5QwM;1Rn# z#m`WuH-{OJAVhOiVs%YvL-fyM>d)$z6T~}KiiA=hel?%i*g0kkv(y-Z{o^BZVnDeJ z$s1#6{ThY2#B98T=}ZZZk4+9av9Tq#y^1Y5IMvGEPaz*01I1W>N3gi2-ehEf!k{-s z38k@VtL_G35sW=saxPhsF)-qN2C^v&!#D}1dQ?+IwV==$1%kB-NqLmGJ8J0Hlvdf< z*t`scw1e*m<8@84=O##7K9Ycn zxbFLAMu6^!Nm}`*6TLYXBx_d09HHD&zMrnN*H3b*ARg=A*WYvR8%SPq@}X^ZJ8FhN z%935_V)^5$4s|c5^c;{#afvP8 z>1Sv^55#`=0E~)EsYqz_45z_XQ|_ z*$K@E=1zZa1Y_q8;z|$)Y!m!Bslbja1cnO-lQ$AWH0qmMw+~NXEqrd+r2H-cFc$oJ z^|{%vix#k`h;2 z(TnNi-v>hW1X7rjjzHr9l-NOiFg;!uT3hDhiXyP+Q3e4!&KDbH7nHQ&r9TE;Y1N<1 z>9dHz#tb6|8^*(=@NvZl(+&>T{lJRxCzkSY|KC}G(Kj@Q zlqt;a#QNkexF!Z~(oANk*mMt)F_GQelbn?z3=4|XD7m0NMO8neEAlZ;d2E!G7 zbujs=NH={qJOzDJ6PH)Q2*ipYSW3`8kzVmo+&)}-k#7a+K>`LiX<}3xeMQK4f+(qC z2u8c{k_JZVsK-alYFHYgOHBQ=w979MTt8F^;6L_q;}iB8dhs<496A3L=fqwpP2f&5@6A-~spcF=k!*$gZn33sg9gtAFk77Bcz7R;gU(w8QFub_WwxSo zo7qC5Nw@4nwld78^lISF<>4N)yH=>Lc$})wry|LxKwOj%`vkl02CB=tQt})f<>;EX~Th9{-^RwD1E%1?3xVM7z`EMM}E}1MO|%% zXvZD7t3kSnw$fPzsD>!VrSy|j-0UB&%!L{O2*UZNm?Ak|!%sLo|4@brJ`6|n693}P zV6-D$5s+6^#%PK8*@>#$g{nvre{OdeOpglUPn*-od&e4&SUz_1g0vICGOLMW!fIJ) zS|pgD4d?~Z%`QCT$Nd&64q3X%54H#nibX6l!Hha1*d5Nb1eyH5k=Y=QI)8vNlD2zoM6Fcr4__P#0hPrkgVP;BdaByA>wqyNjm@Z$6Cycw>iCfl-KzHylcn#)xi&uSh!vDcpq?#}RGKMz~jfHq_-?0gsKQ zVvPEo)bkY&?^VGV%BreV@Kr`UKpxd_<=D}#G(B_xPG`W<0~bcoi&PsVW{{H{?U~=^ z)}<8hWnRhRVQda&4L1@YLNuiqz+30fYjYfa7qNYi%_s5feL8#5x*an>)6b%B*Mhd` z!9x9&@o+|z(aW@%S9P}T&>U0B>7dsr_v_>IUzfa$5Q#RW+^-KuhB=qtZ@F z-hETWryZR8ad}(IXeqjz#;IqcqLoXu;mj*cm7F?mxO&mcTDX{p`Z4`(QnqxNA~?i_ zv`^-V5fPl1oP@9$p*n(>M$6Cyvg=^-J8mQoygwmM^iaGVCJ8#Vr=1Ku_QMNPB-0&? zBvguoiOnmJRD+`N|yz^FqI=GT^>tX=R{J$wQP4`z7%%whw}Zd>3U0$;^A#(OSNLMjD*y4{D`Ui6V^s(qPl8wzP!Gu~5p)Tssl&@wH4x2BR`k1HF* zZvOidn*Gewu1xPUQ|4`5XmedzYf|Ltc`P%^LcJkyT|4e!3FpWf&PIE`UnWqIYx8L@ zYe8@vyEaLZkTx7gC%akF3w#a_d% zm};7OcX-@uY(FFebXIs^gi8EnCgUUJ|345@7K|bqo^U|URFXx z71j5{5Mt@uw%wokxW*HiQPVNE3GI<;p%0kQ$1f-bLPtt~fbr6Ow_=3&_(0vYiD_vx zhP%){##u1WOzCWT7yCC*_`UrL@&nzC&TgrcvY@!C@Ut5Yu=^#%1}e7|KpE9fe%wF0 zzI#w{Jv7_XGdfyx`=DT!i2213;-H~lek%W%Z%OY+Z1#o%>P0*P8$~EaY4y~}jlC4N z)F(MPGUO>Jhlut;%y|Kq8|-CzlQt%SqTcEQm$~r6emi!+Bb$HNZ*9uJpL}`l&BXVi z#^Yc0JM~k50fR<=uYX;~aF=kcbe&v~1f)4WlyHl#r+;D|$!tbq&V;u;p5Lw>ljdN& zpV%tnbQv>mL#peQ2~Dd@M>HB5J=6!JA zj!g~EUuKTOjM6nSyTH6iLbemIkvpvg%j+e7%H2;=ZZ4T|^t>wPW*nnQAL!I3U9~f!O3WVb<^|W#2Wh^@H zVlQ(7R65i`b=gU9bkjI)eQNuiH!_Po{^ceRE4bQna*y(~_}fp?RS`-2xV$KQ8DW#H zA^)a9A1sQe@T;Jin`4Q`#E~ZS^#ed3{=(QOtmja`MD926N})?m29t zY97BDYvzzRdWG*l075|(@IibEWW6gIyf>TiU{ld?qWn0!609&k|Li+F>}LP$(unhB zDKkNPbI9zUDQnY?gUXXN>*>$#6t>;5otiR=RE}xmp32+uy>v)%7sO4Rememk&gkd| zp#7iF?0@+0@E2Bd*xbRm#7dfj5j||S>(L~b*OY~`Hzg(Vl)(3K zw4bBH%isKy`X@446mTXl_8B1fhTpn|~q_}s@yEtA9HiPbq znto8c_)YkqB+9fP`G`j}$FR1?+5G)zlbDZ%HrQwT%KeDf5{pBLe z?B5_!DhkrN<4I$-_Rct)EoD%&tXNww(rdXG3PY(rFvCK} zV+bq5R)^1~cHg}2zu%gGu;u(nDjgt}LC0v6|;J7py2wELK`IF32GBLui+*RdU|EprU)>c7H;-9N*ATy zjiZSPZWa6Mr%UYt-$*c&z0e8R(w{2(>dTIFY6!Nu`Q;HgJpYmE{$2dmWcX#02jKmY z>ITqb<2v<<0i-mtYNiP-N~4-?elwh>^22E3wv4%4kQq0wS}kR9(5Z2FI0<C%h*?o5qv1+K5-nNn`*+4=2kD*m4mnS zqyaKwbxz8u-8X%l;!H&vYB!NAdg@I3WPf*rC3-N zhNn9YV^{_*sTzvwjAJcz#vVLtY7agq>y8B{XW=_Y4~Bcl64v40RY*ONYK9zhb1%0& zIq?G$Yg{^Cji~q_wXzGxvR!#J0^HYAutN*F-tx>ik-G>5B zQ6tid>m>A$X%%8FYgTA-dCRqh*~?vwH1vk7Kl5#mI%*W+Jy)(dO2TgXEgH_BH6;xn z>LGOQ&HI<{!5ImGmh@x_AQ{j}E`N+)gL47UIQw&!*mQRtJ+;8db?*DM>4(<1LqHEp ztvBgUQD>2KOI=~ewHyFE z;=6ck-GuTvOJAEp8Yb+AG!$aH(DJ@xf3WMN`QOMg|SJTCxttOUFqE1|Ba;_5<8zjd% zmSmCU&bqzL@y(GUHyvl>;u~V$JR&Vhx<)F6mY1#UB7a#mo6YA#jcQ z9e&Bl$@D9Xjk}{|Y=1sen(qN?JK6k|H2_7~gu~UE=1NU{VZ3kaqsiKTo4B~zkfSst z8XC@<;tF9#?b)WzrZNMajTB3qI#4f(^1pQNX?txZU(7pulq}u1{;mhE=Qq&*l7e*` zhHNiTTT(I72(b(8u#E`KquPN?#3Hn$cCD>%wazyBMwD;yyJe2tes(iC~^8n&p7v%}lTN7LO_ zP9^DI`u$akK53T7zwcZRd_5PHQfalo)-WxS)BI}=(W`NG^-bMW zyJi5J0JZbC-SwNzp~M4=HI&9P@P^&ID$$hAaFSU_ zn1^b+aH&)=f~K-p%1-mo&kBQ|-@w7x%DPhWh9xS09%qB3rgt+S$i$>>Ma_B#_c1G2 ztf^}dQfugw0d0xJF|xv0c@3O`wN{wLWoX;R>ztg0r(6%@Vq%J$Y>JNzUn^%)e;y0! z$D_OUZG}Ukkip!~bNq zV*cG#P3J=)L0_5TCv{A-c75=jK-m{;T+S4KU>_<+aG{<}NZ}kU|ALylXVqCSZ0g?` zDQ2KP#h8vDaFuQ3c#UdyJO6mV=;!Gjl^wmOJ8BoPnzf8?I}u)1fC(#1EwdMm=$I(w zYIy>LUGhO(zxHMp(C_x+xdtg*91P&*btpthGO{XWLNx7I`uPt}OsGnh!YB>5!NSLu=TR)+oph=j(h7-a0gE3f}!j{9Eq(uMkcojNgX0*m-v^PgDlS3F6czdJ_y)R?Msdev|?)UEEw|Djgn0lEN} z##RA>sm7*H?aBSpO|-iYvK<&l;&v-+1F)OZappp5>MX0*cL2BSZdF^d;vgx78Q9qWY9mWXpC(x%TbW@kKatfX;z-6fjb zA%dV`hrJc0QL8w7yRdpzD9rOOztYRL1VIPYVdUMpp_~8sueHNo4`^cC6F9(K>tii` zI7)wMYS`$u&Vg)END+4;I(?&rywu7@w9yzl+DS*6Bo6Lz8e6rx*1Q2GEFUJLb)2hn zi9TYIC0mU)>-(ep1e7}@c!5vZG2y-z1EjjFgb$_bo?@1d#m5Wfc)wUf=S5i_ey#+( z*Y7auNLd_q?zsRFTa>^=%o<=~YjK5PKmN6IXl6|QO>I(9)OB*ctEpD(nJ2W4vyy-f z8vTgPB-bdWCBgBmqd=CY;-+&HWC)$Y{Lms(Hf20|Z7Ig^%yJH`MvmRLs;o$=p1V$@ zf|?O+YVfK@o*dCwfz_J{({r<;%wv(?cCR4wsd%p32Ss~IxW+=^V^5_HKo-BYs4?=ZSVhb5eie_h|i~@ zxkf_p|Nc1HbO1&+K>Bj7D@m(sKIGRvxnA8?i$B6Hn8m51y;`TSCeSpx^Djg)cYCUr^`s#0lX5vZA{|%mN8CI#V>#C>qtm4R| zg_4o#j59FDVOdDRX#XZkQ7eU)6qqqc|D!Ecl9CW9q%B0Irs_O#HB~sf^xnQczW?^- z-@g8Sw)dK1ndUs+a-8n`G3Z|N0uVf7HW8uy30Zq=w+T;}S>cLi_=Q0Qx(3m_6rhfI z)5d?bdot7al47&@OF`wm1sQ^Vj2J=Voy-5+q>ZQ{V_EJB^aTF}3B&H_&~jkmiaaE> z8B`N9og#Mi7FvQ>vVE9fprc8CY^QTfk2bi?k_7IZxT|mC&=6A4gN8oy0?>VWC9{K! z8nniFLDPa{8@2$Qr-i0^Lymxd_FRJky@=5u>3Mlg7KxvDZW1tn@Rvsc#XyE~TKl<( zEAY?1LG!O81AkuoLHwSHxq=jQDIxIAu-unfmib*2As8kD@$}p#(25O59fb`v`2d_f z8}wPvXNG^I|NjQ?|5jh;`cG4lU}hjQ+IHB-V{X7#U~U5cS*5B99eL}>nf)vSO&wrp z0*macE{IA-I;agzZh&&9L9KvBx`F&BfNj9kAZ|bfIA^X11d1TGK7o#aykHeljS)ar zVnD2G1$~f6AMMgTSi>st1^yu~N*Zy+VT%Evevv_xh3qcapVf%zsbLxklg~=}=odtZ z_~V6%=?Xr;1PX;IF*C_%O7FW0We|8&^yQiL(vEIWccV=2a{VEu9d)vp&|Q9S9nb=v zd6stu(BDM_j=sOQ@k?=tB9$_s5Bz$o=KW9x639Gd4;vZK^&U&p6I{Wmj{gvIuR8$* z-}u-g?DiQ?w0>b6krU4l_*bN~uS_0^nK)wCx1z!Av077eY<@Lp+3=D@;^TAdcjxoJ z;IP}kJ|LuzIx@m7-W1Q8I5KrrIIvpy;zk&w9pK;4uvhm(o>V8Zw>u|K@Su!8z zz9JRzlN|Mr@J#gouL1P)d;q|IEotj`9o64x@fp0eJy7sbv}{zTwz6M}e5&uWCBnP4 z34xi>xoHSZ?My;A_^JS}LGV=eaHCY^g%lUn18dEAPf*%FEgOj;V1Ez+W_f*$mIwu$ zLZRabnNh(S;&K^7f3YU~b4CPDEHzE?Bf|5AsL*v>GPUBCKn2{S1TgRJM4v*A4Fg$z z0Err%HbJI?`07B5fVRLl_!%b^`Oi%h6YRwH;H0Ik1LX(5Y&C%kV3*TFC4MSG`%eJL zf;=Isucf+(3x4fPf~Xln9vDg3N8_vdD&?Mvd*jw<1q5lt(nlC{?Gy6O(9q?ILpc~m z1#r%cFCdM?p8@>;aG*1vpVeDX)jymHZRGMEsm-ce#|c*V9Yy*RjO$>J>#RjK%1D5v zBlZ{&W7?a*9kqz~-Won}{DKZn4f7+`o9^Zd#uhMuU=8xyCeSdW4IioVg|38@H;ExM z!y2~&|(v?*YW0*1~~hn)R4E;QIRPJ^L_z z#&DK1RWyYP;Goc|b=^8@c28YwPt*K`oDb0!}HdJd!xX35D2UyRw1`iPwn;J@F$JR1sil#4v%K7kwSrV%sqQG#FBl z81V|>3QT`txL__4EH5cYRyTB0z~GVHi@qEx$e1{RD7g^hRZ5%L#c6DFzfFn=!%pLw zXKCWBxS%QYbeL7__sKuE@MN_WtCZ;-9R!w{zl@-d%mhIqgmFS^hyzC+IOT1rRfm;R ztm%_Ur7lBiVC;-k_``6H1`6eXSxlk>3lOMMZdvtP6&(urtl~kzbGO6 z2_}B~!;A_L=6Yw*MDp#+Ygw&y+yJka^4krLYkKCh?ZD@hq(<4pUcEk_}F_E z5zjwmS-&k#2s}KEJI0Lw&05cj{+QyyuY6}WxnB6oMS@is4Tm-8?G3*?7n>mQVXhaR z7i6*Ro6UOQ#|%{6(3c8g86Z{HD6n~tHfv4qqd!Yv^HcJ1T*pMx84h{2V*Q>-l|jpE?jNe;*JX6D1njcp17gGhO;-E=WP5eZzHCv) zJxK^)E7Urqbf)U7RtSNhaMA1|{Z_!lNFj7!hyF<6)4@mhJewH8g7gD#t*)#nQmTck z`y$YVqpO^lNQ;S7bXxhQCr+_K%N#R#Y(TX$4#Lbl)mZz%Sw;N~QBF(frz3qfbg(KJ zVB~ioTq5%4;1y*BRNzr%icmo8iRkN_*s~GsNYr%E>!2ZQK*r=WSwPK~iR`AJSQ^q8 z6Fu{tmCY$)y&+eo^cU-^n)nTxL1MCI+9ud$8DPm2i(^_?Kq&OH_L*iZ{mKor6bp<` z)tdZ8O~y#=D>o083=DwSg2i>Gn~z)6=XF+71x5AeHSvrF2;`<&dL7cjk^D`bWJSWm z`)nrjR7j@byOX}%w7T4YPsV{Zclwzn(o3`>U6eUE-?Ajv@Ob2 zT8CO{+e>;85Z4|&mg%!2vd{yu!lla5=dLK&OKD%M)L)3;o5duADFiX~cr;r1K5$-= z>tA$nqA$xKbCv4N)qsw*)X+wN)N^$sl4I;QeVh(i(W29xfm?a+j-J# zNx;|e|5PP=`9(7c7Cv?+WX5jpPR!?M2W+c3v2NPAQgU_i(Qnk{E$Z1y`aQgG#LZGH z#q*iR^)m@fv{W~FNI#NC|3Kdald`=-aqCewmw&_;)9IRLe+o%hu9L`Dk~8;D%r>4V zm1yS~_q+T@cgCr*Ky9r5Y_S<)D6<0A;%Sysy;imJ+R}W)ALss*Zz0iSXw*8>H)Cig zfqd}n^@Cter4ds43xF~N9tC!94-ti3qXov9;hWR{m-&WF=-HUa z`mp|$g`W8KzO3)1yt)4yXo=(4nZakbFwWny%Hh~-`u-WP_xN3n1ph*Jqp?%Lq9~!N zE&UFl>H7?_;mS-LXT^??1C046JoQPQZbOQLf>V(74%N#NA?3AnTaC>wiLt~Y3(RX> zNzA~KR^3NH=Ual!_v_DJFUHkGH=wIn$g%m*9sE-4VPFZt1EoB2h3HO;WQ|KYU+$6m zq&o74N-jWX=cF87iXgXbxmcm*?oIPdulE{0iE2xxN4|u#n_MKw;q$V;h634(5zcjkkH}e(=SrjBb4#{Z;LD1NozXsLw zlSypw-i}mPwVB>i0ltp^h1B6&|8d~TX`3tE(NhzC-Aju1D#&}HXuO?dLmD(Tr7m3p zHqeD3z@wAF;-S*Br_8+|rb2TZr#8-S8SR0iN^4rNKR|xOF>x&~yucO-VK^X_8ChGi zqKJ4vC$D(6A|JSroU*n&WiHy~$IfzYJ+Z?3^OrVpvCdM^6yOpYvoyv35TB7FLUwG` zdAggdrTUr3?tM)3*i0rY8(vw+S5OU}XEp%UN~n?0DZI+Uw)~01-|f;w5M|;h(Y4z9 z>9fr3IAyZ+*eR{WK0)9$EG(W+L)&^oWN&fmH7gn!u>H&=8Fk7zp%pE^Ebt6OmO zuEwxPt1Oz>4cMHfWLa5ue~EK;@yR=lmH6{emw60kFDXv-Ss^@k-VlTeH^64K*x7yd zwib~SSqWu4{oda48L7PXT(-Gfe{3Y z?skM)2jgU8Ur!{<@;TwrBjg6(4ng7xBYufyYYgwm>3+UTxMxh}9_hj1n4Jgu;pIXR zbO7_NtD@(S_HbC&uiMfK1vF!gqGSpGG5boYFuJ9Sb6wgBIu@SpO~I)qoO{@am_t6Z z({YSA5n_7@8VJ=ge)OKPW6d=DV;wkcd+*L73-f*#&W|{>Vum!j7Egf&MF2k;Km7U_Ph-i8pg{Yt1I(%tIp9O+o01!B6{R8u`*Z9yg*j~9*6 z=Xfd6@s^!!zUWe}92+_jaS1DK$urfJAwYILipo(Ud^Bl}&)J7K9*AYo-i^Qo4G8LC z8bAhSxGIh)Q{&K!i~Y5b!%zkr$P(=75)a;^o#e*|YG?@y2GKKas${F)A0+f~RHP9r z_w+)!;LeGxk}@^7+UDJph`#1RrR$?m#nW#ep^1%Le}x^Wn@UYz0B(8O1F@5uAHd#Y zY1vZ~4H+pXLM(QlkPZ`n)i3G#4WP4>#Mfc=?pJ#dwn3LG@Sk7J#DS1QO3tAtmn8>F z2-Wvf!vF!clvFb=u>}s`g|USy*Tg(InLHDoTs#(nrYJ)>@!3UE1Bq+PMirParF8>k zS*c|Vh}s_p$Gg3SSiY+-5u?JrC*j-MuRdOA0gV5m>~WY!m;PMZ)2%wz0MyXS>55}4 zrStvp-WRO9?8#|<<@^G{9fE@xEQ=!A8!N41 znUY4YbsN#jS`fZuBBfooZMSG)H`7$EB_ZMfuuGjv zs@kb(W-$DamGEMaQHUDB$f_g;EQjae+j{eI;8wKcn)m9_bs{@{V^^J;9umcLUq6PI zxbbrt*VUYhHkh*^v?T^A1|EN*56gUZ6Ww#I$AJYt!(Rhi_zZIv%jp5;yKQ&xc>%$I71i?&BMW8imL91X9-W;(e;ljVYS(r^S$*>=Y3xCq=+D% z=>f|JUN_2r&LzV&r<$t%kLSn1D_?fCV*TvY=>2kgrf2hV-5g!vGW2||ZM%4!)cZAa zyjner)Lxe+vw2%T`yYDXjPToL%fxRxES9=MCC~lE?lT?Jy^&Z=vw|;@{odYnuv$9l z)h7Ots!&>V{OIdA1c9@>2Nzx}4h&AWb}=uRKw-+o(u6lfUxX}Ws zQb)}0Gy&^<6m}>b_ZwqS*U~-nrp@@xm?Rx?9mf+Yz#5GTykN*Iz7o!{$>TGeL=SC)K}Rxvk$z7lPXm1A^n6!*Az)#D>Ed z9Jdz-l~giAQHR}!hw<;HPT8(P12}iL&s#ie+d@3GvA!v8vO&voIa8bZsw-sMoZC#s zi`#fvR7k8#0N|g(2+bQU zv}rcbx(VBTrXjm{<~+MOAAa-?UH?j&I=v@f=b-!89_PcXnEN|dTNeY3s279}`L%Po&|0->t#OVPYHNY?iWbVYyfC`u%5&_86dA8CTyz9k_1D9N6VB(kQG zpOOI`j?5jOcubx#g&jL;sBZ%b_aD*ri}g>CQdW1Qa#@e6a4xv3uvl)d3njGI_KkRM zj3;+DJZ+a<^%Qah%3U+j%e!cK{@>^TjmzB6QOf3CKUqyLG~%oU;e>%ddBPDX5im~n zzjbEuy6ZnQ6rT_K^W3-bi+BzB9a$HcY^wn-cM`p6{_@o4blaAvn?B7)>QD8KMHEF2 zhUludOPGYQ(6?C@32rRr+jnA;(4se9I2yw?rj#BAhV}wsv6FL$s;aV^OTHq2(KS&_L>FMMR!Y0MqQQr|K=u(bz5Ugkh}+g zTczsHDP~5jNsoPI-zs6rrEyclaQ7*ubW9h$xX$c3h?E1&2e z5M@~X0N;cE^439G7E5Eg!Hv{ygPLhIgi(&MZbxK6* z*z%BB7Ven7sVx<>CfcGM?G9X<%J)ps(1(*S-BTuKb#}^C z3n+Q>bcMeSDp9^KzSl*F$CK!XLG2Ynt3mu*KV3zGx002j!UZWPatt}rfSk;ys;q8d zKSa}=kPS6m9!avS1TJR}nP+SrqMG}jIp|TfOO~+gTW)alLoWFwxR-H$s9oDT{H!%m zGY{6(3k&{_2I|UOSNS(l(BH+G%SfbK+-+w_?RIc(h2@=Onuk^V-C6j$XYpSLH0x)e zyS>r~8rt5fb}spKTc_=|0Cvr;I^ykFi*iZ7PTU2L4~DJwxrC-l+imlKu`$ayQG;y3 zuIa9eO%gg|o-pe?Yi4dUH0Nrc%BjD-3*rgGwHbR9_ykQC^!XMp)*2aVv&y*D+$EOm zMN)iJC#(vS!CXr+G!4u7ru1|AH!;7wD4Wp%t_FnMQv+4!nev;%fF}6#+dJjPH3*mX zSmmQ$Y!KU@ZpBAdT{xuY8{wHNFuX@|RgIX7S@hzjoSx_fZ?ppogxs5rCAf{M!oV%l*&N!!O$8Gc$RvP~WwO`R^<0`dKc3y5b_E4vu| z-qti)wq)4M{I2`hiAwpyz;{i`sqqWpTLb_Ve%IunWb95R0$V1d$R-#Os`LQMO)iMU$SS|T%F0H zP@C$M(7_As9PsGk7OlylDsH(!rO;^_mu>b1ba;zPxUq8akDz>nbH;A|$Pa0pMb1nhMyq1x@x^0`it>6!=d}ch1GI3Lj z?kJ&p2_Jt9!4Ff>KNlB?HEZ=bf}YSU&{x!{RHKQBt3XDNYv%`TuMWCDBKJ)Wk=-y= z@(QlagVc@-8^}}I>iEqi5JHi)LVK?V9Pk@y2?^6;s9|(6@UJt*p6$o3-}TsdmuA2m zgChg_i21HUbuq2O%N=H{vY5>8Y%0@ay}X7R+jWzlk|LB+HgsKZj~fchu+_&ouxZH2 z;?vQY9?Ks5;*F?X+iXmOHedePYE?UTjqC;}<=pG|w6eUDe3Z+hctRubsXcD#G{Q}tg4<9-34Vn{%KJ(&wf-t1d}G{&VO`XQGtu3e=> zi&VVZ1^U%Nt^;K!^<(qj0dC&BouDvIaJYkIlMsRuMZyFQsxcd*k-KLClBLVNbF|d8 z{vsA6<}_f*NzsOWBm5WllHxp=+#hw;RB(Jh2SUL^o}0OQnVw8B>Ty}UkZ=cx0d^Mj z&{8eMfbTWIew8EMEBwAE&g7)qoFgAeJew+wFe<|BF8)ew#W&)^nCPttHsJT?WqyyA z82#Q1840w6`t|;($$M6f>GJOoBicc|EyrBfKwgb{Zc2T%zQpX@(?TWzsd9 zWKR2Heqz@D;p&}&0}0o*-C&XlC!E-}ZD)c>GO=w=>~uJ>ZQHhO+qUhUwf47n{oh~p z9&}Zoy$4;@&;4BYCB&Xdy=tmtSYYVp*@o?YI=ebr9w3^jOhc%{JC{(BM$g&g(JY4a zi5cn%+2o;E3i3#?X%@im0r?k>g?>!Hz6MQk09eTUV47xOCmj^l03kY<*sm&-v`6N8z3At%m4pmXYTc=Rw_MFx)+Jb_CRdC3qRb z)XyyINN>vnXOrZ>3C^T;;(gZ zQ|Gxz0g#=YR@HJ#AF(Vf_}mcM7SKH04K4%FR%eL3O5OF(BUXDeQ86zHZR*vXr}H1z zdEYLqln7tUL#rmax+teBs*QN)ewJfz)-F)KImAp^wwmPSJfjoW3Mn zYqnE4+~sV_X_x!dmD$6qr#ZEsMu$tj@5ITum^RN=%HL0uep}(N#ZD%^eudtFi7ugHd>Iy1>$*wW&nx+hA-HwC zv@T>JVCQs}-xKAwV%RWS`vILjJNP}s*3>R!7-?}D*Tc+62e=hwbB~*R+g$ntdESiZ z{|bEFp*iBTUjIWH)3)}g3MZJ96S%uTM&ry-U!geFz|MWr5<_Z9t~ zgexWpVgE!r7hSy^%c^U?bk_RZeEjS^C__hB;{3dXo>9$qAMxs*h4%c(^_Wj4VE5hIb-+#vaJW~;rGR4 zKJ*VG`$7#<6#eNJHA#5@lkd7Bgiu<7aQU~}b7leX=)YhR(BI*9I)Y@ma}o)BKBdS$ zOtG(DBJ}X5z=Naf-G#LXwA0J+CyXn4-I2n*Y=YBbflhV_%aIK}HjLldmY5l<$Lh=R zgnB=>(-Jsqhl&+G3oBT87h39h)qfxFp&9$X55Oy(nH&w02tJ0A4)i7SfO?yOxQmk8 zl0`a_7^WZk^^w_<$vRLqMv<`vGrOwW69hRzqNnum=pM11zQG;AdC!9kf|ySR5D;~N zc{_uK1PMfu3UGC`gJ^(weG7t!e+JbAcenv@0!f42QvnTwZ~@&S_ihnbK-Y!r;_`k6 zIRxhwcWOn1^il= zpC&;8zy6p`F)Sl{GD8|N910O3RE;)u_=g>jgC|*6_)h^tMiDt+`^Rq!v-fbg(0zfh z7xMGX&?*jog~Zrmhn>igPV{Orrm|m#Ih=li#LofDK@KWd8Gz8>D|3)PX8dP4YN`Zm zc;9SL#k5{uW}PvEz%n5ZstukGdGxiHVGb{2oMfm|7IIL+AAZw!HS>^RD$ePm4-u|( z$=bnLVXr@*O8Oz!;ZK2XzybFk;^4Y{L!yiWAx(6duZgL}+ek{@RFDhgHNp)4)e;F# z^tJmkCft>&AV8)OWhw$d9))4r9H9RoXoB=nhhqCil<`*1%5VCn3^Mg;{Pdo1DwY=w zmeUt~u_7+kGF_e~$BxCVwpdIi^;z{zRR=(KH0M*k|Gmv9Ki4soZq9cQl~Rx3!NjL+JLik zU;K++zV%qPb4ck#4l|1O0HsB_4=-R&*MDv1eUD^HrK#&}UF(M(E=vkZ(hB)sKIiRE zYJw#b*Wv%N%R$5C7xWHzRf*b+^@qQO-_31dB@r~&32^qnD-xn$U21%A2!Zc%4WKI2 zS7W}lN7eMP%OKiC@wf1{FV?P3%h}YFFhKaO)fb_ab(edXUg94@cw=?-G$9VfwbIk?n4UbCc;dELV9yCSeju) z8Eaj83xUa^2F-iv=~}c{!vfw84Rp{$UWvX0_HtyPK(M6+O=mA5|CJ$VTQ#@`Or7pO zTy}33-Q!k1G?$8gG29_g%El4a!62i)Uh1^+E~<+~Jq@`^X_i`DY1t zWdiL8^&o>dsziRT&eRT0!9x$;kfPqyrJ`T-^24gFWDLvxqeJJPkLgd{UzkVS)x5+Y zCH!0O@2&hWJjrJoU|AwyT%kKqXDFTZeyks=HmoUH=t!ytJ`nDfZ>o!vHV>DZ)T59V zaIHRWrk$AEWoy^~b??E*gFo0=41kf2n3NlTw7kUjzYNZ`46tWk#$O`Bq~e_3;oOWi zqUUxHUs$z1#XsLjI7z^Ke)>XixO&8@5Cl=MAa{dyYp1oraw3_2oBfKp(K)-Es`}tU z5Xbz41VoRJ4SBv905hTnc8LWcWVV)kA;3wf+*;McNur~~X`{`H5EBjHx6Mm*bESwB zOOI%rGpI{eQVR8-D4VDSv2S}LVc9wV{S9qllfWB!^enCxif>DvCIR7KTcljbK7>GJ zyNc)vN7+Zie-T&qfAD2x3^YTeW|1b%Ab&Zk0PpyK!&-_qBK-#v04rVwfY;ScP%zU| z#L5r^!z!tQ35`UKP8}vkWaN-1fKct{pk*IC@)qlz=tBt8Ox3(MO89VQvkXI(Yhis?~W_ny_| z{dp**87c+CciP?tj*rRgmAyo;%*{3lSEh;7n%^Dz}kmz zDZRn$H*liqM_4V(7nPK_VaZBA>arTNHAqkoi zcbFKd|10y+O4m;Y@9rxI;>AE#J61j6-%A3pP~CX5zeNeA$|S6~wf;p9lPM^Ph>3kv zz!06=STXB*B}@`Q^{KER|MN;|qgaq@D{-`4Mj?OhGFrUoaDOr!6xPvt-*Xy!FZ9xR z9D(-w((m#DMdPc8v`i&i87K~W1`gF{^Hr#G!3JUHCjE(Pf)=)NmZ9}xkE;nN>E#M5 zd1P*uum*wpqa-4crxGxFENnIx2s$fv^2V8Sx{^uP1FtY8A)yucTDudg8KFwJ9R#R4~ZJS?FTd24$ImMsM2!@U1hga^6Ste-fR*A~ocq{nTgmX7{w7KW3`8B({ zA_v}m<6)C%0c(DJXUgG9sS{Rv7mMmHQy$sC-f&DjDt0R(V}<)UJGO%1;=U$7Qe({l zhV!G22A4329hymFNm2yQb57#n2H~#NZH2m4DRHq^_;KJ^Nk!Wz3<*EwqEI1sLi8^wvwlW1KDi$4vv!53J;JavH z>I|xdIZ-|Z5f`7z{;z&kkZDz^`z(;@QLyBefhbHJjuB`uGQYgT3rmHF`l^Al5wrYo zHlGvOMePg!Su#ZMt8K%7%810MY_A0o{`ZEC3{1>3mwZtuA`s5XGhA44s`vofl>((H z5qEQCK=d=|fiF7EIEKBmVyGFiY)FZHOa4``$)n!E1cIB+Jgd{egeTA6igQgT`_7H* z4F48wwW93;zWb%!rlYl?!J$?9z}8Ccp^4r^7B>pX&R^U|hnAQ_>ozTlY_H&HB-56L z$_u0}n%d{rANuksLJvA&ZG}Mp!l=&nk4$u530oa&Dg&Y7CymEuu8S!GczHYjYJ1t_ z=@2ww4+<50nUfVC8IRp&@!+3A2tqJ+-0US>Dg{eii3hQ%vLnlqurWUz@3n)h8lkBx zdF5qm9}<%&PH8Bm@Hi-6!^ox-{(O)W$eDubnX#oOWuv&DF2;b3J)9|GF5z<8*e0sF;^{HBFk^ zz|K%?daem{m)~vX^9id18{bZuZh&Z%DI@(I7m|zgJr3;H>LH^3kz>uN0^r}%|0Ij) zWjwZH-yFR=9CcZNAbJ6QuIHdC!eLb?=l>Zof{eLPKYcNZYcM>1DT`(0P7t^JgP}=Q z+2+_$aEaTCdW-64n@#sNlSZJESS@p^C3}N=0tG&>oUF z4EdvN@~0c~ZSP_KHRPGQhh8svhKxbMjd5wOS9j?nu=gJS@tHXSK@>VsP0z%f;5Mu3 zjX9F2EB2CJe{|r$J<~QOK0be)sJdugXDcQ!&L;pvSseZECn{z!Txb# z>?;(omv4&_dfBsBZBUeHdk$7aqs{gC{n4gnujyO@w$7R>9;N&`@a76W6cE z=3|Jssv__#zcp~Wy@}JZJA6O+2S~{lbxFqJjlM1H;!o_mRb@x;IU#XmU{^O5sj7;blstWnHoB$vDzSA) zEOtY`Ve3>~En=(=TLmR{>o{AeJ%IX+x|E{<%_gLu;)S_Hj20QBq!J99lj~-!E*XWX z_d45BU*p<1l|9mowx%w0>U~YE8)as`uEs+>uXHIh9c{p9d|TMB^d}uO{{EBQS$XpN z2Xp4jdIheX=?^GaiaXmuDIThruMaHUvG?-vV}|mE3@ooFhZZrr6C)=gJgo^Ib+ae{ zj}u8@fs*AOaJS1wGuw93(!OdU+MOnufBySV_I-jl_{DImo)hbgtY(smD zbgoW>8=bjAVjm0Ea!r?&PrNxasfsxermpr7KS_B1+n&bW8;N`l?K0`5>_954?IUO^ zyrF+M(>yUMSLZS1oaXNdoy~Jxc{=-tnT^$6FI)q{EKoYp6=*%VVC$Dg#DD8N+`~+ySwVuMCva-+ zye(}dI%6p*oXQ*l2lMR%!RmoP=El=%SJ~2&XKLn+$L4X*8d`rv3|zayC=F5B0*|-X zQu!q>!2x{v{jH40?GxE`7f)Kp93uQf@>+T2zjfV3qC}!X!@$l}Nrm2{Gx*m=(6Tac z0KX>-={=vRPC@md8)sKJD+puXS zuyzuOLeih^CJdzha9%wHfs<`p70_INAGecrI){lH!6yp0N}zLST^rzCuupX(tTl|w zZZ$Sk^s9CEk+v0izMVI>9`)o3OpPtQkqkv{3uyR$F4M_)DXJwCCRO`uicf5yu-y}7 zL5MBI4k7-4Z_V{>0OA}7U`&UNY+5eXKATv}Zzu|KHQs*?aOEB? z$+x=5SVFS#&&I}Gg}Bm9v0jc{6fm2hjT1FcKNLu=R3Vjoo|yq)TZQLf10vhnGf|ee zr&Eo`mbo&WV0w#hc^C^csG9X%tfmGO7q2sf@lWhmUa6*4CnhKo=aG(4CQAbqWr-fj z8JhU(iWm=<)rahjcCcwm|z^UBA&CjwWlp?ht9=p!{9H&hjyJ5<*8f!Pfv z5eY_GG%@U5R2P7CCp*=vNKtUtpAM_~QtHVe))1pkO^uwo_vz6rsABDEz0`+u^1$bD zp@rvU0Sn>&l65YFe~aWWv|2Lt5*T@&88)7w9-S2wWpOTj>g(TaYpo{G$XlBl@A1V_ z!yc7;Z2$I!a8D|U^|-f{PZ=xcV>2{O%(9ZrS3g=PpTPqgH!U*ST+qy&IrUuNv=)zU zx%Bh5A7pFC3gGz#@lw#}TwsT%s8{=%-!1mJs+239JCud=6Epsu38F2X=^r}veYDzh zbLj@m1yqMRI5^yO_Y}j*qB*Mde_qvm$il95^)j^KuC6^yRki;82ua3?rQJ{6!E43q3z%~wd7F>Bk>hGWAO%Rg|^M?Ta)L$BT z6Rvv0f}7#pbirukqci0~O(HrvAug$BbMD^v2o zO}+?b>HckJNca~j|5jHi8L7b|yx_;M-zXWKtNVb|c~+*KO_f~gV=Db|Q^Q0w3Hxhx z2lJ}rYb{erI7=FAV9zfw6?m53nd z$O;u^9uF&y>6_x8`z11i&xT8*e|DpF?(Y>M8>}#wY%%mSHmfe8{7teh+Ywf44UNM1 z4OW07?D5<3o=W!TqxAVS#7G^8F*q%GGk8y)oVHiv88oxL>7G1A! zzMJcCw~uW^MKkL}Qr-zY%}ZDeAAW~)wqmG1(6hx(dAh~@Oqtv~psMI#y=U5BOwKx24?vxwhnSjB7xShLg zL|)I4oWPcTny1djvHEh6HF$ZCurxcA((rT?(=WHbDJCojUJUhu=UDlx4x$`85qs@& zWS^^YqKiHhnoTjU#U1UHv*GleKU!oxR8EvX_!^ZR=Y6pyO~ykeB<3g50q((7mu~P{ z+|VDL_$pG(E@C+|tY*vCvTyG4`SKYZTd*>w(oyPU`^X*hS$__QGAitmxY9hkv$Wv+V zSUrZlJmIU&SJ4!9eq~lR1r#||Ewm9uE4jrnRLrviwSOOSy5nqH?@BfaUxviq*9qjg z|1t`II-^xOhmVt2;%YZF;@i({`vREvaZZKlW$~==q}5KFUJu|~gHSFic$7%|MbG}} z^CW)+GWR-l6lp=AP)IN05S)qP+bLyn>jeqU~-~nC>V>{=B-kJcSrJ#wsEHL8Bx&8AMk2F zNlAL3uk))vw;^5!lSB5rGe}odyI^936p~SStCqV?uw6Wek7SXyel0z@uRw-(nfrls zaT|HxNBg2{M*SMrB!RNiJTr;@9t)Owld1{^$vhWb=CIdT2M|yr_|xnJG^?3YROm}z z-!T(4A35VwB0Ru{V>|IpWSjBf@M&vIQ@QwaiwXNAzDA9-8k`Tv5@^{rmM?zpL#i`mFdO&Ne~<8r|NQRs2CC=boUU#IB*7t!-fTKGXLm|bJB!356U za+CM2|6QuV6F3+!U(Tx{fSCImnDq@_C+be$=z84s=LOXbNy&7+rV&Y)D!Cn>((!MaKU3W2k zEzrE`1FPaaeNjnS|0IKA^PQ&&SJM+0>>^vD-dh5;{o6i$o1b1Iz{4vCJ9#9vbfyaI z7xY~8gntrWON92IbsAX^UAD0hKNMHKnu%p4{~Bu6pY-F<2aoV#Ey<#tP zXq0g#%88h1R5RoF9Glzf{*U^2Gj7Qk{&lx4V5QcDRh*>y^1NlK*8Rrn#!c$}=>ERGnTHA}v52ss+Atd~bbe+>`5i6G4jP{?4 zpzq+sjf-?8_d<}eEK>3Kmj_j5NX+kC7c|8wS9VFB#=k1cq0O!D4;+5JZu}`9nsO(-IPBYt%=bz`D+jj^} z@*=YZdSx;mg>0bt0`I0>GF*23fNAcn>;NXT zGUP~7tNtVn_py?Pd--MKuCFw(hHQE!ydn4z=YebW_TqH(*wGVa|NKCethToSs6E)e zxUgb%&Nwo+RIl$4Sefzd)X|tGfOX9}P#ygFh#-Ead8qH!SkgzDrijEh*418T?XG;f ze@<(6zn4-q=O<2gj;mx)kSI4664L)wvJm(ind&U{YmKfy?;sQ&@s8gH#-8yj*5>|- zwbvgnX&zX)1FA`eZz8k^4Tn1bF(gc5h6K#&BZECO=N(@Zar)?%y5Ia;9_pf^uSYmz>qUc!kOp=l3}mV%9g>8 zz=H@zU9ZM=ljWS3By?NohKd39il+BDdC{fsj#)s)6ta^WWXeLFa0}mNR|3JalKZxc zU&V@|>8f_j9JcNikF^mfD`HqokUQG^UV_RK@y{=dWg)p^yur4_LagLJskWc@b3Gk_ zvsS!N{*#b`r+1-)p4Y zlHRe*nEGnZR{LttzSTz;K-`6+;{pPf1*T2Be|T%dU9k#CfI_LmN5NeocC~_Zg2bWw z6Nr0PgG_>*eG38$rv!EQhVg>|TbHrR=^s*;F|D^32&~TrKj;kz?+S<~s5OKt^c80p zgg_!v7lHRH=mz8y=9W;_;5Py!U8b&CkV_Dc?|+e|P6zH_!Jd#HUdF(xg)D*pzh(Q1 zfWGg$M?DC#_ctFMe?lZEbV)_%>=F?~391f57(vpcBjN5pIljXjJU%(dVM^U4T_sOj zxNadkASeQs*V2I>?`Rl?v&f{Yih)_+CCv71M5N=(u#hxf{`}!3#D|ylD z%aClRLn+!}^e5_~9Rq9%`{IzfXVSTd5+4t!JkkEJ8Pr^fMlytm1u4m-Y@r;d%Srz1 zp(Hb8RGRJ|& zf0J6DO~Z#Wj_yP^{(s**$^LuOPNF;!Abj=B7ABM{w*Lm0%vud?1`gtA09liiE$?Du z;gk=zsVTxnsAPc=jHqIyas^MbdC4Y?nag329)4c)T{I;qg#I`(Pxm4(5R=IQ%%o4- zJ-%kOLn1vik?+bq$xXom53kE<_(zB&13|6VLr?eyHL#6TRYZCjc%*L+>+*cEi{4WLswKpG1q}= zjuVhy8A2}$J7rlyR~&35gYF;s1P@z+kk1XhBr|yGaOQu9|A^v0x)5bD=MZKI0z)E1 z-b1KE%GM16VTmQ+4}vqaW-`+Kg_4DLYu)n}W(6*@31#{-3L5m)04FLEY+*|vxC@xG zf@OIIYc~vnnL?=Z(UVm0X4wq^M!B2MnMihjEq2M;l`D1}wsiKHiMpaYP-m5BxWjE+eSR ze)Gq63xT=$9frw3jZMQIJuk5#+%o*H zGq(93*jri!(Rg1@QZt>S&retQVCJVPD0Hw0L6rvs0(GGCj`=sxFVi*6Q{iH|#$Nx$t>hH58rh zS3(YZpetG~SPMh6$YB7n4G{*`N>GR$fh7QtJkJi1(D09q64XG~a3Wn18Y1ISL(uEX zaX~yh{jB59q}+is3pSCm`?t zS?uajjw508?1mXbLqlz*j93^UiLjlxUd z=QWTN(80?RLtDpkI(2h+PEAoMxtET;A=-l?t>UkOf-%Y{C>oWNc2YFd$33nbwRrLv8Pu{5H2+Ou= z_n3V>%2$qTB#AF}f2wtcU+C&U)!v`6mThuo=x$C^^`H;ZnzL{`CQOn4i*1(r5rGRf z90y}3*!9?5Oj(qvou=5Czmk`5zh{G*@I?)Exr{s$B=A9#r+x1C80c zpyV%@JDQ}-KYmjCr@so*uN}k+>hzF4(6LbG$Ks`S1{6)-RxOloH2A5x1?{YFwYnQu ztnm=zSP;4!X9Ho2G@AOVa5XjXLL(fj0C4_=bTWeam3ywIvBb5=v`92f<1GfORZ(yt z1+5I9Y%MjPh?9ecC1NNyFGOkRkwhO}0x1m&jsd5`V8_lNRsmC%3uaLYM!4kJQVR7g zg|WE2V3dJr`fo{aP*9K#t6{F?FVmc%G|xI(r3A_JA4^=@R{E0@7b67An~j8B^qvBOWW8=An@9 zrb=irN*U&#wxtT+#6$DQuA>8$zZ<;j!-@pZS%h5c#WmVo{+R95qH&dOW2cX zvh3}>-&$0F+c;*`w5 z!Hs#tVY?>7Huer)Zc*Bs!k`?8bXP|fsvfq(j~Dkz_xAO>i<|QnYV8zhFTfVaJOS4X*~WHmTB2qF z+_<<%2QAmTySY~ads6TSC`Y_Gw8gsx-eU( zAkA(mX-S7kJKb5@@Y?l6r_VAXmXq7wyUx$5wLo7y32LxHD}T#xbd$Zmgi+K}yYxH_ zi5V1Z7R4TGA@$E2;=13#y7rN17zBIwAfDCOE|5MxzFLImxj{WJ*-r{_>w#jy2$(8! zc^u^+`DphA5Ru1e`=L3RnafHE43a|s#3GE##X{YBX1>xez^omJG%W}&zRYdpo_d0% zz%$M8tYANeuD@-HaWGhS7eV+rQo)#&7FoQt60O-d%x?J$!{ss_`Ac)?(WgbdtaFx7 za1esBC0WA+BX)l@P=2?NV&z#*ENK|&R)gn%9wnLwK-8fu@7lSL7vkgxe@#es+IZs- zFg1NCod0C?eJPw%CI72%Rtnpb{i^ZSgC0Zqt!nqiZu*KmL-h5QLO^vzf zkoH06jsG2g?6{snj!zcH6XQ#zUN>~8(q)+Vs=c~y|xEn`l2VOrms*7v%H!WUuu zaR#hY-{;SC_N*}wGjOt56VLD$@ zYMg?@!Bt1ooSVgnoIjvjosKLzNQL| z6=}B=&+$#5>$Y6^aU6?fBnLhEY7$;cp2@$h%W4b5X4b-T);P>vXSUoq5?R|O!| z^1PBy&vw1htY~uh!Tww5dxHk9CcgYe@?Vx)f9KI=u@Nd$m9^$1X)e;`+VWYUUUJsY z2fT22?EJ6^6BO&whm;|jjpkqduRby{wlOhKI@~h+#9gaqS>r_H>>EWo9E3erx{0+( z{(gDZ2cVSv@ZF?tInk^2*yq-kO?NG)NTU-wm*{p z@P&$MjhBWjWgN7BHj(`Dbr<@ifcoNWo2$Q&?vcUKkDJnkG#g>pn(L&^i7O}~XxWIY zk1D$CW2j$jz8c!J%K?rShN2U8B|`F{)(gU{M|zh+NVaLehpu6ioV(q0j&Cv9%X_~4 zObg+CwuiUL1QO!xYuC1BM>YVEikUnHc78tUg(bzz3NHAJw|<<(tNJyu9GlkP?BNM( zTtA;x|FI|7tF}uMd$KpnKCgML&j?elsO0d&we2ovt`O(C&x~$Yq==pIu9z>MX;Yqs zYKJvPj-OV*YD8EhCsqwXn4aIuykSvz2CX=mbI3VdZihRr?(sVnP!I!@AL23^IM#{w zdGItA?oqfMlwHNCm-7p0uzg+n(d(^@*Ny8D=R=6F*qjb8jvrX|m0IvM6$@!c+)Q5^ z8$XQ_XL=+r@l%&l#L<5T9_JKqrbh@7Ryj;_2!v+XGyQ~z%mX0-yT2Wdi}-7}pW-$A zw)Iz190PRo1pFV}S2zxoG*;}25PI3N#Jk|$|6*I_YAn6)r!(3$QEmH5P**O#J4(3P zfZt8>G6>eZ!~;0417u`bKT0in+;mfOi}MTfD@qFYf8_2)2Te9Zk3U0){}p-%45?`U z?UTu(h8jN&5PpMMO4Bg zN#CAOH(Zgp?Al@ebTS@A$MrUd8 z$u!dCewU5)fPV)RLe*wMfR!Z zQ%`zk^ur5{Xp+iM?Y_qu-x5=qCT{9I!tqXFW8MP-zztrDsz@z@D5jQ@fazE-)-QfKSgYH6=D zF`{5nj-VcZ&efCwEgTS*AOb%$C55*r)oQg zHDG+7iR|HizD6Gbkv?3~QAMvLZ%sYCUL*Ks*ChhLuo;8ypA?;o1@5!E$7vt7Mmp(= zXVqH47*OUmybBKQ7d$>E5WuC3ugtUmb}$;mpI(69B<9UPsar2TlQ>!7OuZ!z z=*fsmj66)3q*sRufK9LOd!@MgH$48VzVy>+*m1=1SKVuAIx}b7$XX_V-xWH)olFP^ zqdVbCZLmP4pUC8V++FK*yitYT=Cwe#zHI}nrfd{_T9m&hB_rw`cw>-SC*8WA1g2v` zlRRTM{4LN6{hYT>NqGFwbHne}GU8nvZmgD){K;kJNBP}tnhYYh6mIeY^(CS46e99K zq}^qGVrEtHG?8qHW4JGfOr8GBwN}J-^4&-lJLg8_d~jPw!gB$qytc%K$8*y{ZL9}~ zS(_>fe^KGXpd!;Qo0BRsd>ygx^LE}mp00^5FaGxezn%KFph2q$rF1i_mUz0H9o~`c z6{8%|G>@^lxF{ACck8J|wYIR5PD@;oVWFfq5<#WNrWxZQ$K`q$kAt*$y7I$yIw4_@ zwrm48QRIiKjp4GH7KXkXcR~AC+jbIhI3WJ_P=UGj+RTwuJzS2FM|?4ZqsWP-}K zmjM&X6a14R$j1J^4Wei5%rxrik?MU zvQ^exd+n2uroEKF#i3uz&qea{oaMu`O3eD3#a>G?D>8D0>rV#^*Dj{OkM^BeXS>%sxF<~%+uJ+)X|hrWb z;$Sj$6uf`U7U~4R{mj)q57{0%#L|y@5E^?uK?0p{(qVeEvU;P7T=S)6%D~oL$p{OJ zkPp zed$3UbueEJ=vNlYU~7F5HE&fhInhIcxn5{K+R^XrIxGQ93elSeb$#4HV8>((s~KE% z@xKba4QV_j17yBT=daX9?swz$32fJZg7D*{IwsJ3Rh}t*RpyhfC$4-!>By$R<~Li* z*k-5fCBA!!MyVhcG8l{~S%8fBX*w`=1tsIUQ5vBL;txMwLKga3+JyqyZ=+W&sEe5j3N<%CX-Y9jf<1{F}lmv8r3cF+I za%t9?g?pu9t=|aUx{XqY_ZcsGTl-?Q+Ye!+i)0Ylk(^;xi?wK7!Nrx7euR*fD;@-) zo~+s*=M5^18n9gOZ(Ic1FuIr-9X0lJ(AbJ-?FcR$&UNz!bq{FNT?=BvB!4#a`;^2m?LLO5^EQ)QZ05?(E7tf&0`&gwFCDBlN^;G+I{(Md!Bicm+YI z&eyzxJmNP$@t;GfM|5WEH)OHmZJ}XUG<0omgs+=hHc04Sg=v8mfAr?&znUaO(gp@M zf4k?PCu$l8yde9oU#JX5mzM5AUMi{GLVy73N){}({S$qSO^aF~Do{#ij`oSB+F5k8$RE zUsHnlD?tULhNih8x-bo|tFLx%nFEt0p@xPyohBa`#dwBv|MW+D_kQyeBijS_ zxON&7uOI5|6zfk?6_k$+m)3Gl=XP>Fy9w3zg2%~1t60paWt#2qmA0-4bI(%oLBXzc zwbF@XRP8JLik=9p5uR$UIGc8RQpr}z)1~5!zb=G$@qTNy20OdNw>Jf&m;j%a)q4&k zISbZQmKS{62NKq5r;gLca}?6}!eL7@JQxp_!IKR+3G0Ju-_Y+h10-c=?rd5J)XDy; zdd`1e*x$$I(%u)R)p`9RsQ-1(O(=Q`I>DJwx~R9+Et{Fbhx;ShE0Nrn3H4~}b+GqN z^>+?9jvr}Ceuo`^7lFxaDgdfI6Sdv({ktql2Ah)$*+Ppb^V4a@IqXU9RLHMF z$=NX~DYiMeb}Gl&c&p%jJpBsw=mhVH!Vy4X{N+emIi)JK+Ana=V zhTwf^MkxXlbIV2q2Y@N|7Ly-)cfD@wU;)QOU7vWBb$)u~7d5&lnF;Z8-Bw8+%^?qG z+jyDX(D_l4Q9ra|0G%0)^iiBKfHrrpC1zthV`vl;WyWqmg9Vqk?qvT?)@qjg+iWhR z?k3fOHFBDVtzWjy26JQLd+I3GEJN_&@aXzKIthNypkrr#MgV!KZHD4S3fqo1GWDwy z?v^7VoHWL2{t6u;7UZqi^OQ`{0zcDP9T53ldwGs20cvnwE-^PqLyq#mdTw9g8L3HN zGRG=k#a>W*mb<=A5+v^;?T+-DoZO|)dB= zjjf5M8){j31VGY})_sTEhLVg~k4M?z^BfCvJf|_89&(xPfGkNR;%`#5ripDHpS(RU z8GTp5ju**aiL^si^R1b|(@YU7mn!zth5mxEg6MczY0U-PTfD0g1`T5sAN%Yi)zN7# zxNx|Vi_CCj8A}>b_QpuZ{%&eKgkWRjUDV7RsOtPsY#`-)hcGWEC#v2`EyF~=dk_z3 z9>?WtN8jl@Q9Zuw`qdJe-<0k(M_86oU1ueG&g&GqE`?6nTnKMp#!yXZh#oZYW%*e? zw|ks;3a!7k$rXmi|92u}L{1YP`+Lz82b;U4$MnQm{}bFWF7@NTb>19`o1dTQ{T;^S zqf3cE4=%USsP+R=yksxj08?%eYS!?(0%Ur$Jp|FDW3G3au>=6)p4@ z7k!_M^e*B1O2NIeCm)~rq7R)9JCkoa4>Ml*E*&=x9eyXl{ZF?WQV=UA*8udrLmB*P zRC_OE!ft+4SAb(-)Dt4!EQN`N!Z-Y@+Pyve#qkDqrTXN1hp|y{4A1?)y4^4$^n83a zh5C3!lJV^MR-`lH-AXMaWbyZSKi;H9LrvaoWQp>6HN0Hob%~XL0{TieWDyAw!P8$* zF=B2+#E=L`@w!2x-MhF9L#+d(Vi%yzxj!NiLAESag!H^rH4vkw%+_o0dcsV4y9?7? z*Xn?7NB$hj8B7|qRaB_=O$>S(P`N?jSk_PV&4DKSW=qW9!WQy$34W;?m{V<~qJ;|Y zIoo{Qy^Tyt=YlN8MPrGn%t|IB(y8D7cjM!9RAM3$U)EFGIG9Oi0J<83Sj7Zp*LW;3 zHg!^J6j8rj+UUuuN66)C-&chj2u%%`#1o@rs<+1+3IWws!1iAQSpY`|uLnZ_qXrL% z2I&ET1qlH?0qq2(4i$<87ohG&^i}kw0>L*RW`weX3z!nZ4aXIbw0@)fWueB7tYrP#CVF)(ig-R{p)KJ`fB9p zE`X5xYJ)6-W`SS%0zT%TbdVAd9ACn0V(1qWr0Q>5aNTGiI!RyoS$3|kT(#gCGISrT zz2F)$QXf1|BoQh|=TCT4|3JUZP$7d@4suW(U-X}N@xeyK8WM>A1a4x%3Si!3a1{NN zNmwNaW_%9>97$v(;AevMVBn7hT4Mmma*2~=9zP#X;Kk4!sZfsyO)7R?Sw3sUTrfUi zctqZGSgwmmc))$igHaDQuX2J3XXeFUE4a~9q!XQ3`Y>rbm%i;IWmHZ*X-85|Fk`f5 zJXYfBLV4k9z=?`9Dj114+VYV617hZs-9jgpAkM~opNo>Ps3+!68TfKGvmo;rZbx0% zU7Fa$9y9EeJ2R*pfq~3iI(6FDznKb#(MtO7fk*XA`jWc?w}TRDJiK;Xte8ZxV~_m% zsrk}&{CAkC1^W=0*Ke?U1)Z|U(m5SI`GX#GZo63`0L`~CKiJ>9OK5+8A!QPS)JH_k z79{iZfwEUBhZEUBsnJYlOBABQMiAg%@A=wo;n%}rd=x~rx3w7h=7d1bVqa+BEDFWz&f&r?WM4)H5gOp)n9XG>Iol+)**OdQ8lHv~klASoJbLjK23 zX6Q63GmIX%p99YRuF{wYvt*e~`HKH~i_GK_foLWw_ZN`|2#cMzOd8w+X{?;0aQupl zD}CX0d@MdHyFrv)XlGJS{C(DnXsn+LB1j{B?o6UPvIPo43&_Q%m&zy?O=Yv_uovvx z-l#;6Nck7KcXnOyh6#|(0Or6)dGMg>+LF5GMBK*De+M$R($OvOFLy1?1r$`Gy)blz&LUC>I_|YK>v2nsC(0ywP3^HirL=fKtUMkCzP(T)uhCYC|ix|HogeZDY zJ5rGBVSCVru>5zu7oyt=v6?JVh=r8?w0%6ZY}V)TkLM0%YbNg{G@cNys1TOPjT9;? z!t$h8zx7zyFY`I42N*Bf>i=~s`mc@h&;McvE1d zL~EU_sVI0RZMp+1v4iNJ z>I8>F3ve0YU6ut>D z`T!C-Hh>OJ@})la$NLWje}{W>sX+Gk#ALax+d(o99?i0{30n-i`uVIMQ!WybZRfs$ z2+fe|5Wr5l$Lb&teRMoIv6&wRxwaWpdHkC7J+G5?b z`lY@^Ho))h6ltS+wHIZ81Xoq<{5W>wVNc-Ax9Nv~*(O9YHn-P*aQoUG?wLuocIFU_nU9|=s2 zC-`Mpyoll~Q%6Z4p0c>s*^zEO-d|UEUZ|Dld{0nKnyX9R3`%h@01nj}MRCsOX$+R7 zRrouUx zVJ*SxB<{uO)W2Q^SfIibkbYs z$e)UDQbL)$vYYN2RvWzan0W5`l?!dX@G+?CXYsfcU7NZo7`M!nx>|enS%DxX7ezAK z+qaezqX2&5*)KR2?ah*$A~R*csszhb2}-dG`u>3p#O!e-omP+Zl7k*r2gyzeB6*}pzc1)puVFDdwYSZTJbj2DTq z_JC&oj^;_0t3S@3yHOMjK_QFf@C_|)gKmeZ!nK>7C^+jo5TkqY@MF@_swjplWvlqx^rusIGtQgXnxGPJtoFQAs)xZ+YW$7TX0F82=uSNTKWv`8WFyRE zgASet?l#6CesKe$BLZZ^34tJyP<`N)dQlW{1tOeCW_1LkSO)t=7rH{ggWBrHZvxoU z;S)Wh0fMeqfl6e^H)f=Ye31UPYF{Egf67|K#|9>5B?AVx9>u#y9fp(XKVNNhEUimw z1Uq9a7MI7<_nDM7Zs8*hS9e4A-_FT8+waZrNJhD|<1dN3lWZc!A^?x@#`{xi$A*Rr z8{g#$vuFvDX3SITGK8H=>SVIaX$V?hSrq-v>XY1P89#T1)JkcrOGMT)>Egr*TIEwI zi1f-;odyn?WY6aDo>_}{&_O)vVoK}!Bzt4kkG>EGp1xlT81*|i*SCpGQi__* zdKoQR{S8N9u}+E?yf1J-u(5Vaq+!F-Yk~$I6gnoS6-k84zODN1dSJv#TEyuq7&`9wxYC(?A*)Neq=j0#;?7spuH8M~*Hk1m&7vsSza@D- zT(OtWybep?(%QL-G=DaAuR(8V&y%2@KUF87;~r6eQ0f`{E9n=m0hsmE^RZvq+Gf+r z`EXc+8x<~=K9F>eO+~U#W0+VYx1g)0KCjN>kRTXv>zu8mD|2plNXXwd8Nfbow#wPm zW0#uR4|YbvDL7%7rLiwbyB51Fs4%|c%0)Ay#F6($O%tmInzu`HzNFbz?dcnx@Cbs5 zM5?b0AHv$h*GOE~`eBR|k;6`DioWSmT#LN=#&rpd88D39AFv-XC?%?YUK4Is4u*SM zc_Ad2v$0?2kntChaUzH>G>U44l_$h^x!=7}w_ z3_0TY93h4{4mJ^HrN9|>TtI+koZwZrD(jHkT%#eEnPc(pp|bH~rq`vYE3)$CfTHV? zx0agj7_e49DpkMQc{Hd~n~p&VH$UK6UxkwKdN7n}=b;g2 z3DR<#Xb)#%c|cOo?WI*hy%`tUMA71n^mx<91E42XamB7wdECl4y>^@;e&8bU(p|P* z-qT+2H`xjH}Q~y4kH2_zBLV?U{YKAy+!N{`(h+TzhuAzac{A3JT_lAw@!EP zz8-a3H1&NHg^tgdTMWaXh$0l@&OTHE|1BB8>JzAoBe6lP;`4gPZkgkp;L-(5*GTjw zXEb|;?EKzt=KhRpDS(~Ck^G)Gu!pE@0KjBPcQ*&3gw&g1iz`xx$&%}-=_j0Y{M(PvfVEK-oc6;c=2rG1!&v!hQ}ac z!d~s%IXBWvUJtBxCS6Fb&>b2Qpn;W{Y{qgXcX-f-**`TJ(kDOTzlO@6w%v!m%2jY( zmZ8mcMubt`OV%5-Lqd>?Jg0Z9%`gdctUSZ;Qp+)gGshfNrTuBIas%EEm(#KE%}_Pf z1P^)^snyOe{xv9T;KMGb=&3FioIG5_Iy`SMZ8YY^#=Ce%tkj#$6}4fd2U#E>ewh8K zlKB>OfjAq+=)=&?ZlJAZr>ol_zcTM+9Y){O4i@&_Sc2j9DD+*4t&%QCiH1ZacgOq9 z6SMUSPaNTIcs=8?LpSiSd~ElcS9Df6u1(=bX-rFq?qHR~L&@saCeW?GSgv&{-HUU) zC0N$>ibt>55;@6Bp{;BN&+t&n zJK$)yMLk7PZ@TcgC?wtx18vE4Gd&|)j%&hs<`A@4jxhVpJP}xmUyyw7I3#!+f4p9( z0-QU<)JE^lynhUi$4l9BW39_2V+^m^`!$8XnB8uRVp^DpyVoGq4$f41OY0iXNp>60%eMYp-Po_XEOzl( z8XbO2X0bj06^eAG?kjN9znHEgmR0?N2I$=g#`mIduRpA)PnWd0DBNWDdw;_+oUoB? z)I}+;lYy7Q%@;e+CkIB7uB}>m%L6P``>3l4L{SD zOi`Xl78X!TvQQ@x)pjphXt?yUpxTTeV|3kA;&#;U-R<)jWi~_p2wiqgi4d|iag)kuPTyD3(#jK<26f^ejB#7J@wR^#1wFj_)pJpp znS!{3&_J!NH&4Y4%eT!{cACA&G?Cl}$r!sGg$2+Udb%uaC+w_M?>vX>@=+~}qwET# z7tiTFdHk5?_|W$=aLITotV3xW%pq)C#1R{;E1&PUnQwZw2W(}uZf8$a-)kq?8rw_q zVmhIWx!c`ujs=JNlclcyz`s5mSZn3V|1)GhN-o_wKT(oxZ)m=Wz`O1y2ug44fB%ht z5Dff?u%boiMNkXn(A|HYNeZE3O@4G#s~~Yzp<7@0RIDCnx^&*K)bgMnQJxp&8fiXN zg6k08wyD$g+JVgL>`jx=9=|x4J}rIE&E7l=j2Erb?dw8n2s4#)h;EB}K`;MP*7Li? z$*Lky#I_w~BWCTeI>fn=>}AutF+U(E${ElvkBg3u=2Pcz-X>8@{`E0B`m%}Hd_nab z%{U>y@1A#avXYp`aNERmfzUa+vt`DBV2@Z;IsbSfY6YY5^mM$h$a1aH+LhF{c6T}2 zU7_>v(`36g8w&vp)e6IX(gw{Ya;k-fdb-ZSJJz%P{`n1kRSz+4l6}ET#>rb=UmNJ~ zXu(@x3Rw+pKetX7XoIuK{6W~#cymPj$4RT`Z}Z|-cqd#gnd63NiP?I*`ejOm|IG3Q z|K$A>4L=O3nb!5bDO_dEy^MeH>}yDJBf-f^&3odtR#W+Z#OJ@k$E(q;8ah|@D_PPL zEBPyz2^|*Gq-hhXxnue3$e&?!PYn`QdOXuH}l>bJx5BTnRRdipR zRu3+;`$L0_)l{*1sZoDv2&go0(?hBTLp8lj$*)%;gfeV^^l z+mKz;iGrF2d}Gft6NnhQ{y`UAO32wVI=>Gj1b$j|S2EU2Uwi~C%LEi(NN&PhXkT13 z3LSOc^zT+$Sqj^X#piZzJ^1mzke#W0&g^!(bO;iLGM4Gf37`79Dcj2OIeAusr0|9Dn0xr{Z0Hr>fWR1&r&q6Gp?hM9Z zo6ZFn=P$J#uF!c+x#4_ErxJxQm_fblce3TyuJ6Mgd%68@>4dq?rPb4)9Y)kO%@@SGHR3sGIlVPrVm(TA_)xt2a>hI} z@NBjg--rDxLn?)r{xh3Bd%Phi^E$pUu&3v|s9WlZqYc=go2)0k)U*y6MZgwc27BuJ za1>i#V&{e|L(r<$LBnRnX_U9^IoYIq7HdISd{>7`S>{W54PE=(_TrI?!*hxc$h1b} zhx;Cc8Uz>A6s)YH*qJL`=&S~_Uj5;*JC~Kw?8d?HAV1dCt|ymKBEfc~(!R*1E-0k; zL@p`^y#^eeGT<2>A+c=1EIFMm{SP^S*UI-f&L8iK91tb=MGn9(_tbwT35p8xl72Jm5rT4#7JxQWdt}GjI^UKndfV^)5(ssuRjD&Br~mA|;gzb2qUM^P1c@ z=6My`pSPK$Z7V%=)Gcg&DLM&z6jx1jS^;hlE0IQDjjX1vy`F`-%f~6iaPV?SyIL38 zGy4s;ZyU>gV#8$ekX!aLP696yvUbf~A62CLRz3H+(N{dN*YcaTPpLB98w_0c!xT1y zZ_+0Qk^s5dkJJpwg&KU?2eT22MS8mM4-JK}+H#aZmDyF7UQTIS%s^ z99Bh*VR**wEV{OsYU-Skk3`!bhOXixwtQ!d(k*?w0t?UV`$FQ<<4dOPMUt$cB2P|oQvn-iq`MOE=O9$3<60UH+9czmk;N4W+mw) z=haT718@@9Fjnd|x!(bSZ)dnQkfjyVx;5Fi4%}GFW>V{LY(2>)CCb)k%auf7a1o|= z?(hT$YZV2}xAf=FjES3_op+|H{fqm#hPaesyo8qs7ZyIhdL%Q>rhr$6`*mo7sz3sp z;g@RzlF@ycJ$F?`PTZ#9HV%qe#B<`(?hK+^K zTCf?3vbw|gy@Y0!XBm8jCgzJx1^LSCkE{7Nr!LU~!TfSL-FsJwJ6kvRi6aZ~&$u5##=6fm24g+p^Wo|687%0s zA(vin4=DlrLC)Ifnh=-m5DoJhuJJAL#+uD6eElwswi*jlIOPI>!v**1PY_4ljzxrDWRaQ2}vy6l)$PywzNbrYKOX9L$JAJ1*d zt(6fH*)tCo&FB1&q!91?Lv|2;I3xW4*@#LqmlG%Fu|iOi(?UTZWOTC1GY6N)pi zL^_II7%21$J$^)yRJpbw@kT7MQ1q8XnIgLACriNJyUtDL_pZ(RkIGAjNoW2^N5(_G zN6s&T0Ouj#GcfWUQb-Uv5bEij8$vsFatgw3xOP-32cFLLi%dv&DY5j5?9T*h z6wkgqPPDr%MjlU%?aC93FWrY6ifxF8Kajl_rgpHU_b00+myzC!WsUr&HRf`qcyY+| zWiHEO&K=B)x7^B40_nq56do_Lm%7fSG=W%C9yl6+%E4puWnD9lx<-+gOv<`G@CnQY`>+j<`V|~WiWG95cr)Q4z zgHwL9pgg}vrS+|MhWQH3zBwy(@IW`675vdWZ9>2h;gmGq7LI1h=DA=*HO&9{0ROYP z(nYE>H6a(!_RV%Hw(pDt*CRcL8DfvRHLfQkIp+a_Y;g}qpG+L!JG^E&bc@En35L3h z&mq_yLs3IKeSpM(ltVv(5wjyf9E0D1ra)BV>tS`n`eJXDadw0F9)p~Ma``dCf{cQ= zfCl_POoV!{9p^ApMATc{;C(PZ1jmr!``~H>&vK}e z1TtbZK?H~SCB7#LDBlprT}ytr0jQi>!$@U;D*k_X-`{drjoR@byOOp-njGL^h><%8 za;@E%Q7(&%O51&{Ds=5)W57X)EOteACyzg9KqxR3UsK=Fj8Pu|=&wNl*lskehimpQ zf{pRnB$Go5TzauJ@?Q=(TL z*OGRtFvsUg*>qO5t1;kHv8YA9%xkkjyyd>0BS0PDG6MMjT?=2A0ssQ>j?eJ(R>O^t z=tl?rXVfGZ;-d-6>#fM#CFWz!T+ck{KS9mzd5BtYxr5kmM&HaF?X=;u%;f_Jv(hG@ zs)gtyv#;u0dvU%}XyFe7Pnch{egV|TIHUq1LwM?B0zSxu>Xbq{$goFR#i!k|Tmk^W zi#O{#OCtq2$djdSG(X2^Gw8eBRuo>&mD8$fcRX~pl)pcShaVS{lQr{Hk@h-B2uM~a za>ct=_kz{>07$@*F|2^AEWCdthz!Wb&hdho547;b)-bl4A?%)r*)tC}BFJ#}jFvmy zl~!tWX)I-C-WR=|eu_p#PaM&q;1TGx&`UPyO<05{fZP#P^l!u>O$Fw#bZ39M6VZT& zp;YfdUpT7zAE9Smfa1V`s{M{29`e0t8jqyZAGlohA^XVx?2JXAwv~DuLj&x-tRk12 z?;2afPMaQJvea9%9BkcuAL86*yD<-{y~obmeyq6Ivx5VZ&hIZKpC27FR$ur5@V_DL z-7v-b8)i6co~=|OdW)CE(_bO;LoP{-1@wCnFasY>%=As2Jw6Tiw$nJ`AN1 zqDm5MwY&rX0X7Qj$W&_;#V)+1U`Fl_>aUHhfr0(SuUCN&6F5}wO{(7FL8Kb<7ZTt+ z;xR(_;@5wV82EZg7OrY@_Hi069p`u(AcU4G$72$&_9~AE`^u+7*y2hYGIH=uX}XsQ zWBw2Li8!hIJaK4G4Qt_{iRL@u%2xs{%EG-%=l>08Mh`L$(7;x}n~H27`o=-WI3`1u z;;uok?(YR7Vha}*y6>Mnl_K3P?cyc}piZOFB1X(`l()aBLLf1J58V^(DJO{omoQ?7 z15Jz#FgABUzpQW(t6pA;Mm!H%!YTYO z@iPVluOWnfnsdpnId!A79`sj8+RLSD*iQcZRnAF zuy!CD1b5p2nxB(`a4ElE%Nq!-vQ+&Edy9%^lfNgH=zg6hxvQ8&!||d;G(LTBt|0Gf z-mBj^&GlLkd6v>oIwc*sSJC__8gtAWd6WQfuH+Xx_8<1e6}v;eBq_U zOLe-9mMsO`K#~zoW7gTMVBN5F^c*3biHn8Zsn~kGfCr-%&k%`*w~#82@dq~E?-NM- zn|hOH(?4qKXxp{|xY*jse|I0D_=3}M8S=1}lkxSkV$Cew`G7VL& z)5%cI`|7atad!iu$CsAjhZTvhuBikF3xW?=9GS_qk%&5y1>0V&CWTu3GBe~~Zrw?M z5S4VcYsPlT`A#Ri+O2xkihqkg>xM=IMp>gE9b__14t*or!zg zR0m>*8y8l%OIiorntDUEv(aNp^`EEnZEuZfKuDIg%511@FOT>3$NN()g|59{aIuQI zWv~0@FRr5JM6Yj?7+nOhzNH-Eoa$uNH=w^${mkOZ-YyEh$iE%tLSdelRp&+V)g=f((>a(dk;mf?V{JT- z6h`ub$xbH%Rx5f?I{ro1?Zh$*RuMClZ*`MB*IrF)&8o)CF3ZWH1XkN2KdPj%z8hC! zc}l`+oP+>uyQV)@Pj8g}AU33umxK`*#hdsPxEj5>5{7C>&F}i0;vX^=Q$qkR^{3L4 zXG`BK+gjVs%k3`!bLd9>_q8c>w%WjYMHHU(Lv3eebY4yueqhI1TvCzn-WUL#Xru2i>?PJ8#L)z z8S6M!FBXo%tnDR|0}DP?%BnRKwT|H{sS(Ja%*0i=ecDBU59nHWE6quMr=P~HImKHe z7}jlP9M+r5ZpO@z-qa$;axBh2TLLNlx2uDrJ3C+0QCps#m%8Dld&3qi-Wy+>voPUa zzomc4$5uBr!7+uUDDWycj8B?BIlTGQN3*GLl``b%AiG%Wyr)g(k{F`Pew~^N;fU zM-%B9k(JWcl2zI)wv!bXz9(|D%*Qn62sH;A<^qsi@zu@m{-~i@bv~fUB99^d!`jG! zA=jR)SxqFm9I}H{^`d|eTNY7f(05R{*(A`247+Cj>(owQnvbq|yddZLZm*MB?5rsT zUZ)zycxl>1w9nbExjLfpk-V$M2uleGQ21o1a^uJ}&FQLaU}!jQc}W$o!6J$fZaBv+ za0I}ow~uqdhhB+vTsLblbx)EOx5z1O_^#_;JtSF`T;B!!l3pxURS6IEr+@iV)^r8l!k+`&M#V;6||#yWJ;4;!`=ZeC1;@u;|~T}g)Bs9D$lvXWG* z;H{)(eA!LL#_s)G84ynYTNbKJ)$lgi{s%jU(fqHrN^z6d;3oJDPd8TjueOvXeEe+jJf49kb!4|CQc)jr?t|q=Uh7>|g#* zH(z2U=eAK8A@XJdEVv4nq0A}qkW){*8#!e zru{=(i&^l}$h6%fnQb$mlv%;Q{ZldvUCrQZLlRRZswmpKYz^-%y0-TuOMUrZBfoLd zaWsOlf)n3+nw0X^VY~mP5=?m8JHeoUWkKlbC{+Kmw!$8bb&uZlRJfFz619>`5t0Vn z7zfIF9)rI#{Y_mX)%$Rc21Qwlu&(9dx;dukIyq1^7Ms2?Qp=>(?FT{k7=hVGuwWilE{3lj?u7PN?VUkzE-Iot~7@9^Yk$_I+zqj zBxw6kwrr9Ahp#9gKq}vrEnNb`E!Mc4JO+tatQ?4Pr0GpO1)A?Qa91f)PTdD4uB3fb z{RAHX4LzC6jrHd*e^SKZ*s#odd4|$K)UUJn!CNw%4vSROv?`eE(to8V)rd<6X5Cw3 z#pQ+IF5E}hIm@c655M5$8D)pK`oLQb+adoff%z&g$VB?x~7MxZw0sB~Ev znmr#xdp6YoVMuSvR=INnt3E4*dM|`3^Mb-+T0=;h?PS(gjM_hiwKs4k4j#_HEx*ZJ zhc5pTY3!7dZXQ=saW86i9Bn>j#;ISg7BNp(r+ln8{4?OS)pzxS2JjwlqwZQ53w;)4 zmS$$swled8Uetf2>+t?1L!0ca5-Va@uxzb*x%|NLgM{&GEz&d!MZwYj`wC(Pn`a2J zb}h!{9C($Q@`XuPbK3YvSP$mliVW=pVWVQQoh)an(30%<1ELH&4VEcM$Ij{dNc0V1 zxY-VVM|bX}0p*H-SIKvehnYjU+{#tY2_mK7^ZJRFDj8G^vaJgrTI1OwTP8_3f7m&Bb0YXjT|(;Y`g${yS!& z0zz49fW&DY=VL}i^KuUIdij;fI?DbT!U4?RZMr7+JwE>>vC78og+Lh!43p8AO=+nO zXJ3HCC8li3vqi}dBcuwrXwlwNJO7ug;bFbF9>_Zf9uuKq!wOq@&)PPM&XH$3@WAP! zbuY#j;`D%bN=c9_N0}XiKA^fzf$P4@_SmA$G&@Qc^~Y8`@bPa}U3(jr=q>fH zccFwBSLvaBSQnpc&}ZMNVN27k)244uj%7e3Vz`bsDsgM6TXkaptB4Ys4MiT+V&Bl5 zNZSddd!b>Tz15k9mvwHAn}bvQ9^L`Nj>0R?>R@!*5%Qk4V|LwJ@v3gHd0|qL_mu1z zQft-JhXC{1pow`}e4hJ24b}p#Vk?xNT2M)^0d(=37t$s!X75?oC&K*^UfT1YnJGZ! zdb)OU&{^X&#GQ5VRype){;Y+(&#x!XLeAC6>#(h8-1U^~jFhKsnjPAH%4nnUL(+J+ zji3$W(`(sWqBlt>+x!u^qwG+j~_uTQ! z!D_eS)8@Hpw)-54M`P zo_yA=_{hk>OeF~X3@0#ok9*ZG5(oPsi%W!Wkz#}Y+iBgH$A^NR^BmXb3}rQ2}S{r>w=R+pZZG9Xt=zZVF1{NeFH z#*24oP_g9NzCm_P zq{umitvls0jFhoLTve(XH5H)9PH4y4-uBs7Sv^LvoE`D56Kgc86;_b2J;zp3=jvf2 z#_X*!@cf$Y)Z3c)5z=nT8-buy8EVD39r9P6fLp!2&yhUYZuhSf)r%C(@Zk2?^s7x`o$953>y+-i>4jiBiL9y!+P21pg%@GO#8;2)y8yYW?S|P z*-fi?=5rV;M4{K4_Yw%2wZTMb&+Z_IWwmSUTW8j}*Lst`IdaiA$#q@Nn&ex`T+!TW z>^<7Upcv`!K@uWOTDVtAZsESGV~)Y0H6&V|G}Wr36a{5zM66E6K3)-r z4D3c&55|g*$4ohLzJ0E@;H!L%*FYIIsHmuz!x!Q5$dpbG0f0N_XE9{ur-t8t1iTS! z<5l|s!|_!b1;LzW!ewnr%F5)E1~mKnf*roF$g9TP!@L$V@>=P`djCPu;-QmPj*@O- z(CnP3%w=eWY za^3v>tTJk4!>vq4z`Wh$pZDiUB=Y2A>dHwE9D%LoiW2nLK&0z(M zhv671Y&N5(*YYtf&0Dt5vj>dd{o_@xY3=G#?G-BuL;zCT67@q%@_Nf$6Cn4QYY-^v zY`ujeXnI*8*NM+V%uvK1X8vtOKe2`FY2u##gqH_4GlA*{cU~tihsjNSeEE&pU{cCx z3|#)tO|#$8-;w2R%ZW-21v1UxX{u-P3c^a2I5!=mlvCk4cv+puXQpnZTgJZ;akmEC zEvoCP%mOviLOL4f`D6DMi!Tk{)~uaEvNoYPs~hg=ZF@qo-WEc8l}ag(-_UrW)u17xL`V3 z-2#qQ@N})qcrIQEjP6CvV|adlTzp(2+b>peW@xcGCBZF~CaZ5FOG55zEHJpVzxkyF zBk{hIUP7HdsW}?F;>CBpH0&3_{_6BR-mi$LI~i`)`cAk|QIg>td;*dyiDQ8l4AYUU zu_4NHPcdI`xg>0-s69!6ac&VlS*&uox9!t`Dy7T4l2!&Q7(NGltg`L?MLb${)_kk^R~B^c z|7gJ$s_h7`sJezJ_*2;kcGuHA=PdG8=@t$Bfz}qWul^M2H?~_veMxk-Jchg7krHsT z1lp%Q`fX${g(9_21s#FCG}-2|G1FjusZR2;r~_z(?w7u9Zz!2j;d9c(%fspI;ae-WTwwu$Y2j7FJWg_|laTDZUlXe{gY>$>LlZ;`va zSJFBUmCd!o2>$p8d#Cp2>2sQSzVY>J$T6ITBDu^AjBb)dk3hF@dnE1ZBDBcLBMa zy}sY8FSJ~~VrH6uH%zCIpukEK46-T-xnjHHfgii`@7B{AESXZyD!TY2hqt(w{C$sD z&T=M}3heOjSP9&(k)e|sN5XsW)-O?WXeh76i7B`m&{E{qyIa?^9AW7S{V3CFs^&!y zc*}?o2TJu{IP-@i^}l#dvXz347+MD5wDaL@onGG`{>C*_5G*rQZvY5nExjU7ex+h= zj{Aj)p7YswI`LguWmE;HT)`j-0E?PN|TKWVq}m?U7`jzr|S)& zzy9>tCOKZHaPr~)%aQ+Msb|#9kz*<&Q6#~djgF_<;cQ#$;XPp z-B?d@I@KTd0JlfDJ&lJ)0Ok^VIm~H z^!d`RCq10Y{KZ@RRNjBBye9s{$+W75%k{x$20T}#MH67v+jKofQ-3Ayl4 zxlWKcM=d5?tK?m4w~0!Qxh`srk=4?GJ{RH$r5dkgU=ueMSZ`gKfxlR=2i2B_*924`F_v{TREZ9Gj?XwZME7<& zjL#Rd$$Af^FV#t@>gE4j`Sa>II5!o1G&K#%7upj@`#Z0xr<$Zh;T(K`qpp!+#-v*8 zc0T>3nN|1_qf8WA(QBvC!UXHgn>N5Ca+#o{Y|2M)$E#~sLX1<`Ndx7An=`g!hs{SkZI{0L)WnQ!8AG+sXAt%Ie#+KoR z>1JY{H7H3N&xF=>j&=B?NzoY+KR_jKN*%x+Vf)M+(Iqd&DPnI#aZzfG-m25}+$s^v zpgWV4UkU52sqd-3`^rYwO=SY*eSavi>e{5#39jAyQL zsA3+fPTa%a*!s@;oXE z$k^E+wv`oH#CaW!=_vIRN1@8*yiOmui6QR_l+fFL)4_%DDNft71c9zY5`%Bq`*wVJ!;o_TYCZV>t*wiMl3I$*u93qv5kqXnb@{%qmxXWiS3DP+qONiZ6`bL z-rqU3&#CI_TI)yu>Z(;;eLwegp#f#ERw$$--=%1RgufYb*11>uK?lW~qbmj?%AU&M zOW}rffA?YZnnHO`Wfgn+xk)z>E{*gu<_ZkdlTTpMkq(o6>x;w1!RY%wqrS(L^cMfu z#~3|Kyh!mNjfWf>CA3Dr-!G~w)`2{>7cjVqHh#m$JA*+tgn*p_X*C`A`~`IX7XLd9 z+l8MXP}dG?JXm$GL&**DGwHI3L)=a&pE89dB|}N~`5t*d#c^qwAboR7J6X)q3D8q#Pp*((~^k_C3UZXT(^;I0@%H zb5QMde=*-p9Vzhazu92n1 zSE-`*3)_zM7v*&+;2mcTMHA*INst0{eF{d9A5>iggdA0?32ho3;!cs6yIX%6Dwtjd ze72ktRDO6X60GKh5#D*C-Uc#evQi4FwoVb*7;)5CpE0Z=(!>oO9p+!TAA6LaoPW~f z%r0aM6u>sII0QD0HQ@pjUZ~Vf9+BpRU+A4kXx`F87-5OML^KBxD+Lw;?LFgDS#ev#9^I(LE=`H^?|- zXNcunJt7hMZf58-lJ3iLOzt*OLoLDIhCT5MqyP+y$=W#!{m-mMFVl6ZPjdh}AL68~ zmYx*M68Xz)zMc(|BppeQBEJKYDdqtB@^kaG=SE<$oT7S-1k{GE+VFKS+UA|N4iKoK zBcLOC06U-d-TqH({^d3AX$%Cr6Mx&vL{`r$n!c^E`TxAnuXnrr839Cz3NtCKB*aV5 z&oMYjgY*Q^nbKH+$8n?jcYo^v%isk~b%jCw>L%L@enE3|U1T9}d)Nd?rUxdgN$HqF zNFZ*%pzX}9=&9d&mb1UQ$?ss%Y9aU>Uf!*Dw1;?g%V-}>BjgH*OMAj&`IYm({&-WH z-VF3g-;s@rc2J2EqX3fm#fT6N?i=03V=VSo>>A=u?ltqWcoAFR6y!$F`h>Cxlxa%n z$6-U^y>RM~whFp-V0;PEumIUjDVtc6jj+7{*CFmroP`bUjSK;A2vA@lgx!F_v zYw~Avi`l?_!&?@2kJ9n~Qg&s?mh9acAx8g;v1@4&)#ESQ%L1T+aT3t|VeiE~HmFf2 zlAnhZdp{-_e@b5dF(L5|Nn}d0cZm33HyMo>;sCcN!k7ek`a-vD-^ep$imiyTv(Mp< zwz0Rij*)^;%emGezvePg(dxlfOz3OUZrulzNPKhHRd3|nw~T+ZNvE2Q<<|NkD(au2 z0NU}}kIN-Z2EaYe(ckXzR|vecug-i}FUr5ly#^9um9g~f==RcQ?@jBron6Ith)3Co zjrt#bzo6ZhkZyJJw0b!ia2zV7(l4IqY+GK+9SphjLNL#AX%zapo*XImy^q9-=Jy{V z8utqAMkLO)KX#0ER9nm=On5`Gc9)!3=O!uD(l0trv4L^-r5+8Utc>Fs0*>j-LR(`r zhj53_Xc<$+$nVWFRV!0Pf*+>aFVk{&-8lt^FS(cS%Ol*h)Gr*W*pS5jc_fG|D5pK4 zWZkv;bOnjiaaX;U|Ezn%w)UVd@$t2((CH>nkwqCrBd7%qh6P2RvwsN744-Mrj&JMv zR$)Ep*8o_5Gq(~=9;)e8(NxW35VMPS&i0n)BvBx~q3oiHrKOQ@560sEG>r*e4ywkM z$`C>4M71uiDyoEDmyoj?rGZRRDKTUme2-@s6)AhMm{cL!$NtugWf#?>O9!e^4+oFS z(8$<0QIBZCl>4Wl;kP-8W-P0W6{G@bLtgI)T`Ay-9{KAJtl@Nnze#tt{||792Q#i( z3hTeHr&gfE%Vvd#UpV)MK?2iJCYCwp*0AR0<}aLk?t6tT)c91b2KxWOxyxDM4BSXZ zyhG-2$1QQK+rr3Qe73Uu#6GN|rT<}wX`awNAiQk~Pxg;Kk-OULIxsyZ(?!&b0F4G4 zP)e<5tP;UNI=-iyK9u2e@O-@oC+#prDTM}GlRp6At(hcm zI2y=10C{u*znsYL($#a-2#L5>kXdIq9ji&qIDIImYhz*fyz^Dv+A1w<2niT|tM%T5 zk8b>~#l5>2JyuRwLy$F1dsciFcgbA>Z1)BYW@37F{kq-i4Isl?h#>lfn2*HO(SCx{ ztW)z#&tw8q2)cw1>dU#RR&U@XikMzyUMh_x;B@Q!H( zy(vRX!X<1hq}yKb5OUz^M9`foyI^XW7vHQ}ER*za;P_VO`DX~>E$4R!(0j&!Ro z*5kC!!=*(P7KvlAA~mNZ6^zcf=f!mK&u^*yXURvysnx4Pe1fYUT76C;@17U@^!J|Rvhl%JXzr&Q>aBy+x+uIRTxkI*$w+g2m*N~-xXwD=w~-S`MA z0mJ}``Bu<$#?=?iz5d7xl9?<`FBq%04y`gNhHHGNlseF~WF#=Cv&sh%8`9S|)Lth~ zw}K12zzR%cO~%#c@w^l0P`fz+e)NKNLF&R~xNv_vw%T$2C?Z+cJ2LIIc-0U$nzrz; zUq$4kKYZOX{~A?cTQ)AFCNm^{U`%(^v8a;Chni`i*STI5Rb(Qj2*|-04GmQDu8InD zF|o%!=2~$FhB0yj^i&afKoitAabV_fEKqrtzGUYgO5>1dbOV6Wb($O%j+Qq zxSqX)5kzunvP59|Ii>8B5MlPa*oRYsQ#{V=K&zIY;CXRimcW-FVe<%U{ucJzaK5N&oEjX`j+!yK7 z_xyAM+YW;p9A}O}=DHFO0sjJ!1=bg9z|DmAg%jU#P$r*9;Ojnz8U4PHCEDfGW~sct>KOC2>6v3dUMt$dV5}yY&1NwsSp|*q#p%`FYUX~g>1~aW z10}TL{c}6gk9<8+zgm9b9bk+?oQ5*6$AxYd18dLWpQ!@U*4GPiS(}HXDa9_A)6F(p zMy=Spi^PmX~3`=-c(6Zg6>#LP4iwi8G!6 zCgBe8)mq-ful&4O7C7Wk$Z(Csa4jTAg$~-!_F@H18c%wv4!F{;I`MN~qLPRoBXPLM z5cqHm8j7VBwZwlf@`0TY73`TxB0f8+k6uDjv94KjbkfqF@26={`Sa&`^YXTRz6AhW zoK2S|cQ7{T5E9#a7c#Wf7({>a+dL+`AJv;dbGgN1H^M8d&yy*AzaE^L(I1&uYO)1r z)crbb+V||$>sp_{!ty`7b{?7x-w<8@090sYRb7tpd@Ei$wLc6pEcBQ3efWB(fhW%l zZ_LY_+V&L5ji!tZp$^5h9mm^%UKH)Nc@@S+f<|R3q_cv}2`)^THuq;)@LV#zoGyiZ zD^QybiH{}lov|=JP_y^j-L7*^%0hV+Pf_l@o;27eXV%4YgFdFoL$}?UeK>3_;2XOx zni|4wldGuvXHD`!5F%kTKQpyQH+Oy@wFAECFZ^fzqp#3-EP)E7zMY7n6gAZkVh8JF z3QL8eHzeN9G%lz|Co!xV+QMzNdpY}3KK?wGq>LQuPR;`4XgWH7>pFEV`Oi4byuf%E*J0G{$6aK3Y(Q)yV%m7)+D{R+Aq2! zq~(!Wo*vj6f;k4KkRH+4S&raHsPy1{JMH68j-e)Zfs>5c|0H(4fB!D2`4)k&9zrYE zRqkAqfs9WhP?wP65+?=fat`q@skqZKTUK^lkiM^Ll@T^-i);&A(lxnqGGqy2JC`B! z7QHU>YbaFQv|g>66us6|)x6t{F+a40(@}PXIx1|t5=e^X*W_cpL zy3lxNhBT;y(J=(9tJyomz_pQ6_q)xX85p#b>VM?NWjeZ^%BClu&6sYi@kQHai=-`f?zeK@)ev>!*|!((elRW1TmT z*I+a#e<(`1kw2C;EBA%_IwnYvW1M(t>UFj%2S(tLe#;#`eTDu)CphW^IS3``>ANrF z(2LT|Z^JdAe3NzC#!#$qHw9b@GmA#*SOeLGgfUEK}G zUsTN)L`GonlpZ&~=R>LJUZooAOyNxTEbaKsO~S$wJ<~`3^P>9~r~6`%5NNs1m2rhG zMmf#vG9mNfG9k!okJSPGn$BlUMQZ#jP|=XBgaNn0MWPx;bnu>qyJIQ=VL^;ZpzYYK z2)MNKUoNP7a<|*&O&n%E)YcS26;_7eN2l+?B?Ht>8CyHN)GnY_PMs|W^*ySL;`B8^ zPHtW1Jw^s`KV8+H$EN1rI;6=B50n7 zN5e-=V)tn+u_}o1a704+wtEF9qB5%*gUh*|Zdg5EHJvzxo_^AY_5fR_s!U(&wXA$t z2{VgmhMlPKC|%EUO@Di}a;Z|i_%_E~8)$JF;`m6;&}kSJ{WqI*_7D|EEa_N2oK5oj z_G=0O{9k+BpeD}jSO7mQeS??7nC?#Bw*PIL_Jh>GMR@V54-<>b;HOC3#85B6X+cvO z+kBdFQ9nMm*l0|wb^`2c)(@L01uo2AIYhc5mI)Q-&1cL0aR@`I8R_eDI|=pnxqwb( z(JjVf(mxiSSW}_>_h{y1c(`c>ta#-Li7|YR;X8o@57hYB+4|RiQPJ6J@N@{f?W;lP zqxbP(8I)PcoF*I+WWkWw+Le3rWUK}8wwqSOI$rh#tvweduCI7rADy##7}>%74^iyR zI#DvK*Cs*h=Q*`&RejyMI0z4;3qYM0IoZEEmUb8obG`1#^UzPTLsxtCWl88k+#P#P zzG{b)ZY41S)$7gniqAQyrO*2HYZG#rD8`)n1})|s)#`{9F6P?kh_YSDKqqOZh^$8{ z67t^dk-Ak}r7)08J1gx<=;;0JJfAFbo+s(7C8UvRg{`VpidD>zHaa>kWT2XVoNwbq z+oMs2GkH0ra9Mywhlov`U82gN4;TFwSFy3<0`o*+u!@!BJ6e^h^z<-gK{O%WLe-oS z#lwY$s}Rl4L-$g<8`W*{*A2=tXs|@WK-h+gch1yEyEdMT?ftuh?E)JUpB65&KWys{ z2;#Ajns@AZwKWr-Gz~t9cmPHfZ%b^v_I~W`7F@_-*6_56myM-fa;Bs*JLlpH&BjXs zLILEG3m2O1ZtgYR)p$jk*&4_FC4aDevpSZKXzvfQt(hW%7M58Gv=ojP&)W_T=BCP* zQ-1W3RvrhKI)0Bg-PrqG%e060`;QW=3pKJ+q*I=#QYBwB2fX6Lul|E|Q8Et>lPmp< z$+r#+Utm)8=6>5hz{ND`QSOD^_vj=iU7h>K5jK}8DWgW9B`lJSeVxamE*{0Ph~TuA z@UQn)6~ovmXEKY85N12PuFxx2XoY9HBebR`%;ci6iu(|pmNwV>`DWjPF%s|T!}<7i zeXq}+orf^iE=G%QM1aojMWgCo=WI}XC4Lx+3|zj2U89d{R~m86?TzF0t0L4=%K-Vr zPPC@lCvn|O)sG@`;z;jv(b*QKLW8OLPCI*~9w;{?%+&Oi9sS#Gt`i=Fk=2)Z#5Ot9 zs*4Jv1BRv+8VlYCOu%dhVgSdti&(1~Gl&=hM;K9EHii z=yP*?Zm~1V?_W~-Mc$%Cow9Gu=i`U#2M6oEHOCi^+5(lXZzaLjFkodzul1pgj&Cq7 z=8@_RC3W=7A8dz{-e~2ri3)B;^_?1w%!V78*m=Vd!pk3n8C59fsU zr;dh?sM~!L)50|A@E*fTT1;siHjMQeH+>gBriExt5(nH-2c&;f>RK~Bj-zZ2JwW5U zB?mhx@kr}(ra&<|wWK^lQo7hZ4rR<}_aB{G{RvZ$z*TuNhhNY4qNy2jiE~@%!x*db z61_k&T(-z?ZCtQM7Liy&6QEt3A=Rq&u$&@kKj#a5JlddU=~NB1&K7Ig27?||CJdxg zRA|?4b_5vr%Q7U~Q|`gmNG~Td%?XEZoK`j+hL{^i*M1+e;TR;gR|X;rW$$%xS`%6e zXPMhDHOa~T(^z`3(D>xKei>aW45_xoV^|=?ODXt?I=iE>mP?_hx}gv|x-&L&*|GK1 za)o#K_kvQa1Noj3>`>2|zWG(z_vl;^4y{0k5gUNttbQPwTN)Wq&%968gpNN!$SYrM z>ayauY+p&?VcOSKM*e592E%%T9AYoRW|m@KP+v4zT1T$Xb19WV#aNAyQtSA|gv{Lo zu6^2-{jr?mBH~4Kkb@G0!$gcyM`AIF^~{SnH=U5!PjSuf8I~Ajr9$Qu$KpOG@E)RR zF@OZG|m| z^xUsCK8xt;thF#+{`p-kU3jjE=beA#N*7|~Im>Nw93KDq&T<#Wc5h@cV_pKQCP}dr z?7qU$=fEPTiBD^m(x3(Qmwng4Kd^P^N*Z=k`^SrQiV)|gt0g2+ICdKc!q~%$a6rwy zcRFN1Gg3zA>mr62QF_3ljl#WYiKD^ zWvDzOaFKcz@9X6PwzT#e2fO#a4lm0Cay|iDHL|l7S!R!5iQ%5Wc9Wo)f98xJDGbvu z)tu0^(fzP%Df@%vmhFeyxF~10BH$E104A^p^_hTlP#Z!(2>tkgR|Pjny>utdl8-yP zh-{*85ig}+b|T!({lX#vs)(1)0a4TuIQOz$ugPZm{)#?F_Qe zp+G&_VR?%hZW4=?(Re7JPyFHeRYYET3cUr6I)A9@rQ0y#<+h95cIa-A0=>ePs|CBd z^@qP?1u9_J&|u#eqYnp|5Mctxtkq<_h4_l7n{s;369x;6R!b7M8QV}#{!9|FTX27B5%$3$A|9Y~$@zg_NEg%2zR9S_5 z<(Hgd%gkfob(>0pF2pAG0UV|%A}(rMO>|8HK$+t!c-WfPH`94ElAW{_!iS)gjXP{Q z^%^3{EX*|tyj;$tjwVfpWav^XW-j||2?!Yjy{sNK|9K9~-eypKw*3ts8M)AkCl%8Z z-Go#==ssYCRmi%D>pis$G*8BS@;q9r&s1+LJ;)Is6?D0TS)trC2cE$-BV;~at!jh@ zc&Q6dwRmw~;@HJg+C5%NptEm=kc5Wth~Qai7Zt4d2mcHS46xF?vthQ7-0+j!IbfF6 z!Q1-c-pYg&7xKI-F?Q^?kXOQGpDs5Cp`n>q?Yz$)ZRg#2`^69FW^U<5|ikme#CT47qa7q^9FPT_vp&-MW3`c#D!#2 zL?##+38QIBVd8Pr+sx^>lx!Ahr%JW(X-coTtpqXGz|BA~1MOaC;8J1NWi+zYKE-Ma z5zwnrKZ;$;^eV=^YL7z2N9I4{-vu;jC*HnNVlPJdP-es<&kPk zeUu;jk4bQ9O};hhuTj)6Nf;YNYI;pN;)2Lp(Fi+DvY+WET2Greq6K!BpP!!{*^lpU z{Ic1%yi^ev$)$io+l1-Y|pEawM@9*mhvSsItAtKe5s9@F@b%q~x~`4r0=0b7(1DUGgl9 zAJ`l@2G64mJ4uWF&2OZqT-vO}@7q&sWF4V($7DAS0E_4W-th|4xkfT*bM+{aP<>&0 z8ohMgb?}Eq{JSV~n;=|&ao#RK1R0ryK|bAaWId0(Hd2u~i57wbLLkS=8wJ})i;2eE z_JDeF^p|XKjBv)R;E=y~<*YvGHoMA8@X8bef8C)#S(_NXs}%|7D0=@b;qO*zW$HTl z{a?BW{9g&JybxE6emjC841!30 zsUUcuzL3SB&OspK`Y$k`Z^2+b#{TNW9Oj_?hz^1o$XHj{Uu<;mI^>-Y2tT5$9MOH` zQb)4b{4enxJie>3k7lq7zd9!`i9D0vU!fu4CLDr3@mZr~A^PyNkDx$unC;A=Yu zD@VN3@f)~V$N+Pi12R9AV^>I`4y-`EaiyPxJcGkYx2X9+8{IX#>3r(KngRR}u9p9~ z3pC&T@Ltc>e>ApL+(w!28i`YJkQ3y09N&7|V_eFU!ZFx@|OT4>3F4*wMQzOZ1vs zQ0E`?LzDhxfbS*n#S`4a$q4%Nczw@V)`1&nDiKbh%SKD9H;QA#68h4OKgpgGZJHj< z%*=HD`%v-_5ALD)r+nhfFdsoJQSda}qYgC!H_alyX<<2cJd*u7|G`W-HC$a1V*L3t zye9kmLDRKIO343veL@Q|UEbs>3BXMil2Sxlbxp7I?Ef=7S#JctFB`O>0uZj81MFic z-P430w#HCv{TKaf$=%cZ?Vz-UyKu6{q3i{l)CG_WH(!)Ir?-f1C^x_*#S!pDze>$0 zBtjp8cqre3VFX!WZ+;I87RFM8i{OH|q}Y)jOf4_QF#W{?PeryL8~}fg?8fD#LP=>| z0+ZnvWW>n@y92k;Pnkvk4otZ3fCj;IN+RcddJ8T&uTg-MjJJw@=OKj@3jQk%@qn7L zitQRA@^5PlLfr`AiOl?%j!zbZT5wLFu#SOHgV$G#nQ-CM$ZQleqv+Auo8nnG~B?!Kwf=574RlELsysMC0FeP@B)xP1Ou(Ki1- z*Z6Jso0c;fYQXVLvieFgr4|{mBVJ7$adeaD=M3=$)%Gy3Rdua0hWj7e_;O^TNGyiG z_;f=ojPnflGA?GS*mls00!%TCP5|&HME^|AWhP~7)l+600&=a@>lNY5xEWIq@AXDQ z!i0E8sVA^1Q*SRX{3rv3iGUArPGKrSUJ?S8`Y)moo$L}*xFQ?7n@R8toh*EV(jW<^ z|IZqA*_2F-{ZLa3LGGPuuq$D41AmYZ)+}7X|05eG8t?mF3tPQ{<}ES|km;3^wWkPe zBO_}{-Q~oT7z^MIrbxq*D_yaX6z7028eA!WDb_uALcm8I$$@DyHx344vrqq2R}9pW zA^6{o<}`J>MM!jZK?SQ)n7I%72bpVyuI)bOz;SB{(9gUh7+t1C7{vc<;8!1}w0 zjqF)@weleg6-g(I&+cCf9^+X=+4gviW_;j^6IVS8kdjBbn7P^I=`vQgt#;UTcVafo z$Iuf-H_S4c(~c9jIfcU7KO@Z^ys%6bw9H`Jwp)ATxf>r`11w~m(^OBe#NKL0oW%V+ z1Y;KnHTt13vw?$(V=v{&?l1ng<+H@pNxr8!zhU>3ff; z82(>ULq7?QUO=%s8TH0oLH+5~deKCzngL{!j?Vfkx9&mS5`xQvOy)KHDIDmTH76AL z)3oYA=1|k83))q`8Y_3HSG6FinoAW&)fgVJ$ZvgoOI;DB$32d5kRpMJOH}y}J9D5U z>62lQflx4K1W1bH)i-(>F&QQwHg?L2I1_aY#;3RRL!c0jW%{Kk!DWFc-=fxXYE!ve z79Nzk9^osvuBBs<<3RX3Bdk_h`XV2oB3ziRdQBWs91Mkmqr4#hZRN*$h`0)5lK(Tj zDQn7b)}OF)cq`gIO&UQM*VGFxFn`nXYxX%4?9}of3!=uxd)hL{RG-D^P)^L&n1bIa zzG&Mo765%7HtU?Zo~~c(kqTy;mG|yzr>4!0((Qaq4B_JA*FQP-xDFIVSeLLNq&)`Q zy4?mQgifzi#C;z{>?XRdKbl;{D;@F?q@6d$gA4C{d@ntea0=yy)@R|K0qG%?`YKCA zNO1sF3lZU(HJaYjn?gkL`-;EY3#wjKWvP-`9^j+SU>tkn7KCwnpj|dgyJ`G!B6IEA z(mB#G9x_Zmz*VzzTE-qW9EP82c^Cl|-%FwaX#&koY z41gKyEV6yEn4gYD+Q;RzTCGmPEeADfz+skmsx2O&`WQ00%g)`FBGg-p z{8)&5H#&=PF>oEAEb+ zenn|n8e!g*Q4z8zqw{GQiq+O5q8fV5FaC=m!AbI|!|TIjFtoaLXHO;6HG(zz5TM}G~1%vF2T;ZpqpW0&>iOHF$bW8xf1 zE$c}8?@RC7?%3^lK@-d$RR?opI&j8VUTF^zaKGXjvgnJDup7}Ihna1P!( zA2jsQ-QSV7xy3Uz=b(SBw}Y=b*Rg81*`8zAynRO6>;DVTfTK87MxRwwRr<^hx9^&f z`Hl9#{Achlnrk0y+g9M+<)ng84=il;g|m`mAk#yW%!;N)=}VkXap_sArVEQD#L9wh0t)HozKovhcc zb)B_Rp1tBc*IFCP=JKP;^rQD;ih5AfttSEPz3@;xN26IS&YReOQi^Pua&wMnnmDU`aum?WldUx4U)G5W1;mQIJ9HuWH}!<%`i(G z>x1L@J_P3-t;!RRWwZpPXA|J3Q7~t=a$3vrhnG2xyJfD5Yrn7Z11csMCVwI{Ahpc7 z?a_8|^Lcw6Z&)Jj0GkE9=KVrkz{z<7hZ$iF=Xu!2-K_6(`UQacKWsKB1G#<=w1R>PePC9Mq5#?2<9mpZxtMM%9Pbs!YR_TJ4l3 zxGrvE z2iLZYdaF8uG!_r|h`idW_ho|WotNKL(r_Hl_x_<8lug6vcrX8ozY|g_RLC|aB#h1vD)q9 z83K;)S4s*s(!2*vw7hYWH{=qEz-sceGejUhD+jXIelJl?t)P2Y@f-S=DnHW~s0P{7*?3>!*6Nv`Bytv`5B%5I^jXuY8A`E04q zM&5J90^miz02IwKgRb~xGOHAn#zI*s&jrW-OLgqN)k#+Vmdk- zkm5t6C`93?tx{;*TY(S2nC45@S8VOSPccA_4|df9K{E*YRczi_tmwBqO`);E25@>t zY3JGMt8c2$_E2?r^A`QFh2;llu84E6@%>SS?ugN6uxta4t)&dO;V#Gd2xiXf*DEd3a@zu2Hij5^hUhjEL(8QGDTn*Xx^yrp zSqFHJ4%i57Crf+0#WR^Z@!KliSQRx-sHv+?E(+Jlf~fm5`MVV)99fmL?Rn3RkM2^J zH*T3~_cND;QO}F=fVX&Mn-Q_p!8jE-sM9<#+enjWwV+GU>b!MTp)T%go7sojv`=e^lJYh;y_va{Bua~pX5;;mWui5b zSOHJPvzyNH)jfHl@_uMtU?@I}#y3TWcwkW@S?e@2>tHYPO=X>0?ph}$PLcKqx3Sl_ zU&zKJ?lO%MQZ9S{o_~$GQi7J>ZrYdfRjk;3LV_@Wlc+4g7Ife7a{A%k1eNfZf z<|Sw=tANXgMGifQecn>Kt3($+s5x?79VP6s^R?iQEH+&aTf0r-loWokZW05VB77Y@7&{DAYE-(E9c*hncu-4Xqd~gr3;E$3}dqyNMZlL%2`{E-0m-u5Hj? z-LGHxzdAGk{DhjwOC}eoR0E$(l}=sQUb|`zr!7UqeYEfNr_lPo@awG;9{m0NY-n>D zPvL@AIM=+7q6F-M(dP!5igXme5NsGD=9w!%1Kjxrn3+%YBRZ$&?JFU`0DKmZ`cJX0B zw|fJZlzJ;IQt~8B(_-HF?KdZU6$1%_Zq`9)UazXQQ7tWdHF?i8$Ab+6eC!8UgA@02 zdWumMd$~ju(Q4m#1)lcHu4*8d5%fw=L~AcsvU*9ER(`kAdW5r7dN9BfI&1OfcHM;L zJ9oIg4IWhC=~2ajY8*vi)gmXGzauF|PPI!N8b5=1cQbRH zuda^b{-cvqSXc=AAmj2S9-pN82ywd?u(6l>q-pYXNF$kOsmX7UvfU-mLVVe%*#-kR z8Xx+4PJ6W~t+=B}b^?~}_*$HG<@%+3dM6G_H;Xo!nUX1Mth5KGES@P-M;uiy(VGcM zREH?Jw=mGmv&|hFc_-*XWv+ab`iG3ypzkT@4QyT2&q<;%@-wU2+}o13I8L`>XCfsA zsrq+OC1}MP7_1ns&qs7rNIQSNtG5GIXNa8xuV+J3@a|&*Fnb;69|pV#Zf#CfBNpfB zAy{rn4`zjG$5bmA?eOG|dP|CkGJTEaG}4v*y%aA*0ppNq(7@~aD%JtaA z!sL$SJbY0ttdMbBa%qA4B+lRmUIFDll^;_AD=p_1vXF)oL1P9XV%qN=gg(H(L~80B zp5PXlNal4bOy9a0rCnm+*P%KN1;xYKyYSqQ8C7WqbJjI`hlF86aDBN1#?O$ab0|v< zdFa*ReX9nGl?e8uc2e)l$+U=0e$JRCjm_4_W{JMnDBIG?>sC(}f>X9Vu{;or&K`PK zQ@K?J$ne%Jl=;&SazdSND8m5dNp3>r@08f!u4k@R?_uqwdT%A2h*7kH4L$=+Q&-nV zk2S^&>ZeD|^0Zv7aW5h|OT4nyredOF|9N{L+N@5UuYDhTtNAW!9U%Xmt69VP_6E1%lKg

7bj&p=DR7GDN(0Rnb6L+tkPWc`mp?}enRpm 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 CgzC`0yB> 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∓0a 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

?0-T5DupD(qLGmUC z*N_7Ej+%Yz^^)W$wsFlzPU^obd@sGg*ql;DH&0k+dw*OYj{=Dz0Wo5GcO%ncWXYrMb5!~RtFMkc{o z zDIZ|bC#?B8k5pH^YvVL8QDkRj*!S7}`O{$hq;q$~1vcqI`1aajF6VyW@0Xy<8fxje zv47?n52%TQPGnxY=}?|=JHF#ac&5)p0T3Ajb{WW-459~v1^Iv!A=E*xQOuIaVEc^l<7`+Fn5My4BBv-Y{cz5KI%5!5 zL8U#&aKb^xjPPP)Kd95Nw|_v^w0#-aS+W^^R2xZlqgeJo z*w1a$uAg($xJp_X>gD}6mZjcJ_5r)qa~QJ`XSq}c)7J_3k6hjr%R_#X!x-yM)5D7O zS57gRx?Z6Y@b&)}XB7sOW4I0NK7ESx1x;CBvxcl-0y}^`bpnF;3`b{TS@hRd;kX|# zj~u}S-C3CC2!CKK=q_!M&T-Wv-s>0OVr#6wFGS9%iiuIxPznVwD zLWv4?>@%1^16-lG8e+-4z*`63z_K!Q=@?W0doTij*84fEL0ljk+L9KNS!USJN#W$G( zZDO}PV0Yop02s9Ge9ml*yNfEsvw^5Fs1|7?wit!B0W&bAS4X ze!=%FQpca`W$l^zXYq}O^~@&t5vPZMj<)WP@Dv^J!BY@m_AF=eESG+rBEoJA2gXks zfNEvUJQxZ&7(Z=BJe-;yJOcCn`Y@!7DIF6?0XStfh?=Cp$|DaeQ$JeV!Uk!wy)|Z) z$^5$Z@m>Z0m;h>+AaE5vuWDx3d|(y;jcVqLIJQ@6(%-iX-G7h5-<^Z#wHe7xzb}jbsWXI zX6A84p6E?TMhRmc6L-y@Y#ACTN2d{(Ay2rW5iUf9=Rx_-eL)g$O{jUFmM12!XAWd zjvxpbDU#f|p_FH%2Ec`hOPtBSTlJFA$6dkJaoGK|G`b?c(~c4IyO2Ql3s!pi1at-Lyu@a9XeeT65Ctx# z=MC*u{3vA+$hQM62daa;fpj_7t%V|H#O@aNU+mdEAlqQs>DL;Xt$kI}{nFQtI z4)_(09-7HDstWUbKZq(A!kEm5nX(qXq5#~sJV>_s#B~xCmVJlNh|eG_p{Bez0~P_{ zMGYPD8tAH52yMX;L?A;En*Nl0Ix~=Du`C)H+3CbHZPGq&s&6DZWslPwO_nkz;$yUJQ1EEzN<_S`gnb-yf4Lp+ZhX-FEy1-f7i2$~AYD zr4+`C0!{;?&l__#snd{dEv`)2;1_$3}(&n z8t88dSPeJ>ACGu%O66O&MD1%xIoqx4&Vc*yv-)*Q6=SEPJm2}os&ytn>FN=n<5j+% zkZ)J&xB+`BIGqyWJbNnv5mM+g`q!td5Bsi+b`O^>GTHJELVfKz<@kL?%WqCaTJDxo zZWn{;0SQ8n2Z3eEjCR(e?Dnm;RP>A?&UzV#8oZWv(FTV7Wy-$kezM=z$ArJ>%7Jko zp$t6(>^t|?jzU$m@f^fml^j-{nEg5i9xK&V1Pp5h`&6a7f~XE%CIk+B$3>>e8k)qj zHKptab}$Cpz+bfC6Ma1KZOBf#VFFP#);o0N#N2$I-AbVY_O^c0Q4>e3a{S}o6d{E{ zu6P3+*8a|%z>}Acz0$Yfi(>jLLjcjICxSoxNqeanOT+{cZ(P*+@Abowo3yW_2yEnj z;&uQ*I@|)s50>$fsa*-S@&4X+whKXo81Pgh&E`hb)WMKIdM>36%i!JqiL-~9{^NH* zi<{Z8rvfU;?HlHdrpm%&j_%g`ASY%V?}!s#aGY#lL0q>A99wWfR8T>_F%W!I^aB?4 zbc55P>8~sz@vel5p4mZ37?tOa=xb?N=NxF!T9OdXR<_ja>w)=>00|#8tUfN!DPeB^ z)NZ~Gn+27Y8v8V%M^2Eb|jY69APyzk?Yz0|CC=|FRZt`=@&{FPVsy`^BZH{#vz zM9D3jX=s6hU+&p-V;C=!=4d;=lg?G+J4WlZZB8$EL&aoXffh`S}betjYF@E>rw5@K15exgaPEreX2RtrK zIbE&@UuyaISJIBZ-+){vM@93)eaj)ja5Kfm23K6=`mkFjZUgt~%W@vNv>BI(k1JC)e)PU3Z8UJ{DT1o-XCj^#N|ljAY>E6WR}plCwh0>_&{O}0%(MXboaUe_n2Y~o zOUWvY9FOaD0VZPQ1E}gK6zP%qwP?STPtfMq%vg^jm2-7UAE0^B%q#9>J+N;JysYbt zrsC6e^7VU+1Qv2Zr$p0I$P$W5xOMHhBAv8<)(cB!bj2*DIYNMdY~> z!OLw~C!W%f_$A{vJ~!6{XUG~WDP$Cc+u)w61@kb~KqE~Q|0}_f`+(x#=O~wXl6-i@ zhQ@9CJ>vBeL*}sIDe0MXW`V`~CA7)4(~@P@pB7CIjp65lelMC?<)g)He19w!{739} z%R98GTSf|Hb`#-_NzdBVCWsojhALCvBu18j@04)J9@UW^P8%t2z$`+}+vX{ZtqX`p$5YP7-Hp<*A01ZS%{m z##Y*!Wb|diBTplCjM(8F8_LSpZDhSZ(o?jlc~RV$jNZlZ9~^ee^QRiFgt!6IZ@u5a z;j^t~BqsY@r(e_mYgN>G=-e&$M4^ls3q=o9`{(V$l(~k`(H-21?L*Yi5}H5_&VPZ8 z>7mbI?XW_JfxiluPA)icGxO4A)4I_WLjyc8T~B28d7%b!72N&M;Ps`T)e|b#@Aieh zR`f&uGjUVUMke@d=eez~S9hzg*EeBDjC@Q){g+O72OIb8t*Kq^BOZ0oMcbjaRXrCd zU`p7GAL8cWH615dsG3tA!Yl9AwXBXR%`QUHL`q5bl}a67b|ZsEQ70&E2B8fm2qRH= zqp}{pZkX_9g3DWNWg^a@762Bb-<@%F6qyD0$t3}ys`K}zm=Jz?zN4C5Vu5!G`GpX- zxrXXi65Rz0B9)rz)@SvrkNx1Fqha6)#^~$LW;7&>QT5fvPkI6L)?XgBxs`EkKIm`D zsg994#w!BtD`tfNmR#jZ{dfkb&+i#=@O>&vf(J>Hy4qxB|F+hlGUDfjhCJDE8$ zu;RZ5;_iS2_;kZOQ2Evt9SFW17;iGkT<8)vc8*Hkts%QDf4S z!1?*u{-29r&Q+jF=_W zxqih;YCle8cMWx!L(J&P_TS&S((4#`0STY@z3KfXf0#-^dfrr}l@%p^+Et_SgOtk{ zHSsRVzD$lkRwsx-sU;5?QZRtL8zg3vJ>1nz0^m~g;ny@L7aGzQxVoDENVV{2Aya#s zf8eOw@txRbTv!i;&;9-q(+6__2%X)DtrVM4I~=J@8&%9SNSiva4CRG7GC3v?!u!> znB7;wFG7MvG~NXnZ+S3hvp31$WVSK>!l`kwhDn`kt_8|f6;`dazZsG|tfBUW8bzssf|T-%*f zmac0vQ-X zcjo@7>U2Bu*0r#FQ3{W085g0l9mHd)Di)na7xa}W7&(Z5b2%q&q1o{{`p)Rau}nx; zCA&qfL)yRI>_PFwVZt#B?J(F375P|F7aC%`{N&iN=C{Cf$^cwwm=LCb0^#?QGZr7v zScmJYN@~xI0QER9eu9*0788>Ozm@B6GvQfXK^B`kJ-jwqb#}g?8tzi{MEZgkioj$< z%O>7M@UM=0YcKl8AErksMyrrnLxmr(4)zUGzm zoo_r@K~bLC^j_jg)t&=2`(c)6xw3TyeO^pPOpfL~W#*OoGHovPONR&2UhyGF{yDYh zyjUF-8Em%zzsSgeln>+cxKj)!W$oCB3n?6BXkU3pYE<*5|T^ zb*~#bHg`INCi30*yFz-=tcM)Fs^j7QOTL{N&~b7QZ)~;jQ zwry+TOl;ek*xt!Z%!wzScw*bOZQFKobIgTJv9V7S4?VwTbk%!|-8SxAL6}o(} zB`C(=k&WE;8txVcYH_||2* z&a1XHwFh8ltD|GiC9Hn2f+!iGsS8^JVzNqE*i=205$fWdgzUt2#XVm~VFs*k?eGnn0bn#@?+(;ipW@r@_ zx9Y-5{9_P;XQlmTll_lfWZQ|MaD#?^@IoR5g$tV6*8$v6{27aRv{lpTdo!oor~Ob_ zdwYB*m#R&&DN0TM=@|2(PkDcto6ujI1Sclq2{w1ZtrV{IjA&TwYX(LdYz*~_?@m3m zsBA#>M^DAf%)CFd+N7d`qhdGIA}svaxNS9y`4$0ZuNYfH2WB%8`cq3C-HWlG3uFJQ zukifTFBkU#VS8Wu1YBavCDaDX{WLa9LPDe-Ytto1g&wKhY%W?=$%(;05x88G;%|F| zV~Md_dyCv!O5?#5&H{X34=#+;iKqurQwr%tf%wf zG8rkvD!hL0^ZM?Ukl5>wR^p%|NWI4W3y8?@qc!j+Qa zXIE?(x9|cw`+z0=38ALbW<#YU6H}wm9CMgl)iZ67%pW`=1H}%lreS9xHAO|CNVvcp z^0N?ilv!)Wdzwn_R@+;kZGp06y=Qm;$S2mX{dLLWmctHz)u>iwQtx5ffxQvr3RUR7 zT?41j^-Gg-AuhPkA`dD|O4 z=~VP+%jS)HneKa6rr24MCJKI8##LtGgLLtDVVGFOPH3Z3_JoG#4tWKMZbd5-EdSwJLjdY(Am6b44fzDpgDn!lEd=<@dm|0u4l+Q-GCEq5O=csT{g?*33bD*$ukHv&{NQujQ$RKZ+%-Nr zNg^CNI8g*vjIxk!mzh}mx=aT7yQ-dZ_N7Xck&C1n2Z6+B%oDQ1QfEi8G}e)P-3Ggs zPLu~-LT>o{?96~o%LGeZAr1?s0dIQ4H}a~HE4V+VBOtrvkXnYM6e@t4)rq8%i%QF3 z0KZs?pcMA-ki^6u1n!rk6BKk?SWbw^XrGzFCbKgs|2iJ&o3LvGqOTT=c)yo zfsE(vOsD25`s?}&cYDBH%)|7E0in3!(CM#|ZXatQ)HNA%V&)Du55Ek@&0c2bC0LL%T}F&)m_4fzpFj z&zH03itJWow85td^>g+1wj3WvnY=&d8Mjq>$)Xt|9BVYY7gvB)rFOmFn|&z$`X-<-777fzL0#O2hAm+f30&5>Tv(pdv=AmOMRd7Mt7UsC5kMAyBuC*Z0#DgpT%N~ zjv%dpJCBWR3@DI~$8~~8a1R%A@+*&S`VX=Pr;v{$KV?mor;wp7DmgBYZNrA@J3}ek z{WpjAy_BB7?F{IS{12$;(|vi%-Ezm!2J)Urt9Ck?S=T{14U>q*mkN=&b@O(odd9&4 zA}uC}t15Bs9AUAV-FR{pomqtbG`s6uVvT8UB9gui&|b4t7vea$h10>_=ixaFaT!AK#A$KCmH76+jtp&bw!*L&(WyD{I`CA3t*F$0 z`LwJR*l9I`iwWcOJy3MeUi5Yz*LkNeh#byF$dwW$6vB^A@zeEj{@tg7+FPy?O(pcV z-sfe}>a5*ogHO5Qc(vLNdR-Nc8?usM0*~~`O>m-k*bX^mrPQ8a19;rHvI?D2-B9!j z>_v(3_-k`0{^oQ%w6>-C6o&7xxusB{vRH2qunxEu=qs%z2wde~m)E33G08{i6;}kW z{J`Jmj=A`Ce$VhPt*tI)4fd6@LR@H1kNaV)sLE6Nk@p7Tbw8ZO;I*QV95iCouQ!AL z#b8RPSBGi(k%FBelgzc-6@TvG8}dck|e^!<$n9V@VTUprX4w?qc+Q8 ziePGyhN~ONpu94NUXbZtKzL3&Q|PHirbCgWaUQ9%DQL=)f9Tb5>a%(3S9$5I*O}_V z{6#9#{`hLW>{gg$Btc;T*}|xNF)OnWcaO(xBF0ZLkZL48`ma0_yDbfdJPCl}&J7O& z5oZL(ck^0aFcp~0zDSFNKeq7+Da^DHVtMHZI3(Pnw!QX!zh$o{s#6JncUG~`E8G#% ze;injqx&%r+ZN?X_!3)KH7RxWVmnv{Sy@AHO!_AQ(3glaq{F+Ik{>f964RDs739dj z#q_PXmnKpuxBdba{B@5?mdijzl!-@e_;(oXf6{Z1_Z_6JMfXzfapE+65}z$*J$cHI zYC&*n{YY^wuQcw)KV@3+zGJXeZP*2F@S+oCV@LGa{UK=xez!rsFX)&{c~LPuk@YKP z{(qg9N(I*C^G(7-3jrepqh=F+3Ulxv-|c3@YQlInQd)u8SAe!&Or?;l!!S(MCbXq0 zOWfB)(a_g7)3?+x*5_vb9$(S*N7q&FCXf#|d8EcP%M;;1FlvS$dIK@gX4MdYE5U6M z7d<@i2Q~!@jIRRyT_8vShGL=%tp7`Qd5p?RkW3OmWxpEA^s(0LVoiz=UfT+*@5?i= zGC4>^>gzxF4e)6AN01RNWn@PBgX>BImCwsU+IR0_Ifl5{E4AR|Tk@keR78(|w@h7Y zUUp1xs{Rl%wkh({Zef%X`_mjqjYij1H;g=l5@>h;L6?^ZdBES0-$X`i0nkGb1mJU^ z9bg=P*=<2U1H1yF1M&iX1jK^;B87Pd^9{^ec#f zoRNM2IS>G)1vUh(2O$9A3;yqv)C}?ptO_I&v^jteCmkyQEb12{2?z?}5CjI8J-86~ zoH4-wm{ovl7m*0%7N-$N6eyG8|l2n7zh zCJ1&F@f7jEPXrjSd=NMgk04}_s8FIVSQJPa5CIUm0H?p;2jC0f5g?oa9sz+YP&h_x zBnT|XRcMYFN}x{&I0&Xj@K@jrAhuu_;9olj+cRR217!lCBSEcFP<(RTCTTz=L6RW_ ztSNrIkZMze?kNLdHgHxXK}eJwFtlQ2DiXiq@cN=jrNI#;dVf>Ri1u!$E=cl8W1D0U z;e|_*`f=dll8BiFMa99g1uK1%v=}1LCXqD@E{j8~3FhJZGP`lN5~vBC+72L?7T*iX zh=X^Qupc6n7fpzRz7bdbjeR4j8i#xXNcayCL;e-vK$MsIMuRgh!amI)9@r!%K}v%$ zjY1eqIdhyE{W`%m5lZ7;Z89 z6#re2f=rSoRPr*1+(em14=z}ApH-ByAhT`4R*rcGr<$jM+sifujFTf`z~oU0Kw+2g zVj_>A-?~@&dVF5mVCeg<6?Q%^ZkrO_q*M_wjI;}~Twd7%PlMqvkPRj{W^zL*m5<+= zX#&2iD%O{$1hFl^mxQHYKC89<(uUvp%WTG99W<-Tt0(8cwKP9rF{$9nM-_xAcqFvV zjJ^-yJ4|M`S>qxFY0}gf zd74yFRq@o%rL2Ssk7fw|WSP9r4y6>eA&e^?2K>{D2onRThSrqKwhG(En3O%00NETk z8kgMEoVZTcDP}g-Qq6XENWS!kQ7gCWmYQ|R@A0z7xKe$rK}1r>(O6ReEkQ#SSwsNd zj9t$I-No`>ckJFKIX-<1HwtkyxuM%5UvCd<{?MMk@ZOPb>q}%M+=#HO3F8I1>>~N z$jgY7)u`|fwAC=eXc?%0^o`yrL+c0(f7m!QIb|ZcSd$v#h5M=FoyLS*YYAf~(VXkg zy426A-_n|MIiG*~I~RXoKdx+Pg=6*ZjP3_Yap)j3$^`yCaF3iZksO3Dnke|Z&v^YI zD0A&V)VFE<#UC@N`AABZrXkoOdLh%Wj1j$*kVEC2a-moz*tS^#F&ne5O!iWe?Ea7*ItJHpJR`{ zFj*pzaN9(AL+OFP>tSHkM z9RYM<2Oh+kNLYKGf*vKAWfOXh=kXBeS)*C6b4Usfy1-Tip<^Y!(eS$i!(&R%T1-uq zF7_0qsR6VUM_}vIx!EIQY#3Z#qH{Bp7&ARZO_p*0oJ)DH${_i&)=zDc>hrBw@t6^%WcR`Z009@1DGS}Ywi+>ZCvTRgq8_thp7wcmN%8inoD(G#r-m;~92q`5j~@E+WcX`90MyS_aO zdDG(>vUHR8e%?q>^7}&sxO{5BUM1}z?g%}%XsZfh{)s4PLdInhz)597%BN+K$I=Iy z2~S3dpbcUxu^E$_UFq|;yDJ-pPdO~|-(O--_sd zr8!9G&bAb`on%WV|5jnUu#?Px+NWTNB8jkf8@3FkO|!`_;iA(pd&^S{t2%^}AaXkcT5>_(4v`sbe+?H!SAY z(}5OtVj@D`81!ku)v95I9jpprUak3f`9rR<>*y<8^)7;jHss80`3)mqVPT;|&BcB*6Xv z-IegrQ2l-A7<=}ZljwY_yV^p@Eb z?=bm(0A=*x_7HeA=uA!R?3$x17;0>S=n{f8ub4FfYKm?2AgW8D5z(JC2ul*Gx9n$v z9WGz8o*}^zG@0#kqHWU*VLH9kqqN$O1#91zS^rC{^*^rrJ?ZN3^x0>_lQPMcfYERt z7DK91f>_t?m8ZE&P(B#F=6b7|n|=7zCvpH<8YX{a0(1)6(9NGRj_z!l@~Fp0N_x}p zqPf{MdL&826K3oX1YFvvswiyciRQjXbu>unk_$Z{u)NMAC0S!iM4^+g=)b9)J@t@c z>E7BQwTba*6VVexWk;-C0jN@n%WxzLb}Nd)0W0`dy#f)Dm4X=^trx3Qoc5C zOCNDBmkrL)?Or~|Nw&@zG47e}rHFRA1qhd|B)8Yq{BPY+FZF%&*}AprfMn&mKw-57 z!{u@K-|5YTi{HBTj${+2H*Ia^K2#q z3a1*_Qdw8I8noNmf1Nv2zq-zM{M5zn96jYQc2lUAf#Y5E>py77Bb~=9LfG)f*St7% zb5M88?3Q)jK+}aLo^0PF2bc(vE{hzRnSZc%lPC-nZ!J(6CM`r~LyrMyX_cmB%?E1U zw@{GGFC$`rZ(>@8x{uf1*7)oXd?#pg&fU75Nhiq?Ov3UC1zp~LbYyhQMnPQavtk%q zp1XoVB4tASHQw~|e5aXr5@t$DF%qLRQAo%gqg=T4^C_b9>v{BJAe)MSQaw~V@hnz2 zgcrX5d*Ag^6QLkreh5s1X9zcGb7j^f*5g2lfEuB>ifbOxNXZoWI^6Zkrf`!hOyGe$p5EdbqpIF(YZb|71Gy*hFyJK6`fJYdW%9%_vRi%f*ifr~t zngMTqz5h&MkR@#EoLY>|KV%AAMuRsR@3kb;wAE0KBA0V4fvM@m`euJ4@4tHLSlXWw z&DRfiw0X~_xka3t6N}cmR@{4Ij-w}au(~1UZ8*9(o^BRH7k${!^@u{MILTw!NVmOI z=R(S9*vFk50AW!D1O5Bndx;iea7~%K;rD|Z9B?$~EN1|F%&Eefkgn*5`$+9m&mf&w z{rA;muYnvys=vK}Yn3c^zF^p_j zL2~_>ctDnhwYTa)iLFKUqIWw0EsBvn3imtalnl}|@Y4|~mNx7X!TZWOT07Mk3ujpe z=Z;}jMwaxM7Y-8YTLyP#wMyCCW~cEea;5&$>yKeNS41HS;b`+9(mrAUloRP zxAJ@cu4u2)8aI7VS8T}cCm$U5nY#n|PLzss;l!dQ++fGHx=ya5e&9bJ9q(Gso4N>( zt-!y>%0Zq81H+KC5Y|?eV?_#mKh5N!eNF`(#bzR zC%3>wscul|2ZmDCbeo-|v}cn3LCIEH1melp z0av2_kDbO2jhVTv#Ybg?V`nvES3DPdCKYNzO;x^dResdO1S_eLjLaW>DRs{^qZ^0P zo2)bY@4G=a^3>k1X){O0b5_Y+6nZGZ@<$9YgA8?J(rIXmml%7|JXefuburN2pG*Sj zI(`;LGCj&mr*-yynQ0(?ll}X}Kk>qbDjFbs>?pp~cX#o>X<^0^MvPi8NAzA()6;G{ zxFL^hd&%GRsGnNKPtN!ii#=f3FEp^}{hIsmf>E9`XGi(11TJ4j4*8;rT%efNVhVnGQ@x$Qf$_(S z(_@lat=Z)f>s+|s1yTLSx|`2xMO}&yMkZGX7NK#Wtf8|^da3=UUSYAm;3d7mV$)bo zo7U{^%~o=6I+p)p>RCr3Q2t`I*z;$LZu4orIK9+iZuOdRGnRkLqi>LNXU$;044*#f zWP#lxmGRReQ^$>)&uw-m@>^grW&b0T8N;U4Tke+I{=f9#+CSy|Q0PvrQY=qNSq2i1 z1z-!~?{8y+w_;_9nkW4_&yDnkydxTjVP5(8C`IfuCuj4$qsu;=K)TAQ-nbZ>yPme4 zLTVo8wh`BRghFjz!^Vv9K<%Yg5q~~D0+E&&VG6F$YSDhf=}Sf*Y^8dF$)JPHmHOh< zLf!DnKTL}Xfe{Tx`)c+6M3s@aSoew!3B=gb{bF}0P5?(;3pzS`OL~J$T@kduFyk6GHg> zE9?tfPO=3IF#TGM{Li|IQJ7jH9;wBehH&Hl&7SI(+h2wN&TeQjoqj#0skV63$(yG7 zWK_FTFZ*dk*hF-RY|^&hayEjVa5v9hMmhGit6E@*29Kl%?gzXRctNQVJTfpc_5*)T*3IG{x0dJUx}vvt}8wb-sfn z^gY`gxQ8HqKcK;M|LmL0Mi!2uI<^zYH_HlFW>0rksn}#kZkvCaBRm!mELo=UW)+G$}ml4=&yKIfqO^vO8SlgQz!?qHdkP$tSQWx7usX!*HeK>d} z-?6MekoQ+HHH%?nLbtNVW2bCX^i#+7+^x*lEp=?m@kL7B+}>02zAE7E1{haaX!Ds4 zC^TR#5I(@fKfDEfN}kaFm2{Hna5X?+Ps~aH%I@G~lSz$-Ro+_^_L{H}Ps)07vC=hr z8Xual1s{uVKN$sC(D0`(sx2ys9(iKZjWx{h;bmPSAIgh)EoiAe0YsGKs86@NNNju8 z>#FJC;Ey(&CU<=iF(ca-`^l?za@B%tg!(eiqvXcCBYjuZ_2)}1#|w%xJFDQq$E|W; zFx0##->z@gBz>dUTAz^pv%kN&=~WCFYcnrMkV{67iaYp68r$ln)Y-jedY1oC?OGLU zd&id9a*%9vWacb-u1wzE!v1&RHZI!ZwdMk+W`jjCmzo+!i%oaKGQ~d*eaLV!`klvj zHMY@zVzY3Sbr*OGCF^L>mYwPC3+e3uZe*{8KkbDRuRnBb%Ycit<{xAgd(j33nQphm zYpYu(jDw`Co0A$9$(@~hgy1Myfb$VcyFaXl?WNBKK04gHtRwtv1hwD|7zyH z>{0BK6AwxwSS2RPDY5#0aQzXAxQbl)uxHZ!@#I+mui8Y(h%IFB>^Yia13WAMi;%d7 zW%G*GD$++jrf20V`vv!;%|)Z!*Sgma_UsM7dIO+!$0Sy>^7PX6gG~pUiyu)~@GhU| z{KKo)30hDN3c~rplj9l+eT`|WhMG1u!m!RLb9v|ym1**%f_Wxk#ZhaZ@UwqTHv!WD zmvhK#(S|y6?Q$T-pW9ttCfy&H$VDgqiMTlFs*w6y6aCpm+`9*TVjX!SQxWYG#qaLx|)Lu@7ePUw>BnKM`+U0_k(+U zm;Nu|WPt}Fq{K*^Y~et=U6CpTvYd<1WC}na^5Yd%)V#XwEEI|myc=U80VqIa}y zt+G})^{UeIty-KmyLzwq+7irqu3mk=?|F6y##E?%xO9};U3){xEj%C*)Wh+`?NJXQzG8 zL-@o+jrO8A&lCWQk;wOSqP^I^IznQiPm{oZIpm(XL#<-76rbw;a0!wVcOZGEbKvpe+ zWy2>UG-#_`^>(up)*?Ub!sBiK5iMR~u1Mav#obbg zy}tkN!((&*PaLbROO&mtg@pwyd?D|GLK^(==aut^2fW^FuRf6?yywcz_3FqE$-Zpm ze+nJT58eq;W6=T&iASTFjNroCST$6f99g`q26jNh^CYf8N{^7`^8~Do+#ig)-6l-( zd5K0~8*YC@tJWprWV{wz{3)M@aJ7DhQbls#PkU^T{r_Bjj(oRJ%LQ=D3OnfY1Z>c-&W9mL@(Ft8;uRpbSpkq9uhhq0ZYUxnpxw#c zeNvD#NGrNdtLfNRotq+BUn}!C&w81nBmH zgPM^<4lhRfju$;?bzK+x44d|l`vU)xlLx2Qj7T9H#w_)eYIBxYuj{Th)4>5LjPqhEAh`gSX*}=~> z%->*uwLbm<-+_MySaDxOVt%HYCl(6ubDPblj@?hxfH#R#JwOKFidRbvriYa$NhA&?G&i#kI%dV<8DO zm4||1TN#A<6BYFykpt_>oy19NpQecwhN>A3cVS)Vj}0A$)*jb>Pv9>_grGjcmYBz{ zu`e!tsj$5LVi8b?Drwf-C4g~{PWs!Vp;S>ymInV`%8BQl&nM$(NWQQiIdPm?JV&2X znBtvEDcZOS-DV$+GtugXG?&8u@(HC@Y^6~MrudYDUuwV_nT zzLdT`tL`&h%xEz$)n?2n0L0C&|@uDoJ3LN^pJO+C7} z>HqKcZJb7mzkQ4v?3<(beDZZAn)A>Byh4g_x~6TfTZzv7!%YXP?BE@|wr42*$!YVB zoAaCkZU3!HJ~;+F$NP8@;rMijdJR3>0< zb31E$M>lxfasl?L{Ci9wQuS2qrHE3JXIERLv+-}SQa@3j5A!l*s%aVg%04!lhcsL3 z8%|_j%|4yvDeK%<;j`I)q-=6-3a}d;uVkPv9iX==Dl7xi*2#sV71>emd}o)KTnW)X z7U)}^g>>uh!`pix*8S-x^t@fzBi_VXkuU-&sJ^(d0ts$EqW7u%LNPd2Jy@KtJ z6OZG*_4%ge+xQkPleqhdI2U+X*UR^AqvPR3XXPJ(rk7v1Cb0*Pe%@#YXeI)^#genM zMomW;T{mN$$d~;m7e-WzoKxQdzihw^>BXO)5j2ycVQ%maWk&&}nsYO(}C(yRC^}*vG)<`X@~`AKR1i7gP>?m@tjCDNwy1sUv9@{u}*&HDVsjBSYQQ_E&GFt!?msm>1-+cLcy zPC~VdDl_U_3u}G&9yDy3^fAPW04t+xU-rVDd)5u%bDuFh`(wmi;oW7ltHQ3JrX)TW^TzxEKe(=SS^mzz8~}6HO=Y&+9z_6U1z*snDJPecNQXuU{K{DeSFwH2Ig_2 zG@wTY!&%)|>!YY&JNTWOp7fTo2ISpBw5_8Sye$10h_wZJtV#-hE>bfh@v)8g7;and zm}ZYYZsNA{=FbRIMbW-;%I2)NN~q6IH>B#wXsxawXvDpAMV_E8Y*w@j-X|UMaflYk zoOH+xj}qF8sVcV7JKHYI6TR^G0#mR)s*jX;93h*o9S@{o8=s>L>E<&fQXH;JlTv5I zHU56nC)=m$>T{9H9!$r~6MW8F+p@p7Csn~MHfwp-N%Xmr2o3l`M8ClP zU#=@HUHiX(RtP90V6YV3Vc+3@ntW3`L&WUfz~@3iMWLsQXs4%nFzEVRrw~Egy5>Fn zY(IRT@W7d5Zhf2>TTfl)cbf)GK;uPVWWazA5?6%lU-&OR{~!~g2sK4R&6tmg$)EIR zkR$V|@8bVNX;D!sGe?LP0qjfOacY7VaQd;5i?;{}^Ri~*s*ISJ`%w^F8PRn%D(yVM z=R=z24B6dZv{%iA8|}8!HqnlZp4rf;+?}htb92}mQ5rr?uxY5EPusP~JJ%O%lV(*;tTs_W8_BQ9>_%2Q~3=iwB9YT*f;F!1KZfR@v*1Oc4!i zYW&ovUX_`o>Jml}5i$yfv|?Sdhx+W;dJ0u1{(dzvDE3fYSCAB z*%BkusO!gpF=R2i^>nI*>RZ8cP(m%l$7b%TGQz$cTW~ zfCG>ra0VzF(BeQCFR;|FAvjMEU&usP6gCI~5JM6qEs!%%dk{kqME#%;aP&Y|BXA|C zHBi7Gl<(Ky;s9w9|PcDncG;0oFbKe|$zrPaw8N@Jg_2kYCFWz$}A) zd_k_D&!8(n83XEIzff%OEVzFl%f1L+KuRFC2>xFooEKCS(0s7bK=3ZizmUIie@=-6 zKtzERg3xw}eo>{M^gsY+H0!XjYJF@}!JgU_oFUB=B00 zXP_kkl3Ri#KcIx*5x{>2LXcoD!4QB~fZ1)O{OVpD0O2rVze2%*`M`qP15W{g1g^N5 zjgTCXtiUA$CdWY@z$ycBwk(~xsJ;+j@SgBP0S?Dt6kYg#K+L{qVK!TwQ_ydta4;Y^ zU2sOsj;K$6BeNxXTETk))V?+eE&!g`Js1M=(e=gWaztx_N9i8S_&R8GM*=I54)BOA z-GweI5exWIN1&MS;3M5{mm&<5KLq#%LTf=&eI{vzPPJ*BX2LCAq=fS7k7e#ImH zigyJu)Fo$xt^_RrxdMWC#i&byV+0l%VE0AW19^g?2?P+KL_wgcP-q}a0tZ3BfEf@u zP!AFUX$a@Q`YzBdf&a`3P&@|j4G{Ui@ijo819i4ouP~J$fb1D?0#IQRxIbTjv+n`U zTXTzI?i+NcI>44l`ktN1r<$={fFiMOn zk?O=~{7w3D)r?;FTW>|E6U+6sJBFM2J7CBR?r4}pl7g2im?&69BqG1+U-AyBnKN1{ zLBDig>}9YjthJY@95<{9#B^KHZNlvEtZDoo4nBTK9=k_a@2P}@k2K8qJB;2JAHYIm zajc96?mheaSnOr)!CQSvM%Ky5Gj`Jcou2MQ=Rc;R!x!fd4P%8zPK)W!54{`?{XCve zDqs@Q^1ZxUTdsv8}3W+TClb?7Bu`8W1>P!=A9)Mqkw8p zsMiCONw_V9$(h4wLZ%F{wn@bwM?pxcwJGKQGaykhV!=}Uc{;?(3QJqoWM39`G|XD9 z=B~zF95nAs8`FcK7*OizkwGNqC~oK2!rFtXl|!k7{_jr9J;TwrNaZNY0&rNh!_%8Y zKSrqbRQl~TkM*P69g~-ewqR8QMdOyT8m{htFEFzKwU2W) zWeZTo!{^qf3q?;ABO0rKqBv8082;0VE+S4evtzF3I~F$2v`O{fuF7eBlibxjG+K5~@DeN6(69HoP6Qn_uQ!h3 zaDAwy#G#Z*39aH=L~^FeOJ{01IDtP2hyh$`HoRMNwhsb4K@FN*eKCbDLJgju)VIvJ zF^f55)C0A};XS)eBBV_biOpgXSf|i$1_7V$r>Z8Xdlc8O(tk;)r{l%vnqZJfUsyWi zF8q1WamTN|NpZyVYPx5~k*6h4V!_W3KogTPDpIhcFOwk-r3{zZzZe$9c)U&$mI6f> zp5oj{3}ySU`b3PLRa!1^AuJog1oEbo%0^Atv6oROLuE{~f4#2azDrM{59>>{$9zM6 zq~fDgriiE{Et+b*e9!gn7&@lSoPysEt2BmyW22_hDf_m<={QR%$s?MN$fxEwnD0JJ zt>m^AzJIRNBUmbH(T%_3dR%gz_5k23mu9vnk=v^nDYaR`Vwi1+la(C~n<=E^)~A$7 z9iqlsYgV-sc8@O4lYT9<$f>~beam;tO(2a)<2 zP5Rxs*RaK2WFMnw>Nl#+eeupu*1RU+*D7I1*}id|e@(-Shuh{%3b1Hejzu#|aHeU0 zGxt<#&B9@@=8|I>MxnX@febGbo+>GfVy&Wg(bp7jp$vr-w{rx_wHY*XZurwVsD7LR z#iQ}<`lK%dp7BesJCXW}rvM=yRgzd9d^>v}!Z>tky+XZ6$f&E6pdzRr>Sms+WF0+( z=61-jTDXU2;97mHhs{y0L$Q8gB&SPj?tfFC4|S5Oj@=({9}Ie0ibro0Ot~pZ;#P@U zx=*6v6t;1AE0HGjZy-&KoBmaV^i=72{xD^IXIf~$lE^Xj7r~^vp^zKQlPB) zRY~`d*bql#_q74|eZSlAAbv%fXyU%vX(LkpU68j?B};#_#I^WP&YDA+CqY_*h_$ofOS-Jb4Sq}_eIky^{xy=^Z~-DmKq>5(1S!4f!kcr9X0F&}PH*-|YaRMTnn%Hd2C) zpS_zlbeGy{RUy!dSq@=BvTx%bw?6%LTS5XzS-ociz1PA&x;|T|qBPO?mgG^c6(Iav zv&}A-7Vv@pmAU>Wjoo@TbR|PI)gR7dDoSDWS zA(Hf)0xcf}iav!@c-bTi9ZVTM1D4D2GYQ)*r`eTn=$N-Qod`v02MtWtAAOpMf#RL<8EMgD80i5n;^iq zLw-J_Y@sD?>!a_5>4AZkH?fZ#r|TaFuAG5t7Pxva{gRlK=oH2T|8(B1WR9z5xM_5}@_3nTO5qOfYd*yc zPwRT|Sx>GsIwKw@sGB15&kF&sEoX!Ji(q-7>0+EO47Xa{zKbSp%1q@F6=|GkwaL@! z3B0_QCw-u9>WXx_nR}JmCV^s{BN$L>do!{9nOBppE#*x{G7mqK(16hl1K+G>CE;b$ zptFU;9BaQO?ZKJYrn2T^?A{MY`4#~oLGH7KxoB6Fg#e_<(XgmxfTaIGqP*V(4f~2ZoS?OO`GW}5BbWd<(ZA?xGH_jO3 ze_wzjX^lLhY#fk|;(VqY0iI>{vsNR`C7Oi?zu?VzO<_jO_3gF$6 zY8zQRjmBMC&OJLzvKPZ*c-I*ip(TArXnFhBiQ}c?$*T;$><$;a1dQJ)cPSYyeCSxWdyy3Rt5~N1)*FYW^1upA~lG&R0jKf06 zw8h3+r?8q-L~fxHAQiPrDW!f|rAO0lnO{heyv0$NNS86oZhet0{M|C5Euz(~ypkI3 zJAEySwG!;y?tsk}NxnknE0(rDKj-YNExF3^rtr!HM(DR+teJG)?W9+a;%Cu%4VO6| z>QhG7YCHd0?5^@xz`k-zOaB-iN^8E$UUyD5!|dSRcp*OuMtTVPpv!zlE+x^=zYHgs_1k^nSHPGdj~f8sXO#%OtDCOqhR z^yp?MYqZucB5~qyoN*#2#?@_9zOk;EM82G8Z-^=SuGF!&I`!iMoeC0+ zFc1!70{~}?U=-mEM@CYiEA#Q!*eHetoB?9(5ch#l7M$NO8;p!0SQ5sn_iL(4P6$-d znJcVNJ(b`V4$;dd6wtm1b-R)7O;3izd7oT(T=Wvq1p`DC-YayGZ(JA`FI-F)NngS@ zm+ipSMuqImBe%Df-5Ig|7GZy-=1GnUM*DlcMW86W<*ep;iFe=HFH0xQ&V_qcpk+Bl zXocB8{@~kt{fNN&UXN@jyD#$j`K+hY#<*v6&-N%&dQ(H2Rjoc}$2ZHHqe^HwMto-l zImdSc$03GveM@)8pvT$Ajl4;#zMxEE&+pK0mIAjvwyD)w=f8$2byF0Vc`0sHdIJ$B zDFGxYec`Fj2f1@!^k!IGHbx+E!>nZGxi~okDfO;kZz2!!CXa{P#TQR)q$J(FO`m04 zl+MKFo^)2`6ahNEJU3;UdD>YttD1W$~fj69`A7&VPm4bRzl+ul{<12qe~!3zmvIx*&q z{WVw~95DqD$w|SyjlvPqO4RpH|425cHKwCzlIMs1DwSH*BgrRcB;A^P}=YDFRDANQkSnG6z?d|an+>?l_rbRQ@37h@GxoXj3!3l$RwCgao7Wu0{!iUH4xXg=qF zWNQ80On%kb`s0ik|K2iUaj{633+xfMH=Fs*bHkMD)h>@a-(k+4LM*pjQBFcR54lXTt7~>hIMGF= zd1?{fZ8SExs)#Y^+!_cVu#StDCdJU%W`89!pF%Njq&; z_E-rcm`6okER*7v{AWp^uWh5Feq*%N@UgeuGHB8{Wt&4)iVt#yiln0z{(-iUEF{fC z{wo%Pg0S?DhKp%D8J^TJaxiyj&zDSK#oUP=yG+pdwMjsZ+Th}=+JmSbO|a_7&PJF0 zbh3^gRIhl9Qh{(Is98(^%Z6oW?xZ?s2e9nfs_NS(mu3JTPwh6TTwZ9~A8{*0dMO#T zEqjdW{&ji_nem)jX(KrM9E*t(X$JjuqLa8}$X(znaI@Rt^)zo+X$|>LN^GFU??4$@B)9oYklPOz8ktJPR`WQ>}kpeP` zqre}@vldEK!WSR2VbN>#e#aj2YICM-r)-=)^G2*%aR!~nb?Gwm1!I8{TP1idL-w+K=Pn}= z3u`-ak%k&4&GP7HhqQ`oqCBuoM;?lLt3hAq{(-KRP*d}fQF4H7i4EBZjj5ta4$?}0 z%y}G${znUN;(s%`VJz~LOZnIqCopYy(P%$OliV&y+%M!O;E49wtiE>cUuG{g+|0b6 z@^)JF$lsAJmV8?;+bw-4o{K=hGyW^8yiYY0yMAD#ELl}&I`NA>=IDcLkZJr{R<|Zc zxxd=mWl?cm3(z@}mcD;mq$PI^Tuxar1_80904Z=@1Ib*VLhdsx^Fi8)w8=_IsP55y znEk+fad**C$9OB*%XLUzSEd(h8|PLr>D+5{BcSND-cWQOAt&oQbnInRykg8o?&x@b zaIjdE4=Hk1my(Q|+{uGFIACBP{#9JK8T_Np*_5o>9q|?gmZM>SM+X<`u=XsMtcW5uwCWCyKE$*F;MF}5=jbsyOa7wvQz}gN64AF zjUG9?$j?6X#XW=geSU9w)z{r}oWu|~8E52M_An3RGb$lm=y7dadNnra*S7e4;9nr@ zuQ-^A`NsiHvHTs$m#Lc|MyOL&=dEsBJP6^WTYE^t^ z>)w@8$K&>40Eom*ZN>*;mfd3=YE$s!B0>>A+Jpk{in`DI%zb70xOU{>q$xw#4uF9r zdTW2S5bG~M4wv3vN@PtndwP@OXH9gd=RO<6zMsxYLSIUFh~$;aG)kO)W$fKZ)6r}) zA9X+t$`Ouy81AGvov>^7F3n)Nf%Vi}pQ+#XV2!%qPWw0vx@b2m1T8X{lcMUp$V_vQ zyRj@jXgouB?)wGrWteHTV{Eh_0rvD>uid53Gc%|@s;zSbag)&AK8dwGd%rWs_&V!Z z$kodE2JJO2@U8wtu(&uqXO*#-S!BN?-ypo)z5uP4Bg%IqTaSs|4+k@eF1FF#4Eea~i*t z^g&bTVV@^V#51bSWrl7w0{%OZ*DS?-%%fpDUc%{iZ51|r;gNB+ezh_YquMjfA?+v? z{(Mk#ebjW#r)u2eES>RhIYN*@q}(5FN09@|HOK_ikK-l?uz zs<*7X{7k>6uKO_unc+PVD7@*Ex1S_Vd~E0In@dz&_u5WSI;PHtIlo(IJTW$|uu+7Q zDlV@j`1l(g!?Zsgr)=tOGlby57 z#%`l2)o?H!>viFt{GK@>{}D^zd=YMD<0!^7oGoRG>ph*SH4;GqWY-c=_a&?FY9`mU z^YFTP2R09oJx`RN57wJ4pH8I3cYHV5dX8=&m5&*CD4^C$er=`~yd4=&NOO3EGU`y?gKJk;eLTly(av-N9X262j&^ZoQw|4~pc_T~#UyQ_-fS}^-Y;RfbK zGWVRpV&LMkE@S%<;Ie>>)vPX-^%OS*nK+U`m-1lU&(M?fr7*71N-i}0dFy3{yoG0? z+(S*>;@qlDnL#DS=Av|e-Fm$wG2#8?9;Px#GD+2Kb|`u9;#{iHuKMA{Qev|Jf9)p& zd3An<%D;;)214^u6`#uMtD>m=)R}_$TAjD^^YkB2#n~}?03XX%ctozAz*U}PTK-5W zclUUKfo0iMi;1gdPdg#+6F&mT$$lUL4nCvIWAX8EgQPea{^0qTX_NjL{m0+j z>arf`vx){$Kpw;{zlg`%9_clm&bv495BXS5^DaX}GO9(+)3CYK+rJg{%bJax$|IR< zC=TpN5egA{=Chov=t@rMLfSrq!*v6JhxlI9-(9Wj>D4Cox^L25q(~YGJ7QeF;5yR%`KnU_2v*>2H?!_BvtE~LITBaXUukV1ygWwaTczI{ub2)^(Z#E#Mo|~&pNzcwNpM~?77H04PRSXz(tYqor1qq z`;|7^M>)Hodv!l)X*>J9c=hu_8_ z&*#!#K%>{7NP01JbMl*P%a0Pkj zo;glb|D2O4ioA=JlV61rgaxgI&Ep$7dnH}qKQq2nJzD5`dp7`FErku#b~0PfR%&lR z0f-nx(V8i7DVNzE65C}N$2y$}idEOQ`vN8VbLDFjHTzV$78fJzNh|sx5$?_^%u#C<@?qcow8-pej`TgijJqHt@)R3;)#Jk z#-&r~*<;S8HfhFh%X#T-Q+%af>ak{kcX!ZAdhY@1#g}9UUTT^-U|P%epDOiV*5R4i zpD0J+_3(mC)YSVs6cqu2a*(cVtYx6ocU0R>PJ$8Pb>qDJv3RoJ6%0#rN}KaU8p#)( z1G~CEee6H>H`9n7vZ-hZMn~urJ{TuwbBN-p0(DI&3yfe=M*JbaXju^ucoJ9xhCw|F zSzSv@mlLyi(h$Rhto^%CFqd}dOl9A`DP4zdNzg}vcn_Qjh^-jo6N5qAu7q#fX8e8M zxXVy8~f>boG(*|b4NcX8z$aJ5->Bym~TmPyH zup)T8Je`bVOspuCvgLS7!<;e&DDS+&=LnJzMTaLKJ32pVg*};1de&NNh6O{3TNVWC z!aSOs9`oE(dOO#NW?Qtpk8ABustbd;okn#{{xZlSCTf0=HoV@{&~ti^<=zTPsihh> z7qY#rBrh?pu-+LA{GJJ6q`$B$OqOi1A3;G{ zcOCKadd5nJW-VXK*Olk4Q>>;iWubG;3x~05q;Md|Vy?)es}!Ywxp-ENf|c))?9uMQ zmD75ZQ&-xBs~W9le0g66@@g5jzm`=+t5d4>d)~CaGY$wm>9F3JZ-f=;AU5i22nHgd zl}l+`#OLWcbkE??TA)yb^&YQLAFGSY9C7`E$w--oT|O1XQ3=EieX>z&jl6J{#JiKG8!3s3Og7+yR7%LNh-gNtq|M` zP`&w$?#elcGh*KMjKvXnYc%-=OTK|JD--cz4X(p6sdZsin` zzTXhO%u_jg@zWy@h-f5s{FN_Wy9e1bfy#K!9a#wF8Z6Y)BB$)40~oOk*AcS;SklYgf~sjV)!1%Hk+@;BtN zjk;~kZ~0)EkXLSM8>ZvqWxr}~DzO(s|9fK_MdsB@WED+OJJ)bB7^|&wW=+rW z%tJMD8Q9eM*vwZcmyWA>x#K+HRK4@c zq|9!@+P05sn|um!9zYf0-S+eYd|j|y^FMS8p6}=8$H(N@QsPhs8bY!CV9H2Bd%Q?7 z88VC!-t3sUIXbBfZT8RjpFis^N;&AsloIX(Wjr%E^5-tR%?yw-FAg5uUxCfRhldaT zG-6<~`Jip%A__DGMpc;CBT@vy)@s zke+UA;t;PRl%(p0$cDo&2Ep{M**9|oK|l8WzlK!=%KF_tALCcA^r!PlV@ zhWf@w8Lo$mB&cN@XK2x`6s=3pN#~LHcx07G>0HBlL@0pRDoh)(;w5H|^~`!LJ>FLi z=~fVDEO{G~13DXxNI3A;b3sWR+Uebb3L2-XW7PjfGNQF1>95rFAGR1^;^ZxaO$py8fDvUjQmo-qC#X0qyWpnu%k*hbtINjr~(MCB$E+3m@h%s!nF}$kU)(4!8c3 z%-SP*)s|5KF5phS^lh@s+T^|d@yOt22QXT8*!FMmK3c$`Q%57lr@lV5RlwpSGn24GY5@cYkor0)|T`XHG<}Yb`YFo`HGLOI$P7)y$QMrtA{vqq;@CIJ_gkF-)E2TBIIXW^7J%=L zJcJ@)&b0+S<%=bR_Z_(n9P<<0f~0`F62i7eD}oh(JZ|~KsAfMYAAG7$jB3(X(6@qE zWXCrdj9>@`1+2cyQ^)~MBo_?y33@@F!qE6hcA*L(6Iy^jf-!f==;M5c=YxC)6Gh6> z@@?+=rq6GWTl6VP6#8dMwTlQ2fSvI*+=94-5)wsc0Za4KCxKUoJ%#?HwM3sFJ>j;X zpulhZto2dt;r~O*U~v65!BI(|q@Zg2_`6KDn5V#t2zsX=C?L>`dM`;Z&7CPAPjtALgzx< zc_98Inf$6P!R25KefNZ@?V;UKq`K6JAh;m9KVv1Z*G&a7-(j2$+9E%RFk^jMdt!Ga z65LXlE_V_nb%ax>&m>Tc;CQ%&q~IVDj4g;&-Me!;YX+svL`Z!eg|7&QuuU5f*}RN0Ws){pM~`Z zY2L+E|EW%ePz5#wa}TEGNBMaZKn@f`Z$Sru{r^4q3O1)7t_emA2K`?T>U5EB0pOQ- z-+h@a5yD~peZ@!!mLRpkQv4=A)wedYeQ&6|8YsFnrTtyxF{HnK%2oXz`m0I?MM$O! z6IqN#3Tr{YCC`t|fCxXJZdxBVwnYjR*^j*k46kRG6$$UFk+J_DQe`%X2(jGg{|K?LK)ZLJ_XwDR0ifC%wW^3WOHl;ky<6Dl;0xyM7detG5_?SV~J-;VFsF0;rC~$V+I{k5i?Km z^@-7`D}I^s>Jtv3f~OZkoc>maOP)(!#Zd5#K}J+oiDyJ;6qs_15BWsBssz>lL%paF zO>$kRVE1zP>WFQGp3F&C0yuIZeg-#Wl^4O;i1wTFuK2m;VEhbq&0aT0r4ijTXIu%o z&xJhP>ePMcH8N6?f{PG02%P>zCluiFtBUs5F^Cb3$ouc=t}qSAavJIV&311mhK@#t zk4R}HlW=GNY1G_W@p2JrGN=g*P6YC{mFnAorf79^tHyyamK>_~F)!qt>}pJp@Fb0* zZJXTM_3vr(nywyq>AVgeNG5$!GC7ISy(gIe*bMw7S|Ju!HUQpJn(~hJ6qcN z>RQ~G4{I`;rGFC59L=Pw3a!%bdv7lMZI!O6AB++<@Ee1|=T|n&G!#tkVtpX~#)Y>F zzGU7am$wUnWZvedA(YHJ_%uY4c^B?Rm5J$E;b#S-4;Q zQ`J5W4ZJnM-i_R2^2B!#w#S?tOblRFwIeNEUHU{oNI2WwB93&}3m#OATBIV5+I7S) zuCdw~&8EfM#4mbvZf$|-7iR!hXU@nO`!Bue0G5H+8Y2X96ie}q=ZZbJ;606!x;|*n z1t+l!?Sw}gjj&&<>;G!NV3AycX{YZDf8`TtpoAD5mx^|ZYg(hM&prKdFag@#_*5c z19YC__7b*H*n5~m{H4|GKfmWV+x&>r84qPbT~X~anAl5_zt;Qj+RUK+x2QHC{>L}) zzs?a_D;D`z%LDEE+~Oeo298aR6QDeGl)mVpojQ8r+Y489VzFOBcTcF!b>TqqDl0*L z?vNHo_R998rLjDjfqI!D=Exvf@(aa(^w+;w?(O;l)vEA6M{#~0CEPTPS#KX8uygB( zFL}rwxkRd*_-)PYo(Ue%89CZhj+`oP=dCYQWsU2#>bESCj{5+iU{VNe}&1r#v}-Z_J~#xQib8CrtHQ$>ID=-e{e;t&o}R zrKV@T-xX-(&_geqcz?tFcX~xK%voV4QetK>jobYzLVHBb( z1U~#EkwLW>AfKB~pV92pA9_VSxp7&9@Q;$1w5<`r2bYr8P_67@k}==$k^8^V#LG#d zQxO9b&11Zbd^n{}S%6Ag+y}$hMG6=sNchC`oeXR~} zCQN&l9~q%B@%s+p>^fQE$=ezTy8i9ucQ>z_ecgqyz@JMTp&ieBup!4ZwEa#1s+x@n zk>Z{Oe?^pY^I@4=OA8{e*~`D=!dn(DrOO7=wyB~Ig08+Z=t^)+T8_RX1pGcA8Xq+o zp`FAY?!B|utNyi^BU)-G-X^p?pV(i@DEnQDFHcAss)!kjFY>^C&zn)^Up?+eY`_Qd zfNjwvuo<+k@8B0}xV@x<5SEy8ZP_JuvyEeiE)v=1@q#ds2Y*a|OYjCd0Y!w9d|(2) z<2}O2kgJ{NFW%q3blCL@Z~I2lc6=A8FC}_>?Db?1aigb+{{zdpv2^&0{wm{b@hvpb zFKYY9p2!qLO89XD^;&5K;m+B>bo$Wocts!GfRpWXrCA@6mtI;Gt?T3aH3=IeWu|$feQXW8qTi$vJ<7k_d0D zpu=N`$1#KCl*N>KjHN%}G9@`VVO$Nm$^ajWjim=1RO0C6NBvWufki=vmQ=pB%AfLZ zzf^v_h?gptRtM99LLA5i^tFE|qlZY5V5pR%#UhoBd$`x1zdF8tfP@eLM%C{c{(L{F zlj)*{Wnv1XrHU~MpW;-i{oF+)R2ZUrLUX1`m#>^_SUA9N@>TNRinblDZtZJ`3x3l& zmK?{K8;rTDdO>MzvS$njoBdc~8)7D89XKPK|C)1eU(z8+AB&QItmxn}-54NY=#dhd zplTd$t=Q1`HICj)cm_WfXz(W+cyF9j)TexlAlkt|5+{Owr*wdqnOcP6{+1{twATno zS%RGL67`&Jel3l3n_tw-MjBxm{sC4-zCS%K&b!sDiHZL9gdxi94YSHm?p$h~jM_A@ z5ZlmWbZBoU)f;#A-cB-;H%ewyoM3rt_6b@mL8tuUO~Jr-s{d;iP&FHE@8At=2do*Yj;t!n!kjq>0d?`o-x{c@91iD!j5VeKQa#8{eIl;|w5p?5(+A+c0p?qP;NGy(Q<@fUg)GOJvrDF>Wzte>^c$ z$8n7e&q$+jY!G~1!^`;O2;#`LZLLM z4Ui{CBfCuX0Q{LE&{+wg6SwTSymkCXUK34fnW5VzN}zf`@ZbLQ+3I2lV3v+CMgYwH zB#vHp?RJWKWdP6O2t}^K$JOYRpjHsl;G+W_rtc+;R0T2m^aoygU&hLe7 zl97V?qmYA8iF9i1OtZ9gh<`n%TGpN=$H{9LVVKsjClI(YIN&hLl|OGOenQX zVY?tS(BI1Gf|NjD`OD)+|6ZlbbxQp`2syxAU~B)dvxaCz!9p{ed;djDy-V)GCd6%?0cXMtYFgpgWt z5!)3RYBsYZtrJK5x?<3fki;(0&`Zfr;4=dQD83I;?g1(9y2x;uv6#PZ9c2sYu9suA zHU#*O>$RM0_K-H$c@G#vodjK0eb!@$JpMz-%2V#Fc-Ik(SBkhfCFQj=tJMqoy>=NA zV>AcDC}-Ne4d?Pf^YeORbE%11PR_%9q%S5Zc64^((_=(&PP0o#XJMNQPkzWP-5bCr zN(7Uglpz1?k>^58jKyh5Owgc5o!9MUM;0Esz0N_|`JP3#-`GVAWyEbc2s-g}ELE9< zFTY@WD&Zh6*Ps!#Sf|zACa`*KjC{uK1Iaxx$8ab2hvNj}q1A9ZCGB22SHw{U@(5*R z-Px~BmK8b2`!!lg2`DV2d3XoAX;ol0tg)2X_%B8}w}q#(n7W|?q-rXs7}s09uOzY2 z$d4L-4aIa4@LaTzF*olC(cdjBMd;+1x4Y4T7s#cwj@`RgX)+k@%y>yZ7TXy^Vz#D? z{#ZS7w0qcSU7b!9@dT}vWfi2R)-il^PS`Wq8qD?RV~vS4m?o%xD6_6@#*YI7KM=2E zPGs};4T?{y=IV7Om?;g4i<5p|{t)wrd9q_?(anhEYhKmY==t^js75zf%MPY_}R?x)!YTpIWK}H>QljeR< z$vMs*cL$>!$~b{v^5!sKF;#pX!$Pm{`7PODbd<7qnl76HL&(A8-Qh%F^VeVk+4X(Y zCZi(rb##)}ppLxrB;t1GA9W*0mUGP{N2xCS2}SuLamiDsF}F`z@D>35)LD^gR==Vv zmphUk+ix4_?=2)AN@H>vELgG{43e877Fu1u-4bz3=QNtEZZAyEFi0UHkLV}IvvZ?v zwL#%^4NjnTnI|>!OHkIzuMqC-0rh2@{$-fQY7tmu6Ck8hzaF*Ec|d6KkR6VF5_Wl) zUOoy$zIz~2=g1s9Lj<^X5AeKwqAYdaQv4n`Bqpl0?`9d=&xJ)ix@%}_A!Zp>`F?7* zTGlS7l3rNJ+k(>t!QwjeQ0&V!!#Xw0LKe z)85sT{K*%ZVQs)hGQ5-@hT{nrY4zjM`K|HAD`qe#XO8x{yAJv?B()hN|W*K5i!YXq9)?6j25jn&pm4SNT|Sw z6d+r=;*q_jBYCN;uxE0%g0z@l$zq$qe_&a_)LyYu)%({;;LJ|$05tiev3%|)uaeHg zxTLK1>;jO6xQx<#bgVlvGS2o|Q0E!&?DXCj;{tPxsO|RTb z?g5JBsQ8t&B_#}J_WQy+`gpk)o4U!cY8+L1nPl!Z9iY1Bd{OU{W%1x`;)lDi)0AP6cjAvaRkPJ(nh(EZtGBD5Q>%czR znx^m#eMoy8V(QwHFWJ)6KVE?>+Cwne5xzEWH!!^n3AIq$pYw5n2#JAd1X`Riom%qS z?UlJ@sq4cA!UC=+jnnD9(!eK5F3$eq(%~3m_p|NJrSlh3&pPJ-_4zH?8PrB~t_ME%EQwLN)G9f4naGf{Xi zvw!9xyMKCV&b|iTv`Kr7VJMiZO_VMMU^+l1`=uF0yxz~D)nU&Miinj)xBOZu4 zc1|P^3d>D-s-<>7@&;&}1n9#x`-mP1fE^js!KT=eb;bPvL7H5gdc7a6O}S0jss0<~97<+Pbe%pD)z2Us^v|Of9IT-ZxLF!evj}ugL!q=zX*H zGT83iNKnhHkFMCQYrXI1c?*(|&Wz|uY3@K5h#3W8tG=wRvm%@%6gz{Qah7qgyToi1ikuGZ{0;l-jS)o+ZuN4d5ojr(c_sRCnHLYaCY- zEOb>eZ@%uF6Q@J2y*k8Sg0zdj%KCp?yDAJ8>@i%M<0hDPKA#NVC65LLG?5P)QUv~O z8ALcJ&v9_uxGs)$!9VH`acWf-1)4s_?ykINFSm*CkCQj+@b7-d$Jfol&H>HLJqfoS z>!cwHzb~hy71A!$U@F$MJ05Sg_I4TD5+xdOHPh$>a7TEBSCqMA2 z2wVsy@Kc(*AlAU4@@cInA~QimLd6@@4VkqDRXO-yfO$?ZeyQKbqiyiu6HMDuQB_;2 zX*02#OPcLQb(LiV)hV`qauTso?72O!L*t}8%;^5s>ts|szm=EYK9sDkfa%-}XzY~9t$DX2d%xg0PRW?AW3IXX)JDrI#>(+$>tf?y za`L*j8dy={p#V%;d_oF~G4nR-+M}k)eTT2Y9PE{hI*lxDTpoJ8W=~nk?`> zlLFcHflua76OuFB0hMG#o?o^HHVJwU2F`8X^CR09HYMNfQF!LjfdK}c@cE9({M)5+ zJ9-sV2`7=?vmJbug$XG4jd-`AA%T}}C#+RR>OwJk)A8ZMAC|O4lloU2r#g^JLl`H- zJ<-0NI6hacZd}XpjW$tO%MFwL`}(!w4QI;lSDHQPFTjQ6ze*Z5cgDcWcnFHcI|ivg zoTP^|+dO=`QiZqmKzjp-r?}qo-$+b;s$GVRK#Nztntk}5r4#&0FWjav@|%OHN@tmu zZ5mR(RL)GgXLGWy=cvde#RehYtd+~Jfkr1ShJ2s(6t_ehw{{ELyA-Ti8BW6STbqfi zHMiZx1!jsDoXmvcYBzlCB(D)Ej)S$vp5+IHi)+gbS1DN&;2N*^1|0mfjz*L0O1dR? zo;2lWUs7l_o-AR-fd!`?b@6aaDX5*ZbAiIAYj)*AsTmzJKPBK1iu5eCdu5DUvZSC6 zH0e?H=(t#l>=p##M)$g}{{6CjZ6LoXGGI+HW}(S1Nom=HPW^8^!lAaZ5lG9uen*r& zGw`lOoz7MQa!g0k5c51GRXR@NsW&X#sIzS&vO7PeA}7@{@Dl<^$7;0mn=|?9F;z-+ z7`-zl`E{AuP1`C&QbsI>4|v-Jk%{`LK#i<-P7-%g$QJO0?Cg{s86!1{p6WbxOe!~H zN|A#Ca}-Y$cDL^koU>gRv-1XyL=kv5Kcf`d%s7#6ddHurmqFd;`q$^$ z-~PTh1sDS#ip3*(9Mg*TcbVqlibwe?f{!(>*xwt{=2z`n-vl$ZfdbmpIHV+ zURzDSK+MZOaT`=nXi_!#@)%J?=GqfyW~RskSWeVGvwkN174yvaXw#UCr5tdBK__ts*vw`o1Oj2pB$3i6ck%%0zf&)QWP;R*EVjQSkt<_}gaL4Lmm zJR<;`oz>f;H~~JsS`SIt`xVjq+yd-2!zs*C>v3GGp+)OInKs-t)=T-6i;EN>Wc8OU zQAbT5?YSj+VzbS&rN*wgineF@lowf4kH03pPe|4c7e!{-L6!;vTJ3Ev-rNQ~M@~1c zRxsid-nZU54H*@pg+BCF)uR+q0V$)v*9BA+76M+kV@8E{7q_sN9V5B0moU*E3hSG3 z)-MYS2dh%g41bGluwwJhT*_jlT~D=%tSV+C_Y?>D>o@*3*l6$WIsqSPVVMLe8YmTU zjOxoTWnVM!KqeKh9!Ec;%v{WJ>rIv5%1Va*am)7}e96?XU`~~}6VyHZ9%F?7gsC;z z5_GT>6_JgTa6uWF9qe;trd^8)#9c3|j!0M)AH2c-KH))KpDqr6;#jq_tQzsoRemXy zVhAoLEE;{SdJfv$a~@B-*_perTGjchwCE^9=OlQqVz->;Y1L@XWTAFX&*!to{G9xx zyAAPxhTYVf6ndCSFP(vWucU(ypzA$L#6Q2GbhaH4a(bo(MOc(ygAhX=zR?338~&2!BsgTrqS{bL~zO(|uHboBg);r}O42m*t-Zn=2n{$is-_-w*DbgPPfo z3HjS}El`;4c3pp`#Hlxrr4*STAKl>*_I{sU>yF-}D(^nmGArLz*3StT0Jdgc>7^j- z#yb5xaFC(puRh34Gi1%f;cRlL#im*F&xM}2SmagaEz`#wb9=bkB_GqD>xNd;3laK?VTWvp0>Xo+z{ z(*q#!4u+O$l6u}VeVyVZd1WZI2+@ruFc>crUS+H|&q6OB>vz(Jk>?kt)S(zf zOvN_!`s%CV?UN{q9inhYy{cv5X%{WRO>&%=a_r1vpZY38w%&4vlS(TSBh}B;I697r z==*{ecb>Lu3etOsH+eaKqYf2nQykn0NdL`pFj!E~K|am`0&6b;HXlKmgJD4oMyPuC}FfKAZkb8 zSyIDqqh&Jaw*gpp!`=!+Nz8A@4_!w+%X9$BZ9159!OGR=uE5B%lIC2FwX~cp z`b^@87s`m_T-Z2>ht$b_fBWks`eooV)oTjjV->CYg%N7tM1S}{#rui!dox8b6zvW- z=M9XX*sAO5Z57(22B(@ksSPx+ZimgNOt|*$YD#h)cv(3siF!evQ^T1YdX2X!)zL0IItj{m4aO9zBPr|{_@QSA6qlcfKkqg(be^C`0F`t6RQ*_wk9rFPUi^^#UDA*gabmC=)d7 zUQ8uND*^ovyNP89Yab)KETUT7Ph!%*_@nBq8ElXAHK(cC&qo?vQ2n4ljmPt^)R>Il zD?g1bj8KxiB4pZwFdLWB4Ai3$m&!30_F5Ee8cV-rG~5FyqMh?J@3HG2y2fwhehHOpTMpCgvHx8_{`VrxJpAs zLc7J`dDvuuJ@=y=*h;&}>mPz~d{;h7pjT(JXvg!cvWzy5DotATqs!w!zF>zc zaem;hsQhqCloe?9r;PBV>I6@9-auX>v$Me&Ju4o3e6G&p3bo1gIEO9yA4Y2(_kmai z`?ZqMZ$un?=E#+J_c|2s3i9WloHfD%1AbN4LDOK+UJKkCPF~t%s{0CX<^lUNZgk;3 zRpbKV2PTqA^!*(LB&Fq(rKxa(n>e_HI>BQvRk2IEgc*LAUp=8T7rY&sWGHkSEC?4L*GtHbx*izzNQkh;blenV6Y|#!-NW zo5MugQXz~pD5G*QOIMLw;Cd{G#coz@Z@0XY&4B1$W3Zv9TtS57OV)1!-9g& z(%6Eobn$TgBmMnV!B~PXD5c;3Z&>_0o#H;{oW-2bnNG18_uT(!zp5? zQb7nWJ}s?4oZTBz6sE^h#;Sj(hIsBoOqm1wmJWAH!!*t5N;KGFTEMM|BqIj5HdZ6l zoSO0ze;$N?0?9{#$f-ljMqt`&orGL#z%lk`ndyHk+k!k|7oa!dhtz2>7%+>TT>VK= z?GZL#nr$VZ>foz%U!fZY9<*o1($WirjxlDe6mQ63UvUdpt9pwuBaI8w6^e(c$3e&B z$|VxSzuYgRQuy0!5x5u{y_qtLS#dp(>^+yC7?(Qhw=PtF>xAYNQiQ4HSG|@?bKYEw zesdXIem?y&y|*u~&vz$~ul~!guH#+IgSec>1Xj<$wE2!tD`PG3We}DDpU4x0EzX~Q zi>THa<(DnhmElqoPa1X2hck&jiX!Sa;zngUCd}AIFChz`dZ+GEjvz!BD`q!7RW6!BoI1KUJ^bMtyxCP9Zs{ z!QBz25J|wSvrx9+grKEhxghO9TaaL|hk__T7iQNNeWEUKUn?+VFi5bTE)-3$doVKJ zbg%<(e6S91DG1&}@FvKq|5^gC1JCkB{t0FcE&|>FwhQ?avJUbUrVE^a4*C)*3p@`z z9-Jgg;}>7VB?(=aWF3I2 zs)1Rb$WbT_4W|$JN~jGD)Q75CPeKNj5Cz8uivew=LYRUm?ORU@EiHPJ^%RXnhDZ-~ zqlpq5gxQ6!<{zIO7>$sJK<__C;vxk(6HwQ6-6gsbjgp6WB>b!otAT_kBAb;Tjc$yT zEL0GU_c<0PG)f{ngi!Ox`rTF@HUJ0|hDsIk0CONh4uxp;5!1|~2owIcjmg4qEVGXr zBz9zM=)M(y${e{RQV8?4yn3&O%6|~)Ou;^P+QO!`HaEoLthN>k61ZE^85HHRta}FBnaya}HhjLim-+ z(j!-?Of|P)l&BD{+wV3R#tnl%C55B!l#Z3TS4c5OQdv1DHA3uPol70{Y;*(}RFL8c zRhVHvg+@pOVVGhK)MweW2;jHeWeOE!w${8krSmk5O&Wd`bBv|=uWTxv%M)0c-u=y* zj8>qSoCBlJtVmGF^H0kTy9FyUHi2~3bj-=vXMm=BEX7t|2r*11Y(*1Y`RdaRAXe0STxp#LB$$20{DNkb%si1OU75$1P)`j=}F?%hOBeM z>Fdn1W@!HfwrH9v#ym?2|5+}WH^no3Hm@qGUfQ*dP@er`l$K;bML`8rRV^wQhf`S0 z+CtM&n65Yg&UwNNWdzr9#4ODT4nAiw+Ng*>}wHB)?9=^7OIAw`JVMz7Pg<*T^gUH2P0 zI&26I(BD61^=5^VTJImzERp;5-1Q;KY$I;gAP&=xU{nhcQ_L7q%xEL0MMef8O_k+9 zQpNQHvRW3Z3N*8$PZjVvnFDwGw7L5I%We{+w856A2tq_Mg0ZDgU`{vX3@O}WT<}Ju z5xKOHN7QP>Yt(ZP1PB|No0%OEtW0p|<)vB>fMmm~w*k{P1dC#d6!IY{1r5E5O1Kc! zmJ5*}!zYY2GdGtPlfFFcgboSqSMiz$@$@1|ZmdTyva1zP7?W^X&zuHy;qwQjudn{U zFP^avamn1TN!ivt!?jc!c;vdf^U*x3*Qar~jVegR&}3Aqr=>TIEq{_Whq z=DC#AF?+!xdiJ@x?yH~(NTF`@zkf&JKuw41ex!D(=BjK@>+nM5xL|}&Xs@{L>3&)j zVD*W-dFHxZm?KcEBZcQi>M&38Bl5#ba^uEjLx{kh_ai}hXyvMhcD4Z_i&>z!iJd0Z zPzhxH;LAYW-v;`c47kOoZ5iB^)S;y9!>&EhEWVOCGNp?QAolvh4U>=T5#pjLe1+XI z*?xlSrKRbJ-Brw=q7rsqV?ki|7a^aK&iaE;7QSmFhEsI_3-wQ1s@s?Z>!5Coun?IC zepCj|{AA0Z?d!&O)TlvE|2zh%<0x{2=T5QCYOgW9-Ch7Gp073A_l+4T9u3zDlQG3l zMA%c0j`O*|Eho=)wvCcdyz{a!f&U~pv>(K+wXD2+rF8T@p%dzF2xEvB=- zs6E*E3j*j1S~2zZnx*W`G*9z=p8h`oeL#Z0q;!-w?h|hfZ5gc1B`eNVzV(Ucyn9t| zDu<2u>NH_TRf#M7^KPb)FNa)PnP}83usvhb_I;R4qj&x5)8ry8mhv3$bcy3;Bwda# zGda*;A4LCJ$9ZFIe2QyhXjfyBnxS>rIeN>$R@3)}5L~&Ye|C*$w)}&GaUtJnejgTI z>WF;OwS0ktlA>4TDMNoWn5d{@3{)Jj$U1ldu%(O=RuZ1en$5y}ooINR=L=OzW&xOU1;vAx2BEgIG_0;sh^wHBB)k*=;DpBm+5MjeL zd1&=pszYhN99=>C-Irq69VxH?>j;B}b8K^LQmjJg^oS)|TK?29&G7N2HT@~!S`lkW z2&)xAr36Iz(`i~jGccdQYz7mVfJ|f!*gyl;*93)Nf6wurqfl66jjtF_!{`)~u_j_- zVrFV0kovc>=`cT{vnUGn8;gdaDQg*n%uI{J*&#ZTcQ{tv6&^YK%Wi|PHbGZLuE*5R zFn+s*!h0mii|(QCJ&TDOlKrE{=F_m=!Mcm}^7Uuc z9l5aD=Y{@Ut#NE__6BR!Ykj##H+@+7zRJySf0tsZzKZvD!4=Z`4c0tcX!aQ2H0Ol5 zS@p$D;w9xr2|G~$y>2{JKqWs=dA23_;qTs_y$LXbGXm^_t4DW0ULwDgqGY z-52v^fBXn!yp^a+AGSQi-4&SmNZoDojX3TOO|_HeYLb`o?8vtEYsIaNBWRYfl^0hxqzwf%JwuydE?ZQ&) zj$UiqTM|L8cjsT10rSU$`aSrH5>B_xr{MUWHAO0k59>>gbYe>VpOuK!-m2ZE%=XpnzwW6!cx&*5UmzVEufe;29m+cT&0 z?TyDbGHW|@3tN&dx5`2lb$XPuoeAsq#B`#cfBo3>&_Q+{F|X27LAp2Xq~9v5VD1i6 zBiYRFaI!?Lp;YJ&M zIw>XEcvVY*;qto%#Bi>ce=bt@Pc#rKZ@k%5B-Fn4;GTv!l~w0bSFFlE5LSC>!3t?X zQek83t@x+55vR&dU!&UiOZ+To$SX+sbW+&zpnq8jDV6h%b;^24)2?b6x%v%1&b02j~6~GT|@erKNpKSp%_eiywb6( zjl+H4`fuINEBj+O9FuFB_`dG^Y{BzXAi6`rJyu>>zvABcH1a8#x5+PTbo|ou?`G%_ zB4y3a?hm{x-(?}Ef3$7BhHtY$s(I?7xk8OZqpT2L=PwO5**S@3J>p3*CWqQxB&D5X z7VkMI8>Az;&`=_Fi~b{r+k}zAzj?d<%WFTI zH<6Q6gKRrv6PX8t=V$j!fF=_uKD;2zo+}P(O;p6<<*~RCy?BC3&mmW_wzKCpt?t9} zk@r_9B=}YOf5R0$80s+q+r>n6emvMNaugHgXZ(?C(oaRX@`<>=T;VY!asVZUHsxHx zGEmThEy8gve-d|jDR%lww{G$j($M8qMEnoyN5OMe|5R7pUO`tBDX`9v-QjvWG^00H zz~MkiT|4f}ko5>+kkt+4c&N4ZTbd0JP!w5XoTkQ)G40wTtv};%@MTU} z`Gxv9mTO*yFPl$!ef~t=#RGS<_KA@s2e*4T?jhI+XWOpn%gb-z5_fPZD##cL>55r? zZ^e1bk?+kmL%SqJ&SV}DRS33JtFRe-eW>~V_N1ZTHff8!Zf|@Q8O9^1ay=oiVzA(V z)zD2p@WArQLI2f1is&}y731DDU&nv+(2HvJKCoUr z9nBe3<8y{LLsC>5*4Bj$!8Jz@hGAVz9RqDoe;AvHM)l_;HRmTaz)8>kC2Q&b(Zg5> zD~%SHCA)->0>c7ut}ZS(D;I|);JRk60qa@88kUB-26!b{VRVhopOEW{{DZCwofsa0 za|xtIll%j77$U!52A2xV;1Hg0)KMc(PF8NvmE&Xn%K&O*>V0+Nzr+&Cu;Qr3GBavC zf5}bPg$=az@QZcu_{GdCDjwF>9!vgr4iwBlPrvx0k&7=HTztX7UtTUJA%6U%ph2D& zw!QaA(h+6bUtGr||@dP(12oleRwJ`^?L()JvmKm5>>T;>}kAG=xN_GisEg`W2l z1zNW)ROnf%zyEst&gkkV68Jb(=}Wrne~*`2`NxD0H5wK5fBL*}JF!DZzUMxtwu+Ed zc2Jv%es01uIHn4Bk4NYd^wABqy|!ChC(30j_0;CI*RgVYte!Ru{*kVI^?BAn9+6<@ zid*NlB_6WUi29irT}bl~Hf&vvUvZMuwfB{9;j^eakGoCzw_WEti+xt=liPy3e^sW} zVwQ61ZsktO>2Ff~0Y}5vtGD0U6#w}5e7W5EXMOG#&AAUhf3g%L9ZX%Tp0>7H+1Brc z;NeRv*Q^lDlMeC9Ti;(8)ynZ<2PI!cqPB6Qy}mS^R9>O*HFvIEI#JcU|KL*el}fc+ zmKAqyYdYE;{p?mL_S9>ul7Q8ce+5;CZ*?4zmE3RlbVzLF-1b`KZcTKW%3_A~yPt0t zd&Vw(4xwGXQFrrhN#;#eGA?RK;yXUrY0qzA#LlQ@>H!o6d($>!kQ&=vzk=CL* ze(|@3k-c%^nooJOA$34We^YkC`@xa7IKS}o)h{RA){mYL_kq^<`E2U%tP4Cb&qYtF zn+g*~Z|kdJci1(@Imao*f8p=0(v%1q^TN)Wz)ITi#1sYzuy(;GvU*kUs?2M97~8eo z7hVHwc;X|rB_89!Y%20Z;r(fIDlbsYzhd-NI@Q}gb-aZIZezqlUn^$xX=Pe!q(r=@ zD@kNGxOAqtbPiBW9^cNn*zwMSdVlNh&_`K!ZhE)GJc<3Ej6IE>0B#M z`yR&zM|`mvm-m+Ee|tO_cTxuy9>l(?(^$H-$R(?J(aZ9v?MgYH+B&3mp{xQ1vlI5C zR&}b8KMyACElqjfeLGbze*3uuys^_NU$lt3Rk4m76uoIU`oxQ1BMIq{9yg(w=S?)( z#Wmk;dK(FtHHHT6r$0FDSi2!!2d;YhaIfXUn}1U^EQ>*Vh}HOaxg zLsxk^qmqi-?{}mK6t`7dM^-_+{U7dh79N#d=Tm)I`>^T$sDZ$RQelG66PkC}KgwN| z=Mf9e%1Cfl{xNY@LgLl$*B(J1w9RI|?TG(pzwKz_e_=x%7{6FsTU!qtoI3DmQU^)? zn~(K>I^f>EF0g-pkt)ZxF7JM$;=1dC^^9l3J%_ls>I%agqH6Eyc?_Zw!dA4uxqih& z!dK_Fx8t3lZ+l!KJ>SHy@Ep0UADnEhz+bvU^l^;#O<~C{-?&icO_rAmc3Q9H66>pu z9!PO&f4yZ{8|l3YZ;->gn7re2qfnEw%SJ;YdVSTYVJhjYOi}TmeubWLz>ED$uS##w zIi2VgpC&y2u=7Y+m!DE=sL*4d{*j$7j~hNEyRZE6vV2E=M@D*yq57&r-4P^#d-@s? zJMp!8D%U$MZc)75em6b7)HS{JCx_eq@Q|ekf2^;6&OftW)u8zP$4yr6t;zSa>u;vO z-j3>T{7N2Pd9!2d+r7o871t^v3njdQecQh8&XAQc9>zVU#hD+lj(S){(0w^4wPE-; zE-rqk`H0o4GOAWf93k;)%c*$%Px|(QYUGo1R(0Lrz#Mx@D_Chj&zi5x5b72F^OB9^ zf9Dfj*&9vmTh6Yj?5l608836VrDJHn6J2f*qAC1g^D65%Pp^kcdJ<8zd%<~Y8dajv zZ*(N7jVExul|Se3Hu_We@9GC^_sS{QB9+(Fx~~fT{x(j0_`d zJ=Mp;zqPPEY$xN42cP%oi;o-Z0P=CCQ-gOAQX9a5Ian~!r~e*}d_ zqEo2rm`^^UqrXl}K6Yl`+}PjTW;k>YyTuJHI{jLGK`;uh==J&t)o!Se^1)lI%*4Sa zAoe_G=00P*PN`vIWu(68i-53=PofONuLindo}LY_e?lo0s`trFrpu#H&5~{54E}*|1=qK+E>VgeS6&|N z+i6_W7xF4_FyH;uw>@PlZVR6%UN_6RAyqbKj);%(!gjO0i;KVgP))sEE^*E^+2XxdsqcIFLX#?!q%5SIqqgZ+%G@T>G}YH`Ae*Z5#ENxiloWcsvOPxUe=q-(kyvN^ zZiPwEQpam4KeeTs_x7g`W}pTi)zF6r?Wq*uqA0jp_uTp>rxD)OFU^eZxP~A0r!QAO z?_i^GOAH%%BjAT(1ugvEPM+%*P#(6f0nN0=1X(Xj)J{*SjI{zs^Ho}drBoEJF19;B z{w3$SHq=VQrts^fGqqi*e`_2M*FCY1F7xq|NGLnm&9*ed}MMQziM;&4fHKW-UbO7@zfm=BkxO}s7R;srR%@AYX9TlZ{BX* z?}~cCYV87--=$?Yyq5payU@Z|DeE1b?iKpWCKSU%nLwYF%< zwk6zt3C$7yE-QERFv5>>2;Yk23>Cg8F|GS3t>_tsZHt0 zS_*gUeUHkI&IRw^yKbY*Cu_xP$LcZ~fM|cKS0A^r$ zn6Jf||K9oZmoHE3Z^aDM3Rs%`u~=Zz+u*eK;JCsge=nbVIWDx{k$(BtLjLv{l^c zk5g?3*};{=ZQ^&~XAzkh4KiYGR<+ks+BO`=e;24HW{Kh=+UJDOVz(N%VB!_yh=vP0 z3^z7c1R6b;d$Nm*UU1@*(VCAzj4;cpD%Wsqj?I~muf6Af6lhIz_-HxLi$|&OE8hG^ z8zy@7MLpwcQrOuIucJKz98KZ`@4UfFW)(SdtIE`KUTn5G0ynh?NT8LPPc<5lBR6y9 zf9}pU+MVoNxD`&`yi{7SkQSko{`F4Tmn%VfXA~YQd^>cECKK4N8h&zn2R6ku=Yge_WYGo*iu^QjrGz9_|BWkpuH|_?nct5={+H ziLd70YIzd-(rf9KG} zAHuVb#(!0BZ+4ILm|u3O-);2&$^Hko>ZN3O+UF~iIViI_@BQMp7^lrE&3LQ#q6CPayJ6NOaho}&Ky3^MuleZRlw`TySM zeV^ZBc|PZywf5R;uf5Mcd+)V|f3w#v2m?V77U1Vk2)Y1`krnjMbQ3^yPK79RUZ6qg z0?MgD$vud|#Dy{Ffed0O&Ywu5(OEb@GL8{J!%=8BTUP=ulujb+h=>TPj@vL-mAesb z7nwc*q1ufZQJj0^_??*%!?|xuALAo9ayN>95TZZf%Q8C%A|+y=JbuY9e-pAHNEs)D z7FFjkFqh-voNGL4;u$~?n#8XG0P?PL5E!4e)?*{|tM253`0r-pXF$*zELU5g-672H z{8hC{77HqcLH~QC!ypk^LbqP17_@(=<)fe>6?gG)>bq{a4evtg-t<+>8b=1K1%x2JSKuM2^J$;$z@0 zLs%rHcb_o^?lP(I{6f@>F~}nA#G~V<`r<~gCGctlcfSg9u@4>oJlt;K#gD}3#4w6> zC{sI2BUJR({PWVUjl*AP3+KKs`Vgz!v~Z1@B@ehNC7ASxCqb$@ENo# z0&JTA5CL`o90s@o&b zmV@M>S zE%1+;oB}SM8ANBW{-`-t;!6#n&`4YgWBl07mpQcnNPMXbI*ZC(z~MPJ#uPCFh?!&} z!#{|-U|cfsfAD)Nzhu5sni*>ax&Agt;{x9)t&cU1T&HRy0$(r$eq3S>3*N`12x0uD zx;`QB`>W%VA`)fYq!?i+p~R@)Y)=S~`)}G40_tz-9FF>%B8Q_+Q5(~nqR3&xnZHef zF_v@X?!ttCLFAqg91gi~tB&)`-&M!hX_}^Knx<)*f2L`grfHg{e?=%x94|ZmvoNkhGQx4;auoa7B6qK^7dpUB@*k<9<(!8|@$c4~Eo0{bd}_K*$7qWc|atKLtD) ze;Zp8kVFDGB5?)w$-nx6%s=F>{5T5oe=m&&tRw5wrQHCX_}^Knx<)*rfHg{Y2y4ZIvNeZY_(Io0`n4= zBz_S=@uBnBY6pQR2aQ7E#b6O$fwhTCe^6u$7LDS8U>{yVEnXBB#WqHxuz4=96D-3e z5rYLVC@2qm2ptc>_$hU zVK#OUW@Fm&FlZDSEvXMdJS&=ZJ-N|*bsO^k2Y^G&jysDI0xrejgCLPq)(31WF(cSj8=~vBv3vPQr>ZB6|9G7;lO{lPGap?5dl3b3P;l{%EZnUD@O@i9hN=`YJ4GG_)p%EaFK@-0hBGjqRL zSK9(c??o@o@0kUHJLX-Ca&nA0XRg<1H2c89j+idBoK`KbogxFWZ{jvMe;Kp{-z#W7 zF7m>Ew2sg0P|m2qyNB?}LG#bIEgQo+qK~>>!tBm#)!Bs4TDo)p=sCYu`O10kzAvnI zcYU(UyJOxPeBm}zYd7bjk>DF=gZMQJPh{-J%!}f)J%2x!AoVThi^zr^|6*lrg|y0~ zzI~#u9O@fGCJ!XJVzuOU@iuvS_s-f3`Y@YYi}{IT>9J z+abj>uom#b0yEfT;^hea-OHN^OCjYvl3?b*CPs!@hA`gH)OgGde-*@yc&VNd-`B7!Xh8F!vqhb6D`J@h>VQ< zQxjyyzqHMQg%O`6e^IEPSTqbx`FJtNRJ^ToZBfrMrNBk?9iN}~WIkW3Z{2raJcsnc!Q+k@U=km-253xEtG>3ehfg=t@*BJIpoH@iaRPJb?nG$+g5=yae2-Yq47;!k9ean=#6AUcD>ivG3efvYiWqz4HO}|gToudTt)q3^T1&S4kRxrWQ;0O*)8>|%B*pObhSH6W z=TGyu-`VycL?+!Vtx?_bP0tU5tQD;atCxN*nWxjbrE-{W0t#^N1hva@$kV0dH z6$K#zC&Ow3S;Im|O))HDCJ`3<_3iV(7;yV-g=_unS)bZ>$j2|J**txhcU$8=+1mf# z6%Nc>Fl)hN9bbivwDt7=w^q2nvCV=L_9IT?un8G(!X7vw_1EC&VBmxV*nFZXG-@XP ze{Y*w=D1XsME7Uv+AJgJlE?wX2r5e_h!qN3{i=?J4HWfo3S8-TUuYRb2X`cC9Su0- zhXvwz3YyGG?(5(b{<7wR7c9>jT;Zx2Q#*4@)P-gDlt%>i7qj<%HTXGi{@x6UmoKWC zs?u(D8x%fDxbRpJy3%4uKmBrJbVlS$fAsx#uiG136lW0+)p)7M5A8Vax7;p}zuR)5 zV%k@Di_A?^tD|kA=ae*G9?7TdP)@tU%IeLxw|P$}zA6S&HvVW)!-dj`_nz^!K4d`i zDT(XMmp?jcy5yEIF_iBKL9YJT17b~8*QOIZ$}>-I-2-tue!B7416f z`YHvdn==Q`=58EOc3irhCf$8><2vtVLiFw}`&(NcnKKPPEIj32;$|OwwMa6fC1plO zcHkPl9p8<&G(V2mlDqY~*NQDQe^pOJQg`HNzdk?EH1}TV8p^kVnOM{@)j(#GvuoK? z9?!k&zr1pD{us&Qy5)Mi(7Tkkiv*fQ)^)3RMk%WsUAcXB2dzlq#g-0xeZSO#Tf6mr z!xgPgXOV9y_bpOV+df-+?L*@v>!f)z#oCAq(}UK!4L-2X&WpDikWPrSf5`15$jUEM zFv-YK4A7UHYbq19)u_?sns3P`b9+Kr=gUVzMDuxVd*(M9ds$d5!WYaD=dbb1tx{dR z9KAm{x<%$*M|FA%UyNF~?FruCp8MCIsqD*)sKc}6Dqyx;893y_VA}qNm+QYh=W~S* zc?s8%WoLXM3t;fV+@T2Ye`Jyq!i&P(rP8qOWJN4q8H-CxlsWmdR!SpLueY`S!rdc^ zM1T9sXOgI*wVP#+o_<{fmW#>i!g#P;**#4{2$CT654SB=u_g@nkPerT58hMjGBBUTz2bYuz`5e`tM)yErNkIC}pC z$>j`5bH>42TBRMYwe0m$=;DYB*MdV%_B&Q z)u%qPzWgMnG4`v{f8o`v=nRpP62VPfg=&jCmK-XPi;X7U(ThQa@1GBAHLLK?&Cva% zQn2Cu;~85$UKV=H*mX9js2a!J=5q#tGuV?`B5SXnEK zsiN$`7U`jf`D~f_Fk43B*PvrCC_Gz67RaQ2i%eyBfCz;~e_{R_nX*xh);efV!bQMIN$}da#}WYzmG!28O1F#yX}(CSEW$9*z2#m(X62&yZCGn8 zq)?qKU&y!G6}B^tB$EFxCarbWG2p?K)~4%T+Hysrgqu} zix$D!CVB=&cr{pM>=T_mY1W+*O4cT@h@oLP0-3Rn;!njUw+AVL}qqT5n zc}(!3bAoTy4u(fMoa^6)Up%-z+Wxy}WXZLT{xY$_lX4fluJV?@SzrEfmuHD#1hd+r zJGjI}f5Nm5mXEuwd#YL_EjQ;Z(^zrVZX3lC{{HIqGL56@KT0BYqIk09K0g_a`L1gy zdjOLqb>L@vSkoiibxZ4{{U2AOhI{J#bW`WVtFAuoylbW4hqP@J`D^lD18aM#dhy9` z`VJ*mC4KqGx4UI=#&C1&d1Gs)W$*W+*sjFRe|Ahj{6`w@O^5VR6%ySu6a`w6S9C@;~ zes|Y_L`&{ za=f`q)RO~}*QF_YEUtFD9xImq{f6g$*>zWUG_)PM)_ygxvuAg2<}InpzfkCV z;_MCw#xk*hP{PX;&oB0yW~x{l)uuM+f9FS`n$Xe3kwm|H!$;WU{zJH$clB!7oBB#M zQ{^P}6%F;+;wfP=KKP<5X>A|G4-aZj9Q&7oRnd;?kRP^2#*(&w#h^sRZKyTk?nAgG zyXCjD`oUw;tD!Z1t2cdo*+M=xi(n}CiUIqMoz+*up0InKTi&unmw$DTriU>(f5-J- z6Ie|To}9vf0iQ0oA|I~?UXycZr*a+I*TQRHAFf0DvVUxA;@ti}Yi(+xVkRdggmA*J z;IB*&KW9Nu5JTi3#Nmto)8YE6WTWWr5fL@kz@6h%n^rgf5Zv_X zAYCy;JX-G4rQ7@Gd^X-?`1+0IgUq41#=ds9Zn;JZ-741lu~-Ekxc+hXM|rQxmYxf% ztSv24D1?f;cBPy11@--DO6bG6H7|T}@^bF(TI1Atz*g?9_;D4@{-`4}e|MFajb3>z z`K9!L+Kmp+Wc94?)PU<}*z1?)mMZbdc}8m&Att;SC9XEvyYgxHFJ4OcAj^^ zY~O*>lkFFG=@ITIdF9>7e`>Hjzhv?IVxx`6{8BFD$r?qerKlXqT%q04<??oRTc*BZoHP?=7t(*6lI%G){C(!h1UUl|Q}<^gsl4Mrf6;A$koHredAn}; z&Y<@D%pS5dEAmj3H`F_P!J|Hdep9TZg?LO{DE>nZ)wE7*@4}ffIl5mJeVgK3yd%Ck zWScsu&@vfywjWG=v?LTyJf`Z-cv`ITNMy~Wud8Yo>;zk7IM^yzO>UKtbX{-A0d&sN zY))oJ`oBA~qlbr0fAwL!iJqRGA=o$d;W1VpVgJLs`af-OFPOId;5{f=l-=-RU zS+tdXZ*(A+kFTYW>JoADw&9A;sEt&I&aTTBEo9c}|MYRa5%4905bo6#=iv3@f>Gd> z#VW$3J0+VU^{$G`_N|Q#cH3lIel%rq2%pr4x^d9n}!;fyU%Y`z1DdvHLlb>_3<|z zkF3z31^X6Xe|}qVYQ3g$asBH}cD;*fxAj`DCc-|h^Sk^?8ZLJ2-1Z`~80AoTCA?6^ zJ89 zoIY#Oj!P`>tKz{NZe|{JHfE*IHeibliN7zmmwkJze=mE3rPHI+Yid5UwlmFbT&nd= zol?-376s{u_itXlxU2bcu&fsm#k?JOXib~OI&_!5ETiohZm8y)gkYOLUHFy}DcL*k z=q9DrzA$TddV2fCWy3;A#1BTihO(ROA3dJcJX&&pc3sG4AGhVJB_63&oLdi%i4Yjc@Qv%UVXAuq*qdxOGiO>VcUI%Jow*<>eN^T{OAIY&FBYxj@rZaBb8Mi-d zy8At1N9LV;K7URi3a{$@`~bsoq>$e4BUNVMVo!=X%bT{>9Isz$+Ex>8WZ6NYZnzs^ z8d@oae^HbAo!XqAE~`B7Dj?8|;QS=3qD(QW-AE_5knIU!&hT7G>Z5d42n@tL3#MPu zf2^mqTP}$}J(PVK$`<|q6OX?jG3Qnj=kXt0@7O~x^M&TNf zsWU$$hGscmAWG`h?vg_9XG;&WgfG3>e;waq-s4~qu)wu4@tdCf!_1GVpLe4^H(qCr zes*He#ZN@Qbp~hFw=er4xblhB!W-_P`~6u<=AU)3*RGbrhF6h>Rj)8ZZ>I=cK8ISd z)SdK@*|t&9+ZL7LCAT|7qRNGI(K`_Wr^S3^EYDAlN=!f80?r{F7tud0TDTAd;ndUj+#c&^+(GiVUeemr=`TuvL@k1(tppSgKJX)d{v^+){3jNUBI<%s1!^({+ z?>-pmtGW0p3Fjqjf)nBk;{LgKuCUb(%p@_<h~z8x5yW5r)k^0MEIdhM*`$z>m343#V}dD)UpXWZ+% z#_t$<;#0(CZ^6Lz=K6zYsLwnpDcNTe{rZzHWUjh68Uv_ zHdX{?V+Al8(*JA5__3f9-cT_l5Go8;Pq% zwAqDs*40_zhP#8*7gw?AaKbk(187}*LO-0)3n#pQ6E0(M-2-k_?@eEZnlxQ*{4R{! zL*M)mooSw%eX(Yi;7^KRHJp(3U+^jXdEh|j?JIe%6AjVYTQf0m7gG@SMMZHVn~Dk{x~FfS(hh4Qmr(Y%d!kA$HeT4}Rqun2R45bfIE=4hg<>VPwMi^SOuI0%=Tq<6ZVvL@gi zs~oSZMT*6m+qu^2)1U7}tt`w7qF@YyXX-_`#9A#f9UXg0*4!$iq4RqUus}{ zJ{Vn^Q8v1r%*aQduy*u5#^52wmZcrskOPM z6-8oVU(F>ee-;+ida23OGtF>HI9hRboQm4K-W$T#OM6qVO48nD_w+fxEi!ARWQBB? z?03CQR(Us2CPI6E-!=6uA$Q(4+Xj*HuJ3nOuJ*3EwR}@b0nWay%(Ti;yv|l`NnM88 zvqD?l(L&T~y}(W7GAavuhU0r-Ra?N2jAB76Nh?2f>`#;0J7vo9 z?LIqpy|BlG6=g2AZ~CU1yuE7qb+wpu(crv@%54NeXLN4VheOBZx16@ z)_11_``caJ_om&G($IZ=|+Nx3yQc4YU0)%wcVFQTYXcN%=A3_ z9|JxAZYXCd^X5M@nXUhCoUJqSns?6m?q0V-e?UOMi1()I*1g|)zH@$O`OaN=gHtMZ z@c$+|{^iO)W2qY*4m^tCN=PXNfB(y2`EL{)SHtnuBDjq? zsvS&VVnnDG=&x8U(qCt_lm1H85_2+%xtN=In3okWA1h=3cG6RQi^In_n% zQg$vYf-A*rA@egAd@5m+nHx$N!KSeD;BP5ApIrcdN3zSl|mU6*E!fMHgbo9jcgIC$FWLQ z4p+ys*=#iYoxtW)PlP+>vNE`%EObtbvw9MIpT|bQ_fhb~xlCN`nEsuCtCw!Up-;^8 z*Tv+9V8S1aGJm5Sjwbx!D8CerMg75=SX08ka%*Bee2FJup8Pap@ydRjkE%>@e~6b8 zpdT|n^=qOgQ_718gtpX%8nLv@XzP_gEE?IGDO4^;!tq3=NcqCcD^R{caRt;md^Y3L z%gKz;E-RJz_=QLi3M=HFd0Afm1&S)Fjf8@7piT}pgyNZ^W%ze>Q$s^g-kK>|jW?^` z%GRj#xm2%Ub1e}PJ!aJb=Ef|PnOoRUDF8@zH!!ci|Y3kk8+nRK)X ztx}ugTE`t_&0@lp6yY9`Id?k+$Hs|FfH{%|wyvc4NURU}acKOpI)9?6F%pXVgK@tc zN;JvQ5cAh;_3MK^ZMr`u`~2{qXtQ61~Tn?g~4e_c2ds;tU5 z+Qp27pEJ%-l(oAv&iK}N#vMO-}OI1Ub90paMnN*@j4bu=VHF2Ou4rfE>7#yTxC zl?M!Uz-U1Ou%sa4W!N-qX|Q&^awn`;nm#!cZ;Ie8yrkNg3|AUsQ5IJx7>D1#Ih8^4bON4dp)G1DL3v$MLkOr23#l|$6vDE?*w$!hb0i!MT~3AIe`9K+8-iP*=4c`a zw?TtLax@rG@22tD9EwDU=fGpJIB!#&irGxxQV`)f(R%91cd8!x0n=}xLXt) z%!#Y;%X5L0_(E)If5efT8VNUq6H`qq2nI|JLkDq1(0FLX?Vp;cnW{|M@;dEd=v53p z;7Wv{z|PI|2O|-!pr9P$QyyZK{6SocQ>hrcXR%J;)Q!Nb*Tq6K=@$alictc2`Y)&*mfB$9~rfb@CDx@I<6UdY) z5i&077)%8Yc~!eei&n-l25ulGYUFwNeS*zAmBMM3Hcws?C&kZ_I!~oEPwFhS3bfS4 zflC%+PvpdUlwe3$Qw`!|nqmDVYG(SWmD8tBt(50t(?n_^ry@~afS>2tG|>mAOSLA7 z`I}fqO{@nNf1h-;2)v=#$S==>+i0j(smt9cX4GMpLyfRzL$uI!jzG`B53?HO7)ahY z%)6Q1G)BtFY|VP05ct0-9;$1K(2xWpv=kE|RRUlI#A^%^9qEkI$1xD8#^>Sj#WpRq zu9B@-YS4~-(!&bxp#CSImYSvnb`$6^3J=UAmJp52fAsTjIOBMQ9yJXfu{#5f0qRKb zF=>JxY*p759~|CD&dac&l{khWjr{~w{zt0-kOQOULEUh7817o9@Gn>#@kZ<@-rv|5 zVwd~Fb(}qNuBPy^;3jx1SQA0+hu3u8#;KAsxQs^`TX_u9;N>=SiNt%kMwi6{*ZHvB zfY~$5rtS1 zxn<)N5N|P57ptvp0@1^uoHey>!%FcOVbL`RizEXqk`iLVnG|r<02p!t3zq7oqzfRC zKp@EtAju6+0Gua~G=o5r`^(>J>{)NZ5E(VHe`dOo_@Qz2uy9>nNLFrBVIv4|MM&zS zwmG;pzQ{jqF8oxd6A&?egW#Hp6HUb+HLV8w{p_KX4i5&3(Xxr+ou+p|Hm1SH3 zf7*junyzmFr%B4 z*+Hz=5DIeU$|q0}Aq5QnsY*O~qh;6@IBdD%wTe@MNE z#~MOLcAtY5p|0E3hoUOPjB|41QU{&`f(fBSW4h)VVo>iE;F!SRwH_0a496AG#JN87 zo*_!g?Vrwt4X{8$@8Fh@i4u^D>cm6JUNABd!oCiVVU@g^df7PvWKf@$6 z04NHsGjTkC4LBA#;*&-%g7SqA0t~ca3{^=)TADIwfE!k+>`wM@NUM{ng)Z^;qy`;I zO_V4Z)$2-*x`8t_qm9C`!5c46it$MdXmgCC*%>Wj0CtmNorvF(s53dM2AmhfeFL5g zKsLe$;LimCT<@Uu%I%Wgf2fR?2nDXnH|Dl6GbW%Q`MNML23)5BoUezmSw6A@c!eUt zCl(2E(9T4lfsGk(y3>ccLyK@5Xbl4WV*;+P7NH(m?sj}1u7A(LNT;Y87<)xil*oW! z+68e1qh1Bdj1!x?oLV0UAPx-#K<%*`;~&E5Db1PzQo;wag0AK$f1_Gc$14jT7d$S0 zPymNOc)v!4{muskXfA3J&Vj2|o0T0a51WC@5{C+D6%7o8f@Tti2E7M}#4O~HY*3_; zyv%sjC*_DuhYI1;Hi#bNG4_H9tt9ALoxCSZ+%G;Tw2^=txL^fpms;BaS^?76Z6Tb< zD@mRM6>HoT`Eh*=1if2rv40%JlWf!2A~?NdXsmU}J!T3|AfFZEWeL#!TZHXG!kG~2 zB{*DgxcOAHxK*pbKvdPTf>!O*Iw2;;In&HbiTr08c&o~|t<#n%(25us8I2J;(3wUR zpcxN9H&mJUJo;|Ml8FcM+1)}{^-41(<_c}+8%=BNs*TOz^uc;75r4S&%5P4YL7at< zeHq&2+8p&_vjc`x;#5Ee7AF~4xS8`mID9t)9YWsW1lpT6#cDanZG@Rm7`SPSIuBfY zYTZ=ba8(GU z2q;Ul-Q~gz4qoN?9Dh*Iv=s!_g%Z@HjJqyC^FnqMiQ7?xy8LF85pa4B$DdR#j~AFt zet0qEsB^@D=)fhbk8WDwrp!8naYcdUyi;-uo_44vIo=mh-kHzXQUIqv(mEpMbi`>i zxXj7Z5m>n{#RLPL0m&t{y4!%~Cy9xE83*y8I6%1VG`QKIxqoR^Jd(sfQU+2nke>?Nt);cb4J-(rr_a>24ujzbDu~IT$8rlbj#w2M^yYC+*|K#c5LLlN*q|a1U*M&1(QQ{0R5u1 z+}aueCKUl%0Cl+rT?DG7fLu&gR9*#g%$um;4k*xFv46}=(W<6sBHX~4cE$rgqlOI7 zVu8&f840ID*q`$*P9aA%Ksa=hRy&!fxJM=C+V4ac=?<~l zg>KRvj%qi$O34XY#ERjs7hR_Cw*cLy@YfeAMCa)aSYp*hOoFi~m(lq7Y*Nh|_U+Z5QCW{^#uFzn_FZ(y6 zo`VLhcvE9zB#gQ?*-k-`Nhob-2sSpVMjRR_#qWfcS@eGKVN=(L;yQ3;yy~oF+eq}pITk$lx-2BfKlKsx8ela2TWuMXpsrIsWxG;Un}&C|1AO? zJlNnjv~m$TZ`R0&^44loxE5J5=%VPbQ;g8Ml~^l`+rt^3`bz&zst;$T!S)sgMg(97 zD};iY8u@hBg=JvB(NKt~lWb}n4kxusoqtLLeehprDsV_GU!@qowuTg{v-m9tr^R!t zR0pC_j%^Avq#d+DCkR5rpoW4BsRMg~^n>PG&Hf%WRcKlXdOaq7ucFb_swNT!E`CSZ z?P4>ju%HG4x_Lz0h+GS8hY~g)y;PNRGQx(8u*s^2`mR7CuZ=Y{UIo;`fr;CJhJT!a z=_W!5fa(-Z1Ok;;@L{~FQhyRKy4;FIq5>s9kEa(@0?xR|4N4RZP+p3MB6ZfAU&fP0 z^42DL)vCYJ;Ci83;Qu5z21eU9G`}Znt)liPKq-fuEWu|< z`Rszvt_=XO=t(y`c{@FcPvD)7dVfzH+)sCS(NAC1UXbyH<46NRkfbC+tQ~)m28cZG ze6UKYVu|Gq@D)K)hyj*-pKc*Xgmqxtfk0?uAmA2MgDoJ0BEfe=6n%dXoxcAgN&p`jl8ZsEcY1jY!O zJxLNIm}TimPWSkoIo%V~?te+tJ+dA3OIkg4)p`N}=vE*w-Y}TumfGlsoXRxvyHFuN zG{%AC5L&fqZWB>{k-UT7`GmWP&twWTwwdt&8Ic6lMhVfi9B#C0Fj2-if~Jr8gfYUv zNK=EctoCAg9r4OQfa8-uAX5|wfYuS=HZtrui`Bx1f z@$?%!eL*vX{-=kumC zgDF3aW4F&{Jds(>)s~zat#18JW$aAMV8JhoTXnzgd;E<;={o1W`%_T3RP)Q*vwgGmFmL?=b7)i0v!KB@ACFy8!G`j$2 zIGWu_j1s5@jOS_gCO!3@=7MBFy|>v1=YrSNW0QHxRroxpUiHbFB1qCdLGzt|6dLUJ%c z8Utv0v>M|6X>^Yo9y48yQ&fmn{VyD?jWn^4O5s$i4OVXmCl+z-5A-+n8MJt)#tg2l zD2q)am47_7RSu#Y#SPjKzpOaq%q!R*ZfFQGj6;ZQooUuTRGmnD9Ah`oE`z!Xno}YM zHW9{{$|x*m8>Prh%!X!>!eO!P&=eY)hg`+fEVIUxM@vGFH`kBN%A{IIRi;EE5}Fj* z$zvVd4Z$sd5S9U;)RcnuQ6$xM2S5P=vP3KviGOF@;dmrm8_E>c0^KHnK6FL1Ga)3M2@y1)^OMNKoWwDFN$2fSv()Trb_2(N>j^O_ zB{8nagFzt5JrprGuuUTbdp@ENmBLOmO@H3#ZpZ&@*AnR}B zh?>l^zfj?pJQ7B^9pI9HGZy6W-H4$xE}B?7&B8ia7zVRZP&HMbTR_8YkywPP*cj8$ zYcb{~FyS+rbffUgI!Chr3>?Hqvl9-Ge$B3=<66fa;f^sN97z1c*CfTHyWX+E34foQ z$`vPE5$KAfT#?|4xWOqun{*|d8zgxb{#^)yCMmQ^%$aoU1M!n|F&F%nWbUZQJaEPP z3<(M>zZq+Rc3?S5OW^KHu>@Y?n;R>jy&y86yntyIVbN zjy6I0&AUec7F>XzT74K70wgyHM1P+bgdRRq2x8KkEMP^uMSNn9u+c$n_p}x!J-n2S z6}&A_QhomZ!LL8e=^+BM;x8TMC=@QiC}iC(TwRZRjpvJWH$P?<;jWc5c%*yK#`RSc<6~5#r?39}w^G4NQctqozOQN6k}I9Uqi^ zRPUR810JjbKa8dir11N%^nd?|{B6xXkbcjraU|_U7N(OK8CbP+$t|l^FTZtZV970O zZd$gC*cLYq5J&3MY)kHVOoqnF@8XpN7U$!35MpZF@lHEo_(w8I^N-w2T^j?WAy3Ae zopNlm-YhHE!^(FEiYo?V!PI}~v~nL21@942bpJsVy?+p$D260q;(rlIQmuG+MWnyn zNZ|&dHU_?p0j^ml_~`ygaR0z4GY6$r3Je?dbNO%Z^tX8WJ2E`gqDbc63+{o_wpG~b z+b9aI5|nT@s8GZPiAPFii-NB#zk2e+9N!ZuCnBgPlHz%iLM|KSB#-wAo-W%j;O0Ge zvXE4m(G>Ue<*y`w0e?|LJeAH|IQY|<(i+n~4aKXX;I=sMgjmzM^`n_soMs({wi8Gi*T%v8~St?K;1??W$@ zZ&-=4@TM>WW!aCWaL_EGiMZ7Z7zj{cdLXbCv>cmq6^^Kl{S57a8I?ID0kZ~1drW1i zkK~qy*a|2jZY&mQXNKKRGn9A$l~`2wTn@=tsv+rw&0T9;ylZoJH5lBerUEc<3&VqW z+h|$m^fTYHx_<{2MUgR#I}SG`j9yti-cb+p_8USSZQZo_N~PbqtU0D~aj5f`N;3AC z%8S+2fgY5ughONE(#c5St&vZ5>@O*YnA~5x9CZ(Ks*G@ zLo&Gd3ytc?cY#BLO5xy}D_S_##F%rjg=0u`%!u_)xPPNSz8$aEJ6nXLXM+d6VdM<| z4re^-aodGJN{YDK)9j5(%+c(HGFstR50%kMWq6b_T9q<9RE7r+OBn@JMggEybi@|G z8Saulggd=}Hql}0O%&Ao5`{@@2dPNRxm$wkMdZ#cPLyC@;M0ht04Q}~qBJQaMz)Cf z8A>UGUw_Kr@2F;9(uXaC>*EvUNgp|O(Lg>5ejN>eN5kJS@OKRS9SeWQCS7pvvZSN6 z0>eTm9#pDYCVvOf!vKPVadH8EE=GATh8dc(6-J~-iD!xfdT3oBfc_ngLuAVB_=X_{ zhPM0c)uJ(J-@*@RI|9bfqQ5NOR6`3qQ)q~FHh(~%I=Nb4m3YEn%F7y zfkJc1g6zd z8LpL^@N})9`9KLQTPX%_8YOBWO+K1cjF=vnWH+-qCFl5Qwf+~Wep&&vev!Mw1a$nN zS02{fr#1)|y-^cI-8VPRmaND>oYx!ZR_ax1l$Q(noq@2V1A%i56^^&9kZv>8=zmoJ zHaS!l2#QM(&Fm8~mKo=_g2l7Dvx%n95D zle-g!?|wHJC)!0^=?%ef6lAWqrYVdjqj*N(y9&^%kZXMK4S28M#a=bw@=yCw^K^M8 zN<6_QPZKOVOhm=m702~AiB|j_W01?XI@%m^SyE^$XAY#YjiSO)1wXPM56ExaB@Ddq z=VTG7wQ_}mD{$_&G|E@qD1R!k1ri1uU2Z1|>@unt;*Zpl2E5#y@9KSOVuFVPM)& z2b(quYLp=uD1$ijb_zk1*C^b%K%PN7m`A1yOX1q}@KA#D&lwaJgLmQmQXJ3DoO@jg zUvtZi%&C6H&;|7lK!2|u{TttA@#Qb_a5=-`Twdp=eYEP{I?tqTSwPg_FSyxm2Q^NMJ4-#a;(WvAen8H5MIuS>YL&@JDnBl zG9}3QCKwtK+Q51C+s2Js#(l7|u2rp_nG$90ltywyb{#IJQh#k0)!+6Swhq3ZZ%Zqd zx=K{AGnz4dLOD5bB!KYcO3-1cJ#tcvkwtdKNFEJzIW}*th8ih2s8LXwmESOls#k}g z2LeqHm5oY8i$uXEc?&2QXihueF|n!&|G@vws;V{cb&cf%ocLXM_<7qr*aR1zvf5@j zKyNVUfFq}An}1tM)pQ{|vB=Z-z&=6QHO_afQ9pv}{y^GOM|;(1w-s&Up)D}9wSnUN zxz}y9rW(${@>Xg4Cd%^+Nyd8xw`roi*6~#hN)d$>dPT+Ysk%SSfARcZQlZc5E%W(& zlCNAmBD(PKjrNs#M|j?ogcY@IuO7|C@zWa2bnyZeo!s4HCq#$>Cgwb z_cj@`vEY_$|BXSpcGlu31NgNf)KJqTuLE`vj9eYzUn-%t>6JbuNt+uvi^YE}8sp?A zsY%Mjcu~T!UEnc=Z9>9{o2cr@BVEOJZb_Mv#eea5NXF&Nx2j0ky^L4wA4z)vU#@Tz z_*cfwOAPextj?gU$}3Os_(t5_3bV3NkLD4{BS^c1o>(J|z%43A&i7 zPk)y3?SMQ^yhu$-VQsye59Sz$u3HvSjg|a|W2Gfs$4n~*|G4M`K?VP06wE>?iSaGA2@ z(OQ|p%Y%`nG*&X7rM#8~zl93PN~vvr4u3e6edQ)PEY^szP$k7!O+857iTP$!i}IhS z?T@6OmVpVm4c2U5%S`i}v$sDf@(|2cXfx^RPWmRcImSA;-GKkHn%hEAYRYp|A(e5} zMVjL4p+^%{F$R~=*MMq`WzxFp-__@%Pl9*rJVX+lGAIdN4}YhNEF^fn9SI6536>g2FysW1BfABrM3qCq21FmA zb+@}LZOOO@pJYlvca&?IFmo39EbQ9!17pTAuR!0Aw>_&Uk5-j@d%gickbRY*vY=gM zK6B=cdRQQsi40v>33q~o_iisafoNWrwR`#YL|sB<%EI~#a@HlAu5mh&Gk-;KYPU@7 zR=-hBML9Dv5RL~(7gGTeROBZ5i)RW*o-Rl8TdAfC%u?r=D-%D+GYXl)bs?x|9VOq> zatk5di{^j-NvSj}!n#n~w!srb=t|CLRSp{(@&m0k(R{5jD<#+z$pZ=rsuNO~yR5XV zwA@+lGOH1fSN{9C&w*^gV}FcEjc95*9wp*gN8aSo&WN)?s+I%?8%z9F0DfD6iK8(w zG^hb&Y-U9UWucgrz?BkG6`Z6hjKDz4R!x02F2;+ufV_%|I!F%6kH#}Eud)D0fGqEg?WhDchRo#UFZ;| z-HkH;GC9QL@CN^irYKvl>N99Wy#`yq{3cbk8E{|0f{EZ&{qGBg{lE^zDX#6DdNfB_ zKqaABN(i`jxLZ9*%P$+(!qYyw;%fD_IT8h$ic(lb#(|9B8xU`g4hY5YM;<7u39So9 z{TIYAi&Fm)^1TM*wc&98ES0bOeIXdacAr%%Bl`nxZ4I)Fi+^|wrd4Q+1ZzX8VvzCH z08+!^GVYpr!9Y_}#tXcHyMalGE3hbWhOOFC1D41?3KOu`%CxM{@yx zmN}9ISQ9Vf5(kD;{Mh?FHRFUU=|LLVxB}XD2-;Uj?SFGxD5i*0%)pcz!*O&B`KJ)E zOi{N@`)TIj;x5X zyhvGOmmg!zH#Cm4!r;6bq$n4^MvCJ^9$Tp=W+eP_9-c1N=thWVB&;nXY|6N!#H5IX z_~}COkADEwaG8qNzM5&K8i~hBmI@d-Swym}L?{y{3g?St_!s3XPoVPdK4#^8s!@5@ z$HLr4lC0OA7|k8KD=*2dL)F~BJDBF~=3u}*bj`g&OO<$mO}}u6ml-s7Ctb-u8)J;K z;nHRU_wKvx^z>!<$EH*r8vuDNAneB}`i_&^yML#uQvqtkwVI8WYqNH+=kPNqf0tQ0*njm#*$(@fuiHv98D5iNBGI62md>rqP>qwYhEU zwFV~hHPEck;EI$A$lWaYM*Ak0dCH_RDOaU=^q>CWUphxR9C(a1t2Bwaz`{U0ylzN3 zjh5XhVby8M6nQ0rrokN|PLo4K0^LM1Ie$c4M|FrOI*t;BUqG5l`InfB7U4^S6n`80@e>~g}jsz)u{FXJ#W-ZiSMPbON4QnvEE)-wn^Ud(zr29!`Bc1W2 z`20~$sLX%OO*d*uY8r9dNffTmR#grynKj=olUOf@LYm$~6%cV_1+tRXT}jxU^M3$^ z>D$ykljkOeI{0mBW8xbq1N>24FfOAXgI*orK>tNjXd@;()?xNzIJpZ(U0PmfK>*sc zFjK_oMnU$2x?si_u(*NPRJEW)x8Riv?jyPG7niZw*HYpO(2Icjn24wrJAnuqu87Qm zSDN7ypm3#Qpi?<-7n_}k#gkG}9DnPe&Plv;gg@87I@Vn^O4m3a0`{#rJTh*Wa*Ppi zb6+|7prY}n22dI8eH3L{#x!6c80CRy$`_tr#x69<*b+^~j>t93G9M*QBNIWjhZSRN z+0b1Hk~x7(y`Yi-25=b6v$Ty$HP4=7@(LhW0kXw6_YkQ9hrV=ST?kplH!{eM&^asdu%*dTq6uW0%viiz@-zY;)gtG3VvyTbv5k&LC-? ztIsLlCRKVwavqCU!D&oUqYgYq$(x3qBSYh`b7uliCa=7K#?rjmaGGj#8|HU63_X@~ zit6LYv8;il#4UZHiwsE2Zhvys`|^7Vd|KKx#i&jC8Nk5v)l7_uP)_x6rP#`&RIlD= zG;e!{q*+YXjE^|7@+I19G3<=LI7j2v&VZsJ`Mj75hOXyd?F)>ny;w)oAW9w8e5;zn zE=eMcQpwO=GDBVKMxx7%zlN}Bh}qOK*{n_5toeC)*Sys$W3ryPjekpile*;BV|Z{2 zT3Q_PjD%S4Y?aUvBTqp@KzZ{V(X04hOc~Auk_#f{41;IIRu@`nxNN`|Adoze&?1#Bz3a!3XL*z@#RQIFGm%Jl^FS&RWX@6e6G|9Aq7E@IMSMr!l zQeLy7n?D6^rG@D3^d=o^ok{{+X#<5i>j`jGx2B5^Ye?&6DXo>o>i$@6=gUWzx9U0j z(Ikf%jRwk$&E<4?lvo(`^;($36W^esTe%dxSfDn{2p(*45Z-i$PL^H)cTF3bqgij1 zpcU(!YeQf=$$uf$PQa~PUJqS4G1JTK1}ABH6I$QKYx-}#IjzY*r@W2%=G3G>G-~gc zAaODYaU>!}5GS{zIEh|m5FwO;QobEC^8*dI09#5%QPL*riiIXfO!wkFlyZ>APTt7H zgIR!Z)6i(`RYEQ+Ddm$KGEX+D5UPWOg`4tGR{-DBNq`1J@3N@_uq1_&yg0Vo;+%W?w*@#Nj2Al{R5wJ~yF;-vpcrBJ@nMQ!2q4=`5>H}@D z2K`>XKi8A((=9+AZSCrnFV|WS(wcGq(45$%+~$KWY;W1vvh&M|$|}s(o>w=0@{1b) zO5rgo*MHh`Y?huzi=`(7ivqYssmd*`b8wi-Jch7W-R|R7Y&yE#NA+9lb|3OvD>)Z< zfa}PCyUZpY)x2{YL8-oJwbSA0#;tOA-TH)oN!6<5GyRJr5&tUu9`~;Tt|4#2w1rhS z`EOgiYSrSZHQ$HFhH6RCUkHo5f#4&Cc8i+T#D8p1urZSqQ8GM>nS@Lv{FxEDibGU! zGTj%JcT2V^8}r(%HhL}r&2}IPYSnyAK7%4%Wa4P5>1Wh2xHN|D3o0_7iq*LGGJ|b< z_UIGn_o6>DGE=+iOj`nt#bIq!O1=`y-4dLP#L(`@lU(+mJ2m3~qYvRPN zC4Xo;7-wk7)UVYN#osW<@Nf=i*Ag@-Ofy_N1&sipwIpLqh(@^lw z&;Cm($emJK*>mX`A$yjYWY49V>@kR*Yk%Z$FzUa#DIAT!-)S}Y_3HTMP$&^>Y#iEd zh+`BWmmZ@4xzr#)3QuzZa_MmjkP)X;fRvoR0;KG;5g?;a8v#;rVg<;hXNUkf=kymK z(qIDQH@EEg>|cR5;*smBog()ZKf!wD7?dpCT;^6=^ZnA}vn1s3=z0 z=uzavD65<}E+KI`L_6vs9rP+ak4CF{prc1widv{+p$(TPS4~965$Y%z+gN3M-`W+F zU<3u9lMB9PC%%`6p<{Xue^q?I5%t0+55+$@ajSZ(!}tVuKs!m&MZ$>$Ab(UZ_cs%t zP$%3VG&9cl)_A4>LyYNlRJlr6uC#@r8>>b~sYw}>7p&xww`JP9BPkV{Prz5ANWzH; zrp!C5N*v{A&bY?fOymsJ`*0j_l%f%{Xp>k%87+AvK)d~dlzKF)fV7Jmu2Y61^b7;PgewS@icB8{FJpK0xY z8pkx%VR+pkroi)wCpb>CT-zZ*fp&8T6COJB(&99IUdijRhhV2soTd#u4=PN{DPx!d z7kDBs8-6wS_`) zScqp8r0`6>`Qw_KZfy7PBy%Q}A+$vicexg|T-7O4bW1dhA9x5_A%DfZ#{0NzIFI;T z&OU*2ZI-$Pm0zOAe}DSKk|SQxOYhq7DVe8FZ2YGkmt3Z;r0eoxowIH@M%k!MnlPLa$a%ipH%R6u^{m)`Zt72$=U|uG*7~ zGYn`}=Vq(8?l@M>-jeYK8MEVMRKzk(SUF2wd_sIj+{YVT%75}imr?*Mu9Styn`wnq z!hNo&lyH!!_e7`hE$4EzcE?KmjqY&K9d4RdkCIECzZ%A=?lCis%|bJOU#0Dkq?un} zGxPYw8Z~eiV^}e}pBJc9`h(l4eUgS6*?N_hwdQI~W4LXIoE!&ojw!OW7&v(eT_0lF zqk&YGzn%s);?U+WsGI!LRJYXq>a&SPQjtCFb#I`ZGPoC4H9%ml`bE) zWcq@`7i^otM>Q_}^_G5A8~V|ME&cVTrEe2gn;+XQGYX3Zs<3Di0o5WoBVo^g(Q|32 z)@?zx6i{h`DIUY1T6B9It4LM`eZEcK5JNlM?G7QH;&hBL>;Sin;?w>VGTkXfFqDAPD{{hzXMLd z8ZJt*u_!?=g@-GpNf<4_8s7!1;pXWsk`l=h50@p&cs{Ka+It16`22dz8_7#FuDP23 zZYDAS0DtsaBl%X1B8zgP#J6eYl^k(@vYm&xREcGwb8WGi6vj132R;Aozbza&0 zvhuPqW|Nh7`JS5tKjv_GH33IiylN?2`=nRP>IGzMjr&Sce&Bqi)aKl*;MexI;L=oJq z`N#&1BKZEvjUu@97@`O+Io+ZN^hs6Y2Y+l))5Y`u5=}C$rXc$@)LBm-b zMX>P{M-eorQ5l9Pf`&6AieUTkMG^e?42vR|ZOH#c{noR>muOsb)u2%Xw+t3VaQ7*S zBB1w6o1zG|fBh(exeLD0D1z-8*E*WLZ0{iUvVC7Kil9Mj$-ZN;jtv$?(0lvL-+z4q zw2sF_vvrJP&p;?%8*B_6+v}`0S*&E&IT%R39S$a;1E@pd?AtCI}+K|)E8cfWLc9y3!)cZffj`8YQ(^Ox{Zu?VHWSgH)bo#Z?>+; zF>CF{?MuAx}e+Lc^>cp8{sFuhr+fnHOf zy%pChxdpm%dU%8kj8QQrDt;i<#;ACLMwpUs(lQ!-EbmaUn2e60%RJg;5vkJZ&t5y7TJtRa{P*P`(ZUv7eLUg1;?jei3L0;;Y2<^}Ze zy?IUZiCNjPW+5-4Rn7#|1QgYBpiG-D?cFl%g4y(Em0r4sY=kvv!$7>IJ(NRwXWL-y zG_ch|o7JblhtVhY#cd-s3xOSn#kE(e>lr@hNk_7=I$kOtEPy&g(hHf-5XzF#2SRcpX<*YPPEs-)7-AR66f#;)?nC zDneuFd4`G>42moK23*mCc5OW8Vv9_H#yK=tp)I}>11s!azUIk1HU;wd(HCIvv45Rd~eNE?k`)XNF*4WQzn&jBUOZ?m=MYHhwpFD2$o*M2#r@Y z=@NBH1BqZwB!84&IwSQAlt7Gc3D72VqSm77%JgtN_QQHmulvV0m7;DMyN9aWX-mOhmk!#al| z)6Jd(K4Nx*b-pFv()lM@rXTZA=~jaZEr`$3hjGTh(tn`{d&}VDrKH)GgtD{0wy?L< zY**<*OK|GKuPN*=%U97A7ASMYi4gV!9$-YsfHhICE!GoaQ7_=U$SUV`j&Q!_?YKg7 zyxR1BurO4UoWCBf{#%ybQ71Yjm)qkl@D&ynmy9SKSvIPC^q8>~zc+RAA{gbDh zcm4$zPJf*?ea1yIXI0LgGk4zni!WJl>B7qvU4F%tSAFN|#n&vkcImR~u3!G$8&=#{ zb<@h5SFK)i%dNM4@B7t1xc!bF2G#~^Y5^v#TOY395NU|U8aK-EMAN3tTejZ$qh#}s zf0Ejkx+}Fk)sotgx;wQqbx&$n>fY3Ssryq8qe19=smD`K zq@GMYm3lh0FSS4QOzPRxbHDralWfOb*^cemj+Si4j%>%>*^Zsrj(f5lyRsekW;^c7 zcHE!scp%%cJKOPKw&S5}$DVA*!`Y6#*^WoD9gk)^9?Nz-p6z%d+wo+!+ZZqDyV~gu|+o2tJm^~=*^?%{I zM4&z#-!f<3-1$R-eQuR!>?hdAga|@E{EM;1_*blUh8(RD6We%{u?_~+C}R~2I_o{O z;YFfIV-*lO>kBBhSgQ6JKq20ZQOHFtuIeHKFvRN^i(CTNOB8T8f_T^nB@Vd6+{=BQ#)3z#`EVluBrtOw@kx^actN4w6OB;}+*B!4ABv-VP0 zSiI&yeIt3BGa~{GO_4+xb2{)=Y+JwZ9%zK9#ElT!;(b^qG zLgMV&`kN9EH9-TGcHP%_w@2kPr5FJ$mPsXobVO3l70wE$MOR<@k4KKey94v)%(?ii z=iSuH)0=mz6EV!Yhk5rf?|&ZV-QD{}^=^S~ZOO^)uCa`>lx-Ji9Xx$F_81$EJCBfY=0V?&StQS*i1Hy zRkGP^4x7v7vH9#`b_rX+E@cbZWo!|=?s`3oNj`ra#_p`TX$=g&&u54aVxif5 zsl~bf4i*!I@+9Qr34hHwHO@RK*JqIs+r)$uU*lb;ypmnYIN|Y3K|&5j#Bd-8_TR4&xCeWbdBNfo{$Ppr3Yl;*}6nOmnN z)K@qK-a5$~R-%rP(buU5`N9SLMc9gO&eDTX#~Rsd+21oN-+$0du|)PxIaQIpHUq;A z;TPDna_q5&@LIZ`mojEqfXA$_?R~SMZ%rw!D+nM@tJ5xXIWa`JAO#PS?wI8!Z_v6;3e%zAT zkJ+93zlSH>0NP)TCk)-`$9&@bIM)5RrMG`6o^W?eKUIV-pZ?`|`YxVuUsXTutLn!s zRsEQOvp%qiB7yYKpCJjL;pz*7^RFpjq$bD;KPs(+V$%tYINC!T_Ms=*VIKtFD* z?GNFp4o~awgxl--arb0@J)Sn;2{*0xQW-0iu~Hd3W|wx>uv6@2Q@&XlhnDXOqus99Z5g{QW4C4Owv64DvD-3sTgGn7 z*liiREr0(APq>>)ZpIUKTgGn7*liiREn~N3?6!>Ema*G%MBA@KsZVj>I(#sY<;W3F#ga%Y>sCcAW9VniBZIO1Lf( z_7OwQn4L=Ym4;wA8VIzH)V+&KHSeO`vY=hwWq%F94WU4o!9oZpwgwo$5~v~=U8kfr zaW^$G+~d7djT_|2PF(Q>EJ*}14BBbC!ZegEsu5t4#~8})Eh(|?EjxMte&xN)>%?7x zW<>w;xE-$^gvrChZ$|XN&4Dv^^Vox07(H}j*0*y5*|^*pv~D7^yJe7#Wak=yvmJE| zZ+|8m-b^;Une3EqCM(P3Z^IkPzQ%^K_g8kjdI!t^9^*~&aAQ-fQ4R;x_~v7fgwN(l zHVA*65od!`Ede+ht)#GXu`whA1@cI!vX7@4^cWG)Cp*QyxpBCSsVwsjCjea7S!=r}3mIplK2Kx5Afjxq+VGzOFc$l8CA_rKlE zE#lhxRE4>L?P^)aQDxoqwU%{fmmv&gEP@& z?6RYx^Ns~XS%xDowOk3ODTd*=@>u+cl0A@eS!&O?h|Tk@DmHZCsqE&M(g= zvm(zZm_Syg*}7-?_n&0LvT&?o9dzBM$q+HDAU?e@=jLnC_wzN&494)1CTA}?4dHJAIu7ZT1LbTqWq2OL#uBWmVB_F#F**|AZwWxKiR>JJVCMh;8v#IV z1YDWK&V?)I!j)3EQVLi6Y%*M#3|B_Nm632|3Of(3oEI7a*UA96m4Cst^VtP(?E<x^Rg3!%_dLWlQ|?FTQM^ z)i9EP-!@hHSES$H9M*81DMy$I#I2+y1z<%W$RZ{k*E;T)fzT!CY(Ze-kmn?YR^>Zd z1~--_#a0PG4SfbcBYzU$aib?q$=N6l_~%#7^&BxHaR9hY}fQOlBE(u(2@|Wf^CX!IyYU2864yFx8(Z)db@J17S5%N`#D1 z+s-qx4UE>&o`K*p1#0CS<&}~x6m91~&qAq)sEMdP2kU9#1Amz!6O1G;l(`Y~T<7#Irrgk#ajR)4MPDvtYW zLXp^Je?xFfCC`E?@P+Q<8^1_Ja>B0}ryPoN&8pm#ZZJ~}cq>$!2yY4npxQASEEFZ` zs88TnM6v{9iGRlQ)X*^mu`tI>fKE9vf7%9+kBsuQCY|FPn1?Ni>HHRAezvi2jdHoV zw80SgU@+V%DScT1-B89O=x+>$W&gA=%-WWjKo{}pGl860xE9C)b5p>0MPXL`vD(@u zS%$d`!N5@-3mhh-eDsO?>3K|wfe%0_VM?9>LyX_G0e>})HI+f*4J3wuC+=@*L=7ky z#RXLxX+ol*XJ^tiC^e^oaFmL{YjsVLh>}r5Y0hlJ6O@-0%QHNxJw|0HkILf-eNetz zaweh@MoNvF&$omvLj4A6$T*?6j1aM%`VxKW0njl$QpSUM=P>y;F>fUFnN~tCG3n>|1uE}#!DDmzJUi`ZO{EMQKc0+{&M zuB1EZX_0Oh@fjsYaP`I?Cw*{Ts&D{>_&_OgCVk9VLHP-j?q-Qe&AyFSCA~mBrI;9U zx@%y<{K|R$$!Pz2`HGVY~ewQT|3wmGV25?7t1j5}uiD;3M& zuLyI1z64-CqI|J+CQOKRCe1|B!NjpJu1TQ+IW({uSY>=Q0`%D+$AWvZ>rA(jeWheQWCf4;)<@^8V@ck`Kg;ZpKQQ!k>b zi~+s?Y!mY_0{#ZNasXceOak%*BQZb`L@G!~C{eIKbd~O^fDyp+7{^%UF5}hlj%MIM z%!#~eqmNVr*TA&-mGk}A(WdxF_)d_Sn}33G7!4$|6n2c+bk+gS<=JyDRYwiMvsc^F z#!b*Hye^!GlR^#(qEIDYu3@P~G=2%|h)z_u;|JF1O$aDeR_Qq*-GU_gC`+bSn1tqr zWmZMoWi&T@k7s)?0g4bNLa(DUp~@Ykh`kDJElLVx^} zL~3#{&sZ3{u@0CC95ZiK|1V$;^%VB~e}Zo0^VH$#zfhwm7p2NT#SsW05Yd2p1Eu7KxIwK*|O3rJ6{|l#YC*m6QN<0CTz+n2gly z0=DA$8C44m(8e+jU2xG1jGAA0u~dBpP#i(GHH!ua z?j9h)o!}ZsaEIXT?ryszxVr{PaQDS6Sa8>6ad!gj67=VLuU@_PSM^Nw+&(i^Gt+aY z>&m$=Ny0;~f;a z3)SOGNx6v!ORWh@(et&dk2D&qDq{^GzTf^1+(B_SIp`IRb7Pwy5R84hQkW>J&qYv+ zfAe|gJtDUeFc!vYy54I}$UvtZ6oxW|D5IdTI+)$@D0PmNu7=4&>Q&*i?;ncMO$gCX z88Ukl{tk%^|4+X&BE7f;qJb8#S)Lh8^6t&Vxrk!Ds=V6Tr$=9BkIx5k@u78njJ2Cl zj!EdC#5Ouwo+$htj6Z@|l`5Vh-8fwj)T_t1rRa6YKvDd+OQ@e}Y^ViYq7=T-A1nH2 zQe;*M_={cJ`-t{pY(6%5M!o!%k6kKr%&q|Uw5w!P} z+eh7^wo4IBgMcZ7zV@p{F+?9Q<$T-Kw0?`7$9)+`X;dGd>#+|lBezByLb8qG`zRxY zj=)s$8`!JVt9lSLB1V*8SlDsdgaY@sWEQ8f`d`gPqGbn!f4CL zX3L?{UW9yn8Z;{a7cGX4a^2@^GBe(m+Z0kSJeob{V9e&&9gNl}gWtlH=pz!Jq%un} zHPu7;B(p|P2up}06^T;SNPI`|YUdQAa)qXUG669Oc-grs#Cx{6BHm%wDUnFx_{_$k z{vr;o@A-U==n-Lv_$jt@CFh1`3AMJ9DT)4WWWKQZy%8+^mf!KGM ztVckA0`nlTGUskO0~J2>7rqJ+8nSGB>R;025N;NtL$!bDF&xW0?*h^8*245d6$)XK zBsORMS&R#uTx^f6!Y!0+Ml~|+S{;QyC*<(1&s;0wGjQ3(3K6M@*l8_XF@H%91dgaY zYS+*%Y4qW2tbKd5sLbRV8Og|H|Hz1?Q|~0Bc{9dThEcG`#0({T39qG{$4zN*#)#l&JyNwCxFORaupQ#Lr4Drk z#_^-^j(_s>^W!$LzMxo_`t;H{it%c&RtK;7Ac~=RE%MnWYwktMr)z(wn_Bo|mNaZq z&NICEbPxpo)WA~$c`nZDT^Gre?VHD?l$8~Zj{;S>{EgmvwLdJ5x8@h{dQ&FXdi9DlyIHCw>H7I-tV);2|IkTxg zd@9qsTXJ{u31$`)zALEjqxe`p!V4T#<{@!lf$?PvY+EZ&l`Y`@N#Ju|&#f)b-*c#4 z0dmJZaK3j*T6&G9kH7MlJYj>yUlRKVt;?^wt2O&x=^cOmqT<~* z^x0`=O_4*~q7n0XZ^oNduMwlhu+j2^w_yDTvz#xNS}1ne`Pl+Claw!B%4R^~YZnZe zr%LlHU(J5KA9HGqB1By2dE!D?vbo1U!avxUsr1(~vX*XTHohy}3Qb9ybA1#@nsc2k zAGH(w_xa%CxG$lMC&S*y&P!V%tP2q=cXH~$$IW$0mHblr#_20m#W7b2-r2kvcFqU9e!=N?=y*4JhIY0iSG;J~YOM*sZNpbGfW zdQjIxK>kq>7~ZzNxDH-F2rxMes)rY^X9NIO9~#$T>pK1>XF=8QgRWY5_soO!g+Z4K zynF7!`68g}0v(2y% zYS>h5=Rho6dudpT=XztAFsi^v52hM3msa_`87qz34|+59bVzI#d=oZofk|TQu4j7w z`u6_X^~Za~QEUCs_PpP0!Yd^&CCZzHo|dAP#tG{QR-XdddhIM!iB%}Bl{cHNN-;`v zJ$}1o=Uo5fMK4hnB3BBy`3SNLf|w{m7h2AaB-Y15^f$nZ-A+#VXQvRDwLswU={f{H zKNh6gH4UFv3{q`gMFda5;Ag(w9qi4u4|qzlP-v39a&vK>YFDB^_pQe9-n^=&gkp24 z@uz|Gd!XO(?L0-ffTm0Fx=L4yzrZau9au}Yg7?a544S;2 z)GgA*8>H&5bH9EQbo4NXQ{+=hqa=~Ko)RqBCGaG7KXYSoG(4wTl&>U_7A)Mw*(LF$ zbiZ=rakS`ZaR2WH^N3`Qv)DxC<>OPMXTW{h4Y2ZPX;wnDCoh=($@;$f26E&xdr`8X z*pvVK4w`hX1k8M9dWyLjK2n{{&ol4c=Rcd7L|W#*sC<0Nn0^g7%tkO^o9BAp#8B?= zFwD@j_)a?p3p9+3=7fWELyQlIi`8n0$a2ljZk_B@9(Pz}C~?M^Yl-@|8J*yQU&&GA z3mk0-8CeatvwhJ*;_qOmw5p$QLs4svA){F<_(ghOb!iBJ8ksxS5JWp{#w*p^$3?#x zFx-_!KT`18?MGYO7bAHupc2u=wHnUql%etS)1ra9>q_V1iS2fl<0d?sy^N4Xr7{l z_EU5)7+T5?`Xuc*blM2*gogbZ*~4HjoJIE=X~;d1t&~zN9`KP=rBZ;2_0Ycrq;u}D zAcdchZ8Qd!^Ork2SvTMF?$pv&U~=a;`fD~>8x?&3kbRWMD*&swr$rmf|0dy51X`)w z*|;5!-zi^$pQb5AN0t5-{4C)QM#Tt~&X(-OURFTfNS1rM;qym~m*Q~=je^`+)(EWCt9MIvuK-&wJxBww{BGnn>Cyyg; z*-gh0eD0!HLdoYBZHtS6!?AM1roqzV|2t1CP z%6mL5pUPA53WSZ@JcxH3cn0Qdja9aM6hn;jd(Rk07VQY)>9Z9i6|>+roKxfau{!qi zTkBT=XltwezwHVav}g(&88_5q(r~waE@#pqto~LP)FC3;Sk1N>y|A6U2jb1vnzJ5C zjQA7#e|wrH1jDyLXmg>&Kx ztFT7muBQ{um#rs^O}OW7LCYKKvL8Mrzgsvz*j}mOQeFV}XK2^r#xkmm!Pc<2n2d4b zdf$n^6@GppYnLULDX6T&*=EHuzxp43N5I2yE--1B8d|!MkB?YlaJ_@i(qv7*>=`r{O5-h-`RunOZ4}T!edI6tq_RZ7Qg`a# z?vRhj)&a~LM@ctQbt~M&G^+LKnz_XoPBW_Y?wWG5g2QSO+Jk3q-If@Qa*b%bH=tdO z9bsx#@c8q9*n)-t9XK^Y8jg=dBAS->#d&bkL;X3UP|;~{#lzJ(qiYA@_Q*N-y!3Ud zT^tA3KNR1bpC@!k90j9nS;8x!wWayz!G#a6`7bT)8|T4{uUdMi2B%%(xV!R!#Aqtt z{i9Hk({>zDcTYPFxkrzarEx1iA-c@U3RPCAr+XQ!cTX|BM%U2mtc8b1wKT#kXR}V( zb(ulXk>C-P{+iI*Q(F%Oo{OU0cf(tnrq0#H_^RDkZWxaerc?qpH=rE?T`1&@gNr%9 z4i)S${vXhF!{cqW8HiV9I!D)*!O_H5W;4<@EczC+UH;g$?oTcp^}iZ1TF!*nT@7CU zP2TtG^CFQD|MUIUY8%;O8)0X~E(FQ9Arw-L33zV+o{C+uT=KVvFwxm-+o=?>2mib? zyS?S=gRndugmGxh61x>FEftsP7Tyn1!QROCIM4%F$vqIHqrC2rAHD zDGP}(*G8dYf%n{P#>8_9lTfXqRg2viZt%jX>_u)K zf0AH#`5qQabJE-&{miGbm$(`Ise{wyeRvRIEO9gRQvj#S>+nqag3=#89T2fDantuR zUOG2Iyr_n9-TSVlAA-|Dx$bs%-Ypl0|KjDBCu6GoumK&Se+G!NIUo%fV|D-;7nb1qAJD|aB z^QP8wqYoN=9zwca)$*%zoYHq-^PlLY?{U|69QgS$)NONSJpfyDCg38Z)c-={@+O2a z-~tTyhphumO)ikoU^KqtizjVodj1Kc(r9@nkSpH{BQ$F9%ju9}CUYf~Is=I*?P>sb>@LPjx^{{_i*=A#R|^y*(o+mn%LAqFL9wxe@HiSq29|;471T6 z9P&jM2^iBr>R?HcHNMT(m%YpY&T=v{Sjjz=WgE$Ub$F^S^Lvv(CiR!Gy#*j6=Vl$t zU8myS5&@tyYn+CN<-8}zs;TyJ|H2n8l7JQZQ*{_=zz?y$JWJL3(iL%VzF2>r)l|Lq z;!vIqXC29k;;9u(6UMtZX>3;8u(Uk2a&n3VgfYYp%8|ykn2N54fNm`g-mMU(R-|*7+99gWJ?N#p#8$MNC<}~~9ocg3n zT0Ui36^v4N`%*^@6FRX%TmA%dfZ3eBSoN6oSVb(GrJI@5N!S4Uo|B)5#u_;FXdX;} zr?o3D!_VPQ><=P~I6Jp+E^`ah@n?X{8I9T6bJP>>1J%RJ%8T{O?{4##(dW1)kp~=D z{wdrM^hEOD0s}77EGLP*i{8ZD#NBfJP20Eitsg4_4VyF8>O<_lBbcI_sCVmoA#OaK zVDuJKhy^lbv1@E-;oEq1*VKM)@_25bYiw8{V!WGcY=i|OCBc>;TD-jL56lRf_z_p7 zkR4IM$%q|9L5@%h7RtHJOzh#e_nvr^yjz(lvL6=2DB^{*9tB#`q^sPehcwLYx;ARv z`;T9+8*La4fAc`KFjy9&T=`la-F0|op1Ts&TDz0DRzGkeivmHtsNBf)Y8fA9YZ$1z zN3Pu#{;EPQP@b^N3^!i3vzW&t>qwl?@C{^#=E7i||?>)Y%p6Kn? zQSH?Y?IrkG=W1?a8{JCnWn=5;;_3#+_nuMI=*{=Fm#MoWAK&{8-+K&Inyn*~tD6ho zdmK@$%_F$)J*ViCK%Q&zeLd^bU3%;D^<`+`j7b7}Z_($cR?vOvmYr}O(0UWyVEX1}p(czob1k<|zL}DPlsj zKmDbF-%d674Z~b|@LLEvu0n4{!8VFA628A2KP|4D6e8`-q_fmameFl|#{}xsi^BQ5 z*%Ye>yU&52|61K=W5RweVMgH*KB2dEGW~@nI<6#2+(0#Gx5L6%PQM-oKisp*7 zDCW-#!%x?g8&YJ_w~6BpC!5 zM49?0q|QhxfAmY9O`=}Q-XLF}kDI~0NFZ(y8UP1CjVg*rIu;Lnb4j}C)+^ZS+e-jK z2QdOv0qdx22yCcr>LiZQp70ZSTe{ zxan{zJ*W_50onoi04@NZL7_Mj;U7dcgE}cAigD^cQY%Uz{Xlr6yu<_{siC=Ud#IWo zz2Btouzw^lmTyi{}H9*1LiLOQm{=RD51RvSZ~L@ z0J>2Em%A=dYRKy#*>kHnTWU)PPce1f;Yl&3({zUpqi4Fm|9sIkv7lcv zm85(}&4tWG$n} z1+i_aBk&@OyVnQgLt&?R)^N@aWj95ZRv{v9lLiBKI*=a6S~AADOc*p{$+XrSu!LCC z|6JdZ1dVJ(BeE`7j*ARXGlRc77e#>=Bo7QZ_OkUl_EJjnm~xm>Z}K4kihu|jfNMZ4 z(mFyXx-Nom%mi6XP~YdBQ4wEs2N~0xH<1`2Vf0+i$U|{lJE+0ZrfY9b$zLVots&RA znIC^wk)4tQQ0TbqkQw4YXn0(7h&-P&`M%TAk0*w_#Y?1pJ(LW8^9L6&LOUbqbt#jq z0-6MIfJh~EBn5h{K<6MJH7E~c3>pLIAowHIAm0FPP;QV6QCi7e#WqoU<3KqG0!YpP zkOST{8)EhsQv!5Hx)9~}1>wkf>gLFyNSV;HgklJw1(6Fk5uj^c(v4)aI@(P!`Gz$e z6=@sc3PcO~2{Hq1f$%^{AobT+XCK6K#5F8XK;{}|D-IXAD^Ow+&`a9;9Tb6pgG3F8 zMG?jDeS0ZrN{NuG7PdmU?<%*?mC^4Th}ETu@|!kHnkC{NrSZWfaxg-WP8bU1`ZgDU z#t;9JaMP}r7i0q<089b$&^i$iWHkVJ42Zvqq_86lu{pQtIRVC~orsxleTfngG7&Q| za1o+FcAz5!;M=tK=v*nepa1v0i0B|7$^nWH_mPazKmz4zgJ!G|_Sg`?&b~<+Q@|#B zuPTBaC=ApBxImZ%kb#sWiQnbqa`l>f*B}Ui40|BK>qKTEh0}5s zApgh)eI~fHL3~!~%}2lE1ppcRPE8Rur;s1BKobA|!2b$=-|$B%|4Kt=EJbzx8+y6+>AxG75-z{eX8HI3+e``R-Yp^% z=75X{MBfuk+kHE*K+IDnof`6$mn=npBiLs_()V57YrKug8Vh>xeq7}w0{2P(l+PGKY%G*wY2WfqO`ONyud(AzGjNwIkxsj=7=_4EQ?mz}Ht>~m1HLd)*3Z1yxc;~3@?XRVx zI;xtbbj_QRPF=F-f6GJ{sAa`Al~ikm_s)>U8+^7_W0_|!zdP_UOoTw8s;*1|sDH4w zDwyV?%C)I~vP%N5<#>UQqzj*l8f)dI@$DF*#h`VJ2xkxCJx5PwqJ{9At10+hNO6{j zsHRdw`+w49>ec=s|?sS$yzm=BT%C^QkI`! ziQLCzdzD<2+D0#nO~LmrzVb_M8?nFH{IB@FdAe>qZ-a9CHOVs#G!cJ^=CYn1{axPH z=N!qivhz)=CMu!ATjwL~ZlNEaU}*)An}ZTvtLT!okE8v{{T;IZ68e`2VS$(=#MPx6 zf}$tYt$ot6#tlI3`^G6^!e7)TiY3|p_aUDWl+76njY9X~m+}3bIEQ$2{-Kf7w7+B{ z4O8DFh085qHshH^GPyNMdX`LHeJKAIW`0DzVDqj92-C%=~tQ zZ`<1~qE&Ov%RQr2cJ0K_(Bw|N*;h^UJ$22LhYd;IIEjM z);_NO?&aa>HmAuCiX^zYR+N--VA4S8w5lgWF4E0F=|ugo2ogHB(L@!44J;=iOI_k!AHBTq?A`~p_zrOIm z|GF#mz@j3G`<<`tTZE>Zj5YIhOg8yR=1CSw+JF-`FU`&#^^ndx9ADK1+*VCB*QI-$g_o=oq1E)PuiU8O&X#69o1EKK)|Y zbx4!xVd8_xGB5EQm?`vXt6_kPf|-k5-T@6rZ!3!kT|Ef?w&cw9NGag^sIBUJM&DFX z00Jt1K=kRo96r7#@JF1Fi}jTo9Dh)RIy>WeDLO&cSQjD!yqv|>Do+w7x`e@>&KGtf zwvC|>1bF-QYbV3x?fJsN@V2qeljIuft;V+TQf^$pS1{tam;2L5pwE4KibJ57#idX2 zg;3i@uCrL%#qL&0#9?&GNw!;DJ?A`7?dIvF5K41aF-5>CQ33iMTe}!&sk=shP6QX? zz1&j1OnxOk9}sC?pK1~4CYr(T_Ua$yq+$9cqDlC}C5fNSreVjS{0Dl(isspznT%&d z);ZT4m34dnDV@l;T#kFD-fCR`xYMLh4(6J5BgBw&lh-3hFzUz7Tf5T@#Bn~ z{|fWXJ38M}S+%ptE#y7G4p#%L1m<`AJL9FoSO~)UO+F-mb$lz6<4-GdVhC-u;%`_w zXvWD?ckQ%i`tH<_VdB}G)FpnPj2bISE3hc?&bAHi=Qz#_4qqpA2R{Js9jh+FNcXj( zf5o}wHsP*f@(x|ueD5`jcaf#)4RF(*7Z~V!!1B-$;2jUq{_0Z*Pify9X?*kP-d}oY z#AAO-MLE0S9iMvF&))}1S*y6pz_hL#nQQ(Vs?wl3yA7Rct7%nVe+H5CaN|dUZYufa zk&uh>B_pxFInq?(0@Lci?2set0#)Rp^AghUM=yIN<1()T(Ppw;$QIt>Ko{YG_DXL#P9csvHz`i_7FBj(Zrj#ubPzHqX+X+_x$x6p((4*Al(3&997(=Tj*a*=izMAcGl0Jj1dW z*}RQ+RpzTC%2BLHrcshQ$PlT=#-8L}WN263q@-V?QeX~YGW(kvST4z<7^acbq|IWj zS)RHKTNY3#*2n^CaX2Nj6e-v>Hhrl`1}iL75zb@VF|vGGQ7G=36}Rj0lob9`@k#G} zrPg-j9MoP_o>lHu-n&AJf`6${up0}f)pvDIn7pez zs(exf`33of6{xJRKYtcsp-hXPh-Z&y8P=9?H2g^>5b++fz2j)5jOaTg2~p9eI&?WqIj&t$4)%kBOJq%g4&cstxp8s+|3x(d}u~ zsrgnLck_u0o;KPMyEgq0af#Q!kYN5!=-5A3~Fc2O0-FjK$8A zX_H?`IueUTI_ku0gO!7VgFbbU-R2%IEs`wNR+^ZY&}lEYRB<}R4V=~!6_yC(YjHK5 z5j6f}e{U@fVdti(AmGi-JQ`49v?j^V#9BxJV(3$GH(Ej1U{dw7;00~Wy*XoR0}F`d z2HklR&6m?`r&>NF3m0}3QlC*@+e>^m`J0!T6fi%Rq7Sl!9LZ!{2E~B zy_}3tOv|M=xQ6+4VF^2hN&jJ~sSy{AxD~aH#vGAtE3@p2rPRGc}F;C-?|IBcs zKx6(Q<*SAdPTw<}gzAZfP~wIYR#-lbCx+QUY(;tpR07zotiS4OhdA*zU?f`Gu{Ki? zCTt_g&IhWtGg(2>SKYH20=LRX{ zo%RZBz*zc|r9q`Z(kDeW*VNPvg?=r1fsj(0EA}FrtF!dH!IK-MQX65hxuccAS7|$> zil}`;rK;H`G7Ve^^QwT1ch4BxwfuG(`a`y6owW^sa6kAjI9YQxy8yvUKbB2P*T#(z zoUO--=Ev;~*x0w68@JX9XlO_K{eunYCS&-+t=FWcAmPJ?2TkYs(jRpi3K{( zwBN(2Eikk63`Kw=B(1-g`C{e>P(7VXJa}_+j6|Im)pxAjoLDX1RaV<($DEQmI`7B9 zcIY$yUI z3PgD6KT1$6V&Ca0@&dNQn@xgC4iFC?l@4r#B^{>W^q!+1S)tvQ}e%9noHW*IbZX-NdN%!QiOOv&yTX(M?r6U`eW-7gM^i@#h&R zxA`O0J7=KngO!cH6zD&Tz>>zs#oozPZ5c_k98;T8_N-ENJ@YW9a;Fu$F^&3TPvv&q zp!V<@Bky)^n%80o?yC(~O~v!t)~pgv$`Vc!xH!3B;=Gy>K__-$qZF@I{a4(}QTFK^ zUyO>u*p$rjDOw;p#O{ROWXM{=)BAOIIJOK_F=%!C=mZ~rvKn5P{xbfIw$Z8RNbUq1tzhl=CiBc zSNAB*DC6K8q0>M6vPy|OOKbpk%3z0rN#9O@7s03iJMYTsY4C{mAMk{>181Yn3JFmD zA8fBeaiV)F&&(!sZg@68kDHX?S*fQ|HfrgW7p7A{cDl&Oil&&8e@O$v5Is zf{(ccN65;Iw$=ZUGJk{l<-7yhHhho5Raq}HdsYDjwG?SHCUB9>MfkOA+Gr6aDGr?ZDO6w86D(%4^5$#vA@G*GY{LtSZ52d9n_ z-#_d%Sfx0YC$gtCST#DX&>2)%j%lxGup59!($5;KA{K1jiLt1K3FV zQ^Ov}QHaR^dnCQTVUW(Cs$sBppxRN0!(h(JA>45ywOa3$2NlebTpeR|g1?eYZ{T5d zqOsDh1m?)7X0<#~SZP-P*Q8hbHF(82PGnT0G%T zys@AEVb#f1WHb0X&|vflwZ-IIK=&Y67(UmQKl!8&fKyb-b~F#YCVPXG!A{_6u(Wwv z^&)uH*m}cUg5|u)rIGVX1rtlf3K&x16fxKjrU#1#v~^(^b2kP(tSD5`u3~*y{CG9r zywm&Z5bO$~k1gz;~5B zh!dZXFB;Pnnfb-u#}l32`kNX5AF^k@&GV8Ma>g*m@U$#s`eGHlU{CgBje0qnc4Bef z=$g2a0oGMuL_^rrspOJ(k%P$nG=E?_fzgH#tGR{^&2jjx(cwL5yZDgwMmrDY+}984 zSX5oIq^sh$uzJ-S66F*nLVAWTzK&@MMMFBWV9Pa^$jpja4jhBOiI@rz%a<#~W<&I8Q8}k1*j^WVh9Mze_cE?(+Y%-K_NCuM?usS*Rk0@1r{@;O!DJyyKs>*6~vo< z#;n9lk~ki24@kJ)Y(vx|_KkmB++ev~1{W?ZOvD<$Q(AzMx2tHkh^~0(BvM?_8!=90 zNr(XX>_)%Mf4*JB$mg}Pm;U%<2h%tkUhWI;-f6<&?*eFHlHU;IosVFb{Umt_b#c)+ z^V|$L9@N2k*;hLNQJgVN%zN^x{dPHZj^@tn=Jl)d@x5>b7CvFN)y?7i>)JkjBR|W! zNjjaF=eKXQcuZ)xCB5iYjuYs?Z3ir2wK@ZPy^to~-n|4TchJXB6YJ-zp$5uP@NMJ< zCDgw{S-+EC(6%2fDz`Ydd(Bm6omU2@KW7-eURWoL2YU4#4acc)vBRO)3`~u*&RGV4 z8)87iPxuX6w%W0Do){a+FGN_M;$6^gM7o>jE_|V$CnW{~(ANtp!D~&Z+aIccB_cIc zndhyG&h0y%bJaP{{{`WNYCg=z+ltRy?stNz?Rh+mE3x^^NF)VT+h-Qzz|KusGwbI} zJde@m`1(G;LiYEJKMY30KQy)R&jRBb`wuc1!YF>@V_D%z3GzXczS(J{;&L4?q#H+I;bC&k%bLt?O$TXVu;$YJ=YW%fJNq3f%rv6Jl~ z7qEiM@6Ybt$oC#8fk3xSmswtlgepf-{b!!WOcw?mQr98mAIAa4K&8B-7^s=d{p3wu zSa?$%w;AU!$HxXacVYdc_1Z6`WTThDl(l16;dM*DP^7b%<2X3qD#kIz5XRb>?G1&Q zop$i9_!M5Qq$+zdXLEXODpLK^VCsvKt<{T9N)^d}`TAGh?PR+K76} z&J5T6H@QRcn_Ov!#{V>gS8SM}Cyz@+J~DSS#n$+-l5R+J@h^+xX$BlB*bSTPlV6RdsGami^i#;@=ib6yK#opT<3k&8IN`UO=j+s>v|Qc&$y@PZH_L&6VIns- zG5e!{koS4hGVozIo{T~f-y|o$NI!Sk_nXnz?!uScvqI^L4z%;b)YkAnp?=r+DPiH0 zk?OFjI2W#oA33RO({{n`_>S3$iP_WBw0;~}(wvtDQ8(P$4g7N+H-VRm2J} zPoc|KkRz6np!R((Y`z|E2pOt7apd_-Axs_@ejXmbmD_*RKzlDz$bD~M;d}EETXOh9 zPXFu0A~sgsA~yQDg9%jH1F=eyza6PIKuW+u%F5L9Mlk0i^5{<@0E3UAxhzSgOAM`E4;rBUj%|;m3 z?8{O6LMb@;DD(A6j|EIz_62krHw+;+0!N(c?vhwT;_VE-8^e_@(s0DzMWp* z_hSI?3-#O1zj)m`&+qBY>~6*_$>at4>ZTI|9}J*JS$x~|;d$!q;l^$2H=|*5tUeL` zd!d(MsQ$OHQxU~v8XB6);yRFPvHRTMybIi0k@BtMHh3UsRV==kFz#-VO!3S~x>X=~ z0A4P6)|c8zy4UZC>)whA*?*8EywqC>v(x~{WtY!>qD3u}p{$!nq(XVqVuvHgYZYd} zWx50-OP{@-&Z^AOe=OQvuD2K(ZctP{AF{eoHc5yl+Gi*kV3<;l``~fFh>29@l&=FN zQ~fGGad>$ejne ztp_FxX5GFf9y&6Xh0sSar@HtV4-0UQPL1DYroA_8GRXRRXd79?A7bp_zb8VjG-O-2 zifMi*Le<~#6D`x9LO3F&Gf;WPqh%>oalRxc z*4g`T9)F7M27je*N#4l;t@60G2X8omm^LKqpE!$dGaU??ZHC=M!XQvtYnSD8)o>`N@7ma5NwHE2% zl3><78>xZca%>yQapBYGW3ggiio#Mj5A(j5O}$-~y-)oXWOjOFX&=#a*(66<3G`u2 z^-GLmv-AmeAAR(@-pAkFZMd0VCY!&XlKJc0e5Lr~vvsI${u92yi6kF-e03+1D`POD z44-QDSGtr-wi)%aXm~>eozsmxEdCQ7^YyFxs(>~i3A-ZFqGOUP{a%|Vw69)QDyC;W zDcyCOO3_Yq)c^bbWWn))xr#=>6R7e5U0yJBG#M8E5$%+=0vA>Gx z@3DcHo$AM*j3qKJ6#E!fSIqzpTkdG=Q|(uzXil z;8ET5XEGn;oocAvMif&_i5UItoFYb;?P$soXK_}|n>nz;gS>2Yz9_^{Lfwe0Ge408 z(3$g*6tw|I%SYp(-(r=>sw65FZS4ReJ1_fbQTC5zXMh;O&^NIdZCO0P*nfHZKx7D> z;il3=5DeNe*m41;~Y=rB10+M`j9GDg-f5#d$Ryie?v0`MBz##85kW*ra z`jhvG9)?3_cS*cJ1D~?vFZISKv8TUZQ0RliF=cIzT`=}tvh6WkUjsLc#`HvNvefw` zzeRbI6ZnOb=e@BHJtv{N(vK|2tq9Qf9pydd5fAav=r8~G3r89gSeWTX-p(b=9$i%Y zW%itMBvvyOSBx&Un*x0@mAKlwr-^Aa<&bCH&q;y&?1v|Fa&?^A(kyqH_d*lXBC|+Y zZn7wjFMun`r6{B9F+zjXZT-j7+=Oe^GpQS{gboHz9FL~y$E3S?*QuQ@<~BwpS}Tj8FjQ;A6}3v3 zV6sAhKH*u2<{?)kHR;|_Ncn%=dP(8Smw@|?>ZX@3-==_m0pu%k52k2~Xfu^f#u*%H z-!o+%Z1o3->^EX&@2Src)Vqfg$5F?(7CEv+Ji6$2Aodx5S3BIEq03KMvavU>12I1dFaA}dV$Jyd5-6;F?su?+ z<|wo*W5y12;qnz|-xs|;xt4Y+OZ+_{PQlWNE53tDu*SA#H;xwJ;YD8QYz`!GcP+hY zBtKF|`}y(gcRj%{Hp}wNgHW7{K&UslPC+4DON?G7S#IFM!m_fs%|DI>-G+LW;QFWdo_AH>H<*$~0aL>4I^6^Re>_m-e2Tny1D&$q+XgkpmC z;KOGq%~5a=JSXYn`2_|wnAvPX$$ovh{a@QRo6ZFpFOi+t7X1X{rG=9UOGd+`BhTC# zu@g@!zFcQ}_m1?#Zr$4haiqigpZ_wnbGTi2vP2kZ{dSA>_0Mh)+J|i_Ylw9g2JrfsiFZp?g1pNS-m0P zgc*0~WS9eYsTzwovg2Md!rELXizR*b|k2CAuYgR}lV*2S#`tM90Y z;BtyZEX=B_tm!esg9`OhYi!zGJu++Wosz-wXhr(vh85{*nk`DJEN3ZI8pTaU!tbe) zh~+zqnrF>l4ego@at1|?b`e@kX>!1}S?6*smPDQ+wsI+b_Om2yxw6X+86HKnGb@<8 zT`rW4DuZ8Pc%Z*Z7|QMA4`5YlQLe&k>A)Nt(098?kZ6`FO(%>Ba996(i!+n!S0;b8 zP8Q{&vKYA_#5K+bc$@MR!&H|?O^wfSV@~@8b%QdWe+`Z&(1HO?3%E`@|-0VOA2dN+}X z7ssB*NO^tvds-nYax3pu=ASpGS!D9e^`{;6QrqtqFpA3FrbNxxmwPOr-0P95+)Ll^ zeF(EW2F;8h%EtzYx=p73v-Ag^vU}iLZwMF!al0O`2|c0t-%&AI4Lb9L(1#AQy8P8E1rX`?=AUBsORWpzNL-REwHcu+TwrmqiU2~g&VGhZ9 z3x8p#M3kK&vGkv3WO%%9aUO_++ytH1lfRC`&kP1VDY1=Ih|K>M^mPO%%lNEBRftu0 z{9MLx$J6t4K1xSG7?X}Q~^CK$}{%K8x4~2eBUit86GC=NPkDZ}w!nu(I zh>x=t>mTedAZx44@{_Om$Mmk{#JV|9_F7p-q)^OgY}a2oPKz61FF4PQZaHW2pjf>x^$wh-TEphXq14 z=l-dAHAP(hh5VDkT@N2)U@TTrQ4ZwwYT%Eb#zJvp_1*~{0Q^9YTg2vH*1NRmMQV!R zNdr7Q1@$9mB8=@z59IArwdM41@-D}VQrNpZ9+7wt5)wH@@_Q8lq4XWHo(Z-r?OIN4 zW($s^Inx~1g~q_S(sBF33PnM&rbYS=&+BB0+ticxn3|5m|Lg)i51vHabZy0ulsq02 zTfzDg3>sqXixvd|cjUHHQLhD&oD01usv(DrKNw4jXZxj2h)fH2WU#4uTI0x%n5MRx zsac_OO9~F9#sYKgS&I`*uT&lh!nfC(TEcG6^I#Dqpn8$NXLYi|H9;-J7AkYXpS^mh zS7Zb^WN+;8)7zehgnqRD{B}Z%6s)UYt zZ=&zY&B@!CcEiFkZNUwRfqynR2a|6$ppeZh*|(tiM6NY$*-9n{a(I&w&2@4K-m4r#Bd7bJ0J3QJ#y zC~TpF0HiK^vv&Fr7AduuieLVmT|dF^$k7VyUQZxpjtsA(rapa_&2WxM1)& zfvVUmL(DQ-UhrYoC!F<{-pqQOxBjMxlOw!S5(G{Ax;ZT4dji&FVxK51gq!nz8FEW_ ztJh#V)iLS7X)2hOtegs%mi8pH)N71M3YnJDB(&9Qf=Sw$NaXnVqz_CIfvkcAc7C5~ zI()@IjYPZcFh`WvfD;V&s1H;FgBOusm_i0C-J>W5zRYYVuj@oR418sp*kjLKxQgyx zZ`Z?1QfJEcYSZQ&D@q$bUQt|IW?W1<(B1jtLnt^NFD08~QC)a97~%tUhcpWaEeb7) zC{R*RQcxAg^Sm-@Z0}Jx1J8g5tVpOrEL1sE29#gptK;p5`G;Xm5SJf;Q(fEI!{)N_ z^#6~tw*ZPG=-NhCa81wzf<+(%O>hYk0t6?xOK`UkoLL}*5Ind;(BRG@3yZr4cZUFr zyZxK@|L%9|`|qu~b*p+$b#?dlOwCl!OrP^S&(UOcVRdD7L&pU@Ps4Zi8!k~hPeR-W zIJykFM7n&tz+K{93{J$Qpbh@rGXA1)D(T|Y@9s->#q{RSfjI)*Ks>C0Y8o0^NX~*wq?MPbyQ2W@dqjmzb0OuOUcr+>cCtuX6* zI$fbv!y3gVQ1L>uhBcP0&$Q2Zy5e0;Q4Cw5X`l7M5@`W?`$S7ZB=jl3d9rN%anP1jT|)^_@pZh=`J?{tNJ z&2A){kXax5bcJrsZWNoBS)a&sg<;K;NH%P;MP{D%_+&e-u&s4CDYA8$jkLabWVf4Otb;x<=7AK`mk0Hqeiq2kkP5}Q{xbP- zUP^5jpQ*;exZPPb_s(HiHZx*49x?!OYUg6i` z)#BFTL%;g9(i@jOU~0#g_?p?uX$k|g;1eShM1Jdu2PqXok11AIdzVZcPw(7Pj zedRXJJg7Mck7PH+NqiR<$;L`TfiEXJ`r0@?lIu4Yf}*Zf#W=A{Pm7_5Oar$tP}n#u zl7kG#JX854$pl_UtDrGL`Kj##Uc8)liOTG@B(J{88dsJ{=9ARmjRUQ`#tmf>Q_Q<0 zU+}%YB3ea^n;pgYUp^rr!l!6?^#`ZA_2F{9qdY%*BTFOGcmL;87!3za2Yv^c2dc{! zt+>mZtsEFZ%1r!$p3B(>Q3rC%Cd>C2@dv?5z z39-skBU)W2LQ;r1c&fy(fCb!ZDdU{WtH{a-%bt{xl+h@Ml@_;-im>ikGzY~eq!_vVTP+y`8%>MzuM}EBdqr*yGxwm4*M!zrRO&Lkd39$ziwQWv7WkJ*+K=rUQ z8ny}Ifby<{sfh74?&3begVPKX!~7?D^YsE@3PPPh(=e#}Dm^_72XVO^RvD-WMkU6!gd?Q+-v zl_dle0+s^_faJG+vtqJBjYxFN(1e2>HQ4y>8z^VyH~&PvSP1Mf%tI{p>4Xrd1Lg`l z1-17vQ==8pa^RW^Z6u7G>b%SAELsH^wnSsON*!$C!vJEcajch@bpU^CzI3sMw&yYycS1n3>{62u$AkBQ_S#WSzb@Flz;J9xYVxWEYb z2_2yak;UHN3pD=#wg|lgfmqb##YkZM&+3{MLG73^8pbJkswUt(w{89p+k*z^)NOLH z(9CvNcfE2-hcA{(pzjZ`HKmV!Ayau~G>0jQt?9R!F$ZdA5J@%LX0b!z{m@#nt(Robi4A1(3ow*H2ZQYFB!U}JE-9X{|22D7g zC~iz}63V|C<&OqwK5;YV#ZYuJu3wETE!!?Me^>X}Gz1XpKos~gYmBe+Qv`dp7rWNE z_C4|XtMQ39;|(v+&}#0CEv_QwKpqO<0=Wc}nNMy>8< zI3U%2mNrlVi}qtM5>yIXe(456VHmAxqOj(mNckZ=_)q^IH+YO6l#!M(uR;CrB4G@% z-@bui=O*9?2(uFP4Akea<$1Tu@;i zXW{u9*tBZDZ%HE_GIY3?3}l(`6oe+8fX2XFAQ@O9OdBNMRKnTz-D5Jg4y0uin5gjI zxP2pYCrqvomIQ4*5BvjCka?U21%%V0;fQG0UU<(7O_o4@`l)+B5^V&KPKiQ}C5@DN zPPN>qL0mu4Bt=N_2P5a;R`XyabuGjw5?7wxulhw<4aT=PWFyHVbx4Se5i4%!3%~N` zW#JeTQAk0O1PO?)w9(G@hs{rjIKfXrQLvX{+#rfnq$jDCHRPFsQFd^0xwLmS6hx#l ziaSi`_&5VQgDHb@$r(VB!xmsHU>}eV_!guIF2QPtlz{c{;SU{2LD2=#cOZEOSu9AC z5oxv&?&`yqN0OXUQKi~1nHG?b#F|XYOWkpgl{kGLgkoW=LR!SckcPOO#Qv{gM%?s| zWN7nP~?8qJ2`1R$IwoOq7dONvN+SOfUL zAleIj4wizVu!TX7pzaS29xNFnpTWvu(%=X%Ep{k06#IYQy8j2|A_2qw;Q`5#8IlFo z1JeZKqWzD*LEuQ71gr$21n>t)KSnA4862Ps;B4p{P$G;Kl)L@xzaD)5lUsqb7Na#Hq^DB`aYFIHlCbLkNwZSM zdij5otp0JVK#s%}gk>~k&@$38{4(k?>@v!-p(SG=D>MMhBn_O+^=RC5?q`%t=QG@V zVQ}B`vSW-5z0@hpxD@1f(nn5^u>osml1HB)67ojhaS2}gF)(trV|+_MVv$Z6L7;L* zMz{p5ets|d6Z}s}l|3P{O2|pv3qi0U)6x!xcPgwj`l(0&K_`j7Q-D!7{i8QH-v}Tg z@?zTn?#s8}9H!8wRptQBjqolx$cEx0m##6E7FGNf6TB8xX5)Su;t&jCI0muM*QhVU zZvGZjkOD=qaonuGM%!OUoC$O=hEg#CC|WWk#fEXEr2QX88?`@o|HbggA193$C(Zjm zMGS}56Q`5W--6yhkHNo-&fkLC-#B=w2M987xuBS^!6i{a^3qQ-5p*e{4$s zpvV4QRQ^$sM$ex=!o^LaDKHt7Y_!=DVKUZOS$od#T7ZYywZ)Xd%Gz22L*_$T+SG8O zkOZ3VVe>sjRO!P91vPyQwwUw!K)$H+`gZQr#C*hUj&w6A#d?%L*6i#^^5FImFx4+K zvv1XGZF_dSd2C@@!O`h5XEM~38?=7aH=|3ORDbtF#6E*3wmPWx!vq$>I9yfECaSt2 z@Il3F{&%)D4B1IqZJ~&snfmXyi1)iLv1JVUHWfVYcko|m;}?2M+8B2bGw9mu~ z(!<<|>m7ek5SSBLV3jOAYg6^{4q(k5j+34Bo-xQHYymlp*1&3NEw6Fytg6_u_v~gC zGTBmV2xi_`_5ET?u92(~4>x?LJ81pY4OHG?R>hVVme%)^GeW-U2-3UOHk&Cgq8H!e zn)n}cv+}PgO@3hj!x%hFGYlOj9maPQSi%!?K*qvEU`;SzSRn||gqDEOOCD1X8&2y8 zU6Mj7z>>kWpev|7<{TEBh7-j3fD?!F(F5%7*aTn#OadqYb|@$mBNQ?RhLbu{F4-gB z!n_m)tp5I6aKSJO2ZGGs%^2>7opDxwOF@i_Q*RV}1dXu7K+hotAatw%?||Eg!e}Fm zf%|kFHqHlFCtdmQZ;imN!Nj0W5G{rhIurL<9g|W62cK^0 zSd_b@x*#gs>srv#A%9t2;)M7FSW;pK2L{;&Uu|kwRJ$a*G`Ix0uWcBZ^^SFQW6(#x^yN#HN{8}?iiQe? zN(|MS;l46Hiaz$YqgQ69eLI?eN{bBF`}2of%qJ=NN!|)*E+ITQNr!iC)lUqanQ6{q;qd%HwS6r1 zQm<2w+^+!bdm;&6 ztv`4K%4+T%YQ<=ECwnJKOE?@B^z{9~!PiIZRh0?;4t1{_4v3kymgy{p=S5SNoN3=9 zf3cUGN3ip^Ndhl-b;tGb$H>3v8$0|e+sB3>BLiR(ur?4r5-%V82NDhnhlGQ}p$le$ zZ^bY^fT)o~?sNx!EfW5ZcL1}K*oSKBy`sH2tLJdedw$KcuIs)YCFkI2mRZrA(s|LL zRVd?S7o@R202lJ-gjsLz+m_Asb(zO(9zxuW>niC z8->v?TKtSIh@Nvf0Fp0uAR!bhy|$B&Z%#QQw>;4trgc=3Gl3?w0yL_Jx@2_77#|7- zWR*|zBk-9W#S7#L&dn-@=dkZW^x59R=ZI3%>o-46FZjQ_cN=cBLnNn}I|y0Gnb z=-Z~F%)R=5;cETx9(IR(c~4w!_f~%Y;gi{C@(KD2`FFUXqxHm3Nkgi$Ebi7qq(OGV zlfG<9l@|G=F+akQr2wna520dO3ik^`1^wntrz6<0$GJF#KN0000=dB_g`ZcRJ^Y9^; zuD>ox67lFmxSgt_oO~oz|Elw$yykR;0bG_iO%qq_tj;Z?YXqXYL*=Mc?yG_5gkACyP!r&4Z#GcdG0=_jHeSfak<#v4G#{oAVsxoC<=88&WK9vtO*Wmevzbb!l7jAR55b8u44|F##YhM_o zrt}QR`gyyVvo-M6T@kF`VdaK*)$VeEf2_z$ml;(^NLL z+rs(x6)3*o+(p|{Xfn4LxC>sphO6CzC&v&!PK?TFdRTsVHA+$u_D-<}n3b;|G#jlpNWS&Y zs~%$+U({^M_1XKDLGtCCj=RNYw@%H>VwSqi_qK=`WlPspiLm>*F-S6&tnk@ldxw&B z9PuI;turW0a-K}7yh1xe^upf9oLzrq;)T8bN>ew<`EU)B(@^N2lkPUX7*o$RD)tGg zx=&sK%`rkT_=waxV5U!P(&rAcZ2*iU%4973+%W|3gQ*YbkU;aeT8liZ8B_zJ0q%!= z60_L7z+#Ps@M@XHNHrMf1BN_Q9-SuOIr#5kb(7XiNKOEVWhvdu<5Y^#DM4_*x32r!!!q{7NyPtj zHHih_{A_&*r(d7JM7{Jr{gfBSg{{k?$Yv4VMUfZR$3|YHWOuzxX5&Qse(KX!S)fgV z7&`m~&rpdDCFXqSAutv-DR}l;pK^>XL^@*y?K_~hA?BOV5nf-g+3tI0n784u%`rMB5R zb3@PIP$YmpxeDd7Q7Cw#nWrrx3V=AS*!5GqI5->rgb{P?Qt0Lv15RZNoxk zQ%Ge~%Qu0tEt;R#l4}O4%D;G+?DclekcU;ThfQSV9Z}iv@lA}T&W&g_}uhtjM0kmJ$4P#W#6Xo-!N%WU&1=AZlSu?obCjr;af2gW*V7G64KnL8GPl3SfL zN!m8mp2XpWSh?{9TYEHSf(s(I-n7~jYRPe|*@*`2?$cEiPCdj7Hd!gC22-t=pcr38g%fheH!LqHmcBy_#;y&fEu=k8wZ!Kvmv(h5K@L?gYx4ItUI#SO4eofFI72tJ$F}drzr%9q4 zyOW^ORnb!GxHpna*c1!cL|pUqsE}g^m<7<`+f3_idGf;32p7EPzt9DXWvS(%V?$kZ@hQ#HT9+5 zPXj0Y(`y9PJ3UPoWWXOgP1ROv_&JXnFF)xdVtNU@;@MsGq7)9$MiQdPC!rNB>Q1+B z74#fLsP)Jvb=7&@bJZAWj|Q;Z@+f7tKgGtdtbdTpfsVehA|Gw(ko_(8>LFh+xk`D} z-7U`w#UZGorK9+l*@?hiO?UATrI$#tnx%n< z&qwu*=fS_ywB>9!AG!OL);+&dD!BtXb{g)3LT-$O7q5kYw|8`RDmQ3RS@;Mba&CaW zmh3-k(`+39l}AWypQF~H#A{3w?*i|e_bw@eeQVxFKv%T?^QZ_1UgNoBMw9{(z@a94 z;b9RVN|!BCmqu7(5wJ78WT%{ApCn;-;?;HW7GpKHnJnRaFFA)MVcE|1X9xO6Nh@61 z_`BPlpqs*ho%&|PA->2nRD@BOf}2|SZfVLv+SXnutR0gd_X6iY4%r2}hr&VW07wx`1!{)eP#rKYaUnNBj~%I&ux_vpFqdj! zi(p^k3n-}f>roeu=!n-bu?9q+65%>>?Jb+(b(?H$zZ6PWiQx&uuev1J+D!dOTY+&U zprA1*T*T`6?b5&5LQ3Em58E`R@FAAo2~qz`V2C3trOr~qBBmB=WVU)Hc2fsf?R6uE z_m{lWjIt>%oT?tIUQl0|S(@2;m zUTmpx;wLOOS4e6|_g?!h8MuG4xp+i!^!CDbe*W_7s-Y9%ji@lq+g@P9(Lw)|z0q56 ztoMGew32K5#!&Cae*5}ohadI9lREpIf%gW&pO&3Pa4(I3J@j=s?LP>Kc})8?qd?_c zAl3w6`Jiy-p~rZxc=R?Ne|g{O^14xSU*k4ve$4mqE#pJt95@%xEk#^{ z??k&(?yu{-@YULHl}dac7jE-NCqKKV<93X1w>pfHdCXW`l^bdnRv8YBc9oiw21OV( z&%IC2b8F?1C)ZT>bOmG&ooLm4ghQ~EnTXC6neLvew%#&6*c=NwH?vxWy0^jwQ!heJ zp6KWN-P$d>RYsrAp0Z@bnEGdZ$;p4F8UD&MMI;I?z2|)Nd~isIKkA}ZulFiOPJ7Yi z>ESv2?EE3+;b(Gv%@Lp~xP818JCl)wI8pHKt@?@4?^Q7Hs=nYA&>Y;Z-jPzcW$nwW zL}O7hwZTN9$t1W*8eDkSv&qr^ex*h2^9B!Lq985jd5)$eamw}4_(Y;0N;K-i+A5;z zwb9c<6P4mBaX~8Ur-uYqfiWD#|8<5ZbS$nn>3U-KKjhZt>x{15*b9PE6mClOM(t0O zi0-KY%6y=$8s(C1eiN;H`~zE_**7UK+->#MDcxn!mVRARe-#QiNIEn;_TC@#9zAe? zFWnl7WD-CiPpS3(7ZEV>3y;}ccfr^R5!Owt3z97x(OrV{~ zSz#`jP*JC|R!6uF?q+ZpNg5oq^6~2ZO1(FLelXN~`-HbT9Y=q!t&;M{w_fjL3|`Ir z*{vWxii9rmeUm5T`$o2Y8$B5&zP4kt$d1^hLF+;*DqngY)b&g%ZU5UO)F%FMV(c|& zX*Y3&95N(1?mes=l4-OrSrLdX!hUTmWZKG4S~Xsew>o7_M8s_J0AAqwxk zaY*yLa>_5*l&`;gxvNKtRQk64Z;ty9xJwKgUYN<&sno|jqlqMvz0P+1sjkDGSp91g)&GjQ z*$M)$lF}@3UDwep0kqcZnJAqQmx~Jo4vZkT&AN^-;h{?hJ$sR!@m;JEbD;CZUPN8N z?#k8qVqMcsaC842u<^zX2B(o973mn?9lQJaMbiK$Rc2;Hj}O&PnseVRm+Hl|e@9G- zy6-r(el}S)bns)t@K|MY@oLjN8E$Z^9~s>4b+I$PAZ)8&Hxau-r(Q=CXYaF+I3doj z$2q#OZo`0^6d#4DAwaBL8DKRvbe-qXOeNcWrXd2{bWs)qt_YpULRZ9KD(Y7qSKWTsiR)J}AU>)WUc@OV#ra@2t9Yua)0 zRw6)M&$Gt_@Sm5C*^Cs+jPe@SyWt_y97bt*BhN~Vs{r}z{S#%m-!5!7vNMKWm7o4P z&Dbu0{vmMRNYq)iz4t1xzXKtr`=Xyoj$eiiIZeG=#inn^_ubohqNsbrXG&iGQZa{pheP%5%ddTBh=T zuC;#?xKK*E)vrt(Dk=)$^jn=m>$WGs17BPMc3I60w9Pp5fg>zoJp zz5=2jyS4MOoj#ElS!nI>V5H+BymMhcOJ8#qiAE7Szu4ote>a>5A3S4DkG}y;zB@mf z9*sEsJ)ZdWif8iexufJM=g^Xw?Dh**x=lx5SrDZ()0?Wzi}J%eV4QGPO6U3RatKAS z%=V?4d_f6%iN;Khu+Ujtd6iClmCa^ePXoFM(GaeITZ?44ZsAuiCO0R_B}LQ)DZIe} z>zt5w>8|xXieiqg*DcYFeVc#idUH*F%>ZtM8kiUV>FTd==$;_N`I^;Rea4e3-A%3` zn+BXXbj@i|^LZ}$l9e2jg^nF%E%i3;O}0F<@MzhmsWE?}u%Bj~p)N#${g~)?g;~ix}YGu4`Fw@I3#XM_5;bR~D5Ol5b2hTA;O zIg_TA1t(J1ldEU4L;5#1zHY0*f95@SU6l-qbt%7dyztZ7{9u>#?6=^Ke92N;t-UUi zXU4mvi^6HII&!C|<&V0)>NwB1oSrHV??A}gQZ}A*-If~n8oiZVPn$BgCIB$BEciVL zKOS_$QZ|1}pPwuEOET$iZPM{U^KyNzXLwRUIc7n@>+dDjwu;(p9zo0nED67QxiuJ+ zG&OEx)jioM-@K^Ce|xJG{Z#`qh{|!qb{@jGZG(^PRey6KWH^ z(9}NqgfSO|L_oBtXQOzM;9iO~$xx#(E9p0i9MWkEZY+3uFo#nE9o5b8}%k^-nV6TcZN4iz7 zxz{h9rL|$RWgGr*!rH4%CflQ-{`npnT_L!x;u6u|<2e&}#5FGTjZ1BM>Fn^L$s<8# zH_G!zw046gTME5^nZaObuTFJ=^(?i#diCC6LBUzrnTnzMc+H5$)wACPpTgh@>gv=H zbT*j@#yh5 zE{6)Qz0j)CrbOysI%oNxO;GBoFi!L>bESBidB|>T~M*X59&f*HnLBsiob` z5B3Wux3>|M1`l)DpM1qN=@Pv;p)XxIu6lJw(5%*x_K5wAlYD({Ep54eF01eDe+;E2 z>hVI{T3V@yB_@&bq_t+6O&H6f`qG;QJblTMYM|uPq~N5dX0T0wO;+I_^^I3*K%8eu!-tGd2C!_^Vu!)e7Xq7_Ll@Itg74? z`zfG~oIxOil3^qyvMN!A%RA(&<(OH@j@siB*HKVH8T$V!YL;jCgxjjg- z$1`h>Y^@1m*y`w_KN-mq$bZjN`0BUK!Fh_wh(N|rCTu~X^(@D9FBI*Tg~~A*tBo?< zZFTVXzf!dRH>8bP&&UX82)twu)ivbt>;ysQGA|q%N;r zh-KRvy_{uVCZVyfoR#i|D!PXv1VZClCrDmwjcEl>1Pe~ziy*bd+rCO#f! zmO_rf9Ffr==+a{t?g1-3g!AD8Tz8@enC`R>2;ITMU{2iOhX+qHNS9uSS)dUXkC3Kf znrO{hF=Q561~&ja4|0O_fr!EO5CY5-3Did->{Wa$r zR1O<~*`UQyOQ6CaI4$QBM*(`;VVVQ}r7vfl)jD&FChi{8Mi@(YXrzcP2%UivWCFeg z6GQEJt;GG~b@a)3^kRl++S+aQtDgM5q4L%tqR8uMx1spldjeRZ+pM+L3}~@?^466l zIEWA3WklGp@$XDms;TNdW2E(IH=TYjaH{{_Mi1oP4-zJtq<(jGOwW+5NGsL%PC|4g z>K7efYMcZi;i=S*yBUrPrLZ@#m%D-s0>I6`DTD8kSz!qA4q(H$>2Az9zr5*w>9BcW z8o28)Q3jfq#XBtALl1!f`M&aUa(?9BNq(-K<5cZakHOF@h{YGgbX|Vaa2>p)gHv#WU$CYN4ynooi~ZxzGT8HeG^?8 zj>{_ZMY`&$eFI%Ad`c?oeS<4yi$+)PPcE86sP50{iA7AxwOQrE13hj-;*~EkiPx^b z13^o5?q3&6-7gk4g*gxSgar@Ih4UlH-v@72dJ}Avo3IWJwwtV%EJZo^cr?zQ3V+?x zpoMpSnz-wN-lH}jTC%Q%VseGAjo7f#he--lMDlB721?f5j)_`2J|MO+VSp_QhweMm z#!LnUt>_PA?OYuv2vR7XzldObG7zwe0@jaxLYMqpSvA5jbt@v@<^eZrGPDerfbdy` zpY#XcPKl@U!lBU}l0>WG-&reOPl#$AQqksJ(1|e1kVRMF#l+vH|}G6A2?hVu8A$;%2=5?;(H+(G*5L zNDaaZtpOE)biv~=JJ=qK29^r@hbesvL%@7sw=gK||A=UF&OZ{s;wN&aJfQvGA?-o@ z)uL6ueth>Q>$<{E(3|@33$h5Fl25)4gb!jP{5>%)i};E^;(sLL`VwUzec)Ji2GXZD?;^UBRj z8*#kVxtm3cFB8LEPpfhTft$MRn@ZPI!^z9p?7^X!l?+)?gvM>60bO6y02y$mJ2@u8 zoxr^B+Y7uLPxt9nI?qG6SCpO&ar>&@G9_INsqIw$y;r`UcETLL-$wk*?EnooVF1N9 zuRVuYO}n-!36U!_TEd`fAKHgvUdF;dunxOHDT!z;jeSb$3`Jvq9B}S!b7+N-pA&@j z9g-^(cLg(nm+rx9)v1DlH>ObbDV|;UU_9Fu=|1=q#QT>$QPG6lX zz(m>4M0vcQ;^3XIqhkStUKoJmrSypex-Z$PA7B(AmGT?648LQiiD9A(yRJHDm!#kU zamqNJcLAQa`+rIs-rR&W1MS6C%wS{6kO29LUywE%CYgMC5cH!TwEV@Da7wK#eEG@A zW#1GBbm>-IU5!70oZrDG`%lxi2Uo(4g?Mw>;)RD|rpikc8o&~^#!`&>zcQm9sBz&& z?yl*x@z$?)B9DD2PYS03Mhr@Sl*}^dg16uLu@I?VgjAoKIPpLk;}35lco2vy;bT0k zt>bgJn5xu@-PjpSL@8DLUVUGvE)2+>(HXF&DqU4&h#PgbdjLuoY~ zZo$y(8@o*O3`e$wb}Tt&HR@+CUJje+?iUWt@=d!PLf)RSdeyw`GBD?;rTnn7Yko~D z@AauvY@sKZkZB@a%lT6=-`?8$a-UM4VuV)wrmM%@uioRyqm?%XJ(qF@3mdW}k-+)J zry5NkyMy$nfy}iF9xA?@qC&mWdTw_Ka%brW)AEhc88@-g7%iKr&u;|7}WhQnB zuIkJE#y>=)m!j(=XIAXSEPDH>K{GeT4_+(}Jwn!QzJ)Bvf4h6jq1&EqMNxyyMycMd zdnb%8#`j$qUdLYqAC?}sk=@|Xngb6y)Q>-uM0yqCbzI5Kdos}Kr!{{#YSjFDhF1zE zZTz73lDrNJ#YTJrnKU+B8?CB6i*O4k-#>YUeY2@Ly=*wYiCgkJ0$=5HShuW8h(@;J z{)Wjzk0re?c3(#Csc!(wqCr&sSNut4J=oA%>#3Zcm~Sk8Hy3=SF{BS=rU%UW#$iKu zH+Al?g_Df%G&3sU2lw~8KDb6|>Phx?ztw&`r%%qejDJ~y!$8fDF}0#t`-`x|i8&+% zk6A^#QT<`dd#E_hk6sEfaUB0odJpCzmqzttr_Q#>GA(p6QqmspoHi!P56OGx=4~Q+ zc1F&D%{i~X3$iaT^u$#Fj?|C)O)4tGf06xkUh6u4A(fOXe$; zTW`5laIt?&6=n0iPF=XYoss8MJ3I6+(oin;2wnJ^fQe;xPmc&$s6@W>rbqxGhJuV9 zGb#;Y9-qhzV6Hx1vgO=7ZcthlU#r)m{VP?O_qm?d%O!^EC^IOGCCGcy%e~o<`&(&0}Tw-F(141-lV({&Fde^o483y zPQuQe6z07DB>3CIsOilqA29)+XsOVhFegXfZ`HvV52HJJHW=wF8kk0me*{~)*TVEX9tqt)7NtEJ{ zR7C}h=n7FF?`#twlN8Ki{#gd?GAUH0n2hP*F>`wB5n{8*)tEAudexv&Aw&ykB;0KT zmix>%GL^%xl8Bm4u%iC*{luVDO8(*>@I5}2nPReK(Ji^q+DX5St;9x^chWD2QZ@J! zXlL1b%AVF#-r-(lKv4GdZ)>}F$8YogH3`^xMTm2u^=J#wamvuC1~sNc#LzK7!qQiG zM|33eolI8fSJmVm=;+1p_qz)ZCx|{I=Gl<2rS=cIrnXM8)`$$E+8ow=BToG}rHN>5 zgVDa6yromp`#VZ^E7|i`DMNQPxZC6R0jJ5;RmoCjXZ#`OYS*bmlqw=UpDz4K%b=~R zx3aU{?WQ_0ALGhrHviUaLZ3v!BF!~k8l$VY zA)~vs9{)6<40VKKLaRqWu185Gt*`vVRh%mqpIy;>K2TOx%PrG|GvdwEDyD4M}3q%ZOcorG#I)bCn2L7LxFzBoG?PQWC#B zs{Q5zRsBE-^P4Nm<;VKuhem&&f14kN@tAl~f61gFbLznTrcY~5pkPMH9jmXb@I{~%@=uBWqg66S1?=26u5-qOX zZ(pkUs+ynpl4iEh*p+|Ve8=%kho{fJYxH^C{Mq_m;VfUR!ynx*v*(|yo>%XFX&gCp zRzY`P??qILPT$F2=blXpefiuteJC4b?Ab6SrK6oS^F>I*jT>*)9_TtcbDKG@rLzS} zO(d`D!@E8a4&kh#GzQ?*Hd7Qc)Ha@sW(x|5Zc6ya?6q{h32VsDkgMW?b$Sbs|>V3|#_tm`1GYJ8FZtk0G+x^0sCMY#=X+H_t&+fRJV!TJog+{bRw@Lel`DO=sI-j9qY$} zRw_tQ+>0kAq37?tXV@D6;?6c`t*jNxo~1hwyi%NYSAE@?_pe?nsAdlLe}&_r@}D0^VTh==SJPCIvks>3mTT3jqokz z9xjcl`74wIZdB2!O^@QefsP_Fq>@_OMnCIwuuT_cyL#nuTZlfjn^F3p>OS`wVUPr$ zlp#Hr+CCX(1?(1+b1YgyMnju)uVh(Y&(w*E+$zi^GLxPY_q5vyv_zG&$w0iqzHQ%0 z<)CPM=iJH;k&tjNY|8UNi;6sXb6O>WFB>~D@^hk>1Dez6AJbPVpC6l|2~%-N=v2OH zDO94@YnwfHf-a`%-2~G~BT3j#(O5B4rewP0i05}^jS}TBwK67brO>o zJ=U?m6_hI>dhMp=aleO6)SHAnf(_;Xk6t6+zXThYV}rs0mpUx{A+S>zA^N*E_Sh9&lAkO<_42$;c})SW+T=V^a3Bb15*M6xEB}?z(pW# zum+kyQiLUp={{4SJ%Hd0=0c+NN6&t!S0*iT=GKni=oP*Fd)4$!f+@6<&0Ap2a<0_` z$*)`E_{UvcDw0}yHN5NUc`}>sRBu?N8Gd@iAKPhYBAbvgH)^#%4sp+2mLxqPH6b}6 z&HFy-8TGT|r^(NT-lv7x2HS=SQ%+M%(^>`Ze%}q<{n7Zq<8_75kxDjC1qW~>wKmYL z8&&&k|NWWtLfDhS~z z$QE6$XPci$6h1ALG6>lfI04+(P9+M7-+F8XODIWdyia;s_%uRVLptq;FwG35?&&+* z@sjSoD9zSulfoo5F3+Ov>8Vj-)o&*;47Z=rN;!B|tO%VX2@9g(&a2UUkbxmURht8yGH!pWY zQ6bBRN+B!tLD~XCShoWpw|eSp)h9wv10j-axC$HPq@$y|p|Gk+w;?zP*KOX9%-w_A zAm=*|8&_AqcS)b6amDB$7c)oF@Ez4-BGh&`d12HvlrX>NCOw1(qQufA4qTCSk)}D>r+n1 z8NwL1#~#o{`9wR}`mK-Btq54%02-dk+;SHFo7X=a0GWEM?5Fdp_8`%GtE%SM-$l(6 zkK;;TGq^kR!RGgcJ>{@{>OUanKu6fTHSS5d6yM4&QS+dwB@)5f7i~K*YEZu?>9-SG zp(Ys)QB8}{EQx*KK)w90q~GJgSs%ZQF7=q`WYw7DSx{I zn!0j|M`~C$xAUsFr07Jg{IOzuq14>z#9wQ`NY*ZvxObiTbG)R874GMeFeNu#qnavA z=V!CH+R)?EfM*t|A`?i4#cCeM;m4MQPwworp+TwO3FJp$F^=b8SJjwMc)y_n%iy3` z3wqqF8Su>T^Anq;^aTOJKTDb4hE+oGsB~!Uaf^o|@TffBoTzPW4=0(}L=@vUlh3#o zfwTN+=bcV2vxFj0czeQEts|5XD3Pntk%=r0I-m8eLTN*x`pvB!>2un7x0A3e2U?$< zty!5*U5a%8)yLrkCy~^G21+)#9F4FW)+!4Zc_DQaNY?YgOq7JfvzuaW?38Md-E@khU*WZa#p8S-2 zT;{Hl7!%Fja+dWe*WM=$9|%%q!u0`b<==XiHd2-yS(ys-N)1xRow1b0brcX#I?!JUm;aF^h&2X_k^+}+*X z{hoaH&eW}``E{qJs%zD%-Dmfo-QA~p^;+*^WZrajd?hTC4LKHnmkUtELPaS@EGNR( zBw56;M6<39WDm|jZ!#8?^e7cn2dwo(Gm+OAsW za{CYCqvOcgFWIx>r{g@?cfx1E{O{W|aozc@75B@}3xX+(P$9|r>~E&`C+-q@-w{I0 z+Hv_YY>)w0IoFOp)9=CYdE^g{4KYr58J$oD|rR|-UVwrUMjuM$Yy5YWe@FVEK9l&;W6>VM4vKG zvXePjH188n8Ul=aON_3mP{j+8ju4vT@K&mOUV zV}S$%vJ0+@R~gY5M-o7>%hr^(3y}CmVxXsl85WI3{Gr>3uQ7Uu`3vuAV1MZKUuNnz zG12axU|*p2Z!xT!cKG+8N>3UxW7oVvV4w(}c*pRYtjJ$jHTZ$7B;)S}k*s}jc?EdV zfup~3##6|L<$JWrrK6KE?5pMa(#g~AzmCs62e}N%N4S=WRU^Ld7+v-sC?Eg%CPlgHD-hLqBDWR`1c5tNuDIYYiQgN-WD3wjgS5rkzmVE@q)bA zHCCB-;DF!3aFa=j1XgM>77c%4ZYGv!fyX70oQ30-7_GX4S2I?-<1CvN;ak~uyny$< zu4v|IHF-v0;6vb=)>u~{Y^BQ%E?Q5`PvQnQ1%>DHPe>wg;u>v=s^It;I+Gi2Cspus z7t0`!{qxRcUEbArB&JSmmPi9I?vB|dBaE`*uI9StiuptlUvLe3Rx>Id4)X3cmS6vavIeD?p5Bn=nD*a^x@2b#_hkjJfFbVS;4i1b7Js zw2ObehOl{lPS$Wu`tnM4ofGo*zQgQ2R59)a$wovURJ2EIFR<+K7zBj3KT%BC528$- zzavOY5~#cP80seG{|8wIeFnLABz&`dsu3Ik;Xr>P@HY* z{3Upl+NOSo^*k+{!6SjLJL3f~*C{j5D%@vPa?+CvKxeLu?Uw)+&LUSPk-btx~xX$640J)5BIRG_?!sLlmFc)MD_br z4@LyPIO5nWsYCu{-;@ib*uPKDY1axTk&7T&} z+vQw7{P8%-C4z{WJcWAt%@d(?+)b>`SF3fAWJH#ooKRJ?I>DKkirCMxpP-moPsv8s z$vhcU*DDX}h1KP&YlQ)I>6Ww3qHr%S2TfCdh$?|14Ds_b{|_O)pj{klAeDg!V8<_mmsOi7t0B)ic?yO|6c%!}OGUIXpGr z&TOaxc)KIlTqBGA8X|xxxWW0;v8zC9+e_8$ z+)`3K_?;aHDDd)nirbittiP2x;aR$C=$L%f?T?JyA)@QDb>_wQChRHS8i_O^(&E-d z?3laI?MKMub>P0N7kXp18z+lT5sSU5&tdu9fRp~omhREuvOWjfR_dbuKch6f6gEn| zI_v3vUT*|=Q7=UjtvA>2hwbm0D_!5@g)=Nl1~4=ymM$2gmKveTi7p8-G zE2e2r+ywn+3X{Pye7X0FbZf{*=6-aq7sI*mcb+qX1X{QDzah2NH*zaoPg@@+$8Npr z&uTdMJ+5jR_&uI#T=Rxu&fapP{)Y99k2ccRKas(ze9QHLbC*Sas9o{| zcRxXEOI0#gKatP=b#|1vH(H~gZ2@0UY!Sa(EO(cC>Gj`EP5rUnZ*>7$Qoq%3bD7X_ zcGGD68BnPABcU{r5(zJ$)(Wf6r(P;9urgEqyFWUWR84W;K$KKR(b#yPY#Y;0N*6wi znx=C25oA8wsAb%=ZWB}Rx8(0uwtvh__8pm=2xL)&mPM5PDvPoTVHIN+Wd}sq#WF&9 z2^T&r5V$c`GgR|Ueh{)D;~{GyW%{8TejM3~4fzlJ2dS;- zYFI0g8&$QyrOmcr9)tbYOWp04zX&nt=xm=f-OU%W`@RpM^EsRMW+w!vqLp)B-)B>y zmGfV3XBWyU1!~paCiF%rni2ytqpO!=KW`HO`(uW;;DOakrDKNPRmFcsmf2%SAa{PL z?<}ILeCx&cXob4oY>wI;@U!76jgiok|nDHrccGW!_yR0R&HjT217ht zU5R(yIhiYch@$ZoYw?55U<+1dKBef6?ZRjrwO-sx4|2iJ6IIeIW&pRa;y23IaP4B zUd(~uGpizNP_zAmIb8Ui8z0UKM%mIqJabMJXUpRY%S}}dN_)GbX55)4%acuY zS52eV>A(_?7PpHd|5{UxgW4W)I+OG1sb_Ib-PO*h8n@nwXSsvi-ch;-&z)2I#DnRc zR=TZA`&3iM)ygPrx^+4N&)Sh^$CdvmIy%QEU3b@ojlS+7bOC4A-i?IdG&C^x^Zf=D z8kqlid!rCdz>B-OE-kD!DX5CK(T z$Ou8`PgPAua`y|7ZSr6zUXs<-iL!{f+11(hZ>^Bpzght-?|d)hY0!yW1NcOJb>iKP zX1^x?aX$+YICzQsRtPf0)infy)3Ztu^I=e0;#*gu+WiZKl?m);t7}i#a~i+If5!RnJ;6ZsG!TG5#k?Wpn&jOFYwcXpgOA>|v~#R%5N=$Wb|sjePJ8eh zK`moF9--&G)0M(OAury!vhqeli1Nh)+9B!`5k}kQ716TM?^7Q&KEvn4sgB&pKQiZ`v3vRZ0^oIPcyl7>EMr^-{c z6KO$NwWpxUkUf1wKdEYHLE0JaiMb_q#89oObb;+y)0wCxW2MuyCbKfLns7nJ3auq& zrOUf-x7zJk)tRs*9a#BuYV1<=!I`5acxC9+$i`XVs`8;Mo_W{A#0r|ujK4lw<*Puc zu}WF$OeI2c7YzMh%LRWcOpg!-Q>ppxvdEblvH9FGUj~yQbuz6{Vk5eF$=M#&s{REm zD>jcgUzPZvqUE9%CFC2QPpZ^r|2-_y(C(WXIGzeL2Stw;aa} z$F>V=RULqtUM1d>-m%Lu$vlMe{`WQ1sR}UdFnjBIO?V+ZG6nSCMqmA3VqU18u%4J8 zy!SVgw-NXGHzUCGt-IY=uRPn?KQ<*cFg77JLXm)iC*M&LO%gx;cRakpU|zfkP1>Zs zkgZLmN0wD|X{2H2w97nW#2by#-3xGBMibhB9KrCK6o-vO#Xi_Aev4Ayk zk|MrOfk4gzCOLc~pfKJh&k-x1E8eES5jj5- z!vB-9AkNpKSrI*OmUNMCj+@kpm!w{iIUtt2Q*4fkO`Cj)=Z)W0qRsE2cB4s9&=f5G z9UC<%EQu5U98XK5Qq_-GN;4zx?h`9aBS<4&oH*$p|53p`WYSPlikeTlI8u=>UyPbh zvepm^irc&a_%+X3U%taRNA`B<2EdgR4*ZO4&yO=Fq^*T)1f}C_(Cq*JPJwv z`oHu+exu^SaU%R=T<7gH?|kq)e58Ezv;qBd!oI~xx z+8`{$Q^P%@K*WP|AtEF#(BGlDA;fbDp9v_eb^A^)D2}XmKj}IVs9~4U8{yUw=%M0a z@j8(kk$+O@L-5yGFqIfzk$`AKa~OI^Shx(D6{@1=`xuP&Kln82x@M=7&k-~Slqsw? z%stJ2x+q)_WfarSF({C$9gGzu?ajIK#K*Cd$mgX9v==F4okP1&hb*8KUH9>CcTfeq zl{%6-y!ku9nAID+e`NM7#7ZPc#u{R$WoI0Oc`gS#3pEQf3qa4pvO}dp6GEp!r9qED zWx!cMTfy-n%)`$|q8~9;*2A9j>QmKwh1cOiF~K;)>cZ5*{3A)b;+zxcqpv%4>UQ#X z68dmJ+d{bUt^PwU`X@S_(1L{PpV#?1pCHK_B#?4th$h{;_ppo5&$J}a-iYgNuQ)ye z6IB1j#(@whG-z(wz^-t4oj zUuKsHK;F!=%O60xSRik<*;by}XT`D<#wX#jhZOazUG=MG^{YqqE4r%PBqKuhe)cjT z(%LG_TAO%DoDO72NEo@dG}Cl_zNiO&xLF+C3FhcTEO*%1kjZ|jDljt|;s|o?Wv>s= zY(8IX9{=m&tM26c(ItD~7-r{G5`h!ST(d<`rlnJ|MUbIcP`U-uI{!3}`#5Jqp9p&_ z1WJsxbZ$2b#x)CeH4Dx+cg{4AZUC1kKZ&8VbB{bb;h^NR87m=d$qpSOC|v0A0G9|j zZ5XJnBLehfsO0yJ*k2L9;zz>@=B_~!DE{|_0_7@%o2)R0(rE&P5mfO%*NTsk(+FfL zL$sQk;eRr$b9dfA$zuIK=5hm+H$0GxoQ%+j^OJDh88VZ3pk1IPprSdBh?ZWmronbSP{=D2#X0FvRcZVR+xEqo~8U;>jZv zA@IVu#vlDCKBbw1NQyy9^xr+>eMN>EC=sltjV?nXFNOJEF7Utk|G&Ff=S5i1NidYq zln|{%C8#DJUO|9A3rhZdG7>e6G%Pl(DO47RYQ;Oq7Jvd#O496Pg9w0aH`-&)e)2(q z=$%onORb{!5@7d9vg?y~A~iytlXc2N)%Jy<{^ZwZU8fi1?nD!ZMS(|w4u{Hmkr&Lx zL0;GHbc5jM6?`0^x*_|YwoeW87PJvGE-WK-IBZs(A~3E=V_qJAWU(amOpM_$C|7x_ z^dI)#;Xm;GGs?fKt)F!3?2x_Yf70vYq5f&zHRApx=|pWLS%)4*h==(<`8?R;P(DHu zfCglbqDSC`SBF-I?1W`7ylAd4l?3PH>oic10VK86mhSVEEZf ze%${UQrX=!ohHdBLaxvPGbCIL;TQU z{o9CbH*CjJ?CUmcM@#H~51X+aJFu@CuvgE7(8Yz$B!mj3 zgzlt-#H5ARB>y!5Nuf8He+?`nge&>4sY(5>t~;rXHmd7f?CVzS>v-(z3~Y$+2xMbB zW@EFqA*JfV$$G*JT8=~Aw{o2Vw?;bhASUvlOljK}@-(s_bet&slE-pQ2JHRkkX&hP_pnT%OG&)V*C?cn3P*u@K>N zeFcut3kK~U9f#t$w03s^U{AdiAo8i9;9K*_HL7SkJOn{dpKDU_gXrUTipoLp1575D zQYp`hlpRWDmtCrgWWvcG>Wc!{nJwRD4c>hCt( z7usz_U5)zd?O3|Cu$GyQ&d}TDgRe~f-8`K0xbF>lFtvZH4MtaqTXzTW-Roqp+EC8e zIraESJ(-po2!Au3VYVl2+=Y)O;Zj_+eR6ng*7bJ1(5pYoA3l~D9JcT17#=W-^@KLIJ;2jHsnKz zRg`$H2qL9aOD zpI`R+sdV?ptQpgV=U;@f6R$wdDW{j|7kt))Ssv2&gzK&UieO^nN26m=F#vj zBdPgLo?RC>wE^whXw9sM;%EIjgZxDF?hi-H-SNq4P2p3g#|px#01^J`84KDxo(a5# zI!yNvL-K7Kg{$ut7O#6N)?910v^NH?ZBfQvXlith8%=7`KjUI)u1kRXou+Q-j&B=Z zvq8DXp(8Kc>G?K>x0!bGJsAxa2S2ms?Rs%GVDj0}zr%+l{m6ZsUhlw;6JLQE_oanl z-3e~U3mUf&n{ijEHDBn>5ci_io|{7bw3t-B1cVzuHF9mcDNm(xfzGu(TwfXox7IZ zO_xr#Il^;Vba#zN(CA17kLgG{4`{U9!U-i{ z=33(Y2?4Y8x*lzVrAnHZ;Mh+hqIf3&qJVEEA!=Nc7S$bsf-?UH^dg9LC%v?qi)#yu}B_VI{KT!wWd`_a@v@_p=j$S8dtd zcV=o_I>L+-j+p|VW#=pvK09%GNGPonf;%~M#iGAOrvQ^f-mvR`Ji|$ zAKS)*-S4W?F`f8(F>|{G%khoS!-WG+pnK@iRSs@oHSX`=93Z!Fd0X=c+^-hgcyk<% zV0Exw*c9B}*qk@I1-UqU?`X@OXkNv56drIFKCncle-ciqjsyI>zDztZ--Z`4ZA;JM z#&T@<>4r=hK8VKgwq!FoHdQeh|KjO=<#1V}q$RUxRGK_Dc4-EKm+%+Z?JbAM>(gaD zmza5t?mv_DXV@RungY_mSb$@_uhE!Z?AdIsJ5^`(97Uy7d+j(byY|eP#=`sZDzepM zef*v@7S6bOd&(1IfAgWwqq*f2&Wo`F)#g$kttAQ>4r(dVAmZTuZ5Fj7LRL#cOF@-2 z=1Ur$TJY9GosfuqXCSTPHtu_Fh0r_B2dgb*wtZtU$^9|u9`Je2~P!u)8%)2zpz4D!6#akO@{he)r0ye z1~X*5(c zn?9R!$K9tdOZPoXA(vbY0yuRtMMc)IY6|}IbVlI~L+nN0#%3otk=G{gknzF57ug44 zcnR9h1Skp%dVgXL7L9)C*8Cnx^9j)1bpl5Cyo|NhFQ?$pS*zi^(jZ#1kyt0@qmtO? z(wRYVlBv%?xuNQqo;bt#e!Fhv@yZ6)eXdS<+AY>W`NB1rNVPz);)@6oS*jb9%#MVDWxQdnzWR=*1SzwOJX4M{uH z=V!`l7jp^u>r2!&pXb!~T=nw6y(iw~%6sJCmiSTtC#8iD96&D`){&6G^@6J z%MkM!Ol%SKpcJZ)omm{v44z@Mv`%G7w|!DQET1iXW%;0xbZ`t=JoWOP@H3-gjYDVJ3TL}E$5qe zMcV^6u_lh3+4f&BJujBb3d5U0L>Z%yujEz92J9ojF zdsy_{K#;rT-qPdj7Ao`pMUgHg+gcvQHbrXRK#ctG2$+G6Oth-8FO5|$#I;r1%&O@P zv@KS1?D|Lx^-lg(-KD15n8Shc7I7j8QPbZNkb@^VibHEIw?+e+<}hz?SMU~Uy|7l2 z_cd(vI*G3Nu^mCRVK#Zi!cOUgt1^Vypdf=d^QEKFPFoKff|X;mVlr zIPC@@LgvN5V-Ghp*NhQX@tBzZ6 z#LbopNpix_A*Zr-Iz++XBp}Kk?yHTJPRE2vy;W}Jz zk1N_Fz-lCx?T7c($JZy&ju6g(Lx2<80>cFb%G`>5&%p9Gp@JK?8iiC+tptnQ_P!Bi z-_^U3aXC&omzt|~#HmJkYS3VoP^^JBSslA5`U0) ztVheXm0VuX(ajFuDI3($I6{Y@n8Tt5HMu%i53@=yGws?Gu3OV;VdEUtM-Q*wM-Xgk z8guF z1+vyARq}t|sYM-gehk^K2`A+SDAJWCxhT>D9nlycg{1bnXwa2MbGdyTD-^grU{-Uw zSO((9Yh)HN9mfh-D9+1&{z051bU++wSL33I6CRat-SVU&@M>`#-2WWoHlcK;1_mN4 zF22r&nkP03Y117o&7GouFbv#lw!LXjWUxEeSW`oN`+FwZEpXT}dmhCJK%>6Rxd=BL z5?N;{ZznMFnCtf4WD6gZms&js;ywJ*jVj_|pqOxvV!vPgG>5|{vfM$? zSq?`k1g>gRdlkW6FM_o|YTVO|)xoAib0i>q*&Rl6#4%l!#oAocw%l~y#M_(Q zOH8~^on0<#dXI-0ZT32yTV{%V71?y5r>&AA9o6)Eh#ME@6?dsw@h%Tvq`Eig?LP*=k%$YBI*>MFTBF zm(w8@H4+)N3s8`?&f;8zzUOPqsVLXW>ON=YlfKmOlxkz;#shG>b=#C+iud_YM6HSG4ESnbf#-J3mn~zgZ7&6ojZqej9O+W{Hki`i zxTZT$YCFe6vStE_-!U-Ml9(Gj(1#}nW3n)#ZPhS`bzlO|wt3GyX>Spmz}|U>!^4`} zvn}fzPv)CW*6T~iThsko;Il2tTT95BPT6aO${XVbuyxNHwKda3Om+D{d;=suP24AS zzkMalyG`nUyL`}t&LsK3^20DveE37C8|kkH?U;)W{O7Z8uPzXETFSQ;;nx@SJD2=Z z+r-l|+6Ta;ZsRO9paZnC=G5GAG~-5VcGW~1_h!MOZiptu{EK3@3LCh(Co!$X1{$t9 zcU|+@1>KHk3Q7sSYGL@j_tLEzZu*PDK-!0E03xU<2K%K$GYf#AU4s{mQ|T{ zD%Ttd<-gE8O;yuUQYwEZ@`+H*DfH}pdsQ9u#w-vP&Gz8cXvv$8lL4oz)+x1JzO16E zrGlgqN2fjlRyZi0AVOj8Wivihd9Y=(w2^hfFmTBD+#$5NQ&NIs=+{oM>a+2Bh_mOA zspE~W8ZpAzr>CQ%pv5wPQ?x5E^Oa_fltiJ|e#~Dt1AQ=~m30eOywUM;SeJn{z!!hB zkQ!hBmzFJ_fpr7oRH`<*&WGcHsOn@84qtnTPhy-;X>)kwRg39ZDvOkEfpXAC_*Nk{ z^kh_pd&DgvWnvv9CX)`^c0bS@^$hxBG6zNnN?|5f#exbWx)J|P!uqq1OYG1V?G@uB zBX-e6;^Uxa{^ln)xD!NI1-EDAu&Xv*Z-6alR<>~Q{s+qqfsnz?gP$j7d!M?*hhOc4^NRaO&8*xR-D%@gJ2O9IBGp zt!Y2@DmnC$>d{X}O!fHbMqRq!&>dR9-aY$Xgaa77 zo=t4VRqWsp;AoJ4b*JVKh$8;=R)RT%M3LIA@2zWR1D(+A_wWGc_MmX&_kc4IZh!XO zlG!wVt})?IQclHgTCtt{@EWe<%HitDE@Jq;nP=>rPJmne?U&j2hV0L&0F$$OMWtpFq1Nh8{yWST+KDD4X_Ck0BDQNW)ad zcsCriNLS+3YZI6#b!m_MEBC-#Zd@(Uujo3yS*o~Y|L&>i`5ffCd87IR!C*%1@W!J= zeL9rnIo{I_g~`}Xx>B|H9BweTe(*uLa0=w7JXb_($}g{_lY2jnYou1tsxM@mus#NC;a0;48gWt|SssrBwR99*qT;tKXeh~_ty_9-+iVdL|CwD>gGgz}6I zcIn8Om;Z=d;~+G?x4T3Y4$2FKi~3P19Kb0F>*!Ku;=Y#@8{(8S+bG5NsHfun!qnV! zI+yc#j1O1TlZ(%Ci zaN(AplOlexywvlyGptoIWZKewwW3>JLPA|adZ;fBvQ~PiC+)5$ZMRM}SYmB2pRX+E zvx-LE7NXW0hCZ3`bJ^E}bRMph{nk(Y#5ZKBZ&S zK6idP_&~$ihXkD-NC!*~dPWI|XVTvq)Zi$3;B_obYul9FDDh|>U0jh>P9gc8c4BJR z{u+6h=T#X&m_0t6MDhh&XB60E1da6CJ5)8N3?icXLD+tfo)UHpo5#qyHn+o7-s6!d zv>gq`!M(}+Wgfi?Mn!bN*)XJSH@L%H7%Rs3G~}6)z;C&I%8oMvIMYWDeU6gp0DAx_r{X5HMQT2vAq=6}>FWpqXfc{xW?s#Bn+l zg~t569T9zM{+hGdfgEo3EAx=Q((lh>+dRe?ciTYty(RC_{U7wrgbwlJiTNIk74%xX zhu=(DomcxjwfDuerG*PcX6sX#zY7Jp(B)za*K`EUz*qhoK`MS*-^KYf%ErNrku2w2|LE*sX;E(X?ltxig!n+Rr3k*=8h z`XEUMq|(COi@e*Jst|%%J)&x7=gVwtpEue2Ww_E?c)-ZdaIq=!_{maON2iZTp{(VH zU6&Cq_R$bfa$0uKTvMckRTS-CBJlWATPLCRF3fvA*^hi&kI?jK zuufStWi()csYX~w>G6QoSQN^M*cK~}uoPSq%PRG;9si&cfKmruAB`{tmHr?pyn7@{ z;&WSvsUy!A=g8`ncY60_bG}X`fjGZwDCGB*4g5tl=Amu}6JB0J^iL=p|GJMofUoyt z*Ox~U$JA!gCx*HotOs+o`x=M&@#b!=MQBrU z4@y#VRnlY8Dt~aO%4@%*Wht$i1I#H_WKYQ=1D4{m1T5gNxs2JVfcq5`Rctn zJ;E!+jkC;%MARphiHPzY!&?TXz$!Y-iDG7Pjl?KMhyY(o3fQyrjqPx6P?2sqoDSbwIz&J~u^(k!Q56_jzp=@6;ZEYwVN*-gR>_JCpB zWgtt*TU{a)(B&px7>sc9Z3c0UE_q%gl7HZ~md??*Ok-I(DED2Nog65aMwE2m7vVYLpnpIOXdMgeI zDjx2haFK7CT<7|LuAQW;%V;k7duSDSqhFd|`YpWs5$iEuKniJe7pgF;2$sbmt(7cz zWdzhnHa=NY`Gnb|B~)QjcA#iYiC&%$Da^})rB1LFTaLcQH#~bhF3_7SWeuq&OKU9V zm)naaVI_wmDsfa|BUo~OxeTbmBo1xJp2|hPnu6K-Dv5o7sOUdyW&n8u>W;mDitCv2%^6hFH@`^_@5A^g4jORX`1Ww|bmKkx`4JA8A z2TN6n%t*q40o+Zp_rvS#l_iHI1CVUQroxi?4`kN2^}%rB+zIZW07t_ap^MN?)&lRM zR0_p%*AhN?yzXajIaIXZPx7s7-jC5K7~hE1e5$20t*mhd0-?$*g?pO&nzZAXTFig9 z4tj?B2&xh95hs05nCd3M!6mmJz=>&=3JD4{R=n}o1x%@tM*gPgo1(<4%{}6`7iwHp zWbiGi=p z(NaGtwX9RHRcj-0@-O;PoT~_X;XA?eL7OV*_Enr|=GjC#MYd)N287=L zuOuL4|DMZfmU{?Bs;zubR?4BRd{p%2q2#f)nRQ3jv_h)1k`9@q(P7|kR=UQ~m($c<$xDt>Q|Y+}0)9Q9nuC!fQ__Fq!ewm{Q=Iq{p|N7zJ)X{rfd#by zZ43965~VJO>jL9ISxp1Vnn8)nI3YgG>U%)PuHyE#MEjcm)Ag&^jM=owJ8PVS+Pl%_ z+N^TME&C~gAy}6jXBoV2Vw~rGkGGup(Ic3vu8BpkF+AR}D-*08cS7I}2)whbsF_?&F#lHbI4{A*vL=6`X#T6>bnA= zb4MSxp2jSQFzZ^RLSq!>Qd89}d8TJW0M%%yFal6~PcVdJPG0$Zi&na?|n+~(|W zUr4>KGt?%IH3(KVczVaT+K9kzLkg09n)^a9Y~Ffb55uo~RjEiG zSW+oZ6X5Vkd&L|>IKz4yIE&~T*M9*8r62{ma%vX480id}lkBN`$((osdhuv2GNC!4 z(Xx%zrF3pRq87g0n{|YUByi$L=&fBjajnS@B5YeGp5qv>-3F ziCzm7A;K0zT|TZ#m<>mjkBd1i;B~e1RCu~sT`w!O4V5dz{JUXlZL_><>w}KFYKi6F zwAyFZxIU|2G3Xn?l=@}tWak8+vMeRUT`J&OGtei(?(lCQT==*{yu4o42qx(>&i-g+ zCwSkzxDy>ewT+k7`+Ue@Ur1c%KBgtTrk`IlD$8}q#q=}yHc*u4df**1FGlozdiv^)eCZZ%zqRbIsbg`xAiH6rOp&)y+izd~;Kr-{J+yoSI(gx1SWO>V z8v8$=NjiW#9Zz5OwjtGm$kib(iZ1iE#kGm*BO$=2%?6c%guIKJn&;cW>sZHj{^_%# zVd{ab8v_bi_EzI)h|;~XsR3ECTT>Ic(hFOx#=cr2N6RqEn4l)f@Z6Ze-sB@jyEieR z%#qo}&D8>2Eq^@tEu;xB_rlZbh>pm<+3U@hJ_voyT|AYSo-6`B{;8?UQ*`L<{dHT7R_mzLNeL> zN1KbbNxL;Z_Qw94HL+|BES=D_XKux#=`d=uSOzfL!_*imCvcdu$-t&_<1urt{Sz@; zF;m}aT>M-Nn|c9{VwYGKdkunCESfQ{V@7remrd69?TZdm(%zovpq!0_jj%V$7`mJY zH-A(@r&3HsG&+;Wq9PQNh~~%YCCpN-ZwZ$U!68W5%QzSI5E;KyY`d1)^5hk1!-LZd z&`o9tsQO5?42gu}kl;OTn|`YYUEl8XBC(1P#!t~25C}-7+IM176m-J*P*wXO1g*vB zv`ovU$+^N~w$-f$oar!C=U|hLOH^jvdXfk-U2#8YHFvH|O=Wbc6AmCciK(fr?jtI5 zR&&J_V|kV=U;MO$!&I7o%ih+P`_79PV3pD-zE(`~7pW0h^L>DsUQ9|9gNTloilOe} z`kQ1o!vkN8T5%;`#{NuuhY?Pc)3vJ94ulp&!+}80x{nFvu2P@`pEDtFnx=PPecni0 zRda0)+sJrn_#ImWGqvIX-~7p~vdRS3)n#5rA^u(`+r$Zbc!UG7V< zR>Vq@IADGmYp3DqL+NOL6N-gp&`vg1j1|Y}QI( zGk|!k)g(g`_?p!;xk-CDB%wG&WiD1M=k~m;nuKo?;a%)$ERvXb|H&>(p@W8L`e*}X zLB=zY96j4RVH3K@zR+KNat4bF#LAa-TKTILb4k7f5Uoq)jHE=F#)0>!b|sr|ys^t+ z_YSN@;Ct2V(f%S|N2SCR$7xGIM)n?o2bea1K1sA9h1>gJcZ~CD#DTU<#QIC9C*?t+ z2ScOX)lVIY)CF5EdRsds_$XchFJ9`+Fi9akBD3@Ey5vK3?AQ)BSE~*scpw3(y#zrb z`klL;T)Xg10QuQptgp)OQPo)=2~@H-1ltri&RzbRF!TxSQd!I?wk8nk;eZJj{{UPS zpq|pX^r+??%nt(0xm>abGBR~ZYWn;nk_l0C-)=}yhdsUZ77P^v8jESu+%E7t0(%H+ zHAS!|$QjCNW=OkS%3@u234-u;URvpPIAi>eO@9qss;t3Q=nlgcYDwD{sYnHW$Ja1R zH!G zYW_+2^7l)XjZ4c5`Lvd`=D7}=Xlg^%INGUiT{zz^o2y&a%U55wg5 zqA=T*4Ze{qzFNfz$5ifTVA0N26s zm^8h2U64U^@D^`$L(UxR%JLa(#KE3#iB9v`PP3~Bfh%9?!jTbXZq=9u>9 z+nT;L_eH~mZT(Ktk!;B8aM|)#1K)-0Rbe8z zA+E1pkxl)Iw&jHtG;Lju6v2t?4Q%G1t{(#ItJWhH!V~lEVHLMZ{a<2qlOCSEvj^_r z#;05cHZl2Le7-bPA_1MzU!@7p+J5W)ZL4s17@rP^0T+=Cdmwq1lYXz7Ntx3it_&4Q zqZhuj#XXEvm70!?Bdk-NlW%KCe1vVD9Bt(F!91h|RhUnS-qugGiKVzRvbJ~s9(tL{ zCkEETKDmj?VK!`*W*}Y%c!Ptz)zsX!qTtiv)IJSoS=z(3F9UR@m%dp&KLY<0T{&Op zO)m)3@}Y;u6fk0L4GPeTZh|Y&;B(mN_hT#@+cOiht~MozV}1}))a!|cY6aVCr?rnzhVV7EB>j-acRKalX2ybIlA$D|*xjsF&=g%B-NqR21zey6O z2D>Qw2|niBk6yibxm?wf_Yw$CnT4p2y)!iSr|>n^vW}oeen2M{tUStmk<=VR$tdoA zcORfKAnHI^&{j^#ud1BxmR%e(SRhPv>lfu+DU_5#7XaMSmD@9~NYC|l%>m*`NfTZ> zy+96E6~*=s->)k5cpk18T)_zTPjFQ39z#$zQM1EOK1(lZumjL&yxE_U5fq^?T08LN zA3WsFZ!KV(`0`$2pc4dEyk(C*e=)tMcgk)0+$gNnGq2#m{8&I>~R+e9ff&8!DARj%CxrvkE(4;_jRWVCb(*I4Ah{GQXO{3_>?pM7ziK2--PYvoz8TN|Mb&gV zng(nSW^U6aZ`1zXPL&)J#VN*4QSsmDpXz9px}wt7{JJsOg_tCpF8IUTIYsrOypX{p zmb)Zv=I1w>-@!f6uoqN2xJo!B-}Xwh3Z11k$lj~{a4oc>qAofQ@V3HSeq}Y$d`5y! zYN)1cROhvqt9bm4)hI{e+=ITu-Ckmu;-m{GI}{byUrgu(HO>&(B((joR(ZcMn2K9g zkwTasnQ}cvZi4p}CqUDd7 z5)t?EzeZq=EK3i^XU#xQSl>av>Q$}Hm}665W&4&>&F%^~N=|ztc0UCF4**d>uD|M7 zoS`}vJ6C@aNhlda-$52v^7YJ{<6RW5%)HoC)gjj<`bs^rmcw_IYIRk-t_#mmdWR&J z77mEm5P*lJa`+FR0hn6y3W zRUFJ#VNv`nt2eZnv&8qMgyJ+-zE=Tq0AW zsQZSp!jn+hY_U9NRkO$WO^r&q173+@o_%+2(Vwsnr|oR>8)b%3KLD^ErFQKS2$jZIu&(jR#|ay?}{Y~ zWrA6qM+%+gO!G+dxg;z{8LF5#u-7b9cKys*qH>_tmzibVr>a&nnxP`uYA$A`GFzEC zrEHq=$0XmXOHiGeNwVuiF3<|O-35PUIdj%0s%NM^tKuL7RkZ833R=}B%RLQyeneHD zI`~8=3RT8LoPnP)$+e(5=;|5atD=V7$7B=5ceV~Px&ZSl3PH{N_YUzY2n)Y>yRP1^ zxYaJ|W*Wa>d}q{Fv4{nt8Qgz8uZFlz;``6kKh-qUfI?Lk!o_PSPxh}YX2(|+i~UQB z#qp)ZinbqgTDXAOG>JYuUR&aqY|Tud_F@Fu*R*Cr`CJa3_}_r9xE~h=Hpx<3mQpX| zurA+!EkA#>Q`u%o@NG7mC3A?wW-~i895$-(gZdpO@|s?JMD+cc%}akRuEs{xx%<*t zHt*{bBk^X4@#~45IQfizgSm5MPv|DDHzE!gC{=tlP&9pgIwAs}#6VsFVb6sg$NP{k zfG}v?&4g=BIRT=X;DR6D$FHJM08Ul4+NLSH1o0^~B~j4vM);@{Md$)5qv}leS@@T0 zs=B?-6u2Y^Vng3y)eV0P3OTz{QfF?V0_FNj(|siA>rITlO+Qq2wuLrE-!HY1_9v}o z6Md&4TuFa2glDrs1(jio5U6@&C zac9yptIl*bwJPo`TFgvB#^Gfd zJcV3UUN1v&%Qq)JIMl+P+*>?Coj4B7&p4E|`ZnV%%?D*9^+ZZxyN9C?y^GQc?y}rd zjMm9D&TzwVuAm2=00y0&b~Pbd#xfoV1J(vdBzMon4_~O%<4#cX#vQH{-bvA(vURWm zmqu0A)Ku3*9gBZF3XJ}Ns10k;q1UJxrCNK3*rjCP6bL1ylQ*64$Mgghhglm@GC?+_ zCD2B(AH*xMJx5>vUVP9+>iGVdaNp(5w?gE=Q17q`7hQ*CD7JiMPjlKFd|Fa2hDI8S zPHMY)E*gI^tmuS%-muMYD^EY3}$Q*VgpTa zOPa>%>Zw)Y-n~?Z7p5xkwEX6kXTB6GP$0K4-4nC`kaSL{ek-N52FC< zC%GO*@nL_d6<_@X>NwfO!O8jzt%H>R;uWpZQzNKXyk7hX!1MnbV{`GbuqGJUd^Ahc zIk$*?OMG0kBunG{kD;hOUpXu`^gzTQrGM^SO_Go?i>@oe-$q;^U2ksUN-;NA|GQPi z^qgM37@IbXt&3~Yv|daTXL4n@2zoMB*^^O@i79_222oMFs}(n&St4FcUm9EQbhpU< zlZH-ALBgX|lJIcXR?V-jtzzm4@%OB5XthL#)29;f%%>vtlm^9Cw>z5cHe5~9`(7!( z-Y;cth9|qz>Nu;+wBi%)8FT#X&FNda)}S^-7)%$omU=5QL0iU&A%istlVu2Mx6q7j z^ud3oaqev0hELb_6p_FsnRRIk)6lb49U$!$PG!E{S5_sGb#*3m)u=blKfQX<`?kzc zE;OTKEu7RpmLmqoYpBD`-yPMfv3z`alovn8uG8Xkg9;B5u?r8Lr~{qhxG5!Gr*ZBE zvpV8GrdzOykS*(QRS#n~JFG*@JtGq9HE(|odi61E#+h!_^0YKsMXXHc5R#gv_9%lyD=DS96Q$1mNc93Dznw3IDgD{Gtxc^OoOUm!){V z&J(W*B+V5*Bx{%h7=^T(n?^>LC8)nI?B z%Ajf5XM-^))Jc@lh$(I}ABP!^!aPF9R_+T1NNV~5JSeEr^H9LI#2a;#)+!3t1~}`q zs!#K#srocCF;~H0(-{Vsc2H0622Y^e%jS6>=m`s#JkGCO3u--zrz+^>qp^Ar10N{o zUWR_Zrb?n7O%;YtwG&p#=27L&pgg>K;pT%vpS|nu#&gFX1z6WqWSGA=v`g_cBIZ0o1KaI9E zpIPdQqE_mA(JP?~C!;36Fzcos>KPU<(6~)4v2vNUoY++@mXPul<~}~DJp_Lp=D6X+ zcoSjj!06?DcB-n(YG(PRl71cw=#Y0cu}q(bow`jnzO~em5cMey^c#5g>q!hMm(&px zpT^f)Okh0sX4YrWwhU~0U{sw&DW_j)@wT##v!X_`I7eA6_geX09vu}wqUz$h^g0Li z1fUIDO|7egr6FRm&PKh8)#88GJou;6F}JzX`xqXQKW95neSBD!)g z2~>FlI9pt%R#78{7x4&T(0cJ%ReCGq15?cAy+ef?3=lgUx0o0lc}ah8xR@vC;SYyn zd7L3s6}%k801LqY|Hgy?VUie+fagHp8A!YyAo6G*aK_59ce8-0S`^{rwe}S?z!Pkreq8?-B9B4)9N^)hS2;^c2xFUJav;ibce9JW540ql~(9 z*ccGKD*miaKCUaGS77X^6!+%25NcWZxF4IfQ0}23j60Ls7@PTAN-pzgv^Fd0h%Qj3 z>kNuJgYQihZ}yr*vp1><^Fx`Gdzg8Zsp^^_G1W%1awF|G2dRJ4qufaQEf!O~Wt9mE zyC!T;YoyK&b=R$8nld^99x(SHU>hCum8O;EG7E2w94dcG|Kb(O&W-5HPNv=^)k6Q` z$$SU^@dZm)o%jbaQEeF~qP}7@ZK~#Ts2|L$wCl#Xx4Fu^oG}QObO!3-R|g3YW;^YZ zD5VB$fl|FlR(5~RJau>CFNxphRt4Wo+%#HUMi<6ZQCua6*QRSG5f(%_qjsOV_5Q_4 z?3!ic3vzOW!x*i`n^=rx0vUnvHMm}`+c6AYGuI`{F=g9ms^dyMzOhTs{OuFpEqz3uZwQ2F1k?{-Q%fN zO%N9s?hb#e=xdtOGxJ(a%bQ?)6Jbdn?uF!CfMIJqQu8tisu$GPUh*hS^R*bI(og

{?Wt~}@2V{fH*?LXV z@rhafQTBPxfg;Fm9%^w?#=xZ!3vRP!+YC`}>FN~3T(tcMFVaTSs=-0?szJ6t%vyOCi8bydR&T4CL)+0|T)i@FrF~__%0aY$@X8@{jDy+LV^`AhmNPM-1)5DUdKDKb#_8K7q6L^ zvzgae-ZY(SR!218+pa4$C7B`cM_P*r`9FWnw2JB=oMWHj=1kG!b!l&inmO5|DL0#W z?JAXTGu~3-yn%U4`QnOWk0|piQqtxd9opB4bT<>iSzKla?kp$5`vE zO|bGzY_jm|Ti_epWaI0$rgZgDa1?a`s2gBSd?cIhksg!J<%p(<*wGA;V+_GCpLc&k zwI-N9c+>%(5?__qudCI@a+qw9UXYopHdA!q9cIJhW~#)SKQ2Ppo1FY{v-#s@JWVv9 zDGi1)IgrXDb=G@qFrd}j>(fycn#`ATpP?pH)~qJWIiTHE8xd*j!4}$2Tf}}^VylA} zm7^~G4iZXJO+PcuHSHuOM3oxbGw**;x7}%K8mty(I^|{~%-T&L<}X*RXi8UlnzE=X zV5!S!GSNNKX=$ZpMw9s*)2b}Gvx)NJq@|UXgBZP6Y~y*NMD1o zvGLb?vp9?zhm!PaKZDb2iT(dG_a^XhT<4u&U45VdHbD>sL5iZ9)PX}Fc4|2cJFNaGpH*;M0xd$p=q8_4sKY6(s)8k<`zVsN|K=yrfj( zspP=ypYfM4712dnNgp&q6f!)QFxtyE9}sgXN#+%N6vvje{M|#!&UAmmG98PoZd2lk zm2@&TvWoq7uNfIwl6IpJT52EJZsL9fi|h)_t3_kc3C|DiX`zbVe9|MtxmKQHED%7K zlDr$B_({$8e?8oA?PNM&DCX6cWF=usT8@MSFGWVyMq}_Dr$eK)4U~$y=iYZ(OWc+B@RdS0L_SB3->@U>YC}j#vNU@gk`Wn z;3vKC*Bn^6Bk0|w6j?cvFyN1wd`bkfFrVj8n4iV_zm4=R#nUa=pI=q`vr5FR=^ z*Z&?rK7}8@qLQl#&!gPZ(5Q+2i7-Dv6CF8+jg~Niz;Sm7!6Sdo7#^g@@3qoacPedd zTR(hHU!t!A@6vlq{1sxglDc8Vhv9>8)P$7|xf{TDbt~%e30Z9)ZhS5hDw}?9BUb|o z@%4TnOF;5Q-NXXA8EiifGwJ-v^V@+SCx8Q(s2OgOtsAbHjJrlT^r2E3bF3py+Zf+4{c$6OO=AV+xPH9(W~y>H@biKtY6u^ocw-D+W(zJ z!MO{~@zK%YqwMHl=)!x$thSk&971R&a#i>-OLJ~;jOKrh`N{qHS!}*0!K>5(D>K&Y zJ5ffR45GmR$9=Bo`G_2J3Ao;_lk;WN7mB#(44Jl+Y;>q@WMXbr_aY@OyG3$3x2pRZ zHY8~?eo|HXs3rV}jHF{_O-DE}Adz(lFb%JfH|;WgR1A!TMD36k4LLD(D4(`a-vzVc zmgg-Hra^zWzJf-AmY)T&nx59JeuL)Mf%91xIGihnf4r7JalC8+Z)()=fCFY|-NyNd zmMt)&6MPr30L9(p6`Xr}uF`q>6)d4vOMyTx+#4`8>)xuhdg2;vt%T1TbMB&6g{=;ljiu ztRYkjkiiA34AiO-Aci2NBgR7jOEEEDEY)_wLOiygG7A+D02a2@FeqD;CdwxVc%0N^ zM=gKOMRFK4hZXTs{~n+R7Ryx(SLq6}hiQ0V67=Y$EfupP%-MoHNjbOo1K<*Y6+fa*D~7{C@3O2ry!Mp4kKpiP)7 zkX%Q-QMg~7pPcH(XxF5phhh!S$e^bsd@L&(9|8ivNfAww z)SQIC5$deb96G^+^j_oIQgUHYLrK^o+$)k!Rw772uRuEB4?N$OB$8lR$u6AXRSO(N ztx%F8)SODzMaB9BOPMQJ zMsq7sW52Q*1#ePUsGJQ|$u&M?iQRw7#B#CCh#f0(mx|}VMlR%U!i@JH!Ot(sI^nj} zyrI2LYRg({rMT2@;>X{`RN_l|CBBR0{DEH1QYWIsA(|`hnQ0J}Jim(A6Zt%j9nOv~ zD%G`v-Qd4T`k+GjlK-c8m1O)>+98)RY##Er_`obS(xibcAg-ZYFPv>7D`$V9_}xj< zUi|1*iFqL4j!G`?tm7BNPsyQR!92>;+;73v&s)MI(Adz2D1xxFJ0wOq@Rv6GOy{k1 zqDxps;y;Uwk1Y9TIp0x#Z&8jRHXtSbhzA7jU%+sxvPajg>A| z^J3Tkno_XgJbkN~%OigQs#Lu&X$oG5B;ai%gO9}Gx%)E6SevajqVZpJ#y)Mt)n*w& zsrv3VQbv;GWwM_>)P~#;LH2S?lEguFvdCcNG)US028$}#YiWL|e6|+!ToyV4jm88; z`MRa7lhU-#o43UFpZ41I^kKEN5B(b~5>an$@4mkdci-xYLE3+gUD8_2AM!*>V;7)B zc1u}*A1>=O^c?BLQi8bCp0Jcg;iyJk+sNkga{DHVk295tyHl%@KufcvlgxDvo)BO*An>abux+unm8@q?5jHq_W3?2C5iNv{5jtPT_#b$ zNbvB0d7MSeL5kQQp`Mud5XU;~3yAt*W~lM}U#FALNX~zqZ3xO0o&RmkkSMN-8;p64 z5YNpdTJn}*GA$!WBLZ9zxYGh#F(6L{i=?FpEhhBATyaXTy<72wg)+xerqi?b`cbdI zy5rag45KhCs!Cx#g7eP8B^ikVPupbC&22|#F+fsfo{m@v(D7jIr3DlQURr?pij$+^ z%y^foG}nK5ZZ}M6l!{t234oB6)%WkBSxqC=Fl+6uHP|%>=v=aFsY1xG;a=MAA(skt zr(mn*Bq_I&rvH!?5fvb0heJ_Xg!ZarE?9V$1=}xd_g5{~B8I{Orom=5;;QL((j5ox z5ftsq9ao)KOkgD}a&Aa3pjVE88~mbu6|Sx%Y7T!X*6n-(b}Bocgz1{Pl6W1j(^stN z4*1U0I&tbRB1?d$DP3=%P17k-QSFjltR{pSpVpK8(|(~`MPuHo?vpHF99rKV5rH-E z1fL?csKfXSWBS9*VrAa13UP;E{O5$oLyH6?9-P|YgIgAY!(e&=lHO#kD&h2`cW-!x zvKN1_j2luYu{az`Ql%aH+6Tinijt@fXb;)MZ zunsLF(5`?WU>gqBf{eKXT-ZidHib3!{xK`;KPVrM+Jb>J(rG^BA=7m<_2tiQJfDBh zg+XeyLwa#1a>t_y@=3CdbP=E6in9O70jWU3fKCl*G_!*#L@=+Y4zJ!{vt5uSK4!Ve zj}t1-6(mDIL=d|gm6hbZOfG)c(yxS?ty>#+;o&aAqTm#^=O;0xMIiHaE*!1qjB}^G$0s*X)+wN(G?|^Z(MML))~njJrh| zku;K!D|&voxO)Br-u^Y^MnYngTB^GLI_e|J^iCrMU4phwu&PgD9;fi*41Ump3^0uF z-h;NVw>DB~QVw*{TFkuVBpiRc%j`#1)9ilBaZrfBwHm)JW$%TKCoSCy<2Di+t39Y8 z_!tmyc9q51}e7zFxte!l4I?qPdFhOW{_t()by<kV2Cm6P)S9^f zm#48)2qJ=9o5Ls0Q??Q^9W!e;Z;ET3IEEzi=1}=c6 z9xt+*8MrGN?8|ZpxPskJumj|ie&ymN1h?SPB9h$2r=5bV+HBSF1u2L4bxR&)3Yp`i z%$3Lf#qb26wj-kdHd{FV7+u|b0BLn^?%k11brHYDZm=0M-cJ8OoS$hYF=OUHlz-(J1U7lBn(o5HNCtjE3|-hc<0M_br~) z><&)Q;rN-5!7k9#qnTULeK8rhA@aOlM~t`ZC76g`(6Fi^+%?Ej{=K$R0`y?`5VLt> z6!g0?@*j)$H|Q2t{?n#FjAlmY19B4)IsK2>vAD2d1;d>4-@|{#T36&$moOQ$B_%n1 zYY$<%57^QpAraFzimXLp7?R|&hy3Tz{tYA(_Mx*umH_D?51iyQ$`)wwi1%zIRoG)~ z)@sTa4Cw=AfT5^d6DT9PWFq*6jeGCwmZFjZtqQ2Y6}9C5NcvO>W41zeHCU7Dmw(z^#^>ut?ZD@2C~m1lx_-g`9kJeD+$Y#bf7}#BMLMux#V^_- zgdaMvq*IwxCSxr_gl`KGVYK=fXZaWjahguGkr1OLMhAZdlZnLVJEj0kgbxvX!b(R( zj=WW~7xA|v&$|-La->nFqdk=xN)|U{33JtoCP)7&AV*1NCi+`qP6X~ovC#Dg1R)}u z)E+{(Fv>ged)fdQ@D79|!fPbOh`!?5%!pIvow4S9$B0D}F%TFC3xiFz)P&5=FH|(E zc#eQK*i3)W-qN&&MuFfgS+v|M^zMzzh{vL`=kr~`cw~Xmk>>tGdP?JHb}e&1WeltB66Hnb8xeoPGE0|zH>gF zSa50>O9OI!pOl5|Yv}iF)KagLBWf)LCHyViNq>K&Y(_u*dfm9zLFlfD%h`H@l!_n@ ziCSQEj=vPONNBZ4E>{c95R&YR#+na{F-2#*)^SvuyL5`cJr}tJy=QTMDb_}tH;h#f zAAw_z4CqRWa;~{C$V+-6<(iqC8mi_t)V9RFes}P?QVv#`nITLSF(XNs!7UIAzgCaVbXJ*CJ&5HY5&F1FzDNN)VNo2B>L=tuUq@s>d zG!bdmPfIo(%1ov^VBuXQKVHc49-=;Y*hGJ@Rv-vXOp=V$=){1U9!KZ#dksDTnDa}; z34&#TS8C@l&Ms4~go@~8%SZ|o?~9@d5IR3$-4i}M!K)KkIU#%#Vm9GV6J|3(9y5UO z`z2N^AuFQdR3bNpLg2A5@aqzdj$LsHa3Zga50Olh-}#;|5iXBySH{Ld7h-*ysRW|swj8OL%k#`m`~ zH^Jw3GW}htt_1wafATs_Hjbnmj{N@nlIK#kFGb8Dmd@FrJW>VjAut{j^U+%^i4DA^U|K_rWP&#d61XV zB7MeP2NDxq1KI0()*zf7mZ~hm;Qiv!+$`*tvxv4dKY^ZO0(^&CBLg|oaRz@yT>&n3 z&iBxg2dIHxo1e=JvNLlK#5rHAi1&sNX;U1E1c;a7Me<(;f$TWhU~wjawUDqqD*Em& z^cBBE!6om_NmuC?xPC9l3LPxXb?3B ztT#wJb^4)Q2RM3if}-^`5>tPr!r5x0W4<sN|yVXjDMIPvb(4xNKAbDxy1 zExcsA)yD>@2plWi9maa zYHW$A(H28Hcy{dcGWEKPSUEpkGZ5x%8pI>NmqygN2F$>8@^wZ^-v`f9t_UwFk+QkI zjig)fVY)1(8`+~(v|0mV&m^^@otln!mP`3kp?nst=o_hH?>heAsRvI7p%+EdBxFTY z>vl--!Vr4vE;E~Q%q4&Gbnt&i5HPYs5%L{G|7rPDkrQDx9>H$5g^!XLmfh`L+(MXf z_(4b@KZ&jcZO>-L?y|enVWRiSYyF3R90*K z>VNsGUwi43hJkv4kc5?hPgc3F;39vNa*3at7OkQm37v!(U3-QyeR+4@q??8fol*-hhpvzy2J>0Wnf%k0+i8%*PJH~iXA z+NOd&_QH0t9kzdqpHMI^*=G&dOm4cC^KL}LBzmI<-qLqQTZy1gJ3?tIvA zH@ST;8*U%uaWjT*ggY2o({TIY&aH3D7)jQ)S$YzF|lDIy!Nbt<9^6mi?g6iToymkFDiJf1mN{6Lk}p|Hcx&HHE~64-95 z{Hh~46gWmQXnKT5*)=}5B~NGAqla@rv_?EA6j9yO5hckQ=%-Dmwv;L`h7oYhyJuTpL}yfz?r9DzmHz#;P5w%p;qVQ`xDuaAx=zGm~E9Dp2Qe?p?_0crNPc zTVEyXbsq+Gb^^7Qft@j)J`}N+&>p4Wx}HnjL)?TLmk~R_7urVx!^O=Lin)y3!Eg(Z z=Tm>Mw{gw1=#d2<&5o!DK3R~hp|*O3Y7u9fUICnHoY~`Ot{;&ZoAI}2L-*UWIYlsK z?b$GVSyV>iiJn!ak)SEn=+wGS4>Hu#$ zmnstl5V2bsD;0qjM%dwK?l3|90cJxe!sce31JRfV#6}l&$mfR@TD+4XK3Y%3iPrZ@qT4bCWy?Jf&KIVU2sv?#}q#QIUb7Cd;qWK`OE05sTDKxZ}X33t; z3;KwD0ff5Ou9lRE^ZEO<*cLmYDm1F6M$?fIfwrsy{f5H(wuW8`^g0;7^04CREc(5s ze%qv1^8}(3w{@H}F`bmhE3)H`8)te^q#yulbBi&>t{oW(mUA~tJog#`xTb%#5!kxp zhK?(-GqN_}USq{lRHtBG4``ioe65|*r&ohQA4T_yEqf&w?iDn@6@Aj)BmP4XRmZM) zG}IM0N7rGseepPaJfii*<57KK%D(7sJB&s#v609>UM$aGq)~E%r(hEP!>!Q{TmAhSF**RWfI_agn^pq_$MM=2RLB0@pZr&lH zL}Wyih)#E%n}zQ#U`D&$4Ul4;yUXoyH^Noc?R7W7v-Mv0^oHpk#~AM!-{|(ao8exs z+wX3H?@jJj_XhaxqcoexH+%hy#`qR*3zWFcy^$i@kGeOxIk>vP+qQpbxI5gPbZUR2 zd$W5Byt!Sl-#2+Vcegv>4!#T%W_$;*)WaxTxZ9!I_mJS-913h6T3IM|F;ix@)UlzE z6OK@|J%-(f@o_F^@JxXC{3GJz;1OZ5XVLMLP5!0!qUqo-LqICn`2^Z|7V%z6oMIT$ z={kbWTOT$}>EizbCpdpz2=MA?`cvVFtMOK&44=gQIBg?0l)<2X7Y9 zqc8VZD^#*FHzo%?|3w5C3oPyRS#&5j?jO`&0ej5;7l*sB5ON( zU?HTzGb#VkdScOVL|~>v#sZ!MnG30UYT81;jC!hW+AvA#$-D)BHvBpDWIYX6@V#i( zQ*htru+|tVPmJykI=KbW2>HK!ey})_yEK$LbolU*T*ZB^c;@gWJk^{ajXQp*?jusM z)WKnzh-`2~ZdiYS*mojFA9X6@4pJIM-tf;F5?!M`>|jujS=E6F>^f9u_rYJrY;F#B zpn9Y21W+l{&@ZG;rU7JQV37HMh^jbEVV9e3k`loJwDJLsmRWY9yRYeXjg91+tfAd-llQ6+!B6ih9QF_BdNT6;#l(Z+i# zMrlx-7~?)aO@m<$cy8M5;T!Ir?-G4*1E2DPhyWcR+K;~mEA9}2rRKwP!{(Or zfTNXc)N-NBt{5891>3#0Efh-ljy2_Gf&VNwTiG0WC)A|VvPu5?Vs`hBMl_&5+<>60 zc(w1a)(C$`U`*!;dmI({K+hAbmR75G6q+HB)X6N0CsVQX#bN8m$?W11xJ!R7|Np_J3DW~>`0$;G7>t#_ z2S-XRNlPq7D{qzi;fYO8c$r%8#KL6?cN`*viF$wXuu)51L(r$>>lP5jWIZ*-c3A(D z?2WQ3ZO03_L10)%Scfo_n=7ERyYvdz_O-w+>q$t$e)bAB6GXhnPdxN4xm!)K|2J-Z z=<^Qp=0l;UQ|R9w>|@Q1nr=eI2wO^PHs%r3mdWs|_;C>zSei%byc(`KWj^_mdZ!X` zhM9i?5`{D4b;;fu3HC&hKr3l0petl6e4;2 zF>6}IMWHCn2ak`U4;fQnjFl)9wXER_G}-Ws^|R&N@d1huQe84hw)YQ4tWk1I`!gf3 zy6e{Ki4Rv@!$ZeMX&<=WD$+|($K!u-b>w(if38(Bv=`9RRoC*alC~k?bmK-Bx|ll=O`9Li#X)ZfcW{E7TKG){FKl{tFz!19szfzZ>Xh~ zOpAR5m4VImExSm&RdqQ0Id^?Gcl{~B#2+$5H~-iP5|yb_=v<}1T}6<+(rqu)XCj(-DGrHcR@xKqp#UspAm3>81F;xlnT@F*FAYt2T zN`!gGY7g6ZV(7R&0}UGZ7gFzQHo9j`S$$*9~cbBH}qJ6oT!b;;XlnDV~es>QxAy&jAEfTU$$-YQ6cwY16EL^ za10B?)+r_l@K{Sl+|Pdj-(R_q!+W?ADlSmSufzH)A##%p$Zx6FMi)Ko^Th z5={ySfLuH9?1zl=8QS2@=DUv(%C&H2XxAL^vco`ROz}oGqdS!I+ zdNGK@ap7FCgxf~wO{HiPryD^As9O|S=(Inj$0Fp}{;C$zykWzPq6kh68*WGe(TkW) z|A>wnYRLmjy3KzK@3@>J%t-c*WWylx5xBWk&8$p?&MB$KS0<&X>SN%hm!%9&(kVwK z|0(?Vx6*sCk$qymhSNhhk~Na7*CT&C|5NxugzR&o&1F2QNiy@n4n(x}zr>+l!l#@Z z%kaO-rGzn@fJzFlns3Q2iPV#0KYx$3+fSQLHj~BB0@i<9nQV4lx&!{DGMh77(j8q^ z+M$0|((1})GO(E@)2Xy$nO$iSff+6H@^m1~N4RY>H{`9vaD#V01&8iQ-yU-97uj&b4GQQ8X>q(4JdL>a$0*jHjwyvHcXro6E z%kWBKGvd-5Ur5!mm_rSfOTSoK&*2U@_v&xfy4`<7J@ql^=tgDvKLU4?!QJye!Zjq| zriZ9zRFhX>BxF*YRO`iOwO&lONa&P^=UCf-By2jR`j~RKnymHVH;hK7+x5DI z$1Q(|H@VQ^u6MhyZFV=fJue$qMC{|uhP!dIaWz%jFx`JO4drd9^+2whrV`I55R3h) zNjST`^^T7j?k4)|`*>m@b0zI=t{XTGZvT&43!Sws^-R5!^tPSu7AURD-HOlM_4Llh zk04k0rl>z$ zFrNJjJ(SN-y=Qtmw8F0US&ToHr zgl8tq@ZMUko~-vSTJ??f)FI05t4J+y6k_sc*{PTHgf3VfP!y>;SBW zw{m5+gLc(q7}aJCB{rBNM~>v4tQ3FCwcKIN+G=os?hTCOo*TFbp97Z$&J2aqj|%di zYya=&96S-$GSVdyYZX91a`uB4@i1dRE>TWmY)I@b2)}yj3d&~xew7>68R|Kgi}`===G=UF zt}ryMcC^82{I-0md1K3($7b`oO zFI17O8yt$rZ?aN;5#==EO#66@HOvzP&g)lh3a zAmf4H<2`$Z+HzLUhmd!oj)s5fHX7VT^wJtk2(MNRn*fGN-m^y*P4}DTNYl(U%zSeg z-PncO97Tq~m&I=xy@ls@wRzVn(lWq8(Zz@a@Z7H+%r*Bc^WG#og;6YPF`eO!T@SS< zA+u~DU6(mHOLem1dystRgXKxKEkmAuo&z0wS~&-EW6i;bArr!hk`jNpVCyNSoK~l% zInXftpMm}V&9~q`5xqS=&V7J9%HiZc9uAReAHLO>k);~e=pKJGLLLZ$-G6^5xYUgS zp^6HQY7RAfpfx$<6fXcHpC^y*=C+}OQkTQ57(Nycp)o^4jm{w7Jeu4E$ylgPi5#1o zh1^6g;L!|6L;_JZg?YQi4OEjj*UrjQOA8M5Nxj%sMypDEQ*7IYNK zP@R+s+1ph^Dic9o{$&t7wU>}co7*CLNF;BrJ1I}KsGIi5ZsO-;QL1!~g0%By4XK3! zG#1q+z&1cEl0JW9GnqOycLzllCq49QB4rBp5DG;It1J);n2LeONE(O{sfIv|Lel+A z&FUD1C`|pdrj3Yhc$C)2)R7Xq2?py5DZJFY%RL#*y`@|TNqq3FE45$YjQZ-{IKr;F5%Z;x#9@#az^Y!Enlk;EdWWb(h zWvEGzlX;dasjpk~pSt7Uhi}jVde#(U&oMH61OnN7v{Wpxd9)ard9;tpF{MnSe!5uB z=a+8tn}&aI`Xnb-ToR2$6?UTWOB>EKFay-ohT~oICOKqQS6+1k%w`G` z2rWWuccEWp*V-P6AcH+V<)aMUF_o7Fycj^3jh=r{VY1Z6ke}pQ{|we{JAR-hhGHn7 zb*opVpis0CHnJ_FlZNrkqe{170`;avfFU23A0vq#(pb-`;ovpW5&WLQ-RYost7w#F zpvQ~hpU01B{GiI7z>flcJgV@SQPp-2&c_hi6WW{fiKlGA=A%#iPMcedv zr}%{v31(qQhL_X>7!xO#m*sp_sqiS&h5u6=U@W_PUd4epKZcKGfgA>SC^$QGO9y~18|ld#w9BZ1x+-z+RO``z2!5%}JM zLNk1CeFYjhegh219psGn#!o`m9AAY84V`}iZ9Y|jg;Hd$ngS~qauWqU-@{-M=&S=I z2@*ai#~Ce6sx=PiP}LRYq$?NkEsKAmOqM!gUlDs)AdXLh#3sB#1_ufgldgv!@K=~9 z3=FYk1y5UMT|w;ST0Wz*m1+$kdS@$TjBVK_M=jd~JSmgspm-4e?;HXK zd0+yr?x3qlxY|E-MwL?~KkUKDp;(EPTyW6bX}(-U2dr=@R0!oySr54Q;SGNT1q=*~ zBAFhP1&zx02Zx4+f&x^35c`CFFg4N*2$e$t|C@mSCMPFd*9+7R)%jV-Q=V-{NyxQI ztx%#c6wn53O!wZY^)|NSOfDC%7vNEYTuP*}g&J`k?o@e@vk|lcPcjE!l3p&%4jc^Y z7DzKL>L3Qbtf&oTG&(v;i6?)b!>rEaZa z7X-91O>+<7uVnM?4ipJq3G5GfM)EINK58v$mkP`v+rm9yeo`%2Vj7H(9{|WUYBzXJ3Doi)BxBrgTCk~F|;=}$#W0J(L!9mlLJGo^J3TG+`iZeMc@yr99(|z4uM8o zsKk)UC=!4#VTaVPxy66-2&tG5w^;QR_J~e4_bXz#R}s)XKsLFzLoNfh1{5sZS?JJ& z0Hnzz+HN)bf1?9l){k#T#DGgbQkF7-6dWzMjBLLx*l%zaI?UI2Pa_{mHO+z^t z1RW{f;FTgc7?mCLvZBUHSYx849c;D^@KA2KbrEW%KBXh)%2|KJCp=eh2ZrLZQWGzd zibiGn5{&D?+#R%89n9@p7+NvYwvK7dvTzu(n>f60D89+zEN235jA{r78HB2Ng!v>) zf^!mCN2)o#sdOFR2%mCd%55r^V`tWEc8j_N-Vd#Zl@W*^&Aq4fC8h>nv+6k(taDr{ zf-~L|IbIG-Q3q}XdWHwM*H&*KdN?g{{vx1*s7nyJ))lV3F1Ull=ErU~d$ zdy>HWL&@eh$kmumFCv+wHbyVt|1r559r2nla3wqdQ9!Q0ST+|cV`r#{>E(b=k_N1i zOGe`j{la9y#jk;(7G_Vq(Zqbr}T&S+DJgcJ-p@vxzVoB*+Z;$b%BNHY7yXYu_c zU*^wwg}L*Mbh(7O_NuZ?|HY{B)atie1xV?@Fh0SUYH8XuFA7JG-AAvPH472X(ei%L zVq=>(z8^9^fy)>e?Hq@0nMJfJ>~@rTy^H|HKJ&)3ckRAp#-Hhc1+dcxhF4)gXN*nb!7())&o z_vMCj`-g}3!`I%shllruszmSQ<$D?h+Xr+Dwx)x*{je?FeK5CoVW{Or3?PSxf#D2E z&qLYaat>v$HT$6C_bZh-?tYO*%dycv-|xzBnWxA zu{6?o;f~)(<#|3XW1=UEI;4nSZ$O*n!!`p=WgFW?tAw36$OG0IYu+zkmljlffQH9L zQ^04stfy3evqjc>NP69)qIDy5>In%H;<=)%yi^a z*H%xD!{nca$)C_Bzw^egSh178IzK@u!qruOECJd5$2g^mxx#|vgomcE#17_i4^%in z919`LT~+35eC-GGk?dz#3Y8&>h=S+KSn=w{@u#KP!XVt3^+7)@ZGN z!!j1#fX6W*szI(2LCQ6?dAX5c?= z1!sRd4lsRPykQF}eeKoE)w3oeR1#l`ofy|{W;G<#;*vj&QJwtji z$PqhpE0@@Z1EQk)Ycpk04tsvsuaAO%I){*@MzIw{t?L2M3DM(LLX6LUT1mJte7Xo3 z?SyR!uUP8DDR$iGmW~_fo^g55wXT8q;iB*el#@k}1=Dq8qyco}cm`5BMlGoURwvL0 zmK;9PWE5*9jdw$;XBqz{Ip+T{RUS`RlehW@bGQ1<^sUvwmu{^t3^g+^?O7Oqd};3v ze_;srvEao1gQhq~rNEVl>+XLBZ#_st8lU~sV9Rd$bi|nB+2PMw$^{ScAuW*2@R&|l z35c_OtHqgL9iPoHuN2)(Kqxu|{tjL2ht-sbkd17ZPiB9Vq-L7`duqb|2^}z(y$j4pv^oRl^T0mk z^PjT>Y^IUQ2v&l_oZty(#%!(+28q(gk5TP9$Ebh#F}fvUj12!#ST9b0ztJ*IujNk3 zy@?vjdej-u19`Drx+EfIS9RmgsLi}>7-86QyF%mW#tvls0Q&z(D=ET)K1Fdh^Z7qo zZVgZOV6a$i6VbMG-7R}RY(L5~% zB$hegw0#Nhf z`A)>(CG+_T5G@KU+aDUcH2tY1lnq9&;x9LNC)YZ74h&u*a`1RaUdf%H&h1 zmd!&GazS0i!hn&uZFM6Nw;VdG$mIasc0T`4ia~1Y(hxl=x58?FgiJ0*s5dbjBCBE1 zP#^k_&?cy#vgD#}K|f{d%tbs1^u9`J9sM|9B{abRhnC3qgr4pvGkKoNmt1@1Ve z+7=6ZpVmBS!!sT@12()Gkk6KXR*wXd6xtn^Fl|i$M4|6?ybQ&&ViQh?zUWy2@8o9qflGo^cv|P~qUqszPBvNdCi#0%?(nI+! z=!~{%;P9N1?voVGxfce7a4%eA#?c~2o52CblI`DNE;nO;GC_3howkbcoWyY4!>VI& z7tG5+iwexWWQM$2JIj@_OwL8Ol$s4^nNvY*tRCUS99?#saa7oe+2m1CYZOK#VQew# z_TA8fFjLb!pGngB+=()o{E-GIN(ddH&7UAZasOX_%WtuaLF(4>{Px3f#4b4azE0K- z=mYV~Lsme4AG~Gh1L7tT3pSu)^mTNjp|F0m*3P3{M^7JErl+eR1`B(5%`8@1f46lg zp1sF$UCZ@&^madrL}j-X-J`@$-LXuMwliEIf9QRBkLH3Nh5ebdVzAGo34qON>DkZ7 zo}FKoU83177$!-JuXp;^*ED^X=b^AumlCb>He+ghBk*{qvR`~NLok=Xy+_>ncm!3!(0ziJ9C68l2erNr;Qg%2F8XeWMjFmp9(}~QwbiZYG zb!K;DZb&<6yDO32n%)Tidea-y>2zm0m0kz`*2hPU`&3-$P6tu%$0^sk~M1{TfnbzYW#V+_FcdSSTQ?RAfDa0khJ)g15fHnIUL zr05kUteb=hYo9P--7HL4`-KVX7B>yEdx!#hyz#5hDY>Hoe*9U#GCx-hK;cn0RwWFq zka10Q2$-9*9^Rtahw5)>|HJt5Bf>n8j9U?jM+S61=do*8=@Kp$nV)WwT0~_eG8zPb z7K%}8i;TE6H$PD-P7U z2eVZUuuB%kRKLXC6s)vgF*VryAcI%6f!h>WL_9)VMnhibM%Ao%#Hoo&1$c!Y(#q3E zfuFXOrJ$yEDp$vkk$M1+UkEolfk!WJ&;GbWaZ>%=rZ__J5AgAQ#7PN7VT_&C#2WpG z7ExEPXv7JKoYHC|;D8x_Y_t0lmRwoQ`;@`1+607lLeOqGG;Hs0rEJ zI20#2!tCZ>+JWU{&r?~jSkziBs+=$i z?JAP~4WUrEd7@cX^HQi;T2r99z-b5@1azY)l@JO2#bRZ?N^ObQuo*2~ZPjIMlMc3L zeRo!^mz(qX2w9>7z0oJn6-(~FR${S(q1~E2swY&E_?XkZp|N%?9NiBK47yM!(1etu zHOeF9e?oMy4gN88|etBL?fOl39$Z{9ps5jbz*%-EKhang=sWzuwoPg3brd_b1D$jCXKop0BGq%l_D zcnTvqlK!L1T}S$lth=7{9~g!O1G8Wd7IfX^AS|c>*+QBRlXM_`FuGeQ;$^5(3Gs(f zrN8-qS{rKod&~uEK^Pvn){NutfoC@V?lU-zf23}>4ubZU_qYk}`c(xz**hi9A|! z&yyS@E;ry(?uDxEyTg%GLZQkCXxqPuf#V6n;1ga#Ome8V9g~qaftlDKyGY6W&6@^qK^s_q zj^B8gJy>>+We6iwpY zpQ1@QZJ|fMKZ;iY04T^4y1hJW0TNWTAhzvS6mf}FWgyl0Yo*^cG1OWYZPHrh&qfAD z39&#~#R4hzhg2w^ZQ*NmaUc*ZBByWxTl%Yyy?Y%Rl)d@Hh~cur*5 z3Go-pP6#C8f2T{4`uvQR(Ik7^kaGUt=x^S!&vnJsf8b(s*XP1*YzpeUFZ&n1N zPDrA;Lk!n7Y8pqM=7~K`Y80OETgX`opSUK6XT(YVSw6s^X-#+{|3;k}d`*jgA?KhG zbZd>#Nc=kiFNz2tz2O1jZM4k_A{`Ddi6*KbjrH@=WFYKQh6pi9_ZF1vE*2w>a0?AkKAq z#JSE!ajw(r^{xV*}XZ0R`4xK>j64vC5B7JFTZfGDXbo0m4Lwm#17#8Sw-})` z8QxeiU%89%u8M)Pg>gPMj*-~}!AT>pK`{0aT+9wf3l@^LddPlntHrY)-FAcXiR;i_ z{@HSr`F1BnnMENH+Q2qEXI8GT9sG=pbILSleO~4TnPAMdw~R=C`^6GGA5j%puT`K_ zyRPCzOTUdRjVlYtz^>@Byz45UuM==Bdg=J=dRZf>fBd2q%^~eq z?cAi7w5G#@-&#(81h~Tqi2!OwE-L~I>OH!Zj{68pV+(oW$m>&zDzO27BT+3CCp~5z zJ{xpG!z@N|`gb}~`HGgr7Bj$Vz}Lp*bKeUdf2$oc0JuXRbV7``DEIBK_*?8~7XRMJ zk^&Y#7KGtReH69@qcCl6rg5NWA_OX=I25GVEXIj{*AlpYi)=RJfo)P-6Kbq@OCe~% zD4K)zE{7aVH0vSb@6e=bH_Z!8s)*)5Q?P=|G{+2{<8N+Ca1T5GW;nD^%qqy>5Wr=5^w*B`F1knCc+ zsXM4}polJT zi6~UOGHQxA&ykJo3N=En_i{&o)TVF0t%YM~JdKYU*j-qy} z7oec27A7xPKKvq`M-h=|i*5;0@SgR7ob>DS~`W}so31K8ixzDNZQcF#?YI1)v}f=q_P--&+~ zeR4>=B>YRKEytuIEODBk|BF}ioU@{iv|NYGdjFXfJwnN|$=kFt4z0V}-9u`gz23He z=^LjkQumnS+uaY6qQ@M+Nj*V@k2#)m|Al+6dkC&}s3(WrBk+5td!Kth+8w?(^`y*FEFD2fp{YdG`hQ-tQLN z3HZLl{Q=i?J*dH*-d)pokKgT1xo6@20rx|0(Vd3-_o$lAxFz^~Q2m~D%kcYNx8lyh z8;9KUt`Fab-4DA}w+2s+xF2!n-525NKKE7kf_o9J?sq@xUUpxCtD`EPy1M{>zaMaa z(EVQby>NBR{XX~mA*bW+``ktNe$ai{eLs9Z74ueev?`w@2%7XJ_V$kD{p zl0!Nz=|R37IN#ftGo}+G9Lv{ zk;SHmurYs_>nkuZRjL%0DY7G5pod=j~yrc6zaikd|TYyW+k)V3vmRGc3AAbx@8 z^aYMlNl64oWhGw=wWZX!rCXIiNygcZQf4mdOhT6smsIs4m6|J6%TU!4GUkVHv;J@d zlZtG`E6Y|OQdPWC1x!@|bA<{ZOY<+5uYk9P3OK3)&I%PkPU<7eR^aSfdLW@HkXWGt z$i@B8@)cON2e!5;fKkeS$HJvb7K>IVvXkcuew0r3HN6TLR=$N6yyLprkH?VN6|}Qq z{mm97@$C*8$*gLG()A}|DBamu#ivq7KDsJ(Bs{w-RuSoh6_E*zR0OIg+Ir)3kUtq# zQEp@=3vhxECP^aH;T8z?Uom4LG{B&$MQ$?6}UySIczkz$7YngoOwQAvu@p{8-i{3D# zrX(MT=OfC*2fr1wEE(@^Eeha9hTp|7fO5--aw%*=USEhAgdm6Oo~iyRI_I^cRlvX7 zdRQe2TtN+-(bT}9wx){JLTL^-$S6{5Lt(!k$<&E|x7J!2<55@g&k-7o(-r8E}7S9%IkwtEV;=UNu zN_y-13-sR?cXogezN8A<94agb;J3CWqPLwNS?X3O@eg8}NN=reASwD_aWb;V?NHnw z#tfu?cyA4bb{4C1KKjT^l%n~wolxZe9x3){Z?3I-IV@mQp|?SSe-zWb^w!!61R*V^ zmBUcjAIB6(Z>_Dsc{GQNED$Zwz8q5^y|t#ZMDjGAiJ;~9;7`J*u%bAOarVyew~5m9 zJaBox8&NzOD}5zqE1|dE9*3WZU#MuP^rzu}qeWRRzBBfAxu|4`fZrqsl|b!C87JVFw{i@dUI^9qiu$e(C=aACF*|f56@Y|x_ zxwLNvZP|bU_0|tcG3oE;Q1!g^L`ewWS%D{LgjeMUq)Qec_0I zIIrIYHZatie*m;p=ksSL`k=N69(gTUJKL#QzX81B2kuZ+8YJ;wRwy;NE|a+|_vYy*+(d z^#aI|g=#dX^a04L8F}(1UwfN-c|4Q$LCEMIBU|0hqFFjPN>2;9izaj(HNQ}Qu9B+s zlM#ddVaV>EVs=vX=G$z0JimwsJl~0Ido;Iry>spIRIyZ&>WANpX#S5v;crD&K)xF2 z;!OX)(w8z$!gV&rm-5?u2=AVV@(}aS+tO<3B3>=v$NTUD@t){7mW`MKo2I~=sl}2> zvtPoGDO)JteFSSDGQM)i z^vZ%~_-S=J8K>LIz&HJ}(q`;Ga%4m&s!XyQ-of-4{wHFubDE{Q*^cd26+S7=n0Xc7 z&&rU1{(8Ln4h^30cK0{ntwoc#;!9N?*#rd+^naZKALK81g&Cmp{zgn$AY%&jRH zrK-OPZ~hkMjc{82=kaQPGhY2ilfx9w`K987zr_%E4vnt-WTjMM;Ls{!*MVq#Vs@_L z*9cdmvHpp9l9W$*=jXlhq}NFM-dT_>VYwrT@b^*M9`i0$pDubA{5z>WCoohv{XR~3 z&QDVi61wp?zSM=)I;ouRkvH~x@E)#y3M0iJ;~l2Jg|&}_w> zFL_5yvX?_@)}295ef;;9W2Z$N0`%tZHM<1pNzzhRc6wt^q9@st?6$k#YrNYcbNgh< z;?TMjfI|a&l5eTo_x%9dIdGxVI27L@%!Ga7zX~~UA?RGg^9`0 zxl5Bzty`DTY42ZuwA%e`k#>JI=x^5;CpfQ?Ictquv-Y@+kz!oC|Jt1%g;0 zfCYkAAaDhORv=)7+lQ8YXw`=neP_3fC)^vylO9H`-@Zr@>+#ylED~VbcqjfU8rQmB z=ilqZ@2vQ}Ui|JBzc=9TvwYn{Ic?-$2>waGH@T+x-6wv3-{j_w$TXYjUcV@P3)O1} zU2mo9opgNzrP?M^-RPxc4ac|BHPvqXCc37YjpyKv)HLKYzSB#wts=fXezUMwyv4g^ z5kFJ#ZI0jS-E!?VGy{I_7Gc9U;0-L|X9~W}@xkW?giYhn!-ji1!iKmVp5=~w$Q~bt zJG;;p({;puo!jBgC_;_63Genrdwj$jxwgx@70qkm$!@gQbdw_ODBRhDa3pTZ8-=vH z;rCv&CZuq^&+XL?oig)*+ZKs=`w_at?ez9S+I`+WNZWyF>8ev*ty5R) z)zt=d)uXO@)m5Lm+N`d&sH?5&>IQXnqp0H@2%_SDuA>_5hu?Ri9je>q?StQUcy~a` zn?=gI&@$D{iq_l-ckV{u6?eV3a~Iq>fDkP12JcR9uXopCV*GBncMn>!y4@nx0l0Gz zZCc$P?`|mL9`7C~=aK9qeZOS z=iLc^PY%QHBkpGSz1ceqxj5rTyd#iyyGVNE$ ze(!#Gc9VE^6rp6?P2M3W-kx2G5RDFXPpN>S~j^dPux^ z3@vuuZQe1+^I`8{c=8CP!K;i&bKJcF(%e9QX-;@2;K`$u=7dZ`;7kuTr;kol872LJ z0!F+ZeV5{C8&Ae%l@n<6ic|YOR3XN<*l+7Uv#u^<*FBFQjCp9{bRs70)4Fsshx}(*9 zOXbNEGIpr;6Smw&mVQ3$mBsJ$BZcZY4l=486c@NN2Ain1f9hLju=BNV%9#f))jVcv zo9p%dgk1))5eQn^c=PLM1#c`FZN}w)robyAZIEj`Ev)B=dkKFuH%9DYu;Z2rvlDLN z2qBK{koY^1<$PYn!j3P6@OT;tD9W!KR9OzkWqHgJ8aAxDxpKyKzHs(_l`V4eA^9hv z%V1+d{zjbDyb3a%OB zceldv0RhDq!KP{yo14D3ud_IFlsn#eF-ngxLJ#c6pmJQDF$)6wY3k;=*Z_| z#9~tNC9~lmEK+Mbl%4Feh6X8rDi>^ECmXA_=@XEmFcv*%YJ}KDr;M7#K0Bpwv@)^lnb*SjBbVuq~_7A z6G3Iq&lgJKNe8@Gs?@6aJTtmShz+NVcr^V7W2Q2-04t`>1-p*0DatW1R|(wSO$48?k?9TE=y& zUX!+g^-th?XdUTe*jW~AX!NjD{|T9E?y;as%Z6vyYBH$POok>kqQa zy0U99CU z6}^({x#BJ04mdvLsaj=@_gL6EbO2Ygu`cv%$?^{q{ih6CrwtH|viqVDpsZ&V7ch#C z#@ckLVc;i=plr8N*r>GMTSss`4o7BF(BP4}b58RM+DcJHHAQ)w@FC&a^_j1W{ZI73~4#aU8I<&2QL;8iW99F zqWY+Lle#Ga!@J>sckw_AgE=?Wg>L&V5Gwac3}-Owk(MHoyd)+|m8$naxylS1aprqq z1Jrwi(zGpyWEh8v$V)$y7hHC(vzQP>Cc#9;$CXQ!^)E2ZNw1FP{IE`Qx`E~dRcoa= zOV-%fQYN14gsZRu0ix`OB>>4kxJZM;}pIF7Np@wVEGQ%bCPm^AX z5m4b?n&Pf>@EF7n+vg+piTee?Lvlz&k06div`!Pqkak`;=OHOQSD3E?r#p&ductj( z>`cHy^7&tXG6Jyd%^`_zRHa#-E3L1MoBUL@)KdhY4rfw9Q7Pb85quI2T zTDD3qCAOKYy)Q&G5lQs#YAjlBOA`z6jN0elCZl#Ko>BX*_XiyUPDhZeWP#YOFU7ED zn_9bnC!R_Byu|9g+$)(hp6YF^+DHqlM(Fg^NjBjmj5SB1J0zML17?gcaOUyjqh!|* zw^b(##8!P(XT5rv^=fNrGy|3j1)pHzxm9Pt+{9v1kkBOW+DyoB;&DBHi79I5>L}{h z)yUA{pExP9nm4tr%?PHfGm^Ugpdzv1O07VDXR*S+A$2!MXYr)zyTF^RTUnNGQ_@8Z zc3Q#+|AV#}Z_s$4x5touhKF(8>W1;3T2(V^_apzqsWwwqxFO+wL{lbyxGBx`xt$?@7c+n{T4$rUb>gLyf zdNa&;ZCM-7^*gJaWLPWPTn*2)Rw~f_4pD(F#HAq6BR8KP(q_cw-~eS*PqX%6`?Bmj z7`E=!4clnTu-y=<)O8SsFRwgiSfyLdl?lUlhf7|+ESDU@40G9_%4)u6d4h3WEO9h9 z%({uF^^Ggx9y8#Dd-Sb#87}xbl$C3LXY?X@ynGzbi*3Bm)YOteQ~p`hlJ9W4<9J(A zIXz^?=pBPT_~+3(Msz~+rWH8dF~1f!T~V`k%8bw`2JL)D7+SS8wJR3aua4xMF{2sU zt!v_Ce`jr4MyxA_X8dmRvK!WT1R1%N$rzn8rWPxYj{ajYI#$Wc{u7VjhSiOKV8smc zvVF1+*Rfyy)5>FnwK;2Ehf?u6$EIiHLnm!)9^#{6aR6jqjNmf@M3&3i2=ytej4)`+ z8i%Tb9U6L8H&ox-GE`gj%3Q~Ak-g*c!-X|^@p^`9+p=;89%1;su|t&5v35jn^#x>W z(Gfl7@Z@H?CHk&+b$xe5@4GC2@MeJ}O+@D?2yI;52>nRQ?B1f)<2oky z_LV0$R_MdmGr51Djdvb*1QupOU}35Qamh6cEX)os!)Taj=PK|pyS%P{@pS?dGb=DL z*L&;7y9F-h27!y&BXBV{dK<@k1vcg;_eSX4?PP)d#yB+MD8?(tpk;;J6k-v2BPuj) zZc@<)8FL=eaTr(;_!L8xlqY=*RYL4aaWYqwmO%v(iG2#AsdCtLw)qiEAX((;RB$9G zrDY1HD7GYe z=Wk=Ca_phgOHLzGtYRFe0$Q7IQs(70^qyS932H#Y@nB@y)S%q>Uo^$hgh2t~Fnk>Q z5;QZXyxNL5Z-dLX#;Du|OtTX>s3rW{aiOW|q8^w7Jd0hG+*qRO3bNL(nwm$b6V$Nw zHfrdss)jNW2!-;0j;I}C(S0Vmc5N_q*E1UoF&j)Z8;r==;16THcC}Z|zZdR(Zly6k z`*z0IYUx3Wf*#jVh@1HP(H#{Dsc7laG=}yQ(YHShJWRFb&rjAUWUW{RNOXuu5UnB| zL7{vpAZ*3*+ntmDigN?xrlOUv`nr}t%Uex zNR~AEB1`&?SY(cnY%Clea@&6riKAI|4TLphdT*>%^P_*Dt_d6`=`xte-ZLS zu^d52Fo&7YH!2(F;W1tzuV6$<$T}W%b|8P(V`*87o%`JzuHw z#5CJUSE}=_h;3lOyb|s_^PTRz779aM_wAOhyNTQ5$Mv0GiK8WH`PTm%(M?@?w(*Ng$`jjY6NpD=hAab_ETR_x%>^H2|`bUFDos?;=KHnYi%|b zteS78%f4h=g7{QZ25d3`jcml|M@CXn2J zYMb|1g_0F&xeFd_!sUTlPO07o{KmAv3=>SEYjs-y2}AXLf$_oXTX%2MG+gE*9~yfjPS3ejCl@p7C-B z=y#4SUP@;xezA6L7UNw8HJP|XPbcP!rP?lNC~!NMy|NsNVC3Gk2uTZFho1O{7>sl@bi+D#vE2y>U+b_04vw)tNxr*Xg2C=5+~~Bp z1MEl#ty6qwY^kqB8-WYltxN)cZ6UP;3Pt{1MC?q#$ot2XmV!w9Q>Kh4hU|_19Ns%? za!x*y0)Gx~UBHi*WLlyT{tuZkS`OSw5Gawj$F${S94nn6=XChA%uG6+fIF#l5roh?ig;h&VYUJqYQnSQ8=~1IESa;keL)1X>WG0a+(BAX#^R6A+I+@+g1f z71C_Xvj5rtA2l2!QoX^NhJx!34$(Ty0f#pU3vh7gyQug;I)#LeSXLk~ZUy@%LLKs5 zQG+aZI=cR->(V(P_b^%9ZVdaIu`PWe%3%(=@t_r)>SqJ*#!+~*>Pj3qNzt?PdgOA) zD@5k}h?7hh|A{KqmZ3#|qw1Ct<9eS~zaFiA;&D79v0a4n1b(QyW^hdVdJr;u$k->$U z1KAAoau*|PFIdkQ<*g1d-!mCxh4CMroxaa{w^7C@;K(I$I6P8+3^(^_mH=~=xjA_} z41>gHtg%`1Lt9$Y67+Sqkof|`Y#ZcZwv|IdiQPmwous_y+a^BPw3Y#x_IF|men6h;-9w%PGKW!-q)3UO7q|vQ4gaf)+aX?r7 zQcTX0ENSrYoOkNVLE@)WG^%#ywTK(f^J*5+rWjfaB1wGt+k_IR-)O5tI;g|X#?=9h z0coc!1eNH*N^A^QB3fAxio8iHGVS-sVJ#oRNlh&NZ6sxXGkcGHwNt4S9tfuN`C+(D z1lKYMDk>2*k?v7BRpUDr8%10Cl%-s1(t?bRA%AP!8&0 zNSsw}pK8|sLZCx$*fZXx)*JU8N=8OrTCk~{v~%o(JA&ogKUbbJK1D2puflu@ z1R&r{#wul?X$+h%sC0uETal=ZQbQ>p)kquplQ$)T0oI|dFIAJ!!~Sv?H;GJp`ofKR zH#G*DWQpL?q;V%4tFJ_8-0^_CTvSuZJDI-K6rc-2DLg!ok*ha zu2OM-26(fHY1jb-*NUJPh1`op*eQTNISvvUz5|nEYn(ZWg9)x_)1gb&5+AI(b}-C1 zbFRC3^b*wXhPe7AD8;|hD!5Koke;l%hIbtwC1ycZvAj~%I5pI5TdX4iC;2(8a#>k9 zeiUy;dRyd~$~EV8ajwEwGJKWL@@-a!d=5f?GWdTJqbVXW@#n3uB0L*RKa|T6CT?B) zarmENu3s~y)dwnaxwwB&V(6FS&dITw-;bsD3JDU=$ulV+r~>G$jig#}_6^e7RG6SA z*Z>`fDx05gVW5UILiA(X;*XCqVoS>_V`1A0=w(X0AGK{!oW5VTG=xG87G;fr{OHhs z)3IXA_|R76Gg^Tg!v(UD*Rlq*uBn3VT4T-IUfP2+2c_G5epCWJEDYjp(eNGq!Vq+1 zk|Q3(S=4iEzu$=O3r;Y$l!}~KX-nFCZM0&h4i4z2BpD}@JUea2@4zFg@LCX4CMBlK z*4VwZm2#-@G7$p0CeNo&M65St)4rg8k%7$;EN7*oy0-Z_ZOG_gwzbUu^84BtYzhin zX=9oE|JZx?@HVpSJ`nW)P$+^FMN!XIcSCGFNHqk#)oQh*X+6kpbxV{+r1}9#jRsi- z5+n#vRiIu2j>oNWM&liK+RixZ*iIrP-X!#X9{Y19FUQXM%lh-~7u(rgZ{p8?#;y~0 z*6~{YoZazGl68=*d(Y$ETZI=TddB%HttL>Yx^>_8+;h%7=Xb)8t)s9M-V7mO82Tz+ z4*yfA!1bX5S*y{_vL?_}5f%A`ZWIFt<(Kpp%bM@wF){J>;@g#jqRzx2kgNaF` zgc!i6Fy6w=kvJxjYwOzWPP6E@b>X~$%s5&L6Q8mv)R=A)O73OT5&#?(6ataknYX;*k3s?=rau*_852@8Tse<=vyfYsKQdQwqrGNdV%$%3H`gxA(%fg(%} zMXOHHXx%;T_g680Rw3bxE^8rO>fTPeR2nQ@41!kE3#?OpK!boI&T`T4d^&Y|L=8l! z>;1}t3yIQeCHFN_PkL=?+4I=HteXvWuj&0A?6hy< zN1&oTt9MW%irVfpq*m5sR9rk?gI?U!-iw(0yQZB@pJyF^Dfbp>DbR6=I|~hfaNlCf zv-6~rozz#+$&$hf5wx2%vV$#+2(+?#3kD$4*KgOt0XT+8P1nDS!8Z(yYF;x=MsD?$ zPgZrdv-aKu>C$){>5%G3c@w`4Y>7dq_I&?hO-FgO!;=E?e?SKX^EjszCJA8dK zow~Vq?^w8hkFL=p7=P*;A$IIn2Xdn{)yBdLnU?Zs3Xi(na+RLX(iD@55I%HElL6id zK7NKtMvA4;6Rc=Dl^TVw)iW*Sr|12rWXj8;Ip^EW*_Kmok0B8|F=VCx~ zrtY2K`aw>Z(U{bjbjXn8?Iy9m9*4H)t5q)$#Rac_$5uqoYpZQKF&>!Xh7iglG1LwB z)8TZ#p5%bA8(U@_zq5)eFx^=dxI5SdYT8M$eCP;AYrK9w1KXO=;f1w=tR+nIA*D~2 zb<{1V999-0Ek}hRZ*jlVVT-eajNdXOvm_LOu%@=Qv@S@!q6xsq@s+;r3K0bH^xmL= z9;`Tj@-FF8?M!Q&bkBIO;1#;@smN0xxIXzm0GHFl4g|Il)02Hx(z5JH8x|1}kVH0yD)lT9<4zh&bf2vWaCJIb(rSS`(l5u^Kumx3%dbbhe0hfL zb)-7xUWZDeX7aY7B$dJD3I<;OG%C%W&#^Fpdn7%d6R@r7j*jN|lIN=Fn5k9f5e!XWG9?a(l#o`;q%Y&`cAiQM4ANF)7iv?s+v6$*AxxMo#W) zax&fe5kW>x$9M(J?9NsVVYXm4es6*UhYk~8mQG!#U^(<%S-i;v77df3=TiIjNq(+S z^n9eL@FH5WwDHk=rtYUm##8(ok_zF$&J4ELNkevQ@ZZGJBF1Py{+#MUiydo!lgfKD zOJqle?^no=whSnBe@&RvBgAcj|HZOlmkTKtC3a%V$v)bjk6OR z#(7w9(j5n=yo6>OI5w5(=_QbVd7xBZ4OMqD+95Wh-6qUvEq@bz>z>ZYx3_fWWvM5n z?LHZDQ{TXLIMr@k`xlImCAWp9`#V%mP*XY?C!^wYX(41&^22&yjDRowV2CL9HRlIa zqSd*Qe9AfS|E7gKJNZ-s$J6`KZrdde@C{HaE<)g-wsWu=UPDM|8xo!EZXxsPz>Y*|K94w zb=IU9tJt3%MndkpUUis=ixRYfCh&bhdZ%0vBwVK5qK&QnaZbM& z>f*M#bCU0#Xg|>^+A}fkB->9Yb1P3@MYR8=Hqm}#Ya>{;*E)ohq&B=6GMr;i>1`3> zmNKl&sp(sQ4cQVQ8D8HCgNNTIBjINtrw=lj0-~J}?9cEBw~l_K_FfoIUAcJX+~{8K zOPbhZ)j{Qh(E9sC>&$aufAA*C>Q{|s$l%Sb4HoITTOSPv) zwM|w|=%ImfThsOCsB%rJI+mON(gf*BuhWtj938?Sg(hgAsiP-(f63bo3o$nZvRZYd zox@87QWP?H*mk9(LlKU1L2hlSitCtI@K#^OFm>+4VBu2vEj2StQq^r}?IP58b|pl7 zYDorv+GFS#G5WVBgzagF2#FqH1~=fHR^f7=naK^KMp0usK`o&@+NVZ<8nvl?36QmH zSCij98C;M|d;`PAfB!KsS>P$z$-dD6!RG%o!pAgQ+V>_-hI!(IY`3-Rp!Z;c{Y|Cn zKr;ZU5z|33!u!o`EEn$je@imhz?CGV=7X&5Ov?h+D{jN*%G<=>)Q$YqG{;+u$w1rW z;)%EtRN1%>BY4YWcv}yA%k>J&^Yx7DQLZqR!&gMfl{SB(|pf+4ihGUQ3;YIfffb7 z`bfJT{5I|v7wbv*2(@0e%&+$Zt?}!&Y5~W9ttW*RcG0Wcy;n~t+$oA=Q%@-Td&W{i zZC`yIVY23ef27A{ln)MLVbL^HG58WHeqN7qQ0$X1bc_|XUc$yOBFhHpf>KW?w;v7` zxLMkVunEU=^4O41>i&}^82fsZdI%(ss#mucV5NEY(5#CX<9d{43NxX<+-0%`0s3$S zefwYG8jkjB7?Y83s${6X;7SYq1;78;TxTYdTA$uef1&u2^f^dJ6?hjvlR5~Nq}w4B zEODhrt>nPEfpz^OwgI0T`VYW&fB%3jta{u28U6kJ`!Vf6-=IA((EmLV8}41UWBrHV zyKkTmo^8bE@N2@34V+T%CFt{B;p!krn69Bbf1-GAE{5U-Tp4o~Mfx*bZO$h26IN&@;ZBm`;`IvEW*^+? zqdV(_QEk85{{TM?_{MmD{f`Ea^%JJH8{7>K@Y8^AEj#!|gcYJr{{ua{5$=}ZOP`099)VvkI4{Dl7va}YC*|ybG{>AF=cO-4+*cluo+5jk^n$w^m+kZH8-zw< zJ{@2vzdV{1?17nw9TxpBi=I1OE!`t11fLKr`BaeJDV9Y5weikjvRdFgS46-~_0h28 zJgn=vLXUvB4Z_ttHOH3xg8e0k5Z0^0e^1!0xoRQxD%p%X+E-b@gHp4#OqLanxivz8 zH=bzSYPF$jtyZ+UmJiiRD-4FP{kP<%UD*B#dBmZ(7wB6Gq$q)Rd(gH4|tN(b?|7*VwR7#ZJ=4neKP(Q$07cHK;z3?q`d*wn~oEf6uG& z*}lebYh822aBD-MioVb(W4*Hu2muzd1`AhEy>m}N_zP7<#TRR9gjkB7PMx0GevvWcnybmV?u+%T4- z%Q2+^-&-?kK&i9{xqBzP6ClOKe;gD>qx43sVAS-Fg$DE-`85G)V6RJIjP2Zmwg`{H zC7)t6qMz_0uqcaO5noVY!!qObK16yb&g7=@KCpi|5Z!u#QLmJ4yL_wO3yeE@P_yyt zO1y4jR{7l)wWn%5yY~f6P9h0x^?D zpv@0o1@8HJNUC?VW!=%2#i0R+xpO!4Wpg=N)oanJ@c?A-TU)ATE$YCvfBe>#TJ%vA zZF`qvj!C}zv1$ySWUFx}ioSu6A_g6A){M;&{&ZrSBj1O^U{oy}ASbpZf`=23Qun`x z;zczkj2`3Y14(_5x^(q&e+pzC4^^4rVF7v`nCF00jS)1D9y^d3tnokkCMxsqmH;*+{1)3mOdLlPoyNDQw@*hyrtLw^Xoe_-odVA$~qrEgO8 zMZ+@P7XuXCz9NYCWeX;N{(uI*rq9P<_2`d)p1{BwXolgj!G^Jwpc%?$6{m;+L#V@) zn5<%WN9_ULi`FpWlkP3njJX(tz2GWaHp^x)!eJn5dI2d^^izbSJSWu6sa#I3j+{h2 z5^B26>y35S?1Sm2e}>hAH1h_F`Dr(u!X-7rd;Vdz1mf5Bs^oi7sP0+{CsrA%#G zAQvhDr^iw$X}+8iSD#gcqr(hh-Drc1Efxvf0mq1y)lVI2n!0<-Skok z8im0#^B%_i^xlb(0SE>(r>X9}f*%x&^tBE0+8uQ7Kn(~K{MH!{`IaU8cz2zX4WhwW zsQ8H7;T55)e?!x)aaUcVD}JE_eRG0eQ1=NHM83+mB+^DcHC(Qg_kk1$?~N#91vw*B z9?a#J#t!4f)of)&VcYRj0yoMCd8t+e-MT&A@(GM-G@yq{f7F+^GwYt zPVyO`q{XSFs{1M0kYBAJ^h#dd6Kp&igmCv&D{RGqX#$K!Ve5or;ZJ+TMPM$|gy}&b z0|He=<|;)7-0q8of(xPpiVPTXi!l+XP<(gRLnxFcfHzcgs{3503>sg_$6R4pxM+ev z*_F|ye}#{j|GUbMNL6WI^Iij88{fe^!6AY4wv66&iQtG}v1rIav3L+iKbz zUc+94L5AVVtVWTk;OGbs@SV6Yg{cpsk8g9>>|Aba#j2YH=v4Uh>C`IKA;g$Mq3- ze|j0+%x#WQ_fVAOZ72((^YjFwj72`u%5XiW)3bC{b0ms`E>IKo@y6g%8Evk}8d41> zkfJ$41ZpQmNv&}#^!SWt>Rb7Ue+XPWND4(yEU5LYHPFF z5Qc6(Q!{iZaUsko(gW9)N+orQ%cr};%2Q4*Eb*s62q0RF| zEym-b@?H`apH_ysC6Tji5m379R?)kQ$2nu7>q5eRN7x#rLoG|vs8MaW2MX8Djnx3 zLBS5fweB+cMd}rE9R5Sw)*gy^fA5XRQ1x6i#Y_7h{P+rfe2gD|5kG!hg$C=SQNWPc zKdb_@YG#jZ+X=!;h*?p3+THBrOC2>Rq#ZVe5vyWp+_(x8ZMkt3PbLA^5*^!yYhrLv zSL|BZq?^e0x^}kD?a8haSW*4L7-hY?K0Cm8QT6pX6>H*M508eu?uU>7k zEzSTT3^%yQ1Kj$e^h+1NV$$w&SavtC_uJY^%;oOTg@aK;g@bM=o-hiv^(`IVD*7{S znZo3S3SbI^NC@TD;lfe=UxGy%BhQmYdwqgUt}D$<3bMlhMAD)8r&Q=`RSlrvt=0H@ z@bMcVjpnBI3Sbr;4O-s_f6m9}h&B{pfB7r=$C0KgaGYtmGwRjFx(Sr4m2MHi`pt0I z)b@&W4hYliuS?zVxTOXZVa0o?!=m|Re7<_A9G+#>SZdt0Iisz{md{ zib=e+y;Sk~n#;A|#exS+Wyga5XZZM+p@O${ESTP3bICTm=`EGZf9SK{sqB9aAO9*; z_V$itiyYQmdJ^8H07a-m?N~kz^S=(2|3b&|RUT_X4-imRSd&g=2chr&Ff`XXuJxzI z!0QiK4C;aa?dNC6No$oFuxa}L73@{WV0WQ7!f$j#>jt$XX$GxVUOtu(knYjEra4A~ zO+8+ZPkS_z>lR$lf6S`ea3#i>?&k00i&gJ;@Rffp!!_frT(09r_mk-R9#LqBu)*p0 z4}JE+f2PL&;F(G9G<9k;Y#97Qj6MwG>Gw;P^Px7UR}El73sv(W$1XA8P89FJv)Ei5 zO`sg}^@#WSL&Af1qHs;m(6oQfg1@*EI~#H0KLEMqVwlRYe;lKfST^X}{wi>Ok9r;g z(f&&0D_TLPjnzWs4Wq9%4xOu%Z=;c+=gusZ@?I$9s)RKq$vLGA12T=Bd?Kgr43B^~ zx#&(K+A6`KqBukGLSR&2ke{G+*%RcupF}jq?wGFR3Z?uEYs97_9Z3I+5^U)qIS71A zF~;W5kk9h>f6^6f$X*7nj5*WMpkp$~Z&jl;{b6J-_CWW>#dZ9F?vGb3)VodyRJn2Q z-;?Uu`v#qlsQ~x5_j*4q38?qSN*|X{Q@EZ`scFnt3=uRXHh+hMr(nOpg6)Uq%cwDa zE5ZldQ2bG%s3yH^!Iz~wU$NG6yOJE%nVw!Z=r<{ zakTH#f44>)ecteZ?fOCemdWf^l8#MzDKj8_T`RZAV<+*H0r50X4@=Bw1Sjv0cw5+o z8`F*>ouiADSBY09&{#HeAtoLTA?o%;IyVmbvPZzIlCe#$-Y@*kuAq$#@pFC6FrxK! z6Le!-YP9JT7DmV|l_*y-dHHE&?eZTbDWr4CfBHak1Ymk&hcsuY+m}eaLU-{9ufE|d zAH;{JgtWD-uNM!4mz1v?lH&SCL9@>*B_E|hsT>ty_4WLsNJY=c3dcm``uZS0ZGPE% z4>R6MvP-Au&;mN^q_kxAWx02!fk`b?fV-Qj_fC4yWmEa-c}i_nrv%wgjNupE9DKvA ze@?j7mW&Y&tyGzU^#e7Bx}mQ{OWjV&Qy@}`lcJVH8(Qo%VS)4FJObOa&ejFOpa|#p zw{PHXU|4ZR1tvor*jM0Bx1}i%T*J5CrzdrW^22m}wC`ACN`zV)Gh(6IUQe2~ZEdtu z*808^eY>n9&89q8|K|1o^;eEXBKU`}5pe(~1YOnI`(lqajg0Xl?h=Okt<5aMhh z#PtXijif-)=p|o)nA1nXoeDg2sy@^krg6~6n=U+Z}lQhQ7e>V@^#Pl|vdd#O&D64z>`_XZ!`IGrXx#Zf*OTpPzA0*fza-Ds}y4*em;`l*CU}=W&>he-bY)`Ln}# zLAcNhBaj$xVOoi`x*)ab^b*}TMb~JIjo?3fOFO0X##HERrmG{xEj#u!w>;hj`EiSm>3W<%s zwJ)$)fmONRTvtAa$UBbTf8+(<;lGzuXTBD+4q?|*}TF)O^UHGIhIH zS@QX;35!K99Yn-tH1Z;zP+hqP<66er`t8-lreHtFDJJ0v)EKl)vozVK<89#BXW%a6 z0ZR<}0^`$QyCE5jr7*^WnL!wbY9Q#OUNZcmZa9lg7k zSBmAl=iK}+L@ywEm?0jZ!O{tOHI<)2zXu9pg+I9(Ncakc;&c&>7T6xzMw~wKXyD%F zIbW^76w3?Lb1Z-zP<_Y*k*KkaAI|UL35Pv5Z|IE2M>vFQPjaBoWsGRse{Mx`<2u|%;VszsYCecp@XSI z_{yQfsY6(sLq}7GFx{b7Qim|zp;uFfq2=}krs!4Ab$N8sDK`((6|FF_H)+@fh5wLd z?jD-CbbV+Ke;sYxd7u^;0Avc+!M)HpVc-)y%>~l#qrbHu&RwihHdCaI}GlRMZL>_%H`eAp8}a1h|AI?L-Caq zodSY{!y??PisaRA1C8TG51}@3DAePSl)=0ZIEs|wso|1a-2*cQGNNW4J|M!u+fFe* z0}>lAk`d-%FxLaPcNKBksQxdf@T{gH?1#`pe+xFW12j`@IaAXZrU5w%1rY`_3<-Wo z?C7EH^4xvUQrM!4!2CHduY?_k=p?B6OkQ?@;Lxg-Dy+xAL7zQCi@{3C*k?u9LE0#2 z9F+@cnqqLwxD+bz@-S?;zP!!2y?RFQj|fqSHfrj@KkLQ`2KX5utPP4 ze}^!1hRxN1jj_bbN4`5#p~^s4iXbNrXUAQFuOl-;F9Wr=aV-u_(dp+9CM*j+1E$4+ zJ=Iyc9Z_viBb~=Nmr>?Gwo7)R!j{)9ER~2*6&IG61*1g)@AwB^;o%h=+8K2PE$op}8}aAQ|yQsnkRTDsRiJJ`YJM2#JAFC2^RE zx0H$@!p#r`!u~rfEsO5pU|q1uunJ#TxR<(g;rs>V_g%39hk4chX&dEf2-zC z)O~lQT4wo2IDj<`#ntXXARx>W84evJ;kcuk7quI>h_{=2Q z_?-5OfFTmp50<1`ZK(^eQOMroe3O*$-V*Kt!-B>2$P9KLCWc8Z2c4D= zK36goG7F`9Eb1upwN!oqIbNhE=dN56JLX8*4&jqgs2Gn(<|120@;IY3e}OfT1<6F{ z6I_4^V^b$g<1UHxvf|C;%Lt%&{oqYxV2Jck5@;dRomkU=?7;fXmu%_*Zn==u&^r>B zF_x?Z7^E%%)4;>PQxY~On_8Mj_Vq#`E&K-hgO*|&hFhjd9z_%$biz5Hp}c=E~)u~i)!;3xy7_3Kpq%vaiAu*abe85 zf&=hD#)jeqZ6$;xf5J*4h6ZL0cF7imPfJO)OSw{=uEcbHsAT%m7)-qTp$ay)`$zU z&$_V5-Nq6TWEQw+o>|yT+B3OW?n>kztNCftO+lu2e=u<54ttEkdJD0}Pt$9dKY@d? z)`XaueCiF<{ie=%)g3f7>y}je*5g9M#uvrHy?Reb6Izc_f7GqAP^#4vWyw}@Ld>KS zTt&3mE>;?nqHmWY(C!eC<$<9^1R~3kE0C2W%(y2JA(F~7=>gX)G82k!*&^Ii30OX-X!bj3I5zm`D285>8WJGHoM-ZdW+l#Fs zj1p?sNzuLsI)`ejF*L`yD%}XDLWt@=rJ>}y3Jo!6tf+lUiz@~p1Z3m5!vN{6 z+pHcX%=^s>D`1N}g!@X^M^AcSm|Az-L<+grf7--IxQQeBr#}n5g)MAFrxtsqYP105 z6Y6qGBNgH;?h`GnDUrB96C7sL)bWLg9f_jH6niKznGCsBktRg&LL3NkAMLS1E(xOO zs-2wC$0S%b@&i*sz3g$NuhY>La~#tm`4mRky7&}m^^sa z|AWeGvWF*5chg9Y1>mK5>eRIP(6vr0r)47XIypFoj1mHdpdhO>!Z^OEX6{@}23{3x zE zx;zY&X!!2P2$O&EHAcMe4FV{n8Q7CYrLNtjsJq41hT&oQ---nIQnA7BHqCneQvNQH zp!VUA{l20z&Pb1-MmYqce6f8P>dBmV4^#Z@&NRq-HPQhOYE6Wwab&eRcbY*kf3Y%h z9UNECCoQ$_&xMu|w%`{cO&C|U=ACY}bNf!G)oY!n)dII~^_fNZG;(Hn8N#o{4{G3n zuEPUcKQ``{LbFO6)Vy=8zPz#Uu)M`sR2=9-r_ko7(YJRC49w>!Xu806HEK~pgpCSN zHu8tOb^4Z7Gx&}~QdlSJwi09Xe;bQr0buHI>+|bz*fNla)f4C}TBZjvzHD72Xe0e= z%HvS8j364dsp&Z923qG_ldJzn!MH)w&~JqB$jng0cm%FRsN1<(lzzu*G5UQG(nbl1 zF19r?AMr2NV#`r=PeUMprpWWrTPZ@47psw6nhi~1CZ{Dx5G=V3vS}-Ee*GW=TE zfv#YeST+x$!&&Se%R}uAK5gkBTvTYSMi?Fu>K02+qS1}EMKj^b)cT;)7zg4zp94`s z{atMi@Z{gFma$Mx!!lM39d*MvH)5>AWbRcdaW-$#l*4I<;eY4Pa`24Oze|m_-gUGw9mZ0k*qI8=a5}uvV}S`WL_|kw9WOA@ z&m4}n2CR{Wpbg8hs<9k*v}LQ@Uqu*)DBOv`9evpX!fni3pJ?8uYP@Py6G;Au9G<+P zFDI7m`!Ce&IeWPWdZp((8HOpU zN&I$nn2CRQ{}7@AY=vRHVJs&h@1Et}T9QD^G3Q>#gwcpYkM|M*{&C3tW0Cvs3;6yR z=L)5K45fTrGoaoBoU6=J<~Y|o3N52pVlZ|sZF@_!ZCJDo%3n^>xF;WIqK!#trOB-% zAoU(Hq?!vGQhlP`f7;pJQb_f!`(vuD=5imDm27V9a#EDVtxm#sG~9Z~`5~11f-3h9 zT6;j0e;4{d_qK>WP-S)Qg^}2&^Dsp&p&*%BSSnSEizOCu=?r0U2_dj~e?#6pc*Ytt zAsS2+7m7mq<;MhaNyfRE=~>{qhxbb4N`HhyLQ7MTd|ASnNcuQl9!(!SkUn@cedqxG!oNdDZ;mi059v|| z)2T!0)ZujMe@HrYl>UDuojMNp@frL&1mExm7kQzO+6!xYuRLQwgx54HzR2baqXvZy z-Kn|qjEnr(p{Ex>h_PAL5NC3ve(ln#Jx*n2Pdc?{wgR+d57vLrbiRsr3PpbwzvqGP z&3ly!K7;Prlsp2ItlEDi{9bGx$$z6nzr0e{ZFa5%!R_6SGNN8~ZjyrHm5> zTrn1e#=r|4N$R~5)ym?9s)!IFn0IuqEfsRPm37`t%;^KlNlnMPHe0u5b3!*^Np4GA zp*)`qvzQ25=&^}>JxYCA*Nav5brJ5sbF?v<*qW{nz;Byk2=znCKJtz;bxs%4wiD!w1y6N-knZ4iiumyO9=xG7 z@d$llk04hM1gAu1eO~vD3G^fb-NBblV26#G`4INOA24V?HRmnwzzi@xwdf3pBKMOR z1QycAL^J@i8ZBT%fUKg4FHlsc*nHHxi=Ot7f0ywCx&w3-E#oI5@Y|%lMq=m+ygj7O z>Jt$$LBKI$R#JqydNMbA?xURfIgPD{WOt5c0W(frfTRHxI+ zfA+&j&4#yd{+EMVOaND^8@s12WH2xArLFvG%eJ_0cyKr?n!eVcbf-x1fiHmwjSV|Pv%xEgqL);~= z)?Uzm=vt8UvY(J)9H^i^m_8Z?>#Q{w021f-kkiRLx9Lk=8Wz`8c~)d4>A8_0f0Pgq z-J+nXAt0+3%!hi6rxZcHvTS=!((}5B&w$n+Vn7Hn>6k9F$B$3v{%%RS^1~~|`#|n7 zF2*h84*n&oRgUPd_g|4eYc7~THPs??OZ+wL!FNc2ur!WOGhkp)y8%KM8Z>}x8e7;c z4oRv|d-RbrgGF5Tb^$>VJhfFYf4A;r^`HJ(lGT(VtM?^Yb<7_C;u#{WQ6j7_D8fq7 z5s-{IK*)L`PU3;lL|%Wkg_K!9$}A>jJ*@;bUbBI~{>9GsDucv z;1$0s^foOq?oUm6OKuDG_3p#Rq<7;xrnpRIIxPDkJxpG=%LApZ)Rh3mVH5b^JE64R z_jRewe*Hfabv>+qcc`oP{asperUN-8^a>6PL^^>_@B{Vt9{SvRe?jR4V+ybO>k4h7 zg}@=PN$9H*xJ^jlv=#|-zb7(ipR`}&D5)`xqkQsrfADRf&s?*|+x>4Z|K*>CpZG_;;4XTl z;?y(wyfwubmhjb%F=J#k^m;4lSzxi9Sjkv0vlv3nbmFDxLM$62ik5JUFKgNO8^}&- zUnVVm))HuJ3DAs{|6DQ(DRlwm2aGPrz`9jUKKtjd8&CJKC2jGr4kzlf3b^!sv7x*cZ?551n50d zLOzImHS!gmywwd^g{t;YLnPFimec9lq-%q&qjYW3b&Rf~bR91uDvOqjQ3I@YQlF3o zpHAR7mc;DdrGSDSL_Uc84)>PfdI}R+G zqCcJY9CQ*#f4Q0UjDi`1n+erd^(6MC0xjrW@?9?{dv+z#u!9LL{l;lCHSH9f7EAeo0r$nY;vrI0=G(~342=a zl|>U(O(;tVBe|(NxX~A%1>ERGilT)vJ2{G0Ttv~bL=>%r)9^>7de=TH!a|yb(>5wKi{sgy}C)hzxuydZ^5I#X1kCmRf1v@dhPS6zt^~UiYV*KJQ z4$*3Jx7dT&%@U4PBP(laox#|gg4k8gO3d*K}kREVBCciLmHmaf9u4awG`r9q} z4T1I7@~_d0B(yvJk=Y)b1u;<`>k^bDiqq^Me{HrfmFNslyW3J5+M^GLP+1aGD8AVS z9IOg_M?r7Tp{$|R3?N54YsMq}F&@k4Kzd9B4X&DaynuMm4|H#=8V!CS<%focqM9C%W;7XKx{vy341|0KY zf2?h^@9xV2%2;LA_zCPB~bQOvgk0Vux{5z7#-`#|c4=w#&zVD^ao)<1(yJUu-JIfC(c zad8vg7*+lxYr$G3N(@8@R3dfkQ_6KB0HiZHxN4|pDMk05-N_BJoIu&3$p#_A9&S(+ zc9G$cy7q;-whXoJ&k0l6dpXt_a4SxC8v={!19`k3t}hC6V$YDzzdN<^j8N*DK;SY6F2|8z4sPP_B)brQejjDEda<#+x9r6(La;YS0yZ&2U~-5W#`3b6;I@bDF`%`Iev0efb2CbAr>>a6)gKu)Cn zH#4wnM1lIlFQD{MXjpt}e}sM|YOzOAV0EloqM&bzP_V(XHNsPco#M~Y(-`d(aoA7c zYT0&B`=!y2kl-Dmp?_hy5&Z&)SIeZ*L3(>4waaI@d>-$ZU)bd@uf!SgQ_)`@;8RK? zOJumGl~OG!EE;<8jx=Me$3dzfF))t!i*VuH?n+jW=_*QeB_zXEf5hZJ(pC)ehOF5U zj(i*%A$YOPGDZ#1kI(=;BAh0i*{C)p1_jlQgpUf{`1LArnR7atLp#Pc*bJA=@Vy!g zAl!?poJ`E8rio#U!ds+}-AsAIL=Y()*rsc;tWYXULxFi{c%ESGIq*pjfk)RZA%gp? zNI4TANW&&4tg=D_e{h?_x7W3~F7%>G>p<`~gVd3O+HP%UGu5biZT+Yizgg9f)O)(< zJp+2r5j|ye=shFcdu{!quih`-&*8^E4Elv5E1L?L_N;>A`|rBa%3`_ty#dX!McbQO z4r$t2uJ-c3NP$~}w!a%G4~vNC0$hhSG-J*LHWy|CF4I`#e|=bf?_nqt?x#5P(+^cG zqE&HZ1|3uMQ|MlYeu`2*#k%xUY`igea+e$0<$KFc>y;o0+-ko+S-gyY? zmF3{|s&~(=*1Lq2^;HRj8UX>n&*%e|NpQsf zci{yZxg@D60_Ey2DBA`G#M|)P z;B$Sxm58SMDP!n7D9-i67HE4o5!SrV%P{PHp5U}sEj~G1S%m=0fEW~ zR6L;40Tm9YY(PZ=f^lKgIE)zQ>~wZHyPZAGuruQ9bzXMT&ORsO>~{`02c1LCVdsc* z)HybDe=MsxuQW*ILtn&h?LC&GNHETHMN#U~286_aHerJpVVyt)GAb_y}=S>0_+u&}< z4muZ{U2wh8dCM7r?@i9z&R+Q5>|AvA!1osCf0C1i@2$?blY#GT&Shsmd_U)0aSp)u zcIWfXLHK^&x#}E-?-!g2=Lmei=uA4t;5+49BM`J5&O4;^8FJpm1F!5$&U=Jxz0-N0 z)WW-*EU9#MJJ+2<@V&>m<=k*~ep$;7zY%e6qT&cuoY@ih^?{RuUn%&t7k=fOVfZx+ zf4^RKKBPb&X(vzWqkYa40j*`6X;LHYcN_v-JK(qkxOUJfkUHs*Gehd7!_F)Lt{riT zq)s~O%n|U~F=rm*1ZH1xN)#jTxU=94!S}28lQ5d)(uqk4eD>PB{fX{PsYBF0SeCCi zmC}g?m}y$Xjb=}}vFs@~o;~ea+0VI&f9&h7ojv3BWY4-r_ME#ed*1EOj=Jl!W9~rq z4H%y{-NEbycVqS~cT@IlcXRflyCr+c-I^VDw`DK8&tp* zRQ8&?Bm0g!lzrFTnSIaQm3`mclg+y6>~(iv_J*6u-gNh8KX4CZbMC?Hhwh&_jq>3eKkAlECN~aKJ{T$*_XviOI<(=p8|#*Vw4D8!U%av zu4{RUZcr&GJvah?c%JJoR)h;&MHtSZ7RxVA+j0$)HzLC?2>>Dyl_Q-}%RKKm!*|oE zdm|K{Ssj1cGR*qjMRMt@lv8(Kf4(Q3Wu-!%!#9%u@odF+Qwl>sU^LhaH08f0&24>! zKvn`0N8UqtK8tcb{@9bt?Fqc#C7cAg+D;>kY`I90hHZtWL1CEC*-?N@HKSlEH)!h6 zjE(VseO8>CP;RbnqxOlz2h?Lw!gRih(6Nj#RgV*z)8ztzhYq;FHux4#ET^k6BaKnPE%Ou@8ZP zRf>rk#eLBm23966%a6iEb+&FmE$H9~_Cur9TwD(;lPwXke4cjUM&AUwNfW5p$<$P4 z1(jM_zOGHNM1voVp3ufc`o!k~pzLQTh+wcA>p}&cf|5A@(@J(af2ElCT@pd~nM=@H zOE|T93CJD5cXxTi0#sRXliz)!DQ0G?3o4;9cA zbUa1{BwOYafsS$ZFeg9Pp#aSM=(7~S5ez)i#t7ewy&Tmpg(f2CWSA$4<)Po^SRTQk z=!oG?(RVYGV_fEBe}^hy47OL-)QMK>FhRMi^&(E>Q)?um+>UbTRz3=sLO z1#FA74)^~3tCo*UE*y9-I=hifTeQ`?B|TD5?eWf;Y0Enu*%fW500fP(Mr zS_!;O9`KAE8+C&dn_I;e`zfxY-t;SeXAC5R7SIW)&ibuD`0hk zhiZz4YboGNTLB-eS^%26eXUCYO|I9&VrxSqE}uMT z(!$;eMW!hQ&*oBwfvj7M_#65<$<|8gpzTR|Ck60EdwfVW6IsX*B+! z>So9!e}m5EnR_%tofRdy5s?O3DvZ`Xe_6)g3BtB^?=xG>$5Ro9kp$MuUIU3VmA^i9 zGc(@3fAH=9W-ZfxD^L4gHS4f|?)j6Y>9h2IMlp2I|66Y8Y?3R-KnDst5y1$*9JWSq z&pSe6!MIlpH3|d5Qzp~cDc3-T9u40eIgz?ce|#uHLW*Z-MiUPG{SI2g@eB_Q8i!!g z=33i`)>}UnM!mqu3EhKrk`$n`_i^ixVQ;2RrKZJ@HLWjgy0zdV@bP!LbZ#`P)&6yH za#>}PLYN3ZQVb#~CXHbd@yZN&3?|oIFe>-&1$BDj_m)GqRuDeJqjy+2$f_( zaB#xd^sA^jQ3zZeuu_5WWt#AB1auk0wYh%rJ}R1ojt6ln3CTu5w-H=7gVC_1i}La$ zR9mL1{?a0=<`64lBrOoB(Bx8KX%Wa{WU z4QQt~Rjhi5$;{x28Pd76ac5QZKW!LCID#^&DT6Ul4rY)L&llJaK>FHczKVpUdb40Ej_$Qr1c{Hr*te;?t; zW7<(57qsnc%B;;hsc*bey&!dZu0uy*Xj}x%3q0KZI-SgrN{iwHwyY$y(fbE7wrM1R zHmufXCWqTX<8S!xgMS!u3ynN&W$8+(7|B6vv(41y(Z`Y2SlW8l6ty7V;vVic%a#)OCkLJiUymg0?e`ZbJE)(7M zPbxyXNye9_kdPRIT6<)oDc@JMufQD|V2gIKNG@8=aNx+z5encLW8c#`1F;Ie%C_#& zaC%|o+ITSt7EVF5gDCUDAXUqBw`Si$Of8|_XjR(2ALz@GTc!-Brzs2R6`dm5)lDn} z?ng;&AFL3L8}|PMQT6b=f3UG57$9Z98rc2e8*P%38MaEShK&3lYUc@~hfI4qdIlU0 ztnIKtWXPx?0>Uj_9L4gc$<~Y_Lhy>lq56WBBu*kc!QDmg^na8_j3yc}9(ihGLMDwe z3+yVg#q<7R` zv*Er;?0A%>E9ENM%kjVd57k0tdi;lh>9MIyU6Urlko0Rwy|JM~le?pg*&$>>F@LDK zP=SUDiP%h7DF7cGWdBLX5^f1}%mJqnuL2guTxQ-s{)e3%4;_g!awlVp`Cj8(RwI6yq?_XfI7-PQ4mi6(~0@ zzf`HBA;_PQ#!?e;#k@_;#RgksOa?Yha^U4SYpmBLk)S^gud>0x`>^j^KT4m6Z;k}J4zZ)OfI3P=ap^JfQ1ep{ zBecVWeWG}u(8@#j?4h<9Uc?k??+K+5CiflZ;)X!Ddl=aoBBPR^5r$`I9w6Nr3{Acr zL3jM;-vb_!e?;185Agm#1&aN{=861o;A5NCMERfEgbtM7`&OuvqCA+*G=FQ*OWunb zDFBF~?8GIuPZOzReS^D{0WM2ikiw3StY?8AWwPC&zH1=c95K_-IviZUz2`$?+g#9h zkx+XUmY&cERgGvK5h)^9eKOdmw+^pTT4!QNuv2uNs+c;(&Ul82A0bD&h1LY_#Zal{Ua;K$kD@<|eL~XB7LFNb<4kP>m zr@yUge+W(=ebvkmhpvw|wu_GH$eypnyt6nDkmI9xzs&KS!+YmLG~rWXKEg44TW1Xt zgoBz?3<@-$7)-x#_dNqS*d%m86xkciQSs0CSa5Wv_b zu(9@JD8Bd%x+Q3j^r}I3%m?HTg?HGK5$;7Ff5je0aCad4ceII*&sp@DaLh+G5;s9z zqMZR1`~cQeq6;|WRe(0UVh3SuTy&RzYL}-paDTucD|PL5YZu^7ayr;aVv)vhOD8b> z>9l(U1h9wc9CmpuqF*9&Cuy*YwJ6UV4zE<~4U%v1`TSCNk?T|xT&0p)*H$Vr3@pD)1zIj>r$ zrd>D`^oOB_e%OT`p9}VZm^O&s$D7-l_*A-#OMf^-mt#Pe(PY@_t`$!Tt@taEWf7x3 zd}#La>Xt9)K72`2FzBlQQ$Vc09gN6wE_Ezt_kZf;pq2O4uH`i8rqj=O_N3ZtGPqnqrA3q)^{xD_0`Kk&li7f_pwmw=s>6NmqqP-uykpPpTfH3g>iEjq%6YzH zIZs)tXyo{{wUsm8v78T9F9$`K9}JfxQF2gV92fXFD@FRLd^AEHT;zo@g&)HT-n>WJ zQIe@6qd)DJMth9ko>DF`QE7a|U_b#9#eW`Y1;jWJBMNK$fV3eA1&lu`EgBePC$3!l z5(;joPo7-TDIy(!uqV-wLZIkZEtZ+dOIX4QQd*KYYSy1U>&@Q}B4S(yzPPOR+to8~+)=)tMdtp@W!dS#%Ab_DJ8Jz8Cv;SyA|B(P!(w7#;^Ac5Bjwl{^5f5tNH3Pd13WRO~OT8dSPXOZO`hCku@9>A!4#oCx%*tY=7LbvX+y` zCLB9!3lOOu^v)s=sCC(1r$5{0tk14<2D1ImhU|K0FgxIE%x-`@2jOoc{B06|F`ETo z%oYI{vsD1bY(rlz@@h(vhtGEO=_0SDo#Y+$0{V85SJNb941d2z;P+nm{jzf~n|2Om_c@2N8ED6TXwLy?-$7{WA!zeq z_&WmEN8#Qvc>W5cI}Yhzh4!3qj$~hRj%H6f$FirKSF)#_6^!>8C<7|Z9+<)Pmh0m9rb8z2q z_la~Fk#4^`B+?C0y8R;EL6Po|NO#!X3F*#5ik;3Vd>-a>1v~q?Gv>SjeRT%fau)jQ z9Q4I`Xxk`^*%-9<4QSt+&_@?w{N92#z71n{5&Gg1^y@hE>1F7TE6|Uhhd#J^KM7*p zo23cmX*EfnR%2n45P#A%RqJJ^5@MT0fx@ z9be-O6+aqrv2g40iQI)tm(P!GRL5f`?Xk~X1@E&%L=yHR0j0P&LzQt>*F7t2tGwOwT{Pif1pr-MxzN@IEG5P_2%ywN?jKuhrOvvCFApRDbX~sm0==JJMV=c-paQ7FG?P zo(DECYHn542fJcy z;_|t-yLS{meJfO>w>s5G8QPnqQy~)g(o^UKaK)Li?o^EmKY#i1)$vf_RPF;`3-GfU7M zYm0Twt7~`a+60AOtJby2rWQxTkuBdM95b|JI)5Lzc?{8z;d|(YzHCs?Bja`Wo7cVm zn)XOTWIAM2ZdteJw?pR!w=73zAWe??b*@4ZA%!Ol?UfaEe51Bfj10DCpLgdj|Gy{W zA%0CA0q@u4@MU~6SH(j$6%~`rN>-vIJ=aYTf*0yhPGL+Tz8&rwZ4*J}_2UX)QfK5O zgn#x0K|>>KBT`F@uUrc(I^q+PIb0B z1HSQ`Cq^{246^r~^l{({PrEhpe$$RI5C|I-=!(!qqoYG8-U~aLJ zA+1yu$CVc5yg~!Pbw?AQW*<+>YgAXb;D1WzM#q5(;XCh4zDE~VN6(z665qXgVRDpi zjlMT}j-S2z-Zj3sHgT0M-jx^c$qPvH24B2!^$Mqv7w^dnNOPGlE>FJ6Y2?Lwc#*g^ zmK(o({@SH0^(0(gxOC~-f=y<(n0$#p)?#&DD!2RSzQ@#@_UrePk!ygmlXRb`Vd3loIRR~;v z)7XWJqcF~sS1+8sHaRMDt#56)AF9X3mPat3E}R>!Z)v>^{eN!q^40g-o{Wy4yZZi> z$qreG=DpZ*`@;C-=o>JG@8>2aVSi9BwY@if`Rb)J7wbc9w_&sE}39SlO8QZKtfccNq_b7JIJZW zJ17@W<&kK*ql^0;lq1iiuIQ!)F`FTWv25IlXDtM35D2bj^C_7%6N9oL2~% zWrK5^pjigplTA5ioqux(N<(>`hdhU} zLoIpMI8S#+_9e*EhCD|}HT2T`L3n2j-r1Smxv(p{yXC!aiuYd1?t%BV!Fz8wZ^C=S z&IRW!_#P1eJA2%{uI*fWpnsxOe&4kpz5F=hT-q9O#^;V}bj!M+Mp?@YN2>Q8CG(I_3Sy%ws8z&lDg5=A^MUZ7gVEcEAWv6n-AD`U+ z>QNalHDlWs%6`?&JLH~1i<-kx2M8}L?UwGPrT(Mhi@?tXj^vJsZIL+dqYi@Rx?R^Y z4Ly@-Xg3<#YYlCG!^*sN?!=9$V!3XVmr4qqUE5o?%D~=C=YM^-9xeI^f5OnaHd!Q7 z#CeIyYta`5#YQ0sZ6XDzC1l>59PN%kyaY zQ1q*QJzf$QP!-4+pCe0Dj~9LNbgA3!-9_jC#3q;5xAUIQjlibYNdu{)j%hLJ_cT&#EKB+6U3X}*x%4^>|fEF9B86b z_o}Xsx+ctig`r&=2}Szqz32d%o2pRj{h`2=-v+u*e1BX=L(Oy2Erw9>5c7~=(5eR1 zZf7m>$VBsx$NHlvA^^~D!!hM=3O5jI-K6hg>=$nR#H`qPZX3W6z3Z74O6o18h1xkQ1fqlefA})iGn@`DTxUC)6 zC$U0Uez6Uk0+$THew}QNn{A6fg5#LfI(Fa?y5%|`u-c>}-E2CYVxXz=^*2I=T3=KXpth64w=#qqi( zL)0el8&btE04t>7665qM%Ac^;5Zq(UoHzImxeCQLN8Y6vQu4|aK~4(>?S10{m(ZT; zaT2vi0c6|1qJIo`K9ai=k_~&D(KGR+mw%SX2|j1WW8#K(f`&hc;kc6QI1&1lPs$rl z2^W?;id37mU4?kEYbK7U2Vw?cYk5AdN1(d zy;oVn;IqXU_MRmRWA>{(l?oW5;YIf3xKQQrvv>0M7`KT|T28dQdi}u7)XVbv;7x?} zT5NI}rZ!23V+WO%SV*cwR^{nbxGC)3E7GER(YpsMV0nhJTUsRTRT%^QPM4M#`VTFq zaV=$1DK|5d3AbWs`owD-i-?^mV9}9`;Kl7&IMv&|@xV5{6F#-%hX$*(p zyYZ*Pn|&=2N2CZsJ1A5n_OhK}1~aZ8EMJ zffAx|hfrvw7QG^eV>^}+@DgJy7EKb6tw`#PU!GvbFodh(U1v^@o{Qtidfcy~EuOog zGgGL;x@qYwG>H6N1&?Fugh6g;ZJm|~qem$0k=yUMm=#!u#_oF67rc%mFl^{8oVagUuSy$og~urS{t(&n>ue zKD9-)RFt^73MF0+nIH7A8WDclsGO~D<0CzyRH`_^eUCA07Zc-S}!zrh$%>?$c2Dj1V)2fKSIlB za%{Y5mprA6P5YI9!5s!$I-!WIiDjT`cl&%o^ILMICNFuz7O~m;IhY-6id*!yjZZl| zHae5qZ6L5}WfNI^l<~2%{4|;(I|g?kY-%(FHGhP)xdEFUY;-L5!-jYR14t3#)CtF| zVl;u6=i#?wZiUUTJmy5{ZruA4=81C~p2grT+Ft7iHP|(JgqbvwwkX=d{-O8~D zWNm*HT3}NkFB3}!k>U@kiE0nR@K7Kx+J+yHFoHE@MxL<85{-+aq<>3&k@%o5qD~IE zC4cDVrD<3yihHC7Fs3`-ynJbt0C&ps<;tBhaJCiX`*8DR70wqM+82p**L$u_j9$HR z^)j8HSoq?VGkD5|SLd(d!4>Sfoki8pEB@&e>3ZDq?V<;=r1iFYkEzc(K5O;eGDQ;_ zc-KLXUQzFQ~ zjt6Nlh->r2S{I&Jhs=%>YZkq0Vc>@`j0Ar3q;kxXNvm9&11@PUwwXdnU>r)8C}ARk z9Jw5I63a1|n(=D9ig7~C2gb4m)2WB@syRvi4(HjNBjnZ#xg{aDKFDnykmsyPUjjf^F zdhcgymSfIaP^*3z_aycyeD~IRA8QoCrmt+(tXeOm?SoQ=pp-s3i8v`rF>Afh4vZ7m z$1R0&`>@PUU% z-%`C1uVI*z_8uv9=@G*ldWIg^EqcUIbAZd~WgS{;uatj2G+%pVo7-pTC#dC1*7W%p zUG-8Qbxr??aqFW{z3b0V?-xY9P4vkZ_3mx2FVw{Jc4Aq_aW-15qjl?-Yj_GZ&?pFk z?9aNux)GrMRLS+jW-NYcCx6^er*?h;zLtq_?}Dpcf?8i=${czZrF4wF2SgjB?(&T5 zFsa^2pSx&V9&hNmef4PGpDq^Z_8$8D0(~ymEkS{&8rsf=wyUA-;h<IQHTR0tm=AwropjhJFyJxW1zTQ>-F zhxt5i5I-NBA`qOzrqD5VpU(ICL-)|b+Z1uTZ4$*1jBGn8D+f>vB-JF}@1whYdXmy? zA$*?!+IY4RKeJ5>(tq{0q}v3!2$7$-pTW?xKJpmG?aFTEu@hmo^GavM{a)mQ9NdHq z*fv0LccRPD@}LugyK%T{!QBMhwL!o~J}LTG^Dfr-6iKQ;1z!YAYiv0pxhdd$V&sDg z&mP4oQWHM2=qe7I5-c$wNpaw(B0!4Mu&Au95$|XCn~cQ%K7U@Hiro5G++)H&1dF$4 z-t-!H*GZC+!UT>;{l-sR?x*Mq7Nb?(P4D2_TWT?OM5k-Y9~ZlWOVxssf~(jknt!$y z=g&tyHG|yUp-qo~R6k~9*WSi~;M9z@Y%a#&E>j3$V4Ri^z(JgU!L#agCZuxu9w|^} zGAp{z$3K}H-hZWLO_U-1&Q|pMCM6hG4q_xf_jc#6#?+xetVH?^7PU#^0qfnN(;^kq za~+>BooH5EsW{B_eqoiII0B46()$=*RpaOl zkBDo0Y)59ZKM}Immj`vy9w1N~u(Kiv+a)~Y41%c?%XENBl={PRHG{%oVX0J-qTz=U zWIum9Ulb4@UdqcCeIVpQ49}z{TsJkfSlM^@;DIBr;HE(NEmS}w{;NOPy} zI8y|$27edq&^W{(HpD?2c(-||>g#jjP(CLc^=}n6L7WCgP#FSM0J*onwP|e%8YSW% z5h6Z2t1ARkDdK0u8JXD>yNh)qyPs(^GUF>z_KW;hvnY>sC700FnTZlvVRuwe&hajRyM+xhFV*MThJfqWq2m%HFWu} z!!Q{zOkb-Ra|Y?r$3BYOKOpq%B&x%Fuv7uB9z=qEuoF|UD39eRi97MvaU9a=I6;!n<7C_!w>y($ zvUN|!opDclI-dIc#ZjEEJ4z>=bbrg)kd8TLx%a-Msz^$f+{xD?3iY=8?z`)`=bU@a zf8fXeIhM`;N_FuMD8M>L7m9KryZflg@k31@t56_o?o@)cOn2-0w#itjlk%cA9vm_R z5H#Nw>jGR2DV?6WI5`OM*nm79|M4y}c+D-Ztv zS((BAiQ~@r;!VBCKlv?pLo;8JRwL0)3(14)+u1uitN4fUkj~C z9j06l4DsG!ZBPpf@GK`LL@6x61lk^&NYr5>ls+!Wdv9O`#ebkLC{1K&8oXbyFa1{r z+&%=hxN64CdvY-FOUeVP8d*uSF)=J0pj_a$l2Jn~65#vmjihOXyRua(@gX19;&1VH zmdO?@eybzTd`brIo&MAzSXfZe=BocZQzlkXQx~ut6^T%Jx{G{v%O*}6&wBVK z8%ePlUj_F;S`H=Q`*}L&+nfZORNTf>)`lD2-SD>uIe*p}zMX0@Y?IF#!c!}f#{|_e zctZtbE!`l0rUGrWSP0*6%{B-1L3lbqcN}9Qc?vibWH`~S1+lVX*S_&fI+`;y3xUS) ze1VQ!|CA*eTU;Am+FSwBv)46WHeBmv&CR^51L?`aRSvG~mtp<7_{dAzOU8sj;E8rf zNOMa%+<(#C9=gMXzyR(nM|XiF$h$ynI8-!h^E6mRe@0AM%?0w{_I=n8oE4BJw}jUD z@;!Lk4}{~(kaB>^pXc&kaV~3@jjINcF|>ckTykb-l_mu@v;9#04ooFIr$=YLz<_YAKt?jkC%vL!O9Mmzz3k~SUdY@DI8=82nBkEHY+FKHmWs_$*=|zsQID99P6_3w%DAh-j#QeD->~oRC ztZa;`b3+Pe3OSJqxlR^xfUylhGSn`^+N>%Ysu(ZwKn4K{A#Zy??sT7Rv^seJ^<{)Q0;Q@o{PTgbF4TMkj+qS@Mo zNOW&A6l}JGL7EZ_Qo;y}@~5EWqvEEh94d2H;svGZt=!5sV{QWrb*}n?N8=Vv|9Q*1 zJ4*is*>!_*ak`AsTl;Fso%dDlx6SSSc1>y=c(te2pWXgK@&PDtxjX3i<3#*|06Mx!Cl7P#KA- z!1fO*wkVRFQix;UmxLW#CoN@KMm-=?kEADL1f_PHV!r-NY3*)T!r5PI5`WT`e32a~ zrm2W$0*hNgtdY0!ye?7B9&A_mMIM)iRM=Vhl&2!aiJ^bE{ce zd+mFT47_6`eJD4c`|QtMcz;pT@DEo{+(a91-jomJPU%DW8RbLi8Z+oeiAQ71AaEgb z#w2i|5lizhMii_HV;PY5OJ3HsybKFyB)tn3^o*%K_x@?a{{zo~C#A7|uXk*qUVrck;;J|{;5lQf zyu#QZJXsCbL&q=}{hAjwca68^k~uaE*L%^&(jC5JjIBL}9++$4YOS{pp00=MeeQ#B z{h+rVt~bCnd1AWj==m*h{gC@GTtDpH0@oYi`rYmZxZdEch3i}4`Vj=#a@W&!8LkhY zSEhRleC;;4I*7iR?tezO+T=d#9(8js>SMRN&$-838_qVnkCM;k7WX*$Y;JYGhx{+M zx$ki|kw4`Lg6P`eKIU$Q;~nnv?x?#B-n`STxR1Nr;cTb-g!^82w#z-~o+2;Gd%e5d z!6 zCq{%m_JH>Qqz-6&?H$|ey~}-u>>57pZH9i^=Z?AWyJUJsWglHX=)TV#qw5FB;P3q_ zpDy$8F7MhU!^9uL8|9PUBnmo2I8N-vIgmfe?Z9!K@@qkWk--+rk5&EgT?gu} z@0Cw@vu7884}aZ0Tb+4ihA&2dt|PqF_VFE%@!X-hk4~?EY4jIqPluzPy6Ta5; z{1-fTq&)g~`KbdZPaYUO{S3SobJkqha&Y>2k(e8aqs?nCmO8`owf#!*T;Pd?^T`Q z;`@nvhk1v;RX7#+UUl}QSB+g^Ct>>dGjXq1-s9JuNiPrvVRSAG2U@E!aAx#1nIv^v zrq07{pMOh$r|0=oS$?aPG17q#9UqbwnR#W zJ21{*Hq3Z!K@2i-HQ3oHh(R80%|4}55Cd~8BY%PzWYMy8heNOLU6md0q zBY$F>puLrV7DFMRA~CYG6j zUdgMqogz&>ucAhogL(qEfg=v|s|h+Hs@2^aVPjiN5X6J$eX0p-NQ6+>vY+BM$#4{C zQ!P6UXj!=$l(*b|;o;@XO@(t}^iiYc0)NZ@s060rpYKUTaGI6Y{TeBxK$N>?Tw584 z*Nzh|XGZbAWMXp9rpakg1U%X@FeYc|Vb*nc(e z5@Su;?XnwyS03R6+jrbG!YQ`z5FtC7RfvZ%z^NWp-btLlkt4WNMjC$4`hh>J^k2; zj^&R17xf|GWssI}d!s(Hn4mE`;^jy$oZHIjazwZTZkekbi*pdmDYnvX6ZcX%Jv;h= zk&%(5wp?yht&UYlOj<-G#ec0Iwsw&7M?jWxkP*CHtCo{%zsQCSFUNznD8_mmhBVMV ztg|7_YqtYiP-fn&84rV7tIsV+|6S>!D?IWV3jsV!RFz-aS>}MRWI4h823Ieg`yZ|Cn`d8IJ+>B$ONtt><1$@j>wgP7slpJ`H=HvY@k_hw&5?P2G86a zOnAhj;bqjjP{lrAJZAB3d}XdR`FsE9XC6y@-}%f_tKs!#o_}DW{vpmh4ol&7U`kP3 z_;EF@R?BI{b-|z)71p0u*wSh&>06rWo{ z%^&f(wwos@k<2&7a<#>yXal(~AjU3nk~q=;~iEefqT3j?)=vmF-0 zxh4lx=ZE7WkbnAF+)`>b2?N+0r%>#CLMU94>?-bta#%$dF0S8FBjXUvl7JhdLsO~gmEaj7%)^*WfCkH$Kw_db#+m%7e1ACR6z&nxCUT?Mtl`XKwkP7r z&}Go@CupaI=_Xu~j5yI*P~>2GUy=|?nhoOb`u4i3uzN>ub`@GVpb90qruOxR++zte zgrI0?){mrSv{*T5H@B4`YsOB?=5Ixq?JH|LR6wkuH-k1Dft#SZGHAxezAvYOuvp`P z9WOGK>VI^H#?JVd+5Z`f5FXGS3%70j@)1t9n0$|7}sZNiR#h5GImyW~f zrK4Xh9ULPy;||c$p?6w32qrV{mY_RUwbmUZ^5D7c6<+zZ2q8f#6R>+akVGMGE#R6_ z6G3N>v$)S<3O_ZIYKac#o@QR9G3%um0$9G-eO@qwZ)wG_k^qFP4ZUjUylyC4 zj(-IvI_p)3qPsoA45xZVp^vhcuNMYZ`5>1o|+P;F&-6@O^iQq1T?;{Q}3s~C zI}OI%ovt?oUQ|P%1FfW|--?ESqpy^&Q>GhGcSp4HoXs?Ilo4t4?w>~r^EWZ_b-nS| zm0BxKsz{vFT-If7D%KeO=M~OJssu>h{_ZAA(20;b-3jTHH$zQ72|r(#l^|-Gv41lT z#=0`;**nUQZ|KI4i;X)WHoe{acuHH{#*d4y--sVqf?rpDTz=@L_;Dx3kJHNkMv4

Z1AaU9|k*IPF%6kQUVqCn-ZXptS{`z_X%1VIJuz|-;abH?-+oq5#R_%G z&T`dtYpB4e&Jg0g2lpo$J6IhT)i(K7EI)!mmTD3K--lhw_Yt8{<#8UN-~<_oO=S+4 zMVvKipB6F57tMK&7~;86DLR%lR+xIDzN_v{vP~*(!cBU9j8mV(Mz05Q>VI`=xbjoS zPe1zjnbTAZC{ujG38Lh=VjmpxuXB{OWb2HSfmE~)ov0QFWH`Y)B`^rK@7NiW9Jn?@ zH?{rjrcFD`yJO}DmWG10eho&So zT$G1QBAa7}>T+*>q4ol9=YIz{qC|7H&Czb$!Zy9LxFwtDO^RFFZ<0a4HTv5Lamyib ztN7nd+!7UD`P>b~ExGW$6>&>Wv08G*by48Ln+;T(i;08uB)#|d9SK)oX3l!U%?Vfc z={FLt(#z$W6R!N9xSlMkLt$j52Txwk_cHaCMB6Sl#(95$r8Lt zDd`(;h6sKQg9zxIq$G=;b*F`=UPlahX(2RnMpeji6ZrWawocjI3et9AWe*W z!5zb0Gqq{8O^Q~eL`=~Zt@GAh;zKu*Mv|YuftgUdM3OWYB95r)S3%NPxSIuIz(}b*0D?@gvLKoZ0a-RNY z@%hhms4K#JEPtrFS_AsZK%%acTiXhgi7&ZWQCDYR0IC}AYQ8UCHK@@zjP-gIL1d*$ zLfB16Ihre%=+cEI5*;o?oNp&hAMPJsBgHHQcN9A)7I{Ob7$t{tm_b8{P_1p5l{M{E zr8GAsb|c4EK032NL2y`gp|;@I2AbKdCNsfErg6`Jlz%>~DM(cH5RCgM;1nBNG|x2_ zW?-V$n+v{(8%>OHHK?Kipo|=?>|n$WM6=9#I|`mTKI2vE{KcJ|1x>JKnbE+~R3Eyf z?wv0K@oJvq58*V1oQ1F}#3-DLSd{bU8Z%y}Rg031H(v1kw%Xo6F>*y=f|iw1UbuCMMvk ztt^_lkEeI$$XD$LbQQh{G5uEh6NSbc+lp((0nL$5Kpy)N2lIV5h*Rf0zeXKZZV-mE zwDF}Vve@nmKmq-kMIKB^ngG1m-^8fg0SOdF-hXtddC^m;h$ofGCt?$0I7RPNqU+C$ zPzWqt_iOW&3L2V0Mn4u4t%p)y6G_?xq$FQUovb=iM{2+XaD1lGR0PmM%Nzj**)oE& z9SjS+3rNgA9V<|p+;fVU`HjgAr72E#Q4&=4V|-B#5dRkZ!C*8Pu1@oJ>RotVWG~T! zmVW{b*oL!~9SNPRam~ruW_OnNdt)rGhk+4q6>M+DEfeF5V*hPI0g!Vyk?603=zlv2 z|H$x`C;*}3ZbrvFxYL8qdvK?K4t#Lz^@_kAuXWeKvp#g@qX37uP>8{P*MTnB!Y-ND zXOBnP*khE^U{0D>QAn|%Tj8&gL0IKVmVcL$*IqF?Fwer6>^oR>V-4vZDzq-4n-I8-LZA zN+Z_wlzxR)xvMzcO;->A*O-P+g^XBXOlSOq=#4aG5~Lzry{gX-z_N|0o`m}p?G2%- z_?&>KFnx~Dwh><~z&9=q5ddulp5%%3&MxJi((3QGw7{8m{6EpPC0o}n9t=(YYn&3w zV^8(47Atxu%uW?hi~5Sbl!tQVFMsK7W?J`KAJ*!I0ASRY><`)z4qKR$F}EtY5SFYd zGt52!w69`@R&zU+ZGJn~nxJsuIU-k2QJd5^;x&|nK>q2ziL8sr&kT{oW?%bLD`qiG z{F&kj1j&mD3h5oS)Ywk%t~qIO6Aj_q+IUrR@%07Vm&F;yBfw4gkzn)<-hb3-bg-ix zAv(K#2m8^~G18CR#Xz)Et_$#|sQrft4YSVOnXePv=>o@lZDy#$|g(0+gg621&HabGOsVUsz>6+$jKJ2 zV%1?eSrj(jUO?SZZN}9D@_&7@-e$U$$Ys~v@w$itV88PxF}K-;aYC_`TfigS21(<1 z3gpRD5ORUV<^?3w5z{ZSJGU_D3Db2n(XOYNe{U|;+Q%m#x!(+s#^F~mFxyTUtBZY~ zcsL&st0{^lNgL{TC@9FOOj*G#0$^_V(gvM(9?2ainKqFb4ZpLV+J9r(DYu%HWjE&| z(@lGG2)7>8X4+;DE`wxwAlrTWj_$_uLY7;g<$2QgJa>`%3Z^Rb-Q?m)gAdOKHl$1x3B%6%H54TDxROj05eAwplh~PvDJ7LV&_?v6Dl%!L&+BhI72L z8uNQ0@sVbM*v6~+(|?j(QL`_ZNj*lYsOh0SMBS)U(2Ks&i0{zh0(N>?Z`mk4BbYVC zNnP&sA4E3#UHFs3AKd-mV5lt0VP5_Nx>PySB0bPP;sk=5h_FoJ|8kFz9VljUhJoqx zY81C}AR%MhlU9Y0O*u(H5DKCVEz`R&-pWvh{!e#UVvi%HoqsOTAva_Z_tCITD}!j* zh)_~63Wg(MVLWei=*8i>?p8G}X<{#gVF4}WG{@Dz(Q)_?SLf)~igRX1Oi%kvYw zL9v#$c<}5Yf<>LeC|d?d%zNc?+D|cg>297txLcGhUeU$7<|#DEdXn%Xfs3cyGNFZT zH1B5_Xvs6+GuJ(pmQJSo%NA#=+_X-(}7J10i)b=CJJ8q0%os4>k-^HhE zsIH;$s^0ucx}LC%e?@#H$H&BT8`0(o&h6va3K)U|Wq&bT#*z7n=k0$a%q^L9E3`$f z7?||a!0?#Uc{uwO0($$(bxL8my}%kh569xWfH9hX9{XTN-^wqPPf{RrAd^HZ6^p>6 zt&KV8KreWC$5Gy4^`s@22*ys*HnGVDP$F7drA#CAdMRFjcmQDq=A`VrkHU}~J?bBZ z!|RXow14+8puvjXOVKNOLB=P*GTfl@4`8xKZiOFYQen~(L3mWs0{?`f4>;8l0lH0S zf*3MB$Ll6CvYcnN34P{>&I-l4fCk6vu`2ZpJ}Kan-IxR9)ap}LjRjmt+cXUVxY}EV z&`>V1%gn|X%>qnhi>A1(XJIm1)}U@*Gw{zCKz~vI&xjaM1v+(*fFC(?cJ5gwZm40BIe(8u_ovb+?H7RJP`#>6gc zx!8wcNFSG@RVuA)SrQt7JmS)tG})8Q=OzA~R# z_}`3smb?YE_Glvznrmn;L3l8faFe(ZdVh;o{{S8PNYWoku~3mdyhb4ofy<}?j~8cG zW7Z);>zv4g=wIYCNGg~(@nLD+Vs7DGihvM3>87Thm2k9L9y1jk)6i!v8^ANH4NUy`vWy=3c3M zSjB@dIZQyCCWX^|hw5(hS|e5VM~yb+a-_3iW%rxdBJkH?-PYsJh7MhYiso00Hf6s0 z;M=6kCtda@j5amC`p#QZC6jGm@Hp}-$V zEAX*F{Jna@UXO?~jx)cRRO-KoKbPN(dLPx}KdB4MPTQ~yXRTv8PdM*!`s`lEhX1S^ zDf&O!3AgDsq2kZDn+UTBmHoGql^-hmH!Eeovhx$F{sDIt*|rS2t4Yy6gn#&WW4-Pc zq2@1oeG@vV`t_Kq|5iez8*mX^$<#tdnrJEP>Y5BYl(tWgNCEULw``?B? zU6#SUl^%n(Wl>S$rO|NU4y?^(GDaLf$EytTyr@`_KrIthjt4Bm_B1;><|$G+!f;!_ zqN+GQu%@UunhAb3we!%*iGN6%yaSR+!EUMfygj}HqKDQc+6Tcfuj1Um&=9C3rETVu zde^;=H)%e^ug3R4+SU!sb!S;x3yC+|nvm39xS5bbM@jB<#7nv}ZSW-Fk6@ilD~ygL z9VBXmxDd?*_=Ux4f~>%Y%QBo78-IvoA_I|DRzTQg zpNbN6QqV7}C8ak@aOx}T+xtqX=!qb;nN=idzF-ZQ{l?YqGg6k3Yuu>bS*`FdjmUm) zO@~sDYTzw>oe1I2b@(hk_|@2F*LV3W2_J9e%gtE5{SF0a$`Apf02{7TfadiLHUnaX zIY^lQz4YCdg$x0gq<UrEnE7t zT}+1luUJbDcPKz-v!R>$I&GcX9Xc2v{JYp^Z|U~gn-F*+u7hl{5@rM@_cAT?KY2X~ z;P(_eY=E3S+;P0!SPHnmgA{;fVpKRbUD+c{SN4!X$!s%T$$#)RBylCFvUg+Uzpkhi z2SV06(up@~yK)nZ=^w@z(~TWR?%TSRWZDk~OZnL$nSrivr|PK;2Hqx+O0Vl4odng>30z_IY3ouR;LaCCCOsphZ8seZf@ zr)mI?dYdvxk$>E3PI0TY;#Tv5TXh7t+9SBtg5Xwr1-DvM+-jd!Qrv34;8q6&x4KGj zt5~Ji4jM6THR;fa+f&tga|SmvqRmxgKh&lN8r9XwDl5s2E-IE&x}`|#g9A?-Z>G6T z^`?OP?8tU1-50)510JW^oQ{3;Fj?mb++$%wnW|P(?0oFDuh^T~8PWN~PW=eti=cc8AXzs|Rm>XJdLkZNaXm3?;h{RsT>MH!@ z*c#3NSwN=0t@$1`(oXKAT2pMhcD0V<0z?jW<&^P|s*j|OAR z>gQtPKNqKv_ojc0okCNv_qZ)VTDCBw&Mn%E$OyLo_0A?w$>A#Cv(z{tn6&eaUBDkF zcbdsl5@S&96BUf_5R=#?x*D30)N1AJZCe7^(l6B5hZq`UM5yvHBWa+!0}BL?MeE`t z?$4xtH1<8T=aHWiomm%smflN!rm+y0?3$j!O2ggh2G4)oxvHO5$I^YCyuyHzwl^^_ zNqyJd`0_$9v1>1t7K`&{4aw55Y;EmJuU1{s8;g-7;nIW{^kA&T5}CaTNh~RSbq8O= zf^`_>@yinQbUbRiJGrL2)|CakraN$82Dn@kqxk zeb3TjoYlrz!umUH`-75$Su)6a>gMY(ov4HVpSp;CJ4_)vX}ocbr5$Q7ZJYF$DDd_e ztJS$^Qx=95ctxjRrl)D65V+qCjUC@kVR4ZpnLmH+A~^1e8rs34ujyR$X2$?bhh$(X zDK}!w#485*esI|-q){YITK>OKta>y&%$UU0shr5&?N#M8oeoX>HcFW9HajSG)pThW zE)$KhvEBWJ#u~Z5D1pz43^QVaXRH~-1QE&G@B}uQ+ZzPSLR3$QtZB*_Z5JI0eBO!EcdT_s;@@FMBi`Jw+^iGJL zXRkMHZ!C2Vc9c4Mkug)D8(O`{0ad;Wl4yTffHe``K1iZ{mTsBaHD`m9b@EQu&Ve+V zv9m%Ng{zkCQ{8wWk89xVcp!v;#*C{^=lx;Vppf0eXlA@dThdkN3G1r4l%Z6%zbDL` z(k^Zd3<~0y4UlcmP65L{h4I|2r5udFTqPUkF!&;e$q6%8a#!Pl7HQ3TZ63{cA4h-B zgK8veV0*@l8`u(WR&tRng~VhR+C@QQbrDuJ#`r}nuo77BQiiB8eyb69`)CU#ofla> zk_lyXd>kzwW1!3|A36z}!qoN&8sm;2{I3ADmmE6sgtHA~Vj1;5E&i4tSFUT-nPx+5 zTeBdFm7#qg#@}B6A#4$tVU>ma7O;Py=e?PkST)Z?VqmO5+ul+)QMW)bxB1&*2Ad7`CSkKv!lqz}lrwV@vH?k@BCc;UX^Sbuxu!5_ zP}}u!b{g}KXUYB~=$vv^4jr=AoggFGHc;pU7PQI*-cU{?T!``N0tyw8ABle~6nU6X zgN;|wmbKnqJN{y0e0(9n<+Bw6CO9V$K}dX%jaY5A#YVtJ1rhVW6UU<-NkUnp`7;+7 zvuVbBBt@r5ylym1!x0pfhTAu_rKm)HIWed^#RO0g;W&3Mz+@}qLQy-r5X0^nNp+@h zwwzz^{6#szsb5v}2C{I8rni60kz+mML{v6bwFyNv=mThQCj&%7^EqvfL!xq{E&c4W z-LgfqHhr`M^=+x_i-o882C<~LEI@LsIy!i_EF8xCjI3z$swZ0(CTdv-v(z%1{`oWs z$1hEqf+f^8+IseyVcHbZ+%hoS`G6s#*(BD%Ts$PuQAw|Dzktpn82En`=&%JxgQAZk z#kQsl_yfuebU8zGIlGia=oTW4pimhm z4RJbY=Msae)>LXaptTJ@;fgC>;Q5?be%n=5ZCbYktq==KV$GHaelg`AyI(BE@BmWu zR?%7X!(htXROZ}j6bgTO9yP;3@{>ra=crgngJu0Y6tP{&D6C9TMUzy>sfOTe60H?i zAx@;eAiPDSp6dKR2-qzPJ7){*w%HC|ZYZK53f{HQ5}F>S3)2Ddf^ud+1bnq?wcyYWWzC4GwI z;gwI9PtYbnGLD*D5_zO0dLhLa))ZcZuM~u_(Qp#S5h{rJE3DU(qbk9LKo{V=Kz(Ba zh>FN#+2DrV#UXI< z4tHx03{C#mvGy=i>^`#p)7T!5a(n3L1wNsN=Eup)`>^)h@KPqUuIORrDmj1ogJJeb zXv+CPyo-Mu16K{Yf0*x6+)``hR~;4EgSb926j#yJ;&IZHd3m%|NVmls(Jpoez;Mn@ zMo@%4nLc0jCk1kYfV4g5lV7r6Ub{r2QMRTMZ-B6lPNRL)?P~qawQO0cm|T|SZ~BiK zG6+eQA%W6efwAF%O<}M)Engx}A&Z$8{kz;ThrNH!9TSfV_EtLPu=h4}OdOWHy<@&C zJ7%+F4uGe8){t^E?GHSMm!q;n{O3DN41_FN)wMUel8qwmU%1AL8ukHME1D~pDL_`G zhFY^)uvl?H#MtiFCwG*0JzT~MCyf+crQ7J)3v}T;ZBl#Enm};tK5DE4$_BQZlZs@< z?KXeg^k!aAHrj2AuO-8+qJvot%KV&zOK+(EurZIYp_+(;(lSPNxAa;Yg4cd5CYshf ze3vEmPqL7)p{;Cfuky(LnFa`l&4)*#*EoN@WkPk*xev5wvCUGX%AbQ{qC$y{q<8>7uPmE5&N)RvsSlaQqy$^rf zH!`;<#845xAR41Gc0mMc0~LFAVfXI4tBT{%TNxlGv(05oIB`RPDp1mvKHJi#Tlx#> z0n<+dMs^n_z1xzO2EFLX33J$RbpHbeQepNWY~=*1O{>2RB(haXL*KM|V&IDCNikcfC*<5V4auwzdTRq2T=Nf*% z-tgx6bBnE>Q;SV#4!)DCRH`#Gm5PrO*YCw2ME&!zuKsHLS%W{rtQlMkJc`@r_t16^ z{vgb<--ka)viyGhK~m?xTZUogsC2q6LJd(A42J6cnuNt-Y^ht7XrGrNI7xqDGVZ!P559rqbP|J4?q)AJQ%spDG5uGElOXI%W_@$0 z(}p^V0KgAT83B}R+VuB^hzMp1^AS@TjI1TJO0;7-U#Ub2*iQvDE9hfin?MRR$@zZ~^dfHA1oQx&;fSHZn;Rum z4Mgmmn5j-Sf%7N|!C#Q7m7Lf|z%&@27}LlA#`_3)7PSt~?|H$x$ zgSJ#+DhB?TE2Gypg2s4bro3Ei6%PP$^Kn))Er5SQ&(Lf}<_e;A?jUYc9eUKnMY(xgq2S_k9;I9Zz2TkMe4U4Zz z2Eu=bIPA04CVAnMJ*J@P(NanS>0SS{@o{0Nr4y?J)M$rNXtfm)XC!oOr7{+y2#<9# z6H6h9M4t4wh6H>|&=47Xe~ zF4PIbFpow?r?g2lGJ+-1H7^;>?e$NfnIX`Wk1ZKAr?u&` zPUuKkAno%&F)Y`DlvDF#^JAfPCF^Fc>i*~8EQe>!&mncVl6SN4bp&4e3{YFg&B1?6 zw_7W8#O_tv0|n*{6Pvd5M0gjW zr;Iyt5c^a2Jhv(FQRuB^n<)_y4%F44CKE|M2&&CS`8-RnKpeIOEF6mq<}4J@-l`}1n7Q|eG;Y?|3xQw5_EzCYYh5fUDMS{ROq_8Vbv zR~)vOoI0aY8TIeu*?mADKA-oh(;#^Qku%^=udHM$Tbf&%%LPth0=4oV#5sSkPwNDm znmTikz&<7n<6SY|2?No%lxV{KX%S(n)K&Yb7A6CG6x zbTfNn4`JLC&~(H^YG;@ZP(Kv2K`JrOpk$C#W`jn-D4Iwa5fI6r>cqAv6tsWJEEC$1 z7zn;;0sWfR{S7c-_2$+(FeiV&)A3>r!+!#pm;jBK&8rAeYWSmp#fbi)iC3<53YeL| zz^MuEW$-+NiHwtu@-PCNwjY6KSv(Jo#4`hxLm^IjW50%Z?Z~aHKPfP1h1HP|2~c() zAtXG6Vg1lbKik_a&|LJZ^+|7ZWd{()@)m&)h$a||3eZ-rsPxvB=E{F&aS~5kV_zG_ zi@}VRGcB`L4_Z!SrO;XxlMgs^f6;%QbZWr6aeOxQ0NA)J%f0(fnU}Jh@ zFleo%SG2QMT9TkPz2K%a9?C^_4{1DHeMXzr$0%^dq&{XG(PTqn0XADegl85K-j?GMMx7~*Q6%fn`q^pg0G+Qf{vZ~h@3)^CoU;aO#VbHI$RD{ z_Euj-;V2zjsQT{pLraOhAVhIjW5puA30p+Odh~omPe2}-)OE|OLR={(TP+gxN?HtA zAXS_Q;acy8EKp7$O_9!F1BjgjKaK27sC*L~USoI@32lEF&8q7{4M;4|&+~BYm1@ga z=z>8N+*v5eR@Szcvy*XuHeS%(Q9+TL!-DP%ttsNyRADnsxEJ&IC$AYts$dbk1a&q* z89-d0g@&Q)>P!syWP9te51R^y$6oBy7#*G z!LjU>$8K})cOQWBP3~UzU2weJ-RC|C$Iag6u`TX?_aQjn>OSng8;;w^(cl2l#?dwp zEj9WM()7KAP^3EBy-d(X?Te)4K+oh!3dbPQWW-c@7)C7Nu8Z+#cK*aEN!@@xXaw$# zFOz>*<8OjrH5=;%xI!;0O=YR$@<*e)zasq5)v%U~r3l5Ib8F3U7?#Us%fjuOR*uMw zH^F-osj;5pY`m?Jaxbehq~^+Pf`}>t6Kx=hx0Z9j{Q_gWN3CBEsLcYNiwkp5C=Un= zeSD8fk{a(gB{oY6inFbh!*v;F-AXB4j5dFNL)C$sg^0OCs;MahJq-OaZZ#sgKn?4B zF(MheRgvx?7JsfWCkooqXXswKn7HS1Z$#*_#B!|+s{*D7PFq3qVhX>pSE)yTU@JL_ z>0~gVCx%8TG{|6}gsA%O)lOzlSP-`E28iNA z7RVyg4mwS-NRCteY4&~tiGwuGN1=^q368Yn@us5|YZ>SLbWwq9i}e~L#-mZo;eHhw z>#qz(<&F}zwO%%jZHcD&NLxtbp`(BH5;cub&`6I4tr^qZQTVPXUeS9yG%GAOLSa^U zOjDtk3Lprq3`C`rNxH`_+bYWF7sI$CC5m4-sWO+0I8n;-B-*HE(&_{y5R5~oAxSCU z8 z=%BMWy_-WMD91@#qp&_*rPpg-MK;fqCCUo+a~B`#s(w&!6KR8WNK{FO{6skcI&h1!35e z-3#CB9)Nh$bw=PNJ-H;N%6NZ^8hz(F6c3+HrTV!ji^L1sJ5s89u3IX6+DMg3(L=G8 zcXul9FkNveDN3XOQeF;3zQ<9~R>#(k3_-}Wa>B+bUBvxF^%KipyyLvMJ{a{KL5mMWeJ7LLY}3eY(rLYJE}R8|{jm;1=7-?t#TXe`+y2Q) zmrhCUOs2+jh!)?QB4Sz}qH{|a)ahtYr@9ch+)nalGirGlg*va)#KsuXSKCx3Z5?@) z{QgO=?p>JkAO4u^cng0m+HQ|^Jhe^Co=v{dKKW*4gLQ04RCInMlJayy@EP4l0Tnpj`v0kPyEdvh>ftpPFcUTVO_1eoriyQYgIgRF@S$KR*3bT z3UR}MzP$_Keg_6M_f&6tPkplMK&IB{G?3E_jQ*Ccl&Nr|)7IbMIvI}PD12r$6C|3s_|#h7dp{KM*opGtWcj$MJ) zeV>Un!$5oPZ?ZEiuF-E^r|l=9fj`^1?I(llNj;l|;+7;^qge`oNx(hmzzQ-!Run)m z4!QX5A2Iu_;%Fl{9>wH{hKv7OiudbMWN#jXy|}<;C5nHIkH13>XMJ;VcGg3`+DaRL z;Qw%kQVn)`;d3cAXM-$br^Ihi`5)lN zuP8(2au-teYjOd^#zGf}m9i2~>Nm#*MH3)Hul#Ck!1X3F>rTT5gno>t;w3^TW}qyC zg`FqxBR|*e!$4R-;={o0!Ebb?o$~R`V|9<>P7{9`PVk6$Z)fcwCa6??yVKe!AL0(? zcJ}s-47&Q%czch6M zId5t|cC#K?pwH-IL=9&Q z+B7w1%+s2uPg$NdZ8S%MjBBBdfS2`h=Zt?b+sk{7*K^JsD|o$L5$^PPC9fZj1D@@z z@&?Zt2eq-)Zf0zVx2L=zq#I*vJY#AYs4mClUMse$)`_jE_3kbaoqGd(`4+b{h}%Q` z-o}SDw|^M7hz7>W-bU}X2}8u}-Xvmn-!5WyZzgDDZETB(*S%H1B5xD0$lKl9+)aOQ z+~MBtZieF>?iP0|9Pf0ux!d8m)7|0T0mohLh+a_=U*}D{Ga3bU-J1E@%-QN`IqqgFZle| z@ciHN`TvgR|Ao(g9nXJ*&wm@w{~tcD!ql(**hV_f{2iQU|E`0rr7c(95$WZ&RS^9R zFT-jYu;dIQOs=w*^dC0o3*-T3+>H24>$lk^J})cJxhZV)n%HDdPKB7h;o*OjKs^}w z$;B2~y_E?T=EzXJkM@d$cBntH(Td)CSd!$dPV3S&gS~mW!A&Ch4dd~#Xf(V86e`2v6KnSrEFj=<$}zT?P^PT_;cW|Cp3aA)Z|$> z<{r_Sc(mdAi6B4aEal<1XUPc)OFi`hocGe5;*x`-;MMGN;j_k4VW~GPgqdlKYUy)s z&5ws>Sis#pIQHVP{)e2u|MQ_4^o51BTH@(%hIu?|{&w4YKN~uDwp4!%dzya?@0Mck z7AeK$5S~rv;OjO#?{9m44(<-n9gED?`$7|y?{HlRR!!UR-X2IXNOy`8de{>d*J^9f zA#!M`1W#6r+)8+SRiA$Z?hQrxg?+==_kH`d`S(MPYamC%H-h1?7wY7MJ(nzKqyD7< zZW;L6&vQ%AnHj95GH!nl2VT{izYN!F=z2Kpf$J~B^*Xw?yVW6BANJ!;8u|)#EYAii z&mHj1Ti~09Uxu7EsysK)jw_@Kv(SI0e?O$VmC~IE%B~R>CUjv{c3aqsroESRc=oR$ z-%XTn9rCzc<+izFD??9W>`!%W@p-TXN=bQ!29@3nwsvaO`V41u z&f8V#cgVH~?x3fi345QlmR2ndF0Eb~3Rl6MDM)pv_}VJh8rEEMF#6(9uoHS>FkF4f zq_3`eHS7O=r#D<{ji%Z?NA3Pga@^BB8}3>DVKo=h^`=?_5sn+hSPNMdE@f5!ia%zsi_8V-kn z0AAWITiPtX!BH!Ud_yx6df2QS}}ht(hO6YVM;SYC3}EM_OD|# z$2w;GpAYtiy=yh7-+-uJ#{ZSzU3@Q5w|$U97VRX6hGd%mLFQH8sd8I^@;s=hN4Dv} z^?o(FABtwluo`{A!<6q=;#8N$mPjL7YhALnV&jHp8RYOK)pq>G`c%8E8>UeYZ?D_m zZGNt&c3XcBGk&nsTl4RSQJjq^(){~{!w+fDR_>??&Te0Mp)Qy^bO!fk=O`>jV@`lB zZ1KrMh-{EowqpQ`U1u?9DZ-J=FVuW=1gKr`++F8uF8c0N1I%}2OXvJ4TQs9zobw>- z<##JvA2hXqHT=Z!(??DoI8izD_~9d`TBXX#BTs)EIdJ;;=rM7pSUGj((4ixzPKoQ@ z%7Ig-j+{I#E|Cc(_Mme7*y!UYj~qI1>PV|k-8}L5p#vw5v`Xs6nbG6;V#}%k57p{h zVDP&NZc;WqH@XotFz~wH>aVbqH$JXly_>DxYID3+Q?H0i`9kUOC&X7piCTHMBToC_ zRFr=}-s(L*inrut&*`p` z2TntsM_blo2Ts0+m^t#dqCwZP4q*`u$Y4Mf^RY80;N9c!y#jnUxEowPpIY7^?B#P}Dv>vQ%kpMx0Sr@|CB4Z>(wCkiy~!z3NX(F& z9H==tL^C{&jmBKdsJ_rLW*RN4IbEAWNQ9gm9`?DacrP>QHx}ktZ$)k%I=pwT*0O?X zZKmbmub9#~%w-X>&f*D7n>OJ6LAH!X@<0jUg3RnRcvw=MFvRsK%wAJ>Ijr9^-Em(-UA z;e5atGN_FcVox@%-TOm=Tt%^m0DgW47$IvZgI=n<7zLDJ_}2v6J|s% zUxm9pa2HwrLhP<8PXG&KXsLh24j1#HazMAlwh^lOx~)tU#VK0!mirhr;t|5zARQ{u zhGRfE=@6g6xkHa0IC<*G=~k8;H{6zU@c1!t&p)e_gQP!1TT9=i$Q4q5xSaJrpg=FC zm3}dDf=JC8oH2hZ{qS+t6lk0nG&)Mckgp*A7=yQH;E1F*6Jq+1u;72BvG7S~B47e7 z_{#(uvLj1b*I3Ho$aqzM?nhv3*h~3W^@}@0o5scWhKBzFu<&_E=|JmeLkHcOd>6zx zb2)E>~5vd?Jqo2Y)D#8!V%E%C{~S+bM)vJKq) z@cgFvVd$-*n*jzrdj)IS2W);REV-F!6qvvIsxiMEz6dkHwL$#R{XcObJ>I4CnXm-u z`@%j-Z}>xD5x!I6GV-@5E!_?K#2tP9OJNZ$@8FHkhDB(hhhc1#FrTo5A{*4r@SnxD z3G}ce+GdEZ4a|SXHHS4sEfD$N5A18^0rZc^y=pXn1ilW`2Yxl&uZEmH4bO8Ew13IR zSQ{FC3+Mq{E%j6Wy8bTe)q?xNrAlORlF zQDk!UHQM(B9a~x*t_}xC@Vqx12v@_XT!l~9X)tCthl77s>>8iL@1SeK*9XJ?a5WtJ zUp40~C}%&Fb8u1*`odM0Aos8zzMJ`e1Kz;Wm%5dHhco&*Zi*Zw5_X!X*&C!rd|kUH z(BfXlZIk7G2Ir~zesz)PmVcRu7x@a(UVqE1))$$s?Ihja@w)3>U>ivC%X*pk4fNY> zIhEPz%GrNffF=STrF!b z1|oUm^F$^so!tqG!mW^9dJ4Rh(~>@p{w~b-+Ts4b=9NR;-C{0!{6$8egAlO5cf=d6o z0;7Ec`+oP`|6~8xhCraUzxRp_+d#jHN_Uvu-w$iX%f?IEOZrR3gh{?bHX2@B2DQXcuFRnkrty=0zSx1?XzFB`c34WhS>l);5n=?59uPG=bE zUfvb$lm3Zh_KuwQ!Q-b-0soGUwbDULsMgUGo>c2Uu8aNgtZrOe*%-~e*j}$n%tnV+ zE3ZOXwt6b~k;-Y{P)_+jBK<7UZ3ePw`oDjOcm5YOOMXF36*MqHXMbUDHHgFZ8r|*g zfcJ><_lVFBrl5tVaN}%akomAqRwi_JP=j-%=0$Bv}&K&XbTEQm7DF3UzsKikr)X;Sdx@N-4g&p?0c z?R7fc?e2JUSk=$PjhK>4>kslGGSCI_3_!Di~ZtO!RVpgi2LW~@foHa6|G=+~c z2l_b(1c?a8u)yi)ieFeKAjwIcYc+`Y z6uN8h74btSuvSn5V^~{D5&^ocf;jTSwl zKsZxS96~EN=GBq6CQ#zW3!V=$VwupK6yWVd1ED|Ai+axYVD(@Sj|1uCHHv;or*V{d ziu@tsjqv*n6zDLjJO;Ia7tf;SJSAxa2m*;4o8HXCF8K+<Fd*8^&$aCE?m}bB5-R1poy8oeaEy{4$ z^qqI_tKE6`bMloKCQ3QVeVX%*q#PhYG{$~}iA0uDwlWN$MJudXb1$U#(AHEYML$)< z_ZV{P^SZEM)AB`F+E_M5nFD{9N&olK<1S&o!7glp_K4Ojpfm>OI!JQs0%Ho%h>R)g zRLs+0kCKwek{UsB{CBbM)vfK5p;bUIAE|r$Ej@S>Qz>rh^B;(|6XFw$ zVZ?C?baKSXph+#vi7&ux&jL4|MQPVR8fIX|XTluFF8e|1{5r@PIg)=rH$V!MgTEZ+ zp0!X;T5^_p0*v~a51mUUNG=81HoOQ&+}68@ZwGeRgR;i6=2Guc5%_0|qBwprw8^jK zp8=nXa)L4zvSmVad(wY*a1}M|47p9uRCxICkoupnH%k7Dl3Bk>9l=S2=BJ0RDya7% zelSMPmXy^KK{^tDm!&P+yIVPa?{1kLWdOG)8v$C9q)Fi)z|X(Yg~vbgcvEY26-xYRs-W6^-JaDHpRB^~Cl>vW77TYxcL})^nTT2-j zD2OAWW7II{a>T^LJ#SnJEIeW!^BN8c6fSXZ0y_I*nDghtTxi0Onxn56p*dkp;u2zz zlH}_!K<&_;fkOo5EDUfYG*n#Bm%n<3s%)mgNZ;WbEi&-Sv$U}b*QA?uX$XY)B1wMuk#hq&gLDZ8wH;>QUXJgfK8S{5J}_yEi{x||j(Og|f;@YG zO8#O1^e=zR5kmmn?SE5_b^kvqUE?AZb++1^X2Co);(OI*5i(N4hH&82tb$l)2SErH8hZnwWSwl5 z_0WIfZb2ZOBYYF;tWmtq#&q~4G5!m>|972u2`dFhLT2h_?8sDY z(BXn0=1&p6jC z$sO`{%4+qe)Id1NX2Bm!DuPob&ycd^Nh5#G`d~tJ1&qs zjE3RF$o*y{7q|2@-$~F46Gq%Rd_(1&cY*5L$t+xNS!gs2Okt;X%By$1SQig>Y9W7# z)k4G@J=bTnmoq?Nw3mTmzHFk-ATTbY6le^SiNnhlYZYEHU$S1xOk}A&?U(h-&>)=h zk_?TTi7jf0u{9vn?xbF5Wf&dkQ#xn)k~U$H!opcH=o1D(p4dy~Wy{SzpuKEeX2l>X zM>GEKhStm4Wj(ZrKvD{dn3tjJ4EukZu+vA7o5)RP{R=QwdDCPMJhy{<;NW^4^ajPC zZ^DKYUljReWq$aEi%f8d6~jXsR+8TDCxV+zzYz=stHLab!Wa<(>SvR>BtLC5|7$Ra zC}_wfxxnb+eU;m4%I(PxxeX<9b11hSRH8Qz#`1Gg`K<|tgSElB35%@lJ}rOp%~9$c zDp%J)%fAA1_A)Zc*)n8~l*b=q9+0-cs$t#~!E4n{y{M>%ma;GD z@SBJBvSRIZ3)z8f#FW8CkykOeb)Clf@$ixN)c4Eu*6*~n%WZDol}#^YCv<|ju~mMz zPi>Yt@_OZoSFp+&&>J58?-7qpu|LcG5Dzwm|5*ET< z^@WTWZ+6%5b~o96eNWq1%ZeIjW97A|g$nB3J;6ORRxSTiZSUunvZ6fM`1@3vLf6vV zOZHg5DRLVWxml1~F;-v8|8i8{;6B`RO4K?_<%G9i*1}?NKiOb?6!XM;@Vi=-vJdS@ z-J!4~=E7=x=dykoy_$de#Fk7yq*#OCO;k#58?3YU#TESo06g+_2DG2T{L<}6h z`v891bZ<%Kgy4*rVI}!~(`5m?p%W@KBI*vo-vdHd2SqU9ANqe)-|w1rSQsWusBQ+< zp6sv&%W>`%0HJG%y=(&Gp#~n0s-ABY<-gPl_ zA33CSMG(i8+uVOzGg{Q)BIfzUZze#&BqOs%D&ukc?lLw9RCx_n+k6ED5okD7ZEJKz zFS9~^GetkANa}F7LucI>#-JF{6I?@%zrE*zp}-l2^p#CFEbJaOD{z46*>j=1eT%>2 zb(8dK2ToUB&l5i)4T&mLq?J{iRK2hZ-to!zUF)QC&q#mwfQ`(84WViQcRQw_38u`e zDNj7BWd{x3pNm+pc*u@^oqN5x*i5lt%ZdfV4T#Oxsk&mtTG_Kcu-)g#bc+p<{QrV7 z5svSbUa6xbMb3&XFZ}|wz20SqA>{__!fa41CP(edP~!@ zm3&$1Qd@rpu#o#&xyPR%%{%*g9aN~46txKj9sf+i5`+Spw2IOQOIU#n#4PpHJ$W6o z78#1Ci``dgV-{qIw6Xi<_&J}Q(liR#ci=QvfTX~)G?))P%C|VWAO1Y7P`@wBU0&ML zCB~RHhdxGfAa14jL%LMK{-)HW5Y8{hx0+PgFBE_Ms;ZPR1mgKP{*YhbdoY(8(F8U^ zYdOLg4Qj?dYvx%HWdBkrZT_0}#3JNb5UcOPOt#?9Zv5G+OX$xR=zSnjB*4Z5-Je#m zXZ}WbxL;r^I!BB~g!THS6p5F!Bt;-L{BQ{{=tq#lX61v!z3 zq)zAgK@y*?I275dB(?s?%Iw$XpACAh6ezwIrtLk57H;&Gs}G}<9P5)9nvECLKGJ_E zwDRbgHHVr)SXl8ua(b&6nb{sWc;*-_PE=<bYwwz66d9oTg9q5{uN5zP<4*Z?I6T*&wc-O~6-tj10upUX-=$E2nSy^TV5NH5NsY8L0aWO*1ILaZVv41RDu-t}MP-kS zhW$|$v?-#{$1)F#KL0Zqi8A7vS)Fyv@tjFzjiv-S!dZbk=zi|i)TArbpB82EBqJcLX3;s9< zm~Y17Eump&-Q|#W6pB9fCbu`FnHBb)yLOe&QKZ8fM%crw5X{yQnB4^SPtoGf*JftQ z==MNS1!zB5IJq_vM~^%n&WTtE6m|XVqC>$@DDJt#9T*pc!bvCDOVUB3w!eIRCVwx@0p#;S=z18&EkBJ6UZq9)Ic7CMgFq7Y4T zwm?QvRvQ?6xLkoIXZA?*v1R?C{1YMn`vK&8Nl2Gl)yuu?5%CQh^(& zWYQt-;oj6KMBrp?uJIIHSz2IDJN`)tK8Q=lBuH$}Xo$oq;+lTnF^_Et#3-W?&^|z; zIHufiv{8SC06k)rhd~HqO$Kll(3>18GVm9LjYO@Y$Zk6 z$n*L6k&DH^x{`khG3*HjLD~%ch0)<&75$}O$>H}gzG(%YOr_JVPQD&dY z!w49Or<@;gIkxJV!wgXv4NJe~i2z3!O;!Y7z!v7t+%D-45)PWuKwcK+U>J}o35Ef? zZO15e*0LkmYYL-iO?x1MQI{EwX3N4o0+2>di4cu*jk$kTt{GI&v<1UwRAw=lC#>}h zDktZz2)1ESvJ9mm&uy693p0e!&FB^#0tnnE0T;24aWj&T90)SSAfqCTK3JqUM943; zZIt)QF8?cCO|{K|&J#;av&{kSy=g8-0Mq>ap?1Y|&8xU~r(LmJ3(qELdwt2cSPC*% zvIz3HWIlhTy{gyOLD%NUe!9+`8=~6N=Beuc;l%+liP0kfI5-gzD<9-03>XlfR#9yZ zKaD$y=)>@NIgw$&WpJP|R703y-j9MFqXJ#quZg_vwepS36!L)@l=!byF1=GdFo4~q zER+SG7g4naoTwpCO#6ZomIZ3CTb5@2zwwZ~I23=cEm>AiJq1ryou7~1cpCoXH^tkV zg8nN5`1TJJQI&aR)m3fDj*yk%`%&xtJm(YipT-9IIn{=JQIy(;l zEk$eosX_Q#ZD?rGLJrz?)IPX4zk7OIqLyk zt51J!YnIRZjrt^7KEW~$dBMPLRwuokWq}x)Tq*oTj!hf;3KB~Ke8o>OZ5&r#XK&QxmJbg)9n)5Y6h@CI^M3-Lpi9#Z(+L zJ7`RMb)+a(W6p!5xZ+T5(Z=<1PqdKm7B@uzvN4hqF%=5F-KR@qVvZpthV$dn#0DzQ{aRm`DCTbX*Yd<~H{mU4#58l5V z>M*@>SIK15%~G(hOo$Oq^Ow+M!+;c)e>uorL5)6!Pt1gw37sdH{MHWVwLgR5d&=|T z(*T(Qxd^ZYVUl@M;kXpXI@73PE4ab89fXG1!`%%@iAp3^XO*A`B?Gyn<~Zu3D^?)ftM5BeK}XGkIV6w7($uava@M zY`JDtDIT2two^qswy8e@DYE_G0V}z zWK2&X7m&TGYBKj7$d3dBlD~+$ThQ!aZ9IOX3brt^!GVwL3(TG#*isUhS@#F=u}>W0~3PSavoy zmYcQ5?AiQSe%2XtW_!kZW(#A5+1|0<+2UAnwr{L&wlr3n?H}u(9T*$XHP4)~$5y$+ zUam6et{z+Mt{oe4*Nv??hWlfg7lCDh6vLi1wbtG6iZ!+l?%#qzg4`_JU+=BEWQ}cr zdmAyvvg^RTTj<_KxOaamhE{R=;NGotuk3BOa+~Miww2d|$XH(K|6}h>z~s8F0sv${ zo4?_DulA)EwOXrfxhzYzBuj1Wn`K+Qsnu4iy4~H{Do&oO>b|aeU8~-E)vd0S5@R_F zOM(dy0+=9$Egdo;GZU6!UvpTm4YxG?e+_ z?8EeUZfhu@?jiCe>kx9O>j6sbVY#H2ul_uA3&e6--5%CLNHf0~kT9 zB9zT~8fb7eS522-TtdfxE)F4@Oyrwd#RSxXQ=TKI7%`74lbJ8Wcrt*thWQfEtT*i2 z=#!66r%RfuwnR!i$_2owlhcruye)^(O~sYioygU? zt95$L*+Cj<60c2vCO+bsqTJ-khs$<@B<&p7{b!$((td17BjIM^VA_uLnvU0~UHhzx zsFlwNj@z}FoTiK95~6k7MJHAW&MXJ14Y>(F&%=}lo<;+CM=#NA?8FHE^{P7*aw2l- z#-3`>dAM8wMuuUhJd_^6dWKr1_ZFPPgI#E739WXBzuDn`?SUhqMzgQo)OI}_OwX&g zOzwElTd^h)@`bw7Iho2W36wG_$`2W>r%i}pNJMi@$D6rOcf9xT2iFkJJjgTZ6cIm4 z_(qZAiLGci;Pc&W|NMUJPc;|;K&Z^oJ;BN81gB}-LW_@ybi&+0@r6uUAsZFjjD#q| z1naz0fkx7Q7PJBl58ix4Y!QO6McQKN5&i7jPjPs+G=WfPqD0-CVT;3cKZ6_~v3)j? z7#qJZd}V508M$)d!uYI$kEV#a8m8WFZ!HlPC}B@u$Tcgbs2cu?rfIk`S~;SF)tOy) z7!{&8Tk5=>*`^`z7Y->5Unx^$`yjXVJV}V7NbAOb5N>nq2RwpNHR^_;&2%IrY~z{HGNgpS-qyF&sD)Tw8U-ai`AS~8G^MH z2FvN?^lTHd2&C@0D%gf}Zad#nYY=FtS%zT4(7zyO=^4$`>&^5zqh8S(hGv{^ki$?- zH8E6wHP?hjzW_NC_#QwSvxPu1ZE-M)GtFQHUyD5X)Mf3r>~S6Ei2-)Y_m&Y$8xJp+%s$ z_!c#BEq#+B@T{Ps)q!FaRc6z*s{xX^O-d(Bge1j!(cZs~Nvo0-hebw?2GrM-%^1&r zrsq9_bIJu7cDj$g*UpJYp(`>N!6i3GUsEPhZ;**TrMq`-oD+)W>&(ffH^@m+ar^bg zx!7b2a&lT|lX6Xiaj|TS0*O?|LAbh?zQ-PsYr?qJy&_N_<`)z41ulX9YwO_pPJ20H zC1IS^#Q5Vy8g!TuZ?(lPTG8Q=(aX?(lQ_5CLw3vZofcPW72g}Sm&I1Nj2(|oN4s{A z)~gxck_zv}g!Y7@;>H8N<J4F&!}nL5BfqJYS-;(D#^mmmSw*hGimM8%Ehzx&nvht37lrQx zvk|b<#xRSjQLx9Og;l+}u>I20|Z##!=?luf7!T+zKtelh?qz2K4ry$^Ka60G*A z{hFNJ1m*!SZwB)qn74p=E10*b+tnTFPW3)8->*KP?ouCwSzpdR1m@jfei+Pq)V=U~ z1b&agZy)^js|VD_)Pw3F_zkIlLs~5RID|M1A&x+ZqY&a4ggFjjPC$s05atwwInDaB zXV|9fSvHV;f^E*8V}sczVQu&n+nRlvZOfi#+q1(EW(2~FLYOgiob4bc8|Q_1%nRxS z3dp=8f9n^r7uAb*C)qAq^`YrORpKJ&)eGuHsFO6_x+HUwJ>-~E!i-;k>{ic+FVOa| zde&pxqdwuW?N!ftY>%iv48 zcDniu8=?nJJ#UUP@<0C4F^Nm?l|6Uk$VeQ&=GGuLn==oc$heYxp~J~wju1;>?4t2( z=sgfP8%B11f(zTL8jOH{@mmG8L5n|HwehVzt+te_Xt+yWY*uo58gK0Zp^s}lvF+w; z{TgQz&dycUD4wOQ!zR6*Mpk4jO-b21^G;B~r;G<*n~d%6hOZkuZ1*E;9tyV}f$rs3 zT=+_M0mv&zd|x%Uf;4ajXubVTWc=Kk$A@P4QpfdBoi99b`Byi8Hu$zsuh^f0v01IX z*^ez*S2JCll)~P(Bp=}nj{^z`ZB+2(T|lv=)xEnNAbI+qfLjKY$y~?Z9FL-{;}I;M-Cy z#h{b=a862w?0L9-U;`nU~3?W4-w%MRLA zwU_N*OuF9D=OYJ%P zmJjfYMm$3W)tUXd@{l7EIc{HICh^BoC>fIV_(tN71AcMduFMWsq_=|t!a$v%cy$IC zX;f6in(HL?l@h8HlgsOrom+GGd@ZO1+d*48(Eau?4VDyY9wl~S(N{xOuz=S>mhgfm zf2aSTQ__cjo#NtktAG@R;*J^GSzxTCW+gN>1CSd@(5{#FIoeI$s?1vZuL6vRQ5mxguN~ z^BCQXFoSpS5SBm9bLDq&_B3mFl!Wbr%boVYZZx;nAlRS8L5G@v^X@_H`y(db4bWX`jZvSLx4%o7AX#!3jA= zZk6bNMC8?$EcluT4ycs5{(Nz#}yIo}5YwNy$R`1W2?c5!idtKg+(C4!DUj3SgJzm|B zyZ83($bBwrFZi#C+~?(IE1B@sSK8&Sn|STZufP6!rt_6O)KRA?5F*rBkJyfLA@D>geImdzUw?Og$X zU;SpATafc$W^8g|a^AIK{gG35sJWTp(edt34ujt-OXy>epT%&Vv%4fU7xw4P~7NeT1>Yu;PFaN(XZu5E~>QKGY`hfXJw( zP0!hg8EncH=Dg`)em0igYbZd4?qvzU-4TN}AFVK+g{Xk|r3Fi3Hj^X$hI3ilht@-^ zS#4Nev2QVnNheADmAdxL3DYNn@hdE?RatXSZTy9=Cu@mdkG z2q7`>Itw5Yg@X$U)f*7%dK?!Y_N`9PZRSg~Q|>2hhv<&QO1+t`skje+0M{pl67qFS z=V~i-jS3f2xPCgAR+(n5iGp93YT}KoA(4yGI*`m-v1F$A751l(oH=vq(9y$(k6;Eo z#ZC{8K=Q+tN}9srRSZMbm*}p4f~X>Xn-$rp4;944S6Y4Y)gx8|{5NsoC@yU=ya$Qv zPC6`1A9y^G=xni@8y`r}3ju6$D}vVP87l~S=K*h+E{^0Fw)5Z`Z$f5j8m`M zY=^{KbI&a8S-#*(p3;-KNnp~%;4+6ewG zl={jc{1OX7{D?zNNU=~#O7!E=20oqWm3%*P+3q{)i2lKaAHVsYKmY;HhG>=h=3Z)D zmc<#z;odiVsU|fo!!Kw>;QW>yP56D4zj)3E$or(R&`r; zJA0JQSa!TDvma#pSnMS!yOUpgXDRi*JArak|ALyz-p`VM!uEG+GW&qKBfCorWFJ)H zchl;wdlK7^vD`tKiwD?a5Z^-(-w&}vY>1>NKF$uK6h$?3cMm&qPs;8E-ydd2*)i~a z1k69ejEsm7QV(VBXJ8lLW^oJHyVRTt)S<1&KYudcp4?JBPRA zvWM7{>?zQHht!?f$Jx{DJeUu&VKxH#5jM&;gMO5av2oCku?uVh^y84m$Jivjjys_a zK%CF85SUMb`;W3qyf)N+aG#>Lbf;8l@$}s@?D9R7HkN`=A7>dB0iUzA*;Y(_f^O5D zgH||KPC$qm-VW-Ms>G)6(D@F0^Uv6f_y%M61bdc$+o0BauLr>8$Ji`)VRP`CXIJ2N zm0e@k*$tKj`&-y^?5&{V?`=$B&$ArZ^Wa`!4E$8Kz>2H{UukR+zAUo}tFjuavxbP{ z<|_xYPpMC|5E( z?AzD}Al$dZ?>pFcvJcYlyV!@=ceC#y^?TVX?EBb<;rIRQF1yD*!hQhy}bFR}l~{uBGp?3dy9E9^7uR{?$v zV*M}d*V%8d-(>%leU|+e`yBf`v)FI5-(kPYevkb=`vdkWxV72;!~T%{5&LiKkHPkT zCtyc6%pMn18?7y@B!Ty5%CHtT3uh z*eqZW0cz*xu&%(o1z@Y~&prd{Hh}Ga0(JoG1h~%w_j}+0fL#dCI`9M2g8*rOhdi(w z;9-D00DA!*0eDovK7jomJNi9BwJ!kd2LK)uI>JE@*tt3cFyw*91q`hNhdppa=tlvL z0UQ@_0^p>8Qyw_&F`p4|7T^hha{`_e@D#w)0OtXQ0Y(5u0mcBv1zZp?F8mOGCInmr zm;`u6z$JhwfXe_GfN23U0M7!<3YZfx4{!zGs(@<(t_!#Uki~Hc`da{=19&UI+W-`R z=h-iTnuAe;XV36sb?7I+5Dk4{!kBF@S>rhX95IJPvRe;0VA`fMWniJ)QtS zYVj1nX@D~TX91pn05}KmB*0SuPXi$BHw-WWFbXgRFb;45U;^MGz$Cyk0G9x!04@V$ z0Hy(E0G-SSOh2oQ~;^~HKEr58UQx|bN~au1ZV;*0W1UD0$2fmXaT$(pbc;v;2i+(1b6}9 z8vtGexC8JKz`Fq64e%a-_X2z)z&8PWGr+e1ybs|00N)DmGQhV1d;s9v0lq`PcLID6 z;JW}m1n}Je-vjWy0IvXi-z&eC#rpm*!1u!nU;?Q2&CVMbq}qG*KXBf_06nfI?qa*# zr5j7wI`_(d^2@#YK^0r+BY00qeFnJ}s1u}eGy462$8QK#d}FxpldyVx^%YoPPSJ|f zcc+P1Y^ZDA)>P`thln4Xcsqdm(YOaZnyzU1N70|+8lIUnXv;Upn2|1N#ZrQQRcluB zs-70ti*Wav2Q|{mcxyXn&}%)4BUjOKhP#7KJKuGG`{7Cg5;g2h`a^29LZykhwTpzi z($!pT1tX}^{d>CaE)o*A_iHRsMOh0Fa}^V#>kb%)=E|&S9aJ^8kEg|0ly-=@I$Z%^xuhP|3E0i z!uJqE&SkJs=ubJ6W@|3f>nLgy=-73gd0JWQ$k11-c(qT;SyG-qL`0<%clK> z=@hItIzJpim_77*DF@CrWjhWrZnnC&FX0=1p~SN z7hr%HR!^Zz&49KPP7=pkmhjb~eX z8{HrG5ra&~nv<=DH(O?@-ZY>J4E)O4g!$-pN-pTRg2J?-W*XeTJ2w=+Cyb|mgLHQl zx>EkM!$Bk*B5omX`1^}B!`G1#Ge~zPnN*JI{U%IG$Vyc(+F>4?itnL{sxC(HlXN9> zy@5ej4)94_&Qy)ZZ#Grp;UW+!%wRZQb$zfJ%+OP7OB(GQP((nr+N{`TmoQNX%xt80 zkM0(65wF8liH^UJ!%_j#E7tXY75j#qugY*!_nLD6O^kKc@H!28nYNR7!hk91gCw|s z-wO-aZ10nb2W1bE$Q~W0X0NM#;|WGDTdx5t&iy9hzn75K6^T`_*_5%sZHYw1oJC1Tupv`uVE+wyJcX3Q%*q0?`F-%z&4%c`v3 z=jQ?$Bpw-7PbFuV3O(zCZ>*SY@?){h&fs$b8!fw=1&}Qwva}N{*O0j#v9-L=)jbp9 zN-wp=U)pVfT>mA#pGl1Y8%Ns#7Ulvgk>dl4mQfrgzx@|( z39RY} z7f%LwT)b~Ea-p~bHyiN%r+GN?jol63!&Zp4gLfnC*gfRmAK8XE3f_@GjX}N=$V!-m zP9`&)L7vM#^bB#jv-y@Fk6juwiNi;Z9y@;GJ>KK1LBWRA!~<1_DQhhLx>bUBy{tLPV|LGn*P7wMM^+h`&qb_J==pY#LIs`BN82P32nFE2i#U}z zvT`(=?FyiuDiY+FCi#NuucJ;#CCQj z_U?Q7>~s6}Jw0=-tgbvYbl~az&+Xs;G}>WN023=TM8s_`8gSF=U{A^@*NaN{5BS8JkO##NRHCo zU>muygxe8+{gY;hbE1coj*1je{=p|H1zGCXhYQt$U9};8E$lRn!uLAnFz36+_>7(gC2C`Q=~FG4-(i$&u75BTgfv8jsQ3kZo(vYu&2?#7TA z81i33vl-_h@FFwdq!9P1y-e{X?#M<9`v*y2iLel~C&sI_0efje0g-C!)oZob=0kT_xNA6$q^>{Vp@d4Ve1 zLywEcEhM6FIk)0)Y)J3*u6vj3%?iVHC}(ApMMzwB~L0&M0Ro=d9Oj^q$BO6A!5ZH#K9R#5h6=*?s!1gh+&}UDl)08F?zHd zG@ALY=Oz6LF0WKtV;f2?U$CN=ZP~z_)h+TZrH*Wc&1M4@x%@H8Y69;J29a`b$5>2% zBnkrxpCv5Nn-c};j1c-*k_Jm>C>F)wr=<{m{%XJ$MHlUrQZ&Sfg_V3iv4Rdcc6^Nz zL4x=n< zQ!t^x)u8^28D$YA5(^=Yhf zHOGdi@iLv~>Dr>;jbyWv($y+Zpu{94mtJVXs!UDW{j0tp*su(xuR!FFidAw~BK!6~ z>ZWsyFFBD1TA@t)MV*U0G^_({j!T^7hQhLcwY!L?vMfoGQJ`0`R5_qm zSWlzIdTH*o-CkgQjTc!zxW(Hs{Vq_Gas4~krp5=^0H-H!M{0xZ2)KR>Tt7~(QA){< z;nQq$;}_W=#E@{@KFhW=KF7B1K(TNMaFO-DV%sQ}+bPE9!4+SlN_wP!ofN4|f!j`U z+X?9<$?Y__-A8UmVKe|`-A=-c6se`b{eE(PhTP-AJ!Z$oL$iTa>} z@2uSrvNs8Ejf%M35CUh{LES@KqQFJ_g;D3ssQs~LE)bm2Y{nQc7HwV~kB&ZS$JB}J z-8-~bTbS41MM#yn91;G} zGKq_+2B?~ty`Olm0`V zR)VP%Go*c768pEX+vU(r*M6t$rNHB+NGlhJ~4vE`hC?s*4kO)Ye93_R9V;K3f>DCtBKb%m13I(!9VTkw$#hfT&m0Ybz%pH3$ z0p}}!m2Xl6UUx#g4XZyb-pmY=M2KEoH3maMfM<&KP-3zklGbSyXH3l6o4m4qfx)`5 z9M!i&;{>-6`{%pJBwBhdc$>=}hRz5Tc^uIfuEFse98J&_`OaF@sn%G=3aL%KPL@8VCsyT7!nJk6SLQDqI^BsoPCBk)JJNaN(LlT~=`8~mVl~8N>%{DJ z3YSqMNo&{G{R-dIQtY58??UXS#DwS;E{X*f)dPN+M{zHf{~gJGDtsFsMM>0qrMq;A z7kU?9cyc=lZZul&$^7MS4VDA9VFZ(JmVBXqDv{U|BGrPoLqO<2Pls^O%Td;e{{D6d zVvfPmSSI2}0-}eT!w^%1mbySZ(iY1{a7(2vlUtM)9k8sx93fNNa$NuEHVLdo;*5O5 zUSD*joJaLPC7I|Xxz#NLZk%G7+p-|oDczD;)0QoKV1(4y!#8PA)jvayf7q zoa=2}2NDk1o)8mTV#>=?cD{y5lOCmivF;e%(l}iI1gTrD)t766r>@O&QygdGodPEk zFTXk`4!fefc+b8M7d!OVVk%Tf?5(tE2V#KaoN>CETi!>VwXS@r4MFd3R zpVsl<;swMjC}u0L36U+L+yNQ!%68d)d6058@i+q(U1p!ei}mdh5Gtypze?y z2o{5{@+?l~1ej|qIR``sOSJ=keD8vxh^3xae-Vd}AoTogkNv@|eGh+l3hJKuss?r= zpblwUD7_C`q=}CcF_wc)|Jv^xXP&63_d0_Y6T%xI#GzZSH;W}t)|@D)zlf_TL+RnP zd%{ISiF56N#bbe3m%2qG(KHU*np{orjV6&&%%4SXNjw~F=zh-Zh0*kXky9s64yCy_ zX4@{SHvya9O;={bEf_a_hP!=LV(o}Kgu3cM0yL^Q9jh5WF0&%Xo?(Y_uf+7N8TCVA z!WILO&RFG4Mo*ITMy_`T>@;{ColWmGVA39R1l)bUy<%Mr;u&SYGZNPjJXDd2+ql0W z*_$)HF*^R~58*lCRz8n^!${K~_0Qu$@8&r2uWteAA_j!Sg`qH+(}Q5%)0R-s46fPu zOoX;;f!gj6(c~n(;;Im562Pq-CcP+&2Qb7Ir1MgGq^VVy=aLlf|F*Olj%(NL-A*g5 z*UK|?_YM^_s@=tDQ9^stL>h_@GF;XlHQaS^cg)_L!|rp?S?L^qq#lAVk5!$nP$5%P z&rO>{hteAiL0t5>k_tqNBF@Cr_@-{m{&ZdXY?Fd~otdY3|3(t>B?B>;4uDBco=kED zfUeb#Z~}0r!+j_;HJq8SVyIpjo*3U)_RUXV!*3V6wJ4@jx`&-WMgbornnX5()VPi? zklN|%0W-A7_wAm4Zxg`6B196dk?MUOWdoQo>^LaRmQJ99giqp>*n+7X7*qN44n-Uf37V)?;#^llR65YXlU47Zz~xY@=NXEW7~()u+1>Sv)3r{}q} zo4Px=yCz=Wiqwl>y%Tlyt3$2B-i7bX^xWii>^Tj+Uet4cRl)1GloJwmNDRR`Bn-bR zb}+qr_kMijZg{rN@Y)9TI?o=Od-Dq-q(hB$V}d@0{Dp~jTBjm%Zn149;evH8b{0UH zx`qi4rROvhHnt2A)KSFKa;`?3Nt{Ko>Oq|jcVyqekEn8t!YnlnaXE!&if(*qb=`?X zY(V0X6H|?Ug0AIpj>^}Ux(LU58aXzQs42Wo3Aj10RWwsD;^zFEVYr(}MH*c2gUzwn ziKMHTbl?N)bv#7CQ>>gL_r(rj2*l*6H?_6|zJ_~#M9kRJ3z}{SL2QEiv0cI9z`>nt za1wN)@sN)E?9C<tsZ$iOdxg@_@XXpK$BU$8T9gnm^fXS>ex>=?iDjdC`OVG8PBdNfvOUw%v5gg8)@sL&(xht1hi~a85L=R@ zSDIo`9)q|Gx=C4cr?gAFj9*?1NtKD&eZ}fs=Il~Mbeux|V_VQw6q-uYVWCa)G|r@} zF>=Iz_S2tm=4wLbBS;}fIE8G*?1tbox{pT2Q?rCDc&7!n%QCLK0i_3b$^AhTU&+O@ zhDd}dQo?I^SUK0x_Ic=Bl3FI~X+iI%ajT5ZR)TH5vlo1|;a${u$F4nS*IUn}?aN}` z!SLpBrt`I6Pl&xka2f~vb%6Jdw930C$7pna57~pRoN;1b&;9>XpYBLcblghd1+I2kd;sz#Lj1Q67Ksb7X(i7ir4E)c-Ho`Y~PLR;d?k6Z$_lV7Z z(WxE0>va(yXJlXC+t!>5y&bhXx%%$td+<76=A`XM1@@(CUA31=Ow(05yY*h8e}g`5 z&mHS`c6(XB8YZc&R!R{9J@9~;uMCi~(=%?{BW9tVvCc)!XJz}MW(uG2ui5GkdGD?w zvM?pQaCC?E(}k4Fk6}w2{-$<{C5ml-(-Z<*_!e|NUoMZtS$O4Fh$8Y!gfi*HM(8FwCuU!hj5`^Rj)y5VL}S?AI0JK57dFG6Rd!qO7N|Qi$(z zkZ5BP{zr?MBOG^fOjE+enCV`Xfk~T|$GD?I&o!`$Xbs4xwF}VRPva~RUZ~`MiiQ<$ znhU3KGZyA7C10=GgFnXa=%!fRgAoerjC~APbH=_{9#{h?K&i&`y2f%SetAi)yzxbT z-Uaw-Rb05&)eVwsJN5YnlhPx;szkPtbnK6NmO)rm?q(r0Q+&>V-4zmi zOUG!q3Au2nInfSBIeC$PGYXmp3ny$1Jtx@`nxp(sO(ntLFjK5o0WZkn%#4ej z#!HvJ`8nj3?fU#iy(*xOnISU_SXV|Vp=KBs&oaHF8Wd7ON1T-xN(Ghp-LTt1`0_an zkDI$vfLNhMI_&GK#5L!6KqZ;5HUfmYpcR`!P>!c7)Ar+q)tJ8qsh1{y9G>rSyVjtt zRog!ssaF{EYAeDwx7MrWZcI&%2<>D7Z)@c6M)mQ=80 zwPpnuH58nv8KZADXpr#zL;+j!M4=^Si<6)24>we5*KJGD}@R(1!Q66=FjmKQ$ao2dlHF`cf z!{OFG?^TN`XTTrsY zo}j5*QCENpw!@Zxm5GavrRw=mttnULJRkPwYRb6B;RHlgYbcW$Cna4Oc2hdZ9mahQ zBNu%RV_BcW_=LwH2@YK;Og`%i{>-$`;nFpq!_Lky3dxGvAbDbQ?6cd zEH!0h%wusrO6KdzsMq55gIZq6OnbU!UtU)(%z8U{UccoDpEr~dx4n*n_e#wjFMSKT zGU^>7N#6B;g>NC(Rr%yFJmzs2#s4K4H6I;lcQce9f!l=CP&!M|Yz+r0A&I4Mmcw3d# zHE%DdD48j5Y~aw9UXm>-m#^BzV=ZOGMQ*Ax?gl*$4yM-uB2z2Mgj;*3$YJz`$DzMF z1dK}TH^UPi{5gE3E5@3yI?&;o&!MX$qC;1uV+vzao)o&<2ple6@;OY7`@Wy_em|M< z`DVO-`Ojp1kr|H6doZG7k<{JV}oEgO88;946*{ z4i_^%hs)P}4w*@x!_2VXVchTFFX_w;pTpdLRiDEZe{Egye{yxatKqwc5;lC(U**ki z+?ZU*x${*&w@l7W&Q2aWcI^03@Lo{nGLE;VT$t>d4HvWuc1;_dcl(1wUAfRz{R_V7 z0v)=CCQb<#eGc8YXrZYi?h?plVFi()Ysol+teEQ_f_=q`uQH0Pdl;vRYRjFSxXnp_ zsMz#iz~WN(m&sDj9l)s)(00z;&{tA%?M54b>-6R5G~>$(t6qJ<)I6=dMxLex|FNsiaA|_q?*cqyxYCc zfWxw{pOjaWOHMsj^4PUSLsyE*6%QIe4Bi@!4LhvncI{L}TXcs&f5lX$JS_ldw*u3d zP1^NU>dMsc(B&&r<5R=ah$gthx>QxWiMZ8{Y;oB$=Bj1ovOCAZq+hLg z+6Tz7%Wj@(n%B#_lBohV@4}*0Q@K3vowKSd%4LTNujRaC96*g+MwnvcA$)%^}Deh0mKYTr~d>Rm1{3)BmLKBQmwE;qq) zsf$#pd+IA$H$0?rBj@n}%giOaP>oze8P0Usu6b>vP8l1_H?M(1H#yrVb(1@NjS3RW z9(uZADl=U;2OLJa=9LCz$5W^V&>9!)9NlcT+(leU&nP{Leb_20WHDE~1 zb*(E?M$tf=Ac_P5M(4csXOy}ZC@BN`tJCR?lHnrwq@gKOPCFYgGq_#HC@XW9x+1P9 zbCW)YuB4MjRk`L+gwR#HcT>Q@6MMb8W1_=cSLg3881!`GrZPN#)s@^$L>hKU+=`-F z8||*Oq{oRYmz^%ceZ+#h&oH{jT%Te39hQ{2ai2pMX_PdUv2b=;%gVg7)HhlccWu~X zQXiTpVgcp^u)2+5!dlVoQl^J&NSQ@t{uz7Ms^0`;?io>lXt~S$|zVon*7X@%2jBm(W{wGikq(zh1cnSTh4WpxT)nFt;R)a%ejh& z%3Q9y^mgB^l5YobMZ;|Jz41AM0vH#RR?dpxPG~~~Ygs9lz^4kvDh7(>h|N;21`ag^xo+T2r&fb77?G~z za$HkM%a=%FEz;B?X33TagyS-ncyO>Q%U#<*s1jelVBs8>|T zm!8W*QRN&4Ffh>w?iNy(R|;43uPX(vQP6t1nyWPNPz{a0@Iw`d9;!aCD+@Y!>$j*i@=)r$q2zN`Jm0L~ z1eL>ok5{10bp1P|K%f;X99qEVr=?c3Fhoaptx#b|g;EymdN|UG6nIX91*OmmgE9m) zT7U*9kTY`?>@fvZ(VJjbZ=qQGRvg9RsD^sTaE+!F z!A-p;v=VOTK_7|WMxMD0x?WP6IV)Ds>rmT&5T9ItLKY0g)}X?1+pbXo>k_6U7ob-F z3NGfs2yIhKsui4_EhP^FPlY&DRpFXpYTyE8P%8?5 z<{z}8-b#>mp58fqC!KZ!cFYyI)+7z{iP|!0*hrwUGJFbJMdTCAP#dU~%A{%hE3Lw{ z8fi5iajivKqeO8S1vd_Z2Wav*nntUSG|C?-SkROOWZf>xv6FE2n@7U~LUGLGH_ow^ig*q2Z%ktX~q%_bg1 zFX*}2FZ@UjPxt_x5DpS(rH|`wbM|ltWG{#8J0iGG1o$DmutK8>v>G6@A|zJKVZV$N z0ihJ@Rt$8lK*cWt&M7kNHjyHK;#igRYOdDm@`LYyu?)gC$Z@^SX*oP@yFp>#bhWAOnC( zVO;=0v;}2h(F&GokWJh)!pKWddw}3Ti`tfxUm!AgL%B8_LQjO{4n2-jes zGyTu$fvpBpqtQyZ&o1P{yDQNGC=bOd=SPn+}QZxD8{0zzsZxmdlVtIS0L?wS}~yqFUFBkl$P($JFXd ztH0a1VfbBi=<>L)g~Uy{tdv_2DRikaAZpaAN*Tsf8LGQXcvUWc*YVDPQr25>(kMF- z+{D6py9Mu31LX1@efRXSpfRR=KH|Fz}IhDlgMKR|c$6UQx=>;*~tk zN#ROSX`)S|;S3s#vIuTaK_ew9nptY*2)BeQFl#VNuGH~?u~NykQlt$P8n_A7>f<&o zUlk6$+@ad6K)0)ZAAv9NX|kz+CRbn#RhAUcBDhn9^Ed8MK}mzvoQ4*fA4vzwCxY8j zRmg0$s8nIV;Vu+T;8hr1RShSi2<|-9@XN(zs?I7je6_5ACRd@ps}-8OfL5qtv^9+f zg3(shxe+R}3fOoBjF8W&sgSm!RDoc_T_hafH5l`?yi%)wgA+3dzn~5^7KZVQ8O4nw zz~~X&B&s!q4oy!%DoSpdG^}aR5TDf`SG5{ODc4}qsnyTdR%&$}=!|d;sJ?n@3uzAG zI?pM*)>fah{T1@nT~>=UvT9JgnvU~qux4PMVMKyO26Pv$tzeo_`!l%?eZO8H>|G~P z9BD>;SLcJkfbkjy#V#q0Q}Nmgu6h)i56y*aHE71 zi;RR=qk{BUq*2G2*h=8F+-9)}gVEaLnw7ksYas=Kyiaen5~Ll19)1)e0kXJ3iH937 zF)x4%WW8Z3Nc4gRwg~PP!Gs#YeIjgXBtP`J0$NOeuUC2RmZ4x_y{QNd2}!*v{Gxi( zFnAznK7Cn1&7ca1;I0r>gi*lpBIByVU^FC2TRSAd8EPyHrGo13F;qQYcPQ2fZu{Wy z0CHywP$v1D-M&Ym*^L_Fa&Ru`tzOa`Uvf4Yq^&@&!|fpKx4036SlxheVrWVQnhH07 zpmn2vhE^*9*$sY}o3es^z<@e7Dnu}Y1|LO?N_{C;hR~p^Fi*v~f$)J*RhBVioz{w= zVW$BNIt^;j;bh8E1G5x08k~sk5e8(-h>c;uGS9fFF$A|I+YrrN{F=|8n3Xz*$FL$=%_t{Uh zwsqUx4|j17-;FQVKf(R6A5bBL*`KmwhpNE(HE7HlSh*%Q0`fGLkVr$#z>+TWT3=So z7F6{ziqC{q2JS?`@RCjFHzxMiR+6+Klh$)7kL56hsFWcDtcdItsBA*4CZ|kHm?X@9 zqGB$B5eBgdSi96pkv7CHaXB{4IC=E26*5bR%5iTB7q6y9n+d4Fn8ckZvI6B)g&3jv zO`vZ7{FFVlLiS;VEYjLVc}8OMBo2$l&;RvcATHvr3Sc8t8Kng!#y6~XN$L}pFA zr^ZnuXfUkhCQSB#ZJMoCFKM2(1VTN$q*7LwpyifeEf3w6v>~$q=3du);?$9&trWK} z5yjZ*^V*Iaf$4M^YG^r!b4dhuq;Oe@dr>$Fm+M5$--0sUDp8UvkmQO+YloG8IuWh7 z;RFC_K$gFYya;YJVePgcFigb-$P{U`tJI2fGm%DMER|a+(!`zEK*$L0*j=2Xx|qL4+GvKfiYTz8v4o{X%i!)e+^$D zZFHElOqR4s9x}@vpW)gl|6qg%nV;uDu8}r#k$;yV?eYy;V2+Q|TJXX&UngQ1x;#Kj zKP(2_3m^@Xr%M5(OFkWw{*$vrbInW<8`)ins#O`k%rOG=>|hlhoeTv6+Wn}!gv#4ckw}T5l0u~)l|fXtqjEngX;k*0vJaJms2oP+I4Y-6Ifu%5 zP#(khE~9dg6pXowrbDPajLJAFJ2BFon9w`WDx(q%37&&m2(2OfHiWqfVXjbCsupU4 za)%-y1wF!OilFi>f2gRaY$gRGh@&Y^CX6bMU&Jx0I2JID1&m`};#j~q7BG$ljAH@g zSim?ID?WzGMNsx)e5X-is3cKIk%DQYFpU(Zk-{`mm_{CbucC4al_)6~IEsOz7&wZ7 zW9U&wWdfBFDm|#2L8TX!K2#n;<*lS(Eay<^M{7TtHlgVfe=1L-GKb2$QF#w4*H9Ti z=P{pxYFh&Z6=SsI*YYpwdQVh7=5!L(?EBXnhe)7g0fe zrrLf~wxF_=6by0!O=VKhTE;5bj@E6c>_FuSY?&vpnx4RFdV<_A@DmvL32eM4u%4g5 zww$JJfgU^2f4URH?L^hURF0$aE>v!zvWUuwkWX4m z#LHv$rz8jxK=zRf#NFp5d`E zD!cY+?Agx6L;pm7oy3%QZhbc0N$zXb1jCB`oy53!bqyZ(P5D@;)N5&ED{eL$XFI{6 zf1#mH53<#8V?wLv`-A@Pa|_6GT|5F#dn9^6;rI)waAtab{A}mU`W#M>A)5Eq{5ot- zI*;&|*Mc3!^xOuoL7f)ZAamBTBwNdrXcHw}^=2 z)(>tny^}=uUg6&_WM%YA`d?$dNRrw3+}!X4kghRBLH;U=(&?Y-ej|UjGm!C1zdO4s zWmcsNtMUaGg7ctA`Z0X4j=uBm|0OG`C=6Bs3V$s6_fW9xCWndWkj*bt)>Zu#e`0Sh z9>W`)jf_K#4LFISDf;%8Y=O7pz1w!b=@t7H{D_1OuTP4{QsAJfBrnn>$v?>r}4GK@c(v-|EFsE>-kPzTf!Ft{P(HEI|KZe z`#SR|hot}e`#)GqF9bdjduQNk>Z~kezoEDu6w(tRMi>!k=29>;C{{`j1%B)u?EC_( z-w}|C0jh=b3>|8$6t492B)ki&KlDpLMQQ^@C4BKWC6u6;<(wO(e|cC(XJr=32GtO* z1+!t$BcMk>kAfZrJqCIVbXYHE<7!AvsL7HH<`kHF)Lyku?N>Lc110=!GnfZq?ITdO6b&tANeMEg!-KXwngOK(CFh4vJQ1_1nvX7|; z)qS8Jnh3BhZ0kz_wpAUv6U;si_HArC*tg%2vxmX9gY5*{POu#T+kNbQu-y-~qwE2; z>!m>U7<-VVK|jtOV!J^*gJofb4 z_Ov@8(BJNrplHQxv$fTA&E*R~R}PPij*VZij&obFq%D>!)mpuAQ#Z`!((2a{&dp!BdhPm+Y$uYACwh{pjuh=kv5u6oq(n#R=}7U8lE^l0Am0Kz#PCbz%_vEY7E6?NmG_owIo>l z-y%WDrX@Ak$Oo3}(Sb__HIS8HgvgwCk`=v*wM}rFrmAJ47IZ0R*Dd_sqpO+Wy%r$N_a0O zb$ThkLw10TGoBDU&lZJnlMIR`K{20)ZE0@)RE2cTXC1lHawo-8;~trfg?Z#jEcPM_ zy@3SpLhW!_r;7nISPtoX%n*~ftXUQ)$Mv^?e^2;s1Z`X-2f5BeC|O883vzzqxSzEc z#vQG;O#4}#K3EKM@$fuTol_`4eF1Ajh%qB~&Ifd_jvGweVJ~|kz3j2AM!6`a!(OSU z@yo;4CuXOw%;2#WaWm%oXGPUq4RN-dw3`7g8nZ%mQ2n(SuR~0f$h;#!j5xX{_`U?^ zf9dpkL{3PZK3=`f7lq(DqJ2kg;h$}pPv0;Lbjg8?&ya;UcjaN2tx^27_7VJKJy z*$#p&JQjHCZu%lZUxXo~=PQ(vD+O*|xH$mdMc}(n@$bxNJIul;^8vm;e*oV{Z%5iu z{Udg&EV3;?=OU52F&-#pBr@|IIi0qULJY!8@tQ=ulBZ{_(D>Bc_=S#? zUQO8|Oi4y6brK;+%L*EJ2OMvAjLZ&aMlYf;sb*Exc`s{L8&)4pJG0{#l=176bMtdv zF{&h(bv4Q7pD;1Dq}$9fL%nIPG;j~O-mv7HIKA0H(@>!<5P}uMf72di1%gG%RIB^@ z?u(!-Vb8m0OJ9d2*LK=tPf5FImwk}L4i7kD`nYiJln~F2#0l=vM}$-p=>0OxZf?)V zGJbWm3YXwn*@##H5(xt+%7;CZNB3Cc{$Ew9TtMiCiAEI#C@4j_>q&E9!c-+PJX;nn5P zJ9JcHBjXPfL57b_*2#!rr|{7YE6mt16QM4`3$lR3MO(fne@iam#YcDqMk!3H`szA! z!Y4ubm?!m3p49ng8#Ao#_ascntSea(3Tl&AA6qAB^#Awf}Lj@%rBdIfxqf>%h&t9)}8#2JM+KjM6glHJz}6@yT}45a>Y6F!)4Lz_{{k5yq=-;P?f(Dx@Cn%ho`210=qIY zGdw>(KAVB{J`YK!bXG#Sl9?3dm_5aDBtq-ZJA_u}u8fY3&&{pIh2(=u9bfI~--sc; z$(home??2GSW?N~)iFz-zvxTy*Hmm;XKM5#2Pk>fesaha8zlKZMGU+6aQn_swiXek0bc+Dy!2 zaw3}82c$RtLR_a18x!IAb#_YlJ_!)uNQff=f6fWGxrrbr`qtQOlHlAsB;XHRaW5dC zgo!kdz~U}?FCdU$5XdNc&3}Yfe2iu({T&<|8z?ix7I16zG8Lx>CM1}P8KZ_l`V}X` ze~N-GHah*S4XFD+u+efrP(1c_bZ5YcY5k3vpqDfDhwQx)snu(*o^Q+70=4^5`j9Jm zi0?4npfX<%kXR~Ne+jYBDg1VTrbhbu6#srmeE*`j>jZcacTZ3p>|*$iM0g;`0=Aec zj?egl$l1#ZW%!vqVua3p`5a5DMj_Wwf7AP5#=zYbvAo^C8s*Z~Nf2*h5{VWr{^|3M zEbHI0C9eCX>rzf%v-QMV;5C~>!S$2P^_m~6%P>xR@n9g3dR>;}*JHSU((kQzj9_ER zYp1(wA?sV)bdQP)0bqP*Y5oGVKV{zXOs#*o4w1tp&i}o;HJ2bv)9G__Lm@Wie-l68 zbOAdfZBBvef9fFxLnxTd-w{!U_?KPEiuMG1+=Kxyb@sZ00Xz$Hbz*5wRIi^kQlj?yDNbrs?Hm1z+L4Ed+C*mC>K>}$f?p0E%VQ}gT_HD z3*ZwO*M%=iWP_FGR$K`N?@0G#a6{RLvi>#*U2;RC@X!~fnBu;4P~X%MkEcV)sS0de1M$clG~~B680xBgh+n(f8U|fS#RY7 z6#^+}6=ac4`_oW+;XJU)SSt3Q=$a_WcTsNi;=b+nfVchm zxTl5E=Qmm?1siqaK3B%Iw}*ny*Pgl_lQu{(WU7_QF3BZ$d)*|_Yh%nX;BE}rSivE+ zKkPKvdaIp~p{nJyB&12;e_-^cik^I<$G^C6I__369TFm^;npT3E%u>2XcPr83N#9Y zmr=AL^@Rl(Xnyp7U+nSJf(Iwjezrrc^sY;-P*J~N;~D)Q0`_e!x&s!MY)Pzid24hd zlI7Py`F*>5&@JP!{#Y2u70_|-5J?vb)72&suav%z%UCgd>4TeefBFFK|C_SM}CCI z(>+*uv`UnzG&B35K1iTE%4hy zekF=y>zbD7!&Gs{lg9<++Y03yg!0My2fCz@tn)o#i*25jl>XDGJb-H|#0#B4t%g@7 zE2^p5)YM+%HM$dtBHLe!(BygLH6$ipOOPdFNpJ7O?K$P`mUO$*i&JZ^fR}Y~O6lC^ z++I$1`=s~kf1S{CnYZ75?R89js9rF06+2-rb8N4Xt~X6XVJi>!v1Q zML0ZV1+|)~f0j^Jp`=^MW=$ia93KaN!A3Dwu&y&#e~#QGb%kH;j8Biw^Qf(e&=amy zUMn?>9O95h)Cj~@>oN@SYr_Dr@zWr zeh_FW>!U!P3-gfwIUpqpGFeDIRKOw?TJBTm>h%iF=iU1-EuR(;~ybKbG3OH@E zNtBh>k|fHKaBE4R&cB7+Zx&`g#R2JZic6ZpX>pV7gNV(s;WwMse&bJz`pgzWyYHs* ze{A))pf zm|RCPkN7U(B8ekz{b4jAwWaSx>l_#b0a4&WfbROlP_%bhUBPQT{Dsw;ode{7ck`1jeXh@8q9ISBm`>DA z^eXrk34_DJHcU(P2wx|_NW){`e*nKO!|*samgq}XbP_Oxf&=|autd$)^X{PkcSFF z4f{`G#EGP7FA*82zSOkvP}79Kmng+M9cn~{%k=m^#tfTe zanllxV>J2mHxWaHsSg26<%+Q3<=53l9eLThPeXX#3fR2&3_fbC1 zvK`+b*{qL--}Wyo(_nLS<4gEWJsDi0Z?H8lERQX}!1q`(ANxmXQ_`Y7s)xB+i0r6< z<$ycF+(Op>TmbpTQ)Tp-FPZPKpe-)_}1E?|Iq5GC=vD7pe z4bJzwj<}z;k0LF?+*aB=KVV{l!LxUDQ@XzN>|wflz%7VpqJFWp(XT=-I~^7A`I@;r zUH?eZ8oKtLa1iaGZF#8vGT-$j`n||jsV|{!Q6Jy;rM9{a&^?2E{Uh$C`c66<;8RzH+dS3N{;m>j}Y^Giqu0KM*4D!{Fw6%Gw zY{%%R*0U9xxfR2*HhE$sjo=H>aB}8~3p z{kf>feI;7r@Rd#U`8v(^Vfh=CCf|fr!Pn$_ap&(x#p_#$jURF8F0f_vYtdVdl z%{ZH6e|GL;BHMlLc6ztvYwm4C$VXSVy{6Y6qpLgk>L`^pYH0F0*7)sw{ji%&T_2+B zJL!6c*gCATJNTaGyVqz^np?7{->Jvxeq!ouy8l(`N1Bhs%8tBdEzi>|y_06C<$or1 z&u3|b#64T-o)6Zo2xU0#9k?_2qs}){E4RxHe`YMAQvGj-w?!k=@1xNuv7Z^fvcnx? zFV(G7|HtU}t@Qi0XdC~Y@rUEzw?(5gH!=`yXqDX6zDnxF@OF1sw0%~WKCgK8*(l@g z7HswEZFQRCtG7kB(RDw%Egt8cG|n0SgIwmGq)ai}Y| zf0b8g=Dc97?pVEjb?53G(GFho`1SVJGQrVA88dKhVG~zZj#Eil|JUj6e}h~*Q2AZ%gnNiYx;vvgukXI0y_O9==N^vk zY+JK;iZ#n)^c8yg9(p?Kzrs%+>3DkhR!>Lz{2t;P?<668EE?lFX8qIdTWS|9Gk|aCBd^o#_zuoI5H?d(Eu7e{}!- z+)uwxJ-maioTDocxE#=STA8A>Z*v(B$oW%}be`Vm9^t3|XnE|l>@q%0+GV!857Ml2 z{J(Out9Q}aK`t+9tD)mR(l%OeUC7e4_wco&-F0<$Q%U;#fz@5nF8O>!=XXbX`9L@x zGsN&Gv}ms0%WoH$BwRqV4WIT-QIP-aQ!I72Tnz zG|f#roM^xDno+0q%QH6b&!^_c?r1m9j~wlQVh-%4Ij|?%!*$8|U!gg$yKN5aPR+U3 zu5KrqLRa_+v?J%c;h|S_5@_!wf%Xsyv^oEy(pr3Yqmoh<-#xG8f`7v8e?8Xzu4qqq zm}nMi^l-FiqZ;w7+arbcdpi1hFDoz}p*frP4|n~#kLS=M+(Y+r4c>4)*ft^Zlzu>dT`{5q8jM9;4A5pwaB}mvn9Q zfUaHL!To<={-N}`$4EY>-KWu84!nHed8NdlmItpyx1&z4^)-Gxf7*$og0_0MTn~4r z)`RNlzTltr>}gfQKce~_i*`hJND5P;?lLVWPRaf6Qc`vB}l(C=-pdaCmTaB09)>QNe#Sn&{etaP{`r z3c;ha2jTM$JQt2|byg~TTKb-5p^9PykFjA|`pd21;L746e~Ew9nNo6RGqY01?|a(H zPk!%g0@PWpZBXzh6&2e5-NC`#K}&zzx{jEpI8k7*8Q>*xMUTcgxh3}zC%=z?*IEssvdTFuplDyv9wo;eTc+`2zE0ua!ovqS+ zyM6yR@TyJqe@1vwre~Lr3@onH!s=4ZlNXx$L`&ay0Y!N)Em4P2N$tKWP5qgceypWG z(#j{XL9Lzb-B7K!2M)FLhg084M6KMy*5e{pNwG)JoGd zTYYb~1OScFV#D{uAcU72rD>r2U-W|3!PAIaV~ClGK$l@v1o{vs)UUo5aP4;cyMu4= z(kYboh5kw%2tV%r*5)1!Y3aLKrSt#?G(1(RQqt?Y{q;wMa^-kzbpB@SUhr0>lx*go zd;IK$e^ck5Iey|4>*<>P=bt%s;_UG!%O@T`e(tTW*=txh*ik!^3BAgxHS!PZ@dHl@zWIb1;!SP@+sZ|i3P>RhFwJYNe3tsi~+3;Nf z%JLc3xn3k1=erD&LsU;Z>wl6vr0&fjvLXX3<2?+59Ey`8qSjwTDgOc=zlD!~7JGU@ z|LZ@&Wma6bEWhibq`X|M)7PuGSF;lOH} z1->({8=Cz++d?_ei|21z#vq4n6pS5whj6$n!fEJlESv8BYdeRslKT<(A=H8ve?OO( z&*g6#2HpQ%I|J=IYv83~aR=1{&lC*DC{alx27s9c&7y%i=Gi&7$mI%{Cc_YJy7Jr* z##gF4J2>S(998C z9S!Trw`e!|)G}=qe+TD7)ZR>fe+O7qo@*Q5#lKj5?#RHIbWg&rVavD68W={(J$Z+4 zG39$jU54ZzMpeBTirHa9xj17i3i`$ND{yZUC;1!JAFN}BKv8WKJ3sUUOS2`d`C8w8<8}bzSCUeKt9$df0#L3 zhp!uMZo&3{e);zzBh(kNKE3IB=7#3~s+%Xy-ce;4zhb)fU@d{>o2+qlb8>YSeze2V4<^th9$D)_Fe=r0ty=d=Ohk{Ce`ILwO5m0DKDn2# z3ihNze21^tHny?0j^6t5mG;M{uY_Kp3TVBx`&s@f?XBz`=VvR#D544#VvB^A4()-& zN4GX97VO}7>1e6pm-e^J{RfXC&7t6PP>_#6&DQvaH6+HP4)8z$yC@!EaigG0$E92J zkSJhwc7tjs9zsX`f4`5a9DL)FQgvzV>)k(mGqGz_^9nQ4v+H@mn*F2LuFMWT`3vuS zMz9Cxo7rkmsVxy>_ttpBE1Y@q>Bopg;~V_-l=*le-f({tCH@XRewVj;?jzo#J9fig zrEBk|sr9Y8bhTvTmElOI;esLdIEMoj^YJbr&|`);@Lm|Ue-a8kMEi@Q=jC(is>Qzy z%N+=R{O*lo8s=pfA&1mG66v8qbYgpGD#Qb<Pvz*`#Dpg zEf{$jGr(+u#Eo=xA2GX=U0&pIT*mLpafFAX+)YM+nY+rE6lEZ*8fEk9NN7d$yBISX zV~gE@9<#L2Uda1bW$cA~F3dcpCC^6Y^{mUme4-53e-O{d{*koH%;)BfH3Q%DlsTX0 z7`$KMBicQK*TX*Sc-ITAB>)b>ewra)h^*^H;q#tEbzKnTX=J57jogkiw4#aeC&7Xw zzG|>Oz%IBP!7qCDWhGGfpVKAOp%8Mu5j%UZgUGt_{Y{PB$y1NL;|#|-t!G3*6Y)Cd z75_}He>e)3L)I~F``A`3mNQr>gBXvZVpNF*84@fa#?tWrQtuHw@5m+jt-mzXFuvcs zX3p!Y#+>$kjsEbhU(@G}Rr7t?`}Fr2?=#B!n9}UtS0ghVM2Nndkv?UEYs6YSszKSO%9Va-Q|{1eo=Xwu_ohn8a>;zn z-MmdxXYo7R?skV)^PTVHaoWUwZ2P#~Ti7qJ0KYtLGu1Q7idsea*NotoA}d|SnlA2j zGo#!i^>bH;sbxcv4YM?RyxCG2@36D*e7=a>qb z-r9oYZ>I|Bz%v@rBCgCe-G7i@Xk0hd3$L+8_Q#BewQJgSBebs3J{4)gd4})Rf8u~- zb5iJ?0JB1{=5PmnWNr+_x4qRedPGVu2y#<{kn#o;O`sD z7Du z+@q{u4oT2zQghS7ojK|~q2pnf!qaioAhDP1$1XbIKkKR|itP>lA2CIKMrmjXWcZPo6U^&l{Iu{MbXab-I^4P;QJ1K^VJ>Ss zGz<)uQ80_TUo<+lE+@@_e_Y~7Bu3HF=VN4d#I*_Bmnb9FC0)y09b@OZQThdPvjH-; z^eAHYBKw%OJRvt2#DmVu4Tktl5Tay*AwI%FOov#+&h~C z$Dxg#OfD2vfn^S5e`pTH=TJV2Yso#V@9wxqTVFdB99-`yk^AjJR)gH_`W2_o%y-zDM1M+->x|%{>Nq(5db2!|v_$eVc1ncF^DL z?jsBpy3>7|dk1~r;XcZcp(XdYJ5Jwsx{tXh=zGk|&))@u^wci*jC+b9LU+5T-9z-- z9@i$)fA{#;{txQp6OF~i1|z`vYzE=156@uGAoE^?RzH}?=g$(s@hWUxtS-W=#m32t z)j*+%x>ets32RrzovgN`r(uUtKBf^CspdO3%^Gf8Mwp>>tm|!b?kj<5JZnX+DOqOEtSn zF9g719Rp&nfA`oh5E3s9yCretR*j zE{dZ{d^E#Hb~UI~>kDu#Cyp&3{zx8Be^sbp{61T)d0>bZ8!Pp&nHM`Mb)c_~FA+~9 z8i9^!W~m8$;9#uz=>m>`cF1RZ9gufTduGMww-8%}Z!_?gnpr%|2d+2E1=*Eahzsz4 zmp@!WA2uD|tJL_G?b7TUlx4JE8L#4H)Xe&xxG67th>kao2_H%8*NO_UK}sLrf5NSY z*i(V{3TZmrbO1wDrWWi^V^vv(|B%)r7Q}1^4!f=+5(IG| zt@|gDB&0^8Tf(%Fz6U%dX<a?l>*lSH^e|QNK!GT=MJ2>Ic<%=G#(h66R*YI@EsI7$Fy5&C_ zo8lkR+H-FZ4|XC}#&%Q^``fX&2U-2rR?&xz1rFDT~4Z>}t|Ge=*y7G#0t3njM)%vq18dc#f0onuiiEd&O5V2=8FKh;T5A6kA zuX~>Bxgx96+1U~RYZKxm38(CLE|Dl|twxmDyHstg1Y&HG7jQ9`t8~XSwwPdsmM4{7 zDjlzvnD;K#Dm1oBaN6M8e+2x7Am&^alW&wlvQ`jliamM)kP{P=A}LH!2x%SDz+9{> z`HwT7g{SdwGk4+2lBXOV!qBfyQ%ht>?qgVa(vP6oH|Nn-Qk~%iKUikS(sIS0D>HK8 zdWLbQm&Ck!kfrnK&iPeTbEm|!Nm-pOhHuKV;E-o~?@+Iq7l&}Yf9IA<1Tj>YhXDTI z*$2oSJ~A``bml)#b4rKmc1<7F7Wkazos7Ljd=W@e>qpOHPmujCNx(S|HWk{+fDc(3 z+jo(8i1AWbsn+(7VMWrk8pGKbO${+hmpuQ9aD5U9ny}5yRvEsWh8q0BsVc8y9`nTt z@1i^vCK#J?a^3D6f5wbY1-J|X-L&C7Mo zY*N`you1dbu#W6BL~nbS1B1-p=~BnL#;Q?wT$7HhRU@>hD}hNw-F`!Av4M8M1b#wf zL^1`~Owz3TSSf*z^K1+#tL=E*Oxop-_aIqFR2mw<8Nx_tNG4N*&k2Yc;dA&S4kWF7kIjLZXW)N0xc#Phv^=T0QkyJ#z;zrm{n~J zvC>O;^7~rCe;gA3M8~3iBE4w2sRz?d75sa{zjEv5`tKHqJ{_%_>Cr?eVSgr`YO;xi z?uBEdL+L;XuNLE`>Ixo=c0-HzuLCNM84S_$TF7wf^I6{NjnD36rN@_bz;KDg1xZb-?LYLM8Qh>f3KZ}7h}%> zo2D0u6#QMSH)xj1S#}RgCbTB$_(;>Dd+y;+e>$f7?%~fPokIqQtlv~KOb(ghm<65P zo($n8z{6bf`?!riob+u3{_So6BV`r;duEA8vVnF)wNQ7HUMwb?<;hHkHa9yi?M-LGp@7hQ0sH6PL#R6DROQIY&oD0*?99-?KOSrC2X|?n+ zZ;dZQf-SK|*I!|`cdTGyo%uSg-Cd7AfBn=cOgZU-GtRrE+bBsN@d;)XUT*0xGl}N? zvuWX>$!3OK3k0Me%ZfuixroPOUdaNhB*0{{GLvT0T)OPCq`q`{rRp|qfT`ho>2eve zaspYyXy4*S+A*5WY#=N;?83XA6O%a;R%>)A**k79gN@c+Y%F>*&qQYFGG@Ewe>WOk z6!s4K_%|vUipIK4+YoRH0_oI=onVIbqFFHDBvW8shh06*yv$1>o@$%xh4fsX>OI$= zg&mP*X^H2z6&wZjRxJZd*LB;qcsnvGR%p#TtA?9dr8%%_g}G33vqZd1nwv)vK}{u0 za|!t%YAYcpOUQ?LE+J1P5b2`1e@&!|R+!D%Zf#-a4PJjuUw$^qUN0cc16xHLI_q}} zH`siBy%?E9RKH3`1Cb?;pa|vlkh?k&WoYfeo6f*&#yjYH695giq1E|1&FCmc_vR&e z9b)tQ9=ST4Rr{UV@`nK_5;+oqtdCb5&-*A(oQW20=5=l(nw!K@x*zS{e_w1($(0aX z^hkD#v$cZpfVQo)i!SjZ+4WvJTBUXI4(Wy#-^+^u-ZwRG7D|Shi-_xR#iH27i(&Fx z;Cf%!weN+?cSkS0_gycpzWcxntNZzm_wwf|1U#PX({SG3)OBxD2No5tFUAXAAMUk| zh!LlHE%}YPX=FD|GKPLae-L-C;?G=Ug&1;nHXU`he_gN|)E5dvgjeL#`1mw0kJ&%~ zx(W>4vOsQlFm~epf`BV$90kDibBVmXIM30%|4V!WqhR@NkL?{2=C%YqAunB=EoRz; zL9u9bUa@scLYW9akpkl`jv8=i&hw|!xxR8~uJ+r#rKCMdN+KDFe|Cyht3F7pNT*d~ zxLLa5fTl-4MtBUItlDotas4H6=H`Z}%=j#ivtWtnGr*1n7i`bLoy9(>z559`s&Mul zW5M=6y!;BCSqo9OnlqsV@oH6$c7f#UHdZ*M2?DPd&~M?)gb)hR zh5j5qenOG-ri|-CuQH7FH~93Q3X;1awI58U|1p;uOF{=Ch_v)mVu`G2x{a`D(+9o> zIN?yGR+g1Rc){XQ(9G4n%VlwB;j43g-HCOG`SpYp1{C;>e;udFV@F2Q(t&eJe<_M? zz(M||aJMf=;2dF&-dHdAXb*`gco5Jrp@lg{zh!P{#IrbbWZz)uDL_LJRb`JffppUv z6|8iZ+G?V$Z~NQH09N?SWp|plN;(i6-kri7Caj)T=Wj;xbn&jSABE;khNHxo)4GmHL%@ zyC6}*HqQZDNroWqBq7YFMdW6GnSEoVx||!06l&^KlHqMEboLH-*fm}0T21&Nw7E3q z)2{iWdP;RZ3W!`HCzgw?w?G8NByvK`Av1H-Fa9wie-T;fV4z1PEmR#IX0(t^Y@RQe za5bP`Y`W8C67Zg79Kn5`wle>N2%%lW=F2{GeEp}u_|n#yp$%W7yEFLYYuLD*5RmqI z@JqCT;#VR+M0);+h!DKwpkjgh;}`h}2RdNanPufa?l>l;qw6^kA(Dekeluf8-PN4$aN6x+X6aOdVt-AtJoXk!+Yxk&J%c-Jo*g@H!DrT8vX{vquCA)G&m& zm=yFl52fXk{KSZ{b;0xPi7nW?C+X#8mS_i0hQH{sF`;NUB*_#l`83gBw$9=RpaMKu zI6lPTs2D?nQyan%06IX$zit?2kz-wi&Xh|fnpW{ISAXkmeknQWR>{-oJM2Lg6hck- zG%FOWRV}6?6K(rcfhLwg6U(H13i}T7G&~;B5+un4&tl)vulfRRUI0Rc1|(vZEU9E+n?Pj*v63mj$1X1V|lCkPm7&BEBsj z_JxJ8e}C2@+2${$5uhlrYp7mkVgPU1*&oUeg4XI>Wi)g57$uVOjLt3-u$P71J-ro5JDfkMFQ>TW^#1;0-Q(izZn_+*RRo1 zzeewo7^Jiquj$wOpd{F;79tj*!9vuyT7QP~1MWbiwcFv`0!_KW*2y!p^6G4}T3+GU zc4=f~PYGfU{ge{7)*#s@2us4ejIim0JpWs}6NB@<{Uk2UNmHD#p{b&U>OI*U;(ei~ zqvvL2q~^s^WZ_l2rp3;k(BBUVp68}Aa?z!I-7Dv>^|UYN&ZMqyYT@F+x2Tk*RDY8Z z;c_aR2(M`i#TEmmJjxJBUvBPl3*6ija1ojX-`QX_bZQZv*PRX(#lJ7BZ2h4a(HigI1URP83E z-0-G8L&LGBdpJ-i+a&}cbF|j}TYnEp>aeY6Ps9MCJzk*3n?s1HBKIWZQs$ErxnX+A z*#HDgCF4nw%5@UZ6rDua1(MPBv8}AkCxUT*4Ie+n9D!)3&`aIHA=Sc*MKvp-ut!xu z`ZslH?-RswkOQumR1%3CqQ4!;s$&evJOvVr(}0^Sf~}B9XK(D@nc|Md<9}DdNy9%7 z`w$+CnJqK85(u^Od6}iHQmauR4=E1{(Y|85(LfL4SCtWsjZkc+5nSADN@>g*HsSjD zTS_^=;)~d`CKO-Rbd+C|2-iOx2kF1Hdyh{DK|z(xiL1|@~Te(t)7z)VI#w~HRntj?lI!~GMpjwVcIxEhES0SG$WG_ z*`7I-l?jL(&zj1~jG%dUi-)YBx;rwPakp~f=K@{9Ir5D-nmM%zE|2W0SaR=#t0G(<>3bONkL;+3%;RuW6q(1jx{tVbb4Jrq_igUD zYthj*Dic}AHFv_>PG#Ok=ZC<{x_Lg|A>Ac!zj~PJcBHm*@s6oG7E4p5#XG0&TpXPm zUEDUcZE1-Yn~4vz&v=2LjjMR)YON9p{4`w$S0 z`0Vbsv+=gGgX-*EyV(x+Xlu_iSHg?5)h?xAL)28k{wsX>CV$w;Zc;&W;Im9S1_{vB zkOPz9jAxZ3O|*~$y!AB!`9Q!T6W89Oy2vuSwU zozk;RAXUK_wq}!*p^I=Fk>R}cz~ha^0^A!f`&DdXs#)yu$f|*dfJ9TP5KB^>EnR7> zlxo!lZvr_ii+_?&eaZ`h%AD8SR90S;tm^ z$!5NjetBN2bM7!W-T5Dktn0ZOKx8o7Ok|C4)-mJ~k(moWa<#y3>4R;OofS~31jTo0 zT~Vo7>g0Q$*P_hz0+nQ69i*dvl##MII*H9uK7RpcysUi7tMv9Pzd1|dNJxT(;gWDc zEpp~fV71}5tGh%-c}^mL7R%q!Vn&>^qz%VmiaMRNT)xestA$j1bE>_-U#$;EHqp?J zM5530pD?&Spo4vr@G&-ymYRB=1%_6pRN5WnFSHImJv|TaPhw0O44DL=rG1Ny02#(- z;D2N?1OGpG@$EmFZ*47=PFLY6wmTRbF9{lef?8Rad2n#-Xz5fPmY-7SSAZamf;msQ zClH((Z7<}7j2i(5m0vINT0|0EP#I#Cl2tjRmS!`D_s&#iE_$rVW!jTObHL2vSC>>O z^JZVF9&p4h;~cbm7(TY5Hs!bqB(IMul79fV*9T&PaEw_v^{^36H#4(7G@>1g3B1`| zSQQs|F**8}k>_xK*g63SU<<9e!4X9!lwo;>${B>^Q^tr}3?Tz0*^uE#XF`Cr08)nE z&?RKVln2(Mt4^q~M+az$P7`-WOiPZz(;_q$a{lu|>m1x4S_%>Xi;97p0WzY^JAcST zfn~5}>+IMP_C*ZME1X=Idu<(!DSc|6Bq4Tjh33$-Kzhyf-v+ zlhl#IMxAU$R7|h#4Y{<-rj(Y9*l%c-xYph$S4tOMzAl` z1Zo7(V_-K7j?xvziwKE!g&Df?BwfkKdrW@n#SjTn#1)H`O-r2CB@?_vzkfJlng%}_ znf^86(Q`Gn=lLHO`PCzPK6k@lKbIT~1^%z_bra4@&D{e@B2KyMZj)KDrO8X=(-K^iJhlnNt9o$>tiN3dV@L;J?XN}Mp zXE`I9IaZykH+&CA!nYDfu75XMS*e9M6f)SDa3V?nN2_M6QJ?X~#499o#_xa%c+Pu? zeW}wNZb{xG)*^%Xi-#3MC!gjdLp`3BE4TtiS=`f@m2c--_I|kxvtc*W&KHXvLp)bU z_tK+2?;{c|aJ+O_-0ubKc&<8J_A8r1`Eg=tLx05^FNtfVj)9Wn!+(#h+szDjf72G7 zk2n!@JqM1U46ETiQ0lPTb)|aAJICX1lRP|=+C+@A*T|Iu0oOj%% zt*x@ZI?EON^me(&#=ml}l^%Jxba)aW*`oF9eO>5&>5vol`?28Hj?3!J&8%{TM;@#; zhlr+rw%J!^q&e#(`suXco+cXwqEF$jYL<%PU&S=FCz1;tQS+@Q=V{}P2Qh#~u-#jY})~qB0!ja$5 z6wHI=uf&rxnU@_?5<<&Ah`pZkVoLHObJ(0IS}X4O-Y8a!F|q$RZw z@ME|KxEw>Y8N!k5@lZO!=p@^%sZ^fEqzoNsW@W>XpLVfv$!kj`XNw>nZccMhF3F(0 zxDtY4r>&lU;D1ysovlT`{F+K83I(W2UM%ni`1h_9-BvonZ4Rax9m@J+j2;y0AC8}> zc@@9cI#HuIUJ68bCZf#L(t#@&ru-$=LfwW{_+O zhQpv1W&98>B{digP2nLX_(b~U!+e&xp}Wpjpnn?L{#UM!5`S*9kEBi9sOEnbNQ5*t ze?nuE3-j#I{>Rc>2)W!AwG}`|%YX8`M*Ju7sw6;3-jhnpNHUP0WShY^7}okW097v{ zEN`~z)m++Z084$}elQ{av%SO+tG8kNx^_cLS^AE~HhN*P=@`D0mHuC=IScHN*3M*V z^nWrf2`Mea%3LN=TV6>FM*vMhYM3|PYP*{faQAmS7 zv(Ye|P+rfpSva7RFq$tI{;+GFCywN#G=F|x*Wjh%k4Cyd^X0s@JQ{*SiDx*^3R}eT z(2A?o*eJSg^95lbeOKH{c21a5TP1>xli*nHbE2{?@Y7Y2vkbjnU z(fWbM%dA{G8N>pl*ABK++IDS7ZEFVW@bFBQp806}jHUW6c?KRip+*wr=jiuT-!ksL zJ=xSJ#MIrYrfo`WVTON)Lex~dnwq5ISM^x0UrBhcvl?r9g?2sKy_Rew=Tfq%`?XE?I}4vnV(e6&n@f9LT2GJX7wLVJ?K3)QYM zC_L}=5y=h!NT{gu{aw>KPDehfB}!iKHw$)S1nS)doBb9~pQml5Qi~&T1bdu-MR48# z+;Bo#WSCb5>by__x*mc%Cz?6YH?`_Cb<}jD5dx2UiKewZTZV&mvu~ymhkxv=;P2rc z6m6(n4a(}RWv@+;Ux(11<6KEl#B9_9hqy6b4-Z) zk2E)zm1)rT=HU5trGH#r9}z-MT|_U)bkIaM-a!(9ayF~s4v+``?Yw;oWub6l`?7i) zJx!E_XHGN2xixsci2cO^fg~xH;pb*23m=4EWc@S}-}n&0>qxgORZ`;)sf1Nl>J?f{o zydD+#w?B)D^cy0IUXKQVWFCBnIL`sZ@o~OBWBK*4z*!&#VCW#;27t+0Ke7;AFA}F} zbC#Vx&gG~3M6liZrDyW| zj9;IU*?DyT)9L5k47GfSTRy}k{JbcE?iivHcF|KJIrit(Q}w}c(Cv@wM3{>V4Jd-LYamIs=>&uqmWmOCcFG%P1hHVo%`hG~D7|A486J1mFeW-Vz& zD@Z^^LndZW=Xn$8Y4%OyrezIw>l93-QyA;iDP-Xv#Qr}lYffcY%iwUgu4muCCiM{e zSARPl;&04wJi;K0kyb`TfL11AK%WMQidq@qiCWpBZA&X>ke$42N5Ggh=CgGoQ*`bq z|A5?^sD#jJ6w7MoVq5FFgCKy~?3;PMgFT_$15roi@=xnZmM{c-o%+|>+U{^Np`PgC zzw9(_5PK1T3)7Wv04!&-nGvBpYn^mHAJaCxe@M0qOZQaTC53144b&xj_2 zHR>>>tuu^qS9`PNGA*rg`RC(cAQljX^^8R3k*>z_?d#^`Bpf(+Uxs^~{~@8!d+zu- zMru5H>ca7}PoDQT=_-p&FSQcp8UVDv#i6iB(5oF zceavR@s*`UUBHRFR1KBOjx13s(g8TP7ev-~kpW?D1yVvB!4SkEM&ieHv9VHf!F$bA zmXKA6HG35@xVoNoey)_SxVOE-rrTLhKk3w7ojkuCm%xb_IH%0Zvp2h(ce!SOtmaN0K|KjJEcr zyI2|V;x4X=`?;g92naovIM_8>%Ez)&;*86}5_3y?Rey>s5JHNh>jG9xXn%njbLawK z_R_Cx)N5BH&Ypmiy6DwQ)TnrN#N#ZhPz^z-WJ^x73?*g@Z(lJE1&6GxAzhYMQm5>RV8V4%5XdoI@eUot3Z(4U;;2B! z)<{VkqLkSS4~{=&cK-1%alh;Hd49s-U;FsjM%EAJ z(xs(g%L$RFgXaeAtflaBb;i4}UJxl7O3-+R)DyJ_mT^D816V^fT)ejFcXH)2-6HGE2! zmLOtQ1_ldG&VSk5g@tFUIJB$G_Fbb+hTG^T%sG7(XFA8*K1&>nRx{qO^S8NbAYaBT z3*WCgB*g32E!Sqkpd+zV2sIB4(GC3pn#68aEdT2cGGYMm134Ak+%=@nwWOHXM?`^0 z0u2ZF!@aHHy+rE)ns^C>^>U?3Tbl5ooawZfW>lEdy?^Y&j7rPUG;>u$koPr?PK99@ z$mv2-owYdlDX-Xf6FL!ygr3{X&G_u;RjrHAEGywon+}}mn7V8gN`DKr7T$^}Misuk zBqaVtOo3UzY8~KlF0a&Oi^_466BCbov~}=A+#NHVEcI3%qItGZaj*$P9S}8SN#g%e zqQiQhn14hUbO~eC%*C#k!Zy?=v{xc3(&7lndpXcY00XjWs9BUktz@)`g@2wQz2Vr+ zLa@k%_)fjek^4E7`>VNa!w&d&x-ymdzO{YAng046-ME>*YjDsh zI+?+Y<2XBTGPw8%_(!ynz9x%Q<+73 z%3jP)Wfz?(XE8UGgHql#Yx%{#slLU+RDsW}TK`l(e;22U{5>!=;AK5~)|eVhhkt9e zW600-Pi;D*xkCuiatA$Y&72yd^UVm|a*JO7{ARi`Ojm~8Ep%lI-?4?xM-YhR=HwkC zbY&|r;N4AY#?)3|&+Q*=z4tll41u1`QNI#an$i3OcTW8Eg%qZ`G=p`?q0gLprgY@+ zeMj^8i($BQ^w6QpmoHNfa|sQ9j(>5$m%OC_9|sT9orm%Q65MGH&~le!B364}av^A% z^a)3f#!FY4n@&g<>Su5YFY0D4IqW~Dn!%^TW#NQG>!jkAWqGv6WYOgFUf3KcpA980 z`6(Wm$@%m>Fw0vBJpt%`$v(r=R{(qv#u}r@_ z#SY^LK&mq;PftAu{`=O+Ere7-E?{aFv28-IL~Xv7vVNzxBV$H8@rXdl>sGR8Sy#*d6$+_Z^E0}H;d ztOl=KZqF~5O(!M;*}OW)`CUxpci||MebTkmYb(uIZW**0`NslVI!=9$yb-Q4m;M63vpLD{}2H;1USzIY!_Sdym zJ|TTgvph5Xme{*VWskp-xUWj!vSVIMzDrbT$

HWw9^M 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 f<|liq#j|uNuT%!yCH;v8})L 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%0Am?Mz8*U?!Qz9dRz%(Lw{@O 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 delta 1689871 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

  • !Nn7+i$|pbrH;dKftYeJ1d|Jgf2P4kZ(}K=>TBZ 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 z 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

    dr0np*bPDKN4sk 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ӭyRp29zfmNZ+bf{ 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

    uJ!==>gh*#CFEp7xIjc|bMA)H>~6 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 z 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 Baob&&ArG^_Z;Ut@RrIA@7p; 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%0DwMTI?qfO;I4t3x!y1L-aj_&UE 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 z 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Μb50rtG8m57O%Z)gX??sKp9*H*x*AeDINvY6ai1Q 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⁣M4xhWVNs zrSE?dU@z8pj=f{*Rp6igpilm&7Wk)PrdxeyOSEpaKj~JROb398%oiLB4`c>ydPm+% zRj6Ve!1S(GxEa#1%Iv;za+Ryjb~CE=a!{wWm#I+)NQDzaBz*TpAh=BDx|uYp7&1K= zUWdSkq-~AxH}6oBw&{Gn1xci>10D7>X0TNT*Xg-@*5D*daEtXaER5aa#;!>vVH z;0UU0gY~Vpe6e0~_aUQbFzrAR`Iq0V3`*lQmDVDqwe6Os^+81=Q>#c1;6wT<+n#^G zS52j*)Z&Z4pCgw!`lh1YR`N1sg+7_e>2C`+pp z{|i6pB7SGFI^21F=gz}@KYrD|(>wN!6EC_}?i+XO$LCq`xQ^Pg$T8ZzR~uu)`(2C? z8Gqz>zRUQdNL(0Jt+kp-wHA#P3v++GMl|5RfnPudc_y2@ZJ$r3pr3j(sn!rtJ|H7X z_|cxMAj*zzfrK*@3?Y!OK}U4yEobP``)hF;Ad6d&w~$!z2PT(0&_B7+F)g)O`kb5} z&`||*968!lb}dU_B0b#$(4o2!*ber+EfK*tAI4C-=V?i3jibrrc+=i;h~0?(1#!B)_@|vxjb7LCnTxCXuJs6^cof zMxAY!ZsBVD$hEIBW1fnf-ROTKZWOml*S0Ce2ufZjr8q|0*Pvdz@+@Fg{|J4n{Z7EK zR#A;QY76|VujgMzrHD{8UMuJ?@-IJ3S(lS^S^EWd_f;zQcr95|gtaVjWN@*duQc#) z`tB$K9Nj8vH$fh-+>>rA+A5kzbQWXo+n zAfd}`;4REL_}&;aK6qj4n?FXq#{lg{Jb?zIM~DF;^6VoPv=ey4X8tNP^IJWswZ_ut zf#to$=rP1NT2#+oBd~w-a(t(>0_2xeYiu&+f%IuaQxppXCAGsP(n#(Ktc%9?ox*Iz zMCMAmuA3aMy;pv1`SAUy7=jx3>^QB^G#Idi%yLZ^G&?se7o?I$flIRKzEKoRZ8bPwhhQ;dd(%b~q+4;_ zfG)>sbATsN5jml>A6D|6S(srklrPL6ix~cm!*3Id;p!3in~C3M74wT-b8tZS>!oT` zS6R_W@j!;o{Z%>Ed7nwKDV`F_lP*1iud4ei{Dxb58=iluhvu8JT`HV|dAI*U`6Vsl zqnQ?Q9+0aAI@xV%Qk7A>7dP;Dw|O;W=-DaV5(k@SEGwqnGrAY0TilB@7WX}Ye_SQL zKgw@-&A3$b&rM{BZN)g<-$EJ845=u{?k4x=%|_AB&}#CH>zJL0KDpzB|C66;>L@JeC zo4b!HV58eocGdwBW=&!ho~)x0;zA$&Q_7I!gWHrqv9 z7wjUuVNb~pXeStP4yJvq>cP3=!^+|EF!D7xW~6^(den5sjNZ^qA>u#@aHAA~8;>!( zX=b&s0G9&#lx(|VxzZQ39H2|yY^E|6ld7&5Z{1_f)%cz5f9`_c8IcshQ@#33S3Ffj zeS^8TJ6eFCFz* zGPi#wx$6RHh6&>_oi_S;t|ZZCx79r%Xeyt;!{1HtcRT#uMTKV3fN#o8yKyy0YdkEe z^-r)Q^Gzx~#e6N0l*O=pv#o9{Q9l8$3#WwSt&vz{%4fb^MLCxk!-Vfsdd}_|a~8$# z)JcxT9Jiiq5$IFunnT=Q*%qACqa=YrpA&!P!x;PF2iyHU`3W@&F(P|H4d#zR6YAkJ0&Ho)5o%LI78I-3}&JR}X z$W63h9yH$U#eyp6!=taWV@4LP3eElcI@|RT`SnV%`8aIeAOtI|;%01p3dm+vM|giZ z^5xawI%|7I=!}B3a((;D?OBM7xOnFx}dTeq{qj91nGOlQ%$-NGgbc#{AlCV zdFWr-KYa!7s@9wB`<&^f?0H#5I5A6Kl&S z9xI6HdX7`77WzkSWSNh@~*vZQ9LT|q`(&)`EPU`P%>3K6rHI8WJO6a2{y_m z!8kng0qLvJB-pB$1aq2D%l&3Yqu|BQe#Izgdm@;Y7EI=h8=|d%*OJg#jTVEM0C$h0 zkGXg(&=a*CH3ckN3R8tBcEFSE$yl`@DrzXK>qJRSr!u;q85)vJyM=#bQ`~`w_j2&_ zied0GdMc->({msd242r;5`F%-V6@M!R>mSqJ)jBLyFq$p1aQdI!zo$w^@Lc^z#2iwj>*}L{$+jWL)KckA9A6GHLQ+c;|mO(zn&HDM&9op2+$C zgF!*N0wJH@uIpzIKQz**|GUabWQ*N(SWXcU?6w07|w1`O= zR$152SC}eu%gwdzwZm2X5-i!7^DTh-&AN2kNX)0AidQ@Z=OL(j#>9YN+JO2}%(Gb= zOq<$5CRTF65gdOnGz4vlATMT&L~}tKDmb7ybR=Go9*jYR%1p&Lg^{|)Zr1V3(fB@E zwBC%8@AoFryq(Xt4@C3U@&RZv+#c!foQmv-&k0SEYp`{qb%Hx zsnrU_8l$*R8uN27h+&4}9F5;b#vPCdLkxj{ZVz>BXi8P$e&qO@6D)uM_LwguTmmEI8(Hi7;N_$OGoszkIC`+ z{}}z8Tr6Xs#I0%%ZO?>uwk%p-1ct0B7>Z_R|JV+{_gA)N%20of{G0rk|KAiGvE-Lz zVD69kFLcb;9oB8P3gS0FVN%Hs*ylx+3fZ=e3 z;Dvuz%nRzB%nRl)dA_8>t7fV3F(jAJWXcAjHw*Tmh1~Fbwii$U%r=YLk;}`b3gv(W z9-+nC1`_{=&7Ks{>}I_~S9-jy96qdKV_-rsZR>?(N}*gXXAg7d4+R$B(0Qg!a_0{T zWQTty^-?#vrOCZuXrNaYKe8nR(-t?Q!PI}peDB0B6pfpq1F1E;pNl4$WIrOQHiFcy zn;W80fq%2-a)O;6wRj4GftTPHqgdm2g}u$X)cq9sffp2a$T>zRVLaj0C4^q;L-bKj zU$Kw&HRb~Cs}c7#oh&Bz0b6GE#N~bjm>qL)?1%^ls>N`iwl0-I!L+gG2}7|>m!5w- z2UsV62=1e@&Kh|`!*;)@xR2I$+cZ~Q$?f{&uizz`cau=G3+D0ZKk-W! zz+o$^&?tRyC!pFfsVk5tmwCSNbPj(yIr$TlAUvZ%i0v+pNe|Y!$7o$a{$-Rfn1YmF z@&-kc0Evs+yOKh#D80{jN_wB&R!{6MW0L_0WUrjvVlCN<*Po@@fI-^~pr;wx`m@M) zl(S6Fvy_MlnITA@47|=x#30$swvB!=zsM|woE}k^lQmy32dv-6Y+mIWbCiiTAtKUCR1|Pi1{V&bPS(e)$K=8IuyqCtX`U>GtwT zca={XK?;O5Zd4%LjtYe91b5*R$XiYln>611i!MC;_Mxby#|?hq z4N_4*{ULmayFH`n0G4hb#b)WANEfGcP(_I5C*oCE1>G0mDfG2Ikr1?xEQMed~LX8CQJ4eGB zi3zBwz&6c-NZJY1n(UWGkt#dzGJ=e(JCD?`C)N6ICQ*WZGRk`OF{FQ2kFBMu6j#(m zN6C0PC@SXMn!T0|1NhixE1Aobi0{RxrQp)E`R0M%5Mx;{-TV*>E2F|3rHi#3?|PpCtR;UkSDI)4a|$9u7MLGQ>vf9x;m(3@ zp=tyeI51!1E6}QfY3uw5YH{P2B0)&o@J0O>F`Xsh;nGZx_WkZ=-HgQ$fw`!^tACSipq#1 zF=?|j@YUoF4cNK!uFq&AYha^o-J$>HU&yGvSl7(nWfaC;jmd_oZC zYy2zdq7>tYDLC+MO!X15T{0i+znyUOYmAu&7UKR>RQ35yf@wdNK!-^HK>Dw3>zKQn ziDI6(vmWH44hnjVHdqEjVQ6%P6(d7+usFNCrQvBu$_l* zec*pvC_czeexxr_*_jcXJ#{Vazf_T`WHMU*`%osM!RTO$*KYMH6)Iw&r5uD1S?k)9 z-yeQd98%@R=~V9T!Okw09pp{4!?h6A|3=~KSODKs&V}D|H+hJRNsU3B zbhE4*3NI}cxB02Fv8a0{0d&FFq$h$`*uZ~R?3B1)NP&BufwWuEl4gXgOw?5lpy{#^ z2KodJ;sE!G8cv=DbnKHoQE+zc{_$7zFAc@&J{UIjzUBzoC|ATPwq7I&vaR=fa_c}_ zFB*CIibk~X7K&Q<)*FjjXrgSrIKXeV^*S@=P_{z=)z~O&?}m(WxFJ190K7b-gz|p_ zOTV9qjW^I&H2B_vjPPzwV}=9llK0Hb5Y zj+RIGrRn6N>C z+dqu;oo@Rb{5!~Y1N@t1>jnSb%Deg?B#g<7^=sLMit;hRMLN}of{PgcFZ8-ak30lN zKEztYHXnc+{+-y&Gd>%~f4n!A#KRhU4JTCGQTWS&t!jqP8{zZM@Ogh#|AkID?NlKI zfaUC@6RkL-DOz~-jhli&+?akKfAOok7Xt&`PY|yKQ~+47r*t#$50oqFMsyqx9LAUQ zrmh@bCv zb7euQ3haM;4K@5|5vJJ?ccPM=gJ^`A52gic45G?>tNS=oUsT4@*143cH_R_J#4p-Nqd%?D$bD0wHnM=vJpsXp~z}k8pXZ1aTtS)-AaASK^8xN4|2qUulpg9e-TsQ2ycb= zMPU2FJEu^cYk5aRRd`1_*110MV-l-#jj)dq+=DTnVLX4UbM4d8t)6TRy+dozC~MfS zB5Mau-I`&bsarF2m;nsQCCr`D*VFtTSxS1xdqndbWVKl-U2Mf7TClf`a$!p7PBhPy z%SCQIF0b3Qj?mstX&lu%-zlMV<^KvxKg*E!X>JJeSUu|d%Yv*Z^dc+@9b{#rDOull z8vk_UX3c+du;(Ql>k$LP#VY?()F*rL?T9DW(rQiOal(uMF+OG%lQzPqKL@?qtQq9i zKtQflX6_tCv}dRE2DA&jAx%jPQo32HwbC9c^Nhj8`UCvS>4>aRWMKOMyJ}?hJJT`X zzvqHjc|Xu)#eV_Amp#cJ4DP|L?aAKW6@#fv=(&H9JveD-;*Cx4k92!CoIBgE zv6p{C`(>co&`-5TbUV3S?skGwR@#d6dgA49w`9vIxZHsWC4Uq^C`p3DuPw{P{%vtg zfBed1%s_NietnK0p2xhQ;x5$1Q=;0pF|5s*;gwx;CbDX*+e8-8XA*13k44-EH&!vQ z&qk4PrCcX9Q;u<==$5ms6e~27gXv)*)6RdTk>>R#$A~M<&mewdM5+nXYh>;fmw8s5 zC!4R>V{k5v>0`?z%`pt4lZQ!{hlyaCfM1$Yh1e4x%@jlpzdH6lm(RW>#~bqOi5P!E zNJoMMt8Tu`%2Ozzs!%+~uRet}Z^t3A{0?NAHwe%42@5%I5#q{QT#7P$-dnGvFl~Q| zi^QAWD+m{rhrYDi77In=d#}K6nDttYIk$+h`_XW~R~T~9COyB{k*{s%-70+9cN9{w zUrEyg#b17P^;+a1iuIK?T`(SZ!GO&BJEOXB5iZx`m=r##N=h3Xat^*Y7+>m|z*{x( zEYcd8pBV$0h@FdHCJtob^2E=L8OVRaX z)9i6vU{kTt(Rz#R9>Md_5WLwx2>|LNyqRqu=NJoO((~>3XtsYYiZs;tL1;|%Fwb^} zfuE;67%Ph^1t_W%kf?uRL^vNyqDsLKatOf3(`^sq#~_;pKeFt%K@*ift-W(6Bxzxq z5qbXp#x~Xk$WTADvA+F>*hRX354(u*Q~ACX8yZzy6Z{>Azj)Y?9`LsxuHR~mmV+?A z5WmrwJA4%HL_{_GUR$Q)xuKjrOKfno%(6c$h(@grKzJFRH|2lWG7ep(qTEAGDvkYT zpAqoCXw)dj7;2_xM;E83oj0UcSVe`v?Yfn;fJd`c~>f` zW}jCLwZA5KM#j__hf--&w^1t(O-Vb9S_;AsPsnk~>bQ6tzw|K*rr8YKL|$@x5aFFW zc0t7%#n(!`7Z86q8iL>9x=M93ZG$NVRMet)S3h)UF=iy-9sk;Eu#PVqPsQ3&OPJps zyo(A%vpFV4&k^p#vkI~Dx1^|Vny7DaQQs1xz9omh8B3*!utVwm(h`K2bt>(PsQlop z{QH}E$8_ZJj6=JH+pl;C)>{UD2hXdx8Sps|*AIVs_)C9-dt3thPnFR5znBDd=sGqb zAub^yzN`Ek=+Xsb_x?FiWY>aJ?z~Afq^>YBBKrwtYLbbY*a!U<#xYSkOo;!fVh)5L ziRPUv0cwn@Ccv6;%Vd)LQY1-!B}|fKPnoXC^1djtT*Sz7kn($4(IIk=^bDMo*vPN; zk-mo2l9PYwFpBb4Ebm1AF*2e4<(_Uxpl2d&er`aBHcuYNX!9Rwt{;czY8$4o4n&kI zu8AbdJMq^0*Ia=p^Bx4ToFE}fAO$O}C1KU9VLSm4@@*-92m_EfGL-=6oFIN9gN8!}jS>Kjea|9je8I~4 zdWM}`iqNs!_KY}^?RE*fXt&K4ithh)h`5(Q#J)&~m_l0Mg=nGrLM}BVpMC3aI{R^$ zflhx~*e|qY)B3Z+UrC4mcEsTiRt~@al>u~kEpcGaUHzav{pg_QgbwP>II)IE0OFV8X)_?gY~74G6?aH|N%aD=4{`fh#$bPJ zhT!nU_#een$mHJw9JPL`RLL!NMC|i|lGUc0WvU-1}X9y;}4RH=;E|tMCDT6OR&=DSaX9i}e2>L9+ zErD%JBmhx}(8OL8uNA~TgJqzVUP>WJhIc+7-*_QKN&a=g!IFPjJwqw^S5b$aNzKkhc_yJ1tmK3WOCu*U8teD_h*_ zTE!M;9~^BOV-~nhrZEMM=OsrP$?BQq&Ta}@?J%)T2b0~JJz}B{2XO|)=j4eqQ#i~!Lwcvq4htoO7#s$$~g<-XHJ#etdMg zy6VD@P&GK!I7WH`#xb#qtZf@ zSXUa|X`ULRpMF#o_A_V>FR{W{Bz=IC*7E^0W+#k#tS6`LQY?R%7G}i1pP+7|s4AtM zD4_zEQvrZq*jqN@Q&!;5RA3h?V9*OFS!lHKVe`I(Pv9Z%L!)~ruRjA4tvx>7NHCld zQ}%f(i@CZ&pI=N6RIWrGr-AH7YVRpEsL%|pIAp>zAYr1@?kZu^?^~G(kE)cv!xzp0 zCEQngUrR4YY1e<2pvypU4Y>?p2J1`UQlb2Ky_2;v$y8==v`lj~lv&nzwyb0SB)troU(U=*Ahq?l`}JtyT_&72^y_q@ZeT->8U1u>dGB=wa@cWQhaulr z$NH#fktV3pWs+3rp%&djm6f^vV@QK3v7-Y9r}F!H{cTBc6# zbhs$TBwDyV`isiSi@c)0sN7$)w8UTZqQ7WmdC@!kga8H_uOcf3MZ)<46m5(QFjNcM zi!aa2w1lO8xkk(FF*SsT=ZMpqaKF4(Xs9;uzUefq2Hv+^PtQ6>-?Kz(74L08FBUUS zri>zF=Z_U9~HC^pJrixb8-H}zLyYJBaZzczxKfr1yuN|k{yWvUZ#pBG~<=C^O2qtS< z+~nl$4pl%Ysv=65tUVToL9Y;r`xt4$M$|_r~8X5K~5hyr$pBU759~Mj~ z7dAPhiuSF@v(mKeXgiR}@-?`|M8N7pMTSr1%iq99);508%fyJW#zu*HUbSWHP2T%7 zmJjg$moH1>s!W_RlYYCmhu`T0-_aTv)q1_GC8q;ye$;|mt$$1z zV#R;AwYI9lXLu4qJ0(|LRLK<^--`Mzk>8l^lnV?_e_?w0gnaLA-izw#{6{kQC9g3% z|M0u{#rIS4wUM1$`3pN(`I&MHtzfX=GBvH$5pzUqr47lmX{wHDs2vieDVBn~hq8Fz zWjHzc*}N~nQU!)iidyXMH_xc|LMHd{&=iB#hR z6Ek4ltT!>5nwSMm^fh5^Z53J*ern<;Bi-lz1-SQlopjUe=*8+=&&xSLY{8ie)+IN7bk-qm$oQm@fd&KCdT58cCLt(Z1mV?@Oi;k`fu!fMS2XknS3& z7G{Vlp0l!;-M84v4f+q2Q;wfe)q=bS`!S~>D6D*qro2UrX}J4dWExQF2<^RqI^R#h zKt%odjr1G^h0p@_JVP1Xj?UI&7R?g!E;QYXQ+7oFr>sfoO)#2oQTn%%tIX?X;$NJE zxhAh^jlcO8-t5=z=5J7LFp+=OHiO9TMO0NhByK)8B$(2FHPbr6WqDyf9UJyG)*U#@ zpyWz`O2VIO&7e57Gt^y+Q+%@p3idjqYs8mzGoDi;KDULbxF3P4c~00TzVp3Bg*v zfnWSrcJ7|~b1PsF?5M_n^)zzQl4st5FVVC`J&4W-ALp95@LYeq>N^OoX5!U`d(2#T zn&26em5x7ux(FVO7o^cyD>GacetjrO@Q=>ICz+~|3*U$yzdJ(Zz#4|H6{<()peHAM zleYgu13r5gpY_D651Zf(3tmkePw5Sk03yed&|)w@4^}?rIuxWaWNP>{vxYPmuhUH1 zbH8)?-ytQQAf10L@!K2A?ad9rbXR6Wu)vjAWpBJD+^ZpIpv&xVw}zn6)eSB)K4VTv ztMAO0N3LA?jXSv^nBhtgRvE%3`;dS<^0SrS@XG>t&Y&5jJN@>gB59x9cXa;4c4YC<| zQqXLIJRpBCpzdU9ew4u)c8F3pQNE*5%sy_DREM?E!H;TmN>!mtcBgVqX>yW7GKq#9 z`a2uCW3uH-YDS(srjY&7H&u2@|6tu(tQ+oer7>^r0jqW+<*3vBqksr^K? z!hb>dvh_sJE(rINM;iPlHfj@%nwnKP=>kuS>au?bYQS#YJa3IXuf)lF1rRvw`6VL% z+zkm>`Fx8l?}03LDpI3I$8gklARqng(h-MrX93`sxUe*pdH!ri<(~ikz9`s@!V^N* zahdRUJ(mSf*CY#TRooLi6-Lp22M=#s1liopmVbX=kYbr#A;2$cMjtELoQ%KbUL*w_ z(%FAteexCD+1Jh{;6XlqdtXJQs9ATat^EE0@)HK-YWUq4EQ9g7)5?nm5SA(z(oGI% zi94C$?W#cdLU|zvLiz|b30;iv>^#a`EUc;*rM={@2MlyjNzA-CwXEFMdw_^Xe;pB$ zYoJ<83mee;xp*A9CmmD=s;a4|Z?r4Oo_Bxf%ClT2UAY17aB!z@Oqb@2)4LPyhmY%3 z_st7|Hl}lPZ=myhgjL6>qfvRGv;NwWgSK)zb~xO#dgS1%De$tIg3?Fk7;uX42uu~su^~UVQr6Zjm!lWQEaFamqx>GMtFuq(h0Ki6?;vb zG6bG6vYZ~i9LREXJ6fc1y|g7Q(zsqkd?eASg1X6W{hnV^K(2&r4|hsz178Jfa?w?& zGkWZ@Zm285MU9E=i_}Jj{JNVoPpL>7d^D=tdrWlaX zNQwS4;vZ9rnf-$23HUexeDVIYQ;LBF~vd=ruaOG8WR+V?;=N5 z)s*^tF>4H#52M5<^68+>CM~+NcVc@QC&>ruRjYhzJs7DoT)arz+7X zN_yj?`bnZrKD(41`A_n;~vvYsFNSV5u3|DIJlOMBX zI2&yXtQy|8RzFM`bC39wlpn~(iMw4stBzm1lw(Rw?`Pz#5(0^SqiqHmwA-R)L@y_W(IAC zbXr+M-Dq&nU5kHH)%Efi$O%$9PKn&FyQ0^r%vuqWS z8QzDYIDzw1y~qC~=RU2zk1A4GmZ6UEuiDDWb4dH?q`H5Tdid)hJ^Xb)?rApy+FW2l zao~w8(x=aM$WLS;Cg%Vq4^>)W1~K^1;mPOReQ}XxT*4MvVrbE4u*gLDDN>+J)fPgj z6AxCn!p{_p?d2r3wpM7|Nd@lvz(G@1BXV14;bq z#1g@uxR!q<35OBky27}>Je-smw7RJXQ3eg|p-+r4XmwwV(d8m4gO=6M6r+w-XDK#_ zU)>$;_nzS*$1nMWLWrS#n^Yn2%LC9sipaRoH3%+Qcmkd}=DJAmv|R1#6;6ZO%rAa^ zN*YJu9C+Ax7F&#Thy*!(Z&7>S`yo>?UX7yl1{Qy-jKSdk@tHH6a@uuM(7^O1ni*yQ zW`xH2+AueTdG5t{DAxK`6)6CkK>5Ng2p}^+r@Jq(jzt*+m3@@d=N1b{G=}-(?bhab zV>=lMzZmBSy04E0ZRoBP8cjk>_wlUsDvgM|@d2se9v~&xG|}R;Ha|Wd@t)=W8AThS zG7*2hV-~hBhkkTAfFH~mJj|Xj_x}CxgU-t$FB%PcbA3wx zM7?|8+k;VVede`h=2#<5V4zy0iD9bVL=Ibbu7up(CH@|9b-;R|LnA6Qr*_P{<_Q^i z?^)fc9i9FuY>f8~YKtw3M23p?)Qfh*qH2F6l$PZU4Lz7bCm_Et8B=QX4~FFK$b?|} zEy^6KB)rz9c99=BbRU+LU&Qq%l>lBqp}#R4zVjBu;U%P24Hx}Zl<8(F1~R}6c3^(MF#9n;@RX)=?tY@2u)*Ggb6Nwg zRC<1Y)WC&}xj2CPsja>5r_nCnKR&g9C|QZ}&Ool~yHNfoN!-$3=RYh7Ljk)oH=;YE zG$AWiY1B{wOgo+GG)Tb{!~oc?y=sk99(Lb%tpNIDe$gi5Ikn_pXk;eQUv1^U_V@Bjn;w@TIKMZ)E zHYjZ3*9?Nexw?zKqfc}b8~^RuQs9TNPh(2BVHh4%m_ww`chqh6JdpKGRiP7=$`f%{ z^t4&rv*-{!j1Lp#vBhgK7rav*r#el$obr@{BL4*rJUOz$v2MFI8xqz%e}P)#F9hj- zEhsjAF9r{r_|+AGdZV10Zmcc1TEVk3q{GAW=Nrve3FVwaO>tljh+w#aS`*@16QH#K zwI*#X@|yr{ilklC4F5d(lYvy`!$?zGcF+MVuwB{}?jzz&^ntTw*I{l~c-1adi1HMX zEe#vg<2N)EW|g^m+cAl4SzeASMO15l9DY+3m!q1H3GUMA+H+kQ6$W4FqKt z;xPhnEkd>N`_2Fug`ZJ}UmfvSQkpaxSJJyHSycbqty)z7hpoD@dd2`vS-sJJ*!gPk zR$^KHvq2P-6{~x{sgaK4+>ih{Cw8n5Fp%FkXd|gEFd~azJt%x)qorfxA}qmM zTH~x&=+di9qI-mvp>0>=DtT=pDf0-TN+lV*7UQ*87gFwSjr+N-m2|pwmm0aJ;Ir~# zBiD3k{71hxQ~QpKPtd*T;%Ur(RFR!U=gOQ-K9e?nbxVZK3?e$?l;^@8*QWz?pQdCU zgOpm0*z6`^bNU;N*i@aH*nFcAn@tyJ#AZi?*m#Jpc-~~hruzgUHh0s__ugd0#@Q9I zx#LYDHb0H(n%Kh`1>$IQ#u*e3;c3Q^^x^*v(s9C5BxvWH%88U zgS03M&*Dm%o2)M$*ELS--*F1(WMW)e!|v!>d6@bUs?6fJa8fJ<6FgTU1vA7@Fy6b2 zW9QiVrbp-s#UiB&q9@oU$`cAif3heAol>n0$O>l5eEyI|SLkHB>>6RMh!=Iu7#}jy zpPD54jY30Wnd>57tt+vA!~?`59Uis8?UHIPha0JylNbddH^Lc6L1ybmE*EHrgHfLX zhV$&xf^JCD$RkXU3(yW^5U$5!Cfn9MC3(Pi54Nj#@HO5-#uJLNQi zXl({6hwSEmx(V?1@O*yE4#8L>ly?)=6cM?m+VE=Z+*;xk1%p#MUXjsg4H6hBWe=yq`X# z4kJp|M^qPH0|Q!b%dTboa2;9rfxew3w~U8};{tqt?o~#wU(xCH>k)eG9rR1=;VPXy ze5)O?zOXA|eN`b5>)pS|9!~rv_V9*Ii1e#5MEc!~4(#D0@%-S5_@5Ycemu*_{TV*% zt}t?a2gQH%drxcMzm`7pzE^Y$R6Ip~pRTur&UDj=#H$e}%jd|+a{bGUNZ5;zDnG3D zR$eB5s{GqdiNms&i8x$yW0WfYeq4L1T-<(Q?o9^T&~XEi((E@Pnmq6_qth=Con8?; z*SB>=r>*vL(&_(zpXPo40)U*0r}kB2vb?UDP~KnJPTK91S4=c&#OOuS`SOa-C6j&m z|B90ee@F_Riz)UOwiygHrER9qxwo02+BUO)E=j|nfst)y5BW5f{+VHr=~mii-lCg- z`!m~SUN&^G&D`>5!lZ9+=z5#kX6U%hTmUO}8*Hhx_*W8sXfeBvP%M#u7U5n|? zG3$adrssSf@I*WkA=GE#ki zm!6+*YMV}~ZP)!WYwhYrr261l#$WG08&9&gcSW*Y0+H;8&x^nIoIMZz`rfl0N%!ot zQPO?#q7MA^gYEd~x$S=6cb53;zg=tO?C{ALY~*%a8~@So4a#QUUB=IJO^2fENH>nFXgjwxGywa7ck7X;%z) zH#WytyC4B-b`TavBm6H9P;C77?`HwNH;iQqRnJcc%ZhXgF$ zuJ9`AfbADMK+W>c2Q~SB9Zq+4U>y=NM_m&VGMnGbJNyPl$YAMfl#EA82KR}Qsb;<- zA=7Bsln4oHiX~x9{Niau!iH~PBus5j!k7y2vse}4&d@i(C<(iPk+66AYAQqqwirIL zBiPOjH9E3HO0y0@Dl~Z+qe8EL>I~x>5r%P7?s*9K-Vb%A@tt-|W1p@l(8=LMf&O`3 z6zIwxYv~l~P7v^6~P? zr|r`I^2ruKsx6<~U)YHB1Eb6`$dSR9LtpL?RNVy4aoA=ueEK>4chsvvzl;HAo@Qur z24%b}>Q`ky&BgkE{|Wq>WQV81h%W#a6D)xWO3-obBP5Ck_;O6TAdjmr@wD8{FAibe zG`YCmb7+B6PROZkRqgz0Z!yb>bH{1;5g09}RtTPh_&gn+kK$J^6Dc{)9jD7$EWBqI zjNQ{>a1Vf)viaQ{b{)nDfU-dU%<$cxJjp#RN$#6OxoB5^2=NEwf!-sh7#cIaD@|^a zCLb3i7`=2yy(m4sk5Uv%G-j3*sU?wLTuPa^y-Nebjp%|sucj3Q@(Mw%_cUM4dwUY{ zOc@Naa~qn;K^n2Ign3vc%6F{9b7K6q%-Nx=+Y3&)!+TJ80` zr-o7~OhK1_^4nF-xg~{qD`z30N$QE2!%l^7peMv|VuTYoqY|DD9u5GeT9MdUZ<@SZ#hL&*_S%3o0uOdu*Io`I=uF#6TB#it2T&C zbXdc6CrDM8(x5njd2>!pVBVaxL?vy>N^*ggz4w(C3p%wS(SYrE(&S1$om2Xr#lwzr zc;85Wboumb1;m@&gdIJG?5W>g58FA+rh@V5xCAJAep)5=bU`e`DYCzmiT?+31n1nDm=Aueyo)#wAz z`|Ztu(9*J#$mcOlK$O|LkEQaavpMy7xd%Fbv#rYBABaz}Ma(aTy}B4XQwiioR14Cz z6(&mQB`Ef=A0E!AEIdnICF!>*@9~J@;T|cD&zO}G^0hmYY3`Q#<8bH{i)ERhqOF@iUVQvXHN@)3?Q}YEFrJ|??0yE;^LLp&g#XV zX^Rwpy@g77nPA4y`mQuUYyX+(4H0jYo*~(5(Tzs#Xr7TP&o^?<-eBZ5!tX8c*_3DO zG#_vz7w&94|M{v&c9MzwnsGPUbB{Wu6T)XmI6N(n^WIPB;z8c~0)?r5M!_?Gudzgy z6%`mfL&>KGk2V4wSW7|mg;y`u!PRui@A(sOWOri>gy5}?5184z z5+2>moaNR$W8%WOod?YP1)ufBtA(54jkHKCPS3?AiVZ_)3?P|cL2unL#DF^dqx&JZ zzrZOO?9!MVj0mwycMcV#EjHeNR#W63UEon*Q*Je|Bi#mjn!CBK5Oo`|4 zw18q-? z|2Z1WC6VGABE|n1End%muTLifE_8o8tY;iHZ{H%;DNbvxgCAMzkb8+sMd(i_Bf)CP z%}^T&41k|dOM~IH!LWSHIG#Qw{3F2<-p!Tpd(k5wYf2A)kKJ2}kh+ZOznImpb-J@g z!xz(BigLpI{b`&7=Mq}S^HQz`{PvF)?Rm5Ec;7z~qJda1YreUEl%=N?v;366pYa%c zH3WmNQrBLCu)zo6{uqLlx;8sDAb(y7WVf;(aDMAp>2+gOO!y@PGp-yr|If=N4DFU!S2OEwB}?$#T1^EDyS9s+iu-6?^R@Q7IN$)N{l4HBk3L1YK$a!5aR%D3YTcP zLGPtVg7KNf&g>?s8svC(+%Z3@=~lV_%}%K@H1Fk94i89w6b=3G%V{W0$8THS3|3Q5 zr*&Rtfy<&*XtEh@vH?GqM_|^1wPvg|yQkZw%?N@?QlGf|m0BMo0b38UfUQ2^Ocoi? zCwwsmY$Y-%KtBKs{tM{}z##RB#%xv2`zPR+llT1vqh0c6iTrcFryNfAT5Nd_WwG=% z8~QO<@<@<>*5|a^=NF(KuxLYPV0zU%Q;U>wNTV%yr2J4yK_yUh2^Jg54?wqc&X#wb z+rkbz3twW(d&GdhuuzyUk~Z7&3XSMl>hJ_ic=j;0P(VkA;wcbtry%s~-KYfF#S&Uy zO$jmru1T0ojQO(88Rqb)hB@OFQhb!KmfHvHQ_!J*?hJ;KON5j_iQhz#WF-S@FrWNd z?q6`7QiJSBv1n>3@u%Qzhv%4q_l?0hN`jRJsFaO7`%p1^pICQB^qf%{8H$?^4Pn&8 z@DTPX>Xix7B=$+V1qOBt!RB`i zHkWCGxey04GJ>Txe>WX24pWm_DOm3n-AluNeLF$;h#=uIah~R{BWGsKF?t zZ+EGig1KC?YygftyRUZsbcUaC@muZ-_1G<1M(N>e^#GeIIt{QXsWxPA`cLSo9%Eyn zupnjL3e*HTGbf_#aoJB6j9Hk?QsGyYEdAXGBX=i!{tchE;WHIJLHMkJj|)D3fln2G ze4dBTmm|(Mo<@64@iZwN;%Vq;7Iqrz_(r)@oiO6OL*E%ilE{ zC0RImADwG~7EiTzY8i?yFXfQv;(AE!Z7n0!)P0?bEI%wr<1`at!jqTK!A{=})em+e zvmp~)Y|?g=U8E|9v=%dsq`^_+v#i2uWeG=i2#lRX*gM4_9wHjo`<8B{2a~r)cN^onBR4caHFSbG&@?=(=^6) zEoFGU9y7eobxpxEuQPBTDai-n>dVgaycYbrJg=C?Nz3yZpZL^MvBuMK{oE6OEIsS1 zYg$=))*6SA(zC8~7+HE&C-eul`*hf;b6F-$xcZHIMv34lH4b%u-~f@ileDln3Qyh) z-up5RBR;b$OP|~!X)Gmty*D=DYttz_yyWmiJivrsJPIdgt)6IAMB#r8TtW zDUgu&g{IYj4BZbGQAT+GugfolSq1YyUq-6RV?^3aEYG*!eqMcB`M( zEvMeCB&}PR3W(Rc^yjNtDxjO5jHCk6?GleftdhzT1jc9j>aHq((z2i0StSE#^l8_@ z4}T9-0}clBC}uiUM7fB}_$_^~!~LINiE!T06XE=` zogHj4rq0>g?j}}$q^zcD{z=t*QA*>c(`|6*bi{n@8zJ}}+43+v_F{})$j{XeXW1H>_PqwPf6)1?i<7u*PXF92cuUW2 z1H@n`R-!cF86ag%Ilx&OwTv_0lTK}Jj`A<|>}r-+61yyaN|OhpYFiW|k)^kV3IT9wxD49wuLG9wy%} z=3%<>Kgh#W(*nTBd$b?#U8Ch;THO+jBi!99l80&R7Np&J9wzPihrJ?sm>O&8xt50s zpfDt$q_*jQ08eQL@H_KHEdaw<5`W7{ISJ#3b{1R!izXZq`X zI@8=mmY+j0S$@83?wF%#`hS$8$vYTNlX;d6GTSu{{tk4F$CT}^3GnwC-uF8_bI^Uw z49u=cn8@k!*Ud_6HwzRZ00_zoLqj119LaabdTcp5( zvv^j(lVgnBJMgK2&mF}^?f`s$hxg$6t}*d?(oXUT-PQAa^9jBGuAWb5@I91I=mFx*gS^luzj2KsaLZ34I+jc9Bo$JEJ+0Psp;)*kwMUBfv(md_uon70D;m z?SJ!s3H^VPPiVXU|KEHqF|FZPp-0MP< zH!_Yt{GR@x5+AGyrLqSZvALup{)5FHM^-xeDLZmdS2TkT=>Y0bzKV`Ht%kqy!pR1I zmc*x&&UbjExLvGQCE0+PyQwG-?Z*2obo3|-VP8z?lO&&o@Bk|zcf!r=oD6?qLA4WPb^_@17ox7W6)Z*6^+)j0_RyeeBXya!C7S^GD5=Ld;;vbts(WUrs_yaD>@Iu~)8ACMpYa(+>zqXG4 ztq;-u@H{!J>R;r(>ZntkCbWiQ6qK(m>IM6|Fk%{c!J^Wc#vQr?Zc+r9=Yg!os>1xo z6+A!NvjClU7PLhN#`~shP9^<+!5=~NS*nbKU-9~KX%p!tV=;CjNbocIiT>FczS`2q zSUe=dS2~`G@O2G<)mO4!7EX=mW?*_Z|#V)I$>oIc4(QEwbJ)hh&^}%c4{DXBM5f z=rGV*tLV9jbJvB%E+IZwQ`KoT#=sR{)pAuxn-l(qNv;ZW=oBlbJhs?>A^9ytT!ZYS zD_^b1+k+jKNgrGyc>Z3@5)rlIkZ7sQrls-`Lc+A2)`zrNWV#b)=IpK($-_YWzcaA) zq38c%`GWOz;<{a5Bc;D$jr2ap8kst!5}R}XJs!p77COTO#ySC-D{rFJX+XK2Uu^^# z>_UEZ4X^~ljWw?B{OXZ^22rhmJ0PGPhAR~JS^6X_+K2ex!FK3X^N~ zt^JbS&>XX5cL8rhryWKX#n~Y3_ue+lTSa&(vkvMR< zhKND;P#6`g{!4Rfi~Ki)zQ!L6_sR9X)AKVT2aL<_Waj-$PSG_fq&XO1)SaSNBx48O z6;rf>pJu-3kd8b3MJt`sNf0B~I;A>1;Hz5^CCn!oTotP9IR@d=K7?TpQ+7PN|NgWZXM`TRSUccs9lGGG z&CoL9Icjou`-{o|cK7`rPwdz!d`ijeg33^k*HG^B+KqJPH~Z1tJ(lj}?iL3&Az8+_ zxQ*KR-(0AF4^*{&09v~2h`j3hy%YCP5b2GJwpD0P@gL$4Qd)3K<}aibX!Hd2bTQL7ow78um6?l zC_D$l8NLJlS7x9my?;Xvz?NTL0rJZ7sU|#qI~TWqP|pn);Hm4wc<;5i#RRH-mL%4; z-)DxaY99xGjpX@f_ zb{?}JFsvn1B&=<$C#+STX+;mpCOhwY8S0UiBe>AbWQIdZhS^jrC<7t$P9dI}&FqXz zpz!#A%o#Q*V3Xd!m+*8X-n*Mz*{`7m0NDLCzbt46lzlCLP9oX+;U;CvgCf)jo&mKi z03`(ewdz~t)SE<8jbvYe#u-eImSLA|nTF8Y7qR2OFzpG@O=o7YUD|~8;GxsyHawht z2YRB=G3!~h$}&oUnST{MIM?YIBKn$P^Xp50{>Upux%d4P zqlQs}Xav_q(l-LXtg^`THSgVeMmsg70xo>J?d4V=3H;a!HGuoQ^#s4@eKZ|ZnLuuT zYIMj?8GO6v!)}p?#Cr^GL~2!ek_vRc+P8bbkGArgVW;#Tq61E?*Yn=T(~;m+E_JAZ z!n}DVgS!E)9P;f32T<`J=cID5F^~5=U3QH-NvKM^#-Ub0U!Ffpl1nAMG(6GWNbih+ zcfJh$6W)Q6IZ#rYbe!AghC(OpdGjuR1(4liaR2O-M`3AvDYOvYu;)EZE;QRio>NHb z?fs&=Aivroly`?_{l{RJZ2Y=N9&He;rv<*~v<=vn3YbObv?{D>JvxJhPRvf_luc+m z$bWhTP%c;tp`sZacLfLN@19BCD%0=wP-KFT4>Mj+n?v=cM_iJJz zN2{423gTk=r$PAq^t4hj&D}Hs-@O;;)wm^B3f=9W9 zCQdh#;O%Nb5cPBdLI)4uTqIS0Ni|5RGeUEBC2-0Yu=UC#RYciReuLMC6oB`>0OU~( z2t;0O*#Yz#UOcBK?EwZLXFhisycXhz$n?=Gi8?`1xET=0W<))(j=m0;q^fF!u$O){@6Hwl)`q19A!7= z?v~nu#}Y)j{|06vuM7=)B$bm34W1tc0MWq1NH}1#b~u9d#yyAp%Pzt9{6zQszMKSh zh7|}pGP)!<7B-=qFTdE+3)@(ZWkXlE0D~uGj;HuOj7fM8?lyiaRRlvO^rl{SC8v=M zJa|>5`Iz(bTrJh8l0mAs3~SEth~^s%7n-QW^!KoD`;1ioN6 zP+-`^ZPGqLsuR>8z(iWIoO;K`3As&>j|(dK8j^y>Cfbu|QL>J~r;YYZK@4!fIw%==cOL0ZzD%{8c% zRY}(a`5uoATJ;8_?F~)n&|Yl!S$lsoBRyM+e)Bd%l;2RdNQVeFXqP#=VjWB&14Y-SJ0$+qk- zg>@Ek#$)xeUHuo?FY*z;aSWkF{{Nh!x@=aTRiG4<_lYm~Eb8zB-D)`%| zL2s>l*(apdTPk=0pTX+8a_)tWX#wwMW?oQOk7)Qb$>mDItV`E6z)rs*W?Aj;^yL6;%UXEzd zH5prtWb6x#j1Bt*GB)dXIvGRq1$`h=<_I1HGUk+tebcC!M!aH)S|~6D_>$4I@59>I zh`~s>@ej`wFn{crYS{W;6s^1XMITUe<1=R$$@4OQ4MLR}xt!geW^VpPBn$Fh6LA0) z0f>d>rIj&Ojn z$pS(4EWhLwyl)Niau|=pFZAaX#QBypE8U>InQ0apTYmN0Na z=gOIE$TyvY1r997D*>F3#SOqA^u&X9ny!?8c8PLA=JOyf71sI3XHJ!$RC9OptCy@j z^f7vUeYEyl_y(-P&_Yf&cL&7MaE@V1$TA}p^Uof9u2mI-KN$Hn-gWi#%I^cK({=oG zN>!q1t0?z+Ce&{xY=-nI>|6YzBxF2E_%QH`d*dm}uOKuu`~;+B=!jUWVQJ{f$tDbc zZuLHnubwfuoIvZajBAv>32OV_fnT}*p-1Q{QaJdrBY;lXw#=!@T>vR*YvcaLgMN?~ zr7c0l1Q(Om(ym?0`wnAac*1t=gE4#dV{FgfEXVEHZ?mzx#z!|Fml)Zz!AMSyb-Kz=DE(dPULEIh>3lg~HodVC$pTb~2kaHW%S(ringETBqMB|E>~VU8MlBpCa^haw}_WFw4Wj3 zxMU*vA=}+BL%{|HT6D+J5L>{19pnR2!_y?dQlI4X+h5ceO{oSIHL!|H{k~lmTn9UC z)>__c!0k_}m4-fxBHV?zsYu`0r63}nOOToyztQ45V6S=Hb+=vGXR`*}Jq5YIFxvm= zE1z3%v15gzWPeeRQ}aN4mwJ^0CE(xxQZ(%vDS4?7Tne%oMBT4o^I~^@g5eD4v_x;a zSKu_IC9rmQ-|Y!37TmvKDP`mJEi*(k5jw8kc$cZ&tr)0<`omKtx%FJg-aHYC{O~h^ zum+mIPQ}m?ZLj+r3#Fbt*OYvKMJ{i^K+r3tI=&Fe=23sE`XABE&wooa^IiXW(#-E3 zh@+WHaY0h=fM$+Bu9p;lIi)?IjAkZiG;^ZPACA?DkWMrIFX+$rMxB1v z7>OiK%60<%#K2o^Og7kV{6&bb2z}VgaSosyW%iJ$`?%&_;@C*Nvq*qux+(8{Es=!~ zM=hiJkn^YaN(wshxiZJARm$IvAOg{njTWb*U1%u81sT@Urd>jkZth}q^$OfDY z9pLd8xA;!Ll#gN2{(`p5ePcvZmYUd!rp$d2YRSHKNY%u*DLs#{Zk7QuFRb1{KAV_) zP1?)2QO}P9gy7)>sE63_?49DCZ$b8{Y}|z`F>ta`CiY7+GO@tE!gB42YjN>5JY?9~ z1V9z|KLzckEjIXnk250>Gy5(+mLF5?@?8L;uU+@sFomK`suiS4A-h5riMPeLeVfD@ zv2J;Mh{om$1HS<3v*)mFU?o()r(Q_eh4g_Qsavr+oxS}4+1p)CY37SIg1EF31v6g) zaa_doiq!;2a#L7`)=vgf()r06jER}xq7%|E9wuboaq>!k@HtI7`T4V{bMh0r>OX;3 zwQKE(GB2J%+iUE=pf#TdlKd7b9uiQNHj+;Bao&51qQ!Sb2ruB@@)-Q{(hsD&h|qw| z_>+-UF{orn`_a7wnauDi5qR-ZO3l3#c5`!Pkvu&U7Nz^7P;Sd?Q|eDcLuwEw_hIF| z)3l_p+qAcT^kk60!64Ff+*|Hg6~DFok&E40?xBrFWm^mHT}G!Q>~A~}S)VjiH}MR= zu*dY%_L%BU_n3a7)Dqoej>YUTFDrf8IwAHnA|I2-Zv%9ga;Eb+ik_<`%5%*KVPryL~z-UKUCA=d$a>cP(wp$Er~Ms>rV-^X;r_l7jxuy;IM zDc>kSQ}#S<Cq-dXqX4+=J?mjHQE9ag{v_@A03s_|U@*fcRF%_D2XwCvMN4-Us+Hn?tr##M3 zg}!waP$WqglQQMss;|G!mtff)})6 zI8ajEcvvnbABv)Y2L%+jeh?>r$bEZR-Y|X%CXiat--GF$oInO$Jzxj6lr`t@-v5Dj zytS^U1@w7vs9TuKZ3LNn3*0j5GPhAlhblhEp?rP|n-LRu?-O*`8==D`@Quy=UI{?~ zY?G;UzCsU)zX4uO6{VU`uY1}0-GqqX$-jp8t;gpc5%zfR`()-RP%{mG;mv|7m~~L0 zzMWq!8j7If*kxZ4`Z*ra>kLe0b|)3^n{DFwECy(QoBYT@bSsEBB*c0% zQa!8$URNDGKrg*%#x+P~QvZ+W$(g7%zr?CS?8V&8%|G zks%!&8QPd5gR?t-?4fPL;BAgMGOSJ1MYE3*@!eI4F^&wMuw-aVJZpjqfdBMidn5C` zRG#;dZ!Ab?2Snf3ys!2G46Z4p_UUB5Ze)U5z7L&bkQr`fiI84;G7U)Kj-u=;Sa0a& zWQZ8>yF0SKK>Ixueimx8d%xp-_2fgb869&-=QeSox*(`Ra;{XqMRD;0(q0(mhO7NV4+n=PPpf`%l7LUi6 zE&iCq%oe?(me(azZBSvB*BUZeETIBqvKS^2_`~aSYr|iKek--9)f{EUD_lZ)xeht! z7Q73T#O8m0B|XMOi;&I+oan^5v2YptK=)K6HU z8)?5Y#~5jk^(1Q@z7;CFGZp9O!qQfi6uIc~U;ZX4s~W%8EwywIU*KvX4fnXc`lpc_Gn1$+pA_OqTzP`BW8rP|8i!tr3DjX zvn?2Z(%>+CEn3e2UyCblV>d1`Y?3ku7zl@;7fU1KZD*?05i89Fk$kt_7JFHa>ery#cZH1BehGYEU25gV3O5$9<%{_pYCT65< z{GExdee{ZvDi!W5GtRzSu-Xt_sas@sN7xa6Up4N?rtNfWDq`GE-O)Nr6IGt5yof0d zlehwJgZm|BpItVBu@#sCn3zo7yV!)6v{~+HiZGg6o5%v%k&-yO#ZZ!m(~ybssK%)6 z6O+(sw$Cv!L-efH|Y_8B20sTv_!ox3~yrJp8AH+`OiJUm*|1$m$#=k>&Y zJ%81Ra(lY2%CTyOyow5`A0aT6r>|Ln}|V zYNj}5gBuDk2f2-3y`&5k%5d>f8ETZJrVcvgkBGjlBKqYdo$_6eccoMQC^1f_jPz5Y zS4pQ#WNHI;*uXDdLv}bE14z&K9_f^SY56mC3O)+GDlnaLrKVH9oxRVwZqZ2{txD1< z|0ndVmDAP9-IzHp59sp~kF~1VfRM_}mWb#xumJ`C?V5$IK)2B4MJ#mJn~ByGbgIevrYm&fW)r9EAcyEm%Hu2!tm3`D zL0)2g)G&A8iEbn#TuH3tSDIlih&0+7bl*>mO->V55@l>MnlR^g!lp-c#wJD|5B!a# zGyWzyh4DAuj7Fw}C=SgQVN5-LP#>DT*)={JnESVrQOmQL_m%#votFG@V|>$ZG*Z)( zBTdIKRJ?Z`AOLPs(7qj6~ARwbbmC;mPPeVUGis#yJ`H{kYr>gl}XH;7YFic znp15~aFRnaZ-O~^5pA<*2s;)rgx#3PCd@|x0!)>S9!wo(HIxlCbhxX3@ERtpWcXTd z*0i}ZjgbWm%u5bzbXZ)f!JxG9nFW4d8SHMk2Pllkx}W737NnssBAoDKL*Nf>QYE22 z3bxXj#&4Lq54SHn&~gwrV$Fn9N;4BW$xKLh9J-kh zU**03CZz@RFub%QP}_rlq~8bt>OUKGov+stN2D0l3Y{7bh1Q=rpGm60qM^p9q3=JY z$UluHid;SOJSlS9t#K6DOIE&gX64H!D_<{DJVj2ATKTB&slypXwrCW2oW^62dmxc9 zog%Y*n7@jC`3^_Sds`UqhV)o@80fJR=&^*phM0hdA&3L-~a4Zwh}(RjvEnz2s4bYVRxYC`uTnR-)Xhv@w$n z69Tmr$fUyd==P5r0X<4I>)ts;NcWJ4_;^!dNAb~p0g8^_Ko^^jQ%~Oq3bL>Yt$LUT ziqr|x4rwQ_FhWp&Nyy$otQ%n1o_ajb%$7No^u7g}-j}gut!BoS!RqQkR=raUkk&?l z|5Lzj3ffGhn#iG5y!Z<^UT)>_*EBlQFj1t^bZNa327F16PM(S0Y*u^U$>~C%4v) z8}vY8tO%dQY64Ky!smYl!K%}-S2SLoCZm5oOh(~JjiAnonD&CEt_W)T)&5nUspDN` zV^iEt{hhJHPJQ~k5vDYcY$d}Q(H=+Cvq#j_*Bhy4wRd?uW=iY^V2Gfb`@Cc@Dboxl zHfHbJ2xu68e%lFf6qRc+9GFzT=A#j=g?53y%%<0i+4ORV+H31l-wLL(c5%U>QSbM( z)R;-{0g|o`=qA0F$)rafBR1Whw}9^Liy2Rcl?F|Ylv9&5n;v_v?FzU*z}_I6lVC#t z#ObgfxL;B(Y3qc%(|~9;LcMMPJb36#S5wk{(!c+I4HSRr7#a37@}$M-E$>B^y>w>T z%TfN_7E81~(1}($|KaR^37>C93*g(x$-I1qaR5^lBb}L{(f?{D z-s3-iH7FpeR-*whB&ge!RmX^qwzZruguWRH!+!3J&VMegOX7r&49edQ>()I3hS6pn zVbK+#6{V=bBCpZ>qd4Hr%J-*r8{dJ`8hd#GS`e9biH5i@ztu%s8`u zW7 z8tm>Kvykt6!Th)hbJO4|eio`8CApq6%Y|*ZM=^I%hLL6B>4!Y8G;fia-%w@46Jy{v zJf2NqG!rNZ4QgnFPnh#}jXfKNRqL{UN>zdco8Z%wA_EMXJ%pJ)|33AP3YqJ zg?|}!N*=A^_~g-Tu$Oww6mSnSkV&9iMd8jsH|$b965tHSo+Hpbz!PUmy#RlI(Z}A? zW_pa5M`Pcx2JBh@t$~}wMptH5?rx{{F8!3YP`(ML_0XIPMN+KbPlsufO*#a`9J&f? zTeNPOD@e;|aG$ZPD<9DhOg@kWRPb|A3W~w{3`a@;-NzTt#}P4%zyk$7%ACQD8FBs2 zDShEnU82KNWfr8wB6*G(Uf<+@H0_c$3#QG87Qw?Am;!&dL#@E>3)X;>AGI4MU)}7t zNoMP@$Ex%ibB{WtDyLjvmb?Tz%zppOUr?_p->Eu+KW3;q1PLl{5i58?3jHo_QWK%-}A6x5ef+0j{|f zj3Sg6Vu=ek;ew!CnDPndBRu=xj}w%!voV>a*5 zKdv(Y^^mHC#s=SRs2;0qUm@^)qPj!$95yRc&qgbvIR3uf$zlbTJDaU+< zG6#=uQC&9x64<1lN6F@E1+@yX9oD}`khmh4NV0@w)kq@{V|hX2J%7xoZ2eDT|;OiCDquJSE<%|nk{n$aavH6dt0Wqs?w5Y zT>qmbX9MAHp#`W+!#>@T#g&N{*NOvc9DYkK%kt}}X6j-Cr`6a=YvK^?nNYS4>x;3p ziPb?0+vn{;ho94b>Wmg+jUHEZ#m(^rBF4JdYp@RzCl0I-Q(`*vD_6kT0~E+fx5sBWz$}2QfWMN5Pa8gq)f%|vhoNNTbjSZ$eH0Y4?cIm=LCH6 zU^24c+X>$vuZZU4Lnobnxc$Tg*#}OM6}ljetkCN#bSrd!PAW9`qy<)Y5DDjuwZFlf z0vD1kb$sS*-WIgyekVx9W`|sA5u_Z4Jkf%lHogYCblL_unkVogT)dHi^3X}C$}XL? zOGo%o71_t78qw5@woHdyV8QTjQ8ZQ1=A2!Po3m*B2847vzo@kvOG#q)HMquLx`D>?%9lbtt6&-h!0m;|$VS zs;=pj=B>f?8?=SUGFBz^S}4k?3k6uiY5-Vor_|!_p}pcjUplGUZmn|f@C95~0u=)J zXJQ(i+=QN2nWjkfupVuG)({){YSSn=^)o@;EUJ|@dANw9fAn2Mxkp`?#QiAm?Pbu6 zD55;#{YkBAjBTwLdq1{Y#K;n{soAnat_K9!9veb2u{$%Wjm5Fu0x*MN0vF%OAcHVS z*fw_4K)3jNIDj1D@IEKGGb0Kut&^(jcN)lUh}Ooc+AA3t#3JAlk?i1mHmLdc(PdoE6*!`{5TlUTZ+sW2aam&Yj<{|Jmmw6^iy1VXnaK(~z?!;P_a4c%h!4Jh97 z(d|Fy3j5il?-Zy z(-eZ;L@VtG9tBj}ELiut_b^mb0c@9$b4Inz|BmmpIa0F#ysv*lbU^&-BoHTw1r$u% zaZ;dwJXpkm`uY;afy7DNUiTP`8*w*cT)mEQnE2E;t{V$76k}|A8rlV158(;HF=)3r zm7(43e>lW3419og@$jQjNANFzhEE;;DiHq|^qBpzM?CbV66&e0Aq@3&@Cnivv8YGI z3H7AIc5AhJH(;FxzJLA#_}CGVuFM$#jqC0LXb|z1wmSX3W#rWxBK?q*m|f!w*!;ew z77cp5xWDmRJnm8lo(;SI1&deK>?+?z>?-?Qe9C{snk# z*WmRL4eDL&7CXKKg$M)X4jCI=FQ+M4djB4g^&)(tlFwWQ$5Q!uH{n{8Cr4g+Wf>`+ zPo&c;-zJ#$S@-jcUWHQG`*GCF$_(Ab7mB4*l)sMR!}nxYphKdL*WYLdWg ze}Y^{A{gt<9aJ?C^z0g7W^N<}9Qv_XPuQh@3H+Zb?WV8nrf)DYP%(4GsOW`#9I4vn zTTwOOnvF-zh=P2#is~~PJ6sS69Qof1)@t7KbvNdKf0`@+J0H)LmJu+>1Ai;(=&Dgi zr+MJhBfDvb&AQdqT|<@dd$54RJF%%^e*wrUy5HZ4p-mD}N9hdCHa4GQ^S?riY=QU6^r-fO>%UUDizlDjOY9bhbnRf0LV|Ws2O4fAjP&L>kHh zB~NKn@Q4ZPK7MhZG!)SHP|g_N0fAp0l5ZI<1e{E#ny)g%iX)CNT-uEJAk$)ehuNqI&m1GI$3o)CKGt)*< zslylZtDiqa_NdS5DQ<19se?6ZdNPGgz~4~D;8c!Zlce2*{o~ke%&sNMe{kX1x#^uBT z?M?z(D*!DGqi<+~iUr!zs3II6g?eN#pnabbze6I>?!sMnd<1Ci_`P4V|Ndx-ubqK! za3X=vmW_sp`o{krf6l!#s2%v8D((t=!E58dw*;4!M@7pi;oNC+Jot`BeOd5PX!oTI ze6`7ug@%y31-UVMJ9PUM{2f`2Sal3k9wUJ&hcFHO8YocZ4eYnxJtk4=iy{9~la8>; zvXff*`^%iN-K+8V`Ve?3$tc4YsF~Kd-oml1YU2+ep$NfaeX+eg{UvCmIME&eu|>LH5(U*O zx>4}1Zn{yht(z9__eL?Zh>bUNXk}}E6W4VE@4{1M`-!+M;S-IVcfKXOc;;L)HW};t z?3|N&WB=%+f8Kl=y)HIU6f%B4+Nh0jab%3i$(@few#pwbZa>D@r?v1@dGJ)+mi53n zx2#j~Th>FCb8T4-c*a6Wd_33d8e;|9?(&~8o~w)JTY2x627K<=^Swje?(`joZ4SK^ zKQQ1v+Xr_+YZd>@FtP!BscBC9=9B5iu(>TL7pNfsPY(-lg?>YJ9&p#`pWNglNByg7Auc zrjY&#e_eMMgDF{enWN5L%~6Ls&SEXQ=j}D;>})vDv6z6reI77`h-2RmyFI|VA!sOCb>8=$suJ&JlmF^#F9IT zT`p82M#_8)AOwd0nPCLiy-+z~UR>o(ozKL>e}=f3NQ%KA_&MdQhCvL03eTPkf&TLu zsRjfJW8fgE4XH*shJN9G7gG90h$QR{*^XAGol{yHVi6Bl43YI+bQrfp_i;zK!=#zO zE0GA{>R8XHQLI3Jej9@FP(yrIV-SJ5dJ}c^U3Pm!nTTBlo>Ht( zfAF3N?P$c#OsiH-G= z1OsAiQy;a8Isrs(VP?Q^7_eFut5%=3e^#y6UX+U>bIBx=3n3T81Q3#NaSkIA63qoj z=3Q&;bLJ9)+CKe#e(xXe=L4C2_St7&*IIk+wb%Y`d2=ss)@vvEZwMEP*^Nk5H^rgg zu0v{>!rwaVFX6A=>$aB$?{=!37wz7vR+X z?)h7laZy+rU`fhgo_2)T0 z{$J^ltEfk!=COhJZ__pJ8lV>DV+$9`D`K8D4k)T(Fh1;b9RJ-15|ovHHv6W=yIcaMpvwjTt)EoBy@l#hJL)jQi6a_V^piB;+pozId*OCsNse05T; zGiBFv7#XzWNy{DNZIThE%*t+>xxQB6DN17TDVhnNq9J;Ees&oBZcWVe{H!uPNA$aA z&(ZIgeW~KvoFDxCw@uQff8^*%daa;N((6cI^g!!531IWFALzulI>lHQ(e!fb8D)YN z&-|wobU%r&YU~Be5b;HgK##O%2ET1d_5_2G`{?wy4Q?SO(Feaxpk-kaUEtdax{#eC zr+yJerx-Wzt?alV!j9f=VMpKDa|Kj%6*i5I3>sH9u@+Y!iE=_Pe?4hRop9S7k^O19 z&)HpNN?l6sOj0Y_boo7F?85-8+0ie5?eECG3lmQ^I-t62t`t%FJzdJ>i5yRq1Z_b2AqPcTz|df(PnrcrUup%mVSXOLVtiFJ{(QjDGkl>gz@Fp-`@P2;VJ@HtqR$dD#vxv!gp!$R+<4 zB?<2_wem3Km@xm1i*RQI!8&BTQzYP^%LNb>^;37pWGRttKQ&q3C^&CfK zeNDZvJT*mQeRwvcVs?HlJs+L-H@8oK?jN`ZTS6JW*p!#4D@#ZQ8$rG0Ju7R-80wgl+rd=(@?a zlXwrV;o44vCNOr8r-i|F=-1l#Gj zC8<)au=-RS@M4P8VA1+>5qJl>rYi6W;>g)5#JlhE3evp9;9k5uWg*^@bf47i4(iZx ze{2z6LNgmNA2XZ}44S21{VlCW~>8*nAwGfPt*{%yi{S zkXhz_soQbFdYMV8G)c8U{&TM_UXuV!f9elaLNBKLk3NT3 zeF+-Ex9Ra}dpt6cL5|R7$I;S1ydM|bY;hk;5u9U3WbV(?evRElCH`HiH%VSBLb$eg zJ(lPKwt|wd#NadVPJU%@DBYBvOE=~dNH^`AZqmLYx+#O7z=7Y!(hc5+9;m`Se>PX? zDAn67%}bPPy@aUNs-K3$(%Ul873?6E5AG+v4(^G@076eJ_F*eXZR_QMt5A2Xjq*7| zxvZ}d$tf-6E^i+x0v*;e}TV(&M_r)Hgvt9_e%bNG!iJ-71C%*jBd82fdc^L zre>72U#|&;^fh=;fW3QrYDQoOFlBZXd)5njgjCEg4ZGV*{Sy3Y*!p4r{Wwv%6@WQV zewSF-N|$B3>I-Orxq@Hc;10~1f@m51zDfJ59Ere=*G6xf3A0MN-%-srfBu~|T4%9M zM+kGr4FVtK9n8{5tqrIpXV4`h8M!cM_lS~bXvXL$gc(1K8D}aPube@dJ{cdCDNJLQ z-iBPGCznnaIvSY6qE)Ui$sj_o00(~*cJ4d3D5eyZ9#d2W6@{*^mgaU#s2U6GZ9u<5 zEXU$#w7$g4kl&y-MwMYPe>Niqi6{89a^nGlbRZmwXPDCe8K>B^;-gB3DG1NzV-4tj z3VtWy@bzGJoI;fL;`}>;9t(A*g$B+EP^!h~#VWZV!P3L{@;BKAl}$*hm&TpHinl6N z{6kz!6_Janiip>D{wn4=YM32$lSmbx{M8_@V*7PbRgCICURik>f89hD{YG*Pt=xMG z1>TL7n-#8HJg?lUo1&{^F}kQqc@8(T==R|I7fY86M^k&ti2N8%SYsra}tCl=d^Fv?t`OBe-Tg##Yzc(ic?BRufbl*CrJT?yae&o#pkw**;64^xIs@|Mo)#hPiGpU zCQIfRsSMS*g@2*pg^RI;HxDX>-|%gPzdjgMc=;=Xyzn%&aI@r=e?n#um+U07ho4gk z^e^vT>jEtMM)ab@#X!0n^4VB`W%ohZc)n8dM+$cHe}X~mOphw~aRV0mGqq5BxIZgA zp6=l1So|TS8pyy3XLcfIf?!0S!&tiA3vUplzo;Nd)9WEb6uSr6PJ{@d*TrMr$CzB6 z?-Y~;B`60LV}zQ-iAnxCG)V&`aZ?h<5!$VBlP?keF5|xl{)OoU{Gjh_RG!yjo{#ZO zLID?ae>|02{@hNHq~zVvmFq+n|M={X${mgHd{|#sVH5q^6?n87f=#U9 zHn0*~e-88pzizq)YPDT~O{|gp3VhuiQiJ4o%cE@V@$TbEwvIS`BR(hE+7o!_0$Y0` zg%H6k#VuLvbr3Qw zbqn;~Hd6lF)=QN|)fSDy@f?^h+ihJbK<{nUBx^LAOKk0NY-b}zu=g6^DH(#U5_h|{ zf5g@nU*c{XRiba8C|g?sJSIjS6H5f>9f-T2L~yrhOZ1)+GyK=P;m2J9U4>neh+RTw zJ!!P)ehFwO^bFl$X=Ym*$&n3ekL%w#{56E-LLP*^l=Gr-_riK^hH3pxpwG7o>)n~v zJuRYiTAG`X>%1$`Jh3U)IX6+Tbxg|Df3^rV&v=veqP%Rc^%|k4l@4H#DMg&v1dAQ9 z%tI!X?3yLxVKt!@9dGjFCCIxq>P=ksKgWd$a4H4y zRxnX%I4C1sF}1Kx#~NH0t*5S>e~6`T{01>GhpN9_EUl8ILC11nM~l=rq)m!N$6gnc zV>Pv>GCroG{92KrQRS>v%jwp9XE_bwwF8!O8J?xWE1>6c%{OcA3~1~%WcZ>N zz$iqp@#m?Adbjqy8q z$Tm-w$rtMWpu1ZH$2X7s{Y)a+~W z;ByOp{^9`t+@6MS(e(xhBb>Rik|5?%vkBp>c?EBKIAQPLu=la5_`}l3z+d`9p>vk` zcoyR3gekPpM+{D7q5n0V6#P|c2A$;22+ShFE4>8MU#l%01HZGbf1R69%8%fs+@;t6 zx`&pZD>d>d{C1eaKN^C3>{XGEyEH1uDOVD+y~83Ozy6;iAM5>yecULa`8k4ntoOUy zFV@!x<)gxt{J+AO3gtH>gpGQUY81 zWa|xqKjMKZ&=sI$f0%t?@nYhf%dvKp~jt>Xiaq542?(N`Qd$xt`VbOn23 z#!G5+AD@7IfbHvTkvtQtp&xARDQMoJexxqoPl@~~kv~C4&@o50y(57=?SkId`+N7{ zn|Qt7)_#3hm9w?E^r%KBBB>>M&#`AEqQNs6XWI$Fok+eWe<|*h5Xl0UbQ%<8AmC#=Ik2lMN2M*QcUR{o{>Bc4}IC)*5f9vJ9sqaJSg^8N;lpsmq?~S>MUAn zWrkQ663*=?1R=TOVFVNr)OTFozy1HfAzHLEwKexqAK4Oyjtl_X*b() z2uQ}}j$`(}z*jaI0(h?6)(?TFakAf8yY0?XTmS=0wP}= zE^?EneV%GSC3dnI)}~rkaFnI(VQCfJtZ1AK-mtU-5S+9Dg0O-bx0?Uz9;Dx*J@9|Z zeagFHfBId}z|uSr4gVK(Ky(}YLKcPlFq=7)WK1!hp>kPAvVza~Q>3=iK6h}kb{{Oj z_R#{26P5L6NKF^xq6>)WIxhcG6X=fJ3?!-jtL6|%d6(yzBo9LC@r9Ds3k1cS&+yKF zs0B^ivsoHhO6g3R$jzldRo$z0z;XhJs;made+gDS`-0F{my~rNMFBa1N)0&#KUQga zI=Q`*kSQrth%6}sJ{NtYu!(h^`2zLQvDQ&Y}wj_mr`WyJP#{+bH2~PJO`9c)C zJ+3%w8v!4mGoNxUqe*pJn9D%QO8Z!ve_w648zwdD4@*#i8qkE<%;Xf;D6EEM`-5pp zhX_)&%3p&Tg}?r&^4EuSpwGpgyqdF+Zt>;7C^OuP6M@dFOAv&W?R2xWR#tEVVhnd* zj#OVfsepd34zRStz!dGA%POFf@MD-xFAELV&~K3+!#`BQ49yqCZV0xaoRE+Rf6{8% zCJ))Eil&Uh^3$4;XV0Y2Cx%}7Ee2Kw#w%=v|DPk-lU|?_@RfYP4=CG;8Qi8@LJJ}^ z%OKPZ8hi*4EASepbKPr@Gb_;jHHB;`kR40&L5b7eVzWQO#WC0-3z(5#FPMovh)Rcd?;4ylE&ak zLEONFl~SW382HR#Y_?uz!lPHu!b;IPfo~Z)h2uhcb#n*2MY&%d@6Bv--f%p4GHSlx zPIlUYCQt(#P*HCb`I5xw$@W-(0jk^4s?N#bm4aL@A{i>tu*MbywlPO6PTe@4m z2I9`sUM`YXx+OPeQ97E}e{&44rx6;Q8n8N(fD3hbKY;cE^(7mA_5)-~|D(VdN^`jx z%vu+0`hNNUT@#i6U+P9+{wF4>`F}C#d*_d^cBu3j0xRQ5=^I|vi%Ji)%Jsxc12>an zIOxR_1ijzr7Ruu?`S(=>f}uPNv;PRC21b)O2RYaxl(kRRXeQfge^Wr3P7s)>MXKf6 zwA5&;iSO|yGZSdzw(5i)Zz7uMAU3hbo1nxdv+aj9Y;FzVMN4kftlcC)1kxP&dIZxv zI%xH~48^i2Y8 zdTK~noedNIY*K0Af3-<+fnuwZY6R46+mm}+K{IZTH|gC_-}XfQn4ml+@W({uF^(QP zK#fj@7|@BU%|?h$fd@gV>1{Maf7uRSj~ldReT&K1YSy<3QnR9o^9-aKGpN$-@o0VH zxhD@_SaenVTo-qPF0K^Js|=YaEzC`w4Mk73wYy-r5m6X*fAZNvj~8gcEP0VA0<%f= zMipMA3W$X@nl)-ee0b_o?YIAhb(Qx!`R9=V!Wv2i{+SZkQ%?MO?PV(eq+h1;k2r*Z zYJ-hK_R~?Hp3oK1r!#5y%nf2i+J}OL1Wt+31GA|~swzP^;TPigWM*%|g|o6Nc5)}0 zLzGSaHr(Lfe?AB^Qc1eUgvL}@wpWX6JFJY>#Bmdv?t_UWHDPw|;Ph%XBbBK;QmG5o8jaCH1--w_Y` zHI(OuV2fkF^%0g!jGe=*Q+aSMH3q#Mm2YoQ^Kc?0|h zUBSaS6*SZw&aQkI|8|B99=iKW44U8pp8u3@E~R{RM=$01!vE&rRxB}iDOQ3?3GhUQ z2A&AI150WQKBbNa)8Nct^oX!vZR*`;^Tb(;ZO7xRqiv_-nBx(Ig}RSWiC|1%V3`fq zTyhcWf76j195t#gs0u_sOY{sr77l&#E$3AN|tP2!fjLnc29}={!Ah3)c z0Yt(fy44^!=}l~W=_Em_l^-OS#Tjjje=10=+mf*(u19pyZQJn5720ix-0Vx{%eygH zf8gq3^D2VRJLiUQZz{ME(Fj+|Pn>4}zo))5&d0~^#5h%73Xc1}`VyY>`8It?K&k@27q$k#-gn5b|tLQ7-9e>Z-K94xT3K48N+zd-U&s|u`t4t2NPz@Ucf zA*xGY#UODOV1zsPZfu)hk^g7Nu=q=*l3es;VB28|TXPc*-QuXR5Ty#Syf87hJSPSv z%l73$cGaS-!ZzMDOWy#hhMvjU4E1cmPHD}PIt6mxQhEoWu|WN?)r44DKTGR0e>)4$ z0yiLdABTSheQzD@sh+ z?QA1%#6zf!ZN#OZ8R!s(V@B2D5v*X&mY={F!Bd4GRj}vjMI~E{8zrnD>ksf!kiIEN z?=(wiVG>)Ont};@f<#<+8WFYFfAdvXlM(@a9X?J)9Y@$nQxnx}X1p?)Q9wwqVp{@& z1kJCsggvMsXVAaNs|SxJ@TOsgJd4-VEG}2G*xAB%`qEq2lh?)*nA4L9TE6danpYCC z0P={=#rhbU4Q3AEN+&t(<))?tIN;gssVRI|BXuJq%}RqHxzpX*UbgX?e>gnGbxCh) zb}e(Fty$bGZVP)yyW3`o#zs-^AtxH(!A`b@b3<__G}(40h1m+x$D&q{e9djVFm0cF z8tocF_AcvhNb=uG4bAqKE(l)Ew)ak!s(M>W96iibC6r%Kf~V|Z=(5gUhg?8=SNXZl z;?#u}>8>0zOPkw(yp&^+e-1~ZiU{eS^Wx-MUYN`Jj3Dg_to@pE*o}7shy9an>6DXk zl5*5qe*%;pyo`is=i(7ugc)FB zsa!U?G)b@zSVzEs_6phoLa{~oNBIt3>k9d9s`YN`#h~WOmb27^(hK30PsTkR2<(z) zaxVq>j21lCYBq1nA*-$h?M`Czaf`koFS}+5Q|_^` zf6DBi;K$lerlfp2W)f`&-xYZ)I^0&HDD4hBjyOS}4@1)dlmBAv+maK6HCJQ@}AhZpZu+ZUVar-*dafKTcZf-~!|dpJ{8x%+ zqGF!D1EpeGuES@&8ChmwU^W7$;32q3{*mH0-{4Hjf9P$&vsupNxRnlh-CHfX+hV{9jN9Z*a25RlpvIYv!6e{9kY!qI~e%3BO$s*G+7(5Q)+N za?7CCSxR$$uN*86@xwA~G^p zfA7ZJB>!epdY`a<_qlmp6jJgU72nnNnJ<`f1=c1V)RDyxR=@g%uO_<1|*9G0WEoVjX-+n zS$RQvYxcpF3yBsgSEM=>$#pt$#&0YNDg|W#xC711}sWPP|^2)jG)z-_l&El@;VsnS!wCsXp z2-9A!VO!kZ%%*L-kXobThS67}_EUwew4usYx-<7n&E%s^w;gUw~_n2b!~HKE>Cn>)^W)F#JSb+-Pv z(tqG^t_r^U9r`n>&n8r#y9B7ycB&<*&;5$}e7CATPs0PPJ4*yxV5I@~c}YtKWqHJ~ z!o-dz3(s{jzk?;!nLBS^uz4^)_;_g&p_4JL&s#{AzG7u=Ue7Of9`g=D8SM> zrPFwl;;&GdkIrY6@*;QG6*JJ5@M)sR<;lw0-smMh+NbpLSP>R&H)8ka1U?*4t}`Q# z8xXIp*@xK1)r6ixoBAtE=U;Mn21jvo-1|or&)TqaCv;doc32_zwTY6F�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�mi6*<5%hHb?Jg6 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

    9Lpv5yee33T+23C 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 z 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%0DQxT!2nYh<`G1+t5N}K0{Rw8T`jptF9 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%0AH~95KZ=?vpGT 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

    b!^gEAvGplI-L8G2CAZ$n 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 @#GX2JMobNC`2tzV{Rkic&D? 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


    uRCvi*G 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 z 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�Vj|w2kCjq)@`w%QK-=5!uZi=%%bo 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

    }m$XYqnYt4+^ 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

    y3jdy?%d>R7}6Tcy6fOHroY}B)o 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 diff --git a/tools/gen_esp32part.py b/tools/gen_esp32part.py index ffa740a36e0..959b3188a0a 100755 --- a/tools/gen_esp32part.py +++ b/tools/gen_esp32part.py @@ -7,11 +7,8 @@ # See https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/partition-tables.html # for explanation of partition table structure and uses. # -# SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2016-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 - -from __future__ import division, print_function, unicode_literals - import argparse import binascii import errno @@ -22,26 +19,34 @@ import sys MAX_PARTITION_LENGTH = 0xC00 # 3K for partition data (96 entries) leaves 1K in a 4K sector for signature -MD5_PARTITION_BEGIN = b"\xEB\xEB" + b"\xFF" * 14 # The first 2 bytes are like magic numbers for MD5 sum +MD5_PARTITION_BEGIN = b"\xeb\xeb" + b"\xff" * 14 # The first 2 bytes are like magic numbers for MD5 sum PARTITION_TABLE_SIZE = 0x1000 # Size of partition table MIN_PARTITION_SUBTYPE_APP_OTA = 0x10 NUM_PARTITION_SUBTYPE_APP_OTA = 16 +MIN_PARTITION_SUBTYPE_APP_TEE = 0x30 +NUM_PARTITION_SUBTYPE_APP_TEE = 2 SECURE_NONE = None SECURE_V1 = "v1" SECURE_V2 = "v2" -__version__ = "1.2" +__version__ = "1.5" APP_TYPE = 0x00 DATA_TYPE = 0x01 +BOOTLOADER_TYPE = 0x02 +PARTITION_TABLE_TYPE = 0x03 TYPES = { + "bootloader": BOOTLOADER_TYPE, + "partition_table": PARTITION_TABLE_TYPE, "app": APP_TYPE, "data": DATA_TYPE, } +NVS_RW_MIN_PARTITION_SIZE = 0x3000 + def get_ptype_as_int(ptype): """Convert a string which might be numeric or the name of a partition type to an integer""" @@ -56,6 +61,15 @@ def get_ptype_as_int(ptype): # Keep this map in sync with esp_partition_subtype_t enum in esp_partition.h SUBTYPES = { + BOOTLOADER_TYPE: { + "primary": 0x00, + "ota": 0x01, + "recovery": 0x02, + }, + PARTITION_TABLE_TYPE: { + "primary": 0x00, + "ota": 0x01, + }, APP_TYPE: { "factory": 0x00, "test": 0x20, @@ -72,6 +86,7 @@ def get_ptype_as_int(ptype): "fat": 0x81, "spiffs": 0x82, "littlefs": 0x83, + "tee_ota": 0x90, }, } @@ -90,6 +105,8 @@ def get_subtype_as_int(ptype, subtype): ALIGNMENT = { APP_TYPE: 0x10000, DATA_TYPE: 0x1000, + BOOTLOADER_TYPE: 0x1000, + PARTITION_TABLE_TYPE: 0x1000, } @@ -98,14 +115,18 @@ def get_alignment_offset_for_type(ptype): def get_alignment_size_for_type(ptype): - if ptype == APP_TYPE and secure == SECURE_V1: - # For secure boot v1 case, app partition must be 64K aligned - # signature block (68 bytes) lies at the very end of 64K block - return 0x10000 - if ptype == APP_TYPE and secure == SECURE_V2: - # For secure boot v2 case, app partition must be 4K aligned - # signature block (4K) is kept after padding the unsigned image to 64K boundary - return 0x1000 + if ptype == APP_TYPE: + if secure == SECURE_V1: + # For secure boot v1 case, app partition must be 64K aligned + # signature block (68 bytes) lies at the very end of 64K block + return 0x10000 + elif secure == SECURE_V2: + # For secure boot v2 case, app partition must be 4K aligned + # signature block (4K) is kept after padding the unsigned image to 64K boundary + return 0x1000 + else: + # For no secure boot enabled case, app partition must be 4K aligned (min. flash erase size) + return 0x1000 # No specific size alignment requirement as such return 0x1 @@ -115,6 +136,10 @@ def get_partition_type(ptype): return APP_TYPE if ptype == "data": return DATA_TYPE + if ptype == "bootloader": + return BOOTLOADER_TYPE + if ptype == "partition_table": + return PARTITION_TABLE_TYPE raise InputError("Invalid partition type") @@ -134,6 +159,8 @@ def add_extra_subtypes(csv): md5sum = True secure = SECURE_NONE offset_part_table = 0 +primary_bootloader_offset = None +recovery_bootloader_offset = None def status(msg): @@ -165,7 +192,7 @@ def from_file(cls, f): return cls.from_csv(data), False @classmethod - def from_csv(cls, csv_contents): # noqa: C901 + def from_csv(cls, csv_contents): res = PartitionTable() lines = csv_contents.splitlines() @@ -194,6 +221,11 @@ def expand_vars(f): # fix up missing offsets & negative sizes last_end = offset_part_table + PARTITION_TABLE_SIZE # first offset after partition table for e in res: + is_primary_bootloader = e.type == BOOTLOADER_TYPE and e.subtype == SUBTYPES[e.type]["primary"] + is_primary_partition_table = e.type == PARTITION_TABLE_TYPE and e.subtype == SUBTYPES[e.type]["primary"] + if is_primary_bootloader or is_primary_partition_table: + # They do not participate in the restoration of missing offsets + continue if e.offset is not None and e.offset < last_end: if e == res[0]: raise InputError( @@ -203,8 +235,8 @@ def expand_vars(f): ) else: raise InputError( - "CSV Error at line %d: Partitions overlap. Partition sets offset 0x%x. Previous partition ends 0x%x" # noqa: E501 - % (e.line_no, e.offset, last_end) + "CSV Error at line %d: Partitions overlap. Partition sets offset 0x%x. " + "Previous partition ends 0x%x" % (e.line_no, e.offset, last_end) ) if e.offset is None: pad_to = get_alignment_offset_for_type(e.type) @@ -246,14 +278,14 @@ def find_by_name(self, name): return p return None - def verify(self): # noqa: C901 + def verify(self): # verify each partition individually for p in self: p.verify() # check on duplicate name names = [p.name for p in self] - duplicates = set(n for n in names if names.count(n) > 1) # noqa: C401 + duplicates = {n for n in names if names.count(n) > 1} # print sorted duplicate partitions by name if len(duplicates) != 0: @@ -267,9 +299,12 @@ def verify(self): # noqa: C901 last = None for p in sorted(self, key=lambda x: x.offset): if p.offset < offset_part_table + PARTITION_TABLE_SIZE: - raise InputError( - "Partition offset 0x%x is below 0x%x" % (p.offset, offset_part_table + PARTITION_TABLE_SIZE) - ) + is_primary_bootloader = p.type == BOOTLOADER_TYPE and p.subtype == SUBTYPES[p.type]["primary"] + is_primary_partition_table = p.type == PARTITION_TABLE_TYPE and p.subtype == SUBTYPES[p.type]["primary"] + if not (is_primary_bootloader or is_primary_partition_table): + raise InputError( + "Partition offset 0x%x is below 0x%x" % (p.offset, offset_part_table + PARTITION_TABLE_SIZE) + ) if last is not None and p.offset < last.offset + last.size: raise InputError( "Partition at 0x%x overlaps 0x%x-0x%x" % (p.offset, last.offset, last.offset + last.size - 1) @@ -282,7 +317,8 @@ def verify(self): # noqa: C901 for p in otadata_duplicates: critical("%s" % (p.to_csv())) raise InputError( - 'Found multiple otadata partitions. Only one partition can be defined with type="data"(1) and subtype="ota"(0).' # noqa: E501 + "Found multiple otadata partitions. Only one partition can be defined with " + 'type="data"(1) and subtype="ota"(0).' ) if len(otadata_duplicates) == 1 and otadata_duplicates[0].size != 0x2000: @@ -290,6 +326,23 @@ def verify(self): # noqa: C901 critical("%s" % (p.to_csv())) raise InputError("otadata partition must have size = 0x2000") + # Above checks but for TEE otadata + otadata_duplicates = [ + p for p in self if p.type == TYPES["data"] and p.subtype == SUBTYPES[DATA_TYPE]["tee_ota"] + ] + if len(otadata_duplicates) > 1: + for p in otadata_duplicates: + critical("%s" % (p.to_csv())) + raise InputError( + "Found multiple TEE otadata partitions. Only one partition can be defined with " + 'type="data"(1) and subtype="tee_ota"(0x90).' + ) + + if len(otadata_duplicates) == 1 and otadata_duplicates[0].size != 0x2000: + p = otadata_duplicates[0] + critical("%s" % (p.to_csv())) + raise InputError("TEE otadata partition must have size = 0x2000") + def flash_size(self): """Return the size that partitions will occupy in flash (ie the offset the last partition ends at) @@ -321,7 +374,7 @@ def from_binary(cls, b): data = b[o : o + 32] if len(data) != 32: raise InputError("Partition table length must be a multiple of 32 bytes") - if data == b"\xFF" * 32: + if data == b"\xff" * 32: return result # got end marker if md5sum and data[:2] == MD5_PARTITION_BEGIN[:2]: # check only the magic number part if data[16:] == md5.digest(): @@ -342,7 +395,7 @@ def to_binary(self): result += MD5_PARTITION_BEGIN + hashlib.md5(result).digest() if len(result) >= MAX_PARTITION_LENGTH: raise InputError("Binary partition table length (%d) longer than max" % len(result)) - result += b"\xFF" * (MAX_PARTITION_LENGTH - len(result)) # pad the sector, for signing + result += b"\xff" * (MAX_PARTITION_LENGTH - len(result)) # pad the sector, for signing return result def to_csv(self, simple_formatting=False): @@ -352,16 +405,20 @@ def to_csv(self, simple_formatting=False): class PartitionDefinition(object): - MAGIC_BYTES = b"\xAA\x50" + MAGIC_BYTES = b"\xaa\x50" # dictionary maps flag name (as used in CSV flags list, property name) # to bit set in flags words in binary format - FLAGS = {"encrypted": 0} + FLAGS = {"encrypted": 0, "readonly": 1} # add subtypes for the 16 OTA slot values ("ota_XX, etc.") for ota_slot in range(NUM_PARTITION_SUBTYPE_APP_OTA): SUBTYPES[TYPES["app"]]["ota_%d" % ota_slot] = MIN_PARTITION_SUBTYPE_APP_OTA + ota_slot + # add subtypes for the 2 TEE OTA slot values ("tee_XX, etc.") + for tee_slot in range(NUM_PARTITION_SUBTYPE_APP_TEE): + SUBTYPES[TYPES["app"]]["tee_%d" % tee_slot] = MIN_PARTITION_SUBTYPE_APP_TEE + tee_slot + def __init__(self): self.name = "" self.type = None @@ -369,6 +426,7 @@ def __init__(self): self.offset = None self.size = None self.encrypted = False + self.readonly = False @classmethod def from_csv(cls, line, line_no): @@ -381,8 +439,8 @@ def from_csv(cls, line, line_no): res.name = fields[0] res.type = res.parse_type(fields[1]) res.subtype = res.parse_subtype(fields[2]) - res.offset = res.parse_address(fields[3]) - res.size = res.parse_address(fields[4]) + res.offset = res.parse_address(fields[3], res.type, res.subtype) + res.size = res.parse_size(fields[4], res.type) if res.size is None: raise InputError("Size field can't be empty") @@ -452,12 +510,36 @@ def parse_subtype(self, strval): return SUBTYPES[DATA_TYPE]["undefined"] return parse_int(strval, SUBTYPES.get(self.type, {})) - def parse_address(self, strval): + def parse_size(self, strval, ptype): + if ptype == BOOTLOADER_TYPE: + if primary_bootloader_offset is None: + raise InputError("Primary bootloader offset is not defined. Please use --primary-bootloader-offset") + return offset_part_table - primary_bootloader_offset + if ptype == PARTITION_TABLE_TYPE: + return PARTITION_TABLE_SIZE if strval == "": return None # PartitionTable will fill in default return parse_int(strval) - def verify(self): # noqa: C901 + def parse_address(self, strval, ptype, psubtype): + if ptype == BOOTLOADER_TYPE: + if psubtype == SUBTYPES[ptype]["primary"]: + if primary_bootloader_offset is None: + raise InputError("Primary bootloader offset is not defined. Please use --primary-bootloader-offset") + return primary_bootloader_offset + if psubtype == SUBTYPES[ptype]["recovery"]: + if recovery_bootloader_offset is None: + raise InputError( + "Recovery bootloader offset is not defined. Please use --recovery-bootloader-offset" + ) + return recovery_bootloader_offset + if ptype == PARTITION_TABLE_TYPE and psubtype == SUBTYPES[ptype]["primary"]: + return offset_part_table + if strval == "": + return None # PartitionTable will fill in default + return parse_int(strval) + + def verify(self): if self.type is None: raise ValidationError(self, "Type field is not set") if self.subtype is None: @@ -469,7 +551,7 @@ def verify(self): # noqa: C901 offset_align = get_alignment_offset_for_type(self.type) if self.offset % offset_align: raise ValidationError(self, "Offset 0x%x is not aligned to 0x%x" % (self.offset, offset_align)) - if self.type == APP_TYPE and secure is not SECURE_NONE: + if self.type == APP_TYPE: size_align = get_alignment_size_for_type(self.type) if self.size % size_align: raise ValidationError(self, "Size 0x%x is not aligned to 0x%x" % (self.size, size_align)) @@ -489,6 +571,23 @@ def verify(self): # noqa: C901 % (self.name, self.type, self.subtype) ) + always_rw_data_subtypes = [SUBTYPES[DATA_TYPE]["ota"], SUBTYPES[DATA_TYPE]["coredump"]] + if self.type == TYPES["data"] and self.subtype in always_rw_data_subtypes and self.readonly is True: + raise ValidationError( + self, + "'%s' partition of type %s and subtype %s is always read-write and cannot be read-only" + % (self.name, self.type, self.subtype), + ) + + if self.type == TYPES["data"] and self.subtype == SUBTYPES[DATA_TYPE]["nvs"]: + if self.size < NVS_RW_MIN_PARTITION_SIZE and self.readonly is False: + raise ValidationError( + self, + """'%s' partition of type %s and subtype %s of this size (0x%x) must be flagged as 'readonly' \ +(the size of read/write NVS has to be at least 0x%x)""" + % (self.name, self.type, self.subtype, self.size, NVS_RW_MIN_PARTITION_SIZE), + ) + STRUCT_FORMAT = b"<2sBBLL16sL" @classmethod @@ -574,11 +673,13 @@ def parse_int(v, keywords={}): raise InputError("Value '%s' is not valid. Known keywords: %s" % (v, ", ".join(keywords))) -def main(): # noqa: C901 +def main(): global quiet global md5sum global offset_part_table global secure + global primary_bootloader_offset + global recovery_bootloader_offset parser = argparse.ArgumentParser(description="ESP32 partition table utility") parser.add_argument( @@ -600,6 +701,8 @@ def main(): # noqa: C901 ) parser.add_argument("--quiet", "-q", help="Don't print non-critical status messages to stderr", action="store_true") parser.add_argument("--offset", "-o", help="Set offset partition table", default="0x8000") + parser.add_argument("--primary-bootloader-offset", help="Set primary bootloader offset", default=None) + parser.add_argument("--recovery-bootloader-offset", help="Set recovery bootloader offset", default=None) parser.add_argument( "--secure", help="Require app partitions to be suitable for secure boot", @@ -622,6 +725,15 @@ def main(): # noqa: C901 md5sum = not args.disable_md5sum secure = args.secure offset_part_table = int(args.offset, 0) + if args.primary_bootloader_offset is not None: + primary_bootloader_offset = int(args.primary_bootloader_offset, 0) + if primary_bootloader_offset >= offset_part_table: + raise InputError( + f"Unsupported configuration. Primary bootloader must be below partition table. " + f"Check --primary-bootloader-offset={primary_bootloader_offset:#x} and --offset={offset_part_table:#x}" + ) + if args.recovery_bootloader_offset is not None: + recovery_bootloader_offset = int(args.recovery_bootloader_offset, 0) if args.extra_partition_subtypes: add_extra_subtypes(args.extra_partition_subtypes) @@ -647,7 +759,7 @@ def main(): # noqa: C901 if input_is_binary: output = table.to_csv() - with sys.stdout if args.output == "-" else open(args.output, "w") as f: + with sys.stdout if args.output == "-" else open(args.output, "w", encoding="utf-8") as f: f.write(output) else: output = table.to_binary() From 31bfcb27cebdca76e805ef9c962bbeeb297edc78 Mon Sep 17 00:00:00 2001 From: "Thomas J." Date: Tue, 27 May 2025 13:16:37 +0200 Subject: [PATCH 142/290] add board yb_esp32s3_drv (#11388) --- boards.txt | 210 +++++++++++++++++++++++++ variants/yb_esp32s3_drv/pins_arduino.h | 60 +++++++ 2 files changed, 270 insertions(+) create mode 100644 variants/yb_esp32s3_drv/pins_arduino.h diff --git a/boards.txt b/boards.txt index 4b6aa7e58c5..d92f057a78f 100644 --- a/boards.txt +++ b/boards.txt @@ -49830,6 +49830,216 @@ 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 +############################################################## + +yb_esp32s3_drv.name=YelloByte YB-ESP32-S3-DRV + +yb_esp32s3_drv.bootloader.tool=esptool_py +yb_esp32s3_drv.bootloader.tool.default=esptool_py + +yb_esp32s3_drv.upload.tool=esptool_py +yb_esp32s3_drv.upload.tool.default=esptool_py +yb_esp32s3_drv.upload.tool.network=esp_ota + +yb_esp32s3_drv.upload.maximum_size=1310720 +yb_esp32s3_drv.upload.maximum_data_size=327680 +yb_esp32s3_drv.upload.flags= +yb_esp32s3_drv.upload.extra_flags= +yb_esp32s3_drv.upload.use_1200bps_touch=false +yb_esp32s3_drv.upload.wait_for_upload_port=false + +yb_esp32s3_drv.serial.disableDTR=false +yb_esp32s3_drv.serial.disableRTS=false + +yb_esp32s3_drv.build.tarch=xtensa +yb_esp32s3_drv.build.bootloader_addr=0x0 +yb_esp32s3_drv.build.target=esp32s3 +yb_esp32s3_drv.build.mcu=esp32s3 +yb_esp32s3_drv.build.core=esp32 +yb_esp32s3_drv.build.variant=yb_esp32s3_drv +yb_esp32s3_drv.build.board=YB_ESP32S3_DRV + +yb_esp32s3_drv.build.usb_mode=1 +yb_esp32s3_drv.build.cdc_on_boot=1 +yb_esp32s3_drv.build.msc_on_boot=0 +yb_esp32s3_drv.build.dfu_on_boot=0 +yb_esp32s3_drv.build.f_cpu=240000000L +yb_esp32s3_drv.build.flash_size=8MB +yb_esp32s3_drv.build.flash_freq=80m +yb_esp32s3_drv.build.flash_mode=dio +yb_esp32s3_drv.build.boot=qio +yb_esp32s3_drv.build.partitions=default +yb_esp32s3_drv.build.defines= +yb_esp32s3_drv.build.loop_core= +yb_esp32s3_drv.build.event_core= +yb_esp32s3_drv.build.flash_type=qio +yb_esp32s3_drv.build.psram_type=qspi +yb_esp32s3_drv.build.memory_type={build.flash_type}_{build.psram_type} + +yb_esp32s3_drv.menu.JTAGAdapter.default=Disabled +yb_esp32s3_drv.menu.JTAGAdapter.default.build.copy_jtag_files=0 +yb_esp32s3_drv.menu.JTAGAdapter.builtin=Integrated USB JTAG +yb_esp32s3_drv.menu.JTAGAdapter.builtin.build.openocdscript=esp32s3-builtin.cfg +yb_esp32s3_drv.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 +yb_esp32s3_drv.menu.JTAGAdapter.external=FTDI Adapter +yb_esp32s3_drv.menu.JTAGAdapter.external.build.openocdscript=esp32s3-ftdi.cfg +yb_esp32s3_drv.menu.JTAGAdapter.external.build.copy_jtag_files=1 +yb_esp32s3_drv.menu.JTAGAdapter.bridge=ESP USB Bridge +yb_esp32s3_drv.menu.JTAGAdapter.bridge.build.openocdscript=esp32s3-bridge.cfg +yb_esp32s3_drv.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +yb_esp32s3_drv.menu.LoopCore.1=Core 1 +yb_esp32s3_drv.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +yb_esp32s3_drv.menu.LoopCore.0=Core 0 +yb_esp32s3_drv.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +yb_esp32s3_drv.menu.EventsCore.1=Core 1 +yb_esp32s3_drv.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +yb_esp32s3_drv.menu.EventsCore.0=Core 0 +yb_esp32s3_drv.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +yb_esp32s3_drv.menu.USBMode.hwcdc=Hardware CDC and JTAG +yb_esp32s3_drv.menu.USBMode.hwcdc.build.usb_mode=1 +yb_esp32s3_drv.menu.USBMode.default=USB-OTG (TinyUSB) +yb_esp32s3_drv.menu.USBMode.default.build.usb_mode=0 + +yb_esp32s3_drv.menu.CDCOnBoot.cdc=Enabled +yb_esp32s3_drv.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 +yb_esp32s3_drv.menu.CDCOnBoot.default=Disabled +yb_esp32s3_drv.menu.CDCOnBoot.default.build.cdc_on_boot=0 + +yb_esp32s3_drv.menu.MSCOnBoot.default=Disabled +yb_esp32s3_drv.menu.MSCOnBoot.default.build.msc_on_boot=0 +yb_esp32s3_drv.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +yb_esp32s3_drv.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +yb_esp32s3_drv.menu.DFUOnBoot.default=Disabled +yb_esp32s3_drv.menu.DFUOnBoot.default.build.dfu_on_boot=0 +yb_esp32s3_drv.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +yb_esp32s3_drv.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +yb_esp32s3_drv.menu.UploadMode.default=UART0 / Hardware CDC +yb_esp32s3_drv.menu.UploadMode.default.upload.use_1200bps_touch=false +yb_esp32s3_drv.menu.UploadMode.default.upload.wait_for_upload_port=false +yb_esp32s3_drv.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +yb_esp32s3_drv.menu.UploadMode.cdc.upload.use_1200bps_touch=true +yb_esp32s3_drv.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +yb_esp32s3_drv.menu.PSRAM.enabled=QSPI PSRAM +yb_esp32s3_drv.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM +yb_esp32s3_drv.menu.PSRAM.enabled.build.psram_type=qspi +yb_esp32s3_drv.menu.PSRAM.disabled=Disabled +yb_esp32s3_drv.menu.PSRAM.disabled.build.defines= +yb_esp32s3_drv.menu.PSRAM.disabled.build.psram_type=qspi +yb_esp32s3_drv.menu.PSRAM.opi=OPI PSRAM +yb_esp32s3_drv.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM +yb_esp32s3_drv.menu.PSRAM.opi.build.psram_type=opi + +yb_esp32s3_drv.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +yb_esp32s3_drv.menu.PartitionScheme.default.build.partitions=default +yb_esp32s3_drv.menu.PartitionScheme.default_8MB=8M with spiffs (3MB APP/1.5MB SPIFFS) +yb_esp32s3_drv.menu.PartitionScheme.default_8MB.build.partitions=default_8MB +yb_esp32s3_drv.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 +yb_esp32s3_drv.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +yb_esp32s3_drv.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +yb_esp32s3_drv.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +yb_esp32s3_drv.menu.PartitionScheme.minimal.build.partitions=minimal +yb_esp32s3_drv.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +yb_esp32s3_drv.menu.PartitionScheme.no_ota.build.partitions=no_ota +yb_esp32s3_drv.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +yb_esp32s3_drv.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +yb_esp32s3_drv.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +yb_esp32s3_drv.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +yb_esp32s3_drv.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +yb_esp32s3_drv.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +yb_esp32s3_drv.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +yb_esp32s3_drv.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +yb_esp32s3_drv.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +yb_esp32s3_drv.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +yb_esp32s3_drv.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +yb_esp32s3_drv.menu.PartitionScheme.huge_app.build.partitions=huge_app +yb_esp32s3_drv.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +yb_esp32s3_drv.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +yb_esp32s3_drv.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +yb_esp32s3_drv.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 +yb_esp32s3_drv.menu.PartitionScheme.max_app_8MB=Maximum APP (7.9MB APP No OTA/No FS) +yb_esp32s3_drv.menu.PartitionScheme.max_app_8MB.build.partitions=max_app_8MB +yb_esp32s3_drv.menu.PartitionScheme.max_app_8MB.upload.maximum_size=8257536 + +yb_esp32s3_drv.menu.CPUFreq.240=240MHz (WiFi) +yb_esp32s3_drv.menu.CPUFreq.240.build.f_cpu=240000000L +yb_esp32s3_drv.menu.CPUFreq.160=160MHz (WiFi) +yb_esp32s3_drv.menu.CPUFreq.160.build.f_cpu=160000000L +yb_esp32s3_drv.menu.CPUFreq.80=80MHz (WiFi) +yb_esp32s3_drv.menu.CPUFreq.80.build.f_cpu=80000000L +yb_esp32s3_drv.menu.CPUFreq.40=40MHz +yb_esp32s3_drv.menu.CPUFreq.40.build.f_cpu=40000000L +yb_esp32s3_drv.menu.CPUFreq.20=20MHz +yb_esp32s3_drv.menu.CPUFreq.20.build.f_cpu=20000000L +yb_esp32s3_drv.menu.CPUFreq.10=10MHz +yb_esp32s3_drv.menu.CPUFreq.10.build.f_cpu=10000000L + +yb_esp32s3_drv.menu.FlashMode.qio=QIO 80MHz +yb_esp32s3_drv.menu.FlashMode.qio.build.flash_mode=dio +yb_esp32s3_drv.menu.FlashMode.qio.build.boot=qio +yb_esp32s3_drv.menu.FlashMode.qio.build.boot_freq=80m +yb_esp32s3_drv.menu.FlashMode.qio.build.flash_freq=80m +yb_esp32s3_drv.menu.FlashMode.qio120=QIO 120MHz +yb_esp32s3_drv.menu.FlashMode.qio120.build.flash_mode=dio +yb_esp32s3_drv.menu.FlashMode.qio120.build.boot=qio +yb_esp32s3_drv.menu.FlashMode.qio120.build.boot_freq=120m +yb_esp32s3_drv.menu.FlashMode.qio120.build.flash_freq=80m +yb_esp32s3_drv.menu.FlashMode.dio=DIO 80MHz +yb_esp32s3_drv.menu.FlashMode.dio.build.flash_mode=dio +yb_esp32s3_drv.menu.FlashMode.dio.build.boot=dio +yb_esp32s3_drv.menu.FlashMode.dio.build.boot_freq=80m +yb_esp32s3_drv.menu.FlashMode.dio.build.flash_freq=80m +yb_esp32s3_drv.menu.FlashMode.opi=OPI 80MHz +yb_esp32s3_drv.menu.FlashMode.opi.build.flash_mode=dout +yb_esp32s3_drv.menu.FlashMode.opi.build.boot=opi +yb_esp32s3_drv.menu.FlashMode.opi.build.boot_freq=80m +yb_esp32s3_drv.menu.FlashMode.opi.build.flash_freq=80m + +yb_esp32s3_drv.menu.FlashSize.4M=4MB (32Mb) +yb_esp32s3_drv.menu.FlashSize.4M.build.flash_size=4MB +yb_esp32s3_drv.menu.FlashSize.8M=8MB (64Mb) +yb_esp32s3_drv.menu.FlashSize.8M.build.flash_size=8MB +yb_esp32s3_drv.menu.FlashSize.16M=16MB (128Mb) +yb_esp32s3_drv.menu.FlashSize.16M.build.flash_size=16MB + +yb_esp32s3_drv.menu.UploadSpeed.921600=921600 +yb_esp32s3_drv.menu.UploadSpeed.921600.upload.speed=921600 +yb_esp32s3_drv.menu.UploadSpeed.115200=115200 +yb_esp32s3_drv.menu.UploadSpeed.115200.upload.speed=115200 +yb_esp32s3_drv.menu.UploadSpeed.256000.windows=256000 +yb_esp32s3_drv.menu.UploadSpeed.256000.upload.speed=256000 +yb_esp32s3_drv.menu.UploadSpeed.230400.windows.upload.speed=256000 +yb_esp32s3_drv.menu.UploadSpeed.230400=230400 +yb_esp32s3_drv.menu.UploadSpeed.230400.upload.speed=230400 +yb_esp32s3_drv.menu.UploadSpeed.460800.linux=460800 +yb_esp32s3_drv.menu.UploadSpeed.460800.macosx=460800 +yb_esp32s3_drv.menu.UploadSpeed.460800.upload.speed=460800 +yb_esp32s3_drv.menu.UploadSpeed.512000.windows=512000 +yb_esp32s3_drv.menu.UploadSpeed.512000.upload.speed=512000 + +yb_esp32s3_drv.menu.DebugLevel.none=None +yb_esp32s3_drv.menu.DebugLevel.none.build.code_debug=0 +yb_esp32s3_drv.menu.DebugLevel.error=Error +yb_esp32s3_drv.menu.DebugLevel.error.build.code_debug=1 +yb_esp32s3_drv.menu.DebugLevel.warn=Warn +yb_esp32s3_drv.menu.DebugLevel.warn.build.code_debug=2 +yb_esp32s3_drv.menu.DebugLevel.info=Info +yb_esp32s3_drv.menu.DebugLevel.info.build.code_debug=3 +yb_esp32s3_drv.menu.DebugLevel.debug=Debug +yb_esp32s3_drv.menu.DebugLevel.debug.build.code_debug=4 +yb_esp32s3_drv.menu.DebugLevel.verbose=Verbose +yb_esp32s3_drv.menu.DebugLevel.verbose.build.code_debug=5 + +yb_esp32s3_drv.menu.EraseFlash.none=Disabled +yb_esp32s3_drv.menu.EraseFlash.none.upload.erase_cmd= +yb_esp32s3_drv.menu.EraseFlash.all=Enabled +yb_esp32s3_drv.menu.EraseFlash.all.upload.erase_cmd=-e + ############################################################## # Huidu HD-WF2 - esp32-s3 HUB75 driver board # https://www.hdwell.com/Product/index46.html diff --git a/variants/yb_esp32s3_drv/pins_arduino.h b/variants/yb_esp32s3_drv/pins_arduino.h new file mode 100644 index 00000000000..06de47e50f4 --- /dev/null +++ b/variants/yb_esp32s3_drv/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; + +static const uint8_t SS = 10; +static const uint8_t MOSI = 11; +static const uint8_t MISO = 13; +static const uint8_t SCK = 12; + +// 2 connectors (X, Y) with 4 driver channels each +static const uint8_t X1 = 35; +static const uint8_t X2 = 36; +static const uint8_t X3 = 37; +static const uint8_t X4 = 38; +static const uint8_t Y1 = 4; +static const uint8_t Y2 = 5; +static const uint8_t Y3 = 6; +static const uint8_t Y4 = 7; + +static const uint8_t A0 = 1; +static const uint8_t A1 = 2; +static const uint8_t A2 = 3; +static const uint8_t A3 = 8; +static const uint8_t A4 = 9; +static const uint8_t A5 = 10; +static const uint8_t A6 = 11; +static const uint8_t A7 = 12; +static const uint8_t A8 = 13; +static const uint8_t A9 = 14; +static const uint8_t A10 = 15; +static const uint8_t A11 = 16; +static const uint8_t A12 = 17; +static const uint8_t A13 = 18; + +static const uint8_t T1 = 1; +static const uint8_t T2 = 2; +static const uint8_t T3 = 3; +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 91fd517cf1f4b7200c9b9ec5f554f6e7f7a9588b 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, 27 May 2025 13:33:30 +0200 Subject: [PATCH 143/290] feat(zigbee): Check the type of leave signal (#11385) * feat(zigbee): Check the type of leave signal * Update libraries/Zigbee/src/ZigbeeCore.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update libraries/Zigbee/src/ZigbeeCore.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Me No Dev --- libraries/Zigbee/src/ZigbeeCore.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index 6e9cc63a1da..c49dedb221f 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -247,6 +247,7 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { esp_zb_app_signal_type_t sig_type = (esp_zb_app_signal_type_t)*p_sg_p; //coordinator variables esp_zb_zdo_signal_device_annce_params_t *dev_annce_params = NULL; + esp_zb_zdo_signal_leave_params_t *leave_params = NULL; //router variables esp_zb_zdo_signal_device_update_params_t *dev_update_params = NULL; @@ -427,9 +428,17 @@ 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 + // Received signal to leave the network if ((zigbee_role_t)Zigbee.getRole() != ZIGBEE_COORDINATOR) { - Zigbee.factoryReset(true); + leave_params = (esp_zb_zdo_signal_leave_params_t *)esp_zb_app_signal_get_params(p_sg_p); + log_v("Signal to leave the network, leave type: %d", leave_params->leave_type); + if (leave_params->leave_type == ESP_ZB_NWK_LEAVE_TYPE_RESET) { // Leave without rejoin -> Factory reset + log_i("Leave without rejoin, factory reset the device"); + Zigbee.factoryReset(true); + } else { // Leave with rejoin -> Rejoin the network, only reboot the device + log_i("Leave with rejoin, only reboot the device"); + ESP.restart(); + } } 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; From 72a582b9089bbdee8efa3e82df456fcd66b3af37 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 27 May 2025 15:51:23 +0200 Subject: [PATCH 144/290] feat(ssl): Do not check if client is connected if already disconnected (#11356) --- libraries/NetworkClientSecure/src/NetworkClientSecure.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp b/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp index 87917e58b8f..b24c9f1adc3 100644 --- a/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp +++ b/libraries/NetworkClientSecure/src/NetworkClientSecure.cpp @@ -315,9 +315,10 @@ int NetworkClientSecure::available() { } uint8_t NetworkClientSecure::connected() { - uint8_t dummy = 0; - read(&dummy, 0); - + if (_connected) { + uint8_t dummy = 0; + read(&dummy, 0); + } return _connected; } From f3ae2a65e24c7fd7ad5cf07485cd0ac2aa5d8a6c Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Fri, 30 May 2025 15:18:57 +0300 Subject: [PATCH 145/290] IDF release/v5.4 (#11406) * fix(build): Update APB frequency set routine * IDF release/v5.4 aed8bdc8 --- cores/esp32/esp32-hal-cpu.c | 10 ++++ package/package_esp32_index.template.json | 68 +++++++++++------------ 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/cores/esp32/esp32-hal-cpu.c b/cores/esp32/esp32-hal-cpu.c index 1ffde860792..b80e24c2b0f 100644 --- a/cores/esp32/esp32-hal-cpu.c +++ b/cores/esp32/esp32-hal-cpu.c @@ -26,6 +26,8 @@ #include "soc/efuse_reg.h" #include "esp32-hal.h" #include "esp32-hal-cpu.h" +#include "hal/timer_ll.h" +#include "esp_private/systimer.h" #include "esp_system.h" #ifdef ESP_IDF_VERSION_MAJOR // IDF 4+ @@ -173,7 +175,9 @@ static uint32_t calculateApb(rtc_cpu_freq_config_t *conf) { #endif } +#if defined(CONFIG_IDF_TARGET_ESP32) && !defined(LACT_MODULE) && !defined(LACT_TICKS_PER_US) void esp_timer_impl_update_apb_freq(uint32_t apb_ticks_per_us); //private in IDF +#endif bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) { rtc_cpu_freq_config_t conf, cconf; @@ -246,7 +250,13 @@ bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) { //Update APB Freq REG rtc_clk_apb_freq_update(apb); //Update esp_timer divisor +#if CONFIG_IDF_TARGET_ESP32 +#if defined(LACT_MODULE) && defined(LACT_TICKS_PER_US) + timer_ll_set_lact_clock_prescale(TIMER_LL_GET_HW(LACT_MODULE), apb / MHZ / LACT_TICKS_PER_US); +#else esp_timer_impl_update_apb_freq(apb / MHZ); +#endif +#endif } #endif //Update FreeRTOS Tick Divisor diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index ba63dd3beb5..14aa8e9b4cf 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-fe753553-v1" + "version": "idf-release_v5.4-aed8bdc8-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-fe753553-v1", + "version": "idf-release_v5.4-aed8bdc8-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", - "size": "353685379" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", + "size": "353758763" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", - "size": "353685379" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", + "size": "353758763" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", - "size": "353685379" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", + "size": "353758763" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", - "size": "353685379" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", + "size": "353758763" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", - "size": "353685379" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", + "size": "353758763" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", - "size": "353685379" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", + "size": "353758763" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", - "size": "353685379" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", + "size": "353758763" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-fe753553-v1.zip", - "checksum": "SHA-256:79abe0d17524dc64eccdab97bf4407127d8249e99c9b929357c10d24fe47a703", - "size": "353685379" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", + "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", + "size": "353758763" } ] }, From 6ce7e254c43604c4927ef1bcca0468e1d33db243 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Fri, 30 May 2025 17:18:32 +0300 Subject: [PATCH 146/290] IDF release/v5.5 (#11369) * IDF release/v5.5 719b1b2b * fix(build): Add dependency on esp_http_client * fix(build): Add dependency on esp_https_ota * IDF release/v5.5 28ac0243 --- CMakeLists.txt | 2 +- package/package_esp32_index.template.json | 68 +++++++++++------------ 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7cee7962a65..3cbb59dd3d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -359,7 +359,7 @@ endforeach() set(includedirs variants/${CONFIG_ARDUINO_VARIANT}/ cores/esp32/ ${ARDUINO_LIBRARIES_INCLUDEDIRS}) set(srcs ${CORE_SRCS} ${ARDUINO_LIBRARIES_SRCS}) set(priv_includes cores/esp32/libb64) -set(requires spi_flash esp_partition mbedtls wpa_supplicant esp_adc esp_eth http_parser esp_ringbuf esp_driver_gptimer esp_driver_usb_serial_jtag driver esp_http_client) +set(requires spi_flash esp_partition mbedtls wpa_supplicant esp_adc esp_eth http_parser esp_ringbuf esp_driver_gptimer esp_driver_usb_serial_jtag driver esp_http_client esp_https_ota) set(priv_requires fatfs nvs_flash app_update spiffs bootloader_support bt esp_hid usb esp_psram ${ARDUINO_LIBRARIES_REQUIRES}) if(NOT CONFIG_ARDUINO_SELECTIVE_COMPILATION OR CONFIG_ARDUINO_SELECTIVE_OpenThread) diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index e3b42431cbf..eecc7c10788 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-master-7cf5dacd-v2" + "version": "idf-release_v5.5-28ac0243-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-master-7cf5dacd-v2", + "version": "idf-release_v5.5-28ac0243-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", - "size": "405095217" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", + "size": "405149394" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", - "size": "405095217" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", + "size": "405149394" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", - "size": "405095217" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", + "size": "405149394" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", - "size": "405095217" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", + "size": "405149394" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", - "size": "405095217" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", + "size": "405149394" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", - "size": "405095217" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", + "size": "405149394" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", - "size": "405095217" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", + "size": "405149394" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-master/esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "archiveFileName": "esp32-arduino-libs-idf-master-7cf5dacd-v2.zip", - "checksum": "SHA-256:91f74810c5bee0fa4463f7df73f1f6b5e4a08a6c2094014b9a4c0fac61eb43de", - "size": "405095217" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", + "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", + "size": "405149394" } ] }, From a6bba43d32ab65d73054a0a65b63a4716673975c Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Fri, 30 May 2025 19:12:34 +0300 Subject: [PATCH 147/290] fix(c5): Enable components for ESP32-C5 --- idf_component.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/idf_component.yml b/idf_component.yml index 98dd5c9b9d9..dca97dc1655 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -57,12 +57,12 @@ dependencies: version: "==1.6.3" require: public rules: - - if: "target not in [esp32c2, esp32p4, esp32c5]" + - if: "target not in [esp32c2, esp32p4]" espressif/esp-zigbee-lib: version: "==1.6.3" require: public rules: - - if: "target not in [esp32c2, esp32p4, esp32c5]" + - if: "target not in [esp32c2, esp32p4]" espressif/esp-dsp: version: "^1.3.4" rules: @@ -73,32 +73,32 @@ dependencies: espressif/esp_rainmaker: version: "1.5.2" rules: - - if: "target not in [esp32c2, esp32p4, esp32c5]" + - if: "target not in [esp32c2, esp32p4]" espressif/rmaker_common: version: "1.4.6" rules: - - if: "target not in [esp32c2, esp32p4, esp32c5]" + - if: "target not in [esp32c2, esp32p4]" espressif/esp_insights: version: "1.2.2" rules: - - if: "target not in [esp32c2, esp32p4, esp32c5]" + - if: "target not in [esp32c2, esp32p4]" # New version breaks esp_insights 1.0.1 espressif/esp_diag_data_store: version: "1.0.2" rules: - - if: "target not in [esp32c2, esp32p4, esp32c5]" + - if: "target not in [esp32c2, esp32p4]" espressif/esp_diagnostics: version: "1.2.1" rules: - - if: "target not in [esp32c2, esp32p4, esp32c5]" + - if: "target not in [esp32c2, esp32p4]" espressif/cbor: version: "0.6.0~1" rules: - - if: "target not in [esp32c2, esp32p4, esp32c5]" + - if: "target not in [esp32c2, esp32p4]" espressif/qrcode: version: "0.1.0~2" rules: - - if: "target not in [esp32c2, esp32p4, esp32c5]" + - if: "target not in [esp32c2, esp32p4]" # RainMaker End espressif/esp-sr: version: "^1.4.2" From 6f56df2a09a17213823e2edda3cdff3db32cadaf Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 4 Jun 2025 10:19:44 -0300 Subject: [PATCH 148/290] feat(codeowners): Initial CODEOWNERS setup (#11397) * feat(codeowners): Initial CODEOWNERS setup * fix(comment): Improve comment * fix(codeowners): Add teams * fix(codeowners): Apply suggestions * fix(codeowners): Add missing libraries --- .github/CODEOWNERS | 79 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000000..75a2b46d619 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,79 @@ +# CODEOWNERS for ESP32 Arduino Core + +# This file is used to specify the code owners for the ESP32 Arduino Core. +# Read more about CODEOWNERS: +# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners +# Note that order matters. The last matching pattern will be used. + +# The default owners are the active developers of the ESP32 Arduino Core. +# Refrain from using @espressif/arduino-esp32 to avoid spamming non-developers with review requests. +* @espressif/arduino-devs + +# CI +/.github/ @lucasssvaz @me-no-dev @P-R-O-C-H-Y +/tests/ @lucasssvaz @P-R-O-C-H-Y + +# Tools +/tools/ @me-no-dev +/tools/pre-commit/ @lucasssvaz +/tools/add_lib.sh @P-R-O-C-H-Y + +# Pre-commit +/.* @lucasssvaz # Files in root directory that start with a dot. + +# Git Files +/.gitignore @espressif/arduino-devs +/.gitmodules @espressif/arduino-devs + +# Documentation +/docs/ @pedrominatel +/.github/ISSUE_TEMPLATE/ @pedrominatel +/.github/PULL_REQUEST_TEMPLATE.md @pedrominatel +/.readthedocs.yaml @pedrominatel +/*.md @pedrominatel + +# Boards +/variants/ @P-R-O-C-H-Y +/boards.txt @P-R-O-C-H-Y + +# Arduino as Component +/idf_component_examples/ @SuGlider +/idf_component.yml @SuGlider @me-no-dev +/CMakeLists.txt @SuGlider @me-no-dev +/Kconfig.projbuild @SuGlider @me-no-dev + +# Build System +/package.json @me-no-dev +/platform.txt @me-no-dev +/programmers.txt @me-no-dev +/package/ @me-no-dev + +# Libraries +/libraries/ArduinoOTA/ @me-no-dev +/libraries/AsyncUDP/ @me-no-dev +/libraries/BLE/ @lucasssvaz @SuGlider +/libraries/ESP_I2S/ @me-no-dev +/libraries/ESP_NOW/ @P-R-O-C-H-Y @lucasssvaz +/libraries/ESP_SR/ @me-no-dev +/libraries/ESPmDNS/ @me-no-dev +/libraries/Ethernet/ @me-no-dev +/libraries/Matter/ @SuGlider +/libraries/NetBIOS/ @me-no-dev +/libraries/Network/ @me-no-dev +/libraries/OpenThread/ @SuGlider +/libraries/PPP/ @me-no-dev +/libraries/SPI/ @me-no-dev +/libraries/Update/ @me-no-dev +/libraries/USB/ @SuGlider @me-no-dev +/libraries/WiFi/ @me-no-dev +/libraries/WiFiProv/ @me-no-dev +/libraries/Wire/ @me-no-dev +/libraries/Zigbee/ @P-R-O-C-H-Y + +# CI JSON +# Keep this after other libraries and tests to avoid being overridden. +**/ci.json @lucasssvaz + +# The CODEOWNERS file should be owned by the developers of the ESP32 Arduino Core. +# Leave this entry as the last one to avoid being overridden. +/.github/CODEOWNERS @espressif/arduino-devs From b5c5655cf004858ed56f3488f006ebad3690c303 Mon Sep 17 00:00:00 2001 From: Kevin Sidwar Date: Wed, 4 Jun 2025 08:39:19 -0600 Subject: [PATCH 149/290] Support HTTP 204 (#11408) HTTP 204 is a successful return code which indicates No Content. While it's appropriate to return a 304 if the server has content for a device but it hasn't change, it is more accurate for a server to return a 204 if it simply doesn't have any firmware files for a particular device. Co-authored-by: Me No Dev --- libraries/HTTPUpdate/src/HTTPUpdate.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/HTTPUpdate/src/HTTPUpdate.cpp b/libraries/HTTPUpdate/src/HTTPUpdate.cpp index 1eda0a4f7e5..b463ffe2e83 100644 --- a/libraries/HTTPUpdate/src/HTTPUpdate.cpp +++ b/libraries/HTTPUpdate/src/HTTPUpdate.cpp @@ -356,6 +356,7 @@ HTTPUpdateResult HTTPUpdate::handleUpdate(HTTPClient &http, const String ¤ log_e("Content-Length was 0 or wasn't set by Server?!\n"); } break; + case HTTP_CODE_NO_CONTENT: case HTTP_CODE_NOT_MODIFIED: ///< Not Modified (No updates) ret = HTTP_UPDATE_NO_UPDATES; From a2880a4c17038b4ff3dfa083e7af7c7bbdba914a Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Wed, 4 Jun 2025 17:39:34 +0300 Subject: [PATCH 150/290] feat(ap): Add support for DHCP Captive Portal (opt 114) (#11412) * feat(ap): Add support for DHCP Captive Portal (opt 114) * feat(ap): No need to guard the function * 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/CaptivePortal/CaptivePortal.ino | 5 ++- libraries/WiFi/src/AP.cpp | 39 +++++++++++++++++++ libraries/WiFi/src/WiFiAP.h | 1 + 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino b/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino index d956dc14ad3..7759aa09a1c 100644 --- a/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino +++ b/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino @@ -34,8 +34,9 @@ void handleNotFound() { void setup() { Serial.begin(115200); - WiFi.mode(WIFI_AP); - WiFi.softAP("ESP32-DNSServer"); + WiFi.AP.begin(); + WiFi.AP.create("ESP32-DNSServer"); + WiFi.AP.enableDhcpCaptivePortal(); // by default DNSServer is started serving any "*" domain name. It will reply // AccessPoint's IP to all DNS request (this is required for Captive Portal detection) diff --git a/libraries/WiFi/src/AP.cpp b/libraries/WiFi/src/AP.cpp index 0e7839764ea..a649c3898cb 100644 --- a/libraries/WiFi/src/AP.cpp +++ b/libraries/WiFi/src/AP.cpp @@ -305,6 +305,45 @@ bool APClass::enableNAPT(bool enable) { return true; } +bool APClass::enableDhcpCaptivePortal() { + esp_err_t err = ESP_OK; + static char captiveportal_uri[32] = { + 0, + }; + + if (!started()) { + log_e("AP must be first started to enable DHCP Captive Portal"); + return false; + } + + // Create Captive Portal URL: http://192.168.0.4 + strcpy(captiveportal_uri, "http://"); + strcat(captiveportal_uri, String(localIP()).c_str()); + + // Stop DHCPS + err = esp_netif_dhcps_stop(_esp_netif); + if (err && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) { + log_e("DHCPS Stop Failed! 0x%04x: %s", err, esp_err_to_name(err)); + return false; + } + + // Enable DHCP Captive Portal + err = esp_netif_dhcps_option(_esp_netif, ESP_NETIF_OP_SET, ESP_NETIF_CAPTIVEPORTAL_URI, captiveportal_uri, strlen(captiveportal_uri)); + if (err) { + log_e("Could not set enable DHCP Captive Portal! 0x%x: %s", err, esp_err_to_name(err)); + return false; + } + + // Start DHCPS + err = esp_netif_dhcps_start(_esp_netif); + if (err) { + log_e("DHCPS Start Failed! 0x%04x: %s", err, esp_err_to_name(err)); + return false; + } + + return true; +} + String APClass::SSID(void) const { if (!started()) { return String(); diff --git a/libraries/WiFi/src/WiFiAP.h b/libraries/WiFi/src/WiFiAP.h index 540ec87f44f..2b7ce469801 100644 --- a/libraries/WiFi/src/WiFiAP.h +++ b/libraries/WiFi/src/WiFiAP.h @@ -53,6 +53,7 @@ class APClass : public NetworkInterface { bool bandwidth(wifi_bandwidth_t bandwidth); bool enableNAPT(bool enable = true); + bool enableDhcpCaptivePortal(); String SSID(void) const; uint8_t stationCount(); From 460b89201b0be121c4345549551bcf102c26f165 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 4 Jun 2025 16:39:54 +0200 Subject: [PATCH 151/290] make BT core code execution conditional from include esp_bt.h (#11413) * make code execution conditional from include esp_bt.h.h * only one if * Update esp32-hal-bt.c --- cores/esp32/esp32-hal-bt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-bt.c b/cores/esp32/esp32-hal-bt.c index 1e5f73e324c..5d512d448a3 100644 --- a/cores/esp32/esp32-hal-bt.c +++ b/cores/esp32/esp32-hal-bt.c @@ -15,7 +15,7 @@ #include "esp32-hal-bt.h" #if SOC_BT_SUPPORTED -#ifdef CONFIG_BT_BLUEDROID_ENABLED +#if defined(CONFIG_BT_BLUEDROID_ENABLED) && __has_include("esp_bt.h") #if CONFIG_IDF_TARGET_ESP32 bool btInUse() { From 375f2c002de0d5ace08bac59a4e42134be1af22e Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 4 Jun 2025 16:40:12 +0200 Subject: [PATCH 152/290] C2: Disable network provisioning (#11423) --- idf_component.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/idf_component.yml b/idf_component.yml index 967c4ecf0f6..7f090cb26a0 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -68,6 +68,8 @@ dependencies: # RainMaker Start (Fixed versions, because Matter supports only Insights 1.0.1) espressif/network_provisioning: version: "1.0.2" + rules: + - if: "target != esp32c2" espressif/esp_rainmaker: version: "1.5.2" rules: From cae66e65a30d5a3d7c15b85ffa4130fa74e01b73 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, 4 Jun 2025 16:40:28 +0200 Subject: [PATCH 153/290] feat(zigbee): Add endpoint identification in read handlers + command structures fix (#11425) * feat(zigbee): Add endpoint identification in read handlers * fix(zigbee): initialize Zigbee command structures with zeros * fix(zigbee): Spelling correction * 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_Thermostat/Zigbee_Thermostat.ino | 56 +++- libraries/Zigbee/keywords.txt | 3 +- libraries/Zigbee/src/ZigbeeEP.cpp | 20 +- libraries/Zigbee/src/ZigbeeEP.h | 4 +- libraries/Zigbee/src/ZigbeeHandlers.cpp | 8 +- .../Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp | 48 +-- libraries/Zigbee/src/ep/ZigbeeSwitch.cpp | 32 +- libraries/Zigbee/src/ep/ZigbeeThermostat.cpp | 279 +++++++++++++++++- libraries/Zigbee/src/ep/ZigbeeThermostat.h | 29 +- 9 files changed, 390 insertions(+), 89 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino b/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino index 7cdf45ef711..6f5934f791d 100644 --- a/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino +++ b/libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino @@ -34,7 +34,8 @@ #include "Zigbee.h" /* Zigbee thermostat configuration */ -#define THERMOSTAT_ENDPOINT_NUMBER 5 +#define THERMOSTAT_ENDPOINT_NUMBER 1 +#define USE_RECEIVE_TEMP_WITH_SOURCE 1 uint8_t button = BOOT_PIN; ZigbeeThermostat zbThermostat = ZigbeeThermostat(THERMOSTAT_ENDPOINT_NUMBER); @@ -48,13 +49,28 @@ float sensor_tolerance; struct tm timeinfo = {}; // Time structure for Time cluster /****************** Temperature sensor handling *******************/ -void recieveSensorTemp(float temperature) { +#if USE_RECEIVE_TEMP_WITH_SOURCE == 0 +void receiveSensorTemp(float temperature) { Serial.printf("Temperature sensor value: %.2f°C\n", temperature); sensor_temp = temperature; } +#else +void receiveSensorTempWithSource(float temperature, uint8_t src_endpoint, esp_zb_zcl_addr_t src_address) { + if (src_address.addr_type == ESP_ZB_ZCL_ADDR_TYPE_SHORT) { + Serial.printf("Temperature sensor value: %.2f°C from endpoint %d, address 0x%04x\n", temperature, src_endpoint, src_address.u.short_addr); + } else { + Serial.printf( + "Temperature sensor value: %.2f°C from endpoint %d, address %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", temperature, src_endpoint, + src_address.u.ieee_addr[7], src_address.u.ieee_addr[6], src_address.u.ieee_addr[5], src_address.u.ieee_addr[4], src_address.u.ieee_addr[3], + src_address.u.ieee_addr[2], src_address.u.ieee_addr[1], src_address.u.ieee_addr[0] + ); + } + sensor_temp = temperature; +} +#endif -void recieveSensorConfig(float min_temp, float max_temp, float tolerance) { - Serial.printf("Temperature sensor settings: min %.2f°C, max %.2f°C, tolerance %.2f°C\n", min_temp, max_temp, tolerance); +void receiveSensorConfig(float min_temp, float max_temp, float tolerance) { + Serial.printf("Temperature sensor config: min %.2f°C, max %.2f°C, tolerance %.2f°C\n", min_temp, max_temp, tolerance); sensor_min_temp = min_temp; sensor_max_temp = max_temp; sensor_tolerance = tolerance; @@ -66,9 +82,15 @@ void setup() { // Init button switch pinMode(button, INPUT_PULLUP); - // Set callback functions for temperature and configuration receive - zbThermostat.onTempRecieve(recieveSensorTemp); - zbThermostat.onConfigRecieve(recieveSensorConfig); +// Set callback function for receiving temperature from sensor - Use only one option +#if USE_RECEIVE_TEMP_WITH_SOURCE == 0 + zbThermostat.onTempReceive(receiveSensorTemp); // If you bound only one sensor or you don't need to know the source of the temperature +#else + zbThermostat.onTempReceiveWithSource(receiveSensorTempWithSource); +#endif + + // Set callback function for receiving sensor configuration + zbThermostat.onConfigReceive(receiveSensorConfig); //Optional: set Zigbee device name and model zbThermostat.setManufacturerAndModel("Espressif", "ZigbeeThermostat"); @@ -107,19 +129,30 @@ void setup() { Serial.println(); - // Get temperature sensor configuration - zbThermostat.getSensorSettings(); + // Get temperature sensor configuration for all bound sensors by endpoint number and address + std::list boundSensors = zbThermostat.getBoundDevices(); + for (const auto &device : boundSensors) { + Serial.println("--------------------------------"); + if (device->short_addr == 0x0000 || device->short_addr == 0xFFFF) { //End devices never have 0x0000 short address or 0xFFFF group address + Serial.printf( + "Device on endpoint %d, IEEE Address: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\r\n", device->endpoint, 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] + ); + zbThermostat.getSensorSettings(device->endpoint, device->ieee_addr); + } else { + Serial.printf("Device on endpoint %d, short address: 0x%x\r\n", device->endpoint, device->short_addr); + zbThermostat.getSensorSettings(device->endpoint, device->short_addr); + } + } } void loop() { // Handle button switch in loop() if (digitalRead(button) == LOW) { // Push button pressed - // Key debounce handling while (digitalRead(button) == LOW) { delay(50); } - // Set reporting interval for temperature sensor zbThermostat.setTemperatureReporting(0, 10, 2); } @@ -130,5 +163,6 @@ void loop() { last_print = millis(); int temp_percent = (int)((sensor_temp - sensor_min_temp) / (sensor_max_temp - sensor_min_temp) * 100); Serial.printf("Loop temperature info: %.2f°C (%d %%)\n", sensor_temp, temp_percent); + zbThermostat.printBoundDevices(Serial); } } diff --git a/libraries/Zigbee/keywords.txt b/libraries/Zigbee/keywords.txt index 4d4cd7d0606..5ce1e8f6f51 100644 --- a/libraries/Zigbee/keywords.txt +++ b/libraries/Zigbee/keywords.txt @@ -107,6 +107,7 @@ setLightColor KEYWORD2 # ZigbeeThermostat onTempRecieve KEYWORD2 onConfigRecieve KEYWORD2 +onTempReceiveWithSource KEYWORD2 getTemperature KEYWORD2 getSensorSettings KEYWORD2 setTemperatureReporting KEYWORD2 @@ -191,4 +192,4 @@ ZIGBEE_DEFAULT_COORDINATOR_CONFIG LITERAL1 ZIGBEE_DEFAULT_RADIO_CONFIG LITERAL1 ZIGBEE_DEFAULT_UART_RCP_RADIO_CONFIG LITERAL1 ZIGBEE_DEFAULT_HOST_CONFIG LITERAL1 -ZB_ARRAY_LENTH LITERAL1 +ZB_ARRAY_LENGHT LITERAL1 diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index 1d3df126ce8..efddbdd0368 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -145,7 +145,7 @@ bool ZigbeeEP::setBatteryVoltage(uint8_t voltage) { bool ZigbeeEP::reportBatteryPercentage() { /* Send report attributes command */ - esp_zb_zcl_report_attr_cmd_t report_attr_cmd; + esp_zb_zcl_report_attr_cmd_t report_attr_cmd = {0}; 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; @@ -166,7 +166,7 @@ bool ZigbeeEP::reportBatteryPercentage() { 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; + esp_zb_zcl_read_attr_cmd_t read_req = {0}; if (short_addr != 0) { read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; @@ -183,7 +183,7 @@ char *ZigbeeEP::readManufacturer(uint8_t endpoint, uint16_t short_addr, esp_zb_i uint16_t attributes[] = { ESP_ZB_ZCL_ATTR_BASIC_MANUFACTURER_NAME_ID, }; - read_req.attr_number = ZB_ARRAY_LENTH(attributes); + read_req.attr_number = ZB_ARRAY_LENGHT(attributes); read_req.attr_field = attributes; if (_read_manufacturer != NULL) { @@ -204,7 +204,7 @@ char *ZigbeeEP::readManufacturer(uint8_t endpoint, uint16_t short_addr, esp_zb_i 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; + esp_zb_zcl_read_attr_cmd_t read_req = {0}; if (short_addr != 0) { read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; @@ -221,7 +221,7 @@ char *ZigbeeEP::readModel(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_add uint16_t attributes[] = { ESP_ZB_ZCL_ATTR_BASIC_MODEL_IDENTIFIER_ID, }; - read_req.attr_number = ZB_ARRAY_LENTH(attributes); + read_req.attr_number = ZB_ARRAY_LENGHT(attributes); read_req.attr_field = attributes; if (_read_model != NULL) { @@ -375,7 +375,7 @@ bool ZigbeeEP::setTimezone(int32_t gmt_offset) { 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; + esp_zb_zcl_read_attr_cmd_t read_req = {0}; if (short_addr >= 0) { read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; @@ -386,7 +386,7 @@ tm ZigbeeEP::getTime(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_addr_t ie } uint16_t attributes[] = {ESP_ZB_ZCL_ATTR_TIME_TIME_ID}; - read_req.attr_number = ZB_ARRAY_LENTH(attributes); + read_req.attr_number = ZB_ARRAY_LENGHT(attributes); read_req.attr_field = attributes; read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TIME; @@ -427,7 +427,7 @@ tm ZigbeeEP::getTime(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_addr_t ie 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; + esp_zb_zcl_read_attr_cmd_t read_req = {0}; if (short_addr >= 0) { read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; @@ -438,7 +438,7 @@ int32_t ZigbeeEP::getTimezone(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_ } uint16_t attributes[] = {ESP_ZB_ZCL_ATTR_TIME_TIME_ZONE_ID}; - read_req.attr_number = ZB_ARRAY_LENTH(attributes); + read_req.attr_number = ZB_ARRAY_LENGHT(attributes); read_req.attr_field = attributes; read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TIME; @@ -543,7 +543,7 @@ static void findOTAServer(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t } void ZigbeeEP::requestOTAUpdate() { - esp_zb_zdo_match_desc_req_param_t req; + esp_zb_zdo_match_desc_req_param_t req = {0}; uint16_t cluster_list[] = {ESP_ZB_ZCL_CLUSTER_ID_OTA_UPGRADE}; /* Match the OTA server of coordinator */ diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index fe22f31faaf..a3217cbd066 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -12,7 +12,7 @@ #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 ZB_ARRAY_LENGHT(arr) (sizeof(arr) / sizeof(arr[0])) #define RGB_TO_XYZ(r, g, b, X, Y, Z) \ { \ @@ -131,7 +131,7 @@ class ZigbeeEP { // list of all handlers function calls, to be override by EPs implementation virtual void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) {}; - virtual void zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_attribute_t *attribute) {}; + virtual void zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_attribute_t *attribute, uint8_t src_endpoint, esp_zb_zcl_addr_t src_address) {}; 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) {}; diff --git a/libraries/Zigbee/src/ZigbeeHandlers.cpp b/libraries/Zigbee/src/ZigbeeHandlers.cpp index eeeb1e8013a..5d54e459058 100644 --- a/libraries/Zigbee/src/ZigbeeHandlers.cpp +++ b/libraries/Zigbee/src/ZigbeeHandlers.cpp @@ -108,7 +108,9 @@ static esp_err_t zb_attribute_reporting_handler(const esp_zb_zcl_report_attr_mes // 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->dst_endpoint == (*it)->getEndpoint()) { - (*it)->zbAttributeRead(message->cluster, &message->attribute); //method zbAttributeRead must be implemented in specific EP class + (*it)->zbAttributeRead( + message->cluster, &message->attribute, message->src_endpoint, message->src_address + ); //method zbAttributeRead must be implemented in specific EP class } } return ESP_OK; @@ -142,7 +144,9 @@ static esp_err_t zb_cmd_read_attr_resp_handler(const esp_zb_zcl_cmd_read_attr_re } 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 + (*it)->zbAttributeRead( + message->info.cluster, &variable->attribute, message->info.src_endpoint, message->info.src_address + ); //method zbAttributeRead must be implemented in specific EP class } } variable = variable->next; diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp index 935d638324f..f795ed1a3c8 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.cpp @@ -53,7 +53,7 @@ void ZigbeeColorDimmerSwitch::findCb(esp_zb_zdp_status_t zdo_status, uint16_t ad ZigbeeColorDimmerSwitch *instance = static_cast(user_ctx); if (zdo_status == ESP_ZB_ZDP_STATUS_SUCCESS) { log_d("Found light endpoint"); - esp_zb_zdo_bind_req_param_t bind_req; + esp_zb_zdo_bind_req_param_t bind_req = {0}; zb_device_params_t *light = (zb_device_params_t *)malloc(sizeof(zb_device_params_t)); light->endpoint = endpoint; light->short_addr = addr; @@ -97,7 +97,7 @@ void ZigbeeColorDimmerSwitch::findEndpoint(esp_zb_zdo_match_desc_req_param_t *cm // Methods to control the light void ZigbeeColorDimmerSwitch::lightToggle() { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -112,7 +112,7 @@ void ZigbeeColorDimmerSwitch::lightToggle() { void ZigbeeColorDimmerSwitch::lightToggle(uint16_t group_addr) { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -128,7 +128,7 @@ void ZigbeeColorDimmerSwitch::lightToggle(uint16_t group_addr) { void ZigbeeColorDimmerSwitch::lightToggle(uint8_t endpoint, uint16_t short_addr) { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -145,7 +145,7 @@ void ZigbeeColorDimmerSwitch::lightToggle(uint8_t endpoint, uint16_t short_addr) 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; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -165,7 +165,7 @@ void ZigbeeColorDimmerSwitch::lightToggle(uint8_t endpoint, esp_zb_ieee_addr_t i void ZigbeeColorDimmerSwitch::lightOn() { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -180,7 +180,7 @@ void ZigbeeColorDimmerSwitch::lightOn() { void ZigbeeColorDimmerSwitch::lightOn(uint16_t group_addr) { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -196,7 +196,7 @@ void ZigbeeColorDimmerSwitch::lightOn(uint16_t group_addr) { void ZigbeeColorDimmerSwitch::lightOn(uint8_t endpoint, uint16_t short_addr) { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -213,7 +213,7 @@ void ZigbeeColorDimmerSwitch::lightOn(uint8_t endpoint, uint16_t short_addr) { 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; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -233,7 +233,7 @@ void ZigbeeColorDimmerSwitch::lightOn(uint8_t endpoint, esp_zb_ieee_addr_t ieee_ void ZigbeeColorDimmerSwitch::lightOff() { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -248,7 +248,7 @@ void ZigbeeColorDimmerSwitch::lightOff() { void ZigbeeColorDimmerSwitch::lightOff(uint16_t group_addr) { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -264,7 +264,7 @@ void ZigbeeColorDimmerSwitch::lightOff(uint16_t group_addr) { void ZigbeeColorDimmerSwitch::lightOff(uint8_t endpoint, uint16_t short_addr) { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -281,7 +281,7 @@ void ZigbeeColorDimmerSwitch::lightOff(uint8_t endpoint, uint16_t short_addr) { 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; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -301,7 +301,7 @@ void ZigbeeColorDimmerSwitch::lightOff(uint8_t endpoint, esp_zb_ieee_addr_t ieee void ZigbeeColorDimmerSwitch::lightOffWithEffect(uint8_t effect_id, uint8_t effect_variant) { if (_is_bound) { - esp_zb_zcl_on_off_off_with_effect_cmd_t cmd_req; + esp_zb_zcl_on_off_off_with_effect_cmd_t cmd_req = {0}; cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; cmd_req.effect_id = effect_id; @@ -317,7 +317,7 @@ void ZigbeeColorDimmerSwitch::lightOffWithEffect(uint8_t effect_id, uint8_t effe void ZigbeeColorDimmerSwitch::lightOnWithSceneRecall() { if (_is_bound) { - esp_zb_zcl_on_off_on_with_recall_global_scene_cmd_t cmd_req; + esp_zb_zcl_on_off_on_with_recall_global_scene_cmd_t cmd_req = {0}; cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; log_v("Sending 'light on with scene recall' command"); @@ -331,7 +331,7 @@ void ZigbeeColorDimmerSwitch::lightOnWithSceneRecall() { void ZigbeeColorDimmerSwitch::lightOnWithTimedOff(uint8_t on_off_control, uint16_t time_on, uint16_t time_off) { if (_is_bound) { - esp_zb_zcl_on_off_on_with_timed_off_cmd_t cmd_req; + esp_zb_zcl_on_off_on_with_timed_off_cmd_t cmd_req = {0}; 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_control = on_off_control; //TODO: Test how it works, then maybe change API @@ -348,7 +348,7 @@ void ZigbeeColorDimmerSwitch::lightOnWithTimedOff(uint8_t on_off_control, uint16 void ZigbeeColorDimmerSwitch::setLightLevel(uint8_t level) { if (_is_bound) { - esp_zb_zcl_move_to_level_cmd_t cmd_req; + esp_zb_zcl_move_to_level_cmd_t cmd_req = {0}; cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; cmd_req.level = level; @@ -364,7 +364,7 @@ void ZigbeeColorDimmerSwitch::setLightLevel(uint8_t level) { void ZigbeeColorDimmerSwitch::setLightLevel(uint8_t level, uint16_t group_addr) { if (_is_bound) { - esp_zb_zcl_move_to_level_cmd_t cmd_req; + esp_zb_zcl_move_to_level_cmd_t cmd_req = {0}; 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; @@ -381,7 +381,7 @@ void ZigbeeColorDimmerSwitch::setLightLevel(uint8_t level, uint16_t group_addr) void ZigbeeColorDimmerSwitch::setLightLevel(uint8_t level, uint8_t endpoint, uint16_t short_addr) { if (_is_bound) { - esp_zb_zcl_move_to_level_cmd_t cmd_req; + esp_zb_zcl_move_to_level_cmd_t cmd_req = {0}; 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; @@ -399,7 +399,7 @@ void ZigbeeColorDimmerSwitch::setLightLevel(uint8_t level, uint8_t endpoint, uin 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; + esp_zb_zcl_move_to_level_cmd_t cmd_req = {0}; 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; @@ -422,7 +422,7 @@ void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t if (_is_bound) { espXyColor_t xy_color = espRgbToXYColor(red, green, blue); - esp_zb_zcl_color_move_to_color_cmd_t cmd_req; + esp_zb_zcl_color_move_to_color_cmd_t cmd_req = {0}; 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 = xy_color.x; @@ -441,7 +441,7 @@ void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t if (_is_bound) { espXyColor_t xy_color = espRgbToXYColor(red, green, blue); - esp_zb_zcl_color_move_to_color_cmd_t cmd_req; + esp_zb_zcl_color_move_to_color_cmd_t cmd_req = {0}; 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; @@ -461,7 +461,7 @@ void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t if (_is_bound) { espXyColor_t xy_color = espRgbToXYColor(red, green, blue); - esp_zb_zcl_color_move_to_color_cmd_t cmd_req; + esp_zb_zcl_color_move_to_color_cmd_t cmd_req = {0}; 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; @@ -482,7 +482,7 @@ void ZigbeeColorDimmerSwitch::setLightColor(uint8_t red, uint8_t green, uint8_t if (_is_bound) { espXyColor_t xy_color = espRgbToXYColor(red, green, blue); - esp_zb_zcl_color_move_to_color_cmd_t cmd_req; + esp_zb_zcl_color_move_to_color_cmd_t cmd_req = {0}; 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; diff --git a/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp b/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp index 38fd7d370fb..68e7a7430cc 100644 --- a/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeSwitch.cpp @@ -52,7 +52,7 @@ void ZigbeeSwitch::findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t ZigbeeSwitch *instance = static_cast(user_ctx); if (zdo_status == ESP_ZB_ZDP_STATUS_SUCCESS) { log_d("Found light endpoint"); - esp_zb_zdo_bind_req_param_t bind_req; + esp_zb_zdo_bind_req_param_t bind_req = {0}; zb_device_params_t *light = (zb_device_params_t *)malloc(sizeof(zb_device_params_t)); light->endpoint = endpoint; light->short_addr = addr; @@ -94,7 +94,7 @@ void ZigbeeSwitch::findEndpoint(esp_zb_zdo_match_desc_req_param_t *cmd_req) { // Methods to control the light void ZigbeeSwitch::lightToggle() { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -109,7 +109,7 @@ void ZigbeeSwitch::lightToggle() { void ZigbeeSwitch::lightToggle(uint16_t group_addr) { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -125,7 +125,7 @@ void ZigbeeSwitch::lightToggle(uint16_t group_addr) { void ZigbeeSwitch::lightToggle(uint8_t endpoint, uint16_t short_addr) { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -142,7 +142,7 @@ void ZigbeeSwitch::lightToggle(uint8_t endpoint, uint16_t short_addr) { 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; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -162,7 +162,7 @@ void ZigbeeSwitch::lightToggle(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { void ZigbeeSwitch::lightOn() { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -177,7 +177,7 @@ void ZigbeeSwitch::lightOn() { void ZigbeeSwitch::lightOn(uint16_t group_addr) { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -193,7 +193,7 @@ void ZigbeeSwitch::lightOn(uint16_t group_addr) { void ZigbeeSwitch::lightOn(uint8_t endpoint, uint16_t short_addr) { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -210,7 +210,7 @@ void ZigbeeSwitch::lightOn(uint8_t endpoint, uint16_t short_addr) { 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; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -230,7 +230,7 @@ void ZigbeeSwitch::lightOn(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { void ZigbeeSwitch::lightOff() { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -245,7 +245,7 @@ void ZigbeeSwitch::lightOff() { void ZigbeeSwitch::lightOff(uint16_t group_addr) { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -261,7 +261,7 @@ void ZigbeeSwitch::lightOff(uint16_t group_addr) { void ZigbeeSwitch::lightOff(uint8_t endpoint, uint16_t short_addr) { if (_is_bound) { - esp_zb_zcl_on_off_cmd_t cmd_req; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -278,7 +278,7 @@ void ZigbeeSwitch::lightOff(uint8_t endpoint, uint16_t short_addr) { 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; + esp_zb_zcl_on_off_cmd_t cmd_req = {0}; 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; @@ -298,7 +298,7 @@ void ZigbeeSwitch::lightOff(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { void ZigbeeSwitch::lightOffWithEffect(uint8_t effect_id, uint8_t effect_variant) { if (_is_bound) { - esp_zb_zcl_on_off_off_with_effect_cmd_t cmd_req; + esp_zb_zcl_on_off_off_with_effect_cmd_t cmd_req = {0}; cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; cmd_req.effect_id = effect_id; @@ -314,7 +314,7 @@ void ZigbeeSwitch::lightOffWithEffect(uint8_t effect_id, uint8_t effect_variant) void ZigbeeSwitch::lightOnWithSceneRecall() { if (_is_bound) { - esp_zb_zcl_on_off_on_with_recall_global_scene_cmd_t cmd_req; + esp_zb_zcl_on_off_on_with_recall_global_scene_cmd_t cmd_req = {0}; cmd_req.zcl_basic_cmd.src_endpoint = _endpoint; cmd_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; log_v("Sending 'light on with scene recall' command"); @@ -327,7 +327,7 @@ void ZigbeeSwitch::lightOnWithSceneRecall() { } void ZigbeeSwitch::lightOnWithTimedOff(uint8_t on_off_control, uint16_t time_on, uint16_t time_off) { if (_is_bound) { - esp_zb_zcl_on_off_on_with_timed_off_cmd_t cmd_req; + esp_zb_zcl_on_off_on_with_timed_off_cmd_t cmd_req = {0}; 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_control = on_off_control; //TODO: Test how it works, then maybe change API diff --git a/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp b/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp index 633a60d0ff9..f3bfd7d981b 100644 --- a/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeThermostat.cpp @@ -65,7 +65,7 @@ void ZigbeeThermostat::findCb(esp_zb_zdp_status_t zdo_status, uint16_t addr, uin ZigbeeThermostat *instance = static_cast(user_ctx); if (zdo_status == ESP_ZB_ZDP_STATUS_SUCCESS) { log_i("Found temperature sensor"); - esp_zb_zdo_bind_req_param_t bind_req; + esp_zb_zdo_bind_req_param_t bind_req = {0}; /* Store the information of the remote device */ zb_device_params_t *sensor = (zb_device_params_t *)malloc(sizeof(zb_device_params_t)); sensor->endpoint = endpoint; @@ -115,31 +115,38 @@ void ZigbeeThermostat::findEndpoint(esp_zb_zdo_match_desc_req_param_t *param) { esp_zb_zdo_match_cluster(param, ZigbeeThermostat::findCbWrapper, this); } -void ZigbeeThermostat::zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_attribute_t *attribute) { +void ZigbeeThermostat::zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_attribute_t *attribute, uint8_t src_endpoint, esp_zb_zcl_addr_t src_address) { static uint8_t read_config = 0; if (cluster_id == ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT) { if (attribute->id == ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID && attribute->data.type == ESP_ZB_ZCL_ATTR_TYPE_S16) { int16_t value = attribute->data.value ? *(int16_t *)attribute->data.value : 0; - if (_on_temp_recieve) { - _on_temp_recieve(zb_s16_to_temperature(value)); + if (_on_temp_receive) { + _on_temp_receive(zb_s16_to_temperature(value)); + } + if (_on_temp_receive_with_source) { + _on_temp_receive_with_source(zb_s16_to_temperature(value), src_endpoint, src_address); } } if (attribute->id == ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MIN_VALUE_ID && attribute->data.type == ESP_ZB_ZCL_ATTR_TYPE_S16) { int16_t min_value = attribute->data.value ? *(int16_t *)attribute->data.value : 0; _min_temp = zb_s16_to_temperature(min_value); read_config++; + log_d("Received min temperature: %.2f°C from endpoint %d", _min_temp, src_endpoint); } if (attribute->id == ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MAX_VALUE_ID && attribute->data.type == ESP_ZB_ZCL_ATTR_TYPE_S16) { int16_t max_value = attribute->data.value ? *(int16_t *)attribute->data.value : 0; _max_temp = zb_s16_to_temperature(max_value); read_config++; + log_d("Received max temperature: %.2f°C from endpoint %d", _max_temp, src_endpoint); } if (attribute->id == ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_TOLERANCE_ID && attribute->data.type == ESP_ZB_ZCL_ATTR_TYPE_U16) { uint16_t tolerance = attribute->data.value ? *(uint16_t *)attribute->data.value : 0; _tolerance = 1.0 * tolerance / 100; read_config++; + log_d("Received tolerance: %.2f°C from endpoint %d", _tolerance, src_endpoint); } if (read_config == 3) { + log_d("All config attributes processed"); read_config = 0; xSemaphoreGive(lock); } @@ -147,14 +154,14 @@ void ZigbeeThermostat::zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_att } void ZigbeeThermostat::getTemperature() { - /* Send "read attributes" command to the bound sensor */ - esp_zb_zcl_read_attr_cmd_t read_req; + /* Send "read attributes" command to all bound sensors */ + esp_zb_zcl_read_attr_cmd_t read_req = {0}; read_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; read_req.zcl_basic_cmd.src_endpoint = _endpoint; read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; uint16_t attributes[] = {ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID}; - read_req.attr_number = ZB_ARRAY_LENTH(attributes); + read_req.attr_number = ZB_ARRAY_LENGHT(attributes); read_req.attr_field = attributes; log_i("Sending 'read temperature' command"); @@ -163,9 +170,68 @@ void ZigbeeThermostat::getTemperature() { esp_zb_lock_release(); } +void ZigbeeThermostat::getTemperature(uint16_t group_addr) { + /* Send "read attributes" command to the group */ + esp_zb_zcl_read_attr_cmd_t read_req = {0}; + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT; + read_req.zcl_basic_cmd.src_endpoint = _endpoint; + read_req.zcl_basic_cmd.dst_addr_u.addr_short = group_addr; + read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; + + uint16_t attributes[] = {ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID}; + read_req.attr_number = ZB_ARRAY_LENGHT(attributes); + read_req.attr_field = attributes; + + log_i("Sending 'read temperature' command to group address 0x%x", group_addr); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_read_attr_cmd_req(&read_req); + esp_zb_lock_release(); +} + +void ZigbeeThermostat::getTemperature(uint8_t endpoint, uint16_t short_addr) { + /* Send "read attributes" command to specific endpoint */ + esp_zb_zcl_read_attr_cmd_t read_req = {0}; + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; + 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_TEMP_MEASUREMENT; + + uint16_t attributes[] = {ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID}; + read_req.attr_number = ZB_ARRAY_LENGHT(attributes); + read_req.attr_field = attributes; + + log_i("Sending 'read temperature' command to endpoint %d, address 0x%x", endpoint, short_addr); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_read_attr_cmd_req(&read_req); + esp_zb_lock_release(); +} + +void ZigbeeThermostat::getTemperature(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { + /* Send "read attributes" command to specific endpoint */ + esp_zb_zcl_read_attr_cmd_t read_req = {0}; + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + read_req.zcl_basic_cmd.src_endpoint = _endpoint; + read_req.zcl_basic_cmd.dst_endpoint = endpoint; + read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; + 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_TEMP_MEASUREMENT_VALUE_ID}; + read_req.attr_number = ZB_ARRAY_LENGHT(attributes); + read_req.attr_field = attributes; + + log_i( + "Sending 'read temperature' 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_read_attr_cmd_req(&read_req); + esp_zb_lock_release(); +} + void ZigbeeThermostat::getSensorSettings() { - /* Send "read attributes" command to the bound sensor */ - esp_zb_zcl_read_attr_cmd_t read_req; + /* Send "read attributes" command to all bound sensors */ + esp_zb_zcl_read_attr_cmd_t read_req = {0}; read_req.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; read_req.zcl_basic_cmd.src_endpoint = _endpoint; read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; @@ -173,10 +239,102 @@ void ZigbeeThermostat::getSensorSettings() { uint16_t attributes[] = { ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MIN_VALUE_ID, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MAX_VALUE_ID, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_TOLERANCE_ID }; - read_req.attr_number = ZB_ARRAY_LENTH(attributes); + read_req.attr_number = ZB_ARRAY_LENGHT(attributes); read_req.attr_field = attributes; - log_i("Sending 'read temperature' command"); + log_i("Sending 'read sensor settings' command"); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_read_attr_cmd_req(&read_req); + esp_zb_lock_release(); + + //Take semaphore to wait for response of all attributes + if (xSemaphoreTake(lock, ZB_CMD_TIMEOUT) != pdTRUE) { + log_e("Error while reading attributes"); + return; + } else { + //Call the callback function when all attributes are read + _on_config_receive(_min_temp, _max_temp, _tolerance); + } +} + +void ZigbeeThermostat::getSensorSettings(uint16_t group_addr) { + /* Send "read attributes" command to the group */ + esp_zb_zcl_read_attr_cmd_t read_req = {0}; + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT; + read_req.zcl_basic_cmd.src_endpoint = _endpoint; + read_req.zcl_basic_cmd.dst_addr_u.addr_short = group_addr; + read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; + + uint16_t attributes[] = { + ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MIN_VALUE_ID, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MAX_VALUE_ID, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_TOLERANCE_ID + }; + read_req.attr_number = ZB_ARRAY_LENGHT(attributes); + read_req.attr_field = attributes; + + log_i("Sending 'read sensor settings' command to group address 0x%x", group_addr); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_read_attr_cmd_req(&read_req); + esp_zb_lock_release(); + + //Take semaphore to wait for response of all attributes + if (xSemaphoreTake(lock, ZB_CMD_TIMEOUT) != pdTRUE) { + log_e("Error while reading attributes"); + return; + } else { + //Call the callback function when all attributes are read + _on_config_receive(_min_temp, _max_temp, _tolerance); + } +} + +void ZigbeeThermostat::getSensorSettings(uint8_t endpoint, uint16_t short_addr) { + /* Send "read attributes" command to specific endpoint */ + esp_zb_zcl_read_attr_cmd_t read_req = {0}; + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; + 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_TEMP_MEASUREMENT; + + uint16_t attributes[] = { + ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MIN_VALUE_ID, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MAX_VALUE_ID, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_TOLERANCE_ID + }; + read_req.attr_number = ZB_ARRAY_LENGHT(attributes); + read_req.attr_field = attributes; + + log_i("Sending 'read sensor settings' command to endpoint %d, address 0x%x", endpoint, short_addr); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_read_attr_cmd_req(&read_req); + esp_zb_lock_release(); + + //Take semaphore to wait for response of all attributes + if (xSemaphoreTake(lock, ZB_CMD_TIMEOUT) != pdTRUE) { + log_e("Error while reading attributes"); + return; + } else { + //Call the callback function when all attributes are read + _on_config_receive(_min_temp, _max_temp, _tolerance); + } +} + +void ZigbeeThermostat::getSensorSettings(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr) { + /* Send "read attributes" command to specific endpoint */ + esp_zb_zcl_read_attr_cmd_t read_req = {0}; + read_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + read_req.zcl_basic_cmd.src_endpoint = _endpoint; + read_req.zcl_basic_cmd.dst_endpoint = endpoint; + read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; + 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_TEMP_MEASUREMENT_MIN_VALUE_ID, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MAX_VALUE_ID, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_TOLERANCE_ID + }; + read_req.attr_number = ZB_ARRAY_LENGHT(attributes); + read_req.attr_field = attributes; + + log_i( + "Sending 'read sensor settings' 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_read_attr_cmd_req(&read_req); esp_zb_lock_release(); @@ -187,13 +345,13 @@ void ZigbeeThermostat::getSensorSettings() { return; } else { //Call the callback function when all attributes are read - _on_config_recieve(_min_temp, _max_temp, _tolerance); + _on_config_receive(_min_temp, _max_temp, _tolerance); } } void ZigbeeThermostat::setTemperatureReporting(uint16_t min_interval, uint16_t max_interval, float delta) { - /* Send "configure report attribute" command to the bound sensor */ - esp_zb_zcl_config_report_cmd_t report_cmd; + /* Send "configure report attribute" command to all bound sensors */ + esp_zb_zcl_config_report_cmd_t report_cmd = {0}; report_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; report_cmd.zcl_basic_cmd.src_endpoint = _endpoint; report_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; @@ -206,10 +364,10 @@ void ZigbeeThermostat::setTemperatureReporting(uint16_t min_interval, uint16_t m .attrType = ESP_ZB_ZCL_ATTR_TYPE_S16, .min_interval = min_interval, .max_interval = max_interval, - .reportable_change = &report_change, + .reportable_change = (void *)&report_change, }, }; - report_cmd.record_number = ZB_ARRAY_LENTH(records); + report_cmd.record_number = ZB_ARRAY_LENGHT(records); report_cmd.record_field = records; log_i("Sending 'configure reporting' command"); @@ -218,4 +376,93 @@ void ZigbeeThermostat::setTemperatureReporting(uint16_t min_interval, uint16_t m esp_zb_lock_release(); } +void ZigbeeThermostat::setTemperatureReporting(uint16_t group_addr, uint16_t min_interval, uint16_t max_interval, float delta) { + /* Send "configure report attribute" command to the group */ + esp_zb_zcl_config_report_cmd_t report_cmd = {0}; + report_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT; + report_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + report_cmd.zcl_basic_cmd.dst_addr_u.addr_short = group_addr; + report_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; + + int16_t report_change = (int16_t)delta * 100; + esp_zb_zcl_config_report_record_t records[] = { + { + .direction = ESP_ZB_ZCL_REPORT_DIRECTION_SEND, + .attributeID = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, + .attrType = ESP_ZB_ZCL_ATTR_TYPE_S16, + .min_interval = min_interval, + .max_interval = max_interval, + .reportable_change = (void *)&report_change, + }, + }; + report_cmd.record_number = ZB_ARRAY_LENGHT(records); + report_cmd.record_field = records; + + log_i("Sending 'configure reporting' command to group address 0x%x", group_addr); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_config_report_cmd_req(&report_cmd); + esp_zb_lock_release(); +} + +void ZigbeeThermostat::setTemperatureReporting(uint8_t endpoint, uint16_t short_addr, uint16_t min_interval, uint16_t max_interval, float delta) { + /* Send "configure report attribute" command to specific endpoint */ + esp_zb_zcl_config_report_cmd_t report_cmd = {0}; + report_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; + report_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + report_cmd.zcl_basic_cmd.dst_endpoint = endpoint; + report_cmd.zcl_basic_cmd.dst_addr_u.addr_short = short_addr; + report_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; + + int16_t report_change = (int16_t)delta * 100; + esp_zb_zcl_config_report_record_t records[] = { + { + .direction = ESP_ZB_ZCL_REPORT_DIRECTION_SEND, + .attributeID = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, + .attrType = ESP_ZB_ZCL_ATTR_TYPE_S16, + .min_interval = min_interval, + .max_interval = max_interval, + .reportable_change = (void *)&report_change, + }, + }; + report_cmd.record_number = ZB_ARRAY_LENGHT(records); + report_cmd.record_field = records; + + log_i("Sending 'configure reporting' command to endpoint %d, address 0x%x", endpoint, short_addr); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_config_report_cmd_req(&report_cmd); + esp_zb_lock_release(); +} + +void ZigbeeThermostat::setTemperatureReporting(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr, uint16_t min_interval, uint16_t max_interval, float delta) { + /* Send "configure report attribute" command to specific endpoint */ + esp_zb_zcl_config_report_cmd_t report_cmd = {0}; + report_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; + report_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + report_cmd.zcl_basic_cmd.dst_endpoint = endpoint; + report_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; + memcpy(report_cmd.zcl_basic_cmd.dst_addr_u.addr_long, ieee_addr, sizeof(esp_zb_ieee_addr_t)); + + int16_t report_change = (int16_t)delta * 100; + esp_zb_zcl_config_report_record_t records[] = { + { + .direction = ESP_ZB_ZCL_REPORT_DIRECTION_SEND, + .attributeID = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, + .attrType = ESP_ZB_ZCL_ATTR_TYPE_S16, + .min_interval = min_interval, + .max_interval = max_interval, + .reportable_change = (void *)&report_change, + }, + }; + report_cmd.record_number = ZB_ARRAY_LENGHT(records); + report_cmd.record_field = records; + + log_i( + "Sending 'configure reporting' 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_config_report_cmd_req(&report_cmd); + esp_zb_lock_release(); +} + #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeThermostat.h b/libraries/Zigbee/src/ep/ZigbeeThermostat.h index acdcd68e512..c10a9d7f974 100644 --- a/libraries/Zigbee/src/ep/ZigbeeThermostat.h +++ b/libraries/Zigbee/src/ep/ZigbeeThermostat.h @@ -34,24 +34,39 @@ class ZigbeeThermostat : public ZigbeeEP { ZigbeeThermostat(uint8_t endpoint); ~ZigbeeThermostat() {} - void onTempRecieve(void (*callback)(float)) { - _on_temp_recieve = callback; + void onTempReceive(void (*callback)(float)) { + _on_temp_receive = callback; } - void onConfigRecieve(void (*callback)(float, float, float)) { - _on_config_recieve = callback; + void onTempReceiveWithSource(void (*callback)(float, uint8_t, esp_zb_zcl_addr_t)) { + _on_temp_receive_with_source = callback; + } + void onConfigReceive(void (*callback)(float, float, float)) { + _on_config_receive = callback; } void getTemperature(); + void getTemperature(uint16_t group_addr); + void getTemperature(uint8_t endpoint, uint16_t short_addr); + void getTemperature(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr); + void getSensorSettings(); + void getSensorSettings(uint16_t group_addr); + void getSensorSettings(uint8_t endpoint, uint16_t short_addr); + void getSensorSettings(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr); + void setTemperatureReporting(uint16_t min_interval, uint16_t max_interval, float delta); + void setTemperatureReporting(uint16_t group_addr, uint16_t min_interval, uint16_t max_interval, float delta); + void setTemperatureReporting(uint8_t endpoint, uint16_t short_addr, uint16_t min_interval, uint16_t max_interval, float delta); + void setTemperatureReporting(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr, uint16_t min_interval, uint16_t max_interval, float delta); private: // save instance of the class in order to use it in static functions static ZigbeeThermostat *_instance; zb_device_params_t *_device; - void (*_on_temp_recieve)(float); - void (*_on_config_recieve)(float, float, float); + void (*_on_temp_receive)(float); + void (*_on_temp_receive_with_source)(float, uint8_t, esp_zb_zcl_addr_t); + void (*_on_config_receive)(float, float, float); float _min_temp; float _max_temp; float _tolerance; @@ -62,7 +77,7 @@ class ZigbeeThermostat : public ZigbeeEP { static void bindCbWrapper(esp_zb_zdp_status_t zdo_status, void *user_ctx); static void findCbWrapper(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t endpoint, void *user_ctx); - void zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_attribute_t *attribute) override; + void zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_attribute_t *attribute, uint8_t src_endpoint, esp_zb_zcl_addr_t src_address) override; }; #endif // CONFIG_ZB_ENABLED From e3018b67191ec621cbd28b872f99c259de83a7f4 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, 4 Jun 2025 16:40:52 +0200 Subject: [PATCH 154/290] feat(zigbee): Add method to set/get/report analog output (#11431) * feat(zigbee): Add methot to set,get,report analog output * fix(ci): Update json file for example * fix(zigbee): Add missing keywords * 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_Analog_Input_Output.ino | 12 +++-- .../Zigbee_Analog_Input_Output/ci.json | 3 +- libraries/Zigbee/keywords.txt | 11 ++++- libraries/Zigbee/src/ep/ZigbeeAnalog.cpp | 49 +++++++++++++++++-- libraries/Zigbee/src/ep/ZigbeeAnalog.h | 14 ++++-- 5 files changed, 74 insertions(+), 15 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino index db8a62b091e..59c4b514db1 100644 --- a/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino +++ b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino @@ -26,8 +26,8 @@ * Modified by Pat Clay */ -#ifndef ZIGBEE_MODE_ED -#error "Zigbee end device mode is not selected in Tools->Zigbee mode" +#ifndef ZIGBEE_MODE_ZCZR +#error "Zigbee coordinator/router device mode is not selected in Tools->Zigbee mode" #endif #include "Zigbee.h" @@ -70,6 +70,7 @@ void setup() { zbAnalogDevice.addAnalogOutput(); zbAnalogDevice.setAnalogOutputApplication(ESP_ZB_ZCL_AI_RPM_OTHER); zbAnalogDevice.setAnalogOutputDescription("Fan Speed (RPM)"); + zbAnalogDevice.setAnalogOutputResolution(1); // If analog output cluster is added, set callback function for analog output change zbAnalogDevice.onAnalogOutputChange(onAnalogOutputChange); @@ -99,8 +100,8 @@ void setup() { Zigbee.addEndpoint(&zbAnalogPercent); Serial.println("Starting Zigbee..."); - // When all EPs are registered, start Zigbee in End Device mode - if (!Zigbee.begin()) { + // When all EPs are registered, start Zigbee in Router Device mode + if (!Zigbee.begin(ZIGBEE_ROUTER)) { Serial.println("Zigbee failed to start!"); Serial.println("Rebooting..."); ESP.restart(); @@ -151,6 +152,9 @@ void loop() { Zigbee.factoryReset(); } } + // For demonstration purposes, increment the analog output value by 100 + zbAnalogDevice.setAnalogOutput(zbAnalogDevice.getAnalogOutput() + 100); + zbAnalogDevice.reportAnalogOutput(); } delay(100); } diff --git a/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/ci.json b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/ci.json index ceacc367801..15d6190e4ae 100644 --- a/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/ci.json @@ -1,7 +1,6 @@ { - "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "fqbn_append": "PartitionScheme=zigbee_zczr,ZigbeeMode=zczr", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y", "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/keywords.txt b/libraries/Zigbee/keywords.txt index 5ce1e8f6f51..556b6408ea2 100644 --- a/libraries/Zigbee/keywords.txt +++ b/libraries/Zigbee/keywords.txt @@ -143,14 +143,21 @@ setSensorType KEYWORD2 setCarbonDioxide KEYWORD2 # ZigbeeAnalog -addAnalogValue KEYWORD2 addAnalogInput KEYWORD2 addAnalogOutput KEYWORD2 onAnalogOutputChange KEYWORD2 -setAnalogValue KEYWORD2 setAnalogInput KEYWORD2 +setAnalogOutput KEYWORD2 +getAnalogOutput KEYWORD2 reportAnalogInput KEYWORD2 +reportAnalogOutput KEYWORD2 setAnalogInputReporting KEYWORD2 +setAnalogInputApplication KEYWORD2 +setAnalogInputDescription KEYWORD2 +setAnalogInputResolution KEYWORD2 +setAnalogOutputApplication KEYWORD2 +setAnalogOutputDescription KEYWORD2 +setAnalogOutputResolution KEYWORD2 # ZigbeeCarbonDioxideSensor setCarbonDioxide KEYWORD2 diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp index 6e073c345bc..893a9854ecc 100644 --- a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp @@ -129,8 +129,8 @@ bool ZigbeeAnalog::setAnalogOutputApplication(uint32_t application_type) { void ZigbeeAnalog::zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) { if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT) { if (message->attribute.id == ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_PRESENT_VALUE_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_SINGLE) { - float analog_output = *(float *)message->attribute.data.value; - analogOutputChanged(analog_output); + _output_state = *(float *)message->attribute.data.value; + analogOutputChanged(); } else { log_w("Received message ignored. Attribute ID: %d not supported for Analog Output", message->attribute.id); } @@ -139,9 +139,9 @@ void ZigbeeAnalog::zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *mes } } -void ZigbeeAnalog::analogOutputChanged(float analog_output) { +void ZigbeeAnalog::analogOutputChanged() { if (_on_analog_output_change) { - _on_analog_output_change(analog_output); + _on_analog_output_change(_output_state); } else { log_w("No callback function set for analog output change"); } @@ -166,6 +166,26 @@ bool ZigbeeAnalog::setAnalogInput(float analog) { return true; } +bool ZigbeeAnalog::setAnalogOutput(float analog) { + esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS; + _output_state = analog; + analogOutputChanged(); + + log_v("Updating analog output to %.2f", analog); + /* Update analog output */ + esp_zb_lock_acquire(portMAX_DELAY); + ret = esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_PRESENT_VALUE_ID, &_output_state, false + ); + esp_zb_lock_release(); + + if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { + log_e("Failed to set analog output: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); + return false; + } + return true; +} + bool ZigbeeAnalog::reportAnalogInput() { /* Send report attributes command */ esp_zb_zcl_report_attr_cmd_t report_attr_cmd; @@ -187,6 +207,27 @@ bool ZigbeeAnalog::reportAnalogInput() { return true; } +bool ZigbeeAnalog::reportAnalogOutput() { + /* 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_ANALOG_OUTPUT_PRESENT_VALUE_ID; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; + report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT; + report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_zb_lock_release(); + if (ret != ESP_OK) { + log_e("Failed to send Analog Output report: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + log_v("Analog Output report sent"); + return true; +} + bool ZigbeeAnalog::setAnalogInputReporting(uint16_t min_interval, uint16_t max_interval, float delta) { esp_zb_zcl_reporting_info_t reporting_info; memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t)); diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.h b/libraries/Zigbee/src/ep/ZigbeeAnalog.h index e0c3fc11c5a..bbc5f6d6fc2 100644 --- a/libraries/Zigbee/src/ep/ZigbeeAnalog.h +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.h @@ -46,11 +46,18 @@ class ZigbeeAnalog : public ZigbeeEP { _on_analog_output_change = callback; } - // Set the analog input value + // Set the Analog Input/Output value bool setAnalogInput(float analog); + bool setAnalogOutput(float analog); - // Report Analog Input value + // Get the Analog Output value + float getAnalogOutput() { + return _output_state; + } + + // Report Analog Input/Output bool reportAnalogInput(); + bool reportAnalogOutput(); // Set reporting for Analog Input bool setAnalogInputReporting(uint16_t min_interval, uint16_t max_interval, float delta); @@ -59,9 +66,10 @@ class ZigbeeAnalog : public ZigbeeEP { void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override; void (*_on_analog_output_change)(float); - void analogOutputChanged(float analog_output); + void analogOutputChanged(); uint8_t _analog_clusters; + float _output_state; }; #endif // CONFIG_ZB_ENABLED From 0ab9a0fe6fb450f527cb277d09b70065905cf807 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, 4 Jun 2025 17:48:48 +0200 Subject: [PATCH 155/290] feat(zigbee): Update to esp-zigbee-sdk 1.6.5 and fix ci.json files (#11436) * feat(zigbee): Update esp-zigbee-sdk and fix ci.json files * fix(ci): Check if LED_BUILTIN exist * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- idf_component.yml | 4 ++-- .../Zigbee/examples/Zigbee_On_Off_MultiSwitch/ci.json | 2 +- .../examples/Zigbee_Power_Outlet/Zigbee_Power_Outlet.ino | 8 +++++++- libraries/Zigbee/examples/Zigbee_Power_Outlet/ci.json | 1 - 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/idf_component.yml b/idf_component.yml index dca97dc1655..766704176b0 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -54,12 +54,12 @@ dependencies: espressif/esp_modem: version: "^1.1.0" espressif/esp-zboss-lib: - version: "==1.6.3" + version: "==1.6.4" # compatible with esp-zigbee-lib 1.6.5 require: public rules: - if: "target not in [esp32c2, esp32p4]" espressif/esp-zigbee-lib: - version: "==1.6.3" + version: "==1.6.5" require: public rules: - if: "target not in [esp32c2, esp32p4]" diff --git a/libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/ci.json b/libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/ci.json index e79a477da11..15d6190e4ae 100644 --- a/libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/ci.json +++ b/libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/ci.json @@ -1,6 +1,6 @@ { "fqbn_append": "PartitionScheme=zigbee_zczr,ZigbeeMode=zczr", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/examples/Zigbee_Power_Outlet/Zigbee_Power_Outlet.ino b/libraries/Zigbee/examples/Zigbee_Power_Outlet/Zigbee_Power_Outlet.ino index d9fe1b7aefe..ba1474d6455 100644 --- a/libraries/Zigbee/examples/Zigbee_Power_Outlet/Zigbee_Power_Outlet.ino +++ b/libraries/Zigbee/examples/Zigbee_Power_Outlet/Zigbee_Power_Outlet.ino @@ -34,7 +34,13 @@ /* Zigbee power outlet configuration */ #define ZIGBEE_OUTLET_ENDPOINT 1 -uint8_t led = RGB_BUILTIN; + +#ifdef LED_BUILTIN // Use built-in LED if defined for the board +uint8_t led = LED_BUILTIN; +#else +uint8_t led = 2; // Use custom LED pin +#endif + uint8_t button = BOOT_PIN; ZigbeePowerOutlet zbOutlet = ZigbeePowerOutlet(ZIGBEE_OUTLET_ENDPOINT); diff --git a/libraries/Zigbee/examples/Zigbee_Power_Outlet/ci.json b/libraries/Zigbee/examples/Zigbee_Power_Outlet/ci.json index 23decd7127c..15d6190e4ae 100644 --- a/libraries/Zigbee/examples/Zigbee_Power_Outlet/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Power_Outlet/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=zigbee_zczr,ZigbeeMode=zczr", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y", "CONFIG_ZB_ENABLED=y" ] } From 31d22e6ed05a26a7fd7765b9ae42fd292559690f Mon Sep 17 00:00:00 2001 From: SooD <45733639+syong0921@users.noreply.github.com> Date: Thu, 5 Jun 2025 00:49:09 +0900 Subject: [PATCH 156/290] fix: change geekble nano board setting (#11432) add PSRAM Setting --- boards.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/boards.txt b/boards.txt index d92f057a78f..7e86af52a4f 100644 --- a/boards.txt +++ b/boards.txt @@ -41778,6 +41778,13 @@ Geekble_Nano_ESP32S3.menu.PartitionScheme.custom=Custom Geekble_Nano_ESP32S3.menu.PartitionScheme.custom.build.partitions= Geekble_Nano_ESP32S3.menu.PartitionScheme.custom.upload.maximum_size=16777216 +Geekble_Nano_ESP32S3.menu.PSRAM.disabled=Disabled +Geekble_Nano_ESP32S3.menu.PSRAM.disabled.build.defines= +Geekble_Nano_ESP32S3.menu.PSRAM.disabled.build.psram_type=qspi +Geekble_Nano_ESP32S3.menu.PSRAM.enabled=Enabled +Geekble_Nano_ESP32S3.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM +Geekble_Nano_ESP32S3.menu.PSRAM.enabled.build.psram_type=qspi + Geekble_Nano_ESP32S3.menu.DebugLevel.none=None Geekble_Nano_ESP32S3.menu.DebugLevel.none.build.code_debug=0 Geekble_Nano_ESP32S3.menu.DebugLevel.error=Error From 1bac8de384c6e27abde8901b4fb3ca712d11cf1b Mon Sep 17 00:00:00 2001 From: SooD <45733639+syong0921@users.noreply.github.com> Date: Tue, 10 Jun 2025 16:29:11 +0900 Subject: [PATCH 157/290] fix: Updated the tools options for Geekble Mini (#11437) fix: Updated the tools options for Geekble Mini --- boards.txt | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/boards.txt b/boards.txt index 7e86af52a4f..49a4d9a737d 100644 --- a/boards.txt +++ b/boards.txt @@ -41589,11 +41589,6 @@ Geekble_ESP32C3.build.boot=qio Geekble_ESP32C3.build.partitions=default Geekble_ESP32C3.build.defines= -Geekble_ESP32C3.menu.CDCOnBoot.default=Enabled -Geekble_ESP32C3.menu.CDCOnBoot.default.build.cdc_on_boot=1 -Geekble_ESP32C3.menu.CDCOnBoot.cdc=Disabled -Geekble_ESP32C3.menu.CDCOnBoot.cdc.build.cdc_on_boot=0 - Geekble_ESP32C3.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) Geekble_ESP32C3.menu.PartitionScheme.default.build.partitions=default Geekble_ESP32C3.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) @@ -41614,39 +41609,6 @@ Geekble_ESP32C3.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) Geekble_ESP32C3.menu.PartitionScheme.huge_app.build.partitions=huge_app Geekble_ESP32C3.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 -Geekble_ESP32C3.menu.CPUFreq.160=160MHz (WiFi) (Default) -Geekble_ESP32C3.menu.CPUFreq.160.build.f_cpu=160000000L -Geekble_ESP32C3.menu.CPUFreq.80=80MHz (WiFi) -Geekble_ESP32C3.menu.CPUFreq.80.build.f_cpu=80000000L -Geekble_ESP32C3.menu.CPUFreq.40=40MHz -Geekble_ESP32C3.menu.CPUFreq.40.build.f_cpu=40000000L -Geekble_ESP32C3.menu.CPUFreq.20=20MHz -Geekble_ESP32C3.menu.CPUFreq.20.build.f_cpu=20000000L -Geekble_ESP32C3.menu.CPUFreq.10=10MHz -Geekble_ESP32C3.menu.CPUFreq.10.build.f_cpu=10000000L - -Geekble_ESP32C3.menu.FlashMode.qio=QIO (Default) -Geekble_ESP32C3.menu.FlashMode.qio.build.flash_mode=dio -Geekble_ESP32C3.menu.FlashMode.qio.build.boot=qio -Geekble_ESP32C3.menu.FlashMode.dio=DIO -Geekble_ESP32C3.menu.FlashMode.dio.build.flash_mode=dio -Geekble_ESP32C3.menu.FlashMode.dio.build.boot=dio -Geekble_ESP32C3.menu.FlashMode.qout=QOUT -Geekble_ESP32C3.menu.FlashMode.qout.build.flash_mode=dout -Geekble_ESP32C3.menu.FlashMode.qout.build.boot=qout -Geekble_ESP32C3.menu.FlashMode.dout=DOUT -Geekble_ESP32C3.menu.FlashMode.dout.build.flash_mode=dout - -Geekble_ESP32C3.menu.FlashFreq.80=80MHz (Default) -Geekble_ESP32C3.menu.FlashFreq.80.build.flash_freq=80m -Geekble_ESP32C3.menu.FlashFreq.40=40MHz -Geekble_ESP32C3.menu.FlashFreq.40.build.flash_freq=40m - -Geekble_ESP32C3.menu.FlashSize.4M=4MB (Default) -Geekble_ESP32C3.menu.FlashSize.4M.build.flash_size=4MB -Geekble_ESP32C3.menu.FlashSize.2M=2MB -Geekble_ESP32C3.menu.FlashSize.2M.build.flash_size=2MB - Geekble_ESP32C3.menu.UploadSpeed.921600=921600 (Default) Geekble_ESP32C3.menu.UploadSpeed.921600.upload.speed=921600 Geekble_ESP32C3.menu.UploadSpeed.115200=115200 From 610d951f9d1ddf690b786600bccddb515f1f0b5b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 10 Jun 2025 09:29:29 +0200 Subject: [PATCH 158/290] include "esp_bt.h" only when existing (#11438) --- cores/esp32/esp32-hal-misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-misc.c b/cores/esp32/esp32-hal-misc.c index 594acd38153..aadd08ceffc 100644 --- a/cores/esp32/esp32-hal-misc.c +++ b/cores/esp32/esp32-hal-misc.c @@ -25,7 +25,7 @@ #include "esp_ota_ops.h" #endif //CONFIG_APP_ROLLBACK_ENABLE #include "esp_private/startup_internal.h" -#if defined(CONFIG_BT_BLUEDROID_ENABLED) && SOC_BT_SUPPORTED +#if defined(CONFIG_BT_BLUEDROID_ENABLED) && SOC_BT_SUPPORTED && __has_include("esp_bt.h") #include "esp_bt.h" #endif //CONFIG_BT_BLUEDROID_ENABLED #include From ee347baa7dca0cbe87dbd579465bbe00924f9b03 Mon Sep 17 00:00:00 2001 From: i3water <121024123@qq.com> Date: Tue, 10 Jun 2025 15:29:46 +0800 Subject: [PATCH 159/290] feat(boards): update wifiduinov2&wifiduino32s3 boards setting (#11440) * update wifiduinov2&wifiduino32s3 boards setting * fix wifiduinov2&wifiduino32s3 build board error. * fix wifiduinov2(esp32c3) board setting * fix wifiduinov2(esp32c3) cdc on boot default setting. * fix wifiduino32s3 spi pin set * change wifiduino32s3 spi pin to spi1 * remove 32Mb flash size * 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 | 46 +++++++++---------- variants/wifiduino32s3/pins_arduino.h | 66 ++++++++++++++++----------- 2 files changed, 62 insertions(+), 50 deletions(-) diff --git a/boards.txt b/boards.txt index 49a4d9a737d..fefc6cdfb71 100644 --- a/boards.txt +++ b/boards.txt @@ -31513,16 +31513,16 @@ wifiduino32c3.build.target=esp wifiduino32c3.build.mcu=esp32c3 wifiduino32c3.build.core=esp32 wifiduino32c3.build.variant=wifiduinov2 -wifiduino32c3.build.board=WiFiduinoV2 +wifiduino32c3.build.board=WIFIDUINOV2 wifiduino32c3.build.bootloader_addr=0x0 wifiduino32c3.build.cdc_on_boot=0 wifiduino32c3.build.f_cpu=160000000L wifiduino32c3.build.flash_size=4MB wifiduino32c3.build.flash_freq=80m -wifiduino32c3.build.flash_mode=qio -wifiduino32c3.build.boot=qio -wifiduino32c3.build.partitions=default +wifiduino32c3.build.flash_mode=dio +wifiduino32c3.build.boot=dio +wifiduino32c3.build.partitions=no_ota wifiduino32c3.build.defines= wifiduino32c3.menu.CDCOnBoot.default=Disabled @@ -31530,6 +31530,9 @@ wifiduino32c3.menu.CDCOnBoot.default.build.cdc_on_boot=0 wifiduino32c3.menu.CDCOnBoot.cdc=Enabled wifiduino32c3.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 +wifiduino32c3.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +wifiduino32c3.menu.PartitionScheme.no_ota.build.partitions=no_ota +wifiduino32c3.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 wifiduino32c3.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) wifiduino32c3.menu.PartitionScheme.default.build.partitions=default wifiduino32c3.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) @@ -31539,9 +31542,6 @@ wifiduino32c3.menu.PartitionScheme.default_8MB.build.partitions=default_8MB wifiduino32c3.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 wifiduino32c3.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) wifiduino32c3.menu.PartitionScheme.minimal.build.partitions=minimal -wifiduino32c3.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) -wifiduino32c3.menu.PartitionScheme.no_ota.build.partitions=no_ota -wifiduino32c3.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 wifiduino32c3.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) wifiduino32c3.menu.PartitionScheme.noota_3g.build.partitions=noota_3g wifiduino32c3.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 @@ -31584,12 +31584,12 @@ wifiduino32c3.menu.CPUFreq.20.build.f_cpu=20000000L wifiduino32c3.menu.CPUFreq.10=10MHz wifiduino32c3.menu.CPUFreq.10.build.f_cpu=10000000L -wifiduino32c3.menu.FlashMode.qio=QIO -wifiduino32c3.menu.FlashMode.qio.build.flash_mode=dio -wifiduino32c3.menu.FlashMode.qio.build.boot=qio wifiduino32c3.menu.FlashMode.dio=DIO wifiduino32c3.menu.FlashMode.dio.build.flash_mode=dio wifiduino32c3.menu.FlashMode.dio.build.boot=dio +wifiduino32c3.menu.FlashMode.qio=QIO +wifiduino32c3.menu.FlashMode.qio.build.flash_mode=dio +wifiduino32c3.menu.FlashMode.qio.build.boot=qio wifiduino32c3.menu.FlashFreq.80=80MHz wifiduino32c3.menu.FlashFreq.80.build.flash_freq=80m @@ -31665,34 +31665,34 @@ wifiduino32s3.build.target=esp32s3 wifiduino32s3.build.mcu=esp32s3 wifiduino32s3.build.core=esp32 wifiduino32s3.build.variant=wifiduino32s3 -wifiduino32s3.build.board=WiFiduino32S3 +wifiduino32s3.build.board=WIFIDUINO32S3 wifiduino32s3.build.usb_mode=1 wifiduino32s3.build.cdc_on_boot=0 wifiduino32s3.build.msc_on_boot=0 wifiduino32s3.build.dfu_on_boot=0 wifiduino32s3.build.f_cpu=240000000L -wifiduino32s3.build.flash_size=4MB +wifiduino32s3.build.flash_size=16MB wifiduino32s3.build.flash_freq=80m wifiduino32s3.build.flash_mode=dio wifiduino32s3.build.boot=qio wifiduino32s3.build.boot_freq=80m -wifiduino32s3.build.partitions=default +wifiduino32s3.build.partitions=app3M_fat9M_16MB wifiduino32s3.build.defines= wifiduino32s3.build.loop_core= wifiduino32s3.build.event_core= -wifiduino32s3.build.psram_type=qspi +wifiduino32s3.build.psram_type=opi wifiduino32s3.build.memory_type={build.boot}_{build.psram_type} +wifiduino32s3.menu.PSRAM.opi=OPI PSRAM +wifiduino32s3.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM +wifiduino32s3.menu.PSRAM.opi.build.psram_type=opi wifiduino32s3.menu.PSRAM.disabled=Disabled wifiduino32s3.menu.PSRAM.disabled.build.defines= wifiduino32s3.menu.PSRAM.disabled.build.psram_type=qspi wifiduino32s3.menu.PSRAM.enabled=QSPI PSRAM wifiduino32s3.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM wifiduino32s3.menu.PSRAM.enabled.build.psram_type=qspi -wifiduino32s3.menu.PSRAM.opi=OPI PSRAM -wifiduino32s3.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM -wifiduino32s3.menu.PSRAM.opi.build.psram_type=opi wifiduino32s3.menu.FlashMode.qio=QIO 80MHz wifiduino32s3.menu.FlashMode.qio.build.flash_mode=dio @@ -31715,12 +31715,10 @@ wifiduino32s3.menu.FlashMode.opi.build.boot=opi wifiduino32s3.menu.FlashMode.opi.build.boot_freq=80m wifiduino32s3.menu.FlashMode.opi.build.flash_freq=80m -wifiduino32s3.menu.FlashSize.4M=4MB (32Mb) -wifiduino32s3.menu.FlashSize.4M.build.flash_size=4MB -wifiduino32s3.menu.FlashSize.8M=8MB (64Mb) -wifiduino32s3.menu.FlashSize.8M.build.flash_size=8MB wifiduino32s3.menu.FlashSize.16M=16MB (128Mb) wifiduino32s3.menu.FlashSize.16M.build.flash_size=16MB +wifiduino32s3.menu.FlashSize.8M=8MB (64Mb) +wifiduino32s3.menu.FlashSize.8M.build.flash_size=8MB #wifiduino32s3.menu.FlashSize.32M=32MB (256Mb) #wifiduino32s3.menu.FlashSize.32M.build.flash_size=32MB @@ -31761,6 +31759,9 @@ wifiduino32s3.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) wifiduino32s3.menu.UploadMode.cdc.upload.use_1200bps_touch=true wifiduino32s3.menu.UploadMode.cdc.upload.wait_for_upload_port=true +wifiduino32s3.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS) +wifiduino32s3.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB +wifiduino32s3.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 wifiduino32s3.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) wifiduino32s3.menu.PartitionScheme.default.build.partitions=default wifiduino32s3.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) @@ -31791,9 +31792,6 @@ wifiduino32s3.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 wifiduino32s3.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS) wifiduino32s3.menu.PartitionScheme.fatflash.build.partitions=ffat wifiduino32s3.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 -wifiduino32s3.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS) -wifiduino32s3.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB -wifiduino32s3.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 wifiduino32s3.menu.PartitionScheme.rainmaker=RainMaker 4MB wifiduino32s3.menu.PartitionScheme.rainmaker.build.partitions=rainmaker wifiduino32s3.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 diff --git a/variants/wifiduino32s3/pins_arduino.h b/variants/wifiduino32s3/pins_arduino.h index d26e415910e..4fc08139c0e 100644 --- a/variants/wifiduino32s3/pins_arduino.h +++ b/variants/wifiduino32s3/pins_arduino.h @@ -2,43 +2,57 @@ #define Pins_Arduino_h #include - -#define USB_VID 0x303a -#define USB_PID 0x1001 - -// No USER LED or NeoLED - -static const uint8_t TX = 45; +#include "soc/soc_caps.h" + +#define USB_VID 0x303a +#define USB_PID 0x1001 +#define USB_MANUFACTURER "openjumper" +#define USB_PRODUCT "Wifiduino32-S3" +#define USB_SERIAL "" // Empty string for MAC address + +// Some boards have too low voltage on this pin (board design bug) +// Use different pin with 3V and connect with 48 +// and change this setup for the chosen pin (for example 38) +#define PIN_RGB_LED 48 +// 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 RGB_BRIGHTNESS 64 + +static const uint8_t TX = 43; static const uint8_t RX = 44; static const uint8_t SDA = 4; static const uint8_t SCL = 5; -static const uint8_t SS = 46; -static const uint8_t MOSI = 3; -static const uint8_t MISO = 20; -static const uint8_t SCK = 19; +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 A0 = 7; -static const uint8_t A1 = 6; +static const uint8_t A0 = 0; +static const uint8_t A1 = 1; static const uint8_t A2 = 2; -static const uint8_t A3 = 1; +static const uint8_t A3 = 3; static const uint8_t A4 = 4; static const uint8_t A5 = 5; static const uint8_t D0 = 44; -static const uint8_t D1 = 45; -static const uint8_t D2 = 42; -static const uint8_t D3 = 41; -static const uint8_t D4 = 0; -static const uint8_t D5 = 45; -static const uint8_t D6 = 48; -static const uint8_t D7 = 47; +static const uint8_t D1 = 43; +static const uint8_t D2 = 45; +static const uint8_t D3 = 46; +static const uint8_t D4 = 47; +static const uint8_t D5 = 48; +static const uint8_t D6 = 18; +static const uint8_t D7 = 17; static const uint8_t D8 = 21; -static const uint8_t D9 = 14; -static const uint8_t D10 = 46; -static const uint8_t D11 = 3; -static const uint8_t D12 = 20; -static const uint8_t D13 = 19; +static const uint8_t D9 = 42; +static const uint8_t D10 = 41; +static const uint8_t D11 = 40; +static const uint8_t D12 = 38; +static const uint8_t D13 = 39; #endif /* Pins_Arduino_h */ From af47bd30089bee71849b634b97dd329e6564a10a 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 Jun 2025 09:59:56 +0200 Subject: [PATCH 160/290] fix(ci): Process only needed files in publish sizes (#11439) --- .github/workflows/publishsizes.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/workflows/publishsizes.yml b/.github/workflows/publishsizes.yml index 69c18cf1835..8ff591e052b 100644 --- a/.github/workflows/publishsizes.yml +++ b/.github/workflows/publishsizes.yml @@ -44,16 +44,17 @@ jobs: gh api "$artifacts_url" -q '.artifacts[] | [.name, .archive_download_url] | @tsv' | while read artifact do IFS=$'\t' read name url <<< "$artifact" - gh api $url > "$name.zip" - unzip -j "$name.zip" -d "temp_$name" - if [[ "$name" == "pr_number" ]]; then - mv "temp_$name"/* sizes-report - elif [[ "$name" == "pr_cli"* ]]; then - mv "temp_$name"/* sizes-report/pr - else - mv "temp_$name"/* sizes-report + # Only process pr_number and pr_cli_compile artifacts + if [[ "$name" == "pr_number" || "$name" =~ ^pr_cli_compile_[0-9]+$ ]]; then + gh api $url > "$name.zip" + unzip -o -j "$name.zip" -d "temp_$name" + if [[ "$name" == "pr_number" ]]; then + mv "temp_$name"/* sizes-report + elif [[ "$name" =~ ^pr_cli_compile_[0-9]+$ ]]; then + mv "temp_$name"/* sizes-report/pr + fi + rm -r "temp_$name" fi - rm -r "temp_$name" done echo "Contents of parent directory:" ls -R .. From 0007815a1148c7a3d24a3f6986739bc2b26eb5c7 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 10 Jun 2025 11:00:20 +0300 Subject: [PATCH 161/290] feat(p4): Add 32MB Flash Partitions to ESP32-P4 (#11453) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(p4): Add 32MB Flash Partitions to ESP32-P4 * feat(p4): Add 32MB flash size option --------- Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com> --- boards.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/boards.txt b/boards.txt index fefc6cdfb71..15a75eaad8b 100644 --- a/boards.txt +++ b/boards.txt @@ -282,6 +282,15 @@ esp32p4.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 esp32p4.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS) esp32p4.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB esp32p4.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 +esp32p4.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS) +esp32p4.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB +esp32p4.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592 +esp32p4.menu.PartitionScheme.app5M_little24M_32MB=32M Flash (4.8MB APP/22MB LittleFS) +esp32p4.menu.PartitionScheme.app5M_little24M_32MB.build.partitions=large_littlefs_32MB +esp32p4.menu.PartitionScheme.app5M_little24M_32MB.upload.maximum_size=4718592 +esp32p4.menu.PartitionScheme.app13M_data7M_32MB=32M Flash (13MB APP/6.75MB SPIFFS) +esp32p4.menu.PartitionScheme.app13M_data7M_32MB.build.partitions=default_32MB +esp32p4.menu.PartitionScheme.app13M_data7M_32MB.upload.maximum_size=13107200 esp32p4.menu.PartitionScheme.custom=Custom esp32p4.menu.PartitionScheme.custom.build.partitions= esp32p4.menu.PartitionScheme.custom.upload.maximum_size=16777216 @@ -314,6 +323,8 @@ esp32p4.menu.FlashSize.2M.build.flash_size=2MB esp32p4.menu.FlashSize.2M.build.partitions=minimal esp32p4.menu.FlashSize.16M=16MB (128Mb) esp32p4.menu.FlashSize.16M.build.flash_size=16MB +esp32p4.menu.FlashSize.32M=32MB (256Mb) +esp32p4.menu.FlashSize.32M.build.flash_size=32MB esp32p4.menu.UploadSpeed.921600=921600 esp32p4.menu.UploadSpeed.921600.upload.speed=921600 From 89ff4653286206be29fe49e3c333f14065801616 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 10 Jun 2025 05:19:32 -0300 Subject: [PATCH 162/290] feat(esptool): Upgrade to esptool v5 (#11433) * feat(esptool): Upgrade to esptool v5 * fix(script): Update script for better handling of esptool * fix(script): Get proper download url * fix(script): Apply copilot suggestions --- .github/scripts/update_esptool.py | 236 ++++++++++++++++++++++ package/package_esp32_index.template.json | 70 +++---- platform.txt | 12 +- 3 files changed, 277 insertions(+), 41 deletions(-) create mode 100644 .github/scripts/update_esptool.py diff --git a/.github/scripts/update_esptool.py b/.github/scripts/update_esptool.py new file mode 100644 index 00000000000..dd5de5526c3 --- /dev/null +++ b/.github/scripts/update_esptool.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python3 + +# This script is used to re-package the esptool if needed and update the JSON file +# for the Arduino ESP32 platform. +# +# The script has only been tested on macOS. +# +# For regular esptool releases, the generated packages already contain the correct permissions, +# extensions and are uploaded to the GitHub release assets. In this case, the script will only +# update the JSON file with the information from the GitHub release. +# +# The script can be used in two modes: +# 1. Local build: The build artifacts must be already downloaded and extracted in the base_folder. +# This is useful for esptool versions that are not yet released and that are grabbed from the +# GitHub build artifacts. +# 2. Release build: The script will get the release information from GitHub and update the JSON file. +# This is useful for esptool versions that are already released and that are uploaded to the +# GitHub release assets. +# +# For local build, the artifacts must be already downloaded and extracted in the base_folder +# set with the -l option. +# For example, a base folder "esptool" should contain the following folders extracted directly +# from the GitHub build artifacts: +# esptool/esptool-linux-aarch64 +# esptool/esptool-linux-amd64 +# esptool/esptool-linux-armv7 +# esptool/esptool-macos-amd64 +# esptool/esptool-macos-arm64 +# esptool/esptool-windows-amd64 + +import argparse +import json +import os +import shutil +import stat +import tarfile +import zipfile +import hashlib +import requests +from pathlib import Path + +def compute_sha256(filepath): + sha256 = hashlib.sha256() + with open(filepath, "rb") as f: + for block in iter(lambda: f.read(4096), b""): + sha256.update(block) + return f"SHA-256:{sha256.hexdigest()}" + +def get_file_size(filepath): + return os.path.getsize(filepath) + +def update_json_for_host(tmp_json_path, version, host, url, archiveFileName, checksum, size): + with open(tmp_json_path) as f: + data = json.load(f) + + for pkg in data.get("packages", []): + for tool in pkg.get("tools", []): + if tool.get("name") == "esptool_py": + tool["version"] = version + + if url is None: + # If the URL is not set, we need to find the old URL and update it + for system in tool.get("systems", []): + if system.get("host") == host: + url = system.get("url").replace(system.get("archiveFileName"), archiveFileName) + break + else: + print(f"No old URL found for host {host}. Using empty URL.") + url = "" + + # Preserve existing systems order and update or append the new system + systems = tool.get("systems", []) + system_updated = False + for i, system in enumerate(systems): + if system.get("host") == host: + systems[i] = { + "host": host, + "url": url, + "archiveFileName": archiveFileName, + "checksum": checksum, + "size": str(size), + } + system_updated = True + break + + if not system_updated: + systems.append({ + "host": host, + "url": url, + "archiveFileName": archiveFileName, + "checksum": checksum, + "size": str(size), + }) + tool["systems"] = systems + + with open(tmp_json_path, "w") as f: + json.dump(data, f, indent=2, sort_keys=False, ensure_ascii=False) + f.write("\n") + +def update_tools_dependencies(tmp_json_path, version): + with open(tmp_json_path) as f: + data = json.load(f) + + for pkg in data.get("packages", []): + for platform in pkg.get("platforms", []): + for dep in platform.get("toolsDependencies", []): + if dep.get("name") == "esptool_py": + dep["version"] = version + + with open(tmp_json_path, "w") as f: + json.dump(data, f, indent=2, sort_keys=False, ensure_ascii=False) + f.write("\n") + +def create_archives(version, base_folder): + archive_files = [] + + for dirpath in Path(base_folder).glob("esptool-*"): + if not dirpath.is_dir(): + continue + + base = dirpath.name[len("esptool-"):] + + if "windows" in dirpath.name: + zipfile_name = f"esptool-v{version}-{base}.zip" + print(f"Creating {zipfile_name} from {dirpath} ...") + with zipfile.ZipFile(zipfile_name, "w", zipfile.ZIP_DEFLATED) as zipf: + for root, _, files in os.walk(dirpath): + for file in files: + full_path = os.path.join(root, file) + zipf.write(full_path, os.path.relpath(full_path, start=dirpath)) + archive_files.append(zipfile_name) + else: + tarfile_name = f"esptool-v{version}-{base}.tar.gz" + print(f"Creating {tarfile_name} from {dirpath} ...") + for root, dirs, files in os.walk(dirpath): + for name in dirs + files: + os.chmod(os.path.join(root, name), stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR | + stat.S_IRGRP | stat.S_IXGRP | + stat.S_IROTH | stat.S_IXOTH) + with tarfile.open(tarfile_name, "w:gz") as tar: + tar.add(dirpath, arcname=dirpath.name) + archive_files.append(tarfile_name) + + return archive_files + +def determine_hosts(archive_name): + if "linux-amd64" in archive_name: + return ["x86_64-pc-linux-gnu"] + elif "linux-armv7" in archive_name: + return ["arm-linux-gnueabihf"] + elif "linux-aarch64" in archive_name: + return ["aarch64-linux-gnu"] + elif "macos-amd64" in archive_name: + return ["x86_64-apple-darwin"] + elif "macos-arm64" in archive_name: + return ["arm64-apple-darwin"] + elif "windows-amd64" in archive_name: + return ["x86_64-mingw32", "i686-mingw32"] + else: + return [] + +def update_json_from_local_build(tmp_json_path, version, base_folder, archive_files): + for archive in archive_files: + print(f"Processing archive: {archive}") + hosts = determine_hosts(archive) + if not hosts: + print(f"Skipping unknown archive type: {archive}") + continue + + archive_path = Path(archive) + checksum = compute_sha256(archive_path) + size = get_file_size(archive_path) + + for host in hosts: + update_json_for_host(tmp_json_path, version, host, None, archive_path.name, checksum, size) + +def update_json_from_release(tmp_json_path, version, release_info): + assets = release_info.get("assets", []) + for asset in assets: + if (asset.get("name").endswith(".tar.gz") or asset.get("name").endswith(".zip")) and "esptool" in asset.get("name"): + asset_fname = asset.get("name") + print(f"Processing asset: {asset_fname}") + hosts = determine_hosts(asset_fname) + if not hosts: + print(f"Skipping unknown archive type: {asset_fname}") + continue + + asset_url = asset.get("browser_download_url") + asset_checksum = asset.get("digest") + asset_size = asset.get("size") + if asset_checksum is None: + asset_checksum = "" + print(f"Asset {asset_fname} has no checksum. Please set the checksum in the JSON file.") + + for host in hosts: + update_json_for_host(tmp_json_path, version, host, asset_url, asset_fname, asset_checksum, asset_size) + +def get_release_info(version): + url = f"https://api.github.com/repos/espressif/esptool/releases/tags/v{version}" + response = requests.get(url) + response.raise_for_status() + return response.json() + +def main(): + parser = argparse.ArgumentParser(description="Repack esptool and update JSON metadata.") + parser.add_argument("version", help="Version of the esptool (e.g. 5.0.dev1)") + parser.add_argument("-l", "--local", dest="base_folder", help="Enable local build mode and set the base folder with unpacked artifacts") + args = parser.parse_args() + + script_dir = Path(__file__).resolve().parent + json_path = (script_dir / "../../package/package_esp32_index.template.json").resolve() + tmp_json_path = Path(str(json_path) + ".tmp") + shutil.copy(json_path, tmp_json_path) + + local_build = args.base_folder is not None + + if local_build: + os.chdir(args.base_folder) + os.environ['COPYFILE_DISABLE'] = 'true' # this disables including resource forks in tar files on macOS + # Clear any existing archive files + for file in Path(args.base_folder).glob("esptool-*.*"): + file.unlink() + archive_files = create_archives(args.version, args.base_folder) + update_json_from_local_build(tmp_json_path, args.version, args.base_folder, archive_files) + else: + release_info = get_release_info(args.version) + update_json_from_release(tmp_json_path, args.version, release_info) + + print(f"Updating esptool version fields to {args.version}") + update_tools_dependencies(tmp_json_path, args.version) + + shutil.move(tmp_json_path, json_path) + print(f"Done. JSON updated at {json_path}") + +if __name__ == "__main__": + main() diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index eecc7c10788..3ae2ff09ee6 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -81,7 +81,7 @@ { "packager": "esp32", "name": "esptool_py", - "version": "4.9.dev3" + "version": "5.0.dev1" }, { "packager": "esp32", @@ -469,56 +469,56 @@ }, { "name": "esptool_py", - "version": "4.9.dev3", + "version": "5.0.dev1", "systems": [ { - "host": "x86_64-pc-linux-gnu", - "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": "aarch64-linux-gnu", + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-linux-aarch64.tar.gz", + "archiveFileName": "esptool-v5.0.dev1-linux-aarch64.tar.gz", + "checksum": "SHA-256:bfafa7a7723ebbabfd8b6e3ca5ae00bfead0331de923754aeddb43b2c116a078", + "size": "58241736" }, { - "host": "arm-linux-gnueabihf", - "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": "x86_64-pc-linux-gnu", + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-linux-amd64.tar.gz", + "archiveFileName": "esptool-v5.0.dev1-linux-amd64.tar.gz", + "checksum": "SHA-256:acd0486e96586b99d053a1479acbbbfcae8667227c831cdc53a171f9ccfa27ee", + "size": "100740042" }, { - "host": "aarch64-linux-gnu", - "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": "arm-linux-gnueabihf", + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-linux-armv7.tar.gz", + "archiveFileName": "esptool-v5.0.dev1-linux-armv7.tar.gz", + "checksum": "SHA-256:ea77a38681506761bbb7b0b39c130811ed565667b67ebbdb4d6dcc6cb6e07368", + "size": "53451939" }, { "host": "x86_64-apple-darwin", - "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" + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-macos-amd64.tar.gz", + "archiveFileName": "esptool-v5.0.dev1-macos-amd64.tar.gz", + "checksum": "SHA-256:900a8e90731208bee96647e0e207a43612b9452c2120c4fdc0ff4c6be226257b", + "size": "59631998" }, { "host": "arm64-apple-darwin", - "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" + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-macos-arm64.tar.gz", + "archiveFileName": "esptool-v5.0.dev1-macos-arm64.tar.gz", + "checksum": "SHA-256:3653f4de73cb4fc6a25351eaf663708e91c65ae3265d75bd54ca4315a4350bb4", + "size": "56349992" }, { - "host": "i686-mingw32", - "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.2.0/esptool-v5.0.dev1-win64.zip", + "archiveFileName": "esptool-v5.0.dev1-win64.zip", + "checksum": "SHA-256:1e8fd89645daf94f2d4406ec73c9004e617ea921079515f9fd749205eece4d6d", + "size": "59102658" }, { - "host": "x86_64-mingw32", - "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": "i686-mingw32", + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-win64.zip", + "archiveFileName": "esptool-v5.0.dev1-win64.zip", + "checksum": "SHA-256:1e8fd89645daf94f2d4406ec73c9004e617ea921079515f9fd749205eece4d6d", + "size": "59102658" } ] }, diff --git a/platform.txt b/platform.txt index f41a8b4a764..8bfa69a79e0 100644 --- a/platform.txt +++ b/platform.txt @@ -120,7 +120,7 @@ recipe.hooks.prebuild.2.pattern.windows=cmd /c if not exist "{build.path}\partit recipe.hooks.prebuild.3.pattern.windows=cmd /c if not exist "{build.path}\partitions.csv" COPY "{runtime.platform.path}\tools\partitions\{build.partitions}.csv" "{build.path}\partitions.csv" # Check if custom bootloader exist: source > variant > build.boot -recipe.hooks.prebuild.4.pattern_args=--chip {build.mcu} elf2image --flash_mode {build.flash_mode} --flash_freq {build.img_freq} --flash_size {build.flash_size} -o +recipe.hooks.prebuild.4.pattern_args=--chip {build.mcu} elf2image --flash-mode {build.flash_mode} --flash-freq {build.img_freq} --flash-size {build.flash_size} -o recipe.hooks.prebuild.4.pattern=/usr/bin/env bash -c "[ -f "{build.source.path}"/bootloader.bin ] && cp -f "{build.source.path}"/bootloader.bin "{build.path}"/{build.project_name}.bootloader.bin || ( [ -f "{build.variant.path}"/{build.custom_bootloader}.bin ] && cp "{build.variant.path}"/{build.custom_bootloader}.bin "{build.path}"/{build.project_name}.bootloader.bin || "{tools.esptool_py.path}"/{tools.esptool_py.cmd} {recipe.hooks.prebuild.4.pattern_args} "{build.path}"/{build.project_name}.bootloader.bin "{compiler.sdk.path}"/bin/bootloader_{build.boot}_{build.boot_freq}.elf )" recipe.hooks.prebuild.4.pattern.windows=cmd /c IF EXIST "{build.source.path}\bootloader.bin" ( COPY /y "{build.source.path}\bootloader.bin" "{build.path}\{build.project_name}.bootloader.bin" ) ELSE ( IF EXIST "{build.variant.path}\{build.custom_bootloader}.bin" ( COPY "{build.variant.path}\{build.custom_bootloader}.bin" "{build.path}\{build.project_name}.bootloader.bin" ) ELSE ( "{tools.esptool_py.path}\{tools.esptool_py.cmd}" {recipe.hooks.prebuild.4.pattern_args} "{build.path}\{build.project_name}.bootloader.bin" "{compiler.sdk.path}\bin\bootloader_{build.boot}_{build.boot_freq}.elf" ) ) @@ -164,7 +164,7 @@ recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.f recipe.objcopy.partitions.bin.pattern={tools.gen_esp32part.cmd} -q "{build.path}/partitions.csv" "{build.path}/{build.project_name}.partitions.bin" ## Create bin -recipe.objcopy.bin.pattern_args=--chip {build.mcu} elf2image --flash_mode "{build.flash_mode}" --flash_freq "{build.img_freq}" --flash_size "{build.flash_size}" --elf-sha256-offset 0xb0 -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf" +recipe.objcopy.bin.pattern_args=--chip {build.mcu} elf2image --flash-mode "{build.flash_mode}" --flash-freq "{build.img_freq}" --flash-size "{build.flash_size}" --elf-sha256-offset 0xb0 -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf" recipe.objcopy.bin.pattern="{tools.esptool_py.path}/{tools.esptool_py.cmd}" {recipe.objcopy.bin.pattern_args} ## Create Insights Firmware Package @@ -177,7 +177,7 @@ recipe.hooks.objcopy.postobjcopy.2.pattern=/usr/bin/env bash -c "[ ! -d "{build. recipe.hooks.objcopy.postobjcopy.2.pattern.windows=cmd /c if exist "{build.path}\libraries\ESP_SR" if exist "{compiler.sdk.path}\esp_sr\srmodels.bin" COPY /y "{compiler.sdk.path}\esp_sr\srmodels.bin" "{build.path}\srmodels.bin" # Create merged binary -recipe.hooks.objcopy.postobjcopy.3.pattern_args=--chip {build.mcu} merge_bin -o "{build.path}/{build.project_name}.merged.bin" --fill-flash-size {build.flash_size} --flash_mode keep --flash_freq keep --flash_size keep {build.bootloader_addr} "{build.path}/{build.project_name}.bootloader.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x10000 "{build.path}/{build.project_name}.bin" +recipe.hooks.objcopy.postobjcopy.3.pattern_args=--chip {build.mcu} merge-bin -o "{build.path}/{build.project_name}.merged.bin" --pad-to-size {build.flash_size} --flash-mode keep --flash-freq keep --flash-size keep {build.bootloader_addr} "{build.path}/{build.project_name}.bootloader.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x10000 "{build.path}/{build.project_name}.bin" recipe.hooks.objcopy.postobjcopy.3.pattern="{tools.esptool_py.path}/{tools.esptool_py.cmd}" {recipe.hooks.objcopy.postobjcopy.3.pattern_args} ## Save bin @@ -294,14 +294,14 @@ debug.additional_config=debug_config.{build.mcu} tools.esptool_py.upload.protocol=serial tools.esptool_py.upload.params.verbose= tools.esptool_py.upload.params.quiet= -tools.esptool_py.upload.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset write_flash {upload.erase_cmd} -z --flash_mode keep --flash_freq keep --flash_size keep {build.bootloader_addr} "{build.path}/{build.project_name}.bootloader.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x10000 "{build.path}/{build.project_name}.bin" {upload.extra_flags} +tools.esptool_py.upload.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default-reset --after hard-reset write-flash {upload.erase_cmd} -z --flash-mode keep --flash-freq keep --flash-size keep {build.bootloader_addr} "{build.path}/{build.project_name}.bootloader.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x10000 "{build.path}/{build.project_name}.bin" {upload.extra_flags} tools.esptool_py.upload.pattern="{path}/{cmd}" {upload.pattern_args} ## Program Application ## ------------------- tools.esptool_py.program.params.verbose= tools.esptool_py.program.params.quiet= -tools.esptool_py.program.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset write_flash -z --flash_mode keep --flash_freq keep --flash_size keep 0x10000 "{build.path}/{build.project_name}.bin" +tools.esptool_py.program.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default-reset --after hard-reset write-flash -z --flash-mode keep --flash-freq keep --flash-size keep 0x10000 "{build.path}/{build.project_name}.bin" tools.esptool_py.program.pattern="{path}/{cmd}" {program.pattern_args} ## Erase Chip (before burning the bootloader) @@ -309,7 +309,7 @@ tools.esptool_py.program.pattern="{path}/{cmd}" {program.pattern_args} tools.esptool_py.erase.protocol=serial tools.esptool_py.erase.params.verbose= tools.esptool_py.erase.params.quiet= -tools.esptool_py.erase.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset erase_flash +tools.esptool_py.erase.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default-reset --after hard-reset erase-flash tools.esptool_py.erase.pattern="{path}/{cmd}" {erase.pattern_args} ## Burn Bootloader From 0aada091e1afb56bb4e2103297233b17a9463bde 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 Jun 2025 10:31:17 +0200 Subject: [PATCH 163/290] feat(zigbee): Support min/max setting for Analog EP (#11451) * feat(zigbee): Support min max for Analog EP * feat(zigbee): Use cfloat FLT_MAX * 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_Analog_Input_Output.ino | 3 + libraries/Zigbee/src/ep/ZigbeeAnalog.cpp | 84 +++++++++++++++++++ libraries/Zigbee/src/ep/ZigbeeAnalog.h | 4 + 3 files changed, 91 insertions(+) diff --git a/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino index 59c4b514db1..f1cc54bda64 100644 --- a/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino +++ b/libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino @@ -72,6 +72,9 @@ void setup() { zbAnalogDevice.setAnalogOutputDescription("Fan Speed (RPM)"); zbAnalogDevice.setAnalogOutputResolution(1); + // Set the min and max values for the analog output which is used by HA to limit the range of the analog output + zbAnalogDevice.setAnalogOutputMinMax(-10000, 10000); //-10000 to 10000 RPM + // If analog output cluster is added, set callback function for analog output change zbAnalogDevice.onAnalogOutputChange(onAnalogOutputChange); diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp index 893a9854ecc..309739d54c9 100644 --- a/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.cpp @@ -1,5 +1,6 @@ #include "ZigbeeAnalog.h" #if CONFIG_ZB_ENABLED +#include ZigbeeAnalog::ZigbeeAnalog(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID; @@ -20,6 +21,8 @@ bool ZigbeeAnalog::addAnalogInput() { "Analog Input"; uint32_t application_type = 0x00000000 | (ESP_ZB_ZCL_AI_GROUP_ID << 24); float resolution = 0.1; // Default resolution of 0.1 + float min = -FLT_MAX; // Default min value for float + float max = FLT_MAX; // Default max value for float esp_err_t ret = esp_zb_analog_input_cluster_add_attr(esp_zb_analog_input_cluster, ESP_ZB_ZCL_ATTR_ANALOG_INPUT_DESCRIPTION_ID, (void *)default_description); if (ret != ESP_OK) { @@ -39,11 +42,24 @@ bool ZigbeeAnalog::addAnalogInput() { return false; } + ret = esp_zb_analog_input_cluster_add_attr(esp_zb_analog_input_cluster, ESP_ZB_ZCL_ATTR_ANALOG_INPUT_MIN_PRESENT_VALUE_ID, (void *)&min); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + + ret = esp_zb_analog_input_cluster_add_attr(esp_zb_analog_input_cluster, ESP_ZB_ZCL_ATTR_ANALOG_INPUT_MAX_PRESENT_VALUE_ID, (void *)&max); + if (ret != ESP_OK) { + log_e("Failed to set max value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_list_add_analog_input_cluster(_cluster_list, esp_zb_analog_input_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); if (ret != ESP_OK) { log_e("Failed to add Analog Input cluster: 0x%x: %s", ret, esp_err_to_name(ret)); return false; } + _analog_clusters |= ANALOG_INPUT; return true; } @@ -76,6 +92,8 @@ bool ZigbeeAnalog::addAnalogOutput() { "Analog Output"; uint32_t application_type = 0x00000000 | (ESP_ZB_ZCL_AO_GROUP_ID << 24); float resolution = 1; // Default resolution of 1 + float min = -FLT_MAX; // Default min value for float + float max = FLT_MAX; // Default max value for float esp_err_t ret = esp_zb_analog_output_cluster_add_attr(esp_zb_analog_output_cluster, ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_DESCRIPTION_ID, (void *)default_description); @@ -96,6 +114,18 @@ bool ZigbeeAnalog::addAnalogOutput() { return false; } + ret = esp_zb_analog_output_cluster_add_attr(esp_zb_analog_output_cluster, ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_MIN_PRESENT_VALUE_ID, (void *)&min); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + + ret = esp_zb_analog_output_cluster_add_attr(esp_zb_analog_output_cluster, ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_MAX_PRESENT_VALUE_ID, (void *)&max); + if (ret != ESP_OK) { + log_e("Failed to set max value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + ret = esp_zb_cluster_list_add_analog_output_cluster(_cluster_list, esp_zb_analog_output_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); if (ret != ESP_OK) { log_e("Failed to add Analog Output cluster: 0x%x: %s", ret, esp_err_to_name(ret)); @@ -376,4 +406,58 @@ bool ZigbeeAnalog::setAnalogOutputResolution(float resolution) { return true; } +bool ZigbeeAnalog::setAnalogOutputMinMax(float min, float max) { + if (!(_analog_clusters & ANALOG_OUTPUT)) { + log_e("Analog Output cluster not added"); + return false; + } + + esp_zb_attribute_list_t *analog_output_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + if (analog_output_cluster == nullptr) { + log_e("Failed to get analog output cluster"); + return false; + } + + esp_err_t ret = esp_zb_cluster_update_attr(analog_output_cluster, ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_MIN_PRESENT_VALUE_ID, (void *)&min); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + + ret = esp_zb_cluster_update_attr(analog_output_cluster, ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_MAX_PRESENT_VALUE_ID, (void *)&max); + if (ret != ESP_OK) { + log_e("Failed to set max value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +bool ZigbeeAnalog::setAnalogInputMinMax(float min, float max) { + if (!(_analog_clusters & ANALOG_INPUT)) { + log_e("Analog Input cluster not added"); + return false; + } + + esp_zb_attribute_list_t *analog_input_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_INPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + if (analog_input_cluster == nullptr) { + log_e("Failed to get analog input cluster"); + return false; + } + + esp_err_t ret = esp_zb_cluster_update_attr(analog_input_cluster, ESP_ZB_ZCL_ATTR_ANALOG_INPUT_MIN_PRESENT_VALUE_ID, (void *)&min); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + + ret = esp_zb_cluster_update_attr(analog_input_cluster, ESP_ZB_ZCL_ATTR_ANALOG_INPUT_MAX_PRESENT_VALUE_ID, (void *)&max); + if (ret != ESP_OK) { + log_e("Failed to set max value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeAnalog.h b/libraries/Zigbee/src/ep/ZigbeeAnalog.h index bbc5f6d6fc2..5218a0b7d60 100644 --- a/libraries/Zigbee/src/ep/ZigbeeAnalog.h +++ b/libraries/Zigbee/src/ep/ZigbeeAnalog.h @@ -41,6 +41,10 @@ class ZigbeeAnalog : public ZigbeeEP { bool setAnalogOutputDescription(const char *description); bool setAnalogOutputResolution(float resolution); + // Set the min and max values for the analog Input/Output + bool setAnalogOutputMinMax(float min, float max); + bool setAnalogInputMinMax(float min, float max); + // Use to set a cb function to be called on analog output change void onAnalogOutputChange(void (*callback)(float analog)) { _on_analog_output_change = callback; From d6a76da0a5134bce8dfd4961af7e9c828bf21328 Mon Sep 17 00:00:00 2001 From: Niki Waibel Date: Tue, 10 Jun 2025 10:55:43 +0200 Subject: [PATCH 164/290] fix(libraries/asyncudp): IPv4 ONLY listenMulticast() (#11444) AsyncUDP::listenMulticast() properly receives packets sent to IPv4 multicast addresses like 239.1.2.3, but it is not receiving packets sent to IPv6 multicast addresses like ff12::6ood:cafe. The root cause is a bit hidden: listen(NULL, port) would match AsyncUDP::listen(const ip_addr_t *addr, uint16_t port), which calls _udp_bind(_pcb, addr, port), which uses the lwIP API to call udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) at the end. If lwIP has LWIP_IPV4 enabled, it checks if ipaddr == NULL and sets it to IP4_ADDR_ANY. So an IPv6 address is never bound. This fix checks the IP address passed to AsyncUDP::listenMulticast(). If it is an IPv6 address, it constructs and passes the IPv6 any address (::); otherwise (IPv4), it constructs and passes the IPv4 any address (0.0.0.0). --- libraries/AsyncUDP/src/AsyncUDP.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/libraries/AsyncUDP/src/AsyncUDP.cpp b/libraries/AsyncUDP/src/AsyncUDP.cpp index f44cc839c97..cab9c951921 100644 --- a/libraries/AsyncUDP/src/AsyncUDP.cpp +++ b/libraries/AsyncUDP/src/AsyncUDP.cpp @@ -682,6 +682,8 @@ static esp_err_t joinMulticastGroup(const ip_addr_t *addr, bool join, tcpip_adap } bool AsyncUDP::listenMulticast(const ip_addr_t *addr, uint16_t port, uint8_t ttl, tcpip_adapter_if_t tcpip_if) { + ip_addr_t bind_addr; + if (!ip_addr_ismulticast(addr)) { return false; } @@ -690,7 +692,18 @@ bool AsyncUDP::listenMulticast(const ip_addr_t *addr, uint16_t port, uint8_t ttl return false; } - if (!listen(NULL, port)) { +#if CONFIG_LWIP_IPV6 + if (IP_IS_V6(addr)) { + IP_SET_TYPE(&bind_addr, IPADDR_TYPE_V6); + ip6_addr_set_any(&bind_addr.u_addr.ip6); + } else { +#endif + IP_SET_TYPE(&bind_addr, IPADDR_TYPE_V4); + ip4_addr_set_any(&bind_addr.u_addr.ip4); +#if CONFIG_LWIP_IPV6 + } +#endif + if (!listen(&bind_addr, port)) { return false; } From cbdaee6f52b78fa747693dbb718c2cafe99015b0 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 Jun 2025 11:57:07 +0200 Subject: [PATCH 165/290] feat(ledc): Improve timer management with frequency/resolution matching (#11452) * feat(ledc): Improve timer management with frequency/resolution matching * fix(ci): Fix uninitialized timer variable warning * Update cores/esp32/esp32-hal-ledc.c 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> --- cores/esp32/esp32-hal-ledc.c | 124 +++++++++++++++++++++++++++++++---- cores/esp32/esp32-hal-ledc.h | 2 + 2 files changed, 115 insertions(+), 11 deletions(-) diff --git a/cores/esp32/esp32-hal-ledc.c b/cores/esp32/esp32-hal-ledc.c index 039fa1312f1..764c2803b4b 100644 --- a/cores/esp32/esp32-hal-ledc.c +++ b/cores/esp32/esp32-hal-ledc.c @@ -45,6 +45,93 @@ typedef struct { ledc_periph_t ledc_handle = {0}; +// Helper function to find a timer with matching frequency and resolution +static bool find_matching_timer(uint8_t speed_mode, uint32_t freq, uint8_t resolution, uint8_t *timer_num) { + log_d("Searching for timer with freq=%u, resolution=%u", freq, resolution); + // Check all channels to find one with matching frequency and resolution + for (uint8_t i = 0; i < SOC_GPIO_PIN_COUNT; i++) { + if (!perimanPinIsValid(i)) { + continue; + } + peripheral_bus_type_t type = perimanGetPinBusType(i); + if (type == ESP32_BUS_TYPE_LEDC) { + ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(i, ESP32_BUS_TYPE_LEDC); + if (bus != NULL && (bus->channel / 8) == speed_mode && bus->freq_hz == freq && bus->channel_resolution == resolution) { + log_d("Found matching timer %u for freq=%u, resolution=%u", bus->timer_num, freq, resolution); + *timer_num = bus->timer_num; + return true; + } + } + } + log_d("No matching timer found for freq=%u, resolution=%u", freq, resolution); + return false; +} + +// Helper function to find an unused timer +static bool find_free_timer(uint8_t speed_mode, uint8_t *timer_num) { + // Check which timers are in use + uint8_t used_timers = 0; + for (uint8_t i = 0; i < SOC_GPIO_PIN_COUNT; i++) { + if (!perimanPinIsValid(i)) { + continue; + } + peripheral_bus_type_t type = perimanGetPinBusType(i); + if (type == ESP32_BUS_TYPE_LEDC) { + ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(i, ESP32_BUS_TYPE_LEDC); + if (bus != NULL && (bus->channel / 8) == speed_mode) { + log_d("Timer %u is in use by channel %u", bus->timer_num, bus->channel); + used_timers |= (1 << bus->timer_num); + } + } + } + + // Find first unused timer + for (uint8_t i = 0; i < SOC_LEDC_TIMER_NUM; i++) { + if (!(used_timers & (1 << i))) { + log_d("Found free timer %u", i); + *timer_num = i; + return true; + } + } + log_e("No free timers available"); + return false; +} + +// Helper function to remove a channel from a timer and clear timer if no channels are using it +static void remove_channel_from_timer(uint8_t speed_mode, uint8_t timer_num, uint8_t channel) { + log_d("Removing channel %u from timer %u in speed_mode %u", channel, timer_num, speed_mode); + + // Check if any other channels are using this timer + bool timer_in_use = false; + for (uint8_t i = 0; i < SOC_GPIO_PIN_COUNT; i++) { + if (!perimanPinIsValid(i)) { + continue; + } + peripheral_bus_type_t type = perimanGetPinBusType(i); + if (type == ESP32_BUS_TYPE_LEDC) { + ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(i, ESP32_BUS_TYPE_LEDC); + if (bus != NULL && (bus->channel / 8) == speed_mode && bus->timer_num == timer_num && bus->channel != channel) { + log_d("Timer %u is still in use by channel %u", timer_num, bus->channel); + timer_in_use = true; + break; + } + } + } + + if (!timer_in_use) { + log_d("No other channels using timer %u, deconfiguring timer", timer_num); + // Stop the timer + ledc_timer_pause(speed_mode, timer_num); + // Deconfigure the timer + ledc_timer_config_t ledc_timer; + memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t)); + ledc_timer.speed_mode = speed_mode; + ledc_timer.timer_num = timer_num; + ledc_timer.deconfigure = true; + ledc_timer_config(&ledc_timer); + } +} + static bool fade_initialized = false; static ledc_clk_cfg_t clock_source = LEDC_DEFAULT_CLK; @@ -81,6 +168,8 @@ static bool ledcDetachBus(void *bus) { } pinMatrixOutDetach(handle->pin, false, false); if (!channel_found) { + uint8_t group = (handle->channel / 8); + remove_channel_from_timer(group, handle->timer_num, handle->channel % 8); ledc_handle.used_channels &= ~(1UL << handle->channel); } free(handle); @@ -117,8 +206,10 @@ bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t c return false; } - uint8_t group = (channel / 8), timer = ((channel / 2) % 4); + uint8_t group = (channel / 8); + uint8_t timer = 0; bool channel_used = ledc_handle.used_channels & (1UL << channel); + if (channel_used) { log_i("Channel %u is already set up, given frequency and resolution will be ignored", channel); if (ledc_set_pin(pin, group, channel % 8) != ESP_OK) { @@ -126,17 +217,26 @@ bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t c return false; } } else { - ledc_timer_config_t ledc_timer; - memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t)); - ledc_timer.speed_mode = group; - ledc_timer.timer_num = timer; - ledc_timer.duty_resolution = resolution; - ledc_timer.freq_hz = freq; - ledc_timer.clk_cfg = clock_source; + // Find a timer with matching frequency and resolution, or a free timer + if (!find_matching_timer(group, freq, resolution, &timer)) { + if (!find_free_timer(group, &timer)) { + log_e("No free timers available for speed mode %u", group); + return false; + } - if (ledc_timer_config(&ledc_timer) != ESP_OK) { - log_e("ledc setup failed!"); - return false; + // Configure the timer if we're using a new one + ledc_timer_config_t ledc_timer; + memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t)); + ledc_timer.speed_mode = group; + ledc_timer.timer_num = timer; + ledc_timer.duty_resolution = resolution; + ledc_timer.freq_hz = freq; + ledc_timer.clk_cfg = clock_source; + + if (ledc_timer_config(&ledc_timer) != ESP_OK) { + log_e("ledc setup failed!"); + return false; + } } uint32_t duty = ledc_get_duty(group, (channel % 8)); @@ -157,6 +257,8 @@ bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t c ledc_channel_handle_t *handle = (ledc_channel_handle_t *)malloc(sizeof(ledc_channel_handle_t)); handle->pin = pin; handle->channel = channel; + handle->timer_num = timer; + handle->freq_hz = freq; #ifndef SOC_LEDC_SUPPORT_FADE_STOP handle->lock = NULL; #endif diff --git a/cores/esp32/esp32-hal-ledc.h b/cores/esp32/esp32-hal-ledc.h index 5b44aaad452..f1a27dd4f7a 100644 --- a/cores/esp32/esp32-hal-ledc.h +++ b/cores/esp32/esp32-hal-ledc.h @@ -51,6 +51,8 @@ typedef struct { uint8_t pin; // Pin assigned to channel uint8_t channel; // Channel number uint8_t channel_resolution; // Resolution of channel + uint8_t timer_num; // Timer number used by this channel + uint32_t freq_hz; // Frequency configured for this channel voidFuncPtr fn; void *arg; #ifndef SOC_LEDC_SUPPORT_FADE_STOP From c21ef70a156aa0071f00ee6d7a00e0be2d0aa17e Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 10 Jun 2025 07:09:27 -0300 Subject: [PATCH 166/290] fix(release): Replace all assets with chinese mirrors (#11323) * fix(release): Replace all assets with chinese mirrors * feat(release): Add script to append "-cn" to versions * docs(install): Add instructions for users in China --- .github/scripts/on-release.sh | 10 +++-- .github/scripts/release_append_cn.py | 56 ++++++++++++++++++++++++++++ docs/en/installing.rst | 2 + 3 files changed, 64 insertions(+), 4 deletions(-) create mode 100755 .github/scripts/release_append_cn.py diff --git a/.github/scripts/on-release.sh b/.github/scripts/on-release.sh index dafbf3d6a1c..275c74f8ea5 100755 --- a/.github/scripts/on-release.sh +++ b/.github/scripts/on-release.sh @@ -342,12 +342,14 @@ jq_arg=".packages[0].platforms[0].version = \"$RELEASE_TAG\" | \ echo "Generating $PACKAGE_JSON_DEV ..." cat "$PACKAGE_JSON_TEMPLATE" | jq "$jq_arg" > "$OUTPUT_DIR/$PACKAGE_JSON_DEV" # On MacOS the sed command won't skip the first match. Use gsed instead. -sed '0,/github\.com\/espressif\//!s|github\.com/espressif/|dl.espressif.cn/github_assets/espressif/|g' "$OUTPUT_DIR/$PACKAGE_JSON_DEV" > "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN" +sed '0,/github\.com\//!s|github\.com/|dl.espressif.cn/github_assets/|g' "$OUTPUT_DIR/$PACKAGE_JSON_DEV" > "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN" +python "$SCRIPTS_DIR/release_append_cn.py" "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN" if [ "$RELEASE_PRE" == "false" ]; then echo "Generating $PACKAGE_JSON_REL ..." cat "$PACKAGE_JSON_TEMPLATE" | jq "$jq_arg" > "$OUTPUT_DIR/$PACKAGE_JSON_REL" # On MacOS the sed command won't skip the first match. Use gsed instead. - sed '0,/github\.com\/espressif\//!s|github\.com/espressif/|dl.espressif.cn/github_assets/espressif/|g' "$OUTPUT_DIR/$PACKAGE_JSON_REL" > "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN" + sed '0,/github\.com\//!s|github\.com/|dl.espressif.cn/github_assets/|g' "$OUTPUT_DIR/$PACKAGE_JSON_REL" > "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN" + python "$SCRIPTS_DIR/release_append_cn.py" "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN" fi # Figure out the last release or pre-release @@ -456,14 +458,14 @@ 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 CN URL: $(git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN")" -echo "Pages CN URL: $(git_safe_upload_to_pages "$PACKAGE_JSON_DEV" "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN")" +echo "Pages CN URL: $(git_safe_upload_to_pages "$PACKAGE_JSON_DEV_CN" "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN")" 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 CN URL: $(git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN")" - echo "Pages CN URL: $(git_safe_upload_to_pages "$PACKAGE_JSON_REL" "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN")" + echo "Pages CN URL: $(git_safe_upload_to_pages "$PACKAGE_JSON_REL_CN" "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN")" echo fi diff --git a/.github/scripts/release_append_cn.py b/.github/scripts/release_append_cn.py new file mode 100755 index 00000000000..b29fe0c31ba --- /dev/null +++ b/.github/scripts/release_append_cn.py @@ -0,0 +1,56 @@ + +#!/usr/bin/env python3 + +# Arduino IDE provides by default a package file for the ESP32. This causes version conflicts +# when the user tries to use the JSON file with the Chinese mirrors. +# +# The downside is that the Arduino IDE will always warn the user that updates are available as it +# will consider the version from the Chinese mirrors as a pre-release version. +# +# This script is used to append "-cn" to all versions in the package_esp32_index_cn.json file so that +# the user can select the Chinese mirrors without conflicts. +# +# If Arduino ever stops providing the package_esp32_index.json file by default, +# this script can be removed and the tags reverted. + +import json + +def append_cn_to_versions(obj): + if isinstance(obj, dict): + # dfu-util comes from arduino.cc and not from the Chinese mirrors, so we skip it + if obj.get("name") == "dfu-util": + return + + for key, value in obj.items(): + if key == "version" and isinstance(value, str): + if not value.endswith("-cn"): + obj[key] = value + "-cn" + else: + append_cn_to_versions(value) + + elif isinstance(obj, list): + for item in obj: + append_cn_to_versions(item) + +def process_json_file(input_path, output_path=None): + with open(input_path, "r", encoding="utf-8") as f: + data = json.load(f) + + append_cn_to_versions(data) + + if output_path is None: + output_path = input_path + + with open(output_path, "w", encoding="utf-8") as f: + json.dump(data, f, indent=2) + + print(f"Updated JSON written to {output_path}") + +if __name__ == "__main__": + import sys + if len(sys.argv) < 2: + print("Usage: python release_append_cn.py input.json [output.json]") + else: + input_file = sys.argv[1] + output_file = sys.argv[2] if len(sys.argv) > 2 else None + process_json_file(input_file, output_file) diff --git a/docs/en/installing.rst b/docs/en/installing.rst index 35342020864..3ca0881c398 100644 --- a/docs/en/installing.rst +++ b/docs/en/installing.rst @@ -70,6 +70,8 @@ To start the installation process using the Boards Manager, follow these steps: :figclass: align-center - Open Boards Manager from Tools > Board menu and install *esp32* platform (and do not forget to select your ESP32 board from Tools > Board menu after installation). + Users in China must select the package version with the "-cn" suffix and perform updates manually. + Automatic updates are not supported in this region, as they target the default package without the "-cn" suffix, resulting in download failures. .. figure:: ../_static/install_guide_boards_manager_esp32.png :align: center From d71135e2ca72cef49ea417d00ae821b35cf95da3 Mon Sep 17 00:00:00 2001 From: whatsABetterNick Date: Tue, 10 Jun 2025 18:27:47 +0800 Subject: [PATCH 167/290] Fix(I2S example): make fix to the ESP32 I2S simple tone example (#10954) * made some fix to the ESP32 I2S simple tone example * edit the I2S - simple tone example * edit the I2S - simple tone example * some edit * edit comment * edit * edit * 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/Simple_tone/Simple_tone.ino | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/libraries/ESP_I2S/examples/Simple_tone/Simple_tone.ino b/libraries/ESP_I2S/examples/Simple_tone/Simple_tone.ino index 935aa4bc50f..bba7d4f4d9d 100644 --- a/libraries/ESP_I2S/examples/Simple_tone/Simple_tone.ino +++ b/libraries/ESP_I2S/examples/Simple_tone/Simple_tone.ino @@ -24,10 +24,17 @@ 2nd September 2021 Lucas Saavedra Vaz (lucasssvaz) 22nd December 2023 + anon + 10nd February 2025 */ #include +// The GPIO pins are not fixed, most other pins could be used for the I2S function. +#define I2S_LRC 25 +#define I2S_BCLK 5 +#define I2S_DIN 26 + const int frequency = 440; // frequency of square wave in Hz const int amplitude = 500; // amplitude of square wave const int sampleRate = 8000; // sample rate in Hz @@ -36,10 +43,10 @@ i2s_data_bit_width_t bps = I2S_DATA_BIT_WIDTH_16BIT; i2s_mode_t mode = I2S_MODE_STD; i2s_slot_mode_t slot = I2S_SLOT_MODE_STEREO; -const int halfWavelength = (sampleRate / frequency); // half wavelength of square wave +const unsigned int halfWavelength = sampleRate / frequency / 2; // half wavelength of square wave int32_t sample = amplitude; // current sample value -int count = 0; +unsigned int count = 0; I2SClass i2s; @@ -47,6 +54,8 @@ void setup() { Serial.begin(115200); Serial.println("I2S simple tone"); + i2s.setPins(I2S_BCLK, I2S_LRC, I2S_DIN); + // start I2S at the sample rate with 16-bits per sample if (!i2s.begin(mode, sampleRate, bps, slot)) { Serial.println("Failed to initialize I2S!"); @@ -60,8 +69,13 @@ void loop() { sample = -1 * sample; } - i2s.write(sample); // Right channel - i2s.write(sample); // Left channel + // Left channel, the low 8 bits then high 8 bits + i2s.write(sample); + i2s.write(sample >> 8); + + // Right channel, the low 8 bits then high 8 bits + i2s.write(sample); + i2s.write(sample >> 8); // increment the counter for the next sample count++; From 422e52684b824a3fde85989ea90abf6624f2b0eb Mon Sep 17 00:00:00 2001 From: Paula Scharf <48286621+PaulaScharf@users.noreply.github.com> Date: Tue, 10 Jun 2025 13:29:27 +0200 Subject: [PATCH 168/290] fix(msc): remove weak function declaration of tud_msc_is_writable_cb (#11353) Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> --- cores/esp32/esp32-hal-tinyusb.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/cores/esp32/esp32-hal-tinyusb.c b/cores/esp32/esp32-hal-tinyusb.c index 0991e08d27f..30a827baa01 100644 --- a/cores/esp32/esp32-hal-tinyusb.c +++ b/cores/esp32/esp32-hal-tinyusb.c @@ -466,9 +466,6 @@ __attribute__((weak)) int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint __attribute__((weak)) int32_t tud_msc_scsi_cb(uint8_t lun, uint8_t const scsi_cmd[16], void *buffer, uint16_t bufsize) { return -1; } -__attribute__((weak)) bool tud_msc_is_writable_cb(uint8_t lun) { - return false; -} #endif #if CFG_TUD_NCM __attribute__((weak)) bool tud_network_recv_cb(const uint8_t *src, uint16_t size) { From 228393708d49f20f9c83dfbc0bd51300464d873d Mon Sep 17 00:00:00 2001 From: SooDragon <82627949+SooDragon@users.noreply.github.com> Date: Mon, 16 Jun 2025 17:12:33 +0900 Subject: [PATCH 169/290] fix: Update Pin compatability (#11473) fix: Update Pin compatability --- variants/Geekble_ESP32C3/pins_arduino.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/variants/Geekble_ESP32C3/pins_arduino.h b/variants/Geekble_ESP32C3/pins_arduino.h index 660313ce849..56bda115a7e 100644 --- a/variants/Geekble_ESP32C3/pins_arduino.h +++ b/variants/Geekble_ESP32C3/pins_arduino.h @@ -22,6 +22,13 @@ static const uint8_t MOSI = 6; static const uint8_t MISO = 5; static const uint8_t SCK = 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; + static const uint8_t A0 = 0; static const uint8_t A1 = 1; static const uint8_t A2 = 2; From ef995b6564612f300ed1f32627aa78a1eb65d614 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Mon, 16 Jun 2025 07:15:54 -0300 Subject: [PATCH 170/290] feat(openthread): adds native api (#11474) * feat(openthread): adds native api * feat(openthread): adds source code to CMakeLists.txt * 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 + libraries/OpenThread/README.md | 201 +++++++++- .../examples/{ => CLI}/COAP/coap_lamp/ci.json | 0 .../{ => CLI}/COAP/coap_lamp/coap_lamp.ino | 9 +- .../{ => CLI}/COAP/coap_switch/ci.json | 0 .../COAP/coap_switch/coap_switch.ino | 9 +- .../{ => CLI}/SimpleCLI/SimpleCLI.ino | 5 +- .../examples/{ => CLI}/SimpleCLI/ci.json | 0 .../{ => CLI}/SimpleNode/SimpleNode.ino | 9 +- .../examples/{ => CLI}/SimpleNode/ci.json | 0 .../ExtendedRouterNode/ExtendedRouterNode.ino | 9 +- .../ExtendedRouterNode/ci.json | 0 .../LeaderNode/LeaderNode.ino | 9 +- .../SimpleThreadNetwork/LeaderNode/ci.json | 0 .../RouterNode/RouterNode.ino | 9 +- .../SimpleThreadNetwork/RouterNode/ci.json | 0 .../{ => CLI}/ThreadScan/ThreadScan.ino | 7 +- .../examples/{ => CLI}/ThreadScan/ci.json | 0 .../examples/{ => CLI}/onReceive/ci.json | 0 .../{ => CLI}/onReceive/onReceive.ino | 3 +- .../LeaderNode/LeaderNode.ino | 34 ++ .../SimpleThreadNetwork/LeaderNode/ci.json | 6 + .../RouterNode/RouterNode.ino | 29 ++ .../SimpleThreadNetwork/RouterNode/ci.json | 6 + libraries/OpenThread/keywords.txt | 26 ++ libraries/OpenThread/src/OThread.cpp | 364 ++++++++++++++++++ libraries/OpenThread/src/OThread.h | 107 +++++ libraries/OpenThread/src/OThreadCLI.cpp | 156 ++------ libraries/OpenThread/src/OThreadCLI.h | 6 +- libraries/OpenThread/src/OThreadCLI_Util.cpp | 22 +- libraries/OpenThread/src/OThreadCLI_Util.h | 11 - 31 files changed, 833 insertions(+), 205 deletions(-) rename libraries/OpenThread/examples/{ => CLI}/COAP/coap_lamp/ci.json (100%) rename libraries/OpenThread/examples/{ => CLI}/COAP/coap_lamp/coap_lamp.ino (95%) rename libraries/OpenThread/examples/{ => CLI}/COAP/coap_switch/ci.json (100%) rename libraries/OpenThread/examples/{ => CLI}/COAP/coap_switch/coap_switch.ino (95%) rename libraries/OpenThread/examples/{ => CLI}/SimpleCLI/SimpleCLI.ino (89%) rename libraries/OpenThread/examples/{ => CLI}/SimpleCLI/ci.json (100%) rename libraries/OpenThread/examples/{ => CLI}/SimpleNode/SimpleNode.ino (82%) rename libraries/OpenThread/examples/{ => CLI}/SimpleNode/ci.json (100%) rename libraries/OpenThread/examples/{ => CLI}/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino (89%) rename libraries/OpenThread/examples/{ => CLI}/SimpleThreadNetwork/ExtendedRouterNode/ci.json (100%) rename libraries/OpenThread/examples/{ => CLI}/SimpleThreadNetwork/LeaderNode/LeaderNode.ino (93%) rename libraries/OpenThread/examples/{ => CLI}/SimpleThreadNetwork/LeaderNode/ci.json (100%) rename libraries/OpenThread/examples/{ => CLI}/SimpleThreadNetwork/RouterNode/RouterNode.ino (92%) rename libraries/OpenThread/examples/{ => CLI}/SimpleThreadNetwork/RouterNode/ci.json (100%) rename libraries/OpenThread/examples/{ => CLI}/ThreadScan/ThreadScan.ino (89%) rename libraries/OpenThread/examples/{ => CLI}/ThreadScan/ci.json (100%) rename libraries/OpenThread/examples/{ => CLI}/onReceive/ci.json (100%) rename libraries/OpenThread/examples/{ => CLI}/onReceive/onReceive.ino (96%) create mode 100644 libraries/OpenThread/examples/Native/SimpleThreadNetwork/LeaderNode/LeaderNode.ino create mode 100644 libraries/OpenThread/examples/Native/SimpleThreadNetwork/LeaderNode/ci.json create mode 100644 libraries/OpenThread/examples/Native/SimpleThreadNetwork/RouterNode/RouterNode.ino create mode 100644 libraries/OpenThread/examples/Native/SimpleThreadNetwork/RouterNode/ci.json create mode 100644 libraries/OpenThread/src/OThread.cpp create mode 100644 libraries/OpenThread/src/OThread.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d53d612962d..e8f44ac5ee0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -165,6 +165,7 @@ set(ARDUINO_LIBRARY_LittleFS_SRCS libraries/LittleFS/src/LittleFS.cpp) set(ARDUINO_LIBRARY_NetBIOS_SRCS libraries/NetBIOS/src/NetBIOS.cpp) set(ARDUINO_LIBRARY_OpenThread_SRCS + libraries/OpenThread/src/OThread.cpp libraries/OpenThread/src/OThreadCLI.cpp libraries/OpenThread/src/OThreadCLI_Util.cpp) diff --git a/libraries/OpenThread/README.md b/libraries/OpenThread/README.md index cd9deb9ebf6..8d0386f34fb 100644 --- a/libraries/OpenThread/README.md +++ b/libraries/OpenThread/README.md @@ -1,9 +1,177 @@ | Supported Targets | ESP32-C6 | ESP32-H2 | | ----------------- | -------- | -------- | -# ESP32 Arduino OpenThreadCLI +# General View -The `OpenThreadCLI` class is an Arduino API for interacting with the OpenThread Command Line Interface (CLI). It allows you to manage and configure the Thread stack using a command-line interface. +This Arduino OpenThread Library allows using ESP OpenThread implementation using CLI and/or Native OpenThread API. + +The Library implements 3 C++ Classes: +- `OThread` Class for Native OpenThread API +- `OThreadCLI` Class for CLI OpenThread API +- `DataSet` Class for OpenThread dataset manipulation using Native `OThread` Class + +# ESP32 Arduino OpenThread Native + +The `OThread` class provides methods for managing the OpenThread instance and controlling the Thread network. It allows you to initialize, start, stop, and manage the Thread network using native OpenThread APIs. + +## Class Definition + +```cpp +class OpenThread { + public: + static bool otStarted; // Indicates whether the OpenThread stack is running. + + // Get the current Thread device role (e.g., Leader, Router, Child, etc.). + static ot_device_role_t otGetDeviceRole(); + + // Get the current Thread device role as a string. + static const char *otGetStringDeviceRole(); + + // Print network information (e.g., network name, channel, PAN ID) to the specified stream. + static void otPrintNetworkInformation(Stream &output); + + OpenThread(); + ~OpenThread(); + + // Returns true if the OpenThread stack is running. + operator bool() const; + + // Initialize the OpenThread stack. + static void begin(bool OThreadAutoStart = true); + + // Deinitialize the OpenThread stack. + static void end(); + + // Start the Thread network. + void start(); + + // Stop the Thread network. + void stop(); + + // Bring up the Thread network interface (equivalent to "ifconfig up"). + void networkInterfaceUp(); + + // Bring down the Thread network interface (equivalent to "ifconfig down"). + void networkInterfaceDown(); + + // Commit a dataset to the OpenThread instance. + void commitDataSet(const DataSet &dataset); + +private: + static otInstance *mInstance; // Pointer to the OpenThread instance. + DataSet mCurrentDataSet; // Current dataset being used by the OpenThread instance. +}; + +extern OpenThread OThread; +``` +## Class Overview + +The `OThread` class provides a simple and intuitive interface for managing the OpenThread stack and Thread network. It abstracts the complexity of the OpenThread APIs and provides Arduino-style methods for common operations. + +## Public Methods +### Initialization and Deinitialization +- `begin(bool OThreadAutoStart = true)`: Initializes the OpenThread stack. If `OThreadAutoStart` is `true`, the Thread network will start automatically using NVS data. +- `end()`: Deinitializes the OpenThread stack and releases resources. +### Thread Network Control +- `start()`: Starts the Thread network. This is equivalent to the CLI command "thread start". +- `stop()`: Stops the Thread network. This is equivalent to the CLI command "thread stop". +### Network Interface Control +- `networkInterfaceUp()`: Brings up the Thread network interface. This is equivalent to the CLI command "ifconfig up". +- `networkInterfaceDown()`: Brings down the Thread network interface. This is equivalent to the CLI command "ifconfig down". +### Dataset Management +- `commitDataSet(const DataSet &dataset)`: Commits a dataset to the OpenThread instance. This is used to configure the Thread network with specific parameters (e.g., network name, channel, PAN ID). +### Network Information +- `otGetDeviceRole()`: Returns the current Thread device role as an `ot_device_role_t` enum (e.g., `OT_ROLE_LEADER`, `OT_ROLE_ROUTER`). +- `otGetStringDeviceRole()`: Returns the current Thread device role as a string (e.g., "Leader", "Router"). +- `otPrintNetworkInformation(Stream &output)`: Prints the current network information (e.g., network name, channel, PAN ID) to the specified stream. + +## Key Features +- **Initialization and Cleanup**: Easily initialize and deinitialize the OpenThread stack. +- **Network Control**: Start and stop the Thread network with simple method calls. +- **Dataset Management**: Configure the Thread network using the `DataSet` class and commit it to the OpenThread instance. +- **Network Information**: Retrieve and print the current network information and device role. + +## Notes +- The `OThread` class is designed to simplify the use of OpenThread APIs in Arduino sketches. +- It works seamlessly with the DataSet class for managing Thread network configurations. +- Ensure that the OpenThread stack is initialized (`OThread.begin()`) before calling other methods. + +This documentation provides a comprehensive overview of the `OThread` class, its methods, and example usage. It is designed to help developers quickly integrate OpenThread functionality into their Arduino projects. + +# DataSet Class + +The `DataSet` class provides a structured way to manage and configure Thread network datasets using native OpenThread APIs. It allows you to set and retrieve network parameters such as the network name, channel, PAN ID, and more. The `DataSet` class works seamlessly with the `OThread` class to apply these configurations to the OpenThread instance. + +## Class Definition + +```cpp +class DataSet { +public: + DataSet(); + void clear(); + void initNew(); + const otOperationalDataset &getDataset() const; + + // Setters + void setNetworkName(const char *name); + void setExtendedPanId(const uint8_t *extPanId); + void setNetworkKey(const uint8_t *key); + void setChannel(uint8_t channel); + void setPanId(uint16_t panId); + + // Getters + const char *getNetworkName() const; + const uint8_t *getExtendedPanId() const; + const uint8_t *getNetworkKey() const; + uint8_t getChannel() const; + uint16_t getPanId() const; + + // Apply the dataset to the OpenThread instance + void apply(otInstance *instance); + +private: + otOperationalDataset mDataset; // Internal representation of the dataset +}; +``` + +## Class Overview +The DataSet` class simplifies the management of Thread network datasets by providing intuitive methods for setting, retrieving, and applying network parameters. It abstracts the complexity of the OpenThread dataset APIs and provides Arduino-style methods for common operations. + +## Public Methods +### Initialization +- `DataSet()`: Constructor that initializes an empty dataset. +- `void clear()`: Clears the dataset, resetting all fields to their default values. +- `void initNew()`: Initializes a new dataset with default values (equivalent to the CLI command dataset init new). +### Setters +- `void setNetworkName(const char *name)`: Sets the network name. +- `void setExtendedPanId(const uint8_t *extPanId)`: Sets the extended PAN ID. +- `void setNetworkKey(const uint8_t *key)`: Sets the network key. +- `void setChannel(uint8_t channel)`: Sets the channel. +- `void setPanId(uint16_t panId)`: Sets the PAN ID. +### Getters +- `const char *getNetworkName() const`: Retrieves the network name. +- `const uint8_t *getExtendedPanId() const`: Retrieves the extended PAN ID. +- `const uint8_t *getNetworkKey() const`: Retrieves the network key. +- `uint8_t getChannel() const`: Retrieves the channel. +- `uint16_t getPanId() const`: Retrieves the PAN ID. +### Dataset Application +- `void apply(otInstance *instance)`: Applies the dataset to the specified OpenThread instance. + +## Key Features +- **Dataset Initialization**: Easily initialize a new dataset with default values using initNew(). +- **Custom Configuration**: Set custom network parameters such as the network name, channel, and PAN ID using setter methods. +- **Dataset Application**: Apply the configured dataset to the OpenThread instance using apply(). + +** Notes +- The `DataSet` class is designed to work seamlessly with the `OThread` class for managing Thread network configurations. +- Ensure that the OpenThread stack is initialized (`OThread.begin()`) before applying a dataset. +- The initNew()`` method provides default values for the dataset, which can be customized using the setter methods. + +This documentation provides a comprehensive overview of the `DataSet` class, its methods, and example usage. It is designed to help developers easily manage Thread network configurations in their Arduino projects. + +# OpenThreadCLI Class + +The `OpenThreadCLI` class is an Arduino API for interacting with the OpenThread Command Line Interface (CLI). It allows you to send commands to the OpenThread stack and receive responses. This class is designed to simplify the use of OpenThread CLI commands in Arduino sketches. There is one main class called `OpenThreadCLI` and a global object used to operate OpenThread CLI, called `OThreadCLI`.\ Some [helper functions](helper_functions.md) were made available for working with the OpenThread CLI environment. @@ -20,7 +188,7 @@ Below are the details of the class: class OpenThreadCLI : public Stream { private: static size_t setBuffer(QueueHandle_t &queue, size_t len); - bool otStarted = false; + static bool otCLIStarted = false; public: OpenThreadCLI(); @@ -59,14 +227,35 @@ extern OpenThreadCLI OThreadCLI; - You can customize the console behavior by adjusting parameters such as echoback and buffer sizes. ## Public Methods +### Initialization and Deinitialization +- `begin()`: Initializes the OpenThread stack (optional auto-start). +- `end()`: Deinitializes the OpenThread stack and releases resources. +### Console Management - `startConsole(Stream& otStream, bool echoback = true, const char* prompt = "ot> ")`: Starts the OpenThread console with the specified stream, echoback option, and prompt. - `stopConsole()`: Stops the OpenThread console. - `setPrompt(char* prompt)`: Changes the console prompt (set to NULL for an empty prompt). - `setEchoBack(bool echoback)`: Changes the console echoback option. - `setStream(Stream& otStream)`: Changes the console Stream object. - `onReceive(OnReceiveCb_t func)`: Sets a callback function to handle complete lines of output from the OT CLI. -- `begin(bool OThreadAutoStart = true)`: Initializes the OpenThread stack (optional auto-start). -- `end()`: Deinitializes the OpenThread stack. +### Buffer Management - `setTxBufferSize(size_t tx_queue_len)`: Sets the transmit buffer size (default is 256 bytes). - `setRxBufferSize(size_t rx_queue_len)`: Sets the receive buffer size (default is 1024 bytes). -- `write(uint8_t)`, `available()`, `read()`, `peek()`, `flush()`: Standard Stream methods implementation for OpenThread CLI object. +### Stream Methods +- `write(uint8_t)`: Writes a byte to the CLI. +- `available()`: Returns the number of bytes available to read. +- `read()`: Reads a byte from the CLI. +- `peek()`: Returns the next byte without removing it from the buffer. +- `flush()`: Flushes the CLI buffer. + +## Key Features +- **Arduino Stream Compatibility**: Inherits from the Stream class, making it compatible with Arduino's standard I/O functions. +- **Customizable Console**: Allows customization of the CLI prompt, echoback behavior, and buffer sizes. +- **Callback Support**: Provides a callback mechanism to handle CLI responses asynchronously. +- **Seamless Integration**: Designed to work seamlessly with the OThread and DataSet classes + +## Notes +- The `OThreadCLI` class is designed to simplify the use of OpenThread CLI commands in Arduino sketches. +- It works seamlessly with the `OThread` and `DataSet` classes for managing Thread networks. +- Ensure that the OpenThread stack is initialized (`OThreadCLI.begin()`) before starting the CLI console. + +This documentation provides a comprehensive overview of the `OThreadCLI` class, its methods, and example usage. It is designed to help developers easily integrate OpenThread CLI functionality into their Arduino projects. diff --git a/libraries/OpenThread/examples/COAP/coap_lamp/ci.json b/libraries/OpenThread/examples/CLI/COAP/coap_lamp/ci.json similarity index 100% rename from libraries/OpenThread/examples/COAP/coap_lamp/ci.json rename to libraries/OpenThread/examples/CLI/COAP/coap_lamp/ci.json diff --git a/libraries/OpenThread/examples/COAP/coap_lamp/coap_lamp.ino b/libraries/OpenThread/examples/CLI/COAP/coap_lamp/coap_lamp.ino similarity index 95% rename from libraries/OpenThread/examples/COAP/coap_lamp/coap_lamp.ino rename to libraries/OpenThread/examples/CLI/COAP/coap_lamp/coap_lamp.ino index 51483bb4c7c..bcaf8ae9793 100644 --- a/libraries/OpenThread/examples/COAP/coap_lamp/coap_lamp.ino +++ b/libraries/OpenThread/examples/CLI/COAP/coap_lamp/coap_lamp.ino @@ -75,18 +75,18 @@ bool otDeviceSetup(const char **otSetupCmds, uint8_t nCmds1, const char **otCoap Serial.println("OpenThread started.\r\nWaiting for activating correct Device Role."); // wait for the expected Device Role to start uint8_t tries = 24; // 24 x 2.5 sec = 1 min - while (tries && otGetDeviceRole() != expectedRole) { + while (tries && OThread.otGetDeviceRole() != expectedRole) { Serial.print("."); delay(2500); tries--; } Serial.println(); if (!tries) { - log_e("Sorry, Device Role failed by timeout! Current Role: %s.", otGetStringDeviceRole()); + log_e("Sorry, Device Role failed by timeout! Current Role: %s.", OThread.otGetStringDeviceRole()); rgbLedWrite(RGB_BUILTIN, 255, 0, 0); // RED ... failed! return false; } - Serial.printf("Device is %s.\r\n", otGetStringDeviceRole()); + Serial.printf("Device is %s.\r\n", OThread.otGetStringDeviceRole()); for (i = 0; i < nCmds2; i++) { if (!otExecCommand(otCoapCmds[i * 2], otCoapCmds[i * 2 + 1])) { break; @@ -151,7 +151,8 @@ void setup() { Serial.begin(115200); // LED starts RED, indicating not connected to Thread network. rgbLedWrite(RGB_BUILTIN, 64, 0, 0); - OThreadCLI.begin(false); // No AutoStart is necessary + OThread.begin(false); // No AutoStart is necessary + OThreadCLI.begin(); OThreadCLI.setTimeout(250); // waits 250ms for the OpenThread CLI response setupNode(); // LED goes Green when all is ready and Red when failed. diff --git a/libraries/OpenThread/examples/COAP/coap_switch/ci.json b/libraries/OpenThread/examples/CLI/COAP/coap_switch/ci.json similarity index 100% rename from libraries/OpenThread/examples/COAP/coap_switch/ci.json rename to libraries/OpenThread/examples/CLI/COAP/coap_switch/ci.json diff --git a/libraries/OpenThread/examples/COAP/coap_switch/coap_switch.ino b/libraries/OpenThread/examples/CLI/COAP/coap_switch/coap_switch.ino similarity index 95% rename from libraries/OpenThread/examples/COAP/coap_switch/coap_switch.ino rename to libraries/OpenThread/examples/CLI/COAP/coap_switch/coap_switch.ino index aac5db0bc82..bacac47ddeb 100644 --- a/libraries/OpenThread/examples/COAP/coap_switch/coap_switch.ino +++ b/libraries/OpenThread/examples/CLI/COAP/coap_switch/coap_switch.ino @@ -69,18 +69,18 @@ bool otDeviceSetup( Serial.println("OpenThread started.\r\nWaiting for activating correct Device Role."); // wait for the expected Device Role to start uint8_t tries = 24; // 24 x 2.5 sec = 1 min - while (tries && otGetDeviceRole() != expectedRole1 && otGetDeviceRole() != expectedRole2) { + while (tries && OThread.otGetDeviceRole() != expectedRole1 && OThread.otGetDeviceRole() != expectedRole2) { Serial.print("."); delay(2500); tries--; } Serial.println(); if (!tries) { - log_e("Sorry, Device Role failed by timeout! Current Role: %s.", otGetStringDeviceRole()); + log_e("Sorry, Device Role failed by timeout! Current Role: %s.", OThread.otGetStringDeviceRole()); rgbLedWrite(RGB_BUILTIN, 255, 0, 0); // RED ... failed! return false; } - Serial.printf("Device is %s.\r\n", otGetStringDeviceRole()); + Serial.printf("Device is %s.\r\n", OThread.otGetStringDeviceRole()); for (i = 0; i < nCmds2; i++) { if (!otExecCommand(otCoapCmds[i * 2], otCoapCmds[i * 2 + 1])) { break; @@ -176,7 +176,8 @@ void setup() { Serial.begin(115200); // LED starts RED, indicating not connected to Thread network. rgbLedWrite(RGB_BUILTIN, 64, 0, 0); - OThreadCLI.begin(false); // No AutoStart is necessary + OThread.begin(false); // No AutoStart is necessary + OThreadCLI.begin(); OThreadCLI.setTimeout(250); // waits 250ms for the OpenThread CLI response setupNode(); // LED goes and keeps Blue when all is ready and Red when failed. diff --git a/libraries/OpenThread/examples/SimpleCLI/SimpleCLI.ino b/libraries/OpenThread/examples/CLI/SimpleCLI/SimpleCLI.ino similarity index 89% rename from libraries/OpenThread/examples/SimpleCLI/SimpleCLI.ino rename to libraries/OpenThread/examples/CLI/SimpleCLI/SimpleCLI.ino index feef800c0fa..dec3aaeb218 100644 --- a/libraries/OpenThread/examples/SimpleCLI/SimpleCLI.ino +++ b/libraries/OpenThread/examples/CLI/SimpleCLI/SimpleCLI.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -26,7 +26,8 @@ void setup() { Serial.begin(115200); - OThreadCLI.begin(false); // No AutoStart - fresh start + OThread.begin(false); // No AutoStart - fresh start + OThreadCLI.begin(); Serial.println("OpenThread CLI started - type 'help' for a list of commands."); OThreadCLI.startConsole(Serial); } diff --git a/libraries/OpenThread/examples/SimpleCLI/ci.json b/libraries/OpenThread/examples/CLI/SimpleCLI/ci.json similarity index 100% rename from libraries/OpenThread/examples/SimpleCLI/ci.json rename to libraries/OpenThread/examples/CLI/SimpleCLI/ci.json diff --git a/libraries/OpenThread/examples/SimpleNode/SimpleNode.ino b/libraries/OpenThread/examples/CLI/SimpleNode/SimpleNode.ino similarity index 82% rename from libraries/OpenThread/examples/SimpleNode/SimpleNode.ino rename to libraries/OpenThread/examples/CLI/SimpleNode/SimpleNode.ino index 95bf7a2401a..d17b692cc74 100644 --- a/libraries/OpenThread/examples/SimpleNode/SimpleNode.ino +++ b/libraries/OpenThread/examples/CLI/SimpleNode/SimpleNode.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -35,12 +35,13 @@ void setup() { Serial.begin(115200); - OThreadCLI.begin(); // AutoStart using Thread default settings - otPrintNetworkInformation(Serial); // Print Current Thread Network Information + OThread.begin(); // AutoStart using Thread default settings + OThreadCLI.begin(); + OThread.otPrintNetworkInformation(Serial); // Print Current Thread Network Information } void loop() { Serial.print("Thread Node State: "); - Serial.println(otGetStringDeviceRole()); + Serial.println(OThread.otGetStringDeviceRole()); delay(5000); } diff --git a/libraries/OpenThread/examples/SimpleNode/ci.json b/libraries/OpenThread/examples/CLI/SimpleNode/ci.json similarity index 100% rename from libraries/OpenThread/examples/SimpleNode/ci.json rename to libraries/OpenThread/examples/CLI/SimpleNode/ci.json diff --git a/libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino b/libraries/OpenThread/examples/CLI/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino similarity index 89% rename from libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino rename to libraries/OpenThread/examples/CLI/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino index 4fc8a921584..40f046aeab5 100644 --- a/libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino +++ b/libraries/OpenThread/examples/CLI/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -22,7 +22,8 @@ bool otStatus = true; void setup() { Serial.begin(115200); - OThreadCLI.begin(false); // No AutoStart - fresh start + OThread.begin(false); // No AutoStart - fresh start + OThreadCLI.begin(); Serial.println("Setting up OpenThread Node as Router/Child"); Serial.println("Make sure the Leader Node is already running"); @@ -39,7 +40,7 @@ void setup() { } // wait for the node to enter in the router state uint32_t timeout = millis() + 90000; // waits 90 seconds to - while (otGetDeviceRole() != OT_ROLE_CHILD && otGetDeviceRole() != OT_ROLE_ROUTER) { + while (OThread.otGetDeviceRole() != OT_ROLE_CHILD && OThread.otGetDeviceRole() != OT_ROLE_ROUTER) { Serial.print("."); if (millis() > timeout) { Serial.println("\r\n\t===> Timeout! Failed."); @@ -70,7 +71,7 @@ void loop() { if (otStatus) { Serial.println("Thread NetworkInformation: "); Serial.println("---------------------------"); - otPrintNetworkInformation(Serial); + OThread.otPrintNetworkInformation(Serial); Serial.println("---------------------------"); } else { Serial.println("Some OpenThread operation has failed..."); diff --git a/libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ci.json b/libraries/OpenThread/examples/CLI/SimpleThreadNetwork/ExtendedRouterNode/ci.json similarity index 100% rename from libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ci.json rename to libraries/OpenThread/examples/CLI/SimpleThreadNetwork/ExtendedRouterNode/ci.json diff --git a/libraries/OpenThread/examples/SimpleThreadNetwork/LeaderNode/LeaderNode.ino b/libraries/OpenThread/examples/CLI/SimpleThreadNetwork/LeaderNode/LeaderNode.ino similarity index 93% rename from libraries/OpenThread/examples/SimpleThreadNetwork/LeaderNode/LeaderNode.ino rename to libraries/OpenThread/examples/CLI/SimpleThreadNetwork/LeaderNode/LeaderNode.ino index 7b709717692..a945a5c8f77 100644 --- a/libraries/OpenThread/examples/SimpleThreadNetwork/LeaderNode/LeaderNode.ino +++ b/libraries/OpenThread/examples/CLI/SimpleThreadNetwork/LeaderNode/LeaderNode.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -35,7 +35,8 @@ otInstance *aInstance = NULL; void setup() { Serial.begin(115200); - OThreadCLI.begin(false); // No AutoStart - fresh start + OThread.begin(false); // No AutoStart - fresh start + OThreadCLI.begin(); Serial.println(); Serial.println("Setting up OpenThread Node as Leader"); aInstance = esp_openthread_get_instance(); @@ -51,11 +52,11 @@ void setup() { void loop() { Serial.println("============================================="); Serial.print("Thread Node State: "); - Serial.println(otGetStringDeviceRole()); + Serial.println(OThread.otGetStringDeviceRole()); // Native OpenThread API calls: // wait until the node become Child or Router - if (otGetDeviceRole() == OT_ROLE_LEADER) { + if (OThread.otGetDeviceRole() == OT_ROLE_LEADER) { // Network Name const char *networkName = otThreadGetNetworkName(aInstance); Serial.printf("Network Name: %s\r\n", networkName); diff --git a/libraries/OpenThread/examples/SimpleThreadNetwork/LeaderNode/ci.json b/libraries/OpenThread/examples/CLI/SimpleThreadNetwork/LeaderNode/ci.json similarity index 100% rename from libraries/OpenThread/examples/SimpleThreadNetwork/LeaderNode/ci.json rename to libraries/OpenThread/examples/CLI/SimpleThreadNetwork/LeaderNode/ci.json diff --git a/libraries/OpenThread/examples/SimpleThreadNetwork/RouterNode/RouterNode.ino b/libraries/OpenThread/examples/CLI/SimpleThreadNetwork/RouterNode/RouterNode.ino similarity index 92% rename from libraries/OpenThread/examples/SimpleThreadNetwork/RouterNode/RouterNode.ino rename to libraries/OpenThread/examples/CLI/SimpleThreadNetwork/RouterNode/RouterNode.ino index 45475fa0c6a..f802bd7ef01 100644 --- a/libraries/OpenThread/examples/SimpleThreadNetwork/RouterNode/RouterNode.ino +++ b/libraries/OpenThread/examples/CLI/SimpleThreadNetwork/RouterNode/RouterNode.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -34,7 +34,8 @@ otInstance *aInstance = NULL; void setup() { Serial.begin(115200); - OThreadCLI.begin(false); // No AutoStart - fresh start + OThread.begin(false); // No AutoStart - fresh start + OThreadCLI.begin(); Serial.println(); Serial.println("Setting up OpenThread Node as Router/Child"); Serial.println("Make sure the Leader Node is already running"); @@ -51,11 +52,11 @@ void setup() { void loop() { Serial.println("============================================="); Serial.print("Thread Node State: "); - Serial.println(otGetStringDeviceRole()); + Serial.println(OThread.otGetStringDeviceRole()); // Native OpenThread API calls: // wait until the node become Child or Router - if (otGetDeviceRole() == OT_ROLE_CHILD || otGetDeviceRole() == OT_ROLE_ROUTER) { + if (OThread.otGetDeviceRole() == OT_ROLE_CHILD || OThread.otGetDeviceRole() == OT_ROLE_ROUTER) { // Network Name const char *networkName = otThreadGetNetworkName(aInstance); Serial.printf("Network Name: %s\r\n", networkName); diff --git a/libraries/OpenThread/examples/SimpleThreadNetwork/RouterNode/ci.json b/libraries/OpenThread/examples/CLI/SimpleThreadNetwork/RouterNode/ci.json similarity index 100% rename from libraries/OpenThread/examples/SimpleThreadNetwork/RouterNode/ci.json rename to libraries/OpenThread/examples/CLI/SimpleThreadNetwork/RouterNode/ci.json diff --git a/libraries/OpenThread/examples/ThreadScan/ThreadScan.ino b/libraries/OpenThread/examples/CLI/ThreadScan/ThreadScan.ino similarity index 89% rename from libraries/OpenThread/examples/ThreadScan/ThreadScan.ino rename to libraries/OpenThread/examples/CLI/ThreadScan/ThreadScan.ino index 9d0074bb180..87c29339fb7 100644 --- a/libraries/OpenThread/examples/ThreadScan/ThreadScan.ino +++ b/libraries/OpenThread/examples/CLI/ThreadScan/ThreadScan.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -27,7 +27,8 @@ void setup() { Serial.begin(115200); - OThreadCLI.begin(true); // For scanning, AutoStart must be active, any setup + OThread.begin(true); // For scanning, AutoStart must be active, any setup + OThreadCLI.begin(); OThreadCLI.setTimeout(100); // Set a timeout for the CLI response Serial.println(); Serial.println("This sketch will continuously scan the Thread Local Network and all devices IEEE 802.15.4 compatible"); @@ -41,7 +42,7 @@ void loop() { Serial.println("Scan Failed..."); } delay(5000); - if (otGetDeviceRole() < OT_ROLE_CHILD) { + if (OThread.otGetDeviceRole() < OT_ROLE_CHILD) { Serial.println(); Serial.println("This device has not started Thread yet, bypassing Discovery Scan"); return; diff --git a/libraries/OpenThread/examples/ThreadScan/ci.json b/libraries/OpenThread/examples/CLI/ThreadScan/ci.json similarity index 100% rename from libraries/OpenThread/examples/ThreadScan/ci.json rename to libraries/OpenThread/examples/CLI/ThreadScan/ci.json diff --git a/libraries/OpenThread/examples/onReceive/ci.json b/libraries/OpenThread/examples/CLI/onReceive/ci.json similarity index 100% rename from libraries/OpenThread/examples/onReceive/ci.json rename to libraries/OpenThread/examples/CLI/onReceive/ci.json diff --git a/libraries/OpenThread/examples/onReceive/onReceive.ino b/libraries/OpenThread/examples/CLI/onReceive/onReceive.ino similarity index 96% rename from libraries/OpenThread/examples/onReceive/onReceive.ino rename to libraries/OpenThread/examples/CLI/onReceive/onReceive.ino index b37c2fc7931..f53cc33f5ec 100644 --- a/libraries/OpenThread/examples/onReceive/onReceive.ino +++ b/libraries/OpenThread/examples/CLI/onReceive/onReceive.ino @@ -39,7 +39,8 @@ void otReceivedLine() { void setup() { Serial.begin(115200); - OThreadCLI.begin(); // AutoStart + OThread.begin(); // AutoStart + OThreadCLI.begin(); OThreadCLI.onReceive(otReceivedLine); } diff --git a/libraries/OpenThread/examples/Native/SimpleThreadNetwork/LeaderNode/LeaderNode.ino b/libraries/OpenThread/examples/Native/SimpleThreadNetwork/LeaderNode/LeaderNode.ino new file mode 100644 index 00000000000..dfea9776838 --- /dev/null +++ b/libraries/OpenThread/examples/Native/SimpleThreadNetwork/LeaderNode/LeaderNode.ino @@ -0,0 +1,34 @@ +#include "OThread.h" + +OpenThread threadLeaderNode; +DataSet dataset; + +void setup() { + Serial.begin(115200); + + // Start OpenThread Stack - false for not using NVS dataset information + threadLeaderNode.begin(false); + + // Create a new Thread Network Dataset for a Leader Node + dataset.initNew(); + // Configure the dataset + dataset.setNetworkName("ESP_OpenThread"); + uint8_t extPanId[OT_EXT_PAN_ID_SIZE] = {0xDE, 0xAD, 0x00, 0xBE, 0xEF, 0x00, 0xCA, 0xFE}; + dataset.setExtendedPanId(extPanId); + uint8_t networkKey[OT_NETWORK_KEY_SIZE] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; + dataset.setNetworkKey(networkKey); + dataset.setChannel(15); + dataset.setPanId(0x1234); + + // Apply the dataset and start the network + threadLeaderNode.commitDataSet(dataset); + threadLeaderNode.networkInterfaceUp(); + threadLeaderNode.start(); +} + +void loop() { + // Print network information every 5 seconds + Serial.println("=============================================="); + threadLeaderNode.otPrintNetworkInformation(Serial); + delay(5000); +} diff --git a/libraries/OpenThread/examples/Native/SimpleThreadNetwork/LeaderNode/ci.json b/libraries/OpenThread/examples/Native/SimpleThreadNetwork/LeaderNode/ci.json new file mode 100644 index 00000000000..2ee6af3490e --- /dev/null +++ b/libraries/OpenThread/examples/Native/SimpleThreadNetwork/LeaderNode/ci.json @@ -0,0 +1,6 @@ +{ + "requires": [ + "CONFIG_OPENTHREAD_ENABLED=y", + "CONFIG_SOC_IEEE802154_SUPPORTED=y" + ] +} diff --git a/libraries/OpenThread/examples/Native/SimpleThreadNetwork/RouterNode/RouterNode.ino b/libraries/OpenThread/examples/Native/SimpleThreadNetwork/RouterNode/RouterNode.ino new file mode 100644 index 00000000000..5ffa535ad51 --- /dev/null +++ b/libraries/OpenThread/examples/Native/SimpleThreadNetwork/RouterNode/RouterNode.ino @@ -0,0 +1,29 @@ +#include "OThread.h" + +OpenThread threadChildNode; +DataSet dataset; + +void setup() { + Serial.begin(115200); + + // Start OpenThread Stack - false for not using NVS dataset information + threadChildNode.begin(false); + + // clear dataset + dataset.clear(); + // Configure the dataset with the same Network Key of the Leader Node + uint8_t networkKey[OT_NETWORK_KEY_SIZE] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; + dataset.setNetworkKey(networkKey); + + // Apply the dataset and start the network + threadChildNode.commitDataSet(dataset); + threadChildNode.networkInterfaceUp(); + threadChildNode.start(); +} + +void loop() { + // Print network information every 5 seconds + Serial.println("=============================================="); + threadChildNode.otPrintNetworkInformation(Serial); + delay(5000); +} diff --git a/libraries/OpenThread/examples/Native/SimpleThreadNetwork/RouterNode/ci.json b/libraries/OpenThread/examples/Native/SimpleThreadNetwork/RouterNode/ci.json new file mode 100644 index 00000000000..2ee6af3490e --- /dev/null +++ b/libraries/OpenThread/examples/Native/SimpleThreadNetwork/RouterNode/ci.json @@ -0,0 +1,6 @@ +{ + "requires": [ + "CONFIG_OPENTHREAD_ENABLED=y", + "CONFIG_SOC_IEEE802154_SUPPORTED=y" + ] +} diff --git a/libraries/OpenThread/keywords.txt b/libraries/OpenThread/keywords.txt index d7193de188d..b62c2c23ddc 100644 --- a/libraries/OpenThread/keywords.txt +++ b/libraries/OpenThread/keywords.txt @@ -7,7 +7,10 @@ ####################################### OThreadCLI KEYWORD1 +OThread KEYWORD1 OpenThreadCLI KEYWORD1 +OpenThread KEYWORD1 +DataSet KEYWORD1 ot_cmd_return_t KEYWORD1 ot_device_role_t KEYWORD1 @@ -35,6 +38,27 @@ otGetRespCmd KEYWORD2 otExecCommand KEYWORD2 otPrintRespCLI KEYWORD2 otPrintNetworkInformation KEYWORD2 +clear KEYWORD2 +initNew KEYWORD2 +getDataset KEYWORD2 +setNetworkName KEYWORD2 +getNetworkName KEYWORD2 +setExtendedPanId KEYWORD2 +getExtendedPanId KEYWORD2 +setNetworkKey KEYWORD2 +getNetworkKey KEYWORD2 +setChannel KEYWORD2 +getChannel KEYWORD2 +setPanId KEYWORD2 +getPanId KEYWORD2 +apply KEYWORD2 +otStarted KEYWORD2 +otCLIStarted KEYWORD2 +start KEYWORD2 +stop KEYWORD2 +networkInterfaceUp KEYWORD2 +networkInterfaceDown KEYWORD2 +commitDataSet KEYWORD2 ####################################### # Constants (LITERAL1) @@ -45,3 +69,5 @@ OT_ROLE_DETACHED LITERAL1 OT_ROLE_CHILD LITERAL1 OT_ROLE_ROUTER LITERAL1 OT_ROLE_LEADER LITERAL1 +OT_EXT_PAN_ID_SIZE LITERAL1 +OT_NETWORK_KEY_SIZE LITERAL1 diff --git a/libraries/OpenThread/src/OThread.cpp b/libraries/OpenThread/src/OThread.cpp new file mode 100644 index 00000000000..43d8ce02918 --- /dev/null +++ b/libraries/OpenThread/src/OThread.cpp @@ -0,0 +1,364 @@ +#include "OThread.h" +#if SOC_IEEE802154_SUPPORTED +#if CONFIG_OPENTHREAD_ENABLED + +#include "esp_err.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "esp_netif_types.h" +#include "esp_vfs_eventfd.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" + +#include "esp_netif_net_stack.h" +#include "esp_openthread_netif_glue.h" +#include "lwip/netif.h" + +static esp_openthread_platform_config_t ot_native_config; +static esp_netif_t *openthread_netif = NULL; + +const char *otRoleString[] = { + "Disabled", ///< The Thread stack is disabled. + "Detached", ///< Not currently participating in a Thread network/partition. + "Child", ///< The Thread Child role. + "Router", ///< The Thread Router role. + "Leader", ///< The Thread Leader role. + "Unknown", ///< Unknown role, not initialized or not started. +}; + +static TaskHandle_t s_ot_task = NULL; +#if CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM +static struct netif *ot_lwip_netif = NULL; +#endif + +#if CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM +extern "C" int lwip_hook_ip6_input(struct pbuf *p, struct netif *inp) { + if (ot_lwip_netif && ot_lwip_netif == inp) { + return 0; + } + if (ip6_addr_isany_val(inp->ip6_addr[0].u_addr.ip6)) { + // We don't have an LL address -> eat this packet here, so it won't get accepted on input netif + pbuf_free(p); + return 1; + } + return 0; +} +#endif + +static void ot_task_worker(void *aContext) { + esp_vfs_eventfd_config_t eventfd_config = { + .max_fds = 3, + }; + bool err = false; + if (ESP_OK != esp_event_loop_create_default()) { + log_e("Failed to create OpentThread event loop"); + err = true; + } + if (!err && ESP_OK != esp_netif_init()) { + log_e("Failed to initialize OpentThread netif"); + err = true; + } + if (!err && ESP_OK != esp_vfs_eventfd_register(&eventfd_config)) { + log_e("Failed to register OpentThread eventfd"); + err = true; + } + + // Initialize the OpenThread stack + if (!err && ESP_OK != esp_openthread_init(&ot_native_config)) { + log_e("Failed to initialize OpenThread stack"); + err = true; + } + if (!err) { + // Initialize the esp_netif bindings + esp_netif_config_t cfg = ESP_NETIF_DEFAULT_OPENTHREAD(); + openthread_netif = esp_netif_new(&cfg); +#if CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM + // Get LwIP Netif + if (openthread_netif != NULL) { + ot_lwip_netif = (struct netif *)esp_netif_get_netif_impl(openthread_netif); + if (ot_lwip_netif == NULL) { + log_e("Failed to get OpenThread LwIP netif"); + } + } +#endif + } + if (!err && openthread_netif == NULL) { + log_e("Failed to create OpenThread esp_netif"); + err = true; + } + if (!err && ESP_OK != esp_netif_attach(openthread_netif, esp_openthread_netif_glue_init(&ot_native_config))) { + log_e("Failed to attach OpenThread esp_netif"); + err = true; + } + if (!err && ESP_OK != esp_netif_set_default_netif(openthread_netif)) { + log_e("Failed to set default OpenThread esp_netif"); + err = true; + } + if (!err) { + // only returns in case there is an OpenThread Stack failure... + esp_openthread_launch_mainloop(); + } + // Clean up + esp_openthread_netif_glue_deinit(); + esp_netif_destroy(openthread_netif); + esp_vfs_eventfd_unregister(); + vTaskDelete(NULL); +} + +// DataSet Implementation +DataSet::DataSet() { + memset(&mDataset, 0, sizeof(mDataset)); +} + +void DataSet::clear() { + memset(&mDataset, 0, sizeof(mDataset)); +} + +void DataSet::initNew() { + otInstance *mInstance = esp_openthread_get_instance(); + if (!mInstance) { + log_e("OpenThread not started. Please begin() it before initializing a new dataset."); + return; + } + clear(); + otDatasetCreateNewNetwork(mInstance, &mDataset); +} + +const otOperationalDataset &DataSet::getDataset() const { + return mDataset; +} + +void DataSet::setNetworkName(const char *name) { + strncpy(mDataset.mNetworkName.m8, name, sizeof(mDataset.mNetworkName.m8)); + mDataset.mComponents.mIsNetworkNamePresent = true; +} + +void DataSet::setExtendedPanId(const uint8_t *extPanId) { + memcpy(mDataset.mExtendedPanId.m8, extPanId, OT_EXT_PAN_ID_SIZE); + mDataset.mComponents.mIsExtendedPanIdPresent = true; +} + +void DataSet::setNetworkKey(const uint8_t *key) { + memcpy(mDataset.mNetworkKey.m8, key, OT_NETWORK_KEY_SIZE); + mDataset.mComponents.mIsNetworkKeyPresent = true; +} + +void DataSet::setChannel(uint8_t channel) { + mDataset.mChannel = channel; + mDataset.mComponents.mIsChannelPresent = true; +} + +void DataSet::setPanId(uint16_t panId) { + mDataset.mPanId = panId; + mDataset.mComponents.mIsPanIdPresent = true; +} + +const char *DataSet::getNetworkName() const { + return mDataset.mNetworkName.m8; +} + +const uint8_t *DataSet::getExtendedPanId() const { + return mDataset.mExtendedPanId.m8; +} + +const uint8_t *DataSet::getNetworkKey() const { + return mDataset.mNetworkKey.m8; +} + +uint8_t DataSet::getChannel() const { + return mDataset.mChannel; +} + +uint16_t DataSet::getPanId() const { + return mDataset.mPanId; +} + +void DataSet::apply(otInstance *instance) { + otDatasetSetActive(instance, &mDataset); +} + +// OpenThread Implementation +bool OpenThread::otStarted = false; + +otInstance *OpenThread::mInstance = nullptr; +OpenThread::OpenThread() {} + +OpenThread::~OpenThread() { + end(); +} + +OpenThread::operator bool() const { + return otStarted; +} + +void OpenThread::begin(bool OThreadAutoStart) { + if (otStarted) { + log_w("OpenThread already started"); + return; + } + + memset(&ot_native_config, 0, sizeof(esp_openthread_platform_config_t)); + ot_native_config.radio_config.radio_mode = RADIO_MODE_NATIVE; + ot_native_config.host_config.host_connection_mode = HOST_CONNECTION_MODE_NONE; + ot_native_config.port_config.storage_partition_name = "nvs"; + ot_native_config.port_config.netif_queue_size = 10; + ot_native_config.port_config.task_queue_size = 10; + + // Initialize OpenThread stack + xTaskCreate(ot_task_worker, "ot_main_loop", 10240, NULL, 20, &s_ot_task); + if (s_ot_task == NULL) { + log_e("Error: Failed to create OpenThread task"); + return; + } + log_d("OpenThread task created successfully"); + // get the OpenThread instance that will be used for all operations + mInstance = esp_openthread_get_instance(); + if (!mInstance) { + log_e("Error: Failed to initialize OpenThread instance"); + end(); + return; + } + // starts Thread with default dataset from NVS or from IDF default settings + if (OThreadAutoStart) { + otOperationalDatasetTlvs dataset; + otError error = otDatasetGetActiveTlvs(esp_openthread_get_instance(), &dataset); + // error = OT_ERROR_FAILED; // teste para forçar NULL dataset + if (error != OT_ERROR_NONE) { + log_i("Failed to get active NVS dataset from OpenThread"); + } else { + log_i("Got active NVS dataset from OpenThread"); + } + esp_err_t err = esp_openthread_auto_start((error == OT_ERROR_NONE) ? &dataset : NULL); + if (err != ESP_OK) { + log_i("Failed to AUTO start OpenThread"); + } else { + log_i("AUTO start OpenThread done"); + } + } + otStarted = true; +} + +void OpenThread::end() { + if (s_ot_task != NULL) { + vTaskDelete(s_ot_task); + s_ot_task = NULL; + // Clean up + esp_openthread_deinit(); + esp_openthread_netif_glue_deinit(); +#if CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM + ot_lwip_netif = NULL; +#endif + esp_netif_destroy(openthread_netif); + esp_vfs_eventfd_unregister(); + } + otStarted = false; +} + +void OpenThread::start() { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return; + } + otThreadSetEnabled(mInstance, true); + log_d("Thread network started"); +} + +void OpenThread::stop() { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return; + } + otThreadSetEnabled(mInstance, false); + log_d("Thread network stopped"); +} + +void OpenThread::networkInterfaceUp() { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return; + } + // Enable the Thread interface (equivalent to CLI Command "ifconfig up") + otError error = otIp6SetEnabled(mInstance, true); + if (error != OT_ERROR_NONE) { + log_e("Error: Failed to enable Thread interface (error code: %d)\n", error); + } + log_d("OpenThread Network Interface is up"); +} + +void OpenThread::networkInterfaceDown() { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return; + } + // Disable the Thread interface (equivalent to CLI Command "ifconfig down") + otError error = otIp6SetEnabled(mInstance, false); + if (error != OT_ERROR_NONE) { + log_e("Error: Failed to disable Thread interface (error code: %d)\n", error); + } + log_d("OpenThread Network Interface is down"); +} + +void OpenThread::commitDataSet(const DataSet &dataset) { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return; + } + // Commit the dataset as the active dataset + otError error = otDatasetSetActive(mInstance, &(dataset.getDataset())); + if (error != OT_ERROR_NONE) { + log_e("Error: Failed to commit dataset (error code: %d)\n", error); + return; + } + log_d("Dataset committed successfully"); +} + +ot_device_role_t OpenThread::otGetDeviceRole() { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return OT_ROLE_DISABLED; + } + return (ot_device_role_t)otThreadGetDeviceRole(mInstance); +} + +const char *OpenThread::otGetStringDeviceRole() { + return otRoleString[otGetDeviceRole()]; +} + +void OpenThread::otPrintNetworkInformation(Stream &output) { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return; + } + + output.printf("Role: %s", otGetStringDeviceRole()); + output.println(); + output.printf("Network Name: %s", otThreadGetNetworkName(mInstance)); + output.println(); + output.printf("Channel: %d", otLinkGetChannel(mInstance)); + output.println(); + output.printf("PAN ID: 0x%04x", otLinkGetPanId(mInstance)); + output.println(); + + const otExtendedPanId *extPanId = otThreadGetExtendedPanId(mInstance); + output.print("Extended PAN ID: "); + for (int i = 0; i < OT_EXT_PAN_ID_SIZE; i++) { + output.printf("%02x", extPanId->m8[i]); + } + output.println(); + + otNetworkKey networkKey; + otThreadGetNetworkKey(mInstance, &networkKey); + output.print("Network Key: "); + for (int i = 0; i < OT_NETWORK_KEY_SIZE; i++) { + output.printf("%02x", networkKey.m8[i]); + } + output.println(); +} + +OpenThread OThread; + +#endif /* CONFIG_OPENTHREAD_ENABLED */ +#endif /* SOC_IEEE802154_SUPPORTED */ diff --git a/libraries/OpenThread/src/OThread.h b/libraries/OpenThread/src/OThread.h new file mode 100644 index 00000000000..359d581bb9d --- /dev/null +++ b/libraries/OpenThread/src/OThread.h @@ -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. + +#pragma once +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if SOC_IEEE802154_SUPPORTED +#if CONFIG_OPENTHREAD_ENABLED + +#include +#include +#include +#include +#include +#include +#include + +typedef enum { + OT_ROLE_DISABLED = 0, ///< The Thread stack is disabled. + OT_ROLE_DETACHED = 1, ///< Not currently participating in a Thread network/partition. + OT_ROLE_CHILD = 2, ///< The Thread Child role. + OT_ROLE_ROUTER = 3, ///< The Thread Router role. + OT_ROLE_LEADER = 4, ///< The Thread Leader role. +} ot_device_role_t; +extern const char *otRoleString[]; + +class DataSet { +public: + DataSet(); + void clear(); + void initNew(); + const otOperationalDataset &getDataset() const; + + // Setters + void setNetworkName(const char *name); + void setExtendedPanId(const uint8_t *extPanId); + void setNetworkKey(const uint8_t *key); + void setChannel(uint8_t channel); + void setPanId(uint16_t panId); + + // Getters + const char *getNetworkName() const; + const uint8_t *getExtendedPanId() const; + const uint8_t *getNetworkKey() const; + uint8_t getChannel() const; + uint16_t getPanId() const; + + // Apply the dataset to the OpenThread instance + void apply(otInstance *instance); + +private: + otOperationalDataset mDataset; +}; + +class OpenThread { +public: + static bool otStarted; + static ot_device_role_t otGetDeviceRole(); + static const char *otGetStringDeviceRole(); + static void otPrintNetworkInformation(Stream &output); + + OpenThread(); + ~OpenThread(); + // returns true if OpenThread Stack is running + operator bool() const; + + // Initialize OpenThread + static void begin(bool OThreadAutoStart = true); + + // Initialize OpenThread + static void end(); + + // Start the Thread network + void start(); + + // Stop the Thread network + void stop(); + + // Start Thread Network Interface + void networkInterfaceUp(); + + // Stop Thread Network Interface + void networkInterfaceDown(); + + // Set the dataset + void commitDataSet(const DataSet &dataset); + +private: + static otInstance *mInstance; + DataSet mCurrentDataSet; +}; + +extern OpenThread OThread; + +#endif /* CONFIG_OPENTHREAD_ENABLED */ +#endif /* SOC_IEEE802154_SUPPORTED */ diff --git a/libraries/OpenThread/src/OThreadCLI.cpp b/libraries/OpenThread/src/OThreadCLI.cpp index 85ba03563e8..2f0f97a0539 100644 --- a/libraries/OpenThread/src/OThreadCLI.cpp +++ b/libraries/OpenThread/src/OThreadCLI.cpp @@ -33,18 +33,12 @@ #include "esp_netif_net_stack.h" #include "lwip/netif.h" +bool OpenThreadCLI::otCLIStarted = false; static TaskHandle_t s_cli_task = NULL; static TaskHandle_t s_console_cli_task = NULL; static QueueHandle_t rx_queue = NULL; static QueueHandle_t tx_queue = NULL; -static esp_openthread_platform_config_t ot_native_config; -static TaskHandle_t s_ot_task = NULL; -static esp_netif_t *openthread_netif = NULL; -#if CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM -static struct netif *ot_lwip_netif = NULL; -#endif - #define OT_CLI_MAX_LINE_LENGTH 512 typedef struct { @@ -53,21 +47,7 @@ typedef struct { String prompt; OnReceiveCb_t responseCallBack; } ot_cli_console_t; -static ot_cli_console_t otConsole = {NULL, false, (const char *)NULL, NULL}; - -#if CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM -extern "C" int lwip_hook_ip6_input(struct pbuf *p, struct netif *inp) { - if (ot_lwip_netif && ot_lwip_netif == inp) { - return 0; - } - if (ip6_addr_isany_val(inp->ip6_addr[0].u_addr.ip6)) { - // We don't have an LL address -> eat this packet here, so it won't get accepted on input netif - pbuf_free(p); - return 1; - } - return 0; -} -#endif +static ot_cli_console_t otConsole = {nullptr, false, (const char *)nullptr, nullptr}; // process the CLI commands sent to the OpenThread stack static void ot_cli_loop(void *context) { @@ -131,7 +111,7 @@ static int ot_cli_output_callback(void *context, const char *format, va_list arg } // if there is a user callback function in place, it shall have the priority // to process/consume the Stream data received from OpenThread CLI, which is available in its RX Buffer - if (otConsole.responseCallBack != NULL) { + if (otConsole.responseCallBack != nullptr) { otConsole.responseCallBack(); } } @@ -205,7 +185,7 @@ void OpenThreadCLI::setEchoBack(bool echoback) { } void OpenThreadCLI::setPrompt(char *prompt) { - otConsole.prompt = prompt; // NULL will make the prompt not visible + otConsole.prompt = prompt; // nullptr can make the prompt not visible } void OpenThreadCLI::setStream(Stream &otStream) { @@ -213,12 +193,12 @@ void OpenThreadCLI::setStream(Stream &otStream) { } void OpenThreadCLI::onReceive(OnReceiveCb_t func) { - otConsole.responseCallBack = func; // NULL will set it off + otConsole.responseCallBack = func; // nullptr will set it off } // Stream object shall be already started and configured before calling this function void OpenThreadCLI::startConsole(Stream &otStream, bool echoback, const char *prompt) { - if (!otStarted) { + if (!otCLIStarted) { log_e("OpenThread CLI has not started. Please begin() it before starting the console."); return; } @@ -226,7 +206,7 @@ void OpenThreadCLI::startConsole(Stream &otStream, bool echoback, const char *pr if (s_console_cli_task == NULL) { otConsole.cliStream = &otStream; otConsole.echoback = echoback; - otConsole.prompt = prompt; // NULL will invalidate the String + otConsole.prompt = prompt; // nullptr will invalidate the String // it will run in the same priority (1) as the Arduino setup()/loop() task xTaskCreate(ot_cli_console_worker, "ot_cli_console", 4096, &otConsole, 1, &s_console_cli_task); } else { @@ -242,12 +222,6 @@ void OpenThreadCLI::stopConsole() { } OpenThreadCLI::OpenThreadCLI() { - memset(&ot_native_config, 0, sizeof(esp_openthread_platform_config_t)); - ot_native_config.radio_config.radio_mode = RADIO_MODE_NATIVE; - ot_native_config.host_config.host_connection_mode = HOST_CONNECTION_MODE_NONE; - ot_native_config.port_config.storage_partition_name = "nvs"; - ot_native_config.port_config.netif_queue_size = 10; - ot_native_config.port_config.task_queue_size = 10; //sTxString = ""; } @@ -256,79 +230,19 @@ OpenThreadCLI::~OpenThreadCLI() { } OpenThreadCLI::operator bool() const { - return otStarted; + return otCLIStarted; } -static void ot_task_worker(void *aContext) { - esp_vfs_eventfd_config_t eventfd_config = { - .max_fds = 3, - }; - bool err = false; - if (ESP_OK != esp_event_loop_create_default()) { - log_e("Failed to create OpentThread event loop"); - err = true; - } - if (!err && ESP_OK != esp_netif_init()) { - log_e("Failed to initialize OpentThread netif"); - err = true; - } - if (!err && ESP_OK != esp_vfs_eventfd_register(&eventfd_config)) { - log_e("Failed to register OpentThread eventfd"); - err = true; - } - - // Initialize the OpenThread stack - if (!err && ESP_OK != esp_openthread_init(&ot_native_config)) { - log_e("Failed to initialize OpenThread stack"); - err = true; - } - if (!err) { - // Initialize the OpenThread cli - otCliInit(esp_openthread_get_instance(), ot_cli_output_callback, NULL); - - // Initialize the esp_netif bindings - esp_netif_config_t cfg = ESP_NETIF_DEFAULT_OPENTHREAD(); - openthread_netif = esp_netif_new(&cfg); -#if CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM - // Get LwIP Netif - if (openthread_netif != NULL) { - ot_lwip_netif = (struct netif *)esp_netif_get_netif_impl(openthread_netif); - if (ot_lwip_netif == NULL) { - log_e("Failed to get OpenThread LwIP netif"); - } - } -#endif - } - if (!err && openthread_netif == NULL) { - log_e("Failed to create OpenThread esp_netif"); - err = true; - } - if (!err && ESP_OK != esp_netif_attach(openthread_netif, esp_openthread_netif_glue_init(&ot_native_config))) { - log_e("Failed to attach OpenThread esp_netif"); - err = true; - } - if (!err && ESP_OK != esp_netif_set_default_netif(openthread_netif)) { - log_e("Failed to set default OpenThread esp_netif"); - err = true; - } - if (!err) { - // only returns in case there is an OpenThread Stack failure... - esp_openthread_launch_mainloop(); - } - // Clean up - esp_openthread_netif_glue_deinit(); - esp_netif_destroy(openthread_netif); - esp_vfs_eventfd_unregister(); - vTaskDelete(NULL); -} - -void OpenThreadCLI::begin(bool OThreadAutoStart) { - if (otStarted) { +void OpenThreadCLI::begin() { + if (otCLIStarted) { log_w("OpenThread CLI already started. Please end() it before starting again."); return; } - xTaskCreate(ot_task_worker, "ot_main_loop", 10240, NULL, 20, &s_ot_task); + if (!OpenThread::otStarted) { + log_w("OpenThread not started. Please begin() it before starting CLI."); + return; + } //RX Buffer default has 1024 bytes if not preset if (rx_queue == NULL) { @@ -342,55 +256,29 @@ void OpenThreadCLI::begin(bool OThreadAutoStart) { log_e("HW CDC RX Buffer error"); } } + xTaskCreate(ot_cli_loop, "ot_cli", 4096, xTaskGetCurrentTaskHandle(), 2, &s_cli_task); + // Initialize the OpenThread cli + otCliInit(esp_openthread_get_instance(), ot_cli_output_callback, NULL); - // starts Thread with default dataset from NVS or from IDF default settings - if (OThreadAutoStart) { - otOperationalDatasetTlvs dataset; - otError error = otDatasetGetActiveTlvs(esp_openthread_get_instance(), &dataset); - // error = OT_ERROR_FAILED; // teste para forçar NULL dataset - if (error != OT_ERROR_NONE) { - log_i("Failed to get active NVS dataset from OpenThread"); - } else { - log_i("Got active NVS dataset from OpenThread"); - } - esp_err_t err = esp_openthread_auto_start((error == OT_ERROR_NONE) ? &dataset : NULL); - if (err != ESP_OK) { - log_i("Failed to AUTO start OpenThread"); - } else { - log_i("AUTO start OpenThread done"); - } - } - otStarted = true; + otCLIStarted = true; return; } void OpenThreadCLI::end() { - if (!otStarted) { + if (!otCLIStarted) { log_w("OpenThread CLI already stopped. Please begin() it before stopping again."); return; } - if (s_ot_task != NULL) { - vTaskDelete(s_ot_task); - // Clean up - esp_openthread_deinit(); - esp_openthread_netif_glue_deinit(); -#if CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM - ot_lwip_netif = NULL; -#endif - esp_netif_destroy(openthread_netif); - esp_vfs_eventfd_unregister(); - } if (s_cli_task != NULL) { vTaskDelete(s_cli_task); + s_cli_task = NULL; } - if (s_console_cli_task != NULL) { - vTaskDelete(s_console_cli_task); - } + stopConsole(); esp_event_loop_delete_default(); setRxBufferSize(0); setTxBufferSize(0); - otStarted = false; + otCLIStarted = false; } size_t OpenThreadCLI::write(uint8_t c) { diff --git a/libraries/OpenThread/src/OThreadCLI.h b/libraries/OpenThread/src/OThreadCLI.h index bc8dc5d2b19..788edc2709b 100644 --- a/libraries/OpenThread/src/OThreadCLI.h +++ b/libraries/OpenThread/src/OThreadCLI.h @@ -21,7 +21,6 @@ #include "esp_openthread.h" #include "esp_openthread_cli.h" #include "esp_openthread_lock.h" -#include "esp_openthread_netif_glue.h" #include "esp_openthread_types.h" #include "openthread/cli.h" @@ -31,13 +30,14 @@ #include "openthread/dataset_ftd.h" #include "Arduino.h" +#include "OThread.h" typedef std::function OnReceiveCb_t; class OpenThreadCLI : public Stream { private: static size_t setBuffer(QueueHandle_t &queue, size_t len); - bool otStarted = false; + static bool otCLIStarted; public: OpenThreadCLI(); @@ -53,7 +53,7 @@ class OpenThreadCLI : public Stream { void setStream(Stream &otStream); // changes the console Stream object void onReceive(OnReceiveCb_t func); // called on a complete line of output from OT CLI, as OT Response - void begin(bool OThreadAutoStart = true); + void begin(); void end(); // default size is 256 bytes diff --git a/libraries/OpenThread/src/OThreadCLI_Util.cpp b/libraries/OpenThread/src/OThreadCLI_Util.cpp index d21daa1effc..aad435107bb 100644 --- a/libraries/OpenThread/src/OThreadCLI_Util.cpp +++ b/libraries/OpenThread/src/OThreadCLI_Util.cpp @@ -19,26 +19,6 @@ #include "OThreadCLI_Util.h" #include -static const char *otRoleString[] = { - "Disabled", ///< The Thread stack is disabled. - "Detached", ///< Not currently participating in a Thread network/partition. - "Child", ///< The Thread Child role. - "Router", ///< The Thread Router role. - "Leader", ///< The Thread Leader role. -}; - -ot_device_role_t otGetDeviceRole() { - if (!OThreadCLI) { - return OT_ROLE_DISABLED; - } - otInstance *instance = esp_openthread_get_instance(); - return (ot_device_role_t)otThreadGetDeviceRole(instance); -} - -const char *otGetStringDeviceRole() { - return otRoleString[otGetDeviceRole()]; -} - bool otGetRespCmd(const char *cmd, char *resp, uint32_t respTimeout) { if (!OThreadCLI) { return false; @@ -174,7 +154,7 @@ bool otPrintRespCLI(const char *cmd, Stream &output, uint32_t respTimeout) { return true; } -void otPrintNetworkInformation(Stream &output) { +void otCLIPrintNetworkInformation(Stream &output) { if (!OThreadCLI) { return; } diff --git a/libraries/OpenThread/src/OThreadCLI_Util.h b/libraries/OpenThread/src/OThreadCLI_Util.h index 1ab2e061dfc..116b886e095 100644 --- a/libraries/OpenThread/src/OThreadCLI_Util.h +++ b/libraries/OpenThread/src/OThreadCLI_Util.h @@ -18,25 +18,14 @@ #if SOC_IEEE802154_SUPPORTED #if CONFIG_OPENTHREAD_ENABLED -typedef enum { - OT_ROLE_DISABLED = 0, ///< The Thread stack is disabled. - OT_ROLE_DETACHED = 1, ///< Not currently participating in a Thread network/partition. - OT_ROLE_CHILD = 2, ///< The Thread Child role. - OT_ROLE_ROUTER = 3, ///< The Thread Router role. - OT_ROLE_LEADER = 4, ///< The Thread Leader role. -} ot_device_role_t; - typedef struct { int errorCode; String errorMessage; } ot_cmd_return_t; -ot_device_role_t otGetDeviceRole(); -const char *otGetStringDeviceRole(); bool otGetRespCmd(const char *cmd, char *resp = NULL, uint32_t respTimeout = 5000); bool otExecCommand(const char *cmd, const char *arg, ot_cmd_return_t *returnCode = NULL); bool otPrintRespCLI(const char *cmd, Stream &output, uint32_t respTimeout); -void otPrintNetworkInformation(Stream &output); #endif /* CONFIG_OPENTHREAD_ENABLED */ #endif /* SOC_IEEE802154_SUPPORTED */ From 7462b09bb4818fd77a40bcaace5663e255bae8f8 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 Jun 2025 13:44:11 +0200 Subject: [PATCH 171/290] feat(LEDC): Add Gamma Fade support and enhance auto channel/timer selection for multi-group (#11464) * feat(ledc): Enhance LEDC auto channel/timer selection for multi-group support * feat(ledc): Add Gamma Fade support * fix(example): Update comments * 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-ledc.c | 264 ++++++++++++++++-- cores/esp32/esp32-hal-ledc.h | 79 ++++++ .../AnalogOut/LEDCGammaFade/LEDCGammaFade.ino | 111 ++++++++ .../examples/AnalogOut/LEDCGammaFade/ci.json | 5 + 4 files changed, 428 insertions(+), 31 deletions(-) create mode 100644 libraries/ESP32/examples/AnalogOut/LEDCGammaFade/LEDCGammaFade.ino create mode 100644 libraries/ESP32/examples/AnalogOut/LEDCGammaFade/ci.json diff --git a/cores/esp32/esp32-hal-ledc.c b/cores/esp32/esp32-hal-ledc.c index 764c2803b4b..18b722f80a2 100644 --- a/cores/esp32/esp32-hal-ledc.c +++ b/cores/esp32/esp32-hal-ledc.c @@ -22,6 +22,9 @@ #include "soc/gpio_sig_map.h" #include "esp_rom_gpio.h" #include "hal/ledc_ll.h" +#if SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED +#include +#endif #ifdef SOC_LEDC_SUPPORT_HS_MODE #define LEDC_CHANNELS (SOC_LEDC_CHANNEL_NUM << 1) @@ -56,7 +59,7 @@ static bool find_matching_timer(uint8_t speed_mode, uint32_t freq, uint8_t resol peripheral_bus_type_t type = perimanGetPinBusType(i); if (type == ESP32_BUS_TYPE_LEDC) { ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(i, ESP32_BUS_TYPE_LEDC); - if (bus != NULL && (bus->channel / 8) == speed_mode && bus->freq_hz == freq && bus->channel_resolution == resolution) { + if (bus != NULL && (bus->channel / SOC_LEDC_CHANNEL_NUM) == speed_mode && bus->freq_hz == freq && bus->channel_resolution == resolution) { log_d("Found matching timer %u for freq=%u, resolution=%u", bus->timer_num, freq, resolution); *timer_num = bus->timer_num; return true; @@ -78,7 +81,7 @@ static bool find_free_timer(uint8_t speed_mode, uint8_t *timer_num) { peripheral_bus_type_t type = perimanGetPinBusType(i); if (type == ESP32_BUS_TYPE_LEDC) { ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(i, ESP32_BUS_TYPE_LEDC); - if (bus != NULL && (bus->channel / 8) == speed_mode) { + if (bus != NULL && (bus->channel / SOC_LEDC_CHANNEL_NUM) == speed_mode) { log_d("Timer %u is in use by channel %u", bus->timer_num, bus->channel); used_timers |= (1 << bus->timer_num); } @@ -110,7 +113,7 @@ static void remove_channel_from_timer(uint8_t speed_mode, uint8_t timer_num, uin peripheral_bus_type_t type = perimanGetPinBusType(i); if (type == ESP32_BUS_TYPE_LEDC) { ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(i, ESP32_BUS_TYPE_LEDC); - if (bus != NULL && (bus->channel / 8) == speed_mode && bus->timer_num == timer_num && bus->channel != channel) { + if (bus != NULL && (bus->channel / SOC_LEDC_CHANNEL_NUM) == speed_mode && bus->timer_num == timer_num && bus->channel != channel) { log_d("Timer %u is still in use by channel %u", timer_num, bus->channel); timer_in_use = true; break; @@ -168,8 +171,8 @@ static bool ledcDetachBus(void *bus) { } pinMatrixOutDetach(handle->pin, false, false); if (!channel_found) { - uint8_t group = (handle->channel / 8); - remove_channel_from_timer(group, handle->timer_num, handle->channel % 8); + uint8_t group = (handle->channel / SOC_LEDC_CHANNEL_NUM); + remove_channel_from_timer(group, handle->timer_num, handle->channel % SOC_LEDC_CHANNEL_NUM); ledc_handle.used_channels &= ~(1UL << handle->channel); } free(handle); @@ -206,13 +209,13 @@ bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t c return false; } - uint8_t group = (channel / 8); + uint8_t group = (channel / SOC_LEDC_CHANNEL_NUM); uint8_t timer = 0; bool channel_used = ledc_handle.used_channels & (1UL << channel); if (channel_used) { log_i("Channel %u is already set up, given frequency and resolution will be ignored", channel); - if (ledc_set_pin(pin, group, channel % 8) != ESP_OK) { + if (ledc_set_pin(pin, group, channel % SOC_LEDC_CHANNEL_NUM) != ESP_OK) { log_e("Attaching pin to already used channel failed!"); return false; } @@ -220,7 +223,7 @@ bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t c // Find a timer with matching frequency and resolution, or a free timer if (!find_matching_timer(group, freq, resolution, &timer)) { if (!find_free_timer(group, &timer)) { - log_e("No free timers available for speed mode %u", group); + log_w("No free timers available for speed mode %u", group); return false; } @@ -239,12 +242,12 @@ bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t c } } - uint32_t duty = ledc_get_duty(group, (channel % 8)); + uint32_t duty = ledc_get_duty(group, (channel % SOC_LEDC_CHANNEL_NUM)); ledc_channel_config_t ledc_channel; memset((void *)&ledc_channel, 0, sizeof(ledc_channel_config_t)); ledc_channel.speed_mode = group; - ledc_channel.channel = (channel % 8); + ledc_channel.channel = (channel % SOC_LEDC_CHANNEL_NUM); ledc_channel.timer_sel = timer; ledc_channel.intr_type = LEDC_INTR_DISABLE; ledc_channel.gpio_num = pin; @@ -274,7 +277,7 @@ bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t c ledc_handle.used_channels |= 1UL << channel; } - if (!perimanSetPinBus(pin, ESP32_BUS_TYPE_LEDC, (void *)handle, group, channel)) { + if (!perimanSetPinBus(pin, ESP32_BUS_TYPE_LEDC, (void *)handle, channel, timer)) { ledcDetachBus((void *)handle); return false; } @@ -291,14 +294,40 @@ bool ledcAttach(uint8_t pin, uint32_t freq, uint8_t resolution) { } uint8_t channel = __builtin_ctz(free_channel); // Convert the free_channel bit to channel number - return ledcAttachChannel(pin, freq, resolution, channel); + // Try the first available channel + if (ledcAttachChannel(pin, freq, resolution, channel)) { + return true; + } + +#ifdef SOC_LEDC_SUPPORT_HS_MODE + // If first attempt failed and HS mode is supported, try to find a free channel in group 1 + if ((channel / SOC_LEDC_CHANNEL_NUM) == 0) { // First attempt was in group 0 + log_d("LEDC: Group 0 channel %u failed, trying to find a free channel in group 1", channel); + // Find free channels specifically in group 1 + uint32_t group1_mask = ((1UL << SOC_LEDC_CHANNEL_NUM) - 1) << SOC_LEDC_CHANNEL_NUM; + int group1_free_channel = (~ledc_handle.used_channels) & group1_mask; + if (group1_free_channel != 0) { + uint8_t group1_channel = __builtin_ctz(group1_free_channel); + if (ledcAttachChannel(pin, freq, resolution, group1_channel)) { + return true; + } + } + } +#endif + + log_e( + "No free timers available for freq=%u, resolution=%u. To attach a new channel, use the same frequency and resolution as an already attached channel to " + "share its timer.", + freq, resolution + ); + return false; } bool ledcWrite(uint8_t pin, uint32_t duty) { ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(pin, ESP32_BUS_TYPE_LEDC); if (bus != NULL) { - uint8_t group = (bus->channel / 8), channel = (bus->channel % 8); + uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM), channel = (bus->channel % SOC_LEDC_CHANNEL_NUM); //Fixing if all bits in resolution is set = LEDC FULL ON uint32_t max_duty = (1 << bus->channel_resolution) - 1; @@ -307,8 +336,14 @@ bool ledcWrite(uint8_t pin, uint32_t duty) { duty = max_duty + 1; } - ledc_set_duty(group, channel, duty); - ledc_update_duty(group, channel); + if (ledc_set_duty(group, channel, duty) != ESP_OK) { + log_e("ledc_set_duty failed"); + return false; + } + if (ledc_update_duty(group, channel) != ESP_OK) { + log_e("ledc_update_duty failed"); + return false; + } return true; } @@ -321,7 +356,11 @@ bool ledcWriteChannel(uint8_t channel, uint32_t duty) { log_e("Channel %u is not available (maximum %u) or not used!", channel, LEDC_CHANNELS); return false; } - uint8_t group = (channel / 8), timer = ((channel / 2) % 4); + uint8_t group = (channel / SOC_LEDC_CHANNEL_NUM); + ledc_timer_t timer; + + // Get the actual timer being used by this channel + ledc_ll_get_channel_timer(LEDC_LL_GET_HW(), group, (channel % SOC_LEDC_CHANNEL_NUM), &timer); //Fixing if all bits in resolution is set = LEDC FULL ON uint32_t resolution = 0; @@ -333,8 +372,14 @@ bool ledcWriteChannel(uint8_t channel, uint32_t duty) { duty = max_duty + 1; } - ledc_set_duty(group, channel, duty); - ledc_update_duty(group, channel); + if (ledc_set_duty(group, channel, duty) != ESP_OK) { + log_e("ledc_set_duty failed"); + return false; + } + if (ledc_update_duty(group, channel) != ESP_OK) { + log_e("ledc_update_duty failed"); + return false; + } return true; } @@ -343,7 +388,7 @@ uint32_t ledcRead(uint8_t pin) { ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(pin, ESP32_BUS_TYPE_LEDC); if (bus != NULL) { - uint8_t group = (bus->channel / 8), channel = (bus->channel % 8); + uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM), channel = (bus->channel % SOC_LEDC_CHANNEL_NUM); return ledc_get_duty(group, channel); } return 0; @@ -355,8 +400,8 @@ uint32_t ledcReadFreq(uint8_t pin) { if (!ledcRead(pin)) { return 0; } - uint8_t group = (bus->channel / 8), timer = ((bus->channel / 2) % 4); - return ledc_get_freq(group, timer); + uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM); + return ledc_get_freq(group, bus->timer_num); } return 0; } @@ -370,12 +415,12 @@ uint32_t ledcWriteTone(uint8_t pin, uint32_t freq) { return 0; } - uint8_t group = (bus->channel / 8), timer = ((bus->channel / 2) % 4); + uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM); ledc_timer_config_t ledc_timer; memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t)); ledc_timer.speed_mode = group; - ledc_timer.timer_num = timer; + ledc_timer.timer_num = bus->timer_num; ledc_timer.duty_resolution = 10; ledc_timer.freq_hz = freq; ledc_timer.clk_cfg = clock_source; @@ -386,7 +431,7 @@ uint32_t ledcWriteTone(uint8_t pin, uint32_t freq) { } bus->channel_resolution = 10; - uint32_t res_freq = ledc_get_freq(group, timer); + uint32_t res_freq = ledc_get_freq(group, bus->timer_num); ledcWrite(pin, 0x1FF); return res_freq; } @@ -427,12 +472,12 @@ uint32_t ledcChangeFrequency(uint8_t pin, uint32_t freq, uint8_t resolution) { log_e("LEDC pin %u - resolution is zero or it is too big (maximum %u)", pin, LEDC_MAX_BIT_WIDTH); return 0; } - uint8_t group = (bus->channel / 8), timer = ((bus->channel / 2) % 4); + uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM); ledc_timer_config_t ledc_timer; memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t)); ledc_timer.speed_mode = group; - ledc_timer.timer_num = timer; + ledc_timer.timer_num = bus->timer_num; ledc_timer.duty_resolution = resolution; ledc_timer.freq_hz = freq; ledc_timer.clk_cfg = clock_source; @@ -442,7 +487,7 @@ uint32_t ledcChangeFrequency(uint8_t pin, uint32_t freq, uint8_t resolution) { return 0; } bus->channel_resolution = resolution; - return ledc_get_freq(group, timer); + return ledc_get_freq(group, bus->timer_num); } return 0; } @@ -453,12 +498,14 @@ bool ledcOutputInvert(uint8_t pin, bool out_invert) { gpio_set_level(pin, out_invert); #ifdef CONFIG_IDF_TARGET_ESP32P4 - esp_rom_gpio_connect_out_signal(pin, LEDC_LS_SIG_OUT_PAD_OUT0_IDX + ((bus->channel) % 8), out_invert, 0); + esp_rom_gpio_connect_out_signal(pin, LEDC_LS_SIG_OUT_PAD_OUT0_IDX + ((bus->channel) % SOC_LEDC_CHANNEL_NUM), out_invert, 0); #else #ifdef SOC_LEDC_SUPPORT_HS_MODE - esp_rom_gpio_connect_out_signal(pin, ((bus->channel / 8 == 0) ? LEDC_HS_SIG_OUT0_IDX : LEDC_LS_SIG_OUT0_IDX) + ((bus->channel) % 8), out_invert, 0); + esp_rom_gpio_connect_out_signal( + pin, ((bus->channel / SOC_LEDC_CHANNEL_NUM == 0) ? LEDC_HS_SIG_OUT0_IDX : LEDC_LS_SIG_OUT0_IDX) + ((bus->channel) % SOC_LEDC_CHANNEL_NUM), out_invert, 0 + ); #else - esp_rom_gpio_connect_out_signal(pin, LEDC_LS_SIG_OUT0_IDX + ((bus->channel) % 8), out_invert, 0); + esp_rom_gpio_connect_out_signal(pin, LEDC_LS_SIG_OUT0_IDX + ((bus->channel) % SOC_LEDC_CHANNEL_NUM), out_invert, 0); #endif #endif // ifdef CONFIG_IDF_TARGET_ESP32P4 return true; @@ -505,7 +552,7 @@ static bool ledcFadeConfig(uint8_t pin, uint32_t start_duty, uint32_t target_dut } #endif #endif - uint8_t group = (bus->channel / 8), channel = (bus->channel % 8); + uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM), channel = (bus->channel % SOC_LEDC_CHANNEL_NUM); // Initialize fade service. if (!fade_initialized) { @@ -562,6 +609,161 @@ bool ledcFadeWithInterruptArg(uint8_t pin, uint32_t start_duty, uint32_t target_ return ledcFadeConfig(pin, start_duty, target_duty, max_fade_time_ms, userFunc, arg); } +#ifdef SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED +// Default gamma factor for gamma correction (common value for LEDs) +static float ledcGammaFactor = 2.8; +// Gamma correction LUT support +static const float *ledcGammaLUT = NULL; +static uint16_t ledcGammaLUTSize = 0; +// Global variable to store current resolution for gamma callback +static uint8_t ledcGammaResolution = 13; + +bool ledcSetGammaTable(const float *gamma_table, uint16_t size) { + if (gamma_table == NULL || size == 0) { + log_e("Invalid gamma table or size"); + return false; + } + ledcGammaLUT = gamma_table; + ledcGammaLUTSize = size; + log_i("Custom gamma LUT set with %u entries", size); + return true; +} + +void ledcClearGammaTable(void) { + ledcGammaLUT = NULL; + ledcGammaLUTSize = 0; + log_i("Gamma LUT cleared, using mathematical calculation"); +} + +void ledcSetGammaFactor(float factor) { + ledcGammaFactor = factor; +} + +// Gamma correction calculator function +static uint32_t ledcGammaCorrection(uint32_t duty) { + if (duty == 0) { + return 0; + } + + uint32_t max_duty = (1U << ledcGammaResolution) - 1; + if (duty >= (1U << ledcGammaResolution)) { + return max_duty; + } + + // Use LUT if provided, otherwise use mathematical calculation + if (ledcGammaLUT != NULL && ledcGammaLUTSize > 0) { + // LUT-based gamma correction + uint32_t lut_index = (duty * (ledcGammaLUTSize - 1)) / max_duty; + if (lut_index >= ledcGammaLUTSize) { + lut_index = ledcGammaLUTSize - 1; + } + + float corrected_normalized = ledcGammaLUT[lut_index]; + return (uint32_t)(corrected_normalized * max_duty); + } else { + // Mathematical gamma correction + double normalized = (double)duty / (1U << ledcGammaResolution); + double corrected = pow(normalized, ledcGammaFactor); + return (uint32_t)(corrected * (1U << ledcGammaResolution)); + } +} + +static bool ledcFadeGammaConfig(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, void (*userFunc)(void *), void *arg) { + ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(pin, ESP32_BUS_TYPE_LEDC); + if (bus != NULL) { + +#ifndef SOC_LEDC_SUPPORT_FADE_STOP +#if !CONFIG_DISABLE_HAL_LOCKS + if (bus->lock == NULL) { + bus->lock = xSemaphoreCreateBinary(); + if (bus->lock == NULL) { + log_e("xSemaphoreCreateBinary failed"); + return false; + } + xSemaphoreGive(bus->lock); + } + //acquire lock + if (xSemaphoreTake(bus->lock, 0) != pdTRUE) { + log_e("LEDC Fade is still running on pin %u! SoC does not support stopping fade.", pin); + return false; + } +#endif +#endif + uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM), channel = (bus->channel % SOC_LEDC_CHANNEL_NUM); + + // Initialize fade service. + if (!fade_initialized) { + ledc_fade_func_install(0); + fade_initialized = true; + } + + bus->fn = (voidFuncPtr)userFunc; + bus->arg = arg; + + ledc_cbs_t callbacks = {.fade_cb = ledcFnWrapper}; + ledc_cb_register(group, channel, &callbacks, (void *)bus); + + // Prepare gamma curve fade parameters + ledc_fade_param_config_t fade_params[SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX]; + uint32_t actual_fade_ranges = 0; + + // Use a moderate number of linear segments for smooth gamma curve + const uint32_t linear_fade_segments = 12; + + // Set the global resolution for gamma correction + ledcGammaResolution = bus->channel_resolution; + + // Fill multi-fade parameter list using ESP-IDF API + esp_err_t err = ledc_fill_multi_fade_param_list( + group, channel, start_duty, target_duty, linear_fade_segments, max_fade_time_ms, ledcGammaCorrection, SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX, fade_params, + &actual_fade_ranges + ); + + if (err != ESP_OK) { + log_e("ledc_fill_multi_fade_param_list failed: %s", esp_err_to_name(err)); + return false; + } + + // Apply the gamma-corrected start duty + uint32_t gamma_start_duty = ledcGammaCorrection(start_duty); + + // Set multi-fade parameters + err = ledc_set_multi_fade(group, channel, gamma_start_duty, fade_params, actual_fade_ranges); + if (err != ESP_OK) { + log_e("ledc_set_multi_fade failed: %s", esp_err_to_name(err)); + return false; + } + + // Start the gamma curve fade + err = ledc_fade_start(group, channel, LEDC_FADE_NO_WAIT); + if (err != ESP_OK) { + log_e("ledc_fade_start failed: %s", esp_err_to_name(err)); + return false; + } + + log_d("Gamma curve fade started on pin %u: %u -> %u over %dms", pin, start_duty, target_duty, max_fade_time_ms); + + } else { + log_e("Pin %u is not attached to LEDC. Call ledcAttach first!", pin); + return false; + } + return true; +} + +bool ledcFadeGamma(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms) { + return ledcFadeGammaConfig(pin, start_duty, target_duty, max_fade_time_ms, NULL, NULL); +} + +bool ledcFadeGammaWithInterrupt(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, voidFuncPtr userFunc) { + return ledcFadeGammaConfig(pin, start_duty, target_duty, max_fade_time_ms, (voidFuncPtrArg)userFunc, NULL); +} + +bool ledcFadeGammaWithInterruptArg(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, void (*userFunc)(void *), void *arg) { + return ledcFadeGammaConfig(pin, start_duty, target_duty, max_fade_time_ms, userFunc, arg); +} + +#endif /* SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED */ + static uint8_t analog_resolution = 8; static int analog_frequency = 1000; void analogWrite(uint8_t pin, int value) { diff --git a/cores/esp32/esp32-hal-ledc.h b/cores/esp32/esp32-hal-ledc.h index f1a27dd4f7a..1663b884a3f 100644 --- a/cores/esp32/esp32-hal-ledc.h +++ b/cores/esp32/esp32-hal-ledc.h @@ -232,6 +232,85 @@ bool ledcFadeWithInterrupt(uint8_t pin, uint32_t start_duty, uint32_t target_dut */ bool ledcFadeWithInterruptArg(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, void (*userFunc)(void *), void *arg); +//Gamma Curve Fade functions - only available on supported chips +#ifdef SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED + +/** + * @brief Set a custom gamma correction lookup table for gamma curve fading. + * The LUT should contain normalized values (0.0 to 1.0) representing + * the gamma-corrected brightness curve. + * + * @param gamma_table Pointer to array of float values (0.0 to 1.0) + * @param size Number of entries in the lookup table + * + * @return true if gamma table was successfully set, false otherwise. + * + * @note The LUT array must remain valid for as long as gamma fading is used. + * Larger tables provide smoother transitions but use more memory. + */ +bool ledcSetGammaTable(const float *gamma_table, uint16_t size); + +/** + * @brief Clear the current gamma correction lookup table. + * After calling this, gamma correction will use mathematical + * calculation with the default gamma factor (2.8). + */ +void ledcClearGammaTable(void); + +/** + * @brief Set the gamma factor for gamma correction. + * + * @param factor Gamma factor to use for gamma correction. + */ +void ledcSetGammaFactor(float factor); + +/** + * @brief Setup and start a gamma curve fade on a given LEDC pin. + * Gamma correction makes LED brightness changes appear more gradual to human eyes. + * + * @param pin GPIO pin + * @param start_duty initial duty cycle of the fade + * @param target_duty target duty cycle of the fade + * @param max_fade_time_ms maximum fade time in milliseconds + * + * @return true if gamma fade was successfully set and started, false otherwise. + * + * @note This function is only available on ESP32 variants that support gamma curve fading. + */ +bool ledcFadeGamma(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms); + +/** + * @brief Setup and start a gamma curve fade on a given LEDC pin with a callback function. + * + * @param pin GPIO pin + * @param start_duty initial duty cycle of the fade + * @param target_duty target duty cycle of the fade + * @param max_fade_time_ms maximum fade time in milliseconds + * @param userFunc callback function to be called after fade is finished + * + * @return true if gamma fade was successfully set and started, false otherwise. + * + * @note This function is only available on ESP32 variants that support gamma curve fading. + */ +bool ledcFadeGammaWithInterrupt(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, void (*userFunc)(void)); + +/** + * @brief Setup and start a gamma curve fade on a given LEDC pin with a callback function and argument. + * + * @param pin GPIO pin + * @param start_duty initial duty cycle of the fade + * @param target_duty target duty cycle of the fade + * @param max_fade_time_ms maximum fade time in milliseconds + * @param userFunc callback function to be called after fade is finished + * @param arg argument to be passed to the callback function + * + * @return true if gamma fade was successfully set and started, false otherwise. + * + * @note This function is only available on ESP32 variants that support gamma curve fading. + */ +bool ledcFadeGammaWithInterruptArg(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, void (*userFunc)(void *), void *arg); +#endif // SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED + #ifdef __cplusplus } #endif diff --git a/libraries/ESP32/examples/AnalogOut/LEDCGammaFade/LEDCGammaFade.ino b/libraries/ESP32/examples/AnalogOut/LEDCGammaFade/LEDCGammaFade.ino new file mode 100644 index 00000000000..4ca6c136ddf --- /dev/null +++ b/libraries/ESP32/examples/AnalogOut/LEDCGammaFade/LEDCGammaFade.ino @@ -0,0 +1,111 @@ +/* LEDC Gamma Curve Fade Arduino Example + + This example demonstrates gamma curve fading on ESP32 variants that support it. + Gamma correction makes LED brightness changes appear more gradual and natural + to human eyes compared to linear fading. + + Two methods are supported: + 1. Using a pre-computed Gamma Look-Up Table (LUT) for better performance + 2. Using mathematical gamma correction with a gamma factor + + Supported chips: ESP32-C6, ESP32-C5, ESP32-H2, ESP32-P4 and future chips with Gamma Fade support + + Created by Jan Procházka (https://github.com/P-R-O-C-H-Y/) +*/ + +// use 12 bit precision for LEDC timer +#define LEDC_TIMER_12_BIT 12 + +// use 5000 Hz as a LEDC base frequency +#define LEDC_BASE_FREQ 5000 + +// define starting duty, target duty and maximum fade time +#define LEDC_START_DUTY (0) +#define LEDC_TARGET_DUTY (4095) +#define LEDC_FADE_TIME (2000) + +// gamma factor for mathematical calculation +#define LEDC_GAMMA_FACTOR (2.6) + +// use gamma LUT for better performance instead of mathematical calculation (gamma factor) +#define USE_GAMMA_LUT 1 + +// fade LED pins +const uint8_t ledPinR = 4; +const uint8_t ledPinG = 5; +const uint8_t ledPinB = 6; + +uint8_t fade_ended = 0; // status of LED gamma fade +bool fade_in = true; + +#ifdef USE_GAMMA_LUT +// Custom Gamma LUT demonstration with 101 steps (Brightness 0 - 100% gamma correction look up table (gamma = 2.6)) +// Y = B ^ 2.6 - Pre-computed LUT to save runtime computation +static const float ledcGammaLUT[101] = { + 0.000000, 0.000006, 0.000038, 0.000110, 0.000232, 0.000414, 0.000666, 0.000994, 0.001406, 0.001910, 0.002512, 0.003218, 0.004035, 0.004969, 0.006025, + 0.007208, 0.008525, 0.009981, 0.011580, 0.013328, 0.015229, 0.017289, 0.019512, 0.021902, 0.024465, 0.027205, 0.030125, 0.033231, 0.036527, 0.040016, + 0.043703, 0.047593, 0.051688, 0.055993, 0.060513, 0.065249, 0.070208, 0.075392, 0.080805, 0.086451, 0.092333, 0.098455, 0.104821, 0.111434, 0.118298, + 0.125416, 0.132792, 0.140428, 0.148329, 0.156498, 0.164938, 0.173653, 0.182645, 0.191919, 0.201476, 0.211321, 0.221457, 0.231886, 0.242612, 0.253639, + 0.264968, 0.276603, 0.288548, 0.300805, 0.313378, 0.326268, 0.339480, 0.353016, 0.366879, 0.381073, 0.395599, 0.410461, 0.425662, 0.441204, 0.457091, + 0.473325, 0.489909, 0.506846, 0.524138, 0.541789, 0.559801, 0.578177, 0.596920, 0.616032, 0.635515, 0.655374, 0.675610, 0.696226, 0.717224, 0.738608, + 0.760380, 0.782542, 0.805097, 0.828048, 0.851398, 0.875148, 0.899301, 0.923861, 0.948829, 0.974208, 1.000000, +}; +#endif + +void ARDUINO_ISR_ATTR LED_FADE_ISR() { + fade_ended += 1; +} + +void setup() { + // Initialize serial communication at 115200 bits per second: + Serial.begin(115200); + + // Setup timer with given frequency, resolution and attach it to a led pin with auto-selected channel + ledcAttach(ledPinR, LEDC_BASE_FREQ, LEDC_TIMER_12_BIT); + ledcAttach(ledPinG, LEDC_BASE_FREQ, LEDC_TIMER_12_BIT); + ledcAttach(ledPinB, LEDC_BASE_FREQ, LEDC_TIMER_12_BIT); + +#if USE_GAMMA_LUT // Use default gamma LUT for better performance + ledcSetGammaTable(ledcGammaLUT, 101); +#else // Use mathematical gamma correction (default, more flexible) + ledcSetGammaFactor(LEDC_GAMMA_FACTOR); // This is optional to set custom gamma factor (default is 2.8) +#endif + + // Setup and start gamma curve fade on led (duty from 0 to 4095) + ledcFadeGamma(ledPinR, LEDC_START_DUTY, LEDC_TARGET_DUTY, LEDC_FADE_TIME); + ledcFadeGamma(ledPinG, LEDC_START_DUTY, LEDC_TARGET_DUTY, LEDC_FADE_TIME); + ledcFadeGamma(ledPinB, LEDC_START_DUTY, LEDC_TARGET_DUTY, LEDC_FADE_TIME); + Serial.println("LED Gamma Fade on started."); + + // Wait for fade to end + delay(LEDC_FADE_TIME); + + // Setup and start gamma curve fade off led and use ISR (duty from 4095 to 0) + ledcFadeGammaWithInterrupt(ledPinR, LEDC_TARGET_DUTY, LEDC_START_DUTY, LEDC_FADE_TIME, LED_FADE_ISR); + ledcFadeGammaWithInterrupt(ledPinG, LEDC_TARGET_DUTY, LEDC_START_DUTY, LEDC_FADE_TIME, LED_FADE_ISR); + ledcFadeGammaWithInterrupt(ledPinB, LEDC_TARGET_DUTY, LEDC_START_DUTY, LEDC_FADE_TIME, LED_FADE_ISR); + Serial.println("LED Gamma Fade off started."); +} + +void loop() { + // Check if fade_ended flag was set to true in ISR + if (fade_ended == 3) { + Serial.println("LED gamma fade ended"); + fade_ended = 0; + + // Check what gamma fade should be started next + if (fade_in) { + ledcFadeGammaWithInterrupt(ledPinR, LEDC_START_DUTY, LEDC_TARGET_DUTY, LEDC_FADE_TIME, LED_FADE_ISR); + ledcFadeGammaWithInterrupt(ledPinG, LEDC_START_DUTY, LEDC_TARGET_DUTY, LEDC_FADE_TIME, LED_FADE_ISR); + ledcFadeGammaWithInterrupt(ledPinB, LEDC_START_DUTY, LEDC_TARGET_DUTY, LEDC_FADE_TIME, LED_FADE_ISR); + Serial.println("LED Gamma Fade in started."); + fade_in = false; + } else { + ledcFadeGammaWithInterrupt(ledPinR, LEDC_TARGET_DUTY, LEDC_START_DUTY, LEDC_FADE_TIME, LED_FADE_ISR); + ledcFadeGammaWithInterrupt(ledPinG, LEDC_TARGET_DUTY, LEDC_START_DUTY, LEDC_FADE_TIME, LED_FADE_ISR); + ledcFadeGammaWithInterrupt(ledPinB, LEDC_TARGET_DUTY, LEDC_START_DUTY, LEDC_FADE_TIME, LED_FADE_ISR); + Serial.println("LED Gamma Fade out started."); + fade_in = true; + } + } +} diff --git a/libraries/ESP32/examples/AnalogOut/LEDCGammaFade/ci.json b/libraries/ESP32/examples/AnalogOut/LEDCGammaFade/ci.json new file mode 100644 index 00000000000..a9d8603b7bf --- /dev/null +++ b/libraries/ESP32/examples/AnalogOut/LEDCGammaFade/ci.json @@ -0,0 +1,5 @@ +{ + "requires": [ + "CONFIG_SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED=y" + ] +} From 4bc5ffc88d9246946c832d08408130d888e45b41 Mon Sep 17 00:00:00 2001 From: is-qian <2716275834@qq.com> Date: Tue, 17 Jun 2025 18:39:33 +0800 Subject: [PATCH 172/290] fix: Delete 8M flash option for xiao_esp32_s3_plus. (#11476) --- boards.txt | 6 ++---- variants/XIAO_ESP32S3_Plus/pins_arduino.h | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/boards.txt b/boards.txt index 15a75eaad8b..b51a8840757 100644 --- a/boards.txt +++ b/boards.txt @@ -36051,12 +36051,12 @@ 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_size=16MB 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.partitions=ffat XIAO_ESP32S3_Plus.build.defines= XIAO_ESP32S3_Plus.build.loop_core= XIAO_ESP32S3_Plus.build.event_core= @@ -36093,8 +36093,6 @@ 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.FlashSize.16M=16MB (128Mb) XIAO_ESP32S3_Plus.menu.FlashSize.16M.build.flash_size=16MB diff --git a/variants/XIAO_ESP32S3_Plus/pins_arduino.h b/variants/XIAO_ESP32S3_Plus/pins_arduino.h index fb887287e35..de1c6093d44 100644 --- a/variants/XIAO_ESP32S3_Plus/pins_arduino.h +++ b/variants/XIAO_ESP32S3_Plus/pins_arduino.h @@ -4,7 +4,7 @@ #include #define USB_VID 0x2886 -#define USB_PID 0x0056 +#define USB_PID 0x0063 static const uint8_t LED_BUILTIN = 21; #define BUILTIN_LED LED_BUILTIN // backward compatibility From 6d4886cd1f821dbbd3827ce012dcef4e6bc14d23 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, 17 Jun 2025 15:23:35 +0200 Subject: [PATCH 173/290] feat(spi): Add return values to SPI begin (#11477) --- cores/esp32/esp32-hal-spi.h | 4 ++-- libraries/SPI/src/SPI.cpp | 9 +++++---- libraries/SPI/src/SPI.h | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/cores/esp32/esp32-hal-spi.h b/cores/esp32/esp32-hal-spi.h index 7d56f0820d3..565ca43f60d 100644 --- a/cores/esp32/esp32-hal-spi.h +++ b/cores/esp32/esp32-hal-spi.h @@ -38,8 +38,8 @@ extern "C" { #define HSPI 2 //SPI 2 bus normally mapped to pins 12 - 15, but can be matrixed to any pins #define VSPI 3 //SPI 3 bus normally attached to pins 5, 18, 19 and 23, but can be matrixed to any pins #else -#define FSPI 0 -#define HSPI 1 +#define FSPI 0 // ESP32C2, C3, C6, H2, S3, P4 - SPI 2 bus +#define HSPI 1 // ESP32S3, P4 - SPI 3 bus #endif // This defines are not representing the real Divider of the ESP32 diff --git a/libraries/SPI/src/SPI.cpp b/libraries/SPI/src/SPI.cpp index ae207a7ff3c..c0d7665df03 100644 --- a/libraries/SPI/src/SPI.cpp +++ b/libraries/SPI/src/SPI.cpp @@ -63,9 +63,9 @@ SPIClass::~SPIClass() { #endif } -void SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss) { +bool SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss) { if (_spi) { - return; + return true; } if (!_div) { @@ -74,7 +74,7 @@ void SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss) { _spi = spiStartBus(_spi_num, _div, SPI_MODE0, SPI_MSBFIRST); if (!_spi) { - return; + return false; } if (sck == -1 && miso == -1 && mosi == -1 && ss == -1) { @@ -110,10 +110,11 @@ void SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss) { if (_mosi >= 0 && !spiAttachMOSI(_spi, _mosi)) { goto err; } - return; + return true; err: log_e("Attaching pins to SPI failed."); + return false; } void SPIClass::end() { diff --git a/libraries/SPI/src/SPI.h b/libraries/SPI/src/SPI.h index 628c2190f50..6c300e53df2 100644 --- a/libraries/SPI/src/SPI.h +++ b/libraries/SPI/src/SPI.h @@ -61,7 +61,7 @@ class SPIClass { public: SPIClass(uint8_t spi_bus = HSPI); ~SPIClass(); - void begin(int8_t sck = -1, int8_t miso = -1, int8_t mosi = -1, int8_t ss = -1); + bool begin(int8_t sck = -1, int8_t miso = -1, int8_t mosi = -1, int8_t ss = -1); void end(); void setHwCs(bool use); From f7889116b1080fbc1d802c67f795132adb69bd77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Wed, 18 Jun 2025 19:55:11 +0200 Subject: [PATCH 174/290] feat(openthread): Add RLOC16 in otPrintNetworkInformation() (#11480) * feat(openthread): Add RLOC16 in otPrintNetworkInformation() --- libraries/OpenThread/src/OThread.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/OpenThread/src/OThread.cpp b/libraries/OpenThread/src/OThread.cpp index 43d8ce02918..7714d870cce 100644 --- a/libraries/OpenThread/src/OThread.cpp +++ b/libraries/OpenThread/src/OThread.cpp @@ -335,6 +335,8 @@ void OpenThread::otPrintNetworkInformation(Stream &output) { output.printf("Role: %s", otGetStringDeviceRole()); output.println(); + output.printf("RLOC16: 0x%04x", otThreadGetRloc16(mInstance)); // RLOC16 + output.println(); output.printf("Network Name: %s", otThreadGetNetworkName(mInstance)); output.println(); output.printf("Channel: %d", otLinkGetChannel(mInstance)); From 51f1367d57e07f6dd68b400771b354b501e1844f Mon Sep 17 00:00:00 2001 From: Wulu Date: Fri, 20 Jun 2025 17:22:01 +0800 Subject: [PATCH 175/290] fix(docs): correct code block indentation in core_compatibility.rst (#11471) * fix(docs): correct code block indentation in core compatibility guide * fix(docs): remove extra colon causing rendering error in core_compatibility.rst --- docs/en/guides/core_compatibility.rst | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/en/guides/core_compatibility.rst b/docs/en/guides/core_compatibility.rst index cb530ac5e7c..8b6a8e79d26 100644 --- a/docs/en/guides/core_compatibility.rst +++ b/docs/en/guides/core_compatibility.rst @@ -9,28 +9,28 @@ Welcome to the compatibility guide for library developers aiming to support mult Code Adaptations ---------------- -To ensure compatibility with both versions of the ESP32 Arduino core, developers should utilize conditional compilation directives in their code. Below is an example of how to conditionally include code based on the ESP32 Arduino core version:: +To ensure compatibility with both versions of the ESP32 Arduino core, developers should utilize conditional compilation directives in their code. Below is an example of how to conditionally include code based on the ESP32 Arduino core version: - .. code-block:: cpp +.. code-block:: cpp - #ifdef ESP_ARDUINO_VERSION_MAJOR - #if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 0) - // Code for version 3.x - #else - // Code for version 2.x - #endif - #else - // Code for version 1.x - #endif + #ifdef ESP_ARDUINO_VERSION_MAJOR + #if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 0) + // Code for version 3.x + #else + // Code for version 2.x + #endif + #else + // Code for version 1.x + #endif Version Print ------------- -To easily print the ESP32 Arduino core version at runtime, developers can use the `ESP_ARDUINO_VERSION_STR` macro. Below is an example of how to print the ESP32 Arduino core version:: +To easily print the ESP32 Arduino core version at runtime, developers can use the `ESP_ARDUINO_VERSION_STR` macro. Below is an example of how to print the ESP32 Arduino core version: - .. code-block:: cpp +.. code-block:: cpp - Serial.printf(" ESP32 Arduino core version: %s\n", ESP_ARDUINO_VERSION_STR); + Serial.printf(" ESP32 Arduino core version: %s\n", ESP_ARDUINO_VERSION_STR); API Differences --------------- From 02be6e8826fb7fad02b1d5b8492eabf541b21e03 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Fri, 20 Jun 2025 06:23:18 -0300 Subject: [PATCH 176/290] feat(esptool): Upgrade to esptool v5 (#11487) --- .github/scripts/package_esptool.sh | 129 ++++++++++++++++++++++ package/package_esp32_index.template.json | 70 ++++++------ platform.txt | 12 +- 3 files changed, 170 insertions(+), 41 deletions(-) create mode 100755 .github/scripts/package_esptool.sh diff --git a/.github/scripts/package_esptool.sh b/.github/scripts/package_esptool.sh new file mode 100755 index 00000000000..32b87b277e9 --- /dev/null +++ b/.github/scripts/package_esptool.sh @@ -0,0 +1,129 @@ +#!/bin/bash + +set -euo pipefail + +# Check version argument +if [[ $# -ne 3 ]]; then + echo "Usage: $0 " + echo "Example: $0 5.0.dev1 /tmp/esptool /tmp/esptool-5.0.dev1.json" + exit 1 +fi + +VERSION=$1 +BASE_FOLDER=$2 +JSON_PATH=$3 + +export COPYFILE_DISABLE=1 + +shopt -s nullglob # So for loop doesn't run if no matches + +# Function to update JSON for a given host +function update_json_for_host { + local host=$1 + local archive=$2 + + # Extract the old url from the JSON for this host, then replace only the filename + old_url=$(jq -r --arg host "$host" ' + .packages[].tools[] | select(.name == "esptool_py") | .systems[] | select(.host == $host) | .url // empty + ' "$tmp_json") + if [[ -n "$old_url" ]]; then + base_url="${old_url%/*}" + url="$base_url/$archive" + else + echo "No old url found for $host" + exit 1 + fi + + archiveFileName="$archive" + checksum="SHA-256:$(shasum -a 256 "$archive" | awk '{print $1}')" + size=$(stat -f%z "$archive") + + # Use jq to update the JSON + jq --arg host "$host" \ + --arg url "$url" \ + --arg archiveFileName "$archiveFileName" \ + --arg checksum "$checksum" \ + --arg size "$size" \ + ' + .packages[].tools[] + |= if .name == "esptool_py" then + .systems = ( + ((.systems // []) | map(select(.host != $host))) + [{ + host: $host, + url: $url, + archiveFileName: $archiveFileName, + checksum: $checksum, + size: $size + }] + ) + else + . + end + ' "$tmp_json" > "$tmp_json.new" && mv "$tmp_json.new" "$tmp_json" +} + +cd "$BASE_FOLDER" + +# Delete all archives before starting +rm -f esptool-*.tar.gz esptool-*.zip + +for dir in esptool-*; do + # Check if directory exists and is a directory + if [[ ! -d "$dir" ]]; then + continue + fi + + base="${dir#esptool-}" + + # Add 'linux-' prefix if base doesn't contain linux/macos/win64 + if [[ "$base" != *linux* && "$base" != *macos* && "$base" != *win64* ]]; then + base="linux-${base}" + fi + + if [[ "$dir" == esptool-win* ]]; then + # Windows zip archive + zipfile="esptool-v${VERSION}-${base}.zip" + echo "Creating $zipfile from $dir ..." + zip -r "$zipfile" "$dir" + else + # Non-Windows: set permissions and tar.gz archive + tarfile="esptool-v${VERSION}-${base}.tar.gz" + echo "Setting permissions and creating $tarfile from $dir ..." + chmod -R u=rwx,g=rx,o=rx "$dir" + tar -cvzf "$tarfile" "$dir" + fi +done + +# After the for loop, update the JSON for each archive +# Create a temporary JSON file to accumulate changes +tmp_json="${JSON_PATH}.tmp" +cp "$JSON_PATH" "$tmp_json" + +for archive in esptool-v"${VERSION}"-*.tar.gz esptool-v"${VERSION}"-*.zip; do + [ -f "$archive" ] || continue + + echo "Updating JSON for $archive" + + # Determine host from archive name + case "$archive" in + *linux-amd64*) host="x86_64-pc-linux-gnu" ;; + *linux-armv7*) host="arm-linux-gnueabihf" ;; + *linux-aarch64*) host="aarch64-linux-gnu" ;; + *macos-amd64*) host="x86_64-apple-darwin" ;; + *macos-arm64*) host="arm64-apple-darwin" ;; + *win64*) hosts=("x86_64-mingw32" "i686-mingw32") ;; + *) echo "Unknown host for $archive"; continue ;; + esac + + # For win64, loop over both hosts; otherwise, use a single host + if [[ "$archive" == *win64* ]]; then + for host in "${hosts[@]}"; do + update_json_for_host "$host" "$archive" + done + else + update_json_for_host "$host" "$archive" + fi +done + +# After all archives are processed, move the temporary JSON to the final file +mv "$tmp_json" "$JSON_PATH" diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 14aa8e9b4cf..22d3cc05455 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -81,7 +81,7 @@ { "packager": "esp32", "name": "esptool_py", - "version": "4.9.dev3" + "version": "5.0.dev1" }, { "packager": "esp32", @@ -469,56 +469,56 @@ }, { "name": "esptool_py", - "version": "4.9.dev3", + "version": "5.0.dev1", "systems": [ { - "host": "x86_64-pc-linux-gnu", - "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": "aarch64-linux-gnu", + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-linux-aarch64.tar.gz", + "archiveFileName": "esptool-v5.0.dev1-linux-aarch64.tar.gz", + "checksum": "SHA-256:bfafa7a7723ebbabfd8b6e3ca5ae00bfead0331de923754aeddb43b2c116a078", + "size": "58241736" }, { - "host": "arm-linux-gnueabihf", - "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": "x86_64-pc-linux-gnu", + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-linux-amd64.tar.gz", + "archiveFileName": "esptool-v5.0.dev1-linux-amd64.tar.gz", + "checksum": "SHA-256:acd0486e96586b99d053a1479acbbbfcae8667227c831cdc53a171f9ccfa27ee", + "size": "100740042" }, { - "host": "aarch64-linux-gnu", - "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": "arm-linux-gnueabihf", + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-linux-armv7.tar.gz", + "archiveFileName": "esptool-v5.0.dev1-linux-armv7.tar.gz", + "checksum": "SHA-256:ea77a38681506761bbb7b0b39c130811ed565667b67ebbdb4d6dcc6cb6e07368", + "size": "53451939" }, { "host": "x86_64-apple-darwin", - "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" + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-macos-amd64.tar.gz", + "archiveFileName": "esptool-v5.0.dev1-macos-amd64.tar.gz", + "checksum": "SHA-256:900a8e90731208bee96647e0e207a43612b9452c2120c4fdc0ff4c6be226257b", + "size": "59631998" }, { "host": "arm64-apple-darwin", - "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" + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-macos-arm64.tar.gz", + "archiveFileName": "esptool-v5.0.dev1-macos-arm64.tar.gz", + "checksum": "SHA-256:3653f4de73cb4fc6a25351eaf663708e91c65ae3265d75bd54ca4315a4350bb4", + "size": "56349992" }, { - "host": "i686-mingw32", - "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.2.0/esptool-v5.0.dev1-win64.zip", + "archiveFileName": "esptool-v5.0.dev1-win64.zip", + "checksum": "SHA-256:1e8fd89645daf94f2d4406ec73c9004e617ea921079515f9fd749205eece4d6d", + "size": "59102658" }, { - "host": "x86_64-mingw32", - "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": "i686-mingw32", + "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-win64.zip", + "archiveFileName": "esptool-v5.0.dev1-win64.zip", + "checksum": "SHA-256:1e8fd89645daf94f2d4406ec73c9004e617ea921079515f9fd749205eece4d6d", + "size": "59102658" } ] }, diff --git a/platform.txt b/platform.txt index 65be05b3bf4..8c7f4432377 100644 --- a/platform.txt +++ b/platform.txt @@ -119,7 +119,7 @@ recipe.hooks.prebuild.2.pattern.windows=cmd /c if not exist "{build.path}\partit recipe.hooks.prebuild.3.pattern.windows=cmd /c if not exist "{build.path}\partitions.csv" COPY "{runtime.platform.path}\tools\partitions\{build.partitions}.csv" "{build.path}\partitions.csv" # Check if custom bootloader exist: source > variant > build.boot -recipe.hooks.prebuild.4.pattern_args=--chip {build.mcu} elf2image --flash_mode {build.flash_mode} --flash_freq {build.img_freq} --flash_size {build.flash_size} -o +recipe.hooks.prebuild.4.pattern_args=--chip {build.mcu} elf2image --flash-mode {build.flash_mode} --flash-freq {build.img_freq} --flash-size {build.flash_size} -o recipe.hooks.prebuild.4.pattern=/usr/bin/env bash -c "[ -f "{build.source.path}"/bootloader.bin ] && cp -f "{build.source.path}"/bootloader.bin "{build.path}"/{build.project_name}.bootloader.bin || ( [ -f "{build.variant.path}"/{build.custom_bootloader}.bin ] && cp "{build.variant.path}"/{build.custom_bootloader}.bin "{build.path}"/{build.project_name}.bootloader.bin || "{tools.esptool_py.path}"/{tools.esptool_py.cmd} {recipe.hooks.prebuild.4.pattern_args} "{build.path}"/{build.project_name}.bootloader.bin "{compiler.sdk.path}"/bin/bootloader_{build.boot}_{build.boot_freq}.elf )" recipe.hooks.prebuild.4.pattern.windows=cmd /c IF EXIST "{build.source.path}\bootloader.bin" ( COPY /y "{build.source.path}\bootloader.bin" "{build.path}\{build.project_name}.bootloader.bin" ) ELSE ( IF EXIST "{build.variant.path}\{build.custom_bootloader}.bin" ( COPY "{build.variant.path}\{build.custom_bootloader}.bin" "{build.path}\{build.project_name}.bootloader.bin" ) ELSE ( "{tools.esptool_py.path}\{tools.esptool_py.cmd}" {recipe.hooks.prebuild.4.pattern_args} "{build.path}\{build.project_name}.bootloader.bin" "{compiler.sdk.path}\bin\bootloader_{build.boot}_{build.boot_freq}.elf" ) ) @@ -163,7 +163,7 @@ recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.f recipe.objcopy.partitions.bin.pattern={tools.gen_esp32part.cmd} -q "{build.path}/partitions.csv" "{build.path}/{build.project_name}.partitions.bin" ## Create bin -recipe.objcopy.bin.pattern_args=--chip {build.mcu} elf2image --flash_mode "{build.flash_mode}" --flash_freq "{build.img_freq}" --flash_size "{build.flash_size}" --elf-sha256-offset 0xb0 -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf" +recipe.objcopy.bin.pattern_args=--chip {build.mcu} elf2image --flash-mode "{build.flash_mode}" --flash-freq "{build.img_freq}" --flash-size "{build.flash_size}" --elf-sha256-offset 0xb0 -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf" recipe.objcopy.bin.pattern="{tools.esptool_py.path}/{tools.esptool_py.cmd}" {recipe.objcopy.bin.pattern_args} ## Create Insights Firmware Package @@ -176,7 +176,7 @@ recipe.hooks.objcopy.postobjcopy.2.pattern=/usr/bin/env bash -c "[ ! -d "{build. recipe.hooks.objcopy.postobjcopy.2.pattern.windows=cmd /c if exist "{build.path}\libraries\ESP_SR" if exist "{compiler.sdk.path}\esp_sr\srmodels.bin" COPY /y "{compiler.sdk.path}\esp_sr\srmodels.bin" "{build.path}\srmodels.bin" # Create merged binary -recipe.hooks.objcopy.postobjcopy.3.pattern_args=--chip {build.mcu} merge_bin -o "{build.path}/{build.project_name}.merged.bin" --fill-flash-size {build.flash_size} --flash_mode keep --flash_freq keep --flash_size keep {build.bootloader_addr} "{build.path}/{build.project_name}.bootloader.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x10000 "{build.path}/{build.project_name}.bin" +recipe.hooks.objcopy.postobjcopy.3.pattern_args=--chip {build.mcu} merge-bin -o "{build.path}/{build.project_name}.merged.bin" --pad-to-size {build.flash_size} --flash-mode keep --flash-freq keep --flash-size keep {build.bootloader_addr} "{build.path}/{build.project_name}.bootloader.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x10000 "{build.path}/{build.project_name}.bin" recipe.hooks.objcopy.postobjcopy.3.pattern="{tools.esptool_py.path}/{tools.esptool_py.cmd}" {recipe.hooks.objcopy.postobjcopy.3.pattern_args} ## Save bin @@ -285,14 +285,14 @@ debug.additional_config=debug_config.{build.mcu} tools.esptool_py.upload.protocol=serial tools.esptool_py.upload.params.verbose= tools.esptool_py.upload.params.quiet= -tools.esptool_py.upload.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset write_flash {upload.erase_cmd} -z --flash_mode keep --flash_freq keep --flash_size keep {build.bootloader_addr} "{build.path}/{build.project_name}.bootloader.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x10000 "{build.path}/{build.project_name}.bin" {upload.extra_flags} +tools.esptool_py.upload.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default-reset --after hard-reset write-flash {upload.erase_cmd} -z --flash-mode keep --flash-freq keep --flash-size keep {build.bootloader_addr} "{build.path}/{build.project_name}.bootloader.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x10000 "{build.path}/{build.project_name}.bin" {upload.extra_flags} tools.esptool_py.upload.pattern="{path}/{cmd}" {upload.pattern_args} ## Program Application ## ------------------- tools.esptool_py.program.params.verbose= tools.esptool_py.program.params.quiet= -tools.esptool_py.program.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset write_flash -z --flash_mode keep --flash_freq keep --flash_size keep 0x10000 "{build.path}/{build.project_name}.bin" +tools.esptool_py.program.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default-reset --after hard-reset write-flash -z --flash-mode keep --flash-freq keep --flash-size keep 0x10000 "{build.path}/{build.project_name}.bin" tools.esptool_py.program.pattern="{path}/{cmd}" {program.pattern_args} ## Erase Chip (before burning the bootloader) @@ -300,7 +300,7 @@ tools.esptool_py.program.pattern="{path}/{cmd}" {program.pattern_args} tools.esptool_py.erase.protocol=serial tools.esptool_py.erase.params.verbose= tools.esptool_py.erase.params.quiet= -tools.esptool_py.erase.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset erase_flash +tools.esptool_py.erase.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default-reset --after hard-reset erase-flash tools.esptool_py.erase.pattern="{path}/{cmd}" {erase.pattern_args} ## Burn Bootloader From 016077e2450a29bf94c681e9db23ace55a025e5f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 20 Jun 2025 11:25:03 +0200 Subject: [PATCH 177/290] changes for updated esptool.py v5 (#11488) --- tools/pioarduino-build.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/pioarduino-build.py b/tools/pioarduino-build.py index 3335a716888..b6a0c0435c5 100644 --- a/tools/pioarduino-build.py +++ b/tools/pioarduino-build.py @@ -99,11 +99,11 @@ def generate_bootloader_image(bootloader_elf): "--chip", build_mcu, "elf2image", - "--flash_mode", + "--flash-mode", "${__get_board_flash_mode(__env__)}", - "--flash_freq", + "--flash-freq", "${__get_board_f_image(__env__)}", - "--flash_size", + "--flash-size", board_config.get("upload.flash_size", "4MB"), "-o", "$TARGET", From 23c6abc1acd26f171827a7459572f9efc216de0e Mon Sep 17 00:00:00 2001 From: Olaf Date: Fri, 20 Jun 2025 11:52:21 +0200 Subject: [PATCH 178/290] Proper EDNS handling and cleaner NOERROR response in DNSSERVER (#11411) * Proper EDNS handling and cleaner NOERROR response * fix: library.properties reverting version number update - as it is done automatically * ci(pre-commit): Apply automatic fixes * Spelling Corrected and minor clarification in comments * Removing commented out code fragments * ci(pre-commit): Apply automatic fixes * fix(pr): Fix typo --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Me No Dev --- libraries/DNSServer/src/DNSServer.cpp | 86 +++++++++++++++++++++++++-- libraries/DNSServer/src/DNSServer.h | 22 +++++++ 2 files changed, 104 insertions(+), 4 deletions(-) diff --git a/libraries/DNSServer/src/DNSServer.cpp b/libraries/DNSServer/src/DNSServer.cpp index 28cf89d6ede..1f74c96c733 100644 --- a/libraries/DNSServer/src/DNSServer.cpp +++ b/libraries/DNSServer/src/DNSServer.cpp @@ -111,16 +111,22 @@ void DNSServer::_handleUDP(AsyncUDPPacket &pkt) { // will reply with IP only to "*" or if domain matches without www. subdomain if (dnsHeader.OPCode == DNS_OPCODE_QUERY && requestIncludesOnlyOneQuestion(dnsHeader) && (_domainName.isEmpty() || getDomainNameWithoutWwwPrefix(static_cast(dnsQuestion.QName), dnsQuestion.QNameLength) == _domainName)) { - replyWithIP(pkt, dnsHeader, dnsQuestion); + + // Qtype = A (1) or ANY (255): send an A record otherwise an empty response + if (ntohs(dnsQuestion.QType) == 1 || ntohs(dnsQuestion.QType) == 255) { + replyWithIP(pkt, dnsHeader, dnsQuestion); + } else { + replyWithNoAnsw(pkt, dnsHeader, dnsQuestion); + } return; } - // otherwise reply with custom code replyWithCustomCode(pkt, dnsHeader); } bool DNSServer::requestIncludesOnlyOneQuestion(DNSHeader &dnsHeader) { - return ntohs(dnsHeader.QDCount) == 1 && dnsHeader.ANCount == 0 && dnsHeader.NSCount == 0 && dnsHeader.ARCount == 0; + dnsHeader.ARCount = 0; // We assume that if ARCount !=0 there is a EDNS OPT packet, just ignore + return ntohs(dnsHeader.QDCount) == 1 && dnsHeader.ANCount == 0 && dnsHeader.NSCount == 0; } String DNSServer::getDomainNameWithoutWwwPrefix(const unsigned char *start, size_t len) { @@ -139,7 +145,6 @@ String DNSServer::getDomainNameWithoutWwwPrefix(const unsigned char *start, size void DNSServer::replyWithIP(AsyncUDPPacket &req, DNSHeader &dnsHeader, DNSQuestion &dnsQuestion) { AsyncUDPMessage rpl; - // Change the type of message to a response and set the number of answers equal to // the number of questions in the header dnsHeader.QR = DNS_QR_RESPONSE; @@ -187,3 +192,76 @@ void DNSServer::replyWithCustomCode(AsyncUDPPacket &req, DNSHeader &dnsHeader) { rpl.write(reinterpret_cast(&dnsHeader), sizeof(DNSHeader)); _udp.sendTo(rpl, req.remoteIP(), req.remotePort()); } + +void DNSServer::replyWithNoAnsw(AsyncUDPPacket &req, DNSHeader &dnsHeader, DNSQuestion &dnsQuestion) { + + dnsHeader.QR = DNS_QR_RESPONSE; + dnsHeader.ANCount = 0; + dnsHeader.NSCount = htons(1); + + AsyncUDPMessage rpl; + rpl.write(reinterpret_cast(&dnsHeader), sizeof(DNSHeader)); + + // Write the question + rpl.write(dnsQuestion.QName, dnsQuestion.QNameLength); + rpl.write((uint8_t *)&dnsQuestion.QType, 2); + rpl.write((uint8_t *)&dnsQuestion.QClass, 2); + + // An empty answer contains an authority section with a SOA, + // We take the name of the query as the root of the zone for which the SOA is generated + // and use a value of DNS_MINIMAL_TTL seconds in order to minimize negative caching + // Write the authority section: + // The SOA RR's ownername is set equal to the query name, and we use made up names for + // the MNAME and RNAME - it doesn't really matter from a protocol perspective - as for + // a no such QTYPE answer only the timing fields are used. + // a protocol perspective - it + // Use DNS name compression : instead of repeating the name in this RNAME occurrence, + // set the two MSB of the byte corresponding normally to the length to 1. The following + // 14 bits must be used to specify the offset of the domain name in the message + // (<255 here so the first byte has the 6 LSB at 0) + rpl.write((uint8_t)0xC0); + rpl.write((uint8_t)DNS_OFFSET_DOMAIN_NAME); + + // DNS type A : host address, DNS class IN for INternet, returning an IPv4 address + uint16_t answerType = htons(DNS_TYPE_SOA), answerClass = htons(DNS_CLASS_IN); + uint32_t Serial = htonl(DNS_SOA_SERIAL); // Date type serial based on the date this piece of code was written + uint32_t Refresh = htonl(DNS_SOA_REFRESH); // These timers don't matter, we don't serve zone transfers + uint32_t Retry = htonl(DNS_SOA_RETRY); + uint32_t Expire = htonl(DNS_SOA_EXPIRE); + uint32_t MinTTL = htonl(DNS_MINIMAL_TTL); // See RFC2308 section 5 + char MLabel[] = DNS_SOA_MNAME_LABEL; + char RLabel[] = DNS_SOA_RNAME_LABEL; + char PostFixLabel[] = DNS_SOA_POSTFIX_LABEL; + + // 4 accounts for len fields and for both rname + // and lname and their postfix labels and there are 5 32 bit fields + + uint16_t RdataLength = htons((uint16_t)(strlen(MLabel) + strlen(RLabel) + 2 * strlen(PostFixLabel) + 4 + 5 * sizeof(Serial))); + + rpl.write((unsigned char *)&answerType, 2); + rpl.write((unsigned char *)&answerClass, 2); + rpl.write((unsigned char *)&MinTTL, 4); // DNS Time To Live + + rpl.write((unsigned char *)&RdataLength, 2); + + rpl.write((uint8_t)strlen(MLabel)); + rpl.write((unsigned char *)&MLabel, strlen(MLabel)); + + rpl.write((unsigned char *)&PostFixLabel, strlen(PostFixLabel)); + rpl.write((uint8_t)0); + // rpl.write((uint8_t)0xC0); + // rpl.write((uint8_t)DNS_OFFSET_DOMAIN_NAME); + + rpl.write((uint8_t)strlen(RLabel)); + rpl.write((unsigned char *)&RLabel, strlen(RLabel)); + rpl.write((unsigned char *)&PostFixLabel, strlen(PostFixLabel)); + rpl.write((uint8_t)0); + + rpl.write((unsigned char *)&Serial, 4); + rpl.write((unsigned char *)&Refresh, 4); + rpl.write((unsigned char *)&Retry, 4); + rpl.write((unsigned char *)&Expire, 4); + rpl.write((unsigned char *)&MinTTL, 4); + + _udp.sendTo(rpl, req.remoteIP(), req.remotePort()); +} diff --git a/libraries/DNSServer/src/DNSServer.h b/libraries/DNSServer/src/DNSServer.h index dfd9a45604d..f2716defc7d 100644 --- a/libraries/DNSServer/src/DNSServer.h +++ b/libraries/DNSServer/src/DNSServer.h @@ -9,6 +9,26 @@ #define DNS_OFFSET_DOMAIN_NAME DNS_HEADER_SIZE // Offset in bytes to reach the domain name labels in the DNS message #define DNS_DEFAULT_PORT 53 +#define DNS_SOA_MNAME_LABEL "ns" +#define DNS_SOA_RNAME_LABEL "esp32" +// The POSTFIX_LABEL will be concatenated to the RName and MName Label label +// do not use a multilabel name here. "local" is a good choice as it is reserved for +// local use by IANA +// The postfix label is defined as an array of characters that follows the +// definition of RFC1035 3.1 +// for instance, a postfix of example.com would be defined as: +// #define DNS_SOA_POSTFIX_LABEL {'\7', 'e', 'x', 'a', 'm', 'p', 'l', 'e', '\3', 'c', 'o', 'm', '\0'} +#define DNS_SOA_POSTFIX_LABEL \ + { '\5', 'l', 'o', 'c', 'a', 'l', '\0' } +// From the following values only the MINIMAL_TTL has relevance +// in the context of client-server protocol interactions. +// The other values are arbitrary chosen as they are only relevant for +// in a zone-transfer scenario. +#define DNS_SOA_SERIAL 2025052900 // Arbitrary serial (format: YYYYMMDDnn) +#define DNS_SOA_REFRESH 100000 // Arbitrary (seconds) +#define DNS_SOA_RETRY 10000 // Arbitrary (seconds) +#define DNS_SOA_EXPIRE 1000000 // Arbitrary (seconds) +#define DNS_MINIMAL_TTL 5 // Time to live for negative answers RFC2308 enum class DNSReplyCode : uint16_t { NoError = 0, FormError = 1, @@ -179,5 +199,7 @@ class DNSServer { inline bool requestIncludesOnlyOneQuestion(DNSHeader &dnsHeader); void replyWithIP(AsyncUDPPacket &req, DNSHeader &dnsHeader, DNSQuestion &dnsQuestion); inline void replyWithCustomCode(AsyncUDPPacket &req, DNSHeader &dnsHeader); + inline void replyWithNoAnsw(AsyncUDPPacket &req, DNSHeader &dnsHeader, DNSQuestion &dnsQuestion); + void _handleUDP(AsyncUDPPacket &pkt); }; From ccda9c5f846532972a3f497addba0623935f7cb9 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Fri, 20 Jun 2025 15:28:07 -0300 Subject: [PATCH 179/290] feat(matter): Adds Matter Events callback plus example (#11465) * feat(matter): Adds Matter Events callback and related example --- .../examples/MatterEvents/MatterEvents.ino | 168 ++++++++++++++++++ .../Matter/examples/MatterEvents/ci.json | 7 + libraries/Matter/keywords.txt | 39 +++- libraries/Matter/src/Matter.cpp | 37 ++-- libraries/Matter/src/Matter.h | 126 +++++++++++++ libraries/Matter/src/MatterEndPoint.h | 20 +-- 6 files changed, 369 insertions(+), 28 deletions(-) create mode 100644 libraries/Matter/examples/MatterEvents/MatterEvents.ino create mode 100644 libraries/Matter/examples/MatterEvents/ci.json diff --git a/libraries/Matter/examples/MatterEvents/MatterEvents.ino b/libraries/Matter/examples/MatterEvents/MatterEvents.ino new file mode 100644 index 00000000000..dac599bf9fa --- /dev/null +++ b/libraries/Matter/examples/MatterEvents/MatterEvents.ino @@ -0,0 +1,168 @@ +// 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. + +// Matter Manager +#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; + +// This function is called when a Matter event occurs +void onMatterEvent(matterEvent_t eventType, const chip::DeviceLayer::ChipDeviceEvent *eventInfo) { + // Print the event type to Serial + Serial.print("===> Got a Matter Event: "); + switch (eventType) { + case MATTER_WIFI_CONNECTIVITY_CHANGE: Serial.println("WiFi Connectivity Change"); break; + case MATTER_THREAD_CONNECTIVITY_CHANGE: Serial.println("Thread Connectivity Change"); break; + case MATTER_INTERNET_CONNECTIVITY_CHANGE: + { + bool newIPAddress = false; + Serial.print("Internet Connectivity Change :: "); + if (eventInfo->InternetConnectivityChange.IPv4 != chip::DeviceLayer::ConnectivityChange::kConnectivity_NoChange) { + Serial.print("IPv4 Connectivity: "); + switch (eventInfo->InternetConnectivityChange.IPv4) { + case chip::DeviceLayer::ConnectivityChange::kConnectivity_Established: + { + newIPAddress = true; + break; + } + case chip::DeviceLayer::ConnectivityChange::kConnectivity_Lost: Serial.println("Lost"); break; + default: Serial.println("Unknown"); break; + } + } + if (eventInfo->InternetConnectivityChange.IPv6 != chip::DeviceLayer::ConnectivityChange::kConnectivity_NoChange) { + Serial.print("IPv6 Connectivity: "); + switch (eventInfo->InternetConnectivityChange.IPv6) { + case chip::DeviceLayer::ConnectivityChange::kConnectivity_Established: + { + newIPAddress = true; + break; + } + case chip::DeviceLayer::ConnectivityChange::kConnectivity_Lost: Serial.println("Lost"); break; + default: Serial.println("Unknown"); break; + } + } + // Print the IP address if it was established + if (newIPAddress) { + Serial.print("Established - IP Address: "); + char ipAddressStr[chip::Transport::PeerAddress::kMaxToStringSize]; + eventInfo->InternetConnectivityChange.ipAddress.ToString(ipAddressStr); + Serial.println(ipAddressStr); + } + break; + } + case MATTER_SERVICE_CONNECTIVITY_CHANGE: Serial.println("Service Connectivity Change"); break; + case MATTER_SERVICE_PROVISIONING_CHANGE: Serial.println("Service Provisioning Change"); break; + case MATTER_TIME_SYNC_CHANGE: Serial.println("Time Sync Change"); break; + case MATTER_CHIPOBLE_CONNECTION_ESTABLISHED: Serial.println("CHIPoBLE Connection Established"); break; + case MATTER_CHIPOBLE_CONNECTION_CLOSED: Serial.println("CHIPoBLE Connection Closed"); break; + case MATTER_CLOSE_ALL_BLE_CONNECTIONS: Serial.println("Close All BLE Connections"); break; + case MATTER_WIFI_DEVICE_AVAILABLE: Serial.println("WiFi Device Available"); break; + case MATTER_OPERATIONAL_NETWORK_STARTED: Serial.println("Operational Network Started"); break; + case MATTER_THREAD_STATE_CHANGE: Serial.println("Thread State Change"); break; + case MATTER_THREAD_INTERFACE_STATE_CHANGE: Serial.println("Thread Interface State Change"); break; + case MATTER_CHIPOBLE_ADVERTISING_CHANGE: Serial.println("CHIPoBLE Advertising Change"); break; + case MATTER_INTERFACE_IP_ADDRESS_CHANGED: + switch (eventInfo->InterfaceIpAddressChanged.Type) { + case chip::DeviceLayer::InterfaceIpChangeType::kIpV4_Assigned: Serial.println("IPv4 Address Assigned"); break; + case chip::DeviceLayer::InterfaceIpChangeType::kIpV4_Lost: Serial.println("IPv4 Address Lost"); break; + case chip::DeviceLayer::InterfaceIpChangeType::kIpV6_Assigned: Serial.println("IPv6 Address Assigned"); break; + case chip::DeviceLayer::InterfaceIpChangeType::kIpV6_Lost: Serial.println("IPv6 Address Lost"); break; + } + break; + case MATTER_COMMISSIONING_COMPLETE: Serial.println("Commissioning Complete"); break; + case MATTER_FAIL_SAFE_TIMER_EXPIRED: Serial.println("Fail Safe Timer Expired"); break; + case MATTER_OPERATIONAL_NETWORK_ENABLED: Serial.println("Operational Network Enabled"); break; + case MATTER_DNSSD_INITIALIZED: Serial.println("DNS-SD Initialized"); break; + case MATTER_DNSSD_RESTART_NEEDED: Serial.println("DNS-SD Restart Needed"); break; + case MATTER_BINDINGS_CHANGED_VIA_CLUSTER: Serial.println("Bindings Changed Via Cluster"); break; + case MATTER_OTA_STATE_CHANGED: Serial.println("OTA State Changed"); break; + case MATTER_SERVER_READY: Serial.println("Server Ready"); break; + case MATTER_BLE_DEINITIALIZED: Serial.println("BLE Deinitialized"); break; + case MATTER_COMMISSIONING_SESSION_STARTED: Serial.println("Commissioning Session Started"); break; + case MATTER_COMMISSIONING_SESSION_STOPPED: Serial.println("Commissioning Session Stopped"); break; + case MATTER_COMMISSIONING_WINDOW_OPEN: Serial.println("Commissioning Window Opened"); break; + case MATTER_COMMISSIONING_WINDOW_CLOSED: Serial.println("Commissioning Window Closed"); break; + case MATTER_FABRIC_WILL_BE_REMOVED: Serial.println("Fabric Will Be Removed"); break; + case MATTER_FABRIC_REMOVED: Serial.println("Fabric Removed"); break; + case MATTER_FABRIC_COMMITTED: Serial.println("Fabric Committed"); break; + case MATTER_FABRIC_UPDATED: Serial.println("Fabric Updated"); break; + case MATTER_ESP32_SPECIFIC_EVENT: Serial.println("Sending ESP32 Platform Specific Events"); break; + case MATTER_ESP32_PUBLIC_SPECIFIC_EVENT: Serial.println("Next Event Has Populated EventInfo"); break; + default: + // If the event type is not recognized, print "Unknown" and the event ID + Serial.println("Unknown, EventID = 0x" + String(eventType, HEX)); + break; + } +} + +void setup() { + Serial.begin(115200); + while (!Serial) { + delay(10); // Wait for Serial to initialize + } + + // We start by connecting to a WiFi network + Serial.print("Connecting to "); + Serial.println(ssid); + // Manually connect to WiFi + WiFi.enableIPv6(true); // Enable IPv6 if needed + 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 at least one Matter EndPoint + OnOffLight.begin(); + + // Set the Matter Event Callback + Matter.onEvent(onMatterEvent); + // Matter beginning - Last step, after all EndPoints are initialized + Matter.begin(); + Serial.println("Starting Matter Commission Test..."); +} + +void loop() { + // Check Matter Commissioning state + 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. + while (!Matter.isDeviceCommissioned()) { + delay(5000); + Serial.println("Matter Fabric not commissioned yet. Waiting for commissioning."); + } + } + Serial.println("Matter Node is commissioned and connected to Wi-Fi."); + Serial.println("====> Decommissioning in 60 seconds. <===="); + delay(60000); + Matter.decommission(); + Serial.println("Matter Node is decommissioned. Commissioning widget shall start over."); +} diff --git a/libraries/Matter/examples/MatterEvents/ci.json b/libraries/Matter/examples/MatterEvents/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterEvents/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 a63d9a65acb..68aaebb1d4d 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -36,6 +36,8 @@ EndPointSpeedCB KEYWORD1 EndPointOnOffCB KEYWORD1 EndPointBrightnessCB KEYWORD1 EndPointRGBColorCB KEYWORD1 +matterEvent_t KEYWORD1 +matterEventCB KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -108,6 +110,7 @@ onChangeMode KEYWORD2 onChangeLocalTemperature KEYWORD2 onChangeCoolingSetpoint KEYWORD2 onChangeHeatingSetpoint KEYWORD2 +onEvent KEYWORD2 ####################################### # Constants (LITERAL1) @@ -144,5 +147,37 @@ 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 +MATTER_WIFI_CONNECTIVITY_CHANGE LITERAL1 +MATTER_THREAD_CONNECTIVITY_CHANGE LITERAL1 +MATTER_INTERNET_CONNECTIVITY_CHANGE LITERAL1 +MATTER_SERVICE_CONNECTIVITY_CHANGE LITERAL1 +MATTER_SERVICE_PROVISIONING_CHANGE LITERAL1 +MATTER_TIME_SYNC_CHANGE LITERAL1 +MATTER_CHIPOBLE_CONNECTION_ESTABLISHED LITERAL1 +MATTER_CHIPOBLE_CONNECTION_CLOSED LITERAL1 +MATTER_CLOSE_ALL_BLE_CONNECTIONS LITERAL1 +MATTER_WIFI_DEVICE_AVAILABLE LITERAL1 +MATTER_OPERATIONAL_NETWORK_STARTED LITERAL1 +MATTER_THREAD_STATE_CHANGE LITERAL1 +MATTER_THREAD_INTERFACE_STATE_CHANGE LITERAL1 +MATTER_CHIPOBLE_ADVERTISING_CHANGE LITERAL1 +MATTER_INTERFACE_IP_ADDRESS_CHANGED LITERAL1 +MATTER_COMMISSIONING_COMPLETE LITERAL1 +MATTER_FAIL_SAFE_TIMER_EXPIRED LITERAL1 +MATTER_OPERATIONAL_NETWORK_ENABLED LITERAL1 +MATTER_DNSSD_INITIALIZED LITERAL1 +MATTER_DNSSD_RESTART_NEEDED LITERAL1 +MATTER_BINDINGS_CHANGED_VIA_CLUSTER LITERAL1 +MATTER_OTA_STATE_CHANGED LITERAL1 +MATTER_SERVER_READY LITERAL1 +MATTER_BLE_DEINITIALIZED LITERAL1 +MATTER_ESP32_SPECIFIC_EVENT LITERAL1 +MATTER_COMMISSIONING_SESSION_STARTED LITERAL1 +MATTER_COMMISSIONING_SESSION_STOPPED LITERAL1 +MATTER_COMMISSIONING_WINDOW_OPEN LITERAL1 +MATTER_COMMISSIONING_WINDOW_CLOSED LITERAL1 +MATTER_FABRIC_WILL_BE_REMOVED LITERAL1 +MATTER_FABRIC_REMOVED LITERAL1 +MATTER_FABRIC_COMMITTED LITERAL1 +MATTER_FABRIC_UPDATED LITERAL1 +MATTER_ESP32_PUBLIC_SPECIFIC_EVENT LITERAL1 diff --git a/libraries/Matter/src/Matter.cpp b/libraries/Matter/src/Matter.cpp index af7c4c8657e..b16edfd85c1 100644 --- a/libraries/Matter/src/Matter.cpp +++ b/libraries/Matter/src/Matter.cpp @@ -28,7 +28,8 @@ constexpr auto k_timeout_seconds = 300; static bool _matter_has_started = false; static node::config_t node_config; -static node_t *deviceNode = NULL; +static node_t *deviceNode = nullptr; +ArduinoMatter::matterEventCB ArduinoMatter::_matterEventCB = nullptr; // 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 @@ -42,7 +43,7 @@ static esp_err_t app_attribute_update_cb( switch (type) { case PRE_UPDATE: // Callback before updating the value in the database log_v("Attribute update callback: PRE_UPDATE"); - if (ep != NULL) { + if (ep != nullptr) { err = ep->attributeChangeCB(endpoint_id, cluster_id, attribute_id, val) ? ESP_OK : ESP_FAIL; } break; @@ -78,7 +79,7 @@ static esp_err_t app_identification_cb(identification::callback_type_t type, uin identifyIsActive = false; log_v("Identification callback: STOP"); } - if (ep != NULL) { + if (ep != nullptr) { err = ep->endpointIdentifyCB(endpoint_id, identifyIsActive) ? ESP_OK : ESP_FAIL; } @@ -89,21 +90,21 @@ static esp_err_t app_identification_cb(identification::callback_type_t type, uin static void app_event_cb(const ChipDeviceEvent *event, intptr_t arg) { switch (event->Type) { case chip::DeviceLayer::DeviceEventType::kInterfaceIpAddressChanged: - log_i( + log_d( "Interface %s Address changed", event->InterfaceIpAddressChanged.Type == chip::DeviceLayer::InterfaceIpChangeType::kIpV4_Assigned ? "IPv4" : "IPV6" ); break; - case chip::DeviceLayer::DeviceEventType::kCommissioningComplete: log_i("Commissioning complete"); break; - case chip::DeviceLayer::DeviceEventType::kFailSafeTimerExpired: log_i("Commissioning failed, fail safe timer expired"); break; - case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStarted: log_i("Commissioning session started"); break; - case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStopped: log_i("Commissioning session stopped"); break; - case chip::DeviceLayer::DeviceEventType::kCommissioningWindowOpened: log_i("Commissioning window opened"); break; - case chip::DeviceLayer::DeviceEventType::kCommissioningWindowClosed: log_i("Commissioning window closed"); break; + case chip::DeviceLayer::DeviceEventType::kCommissioningComplete: log_d("Commissioning complete"); break; + case chip::DeviceLayer::DeviceEventType::kFailSafeTimerExpired: log_d("Commissioning failed, fail safe timer expired"); break; + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStarted: log_d("Commissioning session started"); break; + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStopped: log_d("Commissioning session stopped"); break; + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowOpened: log_d("Commissioning window opened"); break; + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowClosed: log_d("Commissioning window closed"); break; case chip::DeviceLayer::DeviceEventType::kFabricRemoved: { - log_i("Fabric removed successfully"); + log_d("Fabric removed successfully"); if (chip::Server::GetInstance().GetFabricTable().FabricCount() == 0) { - log_i("No fabric left, opening commissioning window"); + log_d("No fabric left, opening commissioning window"); chip::CommissioningWindowManager &commissionMgr = chip::Server::GetInstance().GetCommissioningWindowManager(); constexpr auto kTimeoutSeconds = chip::System::Clock::Seconds16(k_timeout_seconds); if (!commissionMgr.IsCommissioningWindowOpen()) { @@ -116,12 +117,16 @@ static void app_event_cb(const ChipDeviceEvent *event, intptr_t arg) { } break; } - case chip::DeviceLayer::DeviceEventType::kFabricWillBeRemoved: log_i("Fabric will be removed"); break; - case chip::DeviceLayer::DeviceEventType::kFabricUpdated: log_i("Fabric is updated"); break; - case chip::DeviceLayer::DeviceEventType::kFabricCommitted: log_i("Fabric is committed"); break; - case chip::DeviceLayer::DeviceEventType::kBLEDeinitialized: log_i("BLE deinitialized and memory reclaimed"); break; + case chip::DeviceLayer::DeviceEventType::kFabricWillBeRemoved: log_d("Fabric will be removed"); break; + case chip::DeviceLayer::DeviceEventType::kFabricUpdated: log_d("Fabric is updated"); break; + case chip::DeviceLayer::DeviceEventType::kFabricCommitted: log_d("Fabric is committed"); break; + case chip::DeviceLayer::DeviceEventType::kBLEDeinitialized: log_d("BLE deinitialized and memory reclaimed"); break; default: break; } + // Check if the user-defined callback is set + if (ArduinoMatter::_matterEventCB != nullptr) { + ArduinoMatter::_matterEventCB(static_cast(event->Type), event); + } } void ArduinoMatter::_init() { diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index e54ceb47e5e..682a0498076 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -34,10 +34,136 @@ #include #include +// Matter Event types used when there is a user callback for Matter Events +enum matterEvent_t { + // Starting from 0x8000, these events are public and can be used by applications. + // Defined in CHIPDeviceEvent.h + + // WiFi Connectivity Change: Signals a change in connectivity of the device's WiFi station interface. + MATTER_WIFI_CONNECTIVITY_CHANGE = (uint16_t)chip::DeviceLayer::DeviceEventType::kWiFiConnectivityChange, + + // Thread Connectivity Change: Signals a change in connectivity of the device's Thread interface. + MATTER_THREAD_CONNECTIVITY_CHANGE = (uint16_t)chip::DeviceLayer::DeviceEventType::kThreadConnectivityChange, + + // Internet Connectivity Change: Signals a change in the device's ability to communicate via the Internet. + MATTER_INTERNET_CONNECTIVITY_CHANGE = (uint16_t)chip::DeviceLayer::DeviceEventType::kInternetConnectivityChange, + + // Service Connectivity Change: Signals a change in the device's ability to communicate with a chip-enabled service. + MATTER_SERVICE_CONNECTIVITY_CHANGE = (uint16_t)chip::DeviceLayer::DeviceEventType::kServiceConnectivityChange, + + // Service Provisioning Change: Signals a change to the device's service provisioning state. + MATTER_SERVICE_PROVISIONING_CHANGE = (uint16_t)chip::DeviceLayer::DeviceEventType::kServiceProvisioningChange, + + // Time Sync Change: Signals a change to the device's real time clock synchronization state. + MATTER_TIME_SYNC_CHANGE = (uint16_t)chip::DeviceLayer::DeviceEventType::kTimeSyncChange, + + // CHIPoBLE Connection Established: Signals that an external entity has established a new + // CHIPoBLE connection with the device. + MATTER_CHIPOBLE_CONNECTION_ESTABLISHED = (uint16_t)chip::DeviceLayer::DeviceEventType::kCHIPoBLEConnectionEstablished, + + // CHIPoBLE Connection Closed: Signals that an external entity has closed existing CHIPoBLE + // connection with the device. + MATTER_CHIPOBLE_CONNECTION_CLOSED = (uint16_t)chip::DeviceLayer::DeviceEventType::kCHIPoBLEConnectionClosed, + + // Request BLE connections to be closed. This is used in the supportsConcurrentConnection = False case. + MATTER_CLOSE_ALL_BLE_CONNECTIONS = (uint16_t)chip::DeviceLayer::DeviceEventType::kCloseAllBleConnections, + + // WiFi Device Available: When supportsConcurrentConnection = False, the ConnectNetwork + // command cannot start until the BLE device is closed and the Operation Network device (e.g. WiFi) has been started. + MATTER_WIFI_DEVICE_AVAILABLE = (uint16_t)chip::DeviceLayer::DeviceEventType::kWiFiDeviceAvailable, + + MATTER_OPERATIONAL_NETWORK_STARTED = (uint16_t)chip::DeviceLayer::DeviceEventType::kOperationalNetworkStarted, + + // Thread State Change: Signals that a state change has occurred in the Thread stack. + MATTER_THREAD_STATE_CHANGE = (uint16_t)chip::DeviceLayer::DeviceEventType::kThreadStateChange, + + // Thread Interface State Change: Signals that the state of the Thread network interface has changed. + MATTER_THREAD_INTERFACE_STATE_CHANGE = (uint16_t)chip::DeviceLayer::DeviceEventType::kThreadInterfaceStateChange, + + // CHIPoBLE Advertising Change: Signals that the state of CHIPoBLE advertising has changed. + MATTER_CHIPOBLE_ADVERTISING_CHANGE = (uint16_t)chip::DeviceLayer::DeviceEventType::kCHIPoBLEAdvertisingChange, + + // Interface IP Address Changed: IP address availability - either ipv4 or ipv6 + // addresses assigned to the underlying wifi/ethernet interface. + MATTER_INTERFACE_IP_ADDRESS_CHANGED = (uint16_t)chip::DeviceLayer::DeviceEventType::kInterfaceIpAddressChanged, + + // Commissioning Complete: Commissioning has completed by a call to the general + // commissioning cluster command. + MATTER_COMMISSIONING_COMPLETE = (uint16_t)chip::DeviceLayer::DeviceEventType::kCommissioningComplete, + + // Fail Safe Timer Expired: Signals that the fail-safe timer expired before + // the CommissioningComplete command was successfully invoked. + MATTER_FAIL_SAFE_TIMER_EXPIRED = (uint16_t)chip::DeviceLayer::DeviceEventType::kFailSafeTimerExpired, + + // Operational Network Enabled. + MATTER_OPERATIONAL_NETWORK_ENABLED = (uint16_t)chip::DeviceLayer::DeviceEventType::kOperationalNetworkEnabled, + + // DNS-SD Initialized: Signals that DNS-SD has been initialized and is ready to operate. + MATTER_DNSSD_INITIALIZED = (uint16_t)chip::DeviceLayer::DeviceEventType::kDnssdInitialized, + + // DNS-SD Restart Needed: Signals that DNS-SD backend was restarted and services must be published again. + MATTER_DNSSD_RESTART_NEEDED = (uint16_t)chip::DeviceLayer::DeviceEventType::kDnssdRestartNeeded, + + // Bindings Changed Via Cluster: Signals that bindings were updated. + MATTER_BINDINGS_CHANGED_VIA_CLUSTER = (uint16_t)chip::DeviceLayer::DeviceEventType::kBindingsChangedViaCluster, + + // OTA State Changed: Signals that the state of the OTA engine changed. + MATTER_OTA_STATE_CHANGED = (uint16_t)chip::DeviceLayer::DeviceEventType::kOtaStateChanged, + + // Server Ready: Server initialization has completed. Signals that all server components have been initialized + // and the node is ready to establish connections with other nodes. This event can be used to trigger on-boot actions + // that require sending messages to other nodes. + MATTER_SERVER_READY = (uint16_t)chip::DeviceLayer::DeviceEventType::kServerReady, + + // BLE Deinitialized: Signals that BLE stack is deinitialized and memory reclaimed + MATTER_BLE_DEINITIALIZED = (uint16_t)chip::DeviceLayer::DeviceEventType::kBLEDeinitialized, + + // Starting ESP32 Platform Specific Events from 0x9000 + MATTER_ESP32_SPECIFIC_EVENT, // value is previous + 1 + + // Commissioning Session Started: Signals that Commissioning session has started + MATTER_COMMISSIONING_SESSION_STARTED = (uint16_t)chip::DeviceLayer::DeviceEventType::kCommissioningSessionStarted, + + // Commissioning Session Stopped: Signals that Commissioning session has stopped + MATTER_COMMISSIONING_SESSION_STOPPED = (uint16_t)chip::DeviceLayer::DeviceEventType::kCommissioningSessionStopped, + + // Commissioning Window Opened: Signals that Commissioning window is now opened + MATTER_COMMISSIONING_WINDOW_OPEN = (uint16_t)chip::DeviceLayer::DeviceEventType::kCommissioningWindowOpened, + + // Commissioning Window Closed: Signals that Commissioning window is now closed + MATTER_COMMISSIONING_WINDOW_CLOSED = (uint16_t)chip::DeviceLayer::DeviceEventType::kCommissioningWindowClosed, + + // Fabric Will Be Removed: Signals that a fabric is about to be deleted. This allows actions to be taken that need the + // fabric to still be around before we delete it + MATTER_FABRIC_WILL_BE_REMOVED = (uint16_t)chip::DeviceLayer::DeviceEventType::kFabricWillBeRemoved, + + // Fabric Has Been Removed: Signals that a fabric is effectively deleted + MATTER_FABRIC_REMOVED = (uint16_t)chip::DeviceLayer::DeviceEventType::kFabricRemoved, + + // Fabric Has Been Committed: Signals that a fabric in Fabric Table is persisted to storage, by CommitPendingFabricData + MATTER_FABRIC_COMMITTED = (uint16_t)chip::DeviceLayer::DeviceEventType::kFabricCommitted, + + // Fabric Has Been Updated: Signals that operational credentials are changed, which may not be persistent. + // Can be used to affect what is needed for UpdateNOC prior to commit + MATTER_FABRIC_UPDATED = (uint16_t)chip::DeviceLayer::DeviceEventType::kFabricUpdated, + + // ESP32 Matter Events: These are custom ESP32 Matter events as defined in CHIPDevicePlatformEvent.h. + MATTER_ESP32_PUBLIC_SPECIFIC_EVENT = (uint16_t)chip::DeviceLayer::DeviceEventType::kRange_PublicPlatformSpecific, // ESPSystemEvent +}; + using namespace esp_matter; class ArduinoMatter { public: + // Matter Event Callback type + using matterEventCB = std::function; + // Matter Event Callback + static matterEventCB _matterEventCB; + // set the Matter Event Callback + static void onEvent(matterEventCB cb) { + _matterEventCB = cb; + } + static inline String getManualPairingCode() { // return the pairing code for manual pairing return String("34970112332"); diff --git a/libraries/Matter/src/MatterEndPoint.h b/libraries/Matter/src/MatterEndPoint.h index 5baa4747d18..95d3d3c08df 100644 --- a/libraries/Matter/src/MatterEndPoint.h +++ b/libraries/Matter/src/MatterEndPoint.h @@ -41,22 +41,22 @@ class MatterEndPoint { 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; + return nullptr; } endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); - if (endpoint == NULL) { + if (endpoint == nullptr) { log_e("Endpoint [%d] not found", endpoint_id); - return NULL; + return nullptr; } cluster_t *cluster = cluster::get(endpoint, cluster_id); - if (cluster == NULL) { + if (cluster == nullptr) { log_e("Cluster [%d] not found", cluster_id); - return NULL; + return nullptr; } esp_matter::attribute_t *attribute = attribute::get(cluster, attribute_id); - if (attribute == NULL) { + if (attribute == nullptr) { log_e("Attribute [%d] not found", attribute_id); - return NULL; + return nullptr; } return attribute; } @@ -64,7 +64,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) { esp_matter::attribute_t *attribute = getAttribute(cluster_id, attribute_id); - if (attribute == NULL) { + if (attribute == nullptr) { return false; } if (attribute::get_val(attribute, attrVal) == ESP_OK) { @@ -78,7 +78,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) { esp_matter::attribute_t *attribute = getAttribute(cluster_id, attribute_id); - if (attribute == NULL) { + if (attribute == nullptr) { return false; } if (attribute::set_val(attribute, attrVal) == ESP_OK) { @@ -117,6 +117,6 @@ class MatterEndPoint { protected: uint16_t endpoint_id = 0; - EndPointIdentifyCB _onEndPointIdentifyCB = NULL; + EndPointIdentifyCB _onEndPointIdentifyCB = nullptr; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From 01e4d5debbbc1b35dd0dfd6853a29b8ebba02f10 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Sat, 21 Jun 2025 09:45:26 -0300 Subject: [PATCH 180/290] feat(uart): fixes loopback function after IDF changes (#11492) * feat(uart): fixes loopback function after IDF changes IDF 5.4.1 has added a new function called uart_release_pin() that is called whenever new pins are set or when uart driver is deleted. This has a side effect that causes RX pin to never work again with the loopback function. Other changes also have removed some GPIO setup that was necessary for the GPIO loopback mode work. The PR forces a full RX Pin setup in order to make it work in GPIO Matrix with Loopback TX Signal * feat(uart): adds missing include file * feat(uart): removes not necessary part of the code * fix(uart): commentaries style fix Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- cores/esp32/esp32-hal-uart.c | 46 +++++++++--------------------------- 1 file changed, 11 insertions(+), 35 deletions(-) diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index 5311aff4f37..3c9e6bf178b 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -32,10 +32,11 @@ #include "driver/gpio.h" #include "hal/gpio_hal.h" #include "esp_rom_gpio.h" +#include "esp_private/gpio.h" #include "driver/rtc_io.h" #include "driver/lp_io.h" -#include "soc/uart_periph.h" +#include "soc/uart_pins.h" #include "esp_private/uart_share_hw_ctrl.h" static int s_uart_debug_nr = 0; // UART number for debug output @@ -1383,39 +1384,9 @@ unsigned long uartDetectBaudrate(uart_t *uart) { } /* - These functions are for testing purpose only and can be used in Arduino Sketches - Those are used in the UART examples -*/ - -/* - This is intended to make an internal loopback connection using IOMUX - The function uart_internal_loopback() shall be used right after Arduino Serial.begin(...) - This code "replaces" the physical wiring for connecting TX <--> RX in a loopback -*/ - -// gets the right TX or RX SIGNAL, based on the UART number from gpio_sig_map.h -#ifdef CONFIG_IDF_TARGET_ESP32P4 -#define UART_TX_SIGNAL(uartNumber) \ - (uartNumber == UART_NUM_0 \ - ? UART0_TXD_PAD_OUT_IDX \ - : (uartNumber == UART_NUM_1 \ - ? UART1_TXD_PAD_OUT_IDX \ - : (uartNumber == UART_NUM_2 ? UART2_TXD_PAD_OUT_IDX : (uartNumber == UART_NUM_3 ? UART3_TXD_PAD_OUT_IDX : UART4_TXD_PAD_OUT_IDX)))) -#define UART_RX_SIGNAL(uartNumber) \ - (uartNumber == UART_NUM_0 \ - ? UART0_RXD_PAD_IN_IDX \ - : (uartNumber == UART_NUM_1 \ - ? UART1_RXD_PAD_IN_IDX \ - : (uartNumber == UART_NUM_2 ? UART2_RXD_PAD_IN_IDX : (uartNumber == UART_NUM_3 ? UART3_RXD_PAD_IN_IDX : UART4_RXD_PAD_IN_IDX)))) -#else -#if SOC_UART_HP_NUM > 2 -#define UART_TX_SIGNAL(uartNumber) (uartNumber == UART_NUM_0 ? U0TXD_OUT_IDX : (uartNumber == UART_NUM_1 ? U1TXD_OUT_IDX : U2TXD_OUT_IDX)) -#define UART_RX_SIGNAL(uartNumber) (uartNumber == UART_NUM_0 ? U0RXD_IN_IDX : (uartNumber == UART_NUM_1 ? U1RXD_IN_IDX : U2RXD_IN_IDX)) -#else -#define UART_TX_SIGNAL(uartNumber) (uartNumber == UART_NUM_0 ? U0TXD_OUT_IDX : U1TXD_OUT_IDX) -#define UART_RX_SIGNAL(uartNumber) (uartNumber == UART_NUM_0 ? U0RXD_IN_IDX : U1RXD_IN_IDX) -#endif -#endif // ifdef CONFIG_IDF_TARGET_ESP32P4 + * These functions are for testing purposes only and can be used in Arduino Sketches. + * They are utilized in the UART examples and CI. + */ /* This function internally binds defined UARTs TX signal with defined RX pin of any UART (same or different). @@ -1427,7 +1398,12 @@ void uart_internal_loopback(uint8_t uartNum, int8_t rxPin) { log_e("UART%d is not supported for loopback or RX pin %d is invalid.", uartNum, rxPin); return; } - esp_rom_gpio_connect_out_signal(rxPin, UART_TX_SIGNAL(uartNum), false, false); + // forces rxPin to use GPIO Matrix and setup the pin to receive UART TX Signal - IDF 5.4.1 Change with uart_release_pin() + gpio_func_sel((gpio_num_t)rxPin, PIN_FUNC_GPIO); + gpio_pullup_en((gpio_num_t)rxPin); + gpio_input_enable((gpio_num_t)rxPin); + esp_rom_gpio_connect_in_signal(rxPin, uart_periph_signal[uartNum].pins[SOC_UART_RX_PIN_IDX].signal, false); + esp_rom_gpio_connect_out_signal(rxPin, uart_periph_signal[uartNum].pins[SOC_UART_TX_PIN_IDX].signal, false, false); } /* From 9d84c78cf2d44911639530e54a9dbb9ee9164f6c Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Sun, 22 Jun 2025 15:02:36 -0300 Subject: [PATCH 181/290] feat(uart): fixes pin attach for any IDF 5.x (#11499) * feat(uart): fixes pin attach for any IDF 5.x * fix(uart): commentary typo error Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(uart): commentary typo error Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(uart): commentary typo error Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(uart): commentary style fix * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- cores/esp32/esp32-hal-uart.c | 131 +++++++++++++++++++++++++++++++++-- 1 file changed, 126 insertions(+), 5 deletions(-) diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index 3c9e6bf178b..2163e9b5f42 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -295,6 +295,125 @@ static bool _uartDetachBus_RTS(void *busptr) { return _uartDetachPins(bus->num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, bus->_rtsPin); } +static bool _uartTrySetIomuxPin(uart_port_t uart_num, int io_num, uint32_t idx) { + // Store a pointer to the default pin, to optimize access to its fields. + const uart_periph_sig_t *upin = &uart_periph_signal[uart_num].pins[idx]; + + // In theory, if default_gpio is -1, iomux_func should also be -1, but let's be safe and test both. + if (upin->iomux_func == -1 || upin->default_gpio == -1 || upin->default_gpio != io_num) { + return false; + } + + // Assign the correct function to the GPIO. + assert(upin->iomux_func != -1); + if (uart_num < SOC_UART_HP_NUM) { + gpio_iomux_out(io_num, upin->iomux_func, false); + // If the pin is input, we also have to redirect the signal, in order to bypass the GPIO matrix. + if (upin->input) { + gpio_iomux_in(io_num, upin->signal); + } + } +#if (SOC_UART_LP_NUM >= 1) && (SOC_RTCIO_PIN_COUNT >= 1) + else { + if (upin->input) { + rtc_gpio_set_direction(io_num, RTC_GPIO_MODE_INPUT_ONLY); + } else { + rtc_gpio_set_direction(io_num, RTC_GPIO_MODE_OUTPUT_ONLY); + } + rtc_gpio_init(io_num); + rtc_gpio_iomux_func_sel(io_num, upin->iomux_func); + } +#endif + return true; +} + +static esp_err_t _uartInternalSetPin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int rts_io_num, int cts_io_num) { + // Since an IO cannot route peripheral signals via IOMUX and GPIO matrix at the same time, + // if tx and rx share the same IO, both signals need to be routed to IOs through GPIO matrix + bool tx_rx_same_io = (tx_io_num == rx_io_num); + + // In the following statements, if the io_num is negative, no need to configure anything. + if (tx_io_num >= 0) { +#if CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND || CONFIG_PM_SLP_DISABLE_GPIO + // In such case, IOs are going to switch to sleep configuration (isolate) when entering sleep for power saving reason + // But TX IO in isolate state could write garbled data to the other end + // Therefore, we should disable the switch of the TX pin to sleep configuration + gpio_sleep_sel_dis(tx_io_num); +#endif + if (tx_rx_same_io || !_uartTrySetIomuxPin(uart_num, tx_io_num, SOC_UART_TX_PIN_IDX)) { + if (uart_num < SOC_UART_HP_NUM) { + gpio_func_sel(tx_io_num, PIN_FUNC_GPIO); + esp_rom_gpio_connect_out_signal(tx_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_TX_PIN_IDX), 0, 0); + // output enable is set inside esp_rom_gpio_connect_out_signal func after the signal is connected + // (output enabled too early may cause unnecessary level change at the pad) + } +#if SOC_LP_GPIO_MATRIX_SUPPORTED + else { + rtc_gpio_init(tx_io_num); // set as a LP_GPIO pin + lp_gpio_connect_out_signal(tx_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_TX_PIN_IDX), 0, 0); + // output enable is set inside lp_gpio_connect_out_signal func after the signal is connected + } +#endif + } + } + + if (rx_io_num >= 0) { +#if CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND || CONFIG_PM_SLP_DISABLE_GPIO + // In such case, IOs are going to switch to sleep configuration (isolate) when entering sleep for power saving reason + // But RX IO in isolate state could receive garbled data into FIFO, which is not desired + // Therefore, we should disable the switch of the RX pin to sleep configuration + gpio_sleep_sel_dis(rx_io_num); +#endif + if (tx_rx_same_io || !_uartTrySetIomuxPin(uart_num, rx_io_num, SOC_UART_RX_PIN_IDX)) { + if (uart_num < SOC_UART_HP_NUM) { + gpio_input_enable(rx_io_num); + esp_rom_gpio_connect_in_signal(rx_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RX_PIN_IDX), 0); + } +#if SOC_LP_GPIO_MATRIX_SUPPORTED + else { + rtc_gpio_mode_t mode = (tx_rx_same_io ? RTC_GPIO_MODE_INPUT_OUTPUT : RTC_GPIO_MODE_INPUT_ONLY); + rtc_gpio_set_direction(rx_io_num, mode); + if (!tx_rx_same_io) { // set the same pin again as a LP_GPIO will overwrite connected out_signal, not desired, so skip + rtc_gpio_init(rx_io_num); // set as a LP_GPIO pin + } + lp_gpio_connect_in_signal(rx_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RX_PIN_IDX), 0); + } +#endif + } + } + + if (rts_io_num >= 0 && !_uartTrySetIomuxPin(uart_num, rts_io_num, SOC_UART_RTS_PIN_IDX)) { + if (uart_num < SOC_UART_HP_NUM) { + gpio_func_sel(rts_io_num, PIN_FUNC_GPIO); + esp_rom_gpio_connect_out_signal(rts_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RTS_PIN_IDX), 0, 0); + // output enable is set inside esp_rom_gpio_connect_out_signal func after the signal is connected + } +#if SOC_LP_GPIO_MATRIX_SUPPORTED + else { + rtc_gpio_init(rts_io_num); // set as a LP_GPIO pin + lp_gpio_connect_out_signal(rts_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RTS_PIN_IDX), 0, 0); + // output enable is set inside lp_gpio_connect_out_signal func after the signal is connected + } +#endif + } + + if (cts_io_num >= 0 && !_uartTrySetIomuxPin(uart_num, cts_io_num, SOC_UART_CTS_PIN_IDX)) { + if (uart_num < SOC_UART_HP_NUM) { + gpio_pullup_en(cts_io_num); + gpio_input_enable(cts_io_num); + esp_rom_gpio_connect_in_signal(cts_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_CTS_PIN_IDX), 0); + } +#if SOC_LP_GPIO_MATRIX_SUPPORTED + else { + rtc_gpio_set_direction(cts_io_num, RTC_GPIO_MODE_INPUT_ONLY); + rtc_gpio_init(cts_io_num); // set as a LP_GPIO pin + lp_gpio_connect_in_signal(cts_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_CTS_PIN_IDX), 0); + } +#endif + } + return ESP_OK; +} + // Attach function for UART // connects the IO Pad, set Paripheral Manager and internal UART structure data static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin) { @@ -307,7 +426,7 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t //log_v("attaching UART%d pins: prev,new RX(%d,%d) TX(%d,%d) CTS(%d,%d) RTS(%d,%d)", uart_num, // uart->_rxPin, rxPin, uart->_txPin, txPin, uart->_ctsPin, ctsPin, uart->_rtsPin, rtsPin); vTaskDelay(10); - // IDF uart_set_pin() checks if the pin is used within LP UART and if it is a valid RTC IO pin + // IDF _uartInternalSetPin() checks if the pin is used within LP UART and if it is a valid RTC IO pin // No need for Arduino Layer to check it again bool retCode = true; if (rxPin >= 0) { @@ -316,7 +435,7 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t perimanClearPinBus(rxPin); } // connect RX Pad - bool ret = ESP_OK == uart_set_pin(uart->num, UART_PIN_NO_CHANGE, rxPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); + bool ret = ESP_OK == _uartInternalSetPin(uart->num, UART_PIN_NO_CHANGE, rxPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); #if SOC_UART_LP_NUM >= 1 if (ret && uart_num >= SOC_UART_HP_NUM) { // it is a LP UART NUM ret &= lp_uart_config_io(uart->num, rxPin, RTC_GPIO_MODE_INPUT_ONLY, SOC_UART_RX_PIN_IDX); @@ -339,7 +458,7 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t perimanClearPinBus(txPin); } // connect TX Pad - bool ret = ESP_OK == uart_set_pin(uart->num, txPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); + bool ret = ESP_OK == _uartInternalSetPin(uart->num, txPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); #if SOC_UART_LP_NUM >= 1 if (ret && uart_num >= SOC_UART_HP_NUM) { // it is a LP UART NUM ret &= lp_uart_config_io(uart->num, txPin, RTC_GPIO_MODE_OUTPUT_ONLY, SOC_UART_TX_PIN_IDX); @@ -362,7 +481,7 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t perimanClearPinBus(ctsPin); } // connect CTS Pad - bool ret = ESP_OK == uart_set_pin(uart->num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, ctsPin); + bool ret = ESP_OK == _uartInternalSetPin(uart->num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, ctsPin); #if SOC_UART_LP_NUM >= 1 if (ret && uart_num >= SOC_UART_HP_NUM) { // it is a LP UART NUM ret &= lp_uart_config_io(uart->num, ctsPin, RTC_GPIO_MODE_INPUT_ONLY, SOC_UART_CTS_PIN_IDX); @@ -385,7 +504,7 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t perimanClearPinBus(rtsPin); } // connect RTS Pad - bool ret = ESP_OK == uart_set_pin(uart->num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, rtsPin, UART_PIN_NO_CHANGE); + bool ret = ESP_OK == _uartInternalSetPin(uart->num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, rtsPin, UART_PIN_NO_CHANGE); #if SOC_UART_LP_NUM >= 1 if (ret && uart_num >= SOC_UART_HP_NUM) { // it is a LP UART NUM ret &= lp_uart_config_io(uart->num, rtsPin, RTC_GPIO_MODE_OUTPUT_ONLY, SOC_UART_RTS_PIN_IDX); @@ -1398,11 +1517,13 @@ void uart_internal_loopback(uint8_t uartNum, int8_t rxPin) { log_e("UART%d is not supported for loopback or RX pin %d is invalid.", uartNum, rxPin); return; } +#if 0 // leave this code here for future reference and need // forces rxPin to use GPIO Matrix and setup the pin to receive UART TX Signal - IDF 5.4.1 Change with uart_release_pin() gpio_func_sel((gpio_num_t)rxPin, PIN_FUNC_GPIO); gpio_pullup_en((gpio_num_t)rxPin); gpio_input_enable((gpio_num_t)rxPin); esp_rom_gpio_connect_in_signal(rxPin, uart_periph_signal[uartNum].pins[SOC_UART_RX_PIN_IDX].signal, false); +#endif esp_rom_gpio_connect_out_signal(rxPin, uart_periph_signal[uartNum].pins[SOC_UART_TX_PIN_IDX].signal, false, false); } From febca6b2f1d02b9252c2f5edc2aa312129c68720 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Mon, 23 Jun 2025 12:11:32 +0300 Subject: [PATCH 182/290] fix(p4): Update hosted and wifi_remote components --- idf_component.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/idf_component.yml b/idf_component.yml index 257890257cc..82f14ea554a 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -107,11 +107,11 @@ dependencies: rules: - if: "target in [esp32s3]" espressif/esp_hosted: - version: "^2.0.0" + version: "^2.0.12" rules: - if: "target == esp32p4" espressif/esp_wifi_remote: - version: "~0.9.2" + version: "^0.13.0" rules: - if: "target == esp32p4" espressif/libsodium: From 1c79eb823cf4beb8465b987bacea1347574979db Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 23 Jun 2025 08:47:49 -0300 Subject: [PATCH 183/290] feat(NimBLE): Add support for NimBLE (#11424) * feat(NimBLE): Add support for NimBLE Co-authored-by: h2zero * ci(pre-commit): Apply automatic fixes * fix(nimble): Fix typo in BLEClient --------- Co-authored-by: h2zero Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- cores/esp32/esp32-hal-bt.c | 6 +- cores/esp32/esp32-hal-misc.c | 11 +- libraries/BLE/README.md | 8 +- .../BLE5_extended_scan/BLE5_extended_scan.ino | 6 +- .../BLE/examples/BLE5_extended_scan/ci.json | 3 +- .../BLE5_multi_advertising.ino | 4 +- .../examples/BLE5_multi_advertising/ci.json | 3 +- .../BLE5_periodic_advertising.ino | 4 +- .../BLE5_periodic_advertising/ci.json | 3 +- .../BLE5_periodic_sync/BLE5_periodic_sync.ino | 6 +- .../BLE/examples/BLE5_periodic_sync/ci.json | 3 +- .../Beacon_Scanner/Beacon_Scanner.ino | 42 +- libraries/BLE/examples/Client/Client.ino | 2 + libraries/BLE/examples/Notify/Notify.ino | 1 + .../Server_multiconnect.ino | 52 +- libraries/BLE/examples/UART/UART.ino | 13 +- libraries/BLE/library.properties | 2 +- libraries/BLE/src/BLE2901.cpp | 47 +- libraries/BLE/src/BLE2901.h | 39 +- libraries/BLE/src/BLE2902.cpp | 73 +- libraries/BLE/src/BLE2902.h | 46 +- libraries/BLE/src/BLE2904.cpp | 36 +- libraries/BLE/src/BLE2904.h | 39 +- libraries/BLE/src/BLEAddress.cpp | 184 ++- libraries/BLE/src/BLEAddress.h | 85 +- libraries/BLE/src/BLEAdvertisedDevice.cpp | 165 ++- libraries/BLE/src/BLEAdvertisedDevice.h | 154 ++- libraries/BLE/src/BLEAdvertising.cpp | 915 +++++++++++-- libraries/BLE/src/BLEAdvertising.h | 210 ++- libraries/BLE/src/BLEBeacon.cpp | 47 +- libraries/BLE/src/BLEBeacon.h | 20 + libraries/BLE/src/BLECharacteristic.cpp | 1198 +++++++++++------ libraries/BLE/src/BLECharacteristic.h | 261 +++- libraries/BLE/src/BLECharacteristicMap.cpp | 76 +- libraries/BLE/src/BLEClient.cpp | 1009 +++++++++++--- libraries/BLE/src/BLEClient.h | 191 ++- libraries/BLE/src/BLEConnInfo.h | 110 ++ libraries/BLE/src/BLEDescriptor.cpp | 297 ++-- libraries/BLE/src/BLEDescriptor.h | 127 +- libraries/BLE/src/BLEDescriptorMap.cpp | 102 +- libraries/BLE/src/BLEDevice.cpp | 869 ++++++++---- libraries/BLE/src/BLEDevice.h | 246 +++- libraries/BLE/src/BLEEddystoneTLM.cpp | 8 +- .../BLE/src/BLEEddystoneTLM.cppwithheadder | 202 --- libraries/BLE/src/BLEEddystoneTLM.h | 10 +- libraries/BLE/src/BLEEddystoneURL.cpp | 12 +- libraries/BLE/src/BLEEddystoneURL.h | 8 + libraries/BLE/src/BLEEddystoneURL.h.orig | 66 - libraries/BLE/src/BLEExceptions.cpp | 5 + libraries/BLE/src/BLEHIDDevice.cpp | 39 +- libraries/BLE/src/BLEHIDDevice.h | 8 +- libraries/BLE/src/BLERemoteCharacteristic.cpp | 975 ++++++++++---- libraries/BLE/src/BLERemoteCharacteristic.h | 140 +- libraries/BLE/src/BLERemoteDescriptor.cpp | 393 +++++- libraries/BLE/src/BLERemoteDescriptor.h | 76 +- libraries/BLE/src/BLERemoteService.cpp | 369 +++-- libraries/BLE/src/BLERemoteService.h | 87 +- libraries/BLE/src/BLEScan.cpp | 690 +++++++--- libraries/BLE/src/BLEScan.h | 148 +- libraries/BLE/src/BLESecurity.cpp | 140 +- libraries/BLE/src/BLESecurity.h | 144 +- libraries/BLE/src/BLEServer.cpp | 748 ++++++++-- libraries/BLE/src/BLEServer.h | 217 ++- libraries/BLE/src/BLEService.cpp | 429 ++++-- libraries/BLE/src/BLEService.h | 126 +- libraries/BLE/src/BLEServiceMap.cpp | 40 +- libraries/BLE/src/BLEUUID.cpp | 375 +++--- libraries/BLE/src/BLEUUID.h | 101 +- libraries/BLE/src/BLEUtils.cpp | 682 ++++++++-- libraries/BLE/src/BLEUtils.h | 113 +- libraries/BLE/src/BLEValue.cpp | 18 +- libraries/BLE/src/BLEValue.h | 25 +- 72 files changed, 9898 insertions(+), 3211 deletions(-) create mode 100644 libraries/BLE/src/BLEConnInfo.h delete mode 100644 libraries/BLE/src/BLEEddystoneTLM.cppwithheadder delete mode 100644 libraries/BLE/src/BLEEddystoneURL.h.orig diff --git a/cores/esp32/esp32-hal-bt.c b/cores/esp32/esp32-hal-bt.c index 5d512d448a3..a2a603bf5b9 100644 --- a/cores/esp32/esp32-hal-bt.c +++ b/cores/esp32/esp32-hal-bt.c @@ -15,7 +15,7 @@ #include "esp32-hal-bt.h" #if SOC_BT_SUPPORTED -#if defined(CONFIG_BT_BLUEDROID_ENABLED) && __has_include("esp_bt.h") +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") #if CONFIG_IDF_TARGET_ESP32 bool btInUse() { @@ -116,7 +116,7 @@ bool btStop() { return false; } -#else // CONFIG_BT_ENABLED +#else // !__has_include("esp_bt.h") || !(defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) bool btStarted() { return false; } @@ -129,6 +129,6 @@ bool btStop() { return false; } -#endif /* CONFIG_BT_ENABLED */ +#endif /* !__has_include("esp_bt.h") || !(defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) */ #endif /* SOC_BT_SUPPORTED */ diff --git a/cores/esp32/esp32-hal-misc.c b/cores/esp32/esp32-hal-misc.c index 9c1eaf6ba25..4c8a4e5beab 100644 --- a/cores/esp32/esp32-hal-misc.c +++ b/cores/esp32/esp32-hal-misc.c @@ -25,12 +25,13 @@ #include "esp_ota_ops.h" #endif //CONFIG_APP_ROLLBACK_ENABLE #include "esp_private/startup_internal.h" -#if defined(CONFIG_BT_BLUEDROID_ENABLED) && SOC_BT_SUPPORTED && __has_include("esp_bt.h") +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && SOC_BT_SUPPORTED && __has_include("esp_bt.h") #include "esp_bt.h" -#endif //CONFIG_BT_BLUEDROID_ENABLED +#endif #include #include "soc/rtc.h" -#if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) && !defined(CONFIG_IDF_TARGET_ESP32C5) +#if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) \ + && !defined(CONFIG_IDF_TARGET_ESP32C5) #include "soc/rtc_cntl_reg.h" #include "soc/syscon_reg.h" #endif @@ -245,7 +246,7 @@ bool verifyRollbackLater() { } #endif -#ifdef CONFIG_BT_BLUEDROID_ENABLED +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) #if CONFIG_IDF_TARGET_ESP32 //overwritten in esp32-hal-bt.c bool btInUse() __attribute__((weak)); @@ -307,7 +308,7 @@ void initArduino() { if (err) { log_e("Failed to initialize NVS! Error: %u", err); } -#if defined(CONFIG_BT_BLUEDROID_ENABLED) && SOC_BT_SUPPORTED +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && SOC_BT_SUPPORTED if (!btInUse()) { esp_bt_controller_mem_release(ESP_BT_MODE_BTDM); } diff --git a/libraries/BLE/README.md b/libraries/BLE/README.md index eb70ee9ff00..759c8526f0f 100644 --- a/libraries/BLE/README.md +++ b/libraries/BLE/README.md @@ -1,8 +1,12 @@ # ESP32 BLE for Arduino The Arduino IDE provides an excellent library package manager where versions of libraries can be downloaded and installed. This Github project provides the repository for the ESP32 BLE support for Arduino. -The original source of the project, **which is not maintained anymore**, can be found here: https://github.com/nkolban/esp32-snippets +The original source of the Bluedroid project, **which is not maintained anymore**, can be found here: https://github.com/nkolban/esp32-snippets -Issues and questions should be raised here: https://github.com/espressif/arduino-esp32/issues
    (please don't use https://github.com/nkolban/esp32-snippets/issues!) +Some parts of the NimBLE implementation are based on the work of h2zero, which can be found here: https://github.com/h2zero/NimBLE-Arduino + +Issues and questions should be raised here: https://github.com/espressif/arduino-esp32/issues
    (please don't use https://github.com/nkolban/esp32-snippets/issues or https://github.com/h2zero/NimBLE-Arduino/issues!) Documentation for using the library can be found here: https://github.com/nkolban/esp32-snippets/tree/master/Documentation + +For a more customizable and feature-rich implementation of the NimBLE stack, you can use the [NimBLE-Arduino](https://github.com/h2zero/NimBLE-Arduino) library. diff --git a/libraries/BLE/examples/BLE5_extended_scan/BLE5_extended_scan.ino b/libraries/BLE/examples/BLE5_extended_scan/BLE5_extended_scan.ino index 42daff86835..e50d7339df6 100644 --- a/libraries/BLE/examples/BLE5_extended_scan/BLE5_extended_scan.ino +++ b/libraries/BLE/examples/BLE5_extended_scan/BLE5_extended_scan.ino @@ -7,8 +7,10 @@ author: chegewara */ -#ifndef SOC_BLE_50_SUPPORTED -#warning "This SoC does not support BLE5. Try using ESP32-C3, or ESP32-S3" +#ifndef CONFIG_BLUEDROID_ENABLED +#error "NimBLE does not support extended scan yet. Try using Bluedroid." +#elif !defined(SOC_BLE_50_SUPPORTED) +#error "This SoC does not support BLE5. Try using ESP32-C3, or ESP32-S3" #else #include diff --git a/libraries/BLE/examples/BLE5_extended_scan/ci.json b/libraries/BLE/examples/BLE5_extended_scan/ci.json index 184cc25a2b0..8e938055cf2 100644 --- a/libraries/BLE/examples/BLE5_extended_scan/ci.json +++ b/libraries/BLE/examples/BLE5_extended_scan/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_BLE_50_SUPPORTED=y" + "CONFIG_SOC_BLE_50_SUPPORTED=y", + "CONFIG_BLUEDROID_ENABLED=y" ] } diff --git a/libraries/BLE/examples/BLE5_multi_advertising/BLE5_multi_advertising.ino b/libraries/BLE/examples/BLE5_multi_advertising/BLE5_multi_advertising.ino index c4d614786b0..ee25f8e95ef 100644 --- a/libraries/BLE/examples/BLE5_multi_advertising/BLE5_multi_advertising.ino +++ b/libraries/BLE/examples/BLE5_multi_advertising/BLE5_multi_advertising.ino @@ -6,7 +6,9 @@ author: chegewara */ -#ifndef CONFIG_BT_BLE_50_FEATURES_SUPPORTED +#ifndef CONFIG_BLUEDROID_ENABLED +#error "NimBLE does not support multi advertising yet. Try using Bluedroid." +#elif !defined(CONFIG_BT_BLE_50_FEATURES_SUPPORTED) #error "This SoC does not support BLE5. Try using ESP32-C3, or ESP32-S3" #else diff --git a/libraries/BLE/examples/BLE5_multi_advertising/ci.json b/libraries/BLE/examples/BLE5_multi_advertising/ci.json index 184cc25a2b0..8e938055cf2 100644 --- a/libraries/BLE/examples/BLE5_multi_advertising/ci.json +++ b/libraries/BLE/examples/BLE5_multi_advertising/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_BLE_50_SUPPORTED=y" + "CONFIG_SOC_BLE_50_SUPPORTED=y", + "CONFIG_BLUEDROID_ENABLED=y" ] } diff --git a/libraries/BLE/examples/BLE5_periodic_advertising/BLE5_periodic_advertising.ino b/libraries/BLE/examples/BLE5_periodic_advertising/BLE5_periodic_advertising.ino index 0b9d4f87630..effb7efd241 100644 --- a/libraries/BLE/examples/BLE5_periodic_advertising/BLE5_periodic_advertising.ino +++ b/libraries/BLE/examples/BLE5_periodic_advertising/BLE5_periodic_advertising.ino @@ -5,7 +5,9 @@ author: chegewara */ -#ifndef CONFIG_BT_BLE_50_FEATURES_SUPPORTED +#ifndef CONFIG_BLUEDROID_ENABLED +#error "NimBLE does not support periodic advertising yet. Try using Bluedroid." +#elif !defined(CONFIG_BT_BLE_50_FEATURES_SUPPORTED) #error "This SoC does not support BLE5. Try using ESP32-C3, or ESP32-S3" #else #include diff --git a/libraries/BLE/examples/BLE5_periodic_advertising/ci.json b/libraries/BLE/examples/BLE5_periodic_advertising/ci.json index 184cc25a2b0..8e938055cf2 100644 --- a/libraries/BLE/examples/BLE5_periodic_advertising/ci.json +++ b/libraries/BLE/examples/BLE5_periodic_advertising/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_BLE_50_SUPPORTED=y" + "CONFIG_SOC_BLE_50_SUPPORTED=y", + "CONFIG_BLUEDROID_ENABLED=y" ] } diff --git a/libraries/BLE/examples/BLE5_periodic_sync/BLE5_periodic_sync.ino b/libraries/BLE/examples/BLE5_periodic_sync/BLE5_periodic_sync.ino index 9e976e6ca6a..a93ebcefec3 100644 --- a/libraries/BLE/examples/BLE5_periodic_sync/BLE5_periodic_sync.ino +++ b/libraries/BLE/examples/BLE5_periodic_sync/BLE5_periodic_sync.ino @@ -7,8 +7,10 @@ author: chegewara */ -#ifndef SOC_BLE_50_SUPPORTED -#warning "This SoC does not support BLE5. Try using ESP32-C3, or ESP32-S3" +#ifndef CONFIG_BLUEDROID_ENABLED +#error "NimBLE does not support periodic sync yet. Try using Bluedroid." +#elif !defined(SOC_BLE_50_SUPPORTED) +#error "This SoC does not support BLE5. Try using ESP32-C3, or ESP32-S3" #else #include #include diff --git a/libraries/BLE/examples/BLE5_periodic_sync/ci.json b/libraries/BLE/examples/BLE5_periodic_sync/ci.json index 184cc25a2b0..8e938055cf2 100644 --- a/libraries/BLE/examples/BLE5_periodic_sync/ci.json +++ b/libraries/BLE/examples/BLE5_periodic_sync/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_BLE_50_SUPPORTED=y" + "CONFIG_SOC_BLE_50_SUPPORTED=y", + "CONFIG_BLUEDROID_ENABLED=y" ] } diff --git a/libraries/BLE/examples/Beacon_Scanner/Beacon_Scanner.ino b/libraries/BLE/examples/Beacon_Scanner/Beacon_Scanner.ino index fbbf89ad274..4b4a311a37d 100644 --- a/libraries/BLE/examples/Beacon_Scanner/Beacon_Scanner.ino +++ b/libraries/BLE/examples/Beacon_Scanner/Beacon_Scanner.ino @@ -36,25 +36,33 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks { if (advertisedDevice.haveManufacturerData() == true) { String strManufacturerData = advertisedDevice.getManufacturerData(); - uint8_t cManufacturerData[100]; - memcpy(cManufacturerData, strManufacturerData.c_str(), strManufacturerData.length()); + // Buffer to store manufacturer data (BLE max is 255 bytes) + uint8_t cManufacturerData[255]; + size_t dataLength = strManufacturerData.length(); - if (strManufacturerData.length() == 25 && cManufacturerData[0] == 0x4C && cManufacturerData[1] == 0x00) { - Serial.println("Found an iBeacon!"); - BLEBeacon oBeacon = BLEBeacon(); - oBeacon.setData(strManufacturerData); - Serial.printf("iBeacon Frame\n"); - Serial.printf( - "ID: %04X Major: %d Minor: %d UUID: %s Power: %d\n", oBeacon.getManufacturerId(), ENDIAN_CHANGE_U16(oBeacon.getMajor()), - ENDIAN_CHANGE_U16(oBeacon.getMinor()), oBeacon.getProximityUUID().toString().c_str(), oBeacon.getSignalPower() - ); - } else { - Serial.println("Found another manufacturers beacon!"); - Serial.printf("strManufacturerData: %d ", strManufacturerData.length()); - for (int i = 0; i < strManufacturerData.length(); i++) { - Serial.printf("[%X]", cManufacturerData[i]); + // Bounds checking to prevent buffer overflow + if (dataLength <= sizeof(cManufacturerData)) { + memcpy(cManufacturerData, strManufacturerData.c_str(), dataLength); + + if (dataLength == 25 && cManufacturerData[0] == 0x4C && cManufacturerData[1] == 0x00) { + Serial.println("Found an iBeacon!"); + BLEBeacon oBeacon = BLEBeacon(); + oBeacon.setData(strManufacturerData); + Serial.printf("iBeacon Frame\n"); + Serial.printf( + "ID: %04X Major: %d Minor: %d UUID: %s Power: %d\n", oBeacon.getManufacturerId(), ENDIAN_CHANGE_U16(oBeacon.getMajor()), + ENDIAN_CHANGE_U16(oBeacon.getMinor()), oBeacon.getProximityUUID().toString().c_str(), oBeacon.getSignalPower() + ); + } else { + Serial.println("Found another manufacturers beacon!"); + Serial.printf("strManufacturerData: %d ", dataLength); + for (int i = 0; i < dataLength; i++) { + Serial.printf("[%X]", cManufacturerData[i]); + } + Serial.printf("\n"); } - Serial.printf("\n"); + } else { + Serial.printf("Manufacturer data too large (%d bytes), skipping\n", dataLength); } } diff --git a/libraries/BLE/examples/Client/Client.ino b/libraries/BLE/examples/Client/Client.ino index ce2eb2ff7d1..713bfda8e93 100644 --- a/libraries/BLE/examples/Client/Client.ino +++ b/libraries/BLE/examples/Client/Client.ino @@ -19,6 +19,7 @@ static boolean doScan = false; static BLERemoteCharacteristic *pRemoteCharacteristic; static BLEAdvertisedDevice *myDevice; +// Callback function to handle notifications static void notifyCallback(BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t *pData, size_t length, bool isNotify) { Serial.print("Notify callback for characteristic "); Serial.print(pBLERemoteCharacteristic->getUUID().toString().c_str()); @@ -80,6 +81,7 @@ bool connectToServer() { } if (pRemoteCharacteristic->canNotify()) { + // Register/Subscribe for notifications pRemoteCharacteristic->registerForNotify(notifyCallback); } diff --git a/libraries/BLE/examples/Notify/Notify.ino b/libraries/BLE/examples/Notify/Notify.ino index 6b552b01d11..5f267685dfa 100644 --- a/libraries/BLE/examples/Notify/Notify.ino +++ b/libraries/BLE/examples/Notify/Notify.ino @@ -69,6 +69,7 @@ void setup() { ); // Creates BLE Descriptor 0x2902: Client Characteristic Configuration Descriptor (CCCD) + // Descriptor 2902 is not required when using NimBLE as it is automatically added based on the characteristic properties pCharacteristic->addDescriptor(new BLE2902()); // Adds also the Characteristic User Description - 0x2901 descriptor descriptor_2901 = new BLE2901(); diff --git a/libraries/BLE/examples/Server_multiconnect/Server_multiconnect.ino b/libraries/BLE/examples/Server_multiconnect/Server_multiconnect.ino index afd15e9ae4f..ff8712d8281 100644 --- a/libraries/BLE/examples/Server_multiconnect/Server_multiconnect.ino +++ b/libraries/BLE/examples/Server_multiconnect/Server_multiconnect.ino @@ -5,6 +5,9 @@ updated by chegewara Create a BLE server that, once we receive a connection, will send periodic notifications. + The server will continue advertising for more connections after the first one and will notify + the value of a counter to all connected clients. + The service advertises itself as: 4fafc201-1fb5-459e-8fcc-c5c9c331914b And has a characteristic of: beb5483e-36e1-4688-b7f5-ea07361b26a8 @@ -26,8 +29,8 @@ BLEServer *pServer = NULL; BLECharacteristic *pCharacteristic = NULL; +int connectedClients = 0; bool deviceConnected = false; -bool oldDeviceConnected = false; uint32_t value = 0; // See the following for generating UUIDs: @@ -38,12 +41,17 @@ uint32_t value = 0; class MyServerCallbacks : public BLEServerCallbacks { void onConnect(BLEServer *pServer) { - deviceConnected = true; + connectedClients++; + Serial.print("Client connected. Total clients: "); + Serial.println(connectedClients); + // Continue advertising for more connections BLEDevice::startAdvertising(); }; void onDisconnect(BLEServer *pServer) { - deviceConnected = false; + connectedClients--; + Serial.print("Client disconnected. Total clients: "); + Serial.println(connectedClients); } }; @@ -66,8 +74,7 @@ void setup() { BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_NOTIFY | BLECharacteristic::PROPERTY_INDICATE ); - // https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml - // Create a BLE Descriptor + // Descriptor 2902 is not required when using NimBLE as it is automatically added based on the characteristic properties pCharacteristic->addDescriptor(new BLE2902()); // Start the service @@ -79,27 +86,38 @@ void setup() { pAdvertising->setScanResponse(false); pAdvertising->setMinPreferred(0x0); // set value to 0x00 to not advertise this parameter BLEDevice::startAdvertising(); - Serial.println("Waiting a client connection to notify..."); + Serial.println("Waiting for client connections to notify..."); } void loop() { - // notify changed value - if (deviceConnected) { + // Notify changed value to all connected clients + if (connectedClients > 0) { + Serial.print("Notifying value: "); + Serial.print(value); + Serial.print(" to "); + Serial.print(connectedClients); + Serial.println(" client(s)"); pCharacteristic->setValue((uint8_t *)&value, 4); pCharacteristic->notify(); value++; - delay(10); // bluetooth stack will go into congestion, if too many packets are sent, in 6 hours test i was able to go as low as 3ms + // Bluetooth stack will go into congestion, if too many packets are sent. + // In 6 hours of testing, I was able to go as low as 3ms. + // When using core debug level "debug" or "verbose", the delay can be increased in + // order to reduce the number of debug messages in the serial monitor. + delay(100); } - // disconnecting - if (!deviceConnected && oldDeviceConnected) { + + // Disconnecting - restart advertising when no clients are connected + if (connectedClients == 0 && deviceConnected) { delay(500); // give the bluetooth stack the chance to get things ready pServer->startAdvertising(); // restart advertising - Serial.println("start advertising"); - oldDeviceConnected = deviceConnected; + Serial.println("No clients connected, restarting advertising"); + deviceConnected = false; } - // connecting - if (deviceConnected && !oldDeviceConnected) { - // do stuff here on connecting - oldDeviceConnected = deviceConnected; + + // Connecting - update state when first client connects + if (connectedClients > 0 && !deviceConnected) { + // do stuff here on first connecting + deviceConnected = true; } } diff --git a/libraries/BLE/examples/UART/UART.ino b/libraries/BLE/examples/UART/UART.ino index 71cc850db66..d17ab494eca 100644 --- a/libraries/BLE/examples/UART/UART.ino +++ b/libraries/BLE/examples/UART/UART.ino @@ -40,10 +40,12 @@ uint8_t txValue = 0; class MyServerCallbacks : public BLEServerCallbacks { void onConnect(BLEServer *pServer) { deviceConnected = true; + Serial.println("Device connected"); }; void onDisconnect(BLEServer *pServer) { deviceConnected = false; + Serial.println("Device disconnected"); } }; @@ -80,6 +82,7 @@ void setup() { // Create a BLE Characteristic pTxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY); + // Descriptor 2902 is not required when using NimBLE as it is automatically added based on the characteristic properties pTxCharacteristic->addDescriptor(new BLE2902()); BLECharacteristic *pRxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE); @@ -97,22 +100,24 @@ void setup() { void loop() { if (deviceConnected) { + Serial.print("Notifying Value: "); + Serial.println(txValue); pTxCharacteristic->setValue(&txValue, 1); pTxCharacteristic->notify(); txValue++; - delay(10); // bluetooth stack will go into congestion, if too many packets are sent + delay(1000); // Notifying every 1 second } // disconnecting if (!deviceConnected && oldDeviceConnected) { delay(500); // give the bluetooth stack the chance to get things ready pServer->startAdvertising(); // restart advertising - Serial.println("start advertising"); - oldDeviceConnected = deviceConnected; + Serial.println("Started advertising again..."); + oldDeviceConnected = false; } // connecting if (deviceConnected && !oldDeviceConnected) { // do stuff here on connecting - oldDeviceConnected = deviceConnected; + oldDeviceConnected = true; } } diff --git a/libraries/BLE/library.properties b/libraries/BLE/library.properties index 7ef636223ec..fe39f5093c4 100644 --- a/libraries/BLE/library.properties +++ b/libraries/BLE/library.properties @@ -1,7 +1,7 @@ name=BLE version=3.2.0 author=Neil Kolban -maintainer=Dariusz Krempa +maintainer=lucasssvaz sentence=BLE functions for ESP32 paragraph=This library provides an implementation Bluetooth Low Energy support for the ESP32 using the Arduino platform. category=Communication diff --git a/libraries/BLE/src/BLE2901.cpp b/libraries/BLE/src/BLE2901.cpp index e929262b023..1fa4857ac33 100644 --- a/libraries/BLE/src/BLE2901.cpp +++ b/libraries/BLE/src/BLE2901.cpp @@ -1,29 +1,48 @@ /* - BLE2901.h + BLE2901.h - GATT Descriptor 0x2901 Characteristic User Description + GATT Descriptor 0x2901 Characteristic User Description - The value of this description is a user-readable string - describing the characteristic. + The value of this description is a user-readable string + describing the characteristic. - The Characteristic User Description descriptor - provides a textual user description for a characteristic - value. - If the Writable Auxiliary bit of the Characteristics - Properties is set then this descriptor is written. Only one - User Description descriptor exists in a characteristic - definition. + The Characteristic User Description descriptor + provides a textual user description for a characteristic + value. + If the Writable Auxiliary bit of the Characteristics + Properties is set then this descriptor is written. Only one + User Description descriptor exists in a characteristic + definition. */ #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes and definitions * + ***************************************************************************/ #include "BLE2901.h" -BLE2901::BLE2901() : BLEDescriptor(BLEUUID((uint16_t)0x2901)) {} // BLE2901 +#define BLE2901_UUID 0x2901 + +/*************************************************************************** + * NimBLE includes and definitions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#define ESP_GATT_MAX_ATTR_LEN BLE_ATT_ATTR_MAX_LEN +#endif + +/*************************************************************************** + * Common functions * + ***************************************************************************/ + +BLE2901::BLE2901() : BLEDescriptor(BLEUUID((uint16_t)BLE2901_UUID)) {} /** * @brief Set the Characteristic User Description @@ -36,5 +55,5 @@ void BLE2901::setDescription(String userDesc) { setValue(userDesc); } -#endif +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLE2901.h b/libraries/BLE/src/BLE2901.h index f5ad7c94add..21e7cc9398c 100644 --- a/libraries/BLE/src/BLE2901.h +++ b/libraries/BLE/src/BLE2901.h @@ -1,37 +1,48 @@ /* - BLE2901.h + BLE2901.h - GATT Descriptor 0x2901 Characteristic User Description + GATT Descriptor 0x2901 Characteristic User Description - The value of this description is a user-readable string - describing the characteristic. - - The Characteristic User Description descriptor - provides a textual user description for a characteristic - value. - If the Writable Auxiliary bit of the Characteristics - Properties is set then this descriptor is written. Only one - User Description descriptor exists in a characteristic - definition. + The value of this description is a user-readable string + describing the characteristic. + The Characteristic User Description descriptor + provides a textual user description for a characteristic + value. + If the Writable Auxiliary bit of the Characteristics + Properties is set then this descriptor is written. Only one + User Description descriptor exists in a characteristic + definition. */ #ifndef COMPONENTS_CPP_UTILS_BLE2901_H_ #define COMPONENTS_CPP_UTILS_BLE2901_H_ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ #include "BLEDescriptor.h" +/** + * @brief GATT Descriptor 0x2901 Characteristic User Description + */ class BLE2901 : public BLEDescriptor { public: + /*************************************************************************** + * Common public functions * + ***************************************************************************/ + BLE2901(); void setDescription(String desc); }; // BLE2901 -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLE2901_H_ */ diff --git a/libraries/BLE/src/BLE2902.cpp b/libraries/BLE/src/BLE2902.cpp index 90cdf088ff2..3bac9281328 100644 --- a/libraries/BLE/src/BLE2902.cpp +++ b/libraries/BLE/src/BLE2902.cpp @@ -3,46 +3,86 @@ * * Created on: Jun 25, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ /* * See also: * https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes and definitions * + ***************************************************************************/ #include "BLE2902.h" -BLE2902::BLE2902() : BLEDescriptor(BLEUUID((uint16_t)0x2902)) { +#define BLE2902_UUID 0x2902 + +/*************************************************************************** + * Common functions * + ***************************************************************************/ + +BLE2902::BLE2902() : BLEDescriptor(BLEUUID((uint16_t)BLE2902_UUID)) { +#if defined(CONFIG_BLUEDROID_ENABLED) uint8_t data[2] = {0, 0}; setValue(data, 2); -} // BLE2902 +#endif +} /** * @brief Get the notifications value. * @return The notifications value. True if notifications are enabled and false if not. */ bool BLE2902::getNotifications() { +#if defined(CONFIG_BLUEDROID_ENABLED) return (getValue()[0] & (1 << 0)) != 0; -} // getNotifications +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + if (m_pCharacteristic != nullptr) { + return (m_pCharacteristic->getProperties() & BLECharacteristic::PROPERTY_NOTIFY) != 0; + } else { + log_w("BLE2902::getNotifications() called on an uninitialized descriptor"); + return false; + } +#endif +} /** * @brief Get the indications value. * @return The indications value. True if indications are enabled and false if not. */ bool BLE2902::getIndications() { +#if defined(CONFIG_BLUEDROID_ENABLED) return (getValue()[0] & (1 << 1)) != 0; -} // getIndications +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + if (m_pCharacteristic != nullptr) { + return (m_pCharacteristic->getProperties() & BLECharacteristic::PROPERTY_INDICATE) != 0; + } else { + log_w("BLE2902::getIndications() called on an uninitialized descriptor"); + return false; + } +#endif +} /** * @brief Set the indications flag. * @param [in] flag The indications flag. */ void BLE2902::setIndications(bool flag) { +#if defined(CONFIG_BLUEDROID_ENABLED) uint8_t *pValue = getValue(); if (flag) { pValue[0] |= 1 << 1; @@ -50,13 +90,23 @@ void BLE2902::setIndications(bool flag) { pValue[0] &= ~(1 << 1); } setValue(pValue, 2); -} // setIndications +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + if (m_pCharacteristic != nullptr) { + m_pCharacteristic->setIndicateProperty(flag); + } else { + log_w("BLE2902::setIndications() called on an uninitialized descriptor"); + } +#endif +} /** * @brief Set the notifications flag. * @param [in] flag The notifications flag. */ void BLE2902::setNotifications(bool flag) { +#if defined(CONFIG_BLUEDROID_ENABLED) uint8_t *pValue = getValue(); if (flag) { pValue[0] |= 1 << 0; @@ -64,7 +114,16 @@ void BLE2902::setNotifications(bool flag) { pValue[0] &= ~(1 << 0); } setValue(pValue, 2); -} // setNotifications +#endif +#if defined(CONFIG_NIMBLE_ENABLED) + if (m_pCharacteristic != nullptr) { + m_pCharacteristic->setNotifyProperty(flag); + } else { + log_w("BLE2902::setNotifications() called on an uninitialized descriptor"); + } #endif +} + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLE2902.h b/libraries/BLE/src/BLE2902.h index 74a477f3151..5cbf911ea4a 100644 --- a/libraries/BLE/src/BLE2902.h +++ b/libraries/BLE/src/BLE2902.h @@ -3,15 +3,24 @@ * * Created on: Jun 25, 2017 * Author: kolban + * + * Modified on: Feb 28, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLE2902_H_ #define COMPONENTS_CPP_UTILS_BLE2902_H_ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ #include "BLEDescriptor.h" @@ -23,16 +32,35 @@ * See also: * https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml */ + +// Class declaration for Bluedroid +#if defined(CONFIG_BLUEDROID_ENABLED) class BLE2902 : public BLEDescriptor { -public: - BLE2902(); - bool getNotifications(); - bool getIndications(); - void setNotifications(bool flag); - void setIndications(bool flag); +#endif + +// Class declaration for NimBLE (deprecated) +#if defined(CONFIG_NIMBLE_ENABLED) + class [[deprecated("NimBLE does not support manually adding 2902 descriptors as they \ +are automatically added when the characteristic has notifications or indications enabled. \ +Get/Set the notifications/indications properties of the characteristic instead. \ +This class will be removed in a future version.")]] BLE2902 : public BLEDescriptor { +#endif + + public: + /*************************************************************************** + * Common public functions * + ***************************************************************************/ + + BLE2902(); + bool getNotifications(); + bool getIndications(); + void setNotifications(bool flag); + void setIndications(bool flag); -}; // BLE2902 + private: + friend class BLECharacteristic; + }; // BLE2902 -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLE2902_H_ */ diff --git a/libraries/BLE/src/BLE2904.cpp b/libraries/BLE/src/BLE2904.cpp index aeed11ebad1..19658051120 100644 --- a/libraries/BLE/src/BLE2904.cpp +++ b/libraries/BLE/src/BLE2904.cpp @@ -3,6 +3,10 @@ * * Created on: Dec 23, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ /* @@ -13,18 +17,30 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes and definitions * + ***************************************************************************/ #include "BLE2904.h" -BLE2904::BLE2904() : BLEDescriptor(BLEUUID((uint16_t)0x2904)) { +#define BLE2904_UUID 0x2904 +#define BLE2904_DEFAULT_NAMESPACE 1 // 1 = Bluetooth SIG Assigned Numbers +#define BLE2904_DEFAULT_UNIT 0x2700 // 0x2700 = Unitless + +/*************************************************************************** + * Common functions * + ***************************************************************************/ + +BLE2904::BLE2904() : BLEDescriptor(BLEUUID((uint16_t)BLE2904_UUID)) { m_data.m_format = 0; m_data.m_exponent = 0; - m_data.m_namespace = 1; // 1 = Bluetooth SIG Assigned Numbers - m_data.m_unit = 0; + m_data.m_namespace = BLE2904_DEFAULT_NAMESPACE; + m_data.m_unit = BLE2904_DEFAULT_UNIT; m_data.m_description = 0; setValue((uint8_t *)&m_data, sizeof(m_data)); -} // BLE2902 +} /** * @brief Set the description. @@ -40,7 +56,7 @@ void BLE2904::setDescription(uint16_t description) { void BLE2904::setExponent(int8_t exponent) { m_data.m_exponent = exponent; setValue((uint8_t *)&m_data, sizeof(m_data)); -} // setExponent +} /** * @brief Set the format. @@ -48,7 +64,7 @@ void BLE2904::setExponent(int8_t exponent) { void BLE2904::setFormat(uint8_t format) { m_data.m_format = format; setValue((uint8_t *)&m_data, sizeof(m_data)); -} // setFormat +} /** * @brief Set the namespace. @@ -56,7 +72,7 @@ void BLE2904::setFormat(uint8_t format) { void BLE2904::setNamespace(uint8_t namespace_value) { m_data.m_namespace = namespace_value; setValue((uint8_t *)&m_data, sizeof(m_data)); -} // setNamespace +} /** * @brief Set the units for this value. It should be one of the encoded values defined here: @@ -66,7 +82,7 @@ void BLE2904::setNamespace(uint8_t namespace_value) { void BLE2904::setUnit(uint16_t unit) { m_data.m_unit = unit; setValue((uint8_t *)&m_data, sizeof(m_data)); -} // setUnit +} -#endif +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLE2904.h b/libraries/BLE/src/BLE2904.h index 3ba66da0dc8..87e8c03c048 100644 --- a/libraries/BLE/src/BLE2904.h +++ b/libraries/BLE/src/BLE2904.h @@ -3,27 +3,43 @@ * * Created on: Dec 23, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLE2904_H_ #define COMPONENTS_CPP_UTILS_BLE2904_H_ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ #include "BLEDescriptor.h" +/*************************************************************************** + * Common types * + ***************************************************************************/ + struct BLE2904_Data { uint8_t m_format; int8_t m_exponent; uint16_t m_unit; // See https://www.bluetooth.com/specifications/assigned-numbers/units uint8_t m_namespace; uint16_t m_description; - } __attribute__((packed)); +/*************************************************************************** + * Common functions * + ***************************************************************************/ + /** * @brief Descriptor for Characteristic Presentation Format. * @@ -34,7 +50,10 @@ struct BLE2904_Data { */ class BLE2904 : public BLEDescriptor { public: - BLE2904(); + /*************************************************************************** + * Common public constants * + ***************************************************************************/ + static const uint8_t FORMAT_BOOLEAN = 1; static const uint8_t FORMAT_UINT2 = 2; static const uint8_t FORMAT_UINT4 = 3; @@ -62,7 +81,13 @@ class BLE2904 : public BLEDescriptor { static const uint8_t FORMAT_UTF8 = 25; static const uint8_t FORMAT_UTF16 = 26; static const uint8_t FORMAT_OPAQUE = 27; + static const uint8_t FORMAT_MEDASN1 = 28; + + /*************************************************************************** + * Common public functions * + ***************************************************************************/ + BLE2904(); void setDescription(uint16_t); void setExponent(int8_t exponent); void setFormat(uint8_t format); @@ -70,9 +95,15 @@ class BLE2904 : public BLEDescriptor { void setUnit(uint16_t unit); private: + friend class BLECharacteristic; + + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + BLE2904_Data m_data; }; // BLE2904 -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLE2904_H_ */ diff --git a/libraries/BLE/src/BLEAddress.cpp b/libraries/BLE/src/BLEAddress.cpp index b91ef3cc4de..11c64850367 100644 --- a/libraries/BLE/src/BLEAddress.cpp +++ b/libraries/BLE/src/BLEAddress.cpp @@ -3,12 +3,21 @@ * * Created on: Jul 2, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ #include "BLEAddress.h" #include @@ -17,43 +26,33 @@ #include #include #include + #ifdef ARDUINO_ARCH_ESP32 #include "esp32-hal-log.h" #endif -/** - * @brief Create an address from the native ESP32 representation. - * @param [in] address The native representation. - */ -BLEAddress::BLEAddress(esp_bd_addr_t address) { - memcpy(m_address, address, ESP_BD_ADDR_LEN); -} // BLEAddress +/*************************************************************************** + * NimBLE includes * + ***************************************************************************/ -/** - * @brief Create an address from a hex string - * - * A hex string is of the format: - * ``` - * 00:00:00:00:00:00 - * ``` - * which is 17 characters in length. - * - * @param [in] stringAddress The hex representation of the address. - */ -BLEAddress::BLEAddress(String stringAddress) { - if (stringAddress.length() != 17) { - return; - } +#if defined(CONFIG_NIMBLE_ENABLED) +/************************************************* + * NOTE: NimBLE address bytes are in INVERSE ORDER! + * We will accommodate that fact in these methods. +*************************************************/ +#include +#endif - int data[6]; - sscanf(stringAddress.c_str(), "%x:%x:%x:%x:%x:%x", &data[0], &data[1], &data[2], &data[3], &data[4], &data[5]); - m_address[0] = (uint8_t)data[0]; - m_address[1] = (uint8_t)data[1]; - m_address[2] = (uint8_t)data[2]; - m_address[3] = (uint8_t)data[3]; - m_address[4] = (uint8_t)data[4]; - m_address[5] = (uint8_t)data[5]; -} // BLEAddress +/*************************************************************************** + * Common functions * + ***************************************************************************/ + +BLEAddress::BLEAddress() { + memset(m_address, 0, ESP_BD_ADDR_LEN); +#if defined(CONFIG_NIMBLE_ENABLED) + m_addrType = 0; +#endif +} /** * @brief Determine if this address equals another. @@ -61,10 +60,20 @@ BLEAddress::BLEAddress(String stringAddress) { * @return True if the addresses are equal. */ bool BLEAddress::equals(BLEAddress otherAddress) { +#if defined(CONFIG_NIMBLE_ENABLED) + if (m_addrType != otherAddress.m_addrType) { + return false; + } +#endif return memcmp(otherAddress.getNative(), m_address, ESP_BD_ADDR_LEN) == 0; -} // equals +} bool BLEAddress::operator==(const BLEAddress &otherAddress) const { +#if defined(CONFIG_NIMBLE_ENABLED) + if (m_addrType != otherAddress.m_addrType) { + return false; + } +#endif return memcmp(otherAddress.m_address, m_address, ESP_BD_ADDR_LEN) == 0; } @@ -92,9 +101,9 @@ bool BLEAddress::operator>(const BLEAddress &otherAddress) const { * @brief Return the native representation of the address. * @return The native representation of the address. */ -esp_bd_addr_t *BLEAddress::getNative() { - return &m_address; -} // getNative +uint8_t *BLEAddress::getNative() { + return m_address; +} /** * @brief Convert a BLE address to a string. @@ -110,11 +119,112 @@ esp_bd_addr_t *BLEAddress::getNative() { String BLEAddress::toString() { auto size = 18; char *res = (char *)malloc(size); + +#if defined(CONFIG_BLUEDROID_ENABLED) snprintf(res, size, "%02x:%02x:%02x:%02x:%02x:%02x", m_address[0], m_address[1], m_address[2], m_address[3], m_address[4], m_address[5]); +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + snprintf(res, size, "%02x:%02x:%02x:%02x:%02x:%02x", m_address[5], m_address[4], m_address[3], m_address[2], m_address[1], m_address[0]); +#endif + String ret(res); free(res); return ret; -} // toString +} + +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + +/** + * @brief Create an address from the native ESP32 representation. + * @param [in] address The native representation. + */ +BLEAddress::BLEAddress(esp_bd_addr_t address) { + memcpy(m_address, address, ESP_BD_ADDR_LEN); +} + +/** + * @brief Create an address from a hex string + * + * A hex string is of the format: + * ``` + * 00:00:00:00:00:00 + * ``` + * which is 17 characters in length. + * + * @param [in] stringAddress The hex representation of the address. + */ +BLEAddress::BLEAddress(String stringAddress) { + if (stringAddress.length() != 17) { + return; + } + + int data[6]; + sscanf(stringAddress.c_str(), "%x:%x:%x:%x:%x:%x", &data[0], &data[1], &data[2], &data[3], &data[4], &data[5]); + + for (size_t index = 0; index < sizeof(m_address); index++) { + m_address[index] = (uint8_t)data[index]; + } +} + +#endif + +/*************************************************************************** + * NimBLE functions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +/************************************************* + * NOTE: NimBLE address bytes are in INVERSE ORDER! + * We will accommodate that fact in these methods. +*************************************************/ + +BLEAddress::BLEAddress(uint8_t address[ESP_BD_ADDR_LEN], uint8_t type) { + std::reverse_copy(address, address + sizeof(m_address), m_address); + m_addrType = type; +} + +BLEAddress::BLEAddress(ble_addr_t address) { + memcpy(m_address, address.val, ESP_BD_ADDR_LEN); + m_addrType = address.type; +} + +uint8_t BLEAddress::getType() { + return m_addrType; +} + +/** + * @brief Create an address from a hex string + * + * A hex string is of the format: + * ``` + * 00:00:00:00:00:00 + * ``` + * which is 17 characters in length. + * + * @param [in] stringAddress The hex representation of the address. + * @param [in] type The address type. + */ +BLEAddress::BLEAddress(String stringAddress, uint8_t type) { + if (stringAddress.length() != 17) { + return; + } + + int data[6]; + m_addrType = type; + // NimBLE addresses are in INVERSE ORDER! + sscanf(stringAddress.c_str(), "%x:%x:%x:%x:%x:%x", &data[5], &data[4], &data[3], &data[2], &data[1], &data[0]); + + for (size_t index = 0; index < sizeof(m_address); index++) { + m_address[index] = (uint8_t)data[index]; + } +} #endif + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEAddress.h b/libraries/BLE/src/BLEAddress.h index f1c8aa9b632..71b3bdfce5f 100644 --- a/libraries/BLE/src/BLEAddress.h +++ b/libraries/BLE/src/BLEAddress.h @@ -3,19 +3,53 @@ * * Created on: Jul 2, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLEADDRESS_H_ #define COMPONENTS_CPP_UTILS_BLEADDRESS_H_ #include "soc/soc_caps.h" -#include "WString.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) -#include // ESP32 BLE +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + +#include "WString.h" +#include #include +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#endif + +/*************************************************************************** + * NimBLE includes and definitions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#define ESP_BD_ADDR_LEN BLE_DEV_ADDR_LEN +#endif + +/*************************************************************************** + * NimBLE types * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +typedef uint8_t esp_bd_addr_t[ESP_BD_ADDR_LEN]; +#endif + /** * @brief A %BLE device address. * @@ -23,8 +57,11 @@ */ class BLEAddress { public: - BLEAddress(esp_bd_addr_t address); - BLEAddress(String stringAddress); + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + + BLEAddress(); bool equals(BLEAddress otherAddress); bool operator==(const BLEAddress &otherAddress) const; bool operator!=(const BLEAddress &otherAddress) const; @@ -32,13 +69,45 @@ class BLEAddress { bool operator<=(const BLEAddress &otherAddress) const; bool operator>(const BLEAddress &otherAddress) const; bool operator>=(const BLEAddress &otherAddress) const; - esp_bd_addr_t *getNative(); + uint8_t *getNative(); String toString(); + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + BLEAddress(esp_bd_addr_t address); + BLEAddress(String stringAddress); +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + BLEAddress(ble_addr_t address); + BLEAddress(String stringAddress, uint8_t type = BLE_ADDR_PUBLIC); + BLEAddress(uint8_t address[ESP_BD_ADDR_LEN], uint8_t type = BLE_ADDR_PUBLIC); + uint8_t getType(); +#endif + private: - esp_bd_addr_t m_address; + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + + uint8_t m_address[ESP_BD_ADDR_LEN]; + + /*************************************************************************** + * NimBLE private properties * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + uint8_t m_addrType; +#endif }; -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLEADDRESS_H_ */ diff --git a/libraries/BLE/src/BLEAdvertisedDevice.cpp b/libraries/BLE/src/BLEAdvertisedDevice.cpp index 8752d24a199..3ac1dfab5c8 100644 --- a/libraries/BLE/src/BLEAdvertisedDevice.cpp +++ b/libraries/BLE/src/BLEAdvertisedDevice.cpp @@ -4,22 +4,35 @@ * During the scanning procedure, we will be finding advertised BLE devices. This class * models a found device. * - * * See also: * https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile * * Created on: Jul 3, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + #include #include "BLEAdvertisedDevice.h" #include "BLEUtils.h" #include "esp32-hal-log.h" +/*************************************************************************** + * Common functions * + ***************************************************************************/ + BLEAdvertisedDevice::BLEAdvertisedDevice() { m_adFlag = 0; m_appearance = 0; @@ -32,15 +45,47 @@ BLEAdvertisedDevice::BLEAdvertisedDevice() { m_serviceDataUUIDs = {}; m_txPower = 0; m_pScan = nullptr; + m_advType = 0; + +#if defined(CONFIG_NIMBLE_ENABLED) + m_callbackSent = false; +#endif m_haveAppearance = false; m_haveManufacturerData = false; m_haveName = false; m_haveRSSI = false; m_haveTXPower = false; - + m_isLegacyAdv = true; } // BLEAdvertisedDevice +bool BLEAdvertisedDevice::isLegacyAdvertisement() { + return m_isLegacyAdv; +} + +bool BLEAdvertisedDevice::isScannable() { +#if defined(CONFIG_BLUEDROID_ENABLED) + return isLegacyAdvertisement() && (m_advType == ESP_BLE_EVT_CONN_ADV || m_advType == ESP_BLE_EVT_DISC_ADV); +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + return isLegacyAdvertisement() && (m_advType == BLE_HCI_ADV_TYPE_ADV_IND || m_advType == BLE_HCI_ADV_TYPE_ADV_SCAN_IND); +#endif +} + +bool BLEAdvertisedDevice::isConnectable() { +#if defined(CONFIG_BLUEDROID_ENABLED) + return m_advType == ESP_BLE_EVT_CONN_ADV || m_advType == ESP_BLE_EVT_CONN_DIR_ADV; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + if (m_isLegacyAdv) { + return m_advType == BLE_HCI_ADV_RPT_EVTYPE_ADV_IND || m_advType == BLE_HCI_ADV_RPT_EVTYPE_DIR_IND; + } + return (m_advType & BLE_HCI_ADV_CONN_MASK) || (m_advType & BLE_HCI_ADV_DIRECT_MASK); +#endif +} + /** * @brief Get the address. * @@ -277,75 +322,75 @@ void BLEAdvertisedDevice::parseAdvertisement(uint8_t *payload, size_t total_len) length--; char *pHex = BLEUtils::buildHexData(nullptr, payload, length); - log_d("Type: 0x%.2x (%s), length: %d, data: %s", ad_type, BLEUtils::advTypeToString(ad_type), length, pHex); + log_d("Type: 0x%.2x (%s), length: %d, data: %s", ad_type, BLEUtils::advDataTypeToString(ad_type), length, pHex); free(pHex); switch (ad_type) { - case ESP_BLE_AD_TYPE_NAME_CMPL: - { // Adv Data Type: 0x09 + case ESP_BLE_AD_TYPE_NAME_CMPL: // 0x09 + { // Adv Data Type: ESP_BLE_AD_TYPE_NAME_CMPL setName(String(reinterpret_cast(payload), length)); break; - } // ESP_BLE_AD_TYPE_NAME_CMPL + } // 0x09 - case ESP_BLE_AD_TYPE_TX_PWR: - { // Adv Data Type: 0x0A + case ESP_BLE_AD_TYPE_TX_PWR: // 0x0A + { // Adv Data Type: ESP_BLE_AD_TYPE_TX_PWR setTXPower(*payload); break; - } // ESP_BLE_AD_TYPE_TX_PWR + } // 0x0A - case ESP_BLE_AD_TYPE_APPEARANCE: - { // Adv Data Type: 0x19 + case ESP_BLE_AD_TYPE_APPEARANCE: // 0x19 + { // Adv Data Type: ESP_BLE_AD_TYPE_APPEARANCE setAppearance(*reinterpret_cast(payload)); break; - } // ESP_BLE_AD_TYPE_APPEARANCE + } // 0x19 - case ESP_BLE_AD_TYPE_FLAG: - { // Adv Data Type: 0x01 + case ESP_BLE_AD_TYPE_FLAG: // 0x01 + { // Adv Data Type: ESP_BLE_AD_TYPE_FLAG setAdFlag(*payload); break; - } // ESP_BLE_AD_TYPE_FLAG + } // 0x01 - case ESP_BLE_AD_TYPE_16SRV_CMPL: - case ESP_BLE_AD_TYPE_16SRV_PART: - { // Adv Data Type: 0x02 + case ESP_BLE_AD_TYPE_16SRV_PART: // 0x02 + case ESP_BLE_AD_TYPE_16SRV_CMPL: // 0x03 + { // Adv Data Type: ESP_BLE_AD_TYPE_16SRV_PART/CMPL for (int var = 0; var < length / 2; ++var) { setServiceUUID(BLEUUID(*reinterpret_cast(payload + var * 2))); } break; - } // ESP_BLE_AD_TYPE_16SRV_PART + } // 0x02, 0x03 - case ESP_BLE_AD_TYPE_32SRV_CMPL: - case ESP_BLE_AD_TYPE_32SRV_PART: - { // Adv Data Type: 0x04 + case ESP_BLE_AD_TYPE_32SRV_PART: // 0x04 + case ESP_BLE_AD_TYPE_32SRV_CMPL: // 0x05 + { // Adv Data Type: ESP_BLE_AD_TYPE_32SRV_PART/CMPL for (int var = 0; var < length / 4; ++var) { setServiceUUID(BLEUUID(*reinterpret_cast(payload + var * 4))); } break; - } // ESP_BLE_AD_TYPE_32SRV_PART + } // 0x04, 0x05 - case ESP_BLE_AD_TYPE_128SRV_CMPL: - { // Adv Data Type: 0x07 + case ESP_BLE_AD_TYPE_128SRV_CMPL: // 0x07 + { // Adv Data Type: ESP_BLE_AD_TYPE_128SRV_CMPL setServiceUUID(BLEUUID(payload, 16, false)); break; - } // ESP_BLE_AD_TYPE_128SRV_CMPL + } // 0x07 - case ESP_BLE_AD_TYPE_128SRV_PART: - { // Adv Data Type: 0x06 + case ESP_BLE_AD_TYPE_128SRV_PART: // 0x06 + { // Adv Data Type: ESP_BLE_AD_TYPE_128SRV_PART setServiceUUID(BLEUUID(payload, 16, false)); break; - } // ESP_BLE_AD_TYPE_128SRV_PART + } // 0x06 // See CSS Part A 1.4 Manufacturer Specific Data - case ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE: + case ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE: // 0xFF { setManufacturerData(String(reinterpret_cast(payload), length)); break; - } // ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE + } // 0xFF - case ESP_BLE_AD_TYPE_SERVICE_DATA: - { // Adv Data Type: 0x16 (Service Data) - 2 byte UUID + case ESP_BLE_AD_TYPE_SERVICE_DATA: // 0x16 + { // Adv Data Type: ESP_BLE_AD_TYPE_SERVICE_DATA - 2 byte UUID if (length < 2) { - log_e("Length too small for ESP_BLE_AD_TYPE_SERVICE_DATA"); + log_e("Length too small for SERVICE_DATA"); break; } uint16_t uuid = *(uint16_t *)payload; @@ -354,12 +399,12 @@ void BLEAdvertisedDevice::parseAdvertisement(uint8_t *payload, size_t total_len) setServiceData(String(reinterpret_cast(payload + 2), length - 2)); } break; - } //ESP_BLE_AD_TYPE_SERVICE_DATA + } // 0x16 - case ESP_BLE_AD_TYPE_32SERVICE_DATA: - { // Adv Data Type: 0x20 (Service Data) - 4 byte UUID + case ESP_BLE_AD_TYPE_32SERVICE_DATA: // 0x20 + { // Adv Data Type: ESP_BLE_AD_TYPE_32SERVICE_DATA - 4 byte UUID if (length < 4) { - log_e("Length too small for ESP_BLE_AD_TYPE_32SERVICE_DATA"); + log_e("Length too small for 32SERVICE_DATA"); break; } uint32_t uuid = *(uint32_t *)payload; @@ -368,12 +413,12 @@ void BLEAdvertisedDevice::parseAdvertisement(uint8_t *payload, size_t total_len) setServiceData(String(reinterpret_cast(payload + 4), length - 4)); } break; - } //ESP_BLE_AD_TYPE_32SERVICE_DATA + } // 0x20 - case ESP_BLE_AD_TYPE_128SERVICE_DATA: - { // Adv Data Type: 0x21 (Service Data) - 16 byte UUID + case ESP_BLE_AD_TYPE_128SERVICE_DATA: // 0x21 + { // Adv Data Type: ESP_BLE_AD_TYPE_128SERVICE_DATA - 16 byte UUID if (length < 16) { - log_e("Length too small for ESP_BLE_AD_TYPE_128SERVICE_DATA"); + log_e("Length too small for 128SERVICE_DATA"); break; } @@ -382,13 +427,13 @@ void BLEAdvertisedDevice::parseAdvertisement(uint8_t *payload, size_t total_len) setServiceData(String(reinterpret_cast(payload + 16), length - 16)); } break; - } //ESP_BLE_AD_TYPE_32SERVICE_DATA + } // 0x21 default: { log_d("Unhandled type: adType: %d - 0x%.2x", ad_type, ad_type); break; - } + } // default } // switch payload += length; } // Length <> 0 @@ -405,9 +450,19 @@ void BLEAdvertisedDevice::parseAdvertisement(uint8_t *payload, size_t total_len) * @param [in] payload The payload of the advertised device. * @param [in] total_len The length of payload */ -void BLEAdvertisedDevice::setPayload(uint8_t *payload, size_t total_len) { - m_payload = payload; - m_payloadLength = total_len; +void BLEAdvertisedDevice::setPayload(uint8_t *payload, size_t total_len, bool append) { + if (m_payload == nullptr || m_payloadLength == 0) { + return; + } + + if (append) { + m_payload = (uint8_t *)realloc(m_payload, m_payloadLength + total_len); + memcpy(m_payload + m_payloadLength, payload, total_len); + m_payloadLength += total_len; + } else { + m_payload = payload; + m_payloadLength = total_len; + } } // setPayload /** @@ -567,7 +622,7 @@ uint8_t *BLEAdvertisedDevice::getPayload() { return m_payload; } -esp_ble_addr_type_t BLEAdvertisedDevice::getAddressType() { +uint8_t BLEAdvertisedDevice::getAddressType() { return m_addressType; } @@ -587,7 +642,7 @@ ble_frame_type_t BLEAdvertisedDevice::getFrameType() { return BLE_UNKNOWN_FRAME; } -void BLEAdvertisedDevice::setAddressType(esp_ble_addr_type_t type) { +void BLEAdvertisedDevice::setAddressType(uint8_t type) { m_addressType = type; } @@ -595,5 +650,13 @@ size_t BLEAdvertisedDevice::getPayloadLength() { return m_payloadLength; } -#endif /* CONFIG_BLUEDROID_ENABLED */ +void BLEAdvertisedDevice::setAdvType(uint8_t type) { + m_advType = type; +} + +uint8_t BLEAdvertisedDevice::getAdvType() { + return m_advType; +} + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEAdvertisedDevice.h b/libraries/BLE/src/BLEAdvertisedDevice.h index 700e5704034..2a2fc0c81aa 100644 --- a/libraries/BLE/src/BLEAdvertisedDevice.h +++ b/libraries/BLE/src/BLEAdvertisedDevice.h @@ -3,6 +3,10 @@ * * Created on: Jul 3, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLEADVERTISEDDEVICE_H_ @@ -11,15 +15,38 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) -#include +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) -#include +/*************************************************************************** + * Common includes * + ***************************************************************************/ +#include #include "BLEAddress.h" #include "BLEScan.h" #include "BLEUUID.h" +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#endif + +/*************************************************************************** + * NimBLE includes * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#include +#endif + +/*************************************************************************** + * Common types * + ***************************************************************************/ + typedef enum { BLE_UNKNOWN_FRAME, BLE_EDDYSTONE_UUID_FRAME, @@ -28,7 +55,12 @@ typedef enum { BLE_FRAME_MAX } ble_frame_type_t; +/*************************************************************************** + * Forward declarations * + ***************************************************************************/ + class BLEScan; + /** * @brief A representation of a %BLE advertised device found by a scan. * @@ -37,8 +69,11 @@ class BLEScan; */ class BLEAdvertisedDevice { public: - BLEAdvertisedDevice(); + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + BLEAdvertisedDevice(); BLEAddress getAddress(); uint16_t getAppearance(); String getManufacturerData(); @@ -57,10 +92,15 @@ class BLEAdvertisedDevice { int8_t getTXPower(); uint8_t *getPayload(); size_t getPayloadLength(); - esp_ble_addr_type_t getAddressType(); + uint8_t getAddressType(); ble_frame_type_t getFrameType(); - void setAddressType(esp_ble_addr_type_t type); + void setAddressType(uint8_t type); + void setAdvType(uint8_t type); + uint8_t getAdvType(); + bool isLegacyAdvertisement(); + bool isScannable(); + bool isConnectable(); bool isAdvertisingService(BLEUUID uuid); bool haveAppearance(); bool haveManufacturerData(); @@ -75,28 +115,15 @@ class BLEAdvertisedDevice { private: friend class BLEScan; - void parseAdvertisement(uint8_t *payload, size_t total_len = 62); - void setPayload(uint8_t *payload, size_t total_len = 62); - void setAddress(BLEAddress address); - void setAdFlag(uint8_t adFlag); - void setAdvertizementResult(uint8_t *payload); - void setAppearance(uint16_t appearance); - void setManufacturerData(String manufacturerData); - void setName(String name); - void setRSSI(int rssi); - void setScan(BLEScan *pScan); - void setServiceData(String data); - void setServiceDataUUID(BLEUUID uuid); - void setServiceUUID(const char *serviceUUID); - void setServiceUUID(BLEUUID serviceUUID); - void setTXPower(int8_t txPower); + /*************************************************************************** + * Common private properties * + ***************************************************************************/ bool m_haveAppearance; bool m_haveManufacturerData; bool m_haveName; bool m_haveRSSI; bool m_haveTXPower; - BLEAddress m_address = BLEAddress((uint8_t *)"\0\0\0\0\0\0"); uint8_t m_adFlag; uint16_t m_appearance; @@ -111,7 +138,37 @@ class BLEAdvertisedDevice { std::vector m_serviceDataUUIDs; uint8_t *m_payload; size_t m_payloadLength = 0; - esp_ble_addr_type_t m_addressType; + uint8_t m_addressType; + uint8_t m_advType; + bool m_isLegacyAdv; + + /*************************************************************************** + * NimBLE private properties * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + bool m_callbackSent; +#endif + + /*************************************************************************** + * Common private declarations * + ***************************************************************************/ + + void parseAdvertisement(uint8_t *payload, size_t total_len = 62); + void setPayload(uint8_t *payload, size_t total_len = 62, bool append = false); + void setAddress(BLEAddress address); + void setAdFlag(uint8_t adFlag); + void setAdvertizementResult(uint8_t *payload); + void setAppearance(uint16_t appearance); + void setManufacturerData(String manufacturerData); + void setName(String name); + void setRSSI(int rssi); + void setScan(BLEScan *pScan); + void setServiceData(String data); + void setServiceDataUUID(BLEUUID uuid); + void setServiceUUID(const char *serviceUUID); + void setServiceUUID(BLEUUID serviceUUID); + void setTXPower(int8_t txPower); }; /** @@ -123,30 +180,55 @@ class BLEAdvertisedDevice { */ class BLEAdvertisedDeviceCallbacks { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + virtual ~BLEAdvertisedDeviceCallbacks() {} /** - * @brief Called when a new scan result is detected. - * - * As we are scanning, we will find new devices. When found, this call back is invoked with a reference to the - * device that was found. During any individual scan, a device will only be detected one time. - */ + * @brief Called when a new scan result is detected. + * + * As we are scanning, we will find new devices. When found, this call back is invoked with a reference to the + * device that was found. During any individual scan, a device will only be detected one time. + */ virtual void onResult(BLEAdvertisedDevice advertisedDevice) = 0; }; -#ifdef SOC_BLE_50_SUPPORTED +#if defined(SOC_BLE_50_SUPPORTED) && defined(CONFIG_BLUEDROID_ENABLED) class BLEExtAdvertisingCallbacks { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + virtual ~BLEExtAdvertisingCallbacks() {} + + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + /** - * @brief Called when a new scan result is detected. - * - * As we are scanning, we will find new devices. When found, this call back is invoked with a reference to the - * device that was found. During any individual scan, a device will only be detected one time. - */ + * @brief Called when a new scan result is detected. + * + * As we are scanning, we will find new devices. When found, this call back is invoked with a reference to the + * device that was found. During any individual scan, a device will only be detected one time. + */ + +#if defined(CONFIG_BLUEDROID_ENABLED) virtual void onResult(esp_ble_gap_ext_adv_report_t report) = 0; +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + + // Extended advertising for NimBLE is not supported yet. +#if defined(CONFIG_NIMBLE_ENABLED) + virtual void onResult(struct ble_gap_ext_disc_desc report) = 0; +#endif }; -#endif // SOC_BLE_50_SUPPORTED +#endif // SOC_BLE_50_SUPPORTED && CONFIG_BLUEDROID_ENABLED -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLEADVERTISEDDEVICE_H_ */ diff --git a/libraries/BLE/src/BLEAdvertising.cpp b/libraries/BLE/src/BLEAdvertising.cpp index fe39a69c206..4e76873dcad 100644 --- a/libraries/BLE/src/BLEAdvertising.cpp +++ b/libraries/BLE/src/BLEAdvertising.cpp @@ -5,6 +5,10 @@ * Created on: Jun 21, 2017 * Author: kolban * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE + * * The ESP-IDF provides a framework for BLE advertising. It has determined that there are a common set * of properties that are advertised and has built a data structure that can be populated by the programmer. * This means that the programmer doesn't have to "mess with" the low level construction of a low level @@ -16,46 +20,33 @@ * set in the data will be advertised. * */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + #include "BLEAdvertising.h" #include #include "BLEUtils.h" +#include "BLEDevice.h" #include "GeneralUtils.h" #include "esp32-hal-log.h" +/*************************************************************************** + * Common functions * + ***************************************************************************/ + /** * @brief Construct a default advertising object. - * */ -BLEAdvertising::BLEAdvertising() : m_scanRespData{} { - m_advData.set_scan_rsp = false; - m_advData.include_name = true; - m_advData.include_txpower = true; - m_advData.min_interval = 0x20; - m_advData.max_interval = 0x40; - m_advData.appearance = 0x00; - m_advData.manufacturer_len = 0; - m_advData.p_manufacturer_data = nullptr; - m_advData.service_data_len = 0; - m_advData.p_service_data = nullptr; - m_advData.service_uuid_len = 0; - m_advData.p_service_uuid = nullptr; - m_advData.flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT); - - m_advParams.adv_int_min = 0x20; - m_advParams.adv_int_max = 0x40; - m_advParams.adv_type = ADV_TYPE_IND; - m_advParams.own_addr_type = BLE_ADDR_TYPE_PUBLIC; - m_advParams.channel_map = ADV_CHNL_ALL; - m_advParams.adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY; - m_advParams.peer_addr_type = BLE_ADDR_TYPE_PUBLIC; - - m_customAdvData = false; // No custom advertising data - m_customScanResponseData = false; // No custom scan response data +BLEAdvertising::BLEAdvertising() { + reset(); } // BLEAdvertising /** @@ -64,6 +55,9 @@ BLEAdvertising::BLEAdvertising() : m_scanRespData{} { */ void BLEAdvertising::addServiceUUID(BLEUUID serviceUUID) { m_serviceUUIDs.push_back(serviceUUID); +#ifdef CONFIG_NIMBLE_ENABLED + m_advDataSet = false; +#endif } // addServiceUUID /** @@ -72,6 +66,9 @@ void BLEAdvertising::addServiceUUID(BLEUUID serviceUUID) { */ void BLEAdvertising::addServiceUUID(const char *serviceUUID) { addServiceUUID(BLEUUID(serviceUUID)); +#ifdef CONFIG_NIMBLE_ENABLED + m_advDataSet = false; +#endif } // addServiceUUID /** @@ -87,6 +84,9 @@ bool BLEAdvertising::removeServiceUUID(int index) { } m_serviceUUIDs.erase(m_serviceUUIDs.begin() + index); +#ifdef CONFIG_NIMBLE_ENABLED + m_advDataSet = false; +#endif return true; } @@ -120,34 +120,107 @@ bool BLEAdvertising::removeServiceUUID(const char *serviceUUID) { */ void BLEAdvertising::setAppearance(uint16_t appearance) { m_advData.appearance = appearance; +#ifdef CONFIG_NIMBLE_ENABLED + m_advData.appearance_is_present = 1; + m_advDataSet = false; +#endif } // setAppearance -void BLEAdvertising::setAdvertisementType(esp_ble_adv_type_t adv_type) { - m_advParams.adv_type = adv_type; -} // setAdvertisementType +void BLEAdvertising::setAdvertisementType(uint8_t adv_type) { +#ifdef CONFIG_BLUEDROID_ENABLED + m_advParams.adv_type = (esp_ble_adv_type_t)adv_type; +#endif -void BLEAdvertising::setAdvertisementChannelMap(esp_ble_adv_channel_t channel_map) { - m_advParams.channel_map = channel_map; -} // setAdvertisementChannelMap +#if defined(CONFIG_NIMBLE_ENABLED) + m_advParams.conn_mode = adv_type; +#endif +} // setAdvertisementType void BLEAdvertising::setMinInterval(uint16_t mininterval) { +#ifdef CONFIG_BLUEDROID_ENABLED m_advParams.adv_int_min = mininterval; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + m_advParams.itvl_min = mininterval; +#endif } // setMinInterval void BLEAdvertising::setMaxInterval(uint16_t maxinterval) { +#ifdef CONFIG_BLUEDROID_ENABLED m_advParams.adv_int_max = maxinterval; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + m_advParams.itvl_max = maxinterval; +#endif } // setMaxInterval void BLEAdvertising::setMinPreferred(uint16_t mininterval) { +#ifdef CONFIG_BLUEDROID_ENABLED m_advData.min_interval = mininterval; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + // invalid parameters, set the slave interval to null + if (mininterval < 0x0006 || mininterval > 0x0C80) { + m_advData.slave_itvl_range = nullptr; + return; + } + + if (m_advData.slave_itvl_range == nullptr) { + m_advData.slave_itvl_range = m_slaveItvl; + } + + m_slaveItvl[0] = mininterval; + m_slaveItvl[1] = mininterval >> 8; + + uint16_t maxinterval = *(uint16_t *)(m_advData.slave_itvl_range + 2); + + // If mininterval is higher than the maxinterval make them the same + if (mininterval > maxinterval) { + m_slaveItvl[2] = m_slaveItvl[0]; + m_slaveItvl[3] = m_slaveItvl[1]; + } + + m_advDataSet = false; +#endif } // void BLEAdvertising::setMaxPreferred(uint16_t maxinterval) { +#ifdef CONFIG_BLUEDROID_ENABLED m_advData.max_interval = maxinterval; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + // invalid parameters, set the slave interval to null + if (maxinterval < 0x0006 || maxinterval > 0x0C80) { + m_advData.slave_itvl_range = nullptr; + return; + } + if (m_advData.slave_itvl_range == nullptr) { + m_advData.slave_itvl_range = m_slaveItvl; + } + m_slaveItvl[2] = maxinterval; + m_slaveItvl[3] = maxinterval >> 8; + + uint16_t mininterval = *(uint16_t *)(m_advData.slave_itvl_range); + + // If mininterval is higher than the maxinterval make them the same + if (mininterval > maxinterval) { + m_slaveItvl[0] = m_slaveItvl[2]; + m_slaveItvl[1] = m_slaveItvl[3]; + } + + m_advDataSet = false; +#endif } // void BLEAdvertising::setScanResponse(bool set) { m_scanResp = set; +#ifdef CONFIG_NIMBLE_ENABLED + m_advDataSet = false; +#endif } /** @@ -158,22 +231,54 @@ void BLEAdvertising::setScanResponse(bool set) { void BLEAdvertising::setScanFilter(bool scanRequestWhitelistOnly, bool connectWhitelistOnly) { log_v(">> setScanFilter: scanRequestWhitelistOnly: %d, connectWhitelistOnly: %d", scanRequestWhitelistOnly, connectWhitelistOnly); if (!scanRequestWhitelistOnly && !connectWhitelistOnly) { + +#ifdef CONFIG_BLUEDROID_ENABLED m_advParams.adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + m_advParams.filter_policy = BLE_HCI_ADV_FILT_NONE; +#endif + log_v("<< setScanFilter"); return; } if (scanRequestWhitelistOnly && !connectWhitelistOnly) { + +#ifdef CONFIG_BLUEDROID_ENABLED m_advParams.adv_filter_policy = ADV_FILTER_ALLOW_SCAN_WLST_CON_ANY; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + m_advParams.filter_policy = BLE_HCI_ADV_FILT_SCAN; +#endif + log_v("<< setScanFilter"); return; } if (!scanRequestWhitelistOnly && connectWhitelistOnly) { + +#ifdef CONFIG_BLUEDROID_ENABLED m_advParams.adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_WLST; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + m_advParams.filter_policy = BLE_HCI_ADV_FILT_CONN; +#endif + log_v("<< setScanFilter"); return; } if (scanRequestWhitelistOnly && connectWhitelistOnly) { + +#ifdef CONFIG_BLUEDROID_ENABLED m_advParams.adv_filter_policy = ADV_FILTER_ALLOW_SCAN_WLST_CON_WLST; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + m_advParams.filter_policy = BLE_HCI_ADV_FILT_BOTH; +#endif + log_v("<< setScanFilter"); return; } @@ -185,10 +290,21 @@ void BLEAdvertising::setScanFilter(bool scanRequestWhitelistOnly, bool connectWh */ bool BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertisementData) { log_v(">> setAdvertisementData"); + +#ifdef CONFIG_BLUEDROID_ENABLED esp_err_t errRc = ::esp_ble_gap_config_adv_data_raw((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length()); if (errRc != ESP_OK) { log_e("esp_ble_gap_config_adv_data_raw: %d %s", errRc, GeneralUtils::errorToString(errRc)); } +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + esp_err_t errRc = ble_gap_adv_set_data((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length()); + if (errRc != ESP_OK) { + log_e("ble_gap_adv_set_data: %d %s", errRc, BLEUtils::returnCodeToString(errRc)); + } +#endif + m_customAdvData = true; // Set the flag that indicates we are using custom advertising data. log_v("<< setAdvertisementData"); return ESP_OK == errRc; @@ -200,127 +316,25 @@ bool BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertisementDat */ bool BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData) { log_v(">> setScanResponseData"); + +#ifdef CONFIG_BLUEDROID_ENABLED esp_err_t errRc = ::esp_ble_gap_config_scan_rsp_data_raw((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length()); if (errRc != ESP_OK) { log_e("esp_ble_gap_config_scan_rsp_data_raw: %d %s", errRc, GeneralUtils::errorToString(errRc)); } - m_customScanResponseData = true; // Set the flag that indicates we are using custom scan response data. - log_v("<< setScanResponseData"); - return ESP_OK == errRc; -} // setScanResponseData +#endif -/** - * @brief Start advertising. - * Start advertising. - * @return N/A. - */ -bool BLEAdvertising::start() { - log_v(">> start: customAdvData: %d, customScanResponseData: %d", m_customAdvData, m_customScanResponseData); - - // We have a vector of service UUIDs that we wish to advertise. In order to use the - // ESP-IDF framework, these must be supplied in a contiguous array of their 128bit (16 byte) - // representations. If we have 1 or more services to advertise then we allocate enough - // storage to host them and then copy them in one at a time into the contiguous storage. - int numServices = m_serviceUUIDs.size(); - if (numServices > 0) { - m_advData.service_uuid_len = 16 * numServices; - m_advData.p_service_uuid = (uint8_t *)malloc(m_advData.service_uuid_len); - if (!m_advData.p_service_uuid) { - log_e(">> start failed: out of memory"); - return false; - } - - uint8_t *p = m_advData.p_service_uuid; - for (int i = 0; i < numServices; i++) { - log_d("- advertising service: %s", m_serviceUUIDs[i].toString().c_str()); - BLEUUID serviceUUID128 = m_serviceUUIDs[i].to128(); - memcpy(p, serviceUUID128.getNative()->uuid.uuid128, 16); - p += 16; - } - } else { - m_advData.service_uuid_len = 0; - log_d("- no services advertised"); - } - - esp_err_t errRc; - - if (!m_customAdvData) { - // Set the configuration for advertising. - m_advData.set_scan_rsp = false; - m_advData.include_name = !m_scanResp; - m_advData.include_txpower = !m_scanResp; - errRc = ::esp_ble_gap_config_adv_data(&m_advData); - if (errRc != ESP_OK) { - log_e("<< esp_ble_gap_config_adv_data: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - return false; - } - } - - if (!m_customScanResponseData && m_scanResp) { - // Set the configuration for scan response. - memcpy(&m_scanRespData, &m_advData, sizeof(esp_ble_adv_data_t)); // Copy the content of m_advData. - m_scanRespData.set_scan_rsp = true; // Define this struct as scan response data - m_scanRespData.include_name = true; // Caution: This may lead to a crash if the device name has more than 29 characters - m_scanRespData.include_txpower = true; - m_scanRespData.appearance = 0; // If defined the 'Appearance' attribute is already included in the advertising data - m_scanRespData.flag = 0; // 'Flags' attribute should no be included in the scan response - - errRc = ::esp_ble_gap_config_adv_data(&m_scanRespData); - if (errRc != ESP_OK) { - log_e("<< esp_ble_gap_config_adv_data (Scan response): rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - return false; - } - } - - // If we had services to advertise then we previously allocated some storage for them. - // Here we release that storage. - free(m_advData.p_service_uuid); //TODO change this variable to local scope? - m_advData.p_service_uuid = nullptr; - - // Start advertising. - errRc = ::esp_ble_gap_start_advertising(&m_advParams); +#if defined(CONFIG_NIMBLE_ENABLED) + esp_err_t errRc = ble_gap_adv_rsp_set_data((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length()); if (errRc != ESP_OK) { - log_e("<< esp_ble_gap_start_advertising: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - } else { - log_v("<< start"); + log_e("ble_gap_adv_rsp_set_data: %d %s", errRc, BLEUtils::returnCodeToString(errRc)); } - return ESP_OK == errRc; -} // start - -/** - * @brief Stop advertising. - * Stop advertising. - * @return N/A. - */ -bool BLEAdvertising::stop() { - log_v(">> stop"); - esp_err_t errRc = ::esp_ble_gap_stop_advertising(); - if (errRc != ESP_OK) { - log_e("esp_ble_gap_stop_advertising: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - } else { - log_v("<< stop"); - } - return ESP_OK == errRc; -} // stop - -/** - * @brief Set BLE address. - * @param [in] Bluetooth address. - * @param [in] Bluetooth address type. - * Set BLE address. - */ -bool BLEAdvertising::setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type) { - log_v(">> setPrivateAddress"); +#endif - m_advParams.own_addr_type = type; - esp_err_t errRc = esp_ble_gap_set_rand_addr((uint8_t *)addr); - if (errRc != ESP_OK) { - log_e("esp_ble_gap_set_rand_addr: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - } else { - log_v("<< setPrivateAddress"); - } + m_customScanResponseData = true; // Set the flag that indicates we are using custom scan response data. + log_v("<< setScanResponseData"); return ESP_OK == errRc; -} // setPrivateAddress +} // setScanResponseData /** * @brief Add data to the payload to be advertised. @@ -333,6 +347,13 @@ void BLEAdvertisementData::addData(String data) { m_payload.concat(data); } // addData +void BLEAdvertisementData::addData(char *data, size_t length) { + if ((m_payload.length() + length) > ESP_BLE_ADV_DATA_LEN_MAX) { + return; + } + m_payload.concat(String(data, length)); +} // addData + /** * @brief Set the appearance. * @param [in] appearance The appearance code value. @@ -359,7 +380,12 @@ void BLEAdvertisementData::setCompleteServices(BLEUUID uuid) { // [Len] [0x03] [LL] [HH] cdata[0] = 3; cdata[1] = ESP_BLE_AD_TYPE_16SRV_CMPL; // 0x03 +#if defined(CONFIG_BLUEDROID_ENABLED) addData(String(cdata, 2) + String((char *)&uuid.getNative()->uuid.uuid16, 2)); +#endif +#if defined(CONFIG_NIMBLE_ENABLED) + addData(String(cdata, 2) + String((char *)&uuid.getNative()->u16.value, 2)); +#endif break; } @@ -368,7 +394,12 @@ void BLEAdvertisementData::setCompleteServices(BLEUUID uuid) { // [Len] [0x05] [LL] [LL] [HH] [HH] cdata[0] = 5; cdata[1] = ESP_BLE_AD_TYPE_32SRV_CMPL; // 0x05 +#if defined(CONFIG_BLUEDROID_ENABLED) addData(String(cdata, 2) + String((char *)&uuid.getNative()->uuid.uuid32, 4)); +#endif +#if defined(CONFIG_NIMBLE_ENABLED) + addData(String(cdata, 2) + String((char *)&uuid.getNative()->u32.value, 4)); +#endif break; } @@ -377,7 +408,12 @@ void BLEAdvertisementData::setCompleteServices(BLEUUID uuid) { // [Len] [0x07] [0] [1] ... [15] cdata[0] = 17; cdata[1] = ESP_BLE_AD_TYPE_128SRV_CMPL; // 0x07 +#if defined(CONFIG_BLUEDROID_ENABLED) addData(String(cdata, 2) + String((char *)uuid.getNative()->uuid.uuid128, 16)); +#endif +#if defined(CONFIG_NIMBLE_ENABLED) + addData(String(cdata, 2) + String((char *)uuid.getNative()->u128.value, 16)); +#endif break; } @@ -442,7 +478,12 @@ void BLEAdvertisementData::setPartialServices(BLEUUID uuid) { // [Len] [0x02] [LL] [HH] cdata[0] = 3; cdata[1] = ESP_BLE_AD_TYPE_16SRV_PART; // 0x02 +#if defined(CONFIG_BLUEDROID_ENABLED) addData(String(cdata, 2) + String((char *)&uuid.getNative()->uuid.uuid16, 2)); +#endif +#if defined(CONFIG_NIMBLE_ENABLED) + addData(String(cdata, 2) + String((char *)&uuid.getNative()->u16.value, 2)); +#endif break; } @@ -451,7 +492,12 @@ void BLEAdvertisementData::setPartialServices(BLEUUID uuid) { // [Len] [0x04] [LL] [LL] [HH] [HH] cdata[0] = 5; cdata[1] = ESP_BLE_AD_TYPE_32SRV_PART; // 0x04 +#if defined(CONFIG_BLUEDROID_ENABLED) addData(String(cdata, 2) + String((char *)&uuid.getNative()->uuid.uuid32, 4)); +#endif +#if defined(CONFIG_NIMBLE_ENABLED) + addData(String(cdata, 2) + String((char *)&uuid.getNative()->u32.value, 4)); +#endif break; } @@ -460,7 +506,12 @@ void BLEAdvertisementData::setPartialServices(BLEUUID uuid) { // [Len] [0x06] [0] [1] ... [15] cdata[0] = 17; cdata[1] = ESP_BLE_AD_TYPE_128SRV_PART; // 0x06 +#if defined(CONFIG_BLUEDROID_ENABLED) addData(String(cdata, 2) + String((char *)&uuid.getNative()->uuid.uuid128, 16)); +#endif +#if defined(CONFIG_NIMBLE_ENABLED) + addData(String(cdata, 2) + String((char *)&uuid.getNative()->u128.value, 16)); +#endif break; } @@ -481,7 +532,12 @@ void BLEAdvertisementData::setServiceData(BLEUUID uuid, String data) { // [Len] [0x16] [UUID16] data cdata[0] = data.length() + 3; cdata[1] = ESP_BLE_AD_TYPE_SERVICE_DATA; // 0x16 +#if defined(CONFIG_BLUEDROID_ENABLED) addData(String(cdata, 2) + String((char *)&uuid.getNative()->uuid.uuid16, 2) + data); +#endif +#if defined(CONFIG_NIMBLE_ENABLED) + addData(String(cdata, 2) + String((char *)&uuid.getNative()->u16.value, 2) + data); +#endif break; } @@ -490,7 +546,12 @@ void BLEAdvertisementData::setServiceData(BLEUUID uuid, String data) { // [Len] [0x20] [UUID32] data cdata[0] = data.length() + 5; cdata[1] = ESP_BLE_AD_TYPE_32SERVICE_DATA; // 0x20 +#if defined(CONFIG_BLUEDROID_ENABLED) addData(String(cdata, 2) + String((char *)&uuid.getNative()->uuid.uuid32, 4) + data); +#endif +#if defined(CONFIG_NIMBLE_ENABLED) + addData(String(cdata, 2) + String((char *)&uuid.getNative()->u32.value, 4) + data); +#endif break; } @@ -499,7 +560,12 @@ void BLEAdvertisementData::setServiceData(BLEUUID uuid, String data) { // [Len] [0x21] [UUID128] data cdata[0] = data.length() + 17; cdata[1] = ESP_BLE_AD_TYPE_128SERVICE_DATA; // 0x21 +#if defined(CONFIG_BLUEDROID_ENABLED) addData(String(cdata, 2) + String((char *)&uuid.getNative()->uuid.uuid128, 16) + data); +#endif +#if defined(CONFIG_NIMBLE_ENABLED) + addData(String(cdata, 2) + String((char *)&uuid.getNative()->u128.value, 16) + data); +#endif break; } @@ -520,6 +586,33 @@ void BLEAdvertisementData::setShortName(String name) { log_d("BLEAdvertisementData", "<< setShortName"); } // setShortName +/** + * @brief Adds Tx power level to the advertisement data. + */ +void BLEAdvertisementData::addTxPower() { + char cdata[3]; + cdata[0] = 2; // length + cdata[1] = ESP_BLE_AD_TYPE_TX_PWR; + cdata[2] = BLEDevice::getPower(); + addData(cdata, 3); +} // addTxPower + +/** + * @brief Set the preferred connection interval parameters. + * @param [in] min The minimum interval desired. + * @param [in] max The maximum interval desired. + */ +void BLEAdvertisementData::setPreferredParams(uint16_t min, uint16_t max) { + char cdata[6]; + cdata[0] = 5; // length + cdata[1] = ESP_BLE_AD_TYPE_INT_RANGE; + cdata[2] = min; + cdata[3] = min >> 8; + cdata[4] = max; + cdata[5] = max >> 8; + addData(cdata, 6); +} // setPreferredParams + /** * @brief Retrieve the payload that is to be advertised. * @return The payload that is to be advertised. @@ -528,8 +621,146 @@ String BLEAdvertisementData::getPayload() { return m_payload; } // getPayload -void BLEAdvertising::handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + +void BLEAdvertising::reset() { + if (BLEDevice::getInitialized()) { + stop(); + } + + memset(&m_scanRespData, 0, sizeof(esp_ble_adv_data_t)); + memset(&m_advData, 0, sizeof(esp_ble_adv_data_t)); + memset(&m_advParams, 0, sizeof(esp_ble_adv_params_t)); + + m_advData.set_scan_rsp = false; + m_advData.include_name = true; + m_advData.include_txpower = true; + m_advData.min_interval = 0x20; + m_advData.max_interval = 0x40; + m_advData.appearance = 0x00; + m_advData.manufacturer_len = 0; + m_advData.p_manufacturer_data = nullptr; + m_advData.service_data_len = 0; + m_advData.p_service_data = nullptr; + m_advData.service_uuid_len = 0; + m_advData.p_service_uuid = nullptr; + m_advData.flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT); + + m_advParams.adv_int_min = 0x20; + m_advParams.adv_int_max = 0x40; + m_advParams.adv_type = ADV_TYPE_IND; + m_advParams.own_addr_type = BLE_ADDR_TYPE_PUBLIC; + m_advParams.channel_map = ADV_CHNL_ALL; + m_advParams.adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY; + m_advParams.peer_addr_type = BLE_ADDR_TYPE_PUBLIC; + m_customAdvData = false; // No custom advertising data + m_customScanResponseData = false; // No custom scan response data +} // BLEAdvertising + +void BLEAdvertising::setAdvertisementChannelMap(esp_ble_adv_channel_t channel_map) { + m_advParams.channel_map = channel_map; +} // setAdvertisementChannelMap + +/** + * @brief Start advertising. + * Start advertising. + * @return N/A. + */ +bool BLEAdvertising::start() { + log_v(">> start: customAdvData: %d, customScanResponseData: %d", m_customAdvData, m_customScanResponseData); + + // We have a vector of service UUIDs that we wish to advertise. In order to use the + // ESP-IDF framework, these must be supplied in a contiguous array of their 128bit (16 byte) + // representations. If we have 1 or more services to advertise then we allocate enough + // storage to host them and then copy them in one at a time into the contiguous storage. + int numServices = m_serviceUUIDs.size(); + if (numServices > 0) { + m_advData.service_uuid_len = 16 * numServices; + m_advData.p_service_uuid = (uint8_t *)malloc(m_advData.service_uuid_len); + if (!m_advData.p_service_uuid) { + log_e(">> start failed: out of memory"); + return false; + } + + uint8_t *p = m_advData.p_service_uuid; + for (int i = 0; i < numServices; i++) { + log_d("- advertising service: %s", m_serviceUUIDs[i].toString().c_str()); + BLEUUID serviceUUID128 = m_serviceUUIDs[i].to128(); + memcpy(p, serviceUUID128.getNative()->uuid.uuid128, 16); + p += 16; + } + } else { + m_advData.service_uuid_len = 0; + log_d("- no services advertised"); + } + + esp_err_t errRc; + + if (!m_customAdvData) { + // Set the configuration for advertising. + m_advData.set_scan_rsp = false; + m_advData.include_name = !m_scanResp; + m_advData.include_txpower = !m_scanResp; + errRc = ::esp_ble_gap_config_adv_data(&m_advData); + if (errRc != ESP_OK) { + log_e("<< esp_ble_gap_config_adv_data: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + return false; + } + } + + if (!m_customScanResponseData && m_scanResp) { + // Set the configuration for scan response. + memcpy(&m_scanRespData, &m_advData, sizeof(esp_ble_adv_data_t)); // Copy the content of m_advData. + m_scanRespData.set_scan_rsp = true; // Define this struct as scan response data + m_scanRespData.include_name = true; // Caution: This may lead to a crash if the device name has more than 29 characters + m_scanRespData.include_txpower = true; + m_scanRespData.appearance = 0; // If defined the 'Appearance' attribute is already included in the advertising data + m_scanRespData.flag = 0; // 'Flags' attribute should no be included in the scan response + + errRc = ::esp_ble_gap_config_adv_data(&m_scanRespData); + if (errRc != ESP_OK) { + log_e("<< esp_ble_gap_config_adv_data (Scan response): rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + return false; + } + } + + // If we had services to advertise then we previously allocated some storage for them. + // Here we release that storage. + free(m_advData.p_service_uuid); //TODO change this variable to local scope? + m_advData.p_service_uuid = nullptr; + + // Start advertising. + errRc = ::esp_ble_gap_start_advertising(&m_advParams); + if (errRc != ESP_OK) { + log_e("<< esp_ble_gap_start_advertising: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + } else { + log_v("<< start"); + } + return ESP_OK == errRc; +} // start + +/** + * @brief Stop advertising. + * Stop advertising. + * @return N/A. + */ +bool BLEAdvertising::stop() { + log_v(">> stop"); + esp_err_t errRc = ::esp_ble_gap_stop_advertising(); + if (errRc != ESP_OK) { + log_e("esp_ble_gap_stop_advertising: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + } else { + log_v("<< stop"); + } + return ESP_OK == errRc; +} // stop + +void BLEAdvertising::handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { log_d("handleGAPEvent [event no: %d]", (int)event); switch (event) { @@ -558,7 +789,26 @@ void BLEAdvertising::handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb } } -#ifdef SOC_BLE_50_SUPPORTED +/** + * @brief Set BLE address. + * @param [in] Bluetooth address. + * @param [in] Bluetooth address type. + * Set BLE address. + */ +bool BLEAdvertising::setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type) { + log_v(">> setPrivateAddress"); + + m_advParams.own_addr_type = type; + esp_err_t errRc = esp_ble_gap_set_rand_addr((uint8_t *)addr); + if (errRc != ESP_OK) { + log_e("esp_ble_gap_set_rand_addr: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + } else { + log_v("<< setPrivateAddress"); + } + return ESP_OK == errRc; +} // setPrivateAddress + +#if defined(SOC_BLE_50_SUPPORTED) /** * @brief Creator @@ -803,7 +1053,376 @@ void BLEMultiAdvertising::setDuration(uint8_t instance, int duration, int max_ev ext_adv[instance] = {instance, duration, max_events}; } -#endif // SOC_BLE_50_SUPPORTED +#endif /* SOC_BLE_50_SUPPORTED */ #endif /* CONFIG_BLUEDROID_ENABLED */ + +/*************************************************************************** + * NimBLE functions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + +void BLEAdvertising::reset() { + if (BLEDevice::getInitialized() && isAdvertising()) { + stop(); + } + memset(&m_advData, 0, sizeof m_advData); + memset(&m_scanData, 0, sizeof m_scanData); + memset(&m_advParams, 0, sizeof m_advParams); + memset(&m_slaveItvl, 0, sizeof m_slaveItvl); + const char *name = ble_svc_gap_device_name(); + + m_advData.name = (uint8_t *)name; + m_advData.name_len = strlen(name); + m_advData.name_is_complete = 1; + m_advData.tx_pwr_lvl = BLEDevice::getPower(); + m_advData.flags = (BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP); + m_advParams.conn_mode = BLE_GAP_CONN_MODE_UND; + m_advParams.disc_mode = BLE_GAP_DISC_MODE_GEN; + m_customAdvData = false; + m_customScanResponseData = false; + m_scanResp = true; + m_advDataSet = false; + // Set this to non-zero to prevent auto start if host reset before started by app. + m_duration = BLE_HS_FOREVER; + m_advCompCB = nullptr; +} // BLEAdvertising + +void BLEAdvertising::setName(String name) { + m_name = name; + m_advData.name = (uint8_t *)m_name.c_str(); + m_advData.name_len = m_name.length(); + m_advDataSet = false; +} + +/** + * @brief Add the transmission power level to the advertisement packet. + */ +void BLEAdvertising::addTxPower() { + m_advData.tx_pwr_lvl_is_present = 1; + m_advDataSet = false; +} // addTxPower + +/** + * @brief Handles the callback when advertising stops. + */ +void BLEAdvertising::advCompleteCB() { + if (m_advCompCB != nullptr) { + m_advCompCB(this); + } +} // advCompleteCB + +/** + * @brief Check if currently advertising. + * @return true if advertising is active. + */ +bool BLEAdvertising::isAdvertising() { + return ble_gap_adv_active(); +} // isAdvertising + +/* + * Host reset seems to clear advertising data, + * we need clear the flag so it reloads it. + */ +void BLEAdvertising::onHostSync() { + log_v("Host re-synced"); + + m_advDataSet = false; + // If we were advertising forever, restart it now + if (m_duration == 0) { + start(m_duration, m_advCompCB); + } else { + // Otherwise we should tell the app that advertising stopped. + advCompleteCB(); + } +} // onHostSync + +/** + * @brief Handler for gap events when not using peripheral role. + * @param [in] event the event data. + * @param [in] arg pointer to the advertising instance. + */ +int BLEAdvertising::handleGAPEvent(struct ble_gap_event *event, void *arg) { + BLEAdvertising *pAdv = (BLEAdvertising *)arg; + + if (event->type == BLE_GAP_EVENT_ADV_COMPLETE) { + switch (event->adv_complete.reason) { + // Don't call the callback if host reset, we want to + // preserve the active flag until re-sync to restart advertising. + case BLE_HS_ETIMEOUT_HCI: + case BLE_HS_EOS: + case BLE_HS_ECONTROLLER: + case BLE_HS_ENOTSYNCED: + log_e("host reset, rc=%d", event->adv_complete.reason); + BLEDevice::onReset(event->adv_complete.reason); + return 0; + default: break; + } + pAdv->advCompleteCB(); + } + return 0; +} + +/** + * @brief Start advertising. + * @param [in] duration The duration, in seconds, to advertise, 0 == advertise forever. + * @param [in] advCompleteCB A pointer to a callback to be invoked when advertising ends. + * @return True if advertising started successfully. + */ +bool BLEAdvertising::start(uint32_t duration, void (*advCompleteCB)(BLEAdvertising *pAdv)) { + log_v(">> Advertising start: customAdvData: %d, customScanResponseData: %d", m_customAdvData, m_customScanResponseData); + + // If Host is not synced we cannot start advertising. + if (!BLEDevice::m_synced) { + log_e("Host reset, wait for sync."); + return false; + } + + // If already advertising just return + if (ble_gap_adv_active()) { + log_w("Advertising already active"); + return true; + } + + BLEServer *pServer = BLEDevice::getServer(); + if (pServer != nullptr) { + if (!pServer->m_gattsStarted) { + pServer->start(); + } else if (pServer->getConnectedCount() >= CONFIG_BT_NIMBLE_MAX_CONNECTIONS) { + log_e("Max connections reached - not advertising"); + return false; + } + } + + // Save the duration in case of host reset so we can restart with the same parameters + m_duration = duration; + + if (duration == 0) { + duration = BLE_HS_FOREVER; + } else { + duration = duration * 1000; // convert duration to milliseconds + } + + m_advCompCB = advCompleteCB; + + m_advParams.disc_mode = BLE_GAP_DISC_MODE_GEN; + m_advData.flags = (BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP); + if (m_advParams.conn_mode == BLE_GAP_CONN_MODE_NON) { + if (!m_scanResp) { + m_advParams.disc_mode = BLE_GAP_DISC_MODE_NON; + m_advData.flags = BLE_HS_ADV_F_BREDR_UNSUP; + } + } + + int rc = 0; + + if (!m_customAdvData && !m_advDataSet) { + //start with 3 bytes for the flags data + uint8_t payloadLen = (2 + 1); + if (m_advData.mfg_data_len > 0) { + payloadLen += (2 + m_advData.mfg_data_len); + } + + if (m_advData.svc_data_uuid16_len > 0) { + payloadLen += (2 + m_advData.svc_data_uuid16_len); + } + + if (m_advData.svc_data_uuid32_len > 0) { + payloadLen += (2 + m_advData.svc_data_uuid32_len); + } + + if (m_advData.svc_data_uuid128_len > 0) { + payloadLen += (2 + m_advData.svc_data_uuid128_len); + } + + if (m_advData.uri_len > 0) { + payloadLen += (2 + m_advData.uri_len); + } + + if (m_advData.appearance_is_present) { + payloadLen += (2 + BLE_HS_ADV_APPEARANCE_LEN); + } + + if (m_advData.tx_pwr_lvl_is_present) { + payloadLen += (2 + BLE_HS_ADV_TX_PWR_LVL_LEN); + } + + if (m_advData.slave_itvl_range != nullptr) { + payloadLen += (2 + BLE_HS_ADV_SLAVE_ITVL_RANGE_LEN); + } + + for (auto &it : m_serviceUUIDs) { + if (it.getNative()->u.type == BLE_UUID_TYPE_16) { + int add = (m_advData.num_uuids16 > 0) ? 2 : 4; + if ((payloadLen + add) > BLE_HS_ADV_MAX_SZ) { + m_advData.uuids16_is_complete = 0; + continue; + } + payloadLen += add; + + if (nullptr == (m_advData.uuids16 = (ble_uuid16_t *)realloc((void *)m_advData.uuids16, (m_advData.num_uuids16 + 1) * sizeof(ble_uuid16_t)))) { + log_e("Error, no mem"); + abort(); + } + memcpy((void *)&m_advData.uuids16[m_advData.num_uuids16], &it.getNative()->u16, sizeof(ble_uuid16_t)); + m_advData.uuids16_is_complete = 1; + m_advData.num_uuids16++; + } + if (it.getNative()->u.type == BLE_UUID_TYPE_32) { + int add = (m_advData.num_uuids32 > 0) ? 4 : 6; + if ((payloadLen + add) > BLE_HS_ADV_MAX_SZ) { + m_advData.uuids32_is_complete = 0; + continue; + } + payloadLen += add; + + if (nullptr == (m_advData.uuids32 = (ble_uuid32_t *)realloc((void *)m_advData.uuids32, (m_advData.num_uuids32 + 1) * sizeof(ble_uuid32_t)))) { + log_e("Error, no mem"); + abort(); + } + memcpy((void *)&m_advData.uuids32[m_advData.num_uuids32], &it.getNative()->u32, sizeof(ble_uuid32_t)); + m_advData.uuids32_is_complete = 1; + m_advData.num_uuids32++; + } + if (it.getNative()->u.type == BLE_UUID_TYPE_128) { + int add = (m_advData.num_uuids128 > 0) ? 16 : 18; + if ((payloadLen + add) > BLE_HS_ADV_MAX_SZ) { + m_advData.uuids128_is_complete = 0; + continue; + } + payloadLen += add; + + if (nullptr == (m_advData.uuids128 = (ble_uuid128_t *)realloc((void *)m_advData.uuids128, (m_advData.num_uuids128 + 1) * sizeof(ble_uuid128_t)))) { + log_e("Error, no mem"); + abort(); + } + memcpy((void *)&m_advData.uuids128[m_advData.num_uuids128], &it.getNative()->u128, sizeof(ble_uuid128_t)); + m_advData.uuids128_is_complete = 1; + m_advData.num_uuids128++; + } + } + + // check if there is room for the name, if not put it in scan data + if ((payloadLen + (2 + m_advData.name_len)) > BLE_HS_ADV_MAX_SZ) { + if (m_scanResp && !m_customScanResponseData) { + m_scanData.name = m_advData.name; + m_scanData.name_len = m_advData.name_len; + if (m_scanData.name_len > BLE_HS_ADV_MAX_SZ - 2) { + m_scanData.name_len = BLE_HS_ADV_MAX_SZ - 2; + m_scanData.name_is_complete = 0; + } else { + m_scanData.name_is_complete = 1; + } + m_advData.name = nullptr; + m_advData.name_len = 0; + m_advData.name_is_complete = 0; + } else { + if (m_advData.tx_pwr_lvl_is_present) { + m_advData.tx_pwr_lvl_is_present = 0; + payloadLen -= (2 + 1); + } + // if not using scan response just cut the name down + // leaving 2 bytes for the data specifier. + if (m_advData.name_len > (BLE_HS_ADV_MAX_SZ - payloadLen - 2)) { + m_advData.name_len = (BLE_HS_ADV_MAX_SZ - payloadLen - 2); + m_advData.name_is_complete = 0; + } + } + } + + if (m_scanResp && !m_customScanResponseData) { + rc = ble_gap_adv_rsp_set_fields(&m_scanData); + switch (rc) { + case 0: break; + + case BLE_HS_EBUSY: log_e("Already advertising"); break; + + case BLE_HS_EMSGSIZE: log_e("Scan data too long"); break; + + default: log_e("Error setting scan response data; rc=%d, %s", rc, BLEUtils::returnCodeToString(rc)); break; + } + } + + if (rc == 0) { + rc = ble_gap_adv_set_fields(&m_advData); + switch (rc) { + case 0: break; + + case BLE_HS_EBUSY: log_e("Already advertising"); break; + + case BLE_HS_EMSGSIZE: log_e("Advertisement data too long"); break; + + default: log_e("Error setting advertisement data; rc=%d, %s", rc, BLEUtils::returnCodeToString(rc)); break; + } + } + + if (m_advData.num_uuids128 > 0) { + free((void *)m_advData.uuids128); + m_advData.uuids128 = nullptr; + m_advData.num_uuids128 = 0; + } + + if (m_advData.num_uuids32 > 0) { + free((void *)m_advData.uuids32); + m_advData.uuids32 = nullptr; + m_advData.num_uuids32 = 0; + } + + if (m_advData.num_uuids16 > 0) { + free((void *)m_advData.uuids16); + m_advData.uuids16 = nullptr; + m_advData.num_uuids16 = 0; + } + + if (rc != 0) { + return false; + } + + m_advDataSet = true; + } + + rc = ble_gap_adv_start( + BLEDevice::m_ownAddrType, NULL, duration, &m_advParams, (pServer != nullptr) ? BLEServer::handleGATTServerEvent : BLEAdvertising::handleGAPEvent, + (pServer != nullptr) ? (void *)pServer : (void *)this + ); + + switch (rc) { + case 0: break; + + case BLE_HS_EINVAL: log_e("Unable to advertise - Duration too long"); break; + + case BLE_HS_EPREEMPTED: log_e("Unable to advertise - busy"); break; + + case BLE_HS_ETIMEOUT_HCI: + case BLE_HS_EOS: + case BLE_HS_ECONTROLLER: + case BLE_HS_ENOTSYNCED: log_e("Unable to advertise - Host Reset"); break; + + default: log_e("Error enabling advertising; rc=%d, %s", rc, BLEUtils::returnCodeToString(rc)); break; + } + + log_d("<< Advertising start"); + return (rc == 0); +} // start + +/** + * @brief Stop advertising. + */ +bool BLEAdvertising::stop() { + log_d(">> stop"); + + int rc = ble_gap_adv_stop(); + if (rc != 0 && rc != BLE_HS_EALREADY) { + log_e("ble_gap_adv_stop rc=%d %s", rc, BLEUtils::returnCodeToString(rc)); + return false; + } + + log_d("<< stop"); + return true; +} // stop + +#endif /* CONFIG_NIMBLE_ENABLED */ + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEAdvertising.h b/libraries/BLE/src/BLEAdvertising.h index 1e573ac814f..cf68768ec91 100644 --- a/libraries/BLE/src/BLEAdvertising.h +++ b/libraries/BLE/src/BLEAdvertising.h @@ -3,6 +3,10 @@ * * Created on: Jun 21, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLEADVERTISING_H_ @@ -11,20 +15,97 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) -#include +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + #include "BLEUUID.h" #include #include "RTOS.h" +#include "BLEUtils.h" + +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#endif + +/*************************************************************************** + * NimBLE includes and definitions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#include +#include + +#define ESP_BLE_ADV_DATA_LEN_MAX BLE_HS_ADV_MAX_SZ +#define ESP_BLE_ADV_FLAG_LIMIT_DISC (0x01 << 0) +#define ESP_BLE_ADV_FLAG_GEN_DISC (0x01 << 1) +#define ESP_BLE_ADV_FLAG_BREDR_NOT_SPT (0x01 << 2) +#define ESP_BLE_ADV_FLAG_DMT_CONTROLLER_SPT (0x01 << 3) +#define ESP_BLE_ADV_FLAG_DMT_HOST_SPT (0x01 << 4) +#define ESP_BLE_ADV_FLAG_NON_LIMIT_DISC (0x00) +#endif /* CONFIG_NIMBLE_ENABLED */ + +/*************************************************************************** + * NimBLE types * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +typedef enum { + ESP_BLE_AD_TYPE_FLAG = 0x01, + ESP_BLE_AD_TYPE_16SRV_PART = 0x02, + ESP_BLE_AD_TYPE_16SRV_CMPL = 0x03, + ESP_BLE_AD_TYPE_32SRV_PART = 0x04, + ESP_BLE_AD_TYPE_32SRV_CMPL = 0x05, + ESP_BLE_AD_TYPE_128SRV_PART = 0x06, + ESP_BLE_AD_TYPE_128SRV_CMPL = 0x07, + ESP_BLE_AD_TYPE_NAME_SHORT = 0x08, + ESP_BLE_AD_TYPE_NAME_CMPL = 0x09, + ESP_BLE_AD_TYPE_TX_PWR = 0x0A, + ESP_BLE_AD_TYPE_DEV_CLASS = 0x0D, + ESP_BLE_AD_TYPE_SM_TK = 0x10, + ESP_BLE_AD_TYPE_SM_OOB_FLAG = 0x11, + ESP_BLE_AD_TYPE_INT_RANGE = 0x12, + ESP_BLE_AD_TYPE_SOL_SRV_UUID = 0x14, + ESP_BLE_AD_TYPE_128SOL_SRV_UUID = 0x15, + ESP_BLE_AD_TYPE_SERVICE_DATA = 0x16, + ESP_BLE_AD_TYPE_PUBLIC_TARGET = 0x17, + ESP_BLE_AD_TYPE_RANDOM_TARGET = 0x18, + ESP_BLE_AD_TYPE_APPEARANCE = 0x19, + ESP_BLE_AD_TYPE_ADV_INT = 0x1A, + ESP_BLE_AD_TYPE_LE_DEV_ADDR = 0x1b, + ESP_BLE_AD_TYPE_LE_ROLE = 0x1c, + ESP_BLE_AD_TYPE_SPAIR_C256 = 0x1d, + ESP_BLE_AD_TYPE_SPAIR_R256 = 0x1e, + ESP_BLE_AD_TYPE_32SOL_SRV_UUID = 0x1f, + ESP_BLE_AD_TYPE_32SERVICE_DATA = 0x20, + ESP_BLE_AD_TYPE_128SERVICE_DATA = 0x21, + ESP_BLE_AD_TYPE_LE_SECURE_CONFIRM = 0x22, + ESP_BLE_AD_TYPE_LE_SECURE_RANDOM = 0x23, + ESP_BLE_AD_TYPE_URI = 0x24, + ESP_BLE_AD_TYPE_INDOOR_POSITION = 0x25, + ESP_BLE_AD_TYPE_TRANS_DISC_DATA = 0x26, + ESP_BLE_AD_TYPE_LE_SUPPORT_FEATURE = 0x27, + ESP_BLE_AD_TYPE_CHAN_MAP_UPDATE = 0x28, + ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE = 0xFF, +} esp_ble_adv_data_type; +#endif /** * @brief Advertisement data set by the programmer to be published by the %BLE server. */ class BLEAdvertisementData { - // Only a subset of the possible BLE architected advertisement fields are currently exposed. Others will - // be exposed on demand/request or as time permits. - // public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + void setAppearance(uint16_t appearance); void setCompleteServices(BLEUUID uuid); void setFlags(uint8_t); @@ -33,85 +114,144 @@ class BLEAdvertisementData { void setPartialServices(BLEUUID uuid); void setServiceData(BLEUUID uuid, String data); void setShortName(String name); - void addData(String data); // Add data to the payload. - String getPayload(); // Retrieve the current advert payload. + void setPreferredParams(uint16_t min, uint16_t max); + void addTxPower(); + void addData(String data); + void addData(char *data, size_t length); + String getPayload(); private: friend class BLEAdvertising; - String m_payload; // The payload of the advertisement. -}; // BLEAdvertisementData + + /*************************************************************************** + * Common private declarations * + ***************************************************************************/ + + String m_payload; +}; /** * @brief Perform and manage %BLE advertising. - * - * A %BLE server will want to perform advertising in order to make itself known to %BLE clients. */ class BLEAdvertising { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + BLEAdvertising(); void addServiceUUID(BLEUUID serviceUUID); void addServiceUUID(const char *serviceUUID); bool removeServiceUUID(int index); bool removeServiceUUID(BLEUUID serviceUUID); bool removeServiceUUID(const char *serviceUUID); - bool start(); bool stop(); + void reset(); void setAppearance(uint16_t appearance); - void setAdvertisementType(esp_ble_adv_type_t adv_type); - void setAdvertisementChannelMap(esp_ble_adv_channel_t channel_map); + void setAdvertisementType(uint8_t adv_type); void setMaxInterval(uint16_t maxinterval); void setMinInterval(uint16_t mininterval); bool setAdvertisementData(BLEAdvertisementData &advertisementData); void setScanFilter(bool scanRequestWhitelistOnly, bool connectWhitelistOnly); bool setScanResponseData(BLEAdvertisementData &advertisementData); - void setPrivateAddress(esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM); - bool setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM); - - void handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); void setMinPreferred(uint16_t); void setMaxPreferred(uint16_t); void setScanResponse(bool); + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + void setPrivateAddress(esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM); + bool setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM); + void setAdvertisementChannelMap(esp_ble_adv_channel_t channel_map); + void handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); + bool start(); +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + void setName(String name); + void addTxPower(); + void advCompleteCB(); + bool isAdvertising(); + void onHostSync(); + bool start(uint32_t duration = 0, void (*advCompleteCB)(BLEAdvertising *pAdv) = nullptr); + static int handleGAPEvent(ble_gap_event *event, void *arg); +#endif + private: - esp_ble_adv_data_t m_advData; - esp_ble_adv_data_t m_scanRespData; // Used for configuration of scan response data when m_scanResp is true - esp_ble_adv_params_t m_advParams; + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + std::vector m_serviceUUIDs; - bool m_customAdvData = false; // Are we using custom advertising data? - bool m_customScanResponseData = false; // Are we using custom scan response data? + bool m_customAdvData = false; + bool m_customScanResponseData = false; FreeRTOS::Semaphore m_semaphoreSetAdv = FreeRTOS::Semaphore("startAdvert"); bool m_scanResp = true; + + /*************************************************************************** + * Bluedroid private properties * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + esp_ble_adv_data_t m_advData; + esp_ble_adv_data_t m_scanRespData; + esp_ble_adv_params_t m_advParams; +#endif + + /*************************************************************************** + * NimBLE private properties * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + ble_hs_adv_fields m_advData; + ble_hs_adv_fields m_scanData; + ble_gap_adv_params m_advParams; + bool m_advDataSet; + void (*m_advCompCB)(BLEAdvertising *pAdv); + uint8_t m_slaveItvl[4]; + uint32_t m_duration; + String m_name; +#endif }; -#ifdef SOC_BLE_50_SUPPORTED +/*************************************************************************** + * Bluedroid 5.0 specific classes * + ***************************************************************************/ +#if defined(SOC_BLE_50_SUPPORTED) && defined(CONFIG_BLUEDROID_ENABLED) class BLEMultiAdvertising { -private: - esp_ble_gap_ext_adv_params_t *params_arrays; - esp_ble_gap_ext_adv_t *ext_adv; - uint8_t count; - public: BLEMultiAdvertising(uint8_t num = 1); ~BLEMultiAdvertising() {} - bool setAdvertisingParams(uint8_t instance, const esp_ble_gap_ext_adv_params_t *params); bool setAdvertisingData(uint8_t instance, uint16_t length, const uint8_t *data); bool setScanRspData(uint8_t instance, uint16_t length, const uint8_t *data); bool start(); bool start(uint8_t num, uint8_t from); void setDuration(uint8_t instance, int duration = 0, int max_events = 0); - bool setInstanceAddress(uint8_t instance, esp_bd_addr_t rand_addr); + bool setInstanceAddress(uint8_t instance, uint8_t *rand_addr); bool stop(uint8_t num_adv, const uint8_t *ext_adv_inst); bool remove(uint8_t instance); bool clear(); - bool setPeriodicAdvertisingParams(uint8_t instance, const esp_ble_gap_periodic_adv_params_t *params); bool setPeriodicAdvertisingData(uint8_t instance, uint16_t length, const uint8_t *data); bool startPeriodicAdvertising(uint8_t instance); -}; + bool setAdvertisingParams(uint8_t instance, const esp_ble_gap_ext_adv_params_t *params); + bool setPeriodicAdvertisingParams(uint8_t instance, const esp_ble_gap_periodic_adv_params_t *params); -#endif // SOC_BLE_50_SUPPORTED +private: + esp_ble_gap_ext_adv_params_t *params_arrays; + esp_ble_gap_ext_adv_t *ext_adv; + uint8_t count; +}; +#endif -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLEADVERTISING_H_ */ diff --git a/libraries/BLE/src/BLEBeacon.cpp b/libraries/BLE/src/BLEBeacon.cpp index 43366a7b2d9..0a6c6b05258 100644 --- a/libraries/BLE/src/BLEBeacon.cpp +++ b/libraries/BLE/src/BLEBeacon.cpp @@ -3,17 +3,31 @@ * * Created on: Jan 4, 2018 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes and definitions * + ***************************************************************************/ + #include "BLEBeacon.h" #include "esp32-hal-log.h" #define ENDIAN_CHANGE_U16(x) ((((x) & 0xFF00) >> 8) + (((x) & 0xFF) << 8)) +/*************************************************************************** + * Common functions * + ***************************************************************************/ + BLEBeacon::BLEBeacon() { m_beaconData.manufacturerId = 0x4c00; m_beaconData.subType = 0x02; @@ -22,11 +36,11 @@ BLEBeacon::BLEBeacon() { m_beaconData.minor = 0; m_beaconData.signalPower = 0; memset(m_beaconData.proximityUUID, 0, sizeof(m_beaconData.proximityUUID)); -} // BLEBeacon +} String BLEBeacon::getData() { return String((char *)&m_beaconData, sizeof(m_beaconData)); -} // getData +} uint16_t BLEBeacon::getMajor() { return m_beaconData.major; @@ -48,37 +62,38 @@ int8_t BLEBeacon::getSignalPower() { return m_beaconData.signalPower; } -/** - * Set the raw data for the beacon record. - */ void BLEBeacon::setData(String data) { if (data.length() != sizeof(m_beaconData)) { log_e("Unable to set the data ... length passed in was %d and expected %d", data.length(), sizeof(m_beaconData)); return; } memcpy(&m_beaconData, data.c_str(), sizeof(m_beaconData)); -} // setData +} void BLEBeacon::setMajor(uint16_t major) { m_beaconData.major = ENDIAN_CHANGE_U16(major); -} // setMajor +} void BLEBeacon::setManufacturerId(uint16_t manufacturerId) { m_beaconData.manufacturerId = ENDIAN_CHANGE_U16(manufacturerId); -} // setManufacturerId +} void BLEBeacon::setMinor(uint16_t minor) { m_beaconData.minor = ENDIAN_CHANGE_U16(minor); -} // setMinior - -void BLEBeacon::setProximityUUID(BLEUUID uuid) { - uuid = uuid.to128(); - memcpy(m_beaconData.proximityUUID, uuid.getNative()->uuid.uuid128, 16); -} // setProximityUUID +} void BLEBeacon::setSignalPower(int8_t signalPower) { m_beaconData.signalPower = signalPower; -} // setSignalPower +} +void BLEBeacon::setProximityUUID(BLEUUID uuid) { + uuid = uuid.to128(); +#if defined(CONFIG_BLUEDROID_ENABLED) + memcpy(m_beaconData.proximityUUID, uuid.getNative()->uuid.uuid128, 16); +#elif defined(CONFIG_NIMBLE_ENABLED) + memcpy(m_beaconData.proximityUUID, uuid.getNative()->u128.value, 16); #endif +} + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEBeacon.h b/libraries/BLE/src/BLEBeacon.h index dcc41aafeb4..e0eaddda6e4 100644 --- a/libraries/BLE/src/BLEBeacon.h +++ b/libraries/BLE/src/BLEBeacon.h @@ -3,6 +3,10 @@ * * Created on: Jan 4, 2018 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLEBEACON_H_ @@ -10,6 +14,13 @@ #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED +#include "sdkconfig.h" +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + #include "BLEUUID.h" /** * @brief Representation of a beacon. @@ -18,6 +29,10 @@ */ class BLEBeacon { private: + /*************************************************************************** + * Common types * + ***************************************************************************/ + struct { uint16_t manufacturerId; uint8_t subType; @@ -29,6 +44,10 @@ class BLEBeacon { } __attribute__((packed)) m_beaconData; public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + BLEBeacon(); String getData(); uint16_t getMajor(); @@ -44,5 +63,6 @@ class BLEBeacon { void setSignalPower(int8_t signalPower); }; // BLEBeacon +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLEBEACON_H_ */ diff --git a/libraries/BLE/src/BLECharacteristic.cpp b/libraries/BLE/src/BLECharacteristic.cpp index b03d524a6a5..0234cd11cca 100644 --- a/libraries/BLE/src/BLECharacteristic.cpp +++ b/libraries/BLE/src/BLECharacteristic.cpp @@ -3,12 +3,22 @@ * * Created on: Jun 22, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + #include #include #include @@ -23,10 +33,31 @@ #include "GeneralUtils.h" #include "esp32-hal-log.h" +/*************************************************************************** + * Common definitions * + ***************************************************************************/ + #define NULL_HANDLE (0xffff) +/*************************************************************************** + * NimBLE definitions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#define NIMBLE_SUB_NOTIFY 0x0001 +#define NIMBLE_SUB_INDICATE 0x0002 +#endif + +/*************************************************************************** + * Common global variables * + ***************************************************************************/ + static BLECharacteristicCallbacks defaultCallback; //null-object-pattern +/*************************************************************************** + * Common functions * + ***************************************************************************/ + /** * @brief Construct a characteristic * @param [in] uuid - UUID (const char*) for the characteristic. @@ -42,15 +73,23 @@ BLECharacteristic::BLECharacteristic(const char *uuid, uint32_t properties) : BL BLECharacteristic::BLECharacteristic(BLEUUID uuid, uint32_t properties) { m_bleUUID = uuid; m_handle = NULL_HANDLE; - m_properties = (esp_gatt_char_prop_t)0; m_pCallbacks = &defaultCallback; - setBroadcastProperty((properties & PROPERTY_BROADCAST) != 0); - setReadProperty((properties & PROPERTY_READ) != 0); - setWriteProperty((properties & PROPERTY_WRITE) != 0); - setNotifyProperty((properties & PROPERTY_NOTIFY) != 0); - setIndicateProperty((properties & PROPERTY_INDICATE) != 0); - setWriteNoResponseProperty((properties & PROPERTY_WRITE_NR) != 0); +#ifdef CONFIG_BLUEDROID_ENABLED + m_properties = 0; + setBroadcastProperty((properties & BLECharacteristic::PROPERTY_BROADCAST) != 0); + setReadProperty((properties & BLECharacteristic::PROPERTY_READ) != 0); + setWriteProperty((properties & BLECharacteristic::PROPERTY_WRITE) != 0); + setNotifyProperty((properties & BLECharacteristic::PROPERTY_NOTIFY) != 0); + setIndicateProperty((properties & BLECharacteristic::PROPERTY_INDICATE) != 0); + setWriteNoResponseProperty((properties & BLECharacteristic::PROPERTY_WRITE_NR) != 0); +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + m_readMux = portMUX_INITIALIZER_UNLOCKED; + m_removed = 0; + m_properties = properties; +#endif } // BLECharacteristic /** @@ -66,51 +105,20 @@ BLECharacteristic::~BLECharacteristic() { * @return N/A. */ void BLECharacteristic::addDescriptor(BLEDescriptor *pDescriptor) { +#ifdef CONFIG_NIMBLE_ENABLED + if (pDescriptor->getUUID() == BLEUUID(uint16_t(0x2902))) { + log_i("NimBLE automatically creates the 0x2902 descriptor if a characteristic has a notification or indication property assigned to it.\n" + "You should check the characteristic properties for notification or indication rather than adding the descriptor manually.\n" + "This will be removed in a future version of the library."); + pDescriptor->executeCreate(this); + return; + } +#endif log_v(">> addDescriptor(): Adding %s to %s", pDescriptor->toString().c_str(), toString().c_str()); m_descriptorMap.setByUUID(pDescriptor->getUUID(), pDescriptor); log_v("<< addDescriptor()"); } // addDescriptor -/** - * @brief Register a new characteristic with the ESP runtime. - * @param [in] pService The service with which to associate this characteristic. - */ -void BLECharacteristic::executeCreate(BLEService *pService) { - log_v(">> executeCreate()"); - - if (m_handle != NULL_HANDLE) { - log_e("Characteristic already has a handle."); - return; - } - - m_pService = pService; // Save the service to which this characteristic belongs. - - log_d("Registering characteristic (esp_ble_gatts_add_char): uuid: %s, service: %s", getUUID().toString().c_str(), m_pService->toString().c_str()); - - esp_attr_control_t control; - control.auto_rsp = ESP_GATT_RSP_BY_APP; - - m_semaphoreCreateEvt.take("executeCreate"); - esp_err_t errRc = ::esp_ble_gatts_add_char( - m_pService->getHandle(), getUUID().getNative(), static_cast(m_permissions), getProperties(), nullptr, - &control - ); // Whether to auto respond or not. - - if (errRc != ESP_OK) { - log_e("<< esp_ble_gatts_add_char: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - return; - } - m_semaphoreCreateEvt.wait("executeCreate"); - - BLEDescriptor *pDescriptor = m_descriptorMap.getFirst(); - while (pDescriptor != nullptr) { - pDescriptor->executeCreate(this); - pDescriptor = m_descriptorMap.getNext(); - } // End while - - log_v("<< executeCreate"); -} // executeCreate - /** * @brief Return the BLE Descriptor for the given UUID if associated with this characteristic. * @param [in] descriptorUUID The UUID of the descriptor that we wish to retrieve. @@ -137,8 +145,10 @@ uint16_t BLECharacteristic::getHandle() { return m_handle; } // getHandle -void BLECharacteristic::setAccessPermissions(esp_gatt_perm_t perm) { +void BLECharacteristic::setAccessPermissions(uint8_t perm) { +#ifdef CONFIG_BLUEDROID_ENABLED m_permissions = perm; +#endif } esp_gatt_char_prop_t BLECharacteristic::getProperties() { @@ -185,390 +195,76 @@ size_t BLECharacteristic::getLength() { } // getLength /** - * Handle a GATT server event. + * @brief Register a new characteristic with the ESP runtime. + * @param [in] pService The service with which to associate this characteristic. */ -void BLECharacteristic::handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { - log_v(">> handleGATTServerEvent: %s", BLEUtils::gattServerEventTypeToString(event).c_str()); +void BLECharacteristic::executeCreate(BLEService *pService) { + log_v(">> executeCreate()"); - switch (event) { - // Events handled: - // - // ESP_GATTS_ADD_CHAR_EVT - // ESP_GATTS_CONF_EVT - // ESP_GATTS_CONNECT_EVT - // ESP_GATTS_DISCONNECT_EVT - // ESP_GATTS_EXEC_WRITE_EVT - // ESP_GATTS_READ_EVT - // ESP_GATTS_WRITE_EVT + if (m_handle != NULL_HANDLE) { + log_e("Characteristic already has a handle."); + return; + } - // - // ESP_GATTS_EXEC_WRITE_EVT - // When we receive this event it is an indication that a previous write long needs to be committed. - // - // exec_write: - // - uint16_t conn_id - // - uint32_t trans_id - // - esp_bd_addr_t bda - // - uint8_t exec_write_flag - Either ESP_GATT_PREP_WRITE_EXEC or ESP_GATT_PREP_WRITE_CANCEL - // - case ESP_GATTS_EXEC_WRITE_EVT: - { - if (m_writeEvt) { - m_writeEvt = false; - if (param->exec_write.exec_write_flag == ESP_GATT_PREP_WRITE_EXEC) { - m_value.commit(); - // Invoke the onWrite callback handler. - m_pCallbacks->onWrite(this, param); - } else { - m_value.cancel(); - } - // ??? - esp_err_t errRc = ::esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, nullptr); - if (errRc != ESP_OK) { - log_e("esp_ble_gatts_send_response: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - } - } - break; - } // ESP_GATTS_EXEC_WRITE_EVT + m_pService = pService; // Save the service to which this characteristic belongs. - // ESP_GATTS_ADD_CHAR_EVT - Indicate that a characteristic was added to the service. - // add_char: - // - esp_gatt_status_t status - // - uint16_t attr_handle - // - uint16_t service_handle - // - esp_bt_uuid_t char_uuid - case ESP_GATTS_ADD_CHAR_EVT: - { - if (getHandle() == param->add_char.attr_handle) { - // we have created characteristic, now we can create descriptors - // BLEDescriptor* pDescriptor = m_descriptorMap.getFirst(); - // while (pDescriptor != nullptr) { - // pDescriptor->executeCreate(this); - // pDescriptor = m_descriptorMap.getNext(); - // } // End while - m_semaphoreCreateEvt.give(); - } - break; - } // ESP_GATTS_ADD_CHAR_EVT +#ifdef CONFIG_BLUEDROID_ENABLED + log_d("Registering characteristic (esp_ble_gatts_add_char): uuid: %s, service: %s", getUUID().toString().c_str(), m_pService->toString().c_str()); - // ESP_GATTS_WRITE_EVT - A request to write the value of a characteristic has arrived. - // - // write: - // - uint16_t conn_id - // - uint16_t trans_id - // - esp_bd_addr_t bda - // - uint16_t handle - // - uint16_t offset - // - bool need_rsp - // - bool is_prep - // - uint16_t len - // - uint8_t *value - // - case ESP_GATTS_WRITE_EVT: - { - // We check if this write request is for us by comparing the handles in the event. If it is for us - // we save the new value. Next we look at the need_rsp flag which indicates whether or not we need - // to send a response. If we do, then we formulate a response and send it. - if (param->write.handle == m_handle) { - if (param->write.is_prep) { - m_value.addPart(param->write.value, param->write.len); - m_writeEvt = true; - } else { - setValue(param->write.value, param->write.len); - } + esp_attr_control_t control; + control.auto_rsp = ESP_GATT_RSP_BY_APP; - log_d(" - Response to write event: New value: handle: %.2x, uuid: %s", getHandle(), getUUID().toString().c_str()); + m_semaphoreCreateEvt.take("executeCreate"); + esp_err_t errRc = ::esp_ble_gatts_add_char( + m_pService->getHandle(), getUUID().getNative(), static_cast(m_permissions), getProperties(), nullptr, + &control + ); // Whether to auto respond or not. + + if (errRc != ESP_OK) { + log_e("<< esp_ble_gatts_add_char: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + return; + } + m_semaphoreCreateEvt.wait("executeCreate"); -// 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; + BLEDescriptor *pDescriptor = m_descriptorMap.getFirst(); + while (pDescriptor != nullptr) { + pDescriptor->executeCreate(this); + pDescriptor = m_descriptorMap.getNext(); + } // End while - rsp.attr_value.len = param->write.len; - rsp.attr_value.handle = m_handle; - rsp.attr_value.offset = param->write.offset; - rsp.attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE; - memcpy(rsp.attr_value.value, param->write.value, param->write.len); + log_v("<< executeCreate"); +} // executeCreate - esp_err_t errRc = ::esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, &rsp); - if (errRc != ESP_OK) { - log_e("esp_ble_gatts_send_response: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - } - } // Response needed +/** + * @brief Send an indication. + * An indication is a transmission of up to the first 20 bytes of the characteristic value. An indication + * will block waiting a positive confirmation from the client. + * @return N/A + */ +void BLECharacteristic::indicate() { - if (param->write.is_prep != true) { - // Invoke the onWrite callback handler. - m_pCallbacks->onWrite(this, param); - } - } // Match on handles. - break; - } // ESP_GATTS_WRITE_EVT + log_v(">> indicate: length: %d", m_value.getValue().length()); + notify(false); + log_v("<< indicate"); +} // indicate - // ESP_GATTS_READ_EVT - A request to read the value of a characteristic has arrived. - // - // read: - // - uint16_t conn_id - // - uint32_t trans_id - // - esp_bd_addr_t bda - // - uint16_t handle - // - uint16_t offset - // - bool is_long - // - bool need_rsp - // - case ESP_GATTS_READ_EVT: - { - if (param->read.handle == m_handle) { - - // Here's an interesting thing. The read request has the option of saying whether we need a response - // or not. What would it "mean" to receive a read request and NOT send a response back? That feels like - // a very strange read. - // - // We have to handle the case where the data we wish to send back to the client is greater than the maximum - // packet size of 22 bytes. In this case, we become responsible for chunking the data into units of 22 bytes. - // The apparent algorithm is as follows: - // - // If the is_long flag is set then this is a follow on from an original read and we will already have sent at least 22 bytes. - // If the is_long flag is not set then we need to check how much data we are going to send. If we are sending LESS than - // 22 bytes, then we "just" send it and that's the end of the story. - // If we are sending 22 bytes exactly, we just send it BUT we will get a follow on request. - // If we are sending more than 22 bytes, we send the first 22 bytes and we will get a follow on request. - // Because of follow on request processing, we need to maintain an offset of how much data we have already sent - // so that when a follow on request arrives, we know where to start in the data to send the next sequence. - // Note that the indication that the client will send a follow on request is that we sent exactly 22 bytes as a response. - // If our payload is divisible by 22 then the last response will be a response of 0 bytes in length. - // - // The following code has deliberately not been factored to make it fewer statements because this would cloud the - // the logic flow comprehension. - // - - // get mtu for peer device that we are sending read request to - uint16_t maxOffset = getService()->getServer()->getPeerMTU(param->read.conn_id) - 1; - log_d("mtu value: %d", maxOffset); - if (param->read.need_rsp) { - log_d("Sending a response (esp_ble_gatts_send_response)"); - esp_gatt_rsp_t rsp; - - if (param->read.is_long) { - String value = m_value.getValue(); - - if (value.length() - m_value.getReadOffset() < maxOffset) { - // This is the last in the chain - rsp.attr_value.len = value.length() - m_value.getReadOffset(); - rsp.attr_value.offset = m_value.getReadOffset(); - memcpy(rsp.attr_value.value, value.c_str() + rsp.attr_value.offset, rsp.attr_value.len); - m_value.setReadOffset(0); - } else { - // There will be more to come. - rsp.attr_value.len = maxOffset; - rsp.attr_value.offset = m_value.getReadOffset(); - memcpy(rsp.attr_value.value, value.c_str() + rsp.attr_value.offset, rsp.attr_value.len); - m_value.setReadOffset(rsp.attr_value.offset + maxOffset); - } - } else { // read.is_long == false - - // If is.long is false then this is the first (or only) request to read data, so invoke the callback - // Invoke the read callback. - m_pCallbacks->onRead(this, param); - - String value = m_value.getValue(); - - if (value.length() + 1 > maxOffset) { - // Too big for a single shot entry. - m_value.setReadOffset(maxOffset); - rsp.attr_value.len = maxOffset; - rsp.attr_value.offset = 0; - memcpy(rsp.attr_value.value, value.c_str(), rsp.attr_value.len); - } else { - // Will fit in a single packet with no callbacks required. - rsp.attr_value.len = value.length(); - rsp.attr_value.offset = 0; - memcpy(rsp.attr_value.value, value.c_str(), rsp.attr_value.len); - } - } - 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) { - log_e("esp_ble_gatts_send_response: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - } - } // Response needed - } // Handle matches this characteristic. - break; - } // ESP_GATTS_READ_EVT - - // ESP_GATTS_CONF_EVT - // - // conf: - // - esp_gatt_status_t status – The status code. - // - uint16_t conn_id – The connection used. - // - case ESP_GATTS_CONF_EVT: - { - // log_d("m_handle = %d, conf->handle = %d", m_handle, param->conf.handle); - if (param->conf.conn_id - == getService()->getServer()->getConnId()) { // && param->conf.handle == m_handle) // bug in esp-idf and not implemented in arduino yet - m_semaphoreConfEvt.give(param->conf.status); - } - break; - } - - case ESP_GATTS_CONNECT_EVT: - { - break; - } - - case ESP_GATTS_DISCONNECT_EVT: - { - m_semaphoreConfEvt.give(); - break; - } - - default: - { - break; - } // default - - } // switch event - - // Give each of the descriptors associated with this characteristic the opportunity to handle the - // event. - - m_descriptorMap.handleGATTServerEvent(event, gatts_if, param); - log_v("<< handleGATTServerEvent"); -} // handleGATTServerEvent - -/** - * @brief Send an indication. - * An indication is a transmission of up to the first 20 bytes of the characteristic value. An indication - * will block waiting a positive confirmation from the client. - * @return N/A - */ -void BLECharacteristic::indicate() { - - log_v(">> indicate: length: %d", m_value.getValue().length()); - notify(false); - log_v("<< indicate"); -} // indicate - -/** - * @brief Send a notify. - * A notification is a transmission of up to the first 20 bytes of the characteristic value. An notification - * will not block; it is a fire and forget. - * @return N/A. - */ -void BLECharacteristic::notify(bool is_notification) { - log_v(">> notify: length: %d", m_value.getValue().length()); - - assert(getService() != nullptr); - assert(getService()->getServer() != nullptr); - - 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."); - m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_NO_CLIENT, 0); - return; - } - - // Test to see if we have a 0x2902 descriptor. If we do, then check to see if notification is enabled - // and, if not, prevent the notification. - - BLE2902 *p2902 = (BLE2902 *)getDescriptorByUUID((uint16_t)0x2902); - if (is_notification) { - if (p2902 != nullptr && !p2902->getNotifications()) { - log_v("<< notifications disabled; ignoring"); - m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_NOTIFY_DISABLED, 0); // Invoke the notify callback. - return; - } - } else { - if (p2902 != nullptr && !p2902->getIndications()) { - log_v("<< indications disabled; ignoring"); - m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_INDICATE_DISABLED, 0); // Invoke the notify callback. - return; - } - } - for (auto &myPair : getService()->getServer()->getPeerDevices(false)) { - uint16_t _mtu = (myPair.second.mtu); - if (m_value.getValue().length() > _mtu - 3) { - log_w("- Truncating to %d bytes (maximum notify size)", _mtu - 3); - } - - size_t length = m_value.getValue().length(); - if (!is_notification) { // is indication - m_semaphoreConfEvt.take("indicate"); - } - esp_err_t errRc = ::esp_ble_gatts_send_indicate( - getService()->getServer()->getGattsIf(), myPair.first, getHandle(), length, (uint8_t *)m_value.getValue().c_str(), !is_notification - ); // The need_confirm = false makes this a notify. - if (errRc != ESP_OK) { - log_e("<< esp_ble_gatts_send_ %s: rc=%d %s", is_notification ? "notify" : "indicate", errRc, GeneralUtils::errorToString(errRc)); - m_semaphoreConfEvt.give(); - m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_GATT, errRc); // Invoke the notify callback. - return; - } - if (!is_notification) { // is indication - if (!m_semaphoreConfEvt.timedWait("indicate", indicationTimeout)) { - m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_INDICATE_TIMEOUT, 0); // Invoke the notify callback. - } else { - auto code = (esp_gatt_status_t)m_semaphoreConfEvt.value(); - if (code == ESP_GATT_OK) { - m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::SUCCESS_INDICATE, code); // Invoke the notify callback. - } else { - m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_INDICATE_FAILURE, code); - } - } - } else { - m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::SUCCESS_NOTIFY, 0); // Invoke the notify callback. - } - } - log_v("<< notify"); -} // Notify - -/** - * @brief Set the permission to broadcast. - * A characteristics has properties associated with it which define what it is capable of doing. - * One of these is the broadcast flag. - * @param [in] value The flag value of the property. - * @return N/A - */ -void BLECharacteristic::setBroadcastProperty(bool value) { - //log_d("setBroadcastProperty(%d)", value); - if (value) { - m_properties = (esp_gatt_char_prop_t)(m_properties | ESP_GATT_CHAR_PROP_BIT_BROADCAST); - } else { - m_properties = (esp_gatt_char_prop_t)(m_properties & ~ESP_GATT_CHAR_PROP_BIT_BROADCAST); - } -} // setBroadcastProperty +/** + * @brief Set the permission to broadcast. + * A characteristics has properties associated with it which define what it is capable of doing. + * One of these is the broadcast flag. + * @param [in] value The flag value of the property. + * @return N/A + */ +void BLECharacteristic::setBroadcastProperty(bool value) { + //log_d("setBroadcastProperty(%d)", value); + if (value) { + m_properties = (esp_gatt_char_prop_t)(m_properties | ESP_GATT_CHAR_PROP_BIT_BROADCAST); + } else { + m_properties = (esp_gatt_char_prop_t)(m_properties & ~ESP_GATT_CHAR_PROP_BIT_BROADCAST); + } +} // setBroadcastProperty /** * @brief Set the callback handlers for this characteristic. @@ -595,9 +291,15 @@ void BLECharacteristic::setCallbacks(BLECharacteristicCallbacks *pCallbacks) { * @param [in] handle The handle associated with this characteristic. */ void BLECharacteristic::setHandle(uint16_t handle) { +#if defined(CONFIG_BLUEDROID_ENABLED) log_v(">> setHandle: handle=0x%.2x, characteristic uuid=%s", handle, getUUID().toString().c_str()); m_handle = handle; log_v("<< setHandle"); +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + log_w("NimBLE does not support manually setting the handle of a characteristic. Ignoring request."); +#endif } // setHandle /** @@ -767,19 +469,12 @@ String BLECharacteristic::toString() { BLECharacteristicCallbacks::~BLECharacteristicCallbacks() {} -void BLECharacteristicCallbacks::onRead(BLECharacteristic *pCharacteristic, esp_ble_gatts_cb_param_t *param) { - onRead(pCharacteristic); -} // onRead - +// Common callbacks void BLECharacteristicCallbacks::onRead(BLECharacteristic *pCharacteristic) { log_d(">> onRead: default"); log_d("<< onRead"); } // onRead -void BLECharacteristicCallbacks::onWrite(BLECharacteristic *pCharacteristic, esp_ble_gatts_cb_param_t *param) { - onWrite(pCharacteristic); -} // onWrite - void BLECharacteristicCallbacks::onWrite(BLECharacteristic *pCharacteristic) { log_d(">> onWrite: default"); log_d("<< onWrite"); @@ -795,5 +490,650 @@ void BLECharacteristicCallbacks::onStatus(BLECharacteristic *pCharacteristic, St log_d("<< onStatus"); } // onStatus -#endif /* CONFIG_BLUEDROID_ENABLED */ +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + +/** + * Handle a GATT server event. + */ +void BLECharacteristic::handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { + log_v(">> handleGATTServerEvent: %s", BLEUtils::gattServerEventTypeToString(event).c_str()); + + switch (event) { + // Events handled: + // + // ESP_GATTS_ADD_CHAR_EVT + // ESP_GATTS_CONF_EVT + // ESP_GATTS_CONNECT_EVT + // ESP_GATTS_DISCONNECT_EVT + // ESP_GATTS_EXEC_WRITE_EVT + // ESP_GATTS_READ_EVT + // ESP_GATTS_WRITE_EVT + + // + // ESP_GATTS_EXEC_WRITE_EVT + // When we receive this event it is an indication that a previous write long needs to be committed. + // + // exec_write: + // - uint16_t conn_id + // - uint32_t trans_id + // - esp_bd_addr_t bda + // - uint8_t exec_write_flag - Either ESP_GATT_PREP_WRITE_EXEC or ESP_GATT_PREP_WRITE_CANCEL + // + case ESP_GATTS_EXEC_WRITE_EVT: + { + if (m_writeEvt) { + m_writeEvt = false; + if (param->exec_write.exec_write_flag == ESP_GATT_PREP_WRITE_EXEC) { + m_value.commit(); + // Invoke the onWrite callback handler. + m_pCallbacks->onWrite(this, param); + } else { + m_value.cancel(); + } + // ??? + esp_err_t errRc = ::esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, nullptr); + if (errRc != ESP_OK) { + log_e("esp_ble_gatts_send_response: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + } + } + break; + } // ESP_GATTS_EXEC_WRITE_EVT + + // ESP_GATTS_ADD_CHAR_EVT - Indicate that a characteristic was added to the service. + // add_char: + // - esp_gatt_status_t status + // - uint16_t attr_handle + // - uint16_t service_handle + // - esp_bt_uuid_t char_uuid + case ESP_GATTS_ADD_CHAR_EVT: + { + if (getHandle() == param->add_char.attr_handle) { + // we have created characteristic, now we can create descriptors + // BLEDescriptor* pDescriptor = m_descriptorMap.getFirst(); + // while (pDescriptor != nullptr) { + // pDescriptor->executeCreate(this); + // pDescriptor = m_descriptorMap.getNext(); + // } // End while + m_semaphoreCreateEvt.give(); + } + break; + } // ESP_GATTS_ADD_CHAR_EVT + + // ESP_GATTS_WRITE_EVT - A request to write the value of a characteristic has arrived. + // + // write: + // - uint16_t conn_id + // - uint16_t trans_id + // - esp_bd_addr_t bda + // - uint16_t handle + // - uint16_t offset + // - bool need_rsp + // - bool is_prep + // - uint16_t len + // - uint8_t *value + // + case ESP_GATTS_WRITE_EVT: + { + // We check if this write request is for us by comparing the handles in the event. If it is for us + // we save the new value. Next we look at the need_rsp flag which indicates whether or not we need + // to send a response. If we do, then we formulate a response and send it. + if (param->write.handle == m_handle) { + if (param->write.is_prep) { + m_value.addPart(param->write.value, param->write.len); + m_writeEvt = true; + } else { + setValue(param->write.value, param->write.len); + } + + 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; + + rsp.attr_value.len = param->write.len; + rsp.attr_value.handle = m_handle; + rsp.attr_value.offset = param->write.offset; + rsp.attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE; + memcpy(rsp.attr_value.value, param->write.value, param->write.len); + + esp_err_t errRc = ::esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, &rsp); + if (errRc != ESP_OK) { + log_e("esp_ble_gatts_send_response: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + } + } // Response needed + + if (param->write.is_prep != true) { + // Invoke the onWrite callback handler. + m_pCallbacks->onWrite(this, param); + } + } // Match on handles. + break; + } // ESP_GATTS_WRITE_EVT + + // ESP_GATTS_READ_EVT - A request to read the value of a characteristic has arrived. + // + // read: + // - uint16_t conn_id + // - uint32_t trans_id + // - esp_bd_addr_t bda + // - uint16_t handle + // - uint16_t offset + // - bool is_long + // - bool need_rsp + // + case ESP_GATTS_READ_EVT: + { + if (param->read.handle == m_handle) { + + // Here's an interesting thing. The read request has the option of saying whether we need a response + // or not. What would it "mean" to receive a read request and NOT send a response back? That feels like + // a very strange read. + // + // We have to handle the case where the data we wish to send back to the client is greater than the maximum + // packet size of 22 bytes. In this case, we become responsible for chunking the data into units of 22 bytes. + // The apparent algorithm is as follows: + // + // If the is_long flag is set then this is a follow on from an original read and we will already have sent at least 22 bytes. + // If the is_long flag is not set then we need to check how much data we are going to send. If we are sending LESS than + // 22 bytes, then we "just" send it and that's the end of the story. + // If we are sending 22 bytes exactly, we just send it BUT we will get a follow on request. + // If we are sending more than 22 bytes, we send the first 22 bytes and we will get a follow on request. + // Because of follow on request processing, we need to maintain an offset of how much data we have already sent + // so that when a follow on request arrives, we know where to start in the data to send the next sequence. + // Note that the indication that the client will send a follow on request is that we sent exactly 22 bytes as a response. + // If our payload is divisible by 22 then the last response will be a response of 0 bytes in length. + // + // The following code has deliberately not been factored to make it fewer statements because this would cloud the + // the logic flow comprehension. + // + + // get mtu for peer device that we are sending read request to + uint16_t maxOffset = getService()->getServer()->getPeerMTU(param->read.conn_id) - 1; + log_d("mtu value: %d", maxOffset); + if (param->read.need_rsp) { + log_d("Sending a response (esp_ble_gatts_send_response)"); + esp_gatt_rsp_t rsp; + + if (param->read.is_long) { + String value = m_value.getValue(); + + if (value.length() - m_value.getReadOffset() < maxOffset) { + // This is the last in the chain + rsp.attr_value.len = value.length() - m_value.getReadOffset(); + rsp.attr_value.offset = m_value.getReadOffset(); + memcpy(rsp.attr_value.value, value.c_str() + rsp.attr_value.offset, rsp.attr_value.len); + m_value.setReadOffset(0); + } else { + // There will be more to come. + rsp.attr_value.len = maxOffset; + rsp.attr_value.offset = m_value.getReadOffset(); + memcpy(rsp.attr_value.value, value.c_str() + rsp.attr_value.offset, rsp.attr_value.len); + m_value.setReadOffset(rsp.attr_value.offset + maxOffset); + } + } else { // read.is_long == false + + // If is.long is false then this is the first (or only) request to read data, so invoke the callback + // Invoke the read callback. + m_pCallbacks->onRead(this, param); + + String value = m_value.getValue(); + + if (value.length() + 1 > maxOffset) { + // Too big for a single shot entry. + m_value.setReadOffset(maxOffset); + rsp.attr_value.len = maxOffset; + rsp.attr_value.offset = 0; + memcpy(rsp.attr_value.value, value.c_str(), rsp.attr_value.len); + } else { + // Will fit in a single packet with no callbacks required. + rsp.attr_value.len = value.length(); + rsp.attr_value.offset = 0; + memcpy(rsp.attr_value.value, value.c_str(), rsp.attr_value.len); + } + } + 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) { + log_e("esp_ble_gatts_send_response: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + } + } // Response needed + } // Handle matches this characteristic. + break; + } // ESP_GATTS_READ_EVT + + // ESP_GATTS_CONF_EVT + // + // conf: + // - esp_gatt_status_t status – The status code. + // - uint16_t conn_id – The connection used. + // + case ESP_GATTS_CONF_EVT: + { + // log_d("m_handle = %d, conf->handle = %d", m_handle, param->conf.handle); + if (param->conf.conn_id + == getService()->getServer()->getConnId()) { // && param->conf.handle == m_handle) // bug in esp-idf and not implemented in arduino yet + m_semaphoreConfEvt.give(param->conf.status); + } + break; + } + + case ESP_GATTS_CONNECT_EVT: + { + break; + } + + case ESP_GATTS_DISCONNECT_EVT: + { + m_semaphoreConfEvt.give(); + break; + } + + default: + { + break; + } // default + + } // switch event + + // Give each of the descriptors associated with this characteristic the opportunity to handle the + // event. + + m_descriptorMap.handleGATTServerEvent(event, gatts_if, param); + log_v("<< handleGATTServerEvent"); +} // handleGATTServerEvent + +/** + * @brief Send a notify. + * A notification is a transmission of up to the first 20 bytes of the characteristic value. An notification + * will not block; it is a fire and forget. + * @return N/A. + */ +void BLECharacteristic::notify(bool is_notification) { + log_v(">> notify: length: %d", m_value.getValue().length()); + + assert(getService() != nullptr); + assert(getService()->getServer() != nullptr); + + 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."); + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_NO_CLIENT, 0); + return; + } + + // Test to see if we have a 0x2902 descriptor. If we do, then check to see if notification is enabled + // and, if not, prevent the notification. + + BLE2902 *p2902 = (BLE2902 *)getDescriptorByUUID((uint16_t)0x2902); + if (is_notification) { + if (p2902 != nullptr && !p2902->getNotifications()) { + log_v("<< notifications disabled; ignoring"); + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_NOTIFY_DISABLED, 0); // Invoke the notify callback. + return; + } + } else { + if (p2902 != nullptr && !p2902->getIndications()) { + log_v("<< indications disabled; ignoring"); + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_INDICATE_DISABLED, 0); // Invoke the notify callback. + return; + } + } + for (auto &myPair : getService()->getServer()->getPeerDevices(false)) { + uint16_t _mtu = (myPair.second.mtu); + if (m_value.getValue().length() > _mtu - 3) { + log_w("- Truncating to %d bytes (maximum notify size)", _mtu - 3); + } + + size_t length = m_value.getValue().length(); + if (!is_notification) { // is indication + m_semaphoreConfEvt.take("indicate"); + } + esp_err_t errRc = ::esp_ble_gatts_send_indicate( + getService()->getServer()->getGattsIf(), myPair.first, getHandle(), length, (uint8_t *)m_value.getValue().c_str(), !is_notification + ); // The need_confirm = false makes this a notify. + if (errRc != ESP_OK) { + log_e("<< esp_ble_gatts_send_ %s: rc=%d %s", is_notification ? "notify" : "indicate", errRc, GeneralUtils::errorToString(errRc)); + m_semaphoreConfEvt.give(); + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_GATT, errRc); // Invoke the notify callback. + return; + } + if (!is_notification) { // is indication + if (!m_semaphoreConfEvt.timedWait("indicate", indicationTimeout)) { + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_INDICATE_TIMEOUT, 0); // Invoke the notify callback. + } else { + auto code = (esp_gatt_status_t)m_semaphoreConfEvt.value(); + if (code == ESP_GATT_OK) { + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::SUCCESS_INDICATE, code); // Invoke the notify callback. + } else { + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_INDICATE_FAILURE, code); + } + } + } else { + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::SUCCESS_NOTIFY, 0); // Invoke the notify callback. + } + } + log_v("<< notify"); +} // Notify + +void BLECharacteristicCallbacks::onRead(BLECharacteristic *pCharacteristic, esp_ble_gatts_cb_param_t *param) { + onRead(pCharacteristic); +} // onRead + +void BLECharacteristicCallbacks::onWrite(BLECharacteristic *pCharacteristic, esp_ble_gatts_cb_param_t *param) { + onWrite(pCharacteristic); +} // onWrite + +#endif /* CONFIG_BLUEDROID_ENABLED */ + +/*************************************************************************** + * NimBLE functions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + +int BLECharacteristic::handleGATTServerEvent(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { + const ble_uuid_t *uuid; + int rc; + struct ble_gap_conn_desc desc; + BLECharacteristic *pCharacteristic = (BLECharacteristic *)arg; + + log_d("Characteristic %s %s event", pCharacteristic->getUUID().toString().c_str(), ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR ? "Read" : "Write"); + + uuid = ctxt->chr->uuid; + if (ble_uuid_cmp(uuid, &pCharacteristic->getUUID().getNative()->u) == 0) { + switch (ctxt->op) { + case BLE_GATT_ACCESS_OP_READ_CHR: + { + // If the packet header is only 8 bytes this is a follow up of a long read + // so we don't want to call the onRead() callback again. + if (ctxt->om->om_pkthdr_len > 8) { + rc = ble_gap_conn_find(conn_handle, &desc); + assert(rc == 0); + pCharacteristic->m_pCallbacks->onRead(pCharacteristic); + pCharacteristic->m_pCallbacks->onRead(pCharacteristic, &desc); + } + + portENTER_CRITICAL(&pCharacteristic->m_readMux); + rc = os_mbuf_append(ctxt->om, (uint8_t *)pCharacteristic->m_value.getValue().c_str(), pCharacteristic->m_value.getValue().length()); + portEXIT_CRITICAL(&pCharacteristic->m_readMux); + + return rc == 0 ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES; + } + + case BLE_GATT_ACCESS_OP_WRITE_CHR: + { + if (ctxt->om->om_len > BLE_ATT_ATTR_MAX_LEN) { + return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN; + } + + uint8_t buf[BLE_ATT_ATTR_MAX_LEN]; + size_t len = ctxt->om->om_len; + memcpy(buf, ctxt->om->om_data, len); + + os_mbuf *next; + next = SLIST_NEXT(ctxt->om, om_next); + while (next != NULL) { + if ((len + next->om_len) > BLE_ATT_ATTR_MAX_LEN) { + return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN; + } + memcpy(&buf[len], next->om_data, next->om_len); + len += next->om_len; + next = SLIST_NEXT(next, om_next); + } + rc = ble_gap_conn_find(conn_handle, &desc); + assert(rc == 0); + pCharacteristic->setValue(buf, len); + pCharacteristic->m_pCallbacks->onWrite(pCharacteristic); + pCharacteristic->m_pCallbacks->onWrite(pCharacteristic, &desc); + + return 0; + } + + default: break; + } + } + + return BLE_ATT_ERR_UNLIKELY; + + //m_descriptorMap.handleGATTServerEvent(conn_handle, attr_handle, ctxt, arg); +} + +/** + * @brief Set the subscribe status for this characteristic.\n + * This will maintain a vector of subscribed clients and their indicate/notify status. + */ +void BLECharacteristic::setSubscribe(struct ble_gap_event *event) { + ble_gap_conn_desc desc; + if (ble_gap_conn_find(event->subscribe.conn_handle, &desc) != 0) { + return; + } + + uint16_t subVal = 0; + if (event->subscribe.cur_notify > 0 && (m_properties & BLECharacteristic::PROPERTY_NOTIFY)) { + subVal |= NIMBLE_SUB_NOTIFY; + } + if (event->subscribe.cur_indicate && (m_properties & BLECharacteristic::PROPERTY_INDICATE)) { + subVal |= NIMBLE_SUB_INDICATE; + } + + log_i("New subscribe value for conn: %d val: %d", event->subscribe.conn_handle, subVal); + + if (!event->subscribe.cur_indicate && event->subscribe.prev_indicate) { + BLEDevice::getServer()->clearIndicateWait(event->subscribe.conn_handle); + } + + auto it = m_subscribedVec.begin(); + for (; it != m_subscribedVec.end(); ++it) { + if ((*it).first == event->subscribe.conn_handle) { + break; + } + } + + if (subVal > 0) { + if (it == m_subscribedVec.end()) { + m_subscribedVec.push_back({event->subscribe.conn_handle, subVal}); + } else { + (*it).second = subVal; + } + } else if (it != m_subscribedVec.end()) { + m_subscribedVec.erase(it); + } + + m_pCallbacks->onSubscribe(this, &desc, subVal); +} + +/** + * @brief Send a notify. + * A notification is a transmission of up to the first 20 bytes of the characteristic value. An notification + * will not block; it is a fire and forget. + * @return N/A. + */ +void BLECharacteristic::notify(bool is_notification) { + log_v(">> notify: length: %d", m_value.getValue().length()); + + assert(getService() != nullptr); + assert(getService()->getServer() != nullptr); + + int rc = 0; + 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."); + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_NO_CLIENT, 0); + return; + } + + if (m_subscribedVec.size() == 0) { + log_v("<< notify: No clients subscribed."); + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_NO_SUBSCRIBER, 0); + return; + } + + if (is_notification) { + if (!(m_properties & BLECharacteristic::PROPERTY_NOTIFY)) { + log_v("<< notifications disabled; ignoring"); + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_NOTIFY_DISABLED, 0); // Invoke the notify callback. + return; + } + } else { + if (!(m_properties & BLECharacteristic::PROPERTY_INDICATE)) { + log_v("<< indications disabled; ignoring"); + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_INDICATE_DISABLED, 0); // Invoke the notify callback. + return; + } + } + + bool reqSec = (m_properties & BLE_GATT_CHR_F_READ_AUTHEN) || (m_properties & BLE_GATT_CHR_F_READ_AUTHOR) || (m_properties & BLE_GATT_CHR_F_READ_ENC); + + for (auto &myPair : m_subscribedVec) { + uint16_t _mtu = getService()->getServer()->getPeerMTU(myPair.first); + + // check if connected and subscribed + if (_mtu == 0 || myPair.second == 0) { + continue; + } + + if (reqSec) { + struct ble_gap_conn_desc desc; + rc = ble_gap_conn_find(myPair.first, &desc); + if (rc != 0 || !desc.sec_state.encrypted) { + continue; + } + } + + String value = getValue(); + size_t length = value.length(); + + if (length > _mtu - 3) { + log_w("- Truncating to %d bytes (maximum notify size)", _mtu - 3); + } + + if (is_notification && (!(myPair.second & NIMBLE_SUB_NOTIFY))) { + log_w("Sending notification to client subscribed to indications, sending indication instead"); + is_notification = false; + } + + if (!is_notification && (!(myPair.second & NIMBLE_SUB_INDICATE))) { + log_w("Sending indication to client subscribed to notification, sending notification instead"); + is_notification = true; + } + + if (!is_notification) { // is indication + m_semaphoreConfEvt.take("indicate"); + } + + // don't create the m_buf until we are sure to send the data or else + // we could be allocating a buffer that doesn't get released. + // We also must create it in each loop iteration because it is consumed with each host call. + os_mbuf *om = ble_hs_mbuf_from_flat((uint8_t *)value.c_str(), length); + + if (!is_notification && (m_properties & BLECharacteristic::PROPERTY_INDICATE)) { + if (!BLEDevice::getServer()->setIndicateWait(myPair.first)) { + log_e("prior Indication in progress"); + os_mbuf_free_chain(om); + return; + } + + rc = ble_gatts_indicate_custom(myPair.first, m_handle, om); + if (rc != 0) { + BLEDevice::getServer()->clearIndicateWait(myPair.first); + } + } else { + rc = ble_gatts_notify_custom(myPair.first, m_handle, om); + } + + if (rc != 0) { + log_e("<< ble_gatts_%s_custom: rc=%d %s", is_notification ? "notify" : "indicate", rc, GeneralUtils::errorToString(rc)); + m_semaphoreConfEvt.give(); + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_GATT, rc); // Invoke the notify callback. + return; + } + + if (!is_notification) { // is indication + if (!m_semaphoreConfEvt.timedWait("indicate", indicationTimeout)) { + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_INDICATE_TIMEOUT, 0); // Invoke the notify callback. + } else { + auto code = m_semaphoreConfEvt.value(); + if (code == ESP_OK) { + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::SUCCESS_INDICATE, code); // Invoke the notify callback. + } else { + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::ERROR_INDICATE_FAILURE, code); + } + } + } else { + m_pCallbacks->onStatus(this, BLECharacteristicCallbacks::Status::SUCCESS_NOTIFY, 0); // Invoke the notify callback. + } + } + log_v("<< notify"); +} // Notify + +void BLECharacteristicCallbacks::onRead(BLECharacteristic *pCharacteristic, ble_gap_conn_desc *desc) { + onRead(pCharacteristic); +} // onRead + +void BLECharacteristicCallbacks::onWrite(BLECharacteristic *pCharacteristic, ble_gap_conn_desc *desc) { + onWrite(pCharacteristic); +} // onWrite + +void BLECharacteristicCallbacks::onSubscribe(BLECharacteristic *pCharacteristic, ble_gap_conn_desc *desc, uint16_t subValue) { + log_d(">> onSubscribe: default"); + log_d("<< onSubscribe"); +} // onSubscribe + +#endif /* CONFIG_NIMBLE_ENABLED */ + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLECharacteristic.h b/libraries/BLE/src/BLECharacteristic.h index 29f105868fd..27df5a30c3e 100644 --- a/libraries/BLE/src/BLECharacteristic.h +++ b/libraries/BLE/src/BLECharacteristic.h @@ -3,6 +3,10 @@ * * Created on: Jun 22, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLECHARACTERISTIC_H_ @@ -11,15 +15,59 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + #include #include #include "BLEUUID.h" -#include -#include #include "BLEDescriptor.h" #include "BLEValue.h" #include "RTOS.h" +#include "BLEUtils.h" + +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#include +#endif + +/*************************************************************************** + * NimBLE includes and definitions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#include +#include +#include "BLEConnInfo.h" +#define ESP_GATT_MAX_ATTR_LEN BLE_ATT_ATTR_MAX_LEN +#define ESP_GATT_CHAR_PROP_BIT_READ BLE_GATT_CHR_PROP_READ +#define ESP_GATT_CHAR_PROP_BIT_WRITE BLE_GATT_CHR_PROP_WRITE +#define ESP_GATT_CHAR_PROP_BIT_WRITE_NR BLE_GATT_CHR_PROP_WRITE_NO_RSP +#define ESP_GATT_CHAR_PROP_BIT_BROADCAST BLE_GATT_CHR_PROP_BROADCAST +#define ESP_GATT_CHAR_PROP_BIT_NOTIFY BLE_GATT_CHR_PROP_NOTIFY +#define ESP_GATT_CHAR_PROP_BIT_INDICATE BLE_GATT_CHR_PROP_INDICATE +#endif + +/*************************************************************************** + * NimBLE types * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +typedef uint16_t esp_gatt_char_prop_t; +typedef uint8_t esp_gatt_perm_t; +#endif + +/*************************************************************************** + * Forward declarations * + ***************************************************************************/ class BLEService; class BLEDescriptor; @@ -30,6 +78,10 @@ class BLECharacteristicCallbacks; */ class BLEDescriptorMap { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + void setByUUID(const char *uuid, BLEDescriptor *pDescriptor); void setByUUID(BLEUUID uuid, BLEDescriptor *pDescriptor); void setByHandle(uint16_t handle, BLEDescriptor *pDescriptor); @@ -37,11 +89,32 @@ class BLEDescriptorMap { BLEDescriptor *getByUUID(BLEUUID uuid); BLEDescriptor *getByHandle(uint16_t handle); String toString(); - void handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); BLEDescriptor *getFirst(); BLEDescriptor *getNext(); + int getRegisteredDescriptorCount(); + void removeDescriptor(BLEDescriptor *pDescriptor); + + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + void handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + void handleGATTServerEvent(uint16_t conn_handle, uint16_t attr_handle, ble_gatt_access_ctxt *ctxt, void *arg); +#endif private: + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + std::map m_uuidMap; std::map m_handleMap; std::map::iterator m_iterator; @@ -55,6 +128,48 @@ class BLEDescriptorMap { */ class BLECharacteristic { public: + /*************************************************************************** + * Common properties * + ***************************************************************************/ + + static const uint32_t indicationTimeout = 1000; + + /*************************************************************************** + * Bluedroid public properties * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + static const uint32_t PROPERTY_READ = 1 << 0; + static const uint32_t PROPERTY_WRITE = 1 << 1; + static const uint32_t PROPERTY_NOTIFY = 1 << 2; + static const uint32_t PROPERTY_BROADCAST = 1 << 3; + static const uint32_t PROPERTY_INDICATE = 1 << 4; + static const uint32_t PROPERTY_WRITE_NR = 1 << 5; +#endif + + /*************************************************************************** + * NimBLE public properties * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + static const uint32_t PROPERTY_READ = BLE_GATT_CHR_F_READ; + static const uint32_t PROPERTY_READ_ENC = BLE_GATT_CHR_F_READ_ENC; + static const uint32_t PROPERTY_READ_AUTHEN = BLE_GATT_CHR_F_READ_AUTHEN; + static const uint32_t PROPERTY_READ_AUTHOR = BLE_GATT_CHR_F_READ_AUTHOR; + static const uint32_t PROPERTY_WRITE = BLE_GATT_CHR_F_WRITE; + static const uint32_t PROPERTY_WRITE_NR = BLE_GATT_CHR_F_WRITE_NO_RSP; + static const uint32_t PROPERTY_WRITE_ENC = BLE_GATT_CHR_F_WRITE_ENC; + static const uint32_t PROPERTY_WRITE_AUTHEN = BLE_GATT_CHR_F_WRITE_AUTHEN; + static const uint32_t PROPERTY_WRITE_AUTHOR = BLE_GATT_CHR_F_WRITE_AUTHOR; + static const uint32_t PROPERTY_BROADCAST = BLE_GATT_CHR_F_BROADCAST; + static const uint32_t PROPERTY_NOTIFY = BLE_GATT_CHR_F_NOTIFY; + static const uint32_t PROPERTY_INDICATE = BLE_GATT_CHR_F_INDICATE; +#endif + + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + BLECharacteristic(const char *uuid, uint32_t properties = 0); BLECharacteristic(BLEUUID uuid, uint32_t properties = 0); virtual ~BLECharacteristic(); @@ -66,14 +181,9 @@ class BLECharacteristic { String getValue(); uint8_t *getData(); size_t getLength(); - void indicate(); void notify(bool is_notification = true); - void setBroadcastProperty(bool value); void setCallbacks(BLECharacteristicCallbacks *pCallbacks); - void setIndicateProperty(bool value); - void setNotifyProperty(bool value); - void setReadProperty(bool value); void setValue(uint8_t *data, size_t size); void setValue(String value); void setValue(uint16_t &data16); @@ -81,20 +191,16 @@ class BLECharacteristic { void setValue(int &data32); void setValue(float &data32); void setValue(double &data64); - void setWriteProperty(bool value); - void setWriteNoResponseProperty(bool value); String toString(); uint16_t getHandle(); - void setAccessPermissions(esp_gatt_perm_t perm); - - static const uint32_t PROPERTY_READ = 1 << 0; - static const uint32_t PROPERTY_WRITE = 1 << 1; - static const uint32_t PROPERTY_NOTIFY = 1 << 2; - static const uint32_t PROPERTY_BROADCAST = 1 << 3; - static const uint32_t PROPERTY_INDICATE = 1 << 4; - static const uint32_t PROPERTY_WRITE_NR = 1 << 5; - - static const uint32_t indicationTimeout = 1000; + void setAccessPermissions(uint8_t perm); + esp_gatt_char_prop_t getProperties(); + void setReadProperty(bool value); + void setWriteProperty(bool value); + void setNotifyProperty(bool value); + void setBroadcastProperty(bool value); + void setIndicateProperty(bool value); + void setWriteNoResponseProperty(bool value); private: friend class BLEServer; @@ -102,6 +208,10 @@ class BLECharacteristic { friend class BLEDescriptor; friend class BLECharacteristicMap; + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + BLEUUID m_bleUUID; BLEDescriptorMap m_descriptorMap; uint16_t m_handle; @@ -109,18 +219,53 @@ class BLECharacteristic { BLECharacteristicCallbacks *m_pCallbacks; BLEService *m_pService; BLEValue m_value; + bool m_writeEvt = false; + FreeRTOS::Semaphore m_semaphoreConfEvt = FreeRTOS::Semaphore("ConfEvt"); + FreeRTOS::Semaphore m_semaphoreSetValue = FreeRTOS::Semaphore("SetValue"); + + /*************************************************************************** + * Bluedroid private properties * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + FreeRTOS::Semaphore m_semaphoreCreateEvt = FreeRTOS::Semaphore("CreateEvt"); esp_gatt_perm_t m_permissions = ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE; - bool m_writeEvt = false; // If we have started a long write, this tells the commit code that we were the target +#endif - void handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); + /*************************************************************************** + * NimBLE private properties * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + portMUX_TYPE m_readMux; + uint8_t m_removed; + std::vector> m_subscribedVec; +#endif + + /*************************************************************************** + * Common private declarations * + ***************************************************************************/ void executeCreate(BLEService *pService); - esp_gatt_char_prop_t getProperties(); BLEService *getService(); void setHandle(uint16_t handle); - FreeRTOS::Semaphore m_semaphoreCreateEvt = FreeRTOS::Semaphore("CreateEvt"); - FreeRTOS::Semaphore m_semaphoreConfEvt = FreeRTOS::Semaphore("ConfEvt"); - FreeRTOS::Semaphore m_semaphoreSetValue = FreeRTOS::Semaphore("SetValue"); + + /*************************************************************************** + * Bluedroid private declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + void handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); +#endif + + /*************************************************************************** + * NimBLE private declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + void setSubscribe(struct ble_gap_event *event); + static int handleGATTServerEvent(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg); +#endif }; // BLECharacteristic /** @@ -132,6 +277,10 @@ class BLECharacteristic { */ class BLECharacteristicCallbacks { public: + /*************************************************************************** + * Common public types * + ***************************************************************************/ + typedef enum { SUCCESS_INDICATE, SUCCESS_NOTIFY, @@ -139,51 +288,41 @@ class BLECharacteristicCallbacks { ERROR_NOTIFY_DISABLED, ERROR_GATT, ERROR_NO_CLIENT, + ERROR_NO_SUBSCRIBER, ERROR_INDICATE_TIMEOUT, ERROR_INDICATE_FAILURE } Status; - virtual ~BLECharacteristicCallbacks(); + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ - /** - * @brief Callback function to support a read request. - * @param [in] pCharacteristic The characteristic that is the source of the event. - * @param [in] param The BLE GATTS param. Use param->read. - */ - virtual void onRead(BLECharacteristic *pCharacteristic, esp_ble_gatts_cb_param_t *param); - /** - * @brief DEPRECATED! Callback function to support a read request. Called only if onRead(,) is not overridden - * @param [in] pCharacteristic The characteristic that is the source of the event. - */ + virtual ~BLECharacteristicCallbacks(); virtual void onRead(BLECharacteristic *pCharacteristic); + virtual void onWrite(BLECharacteristic *pCharacteristic); + virtual void onNotify(BLECharacteristic *pCharacteristic); + virtual void onStatus(BLECharacteristic *pCharacteristic, Status s, uint32_t code); - /** - * @brief Callback function to support a write request. - * @param [in] pCharacteristic The characteristic that is the source of the event. - * @param [in] param The BLE GATTS param. Use param->write. - */ + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + virtual void onRead(BLECharacteristic *pCharacteristic, esp_ble_gatts_cb_param_t *param); virtual void onWrite(BLECharacteristic *pCharacteristic, esp_ble_gatts_cb_param_t *param); - /** - * @brief DEPRECATED! Callback function to support a write request. Called only if onWrite(,) is not overridden. - * @param [in] pCharacteristic The characteristic that is the source of the event. - */ - virtual void onWrite(BLECharacteristic *pCharacteristic); +#endif - /** - * @brief Callback function to support a Notify request. - * @param [in] pCharacteristic The characteristic that is the source of the event. - */ - virtual void onNotify(BLECharacteristic *pCharacteristic); + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ - /** - * @brief Callback function to support a Notify/Indicate Status report. - * @param [in] pCharacteristic The characteristic that is the source of the event. - * @param [in] s Status of the notification/indication - * @param [in] code Additional code of underlying errors - */ - virtual void onStatus(BLECharacteristic *pCharacteristic, Status s, uint32_t code); +#if defined(CONFIG_NIMBLE_ENABLED) + virtual void onRead(BLECharacteristic *pCharacteristic, ble_gap_conn_desc *desc); + virtual void onWrite(BLECharacteristic *pCharacteristic, ble_gap_conn_desc *desc); + virtual void onSubscribe(BLECharacteristic *pCharacteristic, ble_gap_conn_desc *desc, uint16_t subValue); +#endif }; -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLECHARACTERISTIC_H_ */ diff --git a/libraries/BLE/src/BLECharacteristicMap.cpp b/libraries/BLE/src/BLECharacteristicMap.cpp index 6f2c0bb1154..ec3588bcde4 100644 --- a/libraries/BLE/src/BLECharacteristicMap.cpp +++ b/libraries/BLE/src/BLECharacteristicMap.cpp @@ -3,19 +3,34 @@ * * Created on: Jun 22, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + #include #include #include "BLEService.h" +#include "BLEUtils.h" #ifdef ARDUINO_ARCH_ESP32 #include "esp32-hal-log.h" #endif +/*************************************************************************** + * Common functions * + ***************************************************************************/ + /** * @brief Return the characteristic by handle. * @param [in] handle The handle to look up the characteristic. @@ -77,17 +92,22 @@ BLECharacteristic *BLECharacteristicMap::getNext() { } // getNext /** - * @brief Pass the GATT server event onwards to each of the characteristics found in the mapping - * @param [in] event - * @param [in] gatts_if - * @param [in] param + * @brief Get the number of registered characteristics. + * @return The number of registered characteristics. */ -void BLECharacteristicMap::handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { - // Invoke the handler for every Service we have. - for (auto &myPair : m_uuidMap) { - myPair.first->handleGATTServerEvent(event, gatts_if, param); - } -} // handleGATTServerEvent +int BLECharacteristicMap::getRegisteredCharacteristicCount() { + return m_uuidMap.size(); +} // getRegisteredCharacteristicCount + +/** + * @brief Removes characteristic from maps. + * @param [in] characteristic The characteristic to remove. + * @return N/A. + */ +void BLECharacteristicMap::removeCharacteristic(BLECharacteristic *characteristic) { + m_handleMap.erase(characteristic->getHandle()); + m_uuidMap.erase(characteristic); +} // removeCharacteristic /** * @brief Set the characteristic by handle. @@ -130,5 +150,37 @@ String BLECharacteristicMap::toString() { return res; } // toString -#endif /* CONFIG_BLUEDROID_ENABLED */ +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +/** + * @brief Pass the GATT server event onwards to each of the characteristics found in the mapping + * @param [in] event + * @param [in] gatts_if + * @param [in] param + */ +void BLECharacteristicMap::handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { + // Invoke the handler for every Service we have. + for (auto &myPair : m_uuidMap) { + myPair.first->handleGATTServerEvent(event, gatts_if, param); + } +} // handleGATTServerEvent +#endif // CONFIG_BLUEDROID_ENABLED + +/*************************************************************************** + * NimBLE functions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +void BLECharacteristicMap::handleGATTServerEvent(uint16_t conn_handle, uint16_t attr_handle, ble_gatt_access_ctxt *ctxt, void *arg) { + // Invoke the handler for every Service we have. + for (auto &myPair : m_uuidMap) { + myPair.first->handleGATTServerEvent(conn_handle, attr_handle, ctxt, arg); + } +} +#endif // CONFIG_NIMBLE_ENABLED + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEClient.cpp b/libraries/BLE/src/BLEClient.cpp index 29fa0fbc140..c101993d002 100644 --- a/libraries/BLE/src/BLEClient.cpp +++ b/libraries/BLE/src/BLEClient.cpp @@ -3,17 +3,23 @@ * * Created on: Mar 22, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + #include -#include -#include -#include -#include // ESP32 BLE #include "BLEClient.h" #include "BLEUtils.h" #include "BLEService.h" @@ -24,6 +30,39 @@ #include "BLEDevice.h" #include "esp32-hal-log.h" +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#include +#include +#include +#endif + +/*************************************************************************** + * NimBLE includes * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#include +#include +#include +#include +#endif + +/*************************************************************************** + * Common global variables * + ***************************************************************************/ + +static BLEClientCallbacks defaultCallbacks; + +/*************************************************************************** + * Common functions * + ***************************************************************************/ + /* * Design * ------ @@ -46,11 +85,30 @@ */ BLEClient::BLEClient() { - m_pClientCallbacks = nullptr; + m_pClientCallbacks = &defaultCallbacks; m_conn_id = ESP_GATT_IF_NONE; - m_gattc_if = ESP_GATT_IF_NONE; m_haveServices = false; m_isConnected = false; // Initially, we are flagged as not connected. + +#if defined(CONFIG_BLUEDROID_ENABLED) + m_gattc_if = ESP_GATT_IF_NONE; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + m_connectTimeout = 30000; + m_pTaskData = nullptr; + m_lastErr = 0; + m_terminateFailCount = 0; + + m_pConnParams.scan_itvl = 16; // Scan interval in 0.625ms units (NimBLE Default) + m_pConnParams.scan_window = 16; // Scan window in 0.625ms units (NimBLE Default) + m_pConnParams.itvl_min = BLE_GAP_INITIAL_CONN_ITVL_MIN; // min_int = 0x10*1.25ms = 20ms + m_pConnParams.itvl_max = BLE_GAP_INITIAL_CONN_ITVL_MAX; // max_int = 0x20*1.25ms = 40ms + m_pConnParams.latency = BLE_GAP_INITIAL_CONN_LATENCY; // number of packets allowed to skip (extends max interval) + m_pConnParams.supervision_timeout = BLE_GAP_INITIAL_SUPERVISION_TIMEOUT; // timeout = 400*10ms = 4000ms + m_pConnParams.min_ce_len = BLE_GAP_INITIAL_CONN_MIN_CE_LEN; // Minimum length of connection event in 0.625ms units + m_pConnParams.max_ce_len = BLE_GAP_INITIAL_CONN_MAX_CE_LEN; // Maximum length of connection event in 0.625ms units +#endif } // BLEClient /** @@ -86,7 +144,7 @@ void BLEClient::clearServices() { */ bool BLEClient::connect(BLEAdvertisedDevice *device) { BLEAddress address = device->getAddress(); - esp_ble_addr_type_t type = device->getAddressType(); + uint8_t type = device->getAddressType(); return connect(address, type); } @@ -95,10 +153,262 @@ bool BLEClient::connect(BLEAdvertisedDevice *device) { */ bool BLEClient::connectTimeout(BLEAdvertisedDevice *device, uint32_t timeoutMs) { BLEAddress address = device->getAddress(); - esp_ble_addr_type_t type = device->getAddressType(); + uint8_t type = device->getAddressType(); return connect(address, type, timeoutMs); } +esp_gatt_if_t BLEClient::getGattcIf() { +#if defined(CONFIG_BLUEDROID_ENABLED) + return m_gattc_if; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + log_e("NimBLE does not support getGattcIf()"); + return ESP_GATT_IF_NONE; +#endif +} // getGattcIf + +/** + * @brief Initiate a secure connection (pair/bond) with the server.\n + * Called automatically when a characteristic or descriptor requires encryption or authentication to access it. + * @return True on success. + */ +bool BLEClient::secureConnection() { +#if defined(CONFIG_BLUEDROID_ENABLED) + log_i("secureConnection() does not need to be called for Bluedroid"); + return true; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + int retryCount = 1; + BLETaskData taskData(const_cast(this), BLE_HS_ENOTCONN); + m_pTaskData = &taskData; + + do { + if (BLESecurity::startSecurity(m_conn_id)) { + BLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER); + } + + } while (taskData.m_flags == (BLE_HS_ERR_HCI_BASE + BLE_ERR_PINKEY_MISSING) && retryCount--); + + m_pTaskData = nullptr; + + if (taskData.m_flags == 0) { + log_d("<< secureConnection: success"); + return true; + } + + m_lastErr = taskData.m_flags; + log_e("secureConnection: failed rc=%d", taskData.m_flags); + return false; +#endif +} // secureConnection + +uint16_t BLEClient::getConnId() { + return m_conn_id; +} // getConnId + +/** + * @brief Retrieve the address of the peer. + * + * Returns the Bluetooth device address of the %BLE peer to which this client is connected. + */ +BLEAddress BLEClient::getPeerAddress() { + return m_peerAddress; +} // getAddress + +/** + * @brief Ask the BLE server for the RSSI value. + * @return The RSSI value. + */ +int BLEClient::getRssi() { + log_v(">> getRssi()"); + if (!isConnected()) { + log_v("<< getRssi(): Not connected"); + return 0; + } + +#if defined(CONFIG_BLUEDROID_ENABLED) + // We make the API call to read the RSSI value which is an asynchronous operation. We expect to receive + // an ESP_GAP_BLE_READ_RSSI_COMPLETE_EVT to indicate completion. + // + m_semaphoreRssiCmplEvt.take("getRssi"); + esp_err_t rc = ::esp_ble_gap_read_rssi(getPeerAddress().getNative()); + if (rc != ESP_OK) { + log_e("<< getRssi: esp_ble_gap_read_rssi: rc=%d %s", rc, GeneralUtils::errorToString(rc)); + return 0; + } + int rssiValue = m_semaphoreRssiCmplEvt.wait("getRssi"); +#endif // CONFIG_BLUEDROID_ENABLED + +#if defined(CONFIG_NIMBLE_ENABLED) + int8_t rssiValue = 0; + int rc = ble_gap_conn_rssi(m_conn_id, &rssiValue); + if (rc != 0) { + log_e("<< getRssi: ble_gap_conn_rssi: rc=%d %s", rc, BLEUtils::returnCodeToString(rc)); + return 0; + } +#endif // CONFIG_BLUEDROID_ENABLED + log_v("<< getRssi(): %d", rssiValue); + return rssiValue; +} // getRssi + +/** + * @brief Get the service BLE Remote Service instance corresponding to the uuid. + * @param [in] uuid The UUID of the service being sought. + * @return A reference to the Service or nullptr if don't know about it. + */ +BLERemoteService *BLEClient::getService(const char *uuid) { + return getService(BLEUUID(uuid)); +} // getService + +/** + * @brief Get the service object corresponding to the uuid. + * @param [in] uuid The UUID of the service being sought. + * @return A reference to the Service or nullptr if don't know about it. + * @throws BLEUuidNotFound + */ +BLERemoteService *BLEClient::getService(BLEUUID uuid) { + log_v(">> getService: uuid: %s", uuid.toString().c_str()); + // Design + // ------ + // We wish to retrieve the service given its UUID. It is possible that we have not yet asked the + // device what services it has in which case we have nothing to match against. If we have not + // asked the device about its services, then we do that now. Once we get the results we can then + // examine the services map to see if it has the service we are looking for. + if (!m_haveServices) { + getServices(); + } + std::string uuidStr = uuid.toString().c_str(); + for (auto &myPair : m_servicesMap) { + if (myPair.first == uuidStr) { + log_v("<< getService: found the service with uuid: %s", uuid.toString().c_str()); + return myPair.second; + } + } // End of each of the services. + log_v("<< getService: not found"); + return nullptr; +} // getService + +/** + * @brief Get the value of a specific characteristic associated with a specific service. + * @param [in] serviceUUID The service that owns the characteristic. + * @param [in] characteristicUUID The characteristic whose value we wish to read. + * @throws BLEUuidNotFound + */ +String BLEClient::getValue(BLEUUID serviceUUID, BLEUUID characteristicUUID) { + log_v(">> getValue: serviceUUID: %s, characteristicUUID: %s", serviceUUID.toString().c_str(), characteristicUUID.toString().c_str()); + String ret = getService(serviceUUID)->getCharacteristic(characteristicUUID)->readValue(); + log_v("<> setValue: serviceUUID: %s, characteristicUUID: %s", serviceUUID.toString().c_str(), characteristicUUID.toString().c_str()); + getService(serviceUUID)->getCharacteristic(characteristicUUID)->writeValue(value); + log_v("<< setValue"); +} // setValue + +uint16_t BLEClient::getMTU() { +#ifdef CONFIG_BLUEDROID_ENABLED + return m_mtu; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + return ble_att_mtu(m_conn_id); +#endif +} + +/** + @brief Set the local and remote MTU size. + Should be called once after client connects if MTU size needs to be changed. + @return bool indicating if MTU was successfully set locally and on remote. +*/ +bool BLEClient::setMTU(uint16_t mtu) { + log_v(">> setMTU: %d", mtu); + esp_err_t err = ESP_OK; + +#ifdef CONFIG_BLUEDROID_ENABLED + err = esp_ble_gatt_set_local_mtu(mtu); //First must set local MTU value. +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + err = ble_att_set_preferred_mtu(mtu); +#endif + + if (err == ESP_OK) { +#ifdef CONFIG_BLUEDROID_ENABLED + err = esp_ble_gattc_send_mtu_req(m_gattc_if, m_conn_id); //Once local is set successfully set remote size +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + //err = ble_gattc_exchange_mtu(m_conn_id, nullptr, nullptr); +#endif + + if (err != ESP_OK) { + log_e("Error setting send MTU request MTU: %d err=%d", mtu, err); + return false; + } + } else { + log_e("can't set local mtu value: %d", mtu); + return false; + } + log_v("<< setMTU"); + + m_mtu = mtu; //successfully changed + + return true; +} + +/** + * @brief Return a string representation of this client. + * @return A string representation of this client. + */ +String BLEClient::toString() { + String res = "peer address: " + m_peerAddress.toString(); + res += "\nServices:\n"; + for (auto &myPair : m_servicesMap) { + res += myPair.second->toString() + "\n"; + // myPair.second is the value + } + return res; +} // toString + +void BLEClientCallbacks::onConnect(BLEClient *pClient) { + log_d("BLEClientCallbacks", "onConnect: default"); +} + +void BLEClientCallbacks::onDisconnect(BLEClient *pClient) { + log_d("BLEClientCallbacks", "onDisconnect: default"); +} + +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + /** * @brief Connect to the partner (BLE Server). * @param [in] address The address of the partner. @@ -106,7 +416,7 @@ bool BLEClient::connectTimeout(BLEAdvertisedDevice *device, uint32_t timeoutMs) * @param [in] timeoutMs The number of milliseconds to wait for the connection to complete. * @return True on success. */ -bool BLEClient::connect(BLEAddress address, esp_ble_addr_type_t type, uint32_t timeoutMs) { +bool BLEClient::connect(BLEAddress address, uint8_t type, uint32_t timeoutMs) { log_v(">> connect(%s)", address.toString().c_str()); // We need the connection handle that we get from registering the application. We register the app @@ -141,9 +451,9 @@ bool BLEClient::connect(BLEAddress address, esp_ble_addr_type_t type, uint32_t t m_semaphoreOpenEvt.take("connect"); errRc = ::esp_ble_gattc_open( m_gattc_if, - *getPeerAddress().getNative(), // address - type, // Note: This was added on 2018-04-03 when the latest ESP-IDF was detected to have changed the signature. - 1 // direct connection <-- maybe needs to be changed in case of direct indirect connection??? + getPeerAddress().getNative(), // address + (esp_ble_addr_type_t)type, // Note: This was added on 2018-04-03 when the latest ESP-IDF was detected to have changed the signature. + 1 // direct connection <-- maybe needs to be changed in case of direct indirect connection??? ); if (errRc != ESP_OK) { log_e("esp_ble_gattc_open: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); @@ -165,16 +475,17 @@ bool BLEClient::connect(BLEAddress address, esp_ble_addr_type_t type, uint32_t t /** * @brief Disconnect from the peer. - * @return N/A. + * @return error code from bluedroid, 0 = success. */ -void BLEClient::disconnect() { +int BLEClient::disconnect(uint8_t reason) { log_v(">> disconnect()"); esp_err_t errRc = ::esp_ble_gattc_close(getGattcIf(), getConnId()); if (errRc != ESP_OK) { log_e("esp_ble_gattc_close: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - return; + return errRc; } log_v("<< disconnect()"); + return ESP_OK; } // disconnect /** @@ -361,89 +672,11 @@ void BLEClient::gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t } // gattClientEventHandler -uint16_t BLEClient::getConnId() { - return m_conn_id; -} // getConnId - -esp_gatt_if_t BLEClient::getGattcIf() { - return m_gattc_if; -} // getGattcIf - -/** - * @brief Retrieve the address of the peer. - * - * Returns the Bluetooth device address of the %BLE peer to which this client is connected. - */ -BLEAddress BLEClient::getPeerAddress() { - return m_peerAddress; -} // getAddress - /** - * @brief Ask the BLE server for the RSSI value. - * @return The RSSI value. - */ -int BLEClient::getRssi() { - log_v(">> getRssi()"); - if (!isConnected()) { - log_v("<< getRssi(): Not connected"); - return 0; - } - // We make the API call to read the RSSI value which is an asynchronous operation. We expect to receive - // an ESP_GAP_BLE_READ_RSSI_COMPLETE_EVT to indicate completion. - // - m_semaphoreRssiCmplEvt.take("getRssi"); - esp_err_t rc = ::esp_ble_gap_read_rssi(*getPeerAddress().getNative()); - if (rc != ESP_OK) { - log_e("<< getRssi: esp_ble_gap_read_rssi: rc=%d %s", rc, GeneralUtils::errorToString(rc)); - return 0; - } - int rssiValue = m_semaphoreRssiCmplEvt.wait("getRssi"); - log_v("<< getRssi(): %d", rssiValue); - return rssiValue; -} // getRssi - -/** - * @brief Get the service BLE Remote Service instance corresponding to the uuid. - * @param [in] uuid The UUID of the service being sought. - * @return A reference to the Service or nullptr if don't know about it. - */ -BLERemoteService *BLEClient::getService(const char *uuid) { - return getService(BLEUUID(uuid)); -} // getService - -/** - * @brief Get the service object corresponding to the uuid. - * @param [in] uuid The UUID of the service being sought. - * @return A reference to the Service or nullptr if don't know about it. - * @throws BLEUuidNotFound - */ -BLERemoteService *BLEClient::getService(BLEUUID uuid) { - log_v(">> getService: uuid: %s", uuid.toString().c_str()); - // Design - // ------ - // We wish to retrieve the service given its UUID. It is possible that we have not yet asked the - // device what services it has in which case we have nothing to match against. If we have not - // asked the device about its services, then we do that now. Once we get the results we can then - // examine the services map to see if it has the service we are looking for. - if (!m_haveServices) { - getServices(); - } - std::string uuidStr = uuid.toString().c_str(); - for (auto &myPair : m_servicesMap) { - if (myPair.first == uuidStr) { - log_v("<< getService: found the service with uuid: %s", uuid.toString().c_str()); - return myPair.second; - } - } // End of each of the services. - log_v("<< getService: not found"); - return nullptr; -} // getService - -/** - * @brief Ask the remote %BLE server for its services. - * A %BLE Server exposes a set of services for its partners. Here we ask the server for its set of - * services and wait until we have received them all. - * @return N/A + * @brief Ask the remote %BLE server for its services. + * A %BLE Server exposes a set of services for its partners. Here we ask the server for its set of + * services and wait until we have received them all. + * @return N/A */ std::map *BLEClient::getServices() { /* @@ -473,19 +706,6 @@ std::map *BLEClient::getServices() { return &m_servicesMap; } // getServices -/** - * @brief Get the value of a specific characteristic associated with a specific service. - * @param [in] serviceUUID The service that owns the characteristic. - * @param [in] characteristicUUID The characteristic whose value we wish to read. - * @throws BLEUuidNotFound - */ -String BLEClient::getValue(BLEUUID serviceUUID, BLEUUID characteristicUUID) { - log_v(">> getValue: serviceUUID: %s, characteristicUUID: %s", serviceUUID.toString().c_str(), characteristicUUID.toString().c_str()); - String ret = getService(serviceUUID)->getCharacteristic(characteristicUUID)->readValue(); - log_v("<> connect(%s)", address.toString().c_str()); + + if (!BLEDevice::m_synced) { + log_d("BLEClient", "Host reset, wait for sync."); + return false; + } + + if (m_conn_id != BLE_HS_CONN_HANDLE_NONE || m_isConnected || m_pTaskData != nullptr) { + log_e("Client busy, connected to %s, id=%d", m_peerAddress.toString().c_str(), getConnId()); + return false; + } + + ble_addr_t peerAddr_t; + memcpy(&peerAddr_t.val, address.getNative(), 6); + peerAddr_t.type = address.getType(); + if (ble_gap_conn_find_by_addr(&peerAddr_t, NULL) == 0) { + log_e("A connection to %s already exists", address.toString().c_str()); + return false; + } + + if (address == BLEAddress("")) { + log_e("Invalid peer address (NULL)"); + return false; + } + + m_appId = BLEDevice::m_appId++; + m_peerAddress = address; + + int rc = 0; + + /* Try to connect the the advertiser. Allow 30 seconds (30000 ms) for + * timeout (default value of m_connectTimeout). + * Loop on BLE_HS_EBUSY if the scan hasn't stopped yet. + */ + do { + rc = ble_gap_connect(BLEDevice::m_ownAddrType, &peerAddr_t, m_connectTimeout, &m_pConnParams, BLEClient::handleGAPEvent, this); + switch (rc) { + case 0: break; + + case BLE_HS_EBUSY: + // Scan was still running, stop it and try again + if (!BLEDevice::getScan()->stop()) { + rc = BLE_HS_EUNKNOWN; + } + break; + + case BLE_HS_EDONE: + // A connection to this device already exists, do not connect twice. + log_e("Already connected to device; addr=%s", m_peerAddress.toString().c_str()); + break; + + case BLE_HS_EALREADY: + // Already attempting to connect to this device, cancel the previous + // attempt and report failure here so we don't get 2 connections. + log_e("Already attempting to connect to %s - canceling", m_peerAddress.toString().c_str()); + ble_gap_conn_cancel(); + break; + + default: log_e("Failed to connect to %s, rc=%d; %s", m_peerAddress.toString().c_str(), rc, BLEUtils::returnCodeToString(rc)); break; + } + + } while (rc == BLE_HS_EBUSY); + + if (rc != 0) { + m_lastErr = rc; + return false; + } + + BLETaskData taskData(this); + m_pTaskData = &taskData; + + // Wait for the connect timeout time +1 second for the connection to complete + if (!BLEUtils::taskWait(taskData, m_connectTimeout + 1000)) { + // If a connection was made but no response from MTU exchange proceed anyway + if (isConnected()) { + taskData.m_flags = 0; + } else { + // workaround; if the controller doesn't cancel the connection at the timeout, cancel it here. + log_e("Connect timeout - canceling"); + ble_gap_conn_cancel(); + taskData.m_flags = BLE_HS_ETIMEOUT; + } + } + + m_pTaskData = nullptr; + rc = taskData.m_flags; + + if (rc != 0) { + log_e("Connection failed; status=%d %s", rc, BLEUtils::returnCodeToString(rc)); + m_lastErr = rc; + return false; + } + + m_isConnected = true; + m_pClientCallbacks->onConnect(this); + + log_i("<< connect()"); + + BLEDevice::addPeerDevice(this, true, m_appId); + // Check if still connected before returning + return isConnected(); +} /** - * @brief Set the value of a specific characteristic associated with a specific service. - * @param [in] serviceUUID The service that owns the characteristic. - * @param [in] characteristicUUID The characteristic whose value we wish to write. - * @throws BLEUuidNotFound + * @brief STATIC Callback for the service discovery API function.\n + * When a service is found or there is none left or there was an error + * the API will call this and report findings. */ -void BLEClient::setValue(BLEUUID serviceUUID, BLEUUID characteristicUUID, String value) { - log_v(">> setValue: serviceUUID: %s, characteristicUUID: %s", serviceUUID.toString().c_str(), characteristicUUID.toString().c_str()); - getService(serviceUUID)->getCharacteristic(characteristicUUID)->writeValue(value); - log_v("<< setValue"); -} // setValue +int BLEClient::serviceDiscoveredCB(uint16_t conn_handle, const struct ble_gatt_error *error, const struct ble_gatt_svc *service, void *arg) { + log_d("Service Discovered >> status: %d handle: %d", error->status, (error->status == 0) ? service->start_handle : -1); -uint16_t BLEClient::getMTU() { - return m_mtu; + BLETaskData *pTaskData = (BLETaskData *)arg; + BLEClient *client = (BLEClient *)pTaskData->m_pInstance; + + if (error->status == BLE_HS_ENOTCONN) { + log_e("<< Service Discovered; Disconnected"); + BLEUtils::taskRelease(*pTaskData, error->status); + return error->status; + } + + // Make sure the service discovery is for this device + if (client->getConnId() != conn_handle) { + return 0; + } + + if (error->status == 0) { + // Found a service - add it to the vector + BLERemoteService *pRemoteService = new BLERemoteService(client, service); + client->m_servicesMap.insert(std::pair(pRemoteService->getUUID().toString().c_str(), pRemoteService)); + client->m_servicesMapByInstID.insert(std::pair(pRemoteService, service->start_handle)); + return 0; + } + + BLEUtils::taskRelease(*pTaskData, error->status); + log_d("<< Service Discovered"); + return error->status; } +std::map *BLEClient::getServices() { + log_v(">> getServices"); + + clearServices(); // Clear any services that may exist. + + if (!isConnected()) { + log_e("Disconnected, could not retrieve services -aborting"); + return &m_servicesMap; + } + + int errRc = 0; + BLETaskData taskData(this); + + errRc = ble_gattc_disc_all_svcs(m_conn_id, BLEClient::serviceDiscoveredCB, &taskData); + + if (errRc != 0) { + log_e("ble_gattc_disc_all_svcs: rc=%d %s", errRc, BLEUtils::returnCodeToString(errRc)); + m_lastErr = errRc; + return &m_servicesMap; + } + + BLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER); + errRc = taskData.m_flags; + if (errRc == 0 || errRc == BLE_HS_EDONE) { + // If successful, remember that we now have services. + m_haveServices = m_servicesMap.size() > 0; + log_v("<< getServices"); + return &m_servicesMap; + } + + m_lastErr = errRc; + log_e("Could not retrieve services, rc=%d %s", errRc, BLEUtils::returnCodeToString(errRc)); + return &m_servicesMap; +} // getServices + +int BLEClient::handleGAPEvent(struct ble_gap_event *event, void *arg) { + BLEClient *client = (BLEClient *)arg; + int rc = 0; + BLETaskData *pTaskData = client->m_pTaskData; + + log_d("BLEClient", "Got Client event %s", BLEUtils::gapEventToString(event->type)); + + switch (event->type) { + case BLE_GAP_EVENT_DISCONNECT: + { + rc = event->disconnect.reason; + // If Host reset tell the device now before returning to prevent + // any errors caused by calling host functions before resyncing. + switch (rc) { + case BLE_HS_ECONTROLLER: + case BLE_HS_ETIMEOUT_HCI: + case BLE_HS_ENOTSYNCED: + case BLE_HS_EOS: + log_e("BLEClient", "Disconnect - host reset, rc=%d", rc); + BLEDevice::onReset(rc); + break; + default: + // Check that the event is for this client. + if (client->m_conn_id != event->disconnect.conn.conn_handle) { + return 0; + } + break; + } + + // Remove the device from ignore list so we will scan it again + // BLEDevice::removeIgnored(client->m_peerAddress); + + // No longer connected, clear the connection ID. + client->m_conn_id = BLE_HS_CONN_HANDLE_NONE; + client->m_terminateFailCount = 0; + + // If we received a connected event but did not get established (no PDU) + // then a disconnect event will be sent but we should not send it to the + // app for processing. Instead we will ensure the task is released + // and report the error. + if (!client->m_isConnected) { + break; + } + + log_i("BLEClient", "disconnect; reason=%d, %s", rc, BLEUtils::returnCodeToString(rc)); + + BLEDevice::removePeerDevice(client->m_appId, true); + client->m_isConnected = false; + if (client->m_pClientCallbacks != nullptr) { + client->m_pClientCallbacks->onDisconnect(client); + } + break; + } // BLE_GAP_EVENT_DISCONNECT + + case BLE_GAP_EVENT_CONNECT: + { + // If we aren't waiting for this connection response + // we should drop the connection immediately. + if (client->isConnected() || client->m_pTaskData == nullptr) { + ble_gap_terminate(event->connect.conn_handle, BLE_ERR_REM_USER_CONN_TERM); + return 0; + } + + rc = event->connect.status; + if (rc == 0) { + log_i("BLEClient: Connected event. Handle: %d", event->connect.conn_handle); + + client->m_conn_id = event->connect.conn_handle; + + rc = ble_gattc_exchange_mtu(client->m_conn_id, nullptr, nullptr); + if (rc != 0) { + log_e("BLEClient", "MTU exchange error; rc=%d %s", rc, BLEUtils::returnCodeToString(rc)); + break; + } + + // In the case of a multiconnecting device we ignore this device when + // scanning since we are already connected to it + // BLEDevice::addIgnored(client->m_peerAddress); + } else { + client->m_conn_id = BLE_HS_CONN_HANDLE_NONE; + break; + } + + return 0; + } // BLE_GAP_EVENT_CONNECT + + case BLE_GAP_EVENT_TERM_FAILURE: + { + if (client->m_conn_id != event->term_failure.conn_handle) { + return 0; + } + + log_e("Connection termination failure; rc=%d - retrying", event->term_failure.status); + if (++client->m_terminateFailCount > 2) { + ble_hs_sched_reset(BLE_HS_ECONTROLLER); + } else { + ble_gap_terminate(event->term_failure.conn_handle, BLE_ERR_REM_USER_CONN_TERM); + } + return 0; + } // BLE_GAP_EVENT_TERM_FAILURE + + case BLE_GAP_EVENT_NOTIFY_RX: + { + if (client->m_conn_id != event->notify_rx.conn_handle) { + return 0; + } + + // If a notification comes before this flag is set we might + // access a vector while it is being cleared in connect() + if (!client->m_isConnected) { + return 0; + } + + log_d("BLEClient", "Notify received for handle: %d", event->notify_rx.attr_handle); + + for (auto &myPair : client->m_servicesMap) { + // Dont waste cycles searching services without this handle in its range + if (myPair.second->getEndHandle() < event->notify_rx.attr_handle) { + continue; + } + + auto cMap = &myPair.second->m_characteristicMap; + log_d("BLEClient", "checking service %s for handle: %d", myPair.second->getUUID().toString().c_str(), event->notify_rx.attr_handle); + + auto characteristic = cMap->cbegin(); + for (; characteristic != cMap->cend(); ++characteristic) { + if (characteristic->second->m_handle == event->notify_rx.attr_handle) { + break; + } + } + + if (characteristic != cMap->cend()) { + log_d("BLEClient", "Got Notification for characteristic %s", characteristic->second->toString().c_str()); + + characteristic->second->m_semaphoreReadCharEvt.take(); + characteristic->second->m_value = String((char *)event->notify_rx.om->om_data, event->notify_rx.om->om_len); + characteristic->second->m_semaphoreReadCharEvt.give(); + + if (characteristic->second->m_notifyCallback != nullptr) { + log_d("Invoking callback for notification on characteristic %s", characteristic->second->toString().c_str()); + characteristic->second->m_notifyCallback( + characteristic->second, event->notify_rx.om->om_data, event->notify_rx.om->om_len, !event->notify_rx.indication + ); + } + break; + } + } + + return 0; + } // BLE_GAP_EVENT_NOTIFY_RX + + case BLE_GAP_EVENT_CONN_UPDATE_REQ: + case BLE_GAP_EVENT_L2CAP_UPDATE_REQ: + { + if (client->m_conn_id != event->conn_update_req.conn_handle) { + return 0; + } + log_d("Peer requesting to update connection parameters"); + log_d( + "MinInterval: %d, MaxInterval: %d, Latency: %d, Timeout: %d", event->conn_update_req.peer_params->itvl_min, + event->conn_update_req.peer_params->itvl_max, event->conn_update_req.peer_params->latency, event->conn_update_req.peer_params->supervision_timeout + ); + + rc = client->m_pClientCallbacks->onConnParamsUpdateRequest(client, event->conn_update_req.peer_params) ? 0 : BLE_ERR_CONN_PARMS; + + if (!rc && event->type == BLE_GAP_EVENT_CONN_UPDATE_REQ) { + event->conn_update_req.self_params->itvl_min = client->m_pConnParams.itvl_min; + event->conn_update_req.self_params->itvl_max = client->m_pConnParams.itvl_max; + event->conn_update_req.self_params->latency = client->m_pConnParams.latency; + event->conn_update_req.self_params->supervision_timeout = client->m_pConnParams.supervision_timeout; + } + + log_d("%s peer params", (rc == 0) ? "Accepted" : "Rejected"); + return rc; + } // BLE_GAP_EVENT_CONN_UPDATE_REQ, BLE_GAP_EVENT_L2CAP_UPDATE_REQ + + case BLE_GAP_EVENT_CONN_UPDATE: + { + if (client->m_conn_id != event->conn_update.conn_handle) { + return 0; + } + if (event->conn_update.status == 0) { + log_i("Connection parameters updated."); + } else { + log_e("Update connection parameters failed."); + } + return 0; + } // BLE_GAP_EVENT_CONN_UPDATE + + case BLE_GAP_EVENT_ENC_CHANGE: + { + if (client->m_conn_id != event->enc_change.conn_handle) { + return 0; + } + + if (event->enc_change.status == 0 || event->enc_change.status == (BLE_HS_ERR_HCI_BASE + BLE_ERR_PINKEY_MISSING)) { + struct ble_gap_conn_desc desc; + rc = ble_gap_conn_find(event->enc_change.conn_handle, &desc); + assert(rc == 0); + + if (event->enc_change.status == (BLE_HS_ERR_HCI_BASE + BLE_ERR_PINKEY_MISSING)) { + // Key is missing, try deleting. + ble_store_util_delete_peer(&desc.peer_id_addr); + } else if (BLEDevice::m_securityCallbacks != nullptr) { + BLEDevice::m_securityCallbacks->onAuthenticationComplete(&desc); + } else { + client->m_pClientCallbacks->onAuthenticationComplete(&desc); + } + } + + rc = event->enc_change.status; + break; + } //BLE_GAP_EVENT_ENC_CHANGE + + case BLE_GAP_EVENT_MTU: + { + if (client->m_conn_id != event->mtu.conn_handle) { + return 0; + } + log_i("mtu update event; conn_handle=%d mtu=%d", event->mtu.conn_handle, event->mtu.value); + rc = 0; + break; + } // BLE_GAP_EVENT_MTU + + case BLE_GAP_EVENT_PASSKEY_ACTION: + { + struct ble_sm_io pkey = {0, 0}; + + if (client->m_conn_id != event->passkey.conn_handle) { + return 0; + } + + if (event->passkey.params.action == BLE_SM_IOACT_DISP) { + pkey.action = event->passkey.params.action; + pkey.passkey = BLESecurity::m_passkey; // This is the passkey to be entered on peer + rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); + log_d("ble_sm_inject_io result: %d", rc); + + } else if (event->passkey.params.action == BLE_SM_IOACT_NUMCMP) { + log_d("Passkey on device's display: %d", event->passkey.params.numcmp); + pkey.action = event->passkey.params.action; + // Compatibility only - Do not use, should be removed the in future + if (BLEDevice::m_securityCallbacks != nullptr) { + pkey.numcmp_accept = BLEDevice::m_securityCallbacks->onConfirmPIN(event->passkey.params.numcmp); + //////////////////////////////////////////////////// + } else { + pkey.numcmp_accept = client->m_pClientCallbacks->onConfirmPIN(event->passkey.params.numcmp); + } + + rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); + log_d("ble_sm_inject_io result: %d", rc); + + //TODO: Handle out of band pairing + } else if (event->passkey.params.action == BLE_SM_IOACT_OOB) { + static uint8_t tem_oob[16] = {0}; + pkey.action = event->passkey.params.action; + for (int i = 0; i < 16; i++) { + pkey.oob[i] = tem_oob[i]; + } + rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); + log_d("ble_sm_inject_io result: %d", rc); + //////// + } else if (event->passkey.params.action == BLE_SM_IOACT_INPUT) { + log_d("Enter the passkey"); + pkey.action = event->passkey.params.action; + + // Compatibility only - Do not use, should be removed the in future + if (BLEDevice::m_securityCallbacks != nullptr) { + pkey.passkey = BLEDevice::m_securityCallbacks->onPassKeyRequest(); + ///////////////////////////////////////////// + } else { + pkey.passkey = client->m_pClientCallbacks->onPassKeyRequest(); + } + + rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); + log_d("ble_sm_inject_io result: %d", rc); + + } else if (event->passkey.params.action == BLE_SM_IOACT_NONE) { + log_d("No passkey action required"); + } + + return 0; + } // BLE_GAP_EVENT_PASSKEY_ACTION + + default: + { + return 0; + } + } // Switch + + if (pTaskData != nullptr) { + BLEUtils::taskRelease(*pTaskData, rc); + } + + return 0; +} // handleGAPEvent + /** - @brief Set the local and remote MTU size. - Should be called once after client connects if MTU size needs to be changed. - @return bool indicating if MTU was successfully set locally and on remote. -*/ -bool BLEClient::setMTU(uint16_t mtu) { - esp_err_t err = esp_ble_gatt_set_local_mtu(mtu); //First must set local MTU value. - if (err == ESP_OK) { - err = esp_ble_gattc_send_mtu_req(m_gattc_if, m_conn_id); //Once local is set successfully set remote size - if (err != ESP_OK) { - log_e("Error setting send MTU request MTU: %d err=%d", mtu, err); - return false; + * @brief Disconnect from the peer. + * @return Error code from NimBLE stack, 0 = success. + */ +int BLEClient::disconnect(uint8_t reason) { + log_d(">> disconnect()"); + int rc = 0; + + if (isConnected()) { + rc = ble_gap_terminate(m_conn_id, reason); + if (rc != 0 && rc != BLE_HS_ENOTCONN && rc != BLE_HS_EALREADY) { + m_lastErr = rc; + log_e("ble_gap_terminate failed: rc=%d %s", rc, BLEUtils::returnCodeToString(rc)); } } else { - log_e("can't set local mtu value: %d", mtu); - return false; + log_d("Not connected to any peers"); } - log_v("<< setLocalMTU"); - m_mtu = mtu; //successfully changed + log_d("<< disconnect()"); + return rc; +} // disconnect +bool BLEClientCallbacks::onConnParamsUpdateRequest(BLEClient *pClient, const ble_gap_upd_params *params) { + log_d("BLEClientCallbacks", "onConnParamsUpdateRequest: default"); return true; } -/** - * @brief Return a string representation of this client. - * @return A string representation of this client. - */ -String BLEClient::toString() { - String res = "peer address: " + m_peerAddress.toString(); - res += "\nServices:\n"; - for (auto &myPair : m_servicesMap) { - res += myPair.second->toString() + "\n"; - // myPair.second is the value - } - return res; -} // toString +uint32_t BLEClientCallbacks::onPassKeyRequest() { + log_d("onPassKeyRequest: default: 123456"); + return 123456; +} + +void BLEClientCallbacks::onAuthenticationComplete(ble_gap_conn_desc *desc) { + log_d("onAuthenticationComplete: default"); +} + +bool BLEClientCallbacks::onConfirmPIN(uint32_t pin) { + log_d("onConfirmPIN: default: true"); + return true; +} + +#endif // CONFIG_NIMBLE_ENABLED -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEClient.h b/libraries/BLE/src/BLEClient.h index ddb932fcd95..97ef72f4917 100644 --- a/libraries/BLE/src/BLEClient.h +++ b/libraries/BLE/src/BLEClient.h @@ -1,66 +1,128 @@ /* - * BLEDevice.h + * BLEClient.h * * Created on: Mar 22, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ -#ifndef MAIN_BLEDEVICE_H_ -#define MAIN_BLEDEVICE_H_ +#ifndef MAIN_BLECLIENT_H_ +#define MAIN_BLECLIENT_H_ #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ -#include #include #include #include -//#include "BLEExceptions.h" #include "BLERemoteService.h" #include "BLEService.h" #include "BLEAddress.h" #include "BLEAdvertisedDevice.h" +#include "BLEUtils.h" + +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#ifndef BLE_ERR_REM_USER_CONN_TERM +#define BLE_ERR_REM_USER_CONN_TERM 0x13 +#endif +#endif + +/*************************************************************************** + * NimBLE includes and definitions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#include +#include +#define ESP_GATT_IF_NONE BLE_HS_CONN_HANDLE_NONE +#endif + +/*************************************************************************** + * NimBLE types * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +typedef uint16_t esp_gatt_if_t; +#endif + +/*************************************************************************** + * Forward declarations * + ***************************************************************************/ class BLERemoteService; class BLEClientCallbacks; class BLEAdvertisedDevice; +struct BLETaskData; /** * @brief A model of a %BLE client. */ class BLEClient { public: + /*************************************************************************** + * Common public properties * + ***************************************************************************/ + + uint16_t m_appId; + + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + BLEClient(); ~BLEClient(); - bool connect(BLEAdvertisedDevice *device); bool connectTimeout(BLEAdvertisedDevice *device, uint32_t timeoutMS = portMAX_DELAY); - bool connect(BLEAddress address, esp_ble_addr_type_t type = BLE_ADDR_TYPE_PUBLIC, uint32_t timeoutMS = portMAX_DELAY); // Connect to the remote BLE Server - void disconnect(); // Disconnect from the remote BLE Server - BLEAddress getPeerAddress(); // Get the address of the remote BLE Server - int getRssi(); // Get the RSSI of the remote BLE Server - std::map *getServices(); // Get a map of the services offered by the remote BLE Server - BLERemoteService *getService(const char *uuid); // Get a reference to a specified service offered by the remote BLE server. - BLERemoteService *getService(BLEUUID uuid); // Get a reference to a specified service offered by the remote BLE server. - String getValue(BLEUUID serviceUUID, BLEUUID characteristicUUID); // Get the value of a given characteristic at a given service. - - void handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); - - bool isConnected(); // Return true if we are connected. - + bool connect(BLEAddress address, uint8_t type = 0, uint32_t timeoutMS = portMAX_DELAY); + bool secureConnection(); + int disconnect(uint8_t reason = BLE_ERR_REM_USER_CONN_TERM); + BLEAddress getPeerAddress(); + int getRssi(); + std::map *getServices(); + BLERemoteService *getService(const char *uuid); + BLERemoteService *getService(BLEUUID uuid); + String getValue(BLEUUID serviceUUID, BLEUUID characteristicUUID); + bool isConnected(); void setClientCallbacks(BLEClientCallbacks *pClientCallbacks); - void setValue(BLEUUID serviceUUID, BLEUUID characteristicUUID, String value); // Set the value of a given characteristic at a given service. - - String toString(); // Return a string representation of this client. + void setValue(BLEUUID serviceUUID, BLEUUID characteristicUUID, String value); + String toString(); uint16_t getConnId(); esp_gatt_if_t getGattcIf(); uint16_t getMTU(); bool setMTU(uint16_t mtu); - uint16_t m_appId; + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + void handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + static int handleGAPEvent(struct ble_gap_event *event, void *arg); + static int serviceDiscoveredCB(uint16_t conn_handle, const struct ble_gatt_error *error, const struct ble_gatt_svc *service, void *arg); +#endif private: friend class BLEDevice; @@ -68,15 +130,14 @@ class BLEClient { friend class BLERemoteCharacteristic; friend class BLERemoteDescriptor; - void gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param); + /*************************************************************************** + * Common private properties * + ***************************************************************************/ - BLEAddress m_peerAddress = BLEAddress((uint8_t *)"\0\0\0\0\0\0"); // The BD address of the remote server. + BLEAddress m_peerAddress = BLEAddress((uint8_t *)"\0\0\0\0\0\0"); uint16_t m_conn_id; - // int m_deviceType; - esp_gatt_if_t m_gattc_if; - bool m_haveServices = false; // Have we previously obtain the set of services from the remote server. - bool m_isConnected = false; // Are we currently connected. - + bool m_haveServices = false; + bool m_isConnected = false; BLEClientCallbacks *m_pClientCallbacks; FreeRTOS::Semaphore m_semaphoreRegEvt = FreeRTOS::Semaphore("RegEvt"); FreeRTOS::Semaphore m_semaphoreOpenEvt = FreeRTOS::Semaphore("OpenEvt"); @@ -84,20 +145,76 @@ class BLEClient { FreeRTOS::Semaphore m_semaphoreRssiCmplEvt = FreeRTOS::Semaphore("RssiCmplEvt"); std::map m_servicesMap; std::map m_servicesMapByInstID; - void clearServices(); // Clear any existing services. uint16_t m_mtu = 23; -}; // class BLEDevice + + /*************************************************************************** + * Bluedroid private properties * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + esp_gatt_if_t m_gattc_if; +#endif + + /*************************************************************************** + * NimBLE private properties * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + int m_lastErr; + int32_t m_connectTimeout; + uint8_t m_terminateFailCount; + ble_gap_conn_params m_pConnParams; + mutable BLETaskData *m_pTaskData; +#endif + + /*************************************************************************** + * Common private declarations * + ***************************************************************************/ + + void clearServices(); + + /*************************************************************************** + * Bluedroid private declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + void gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param); +#endif + + /*************************************************************************** + * NimBLE private declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + static void dcTimerCb(ble_npl_event *event); +#endif +}; // class BLEClient /** * @brief Callbacks associated with a %BLE client. */ class BLEClientCallbacks { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + virtual ~BLEClientCallbacks(){}; - virtual void onConnect(BLEClient *pClient) = 0; - virtual void onDisconnect(BLEClient *pClient) = 0; + virtual void onConnect(BLEClient *pClient); + virtual void onDisconnect(BLEClient *pClient); + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + virtual bool onConnParamsUpdateRequest(BLEClient *pClient, const ble_gap_upd_params *params); + virtual uint32_t onPassKeyRequest(); + virtual void onAuthenticationComplete(ble_gap_conn_desc *desc); + virtual bool onConfirmPIN(uint32_t pin); +#endif }; -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ -#endif /* MAIN_BLEDEVICE_H_ */ +#endif /* MAIN_BLECLIENT_H_ */ diff --git a/libraries/BLE/src/BLEConnInfo.h b/libraries/BLE/src/BLEConnInfo.h new file mode 100644 index 00000000000..b81ab93c28f --- /dev/null +++ b/libraries/BLE/src/BLEConnInfo.h @@ -0,0 +1,110 @@ +/* + * Copyright 2020-2025 Ryan Powell and + * esp-nimble-cpp, NimBLE-Arduino contributors. + * + * 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 BLECONNINFO_H_ +#define BLECONNINFO_H_ + +#if defined(CONFIG_NIMBLE_ENABLED) + +#include +#include "BLEAddress.h" + +/** + * @brief Connection information. + */ +class BLEConnInfo { +public: + /** @brief Gets the over-the-air address of the connected peer */ + BLEAddress getAddress() const { + return BLEAddress(m_desc.peer_ota_addr); + } + + /** @brief Gets the ID address of the connected peer */ + BLEAddress getIdAddress() const { + return BLEAddress(m_desc.peer_id_addr); + } + + /** @brief Gets the connection handle (also known as the connection id) of the connected peer */ + uint16_t getConnHandle() const { + return m_desc.conn_handle; + } + + /** @brief Gets the connection interval for this connection (in 1.25ms units) */ + uint16_t getConnInterval() const { + return m_desc.conn_itvl; + } + + /** @brief Gets the supervision timeout for this connection (in 10ms units) */ + uint16_t getConnTimeout() const { + return m_desc.supervision_timeout; + } + + /** @brief Gets the allowable latency for this connection (unit = number of intervals) */ + uint16_t getConnLatency() const { + return m_desc.conn_latency; + } + + /** @brief Gets the maximum transmission unit size for this connection (in bytes) */ + uint16_t getMTU() const { + return ble_att_mtu(m_desc.conn_handle); + } + + /** @brief Check if we are in the master role in this connection */ + bool isMaster() const { + return (m_desc.role == BLE_GAP_ROLE_MASTER); + } + + /** @brief Check if we are in the slave role in this connection */ + bool isSlave() const { + return (m_desc.role == BLE_GAP_ROLE_SLAVE); + } + + /** @brief Check if we are connected to a bonded peer */ + bool isBonded() const { + return (m_desc.sec_state.bonded == 1); + } + + /** @brief Check if the connection in encrypted */ + bool isEncrypted() const { + return (m_desc.sec_state.encrypted == 1); + } + + /** @brief Check if the the connection has been authenticated */ + bool isAuthenticated() const { + return (m_desc.sec_state.authenticated == 1); + } + + /** @brief Gets the key size used to encrypt the connection */ + uint8_t getSecKeySize() const { + return m_desc.sec_state.key_size; + } + +private: + friend class BLEServer; + friend class BLEClient; + friend class BLECharacteristic; + friend class BLEDescriptor; + + ble_gap_conn_desc m_desc{}; + BLEConnInfo(){}; + BLEConnInfo(ble_gap_conn_desc desc) { + m_desc = desc; + } +}; +#endif + +#endif // BLECONNINFO_H_ diff --git a/libraries/BLE/src/BLEDescriptor.cpp b/libraries/BLE/src/BLEDescriptor.cpp index 69a93e57201..51c77bb9b49 100644 --- a/libraries/BLE/src/BLEDescriptor.cpp +++ b/libraries/BLE/src/BLEDescriptor.cpp @@ -3,25 +3,50 @@ * * Created on: Jun 22, 2017 * Author: kolban + * + * Modified on: Apr 3, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + #include #include #include #include #include "sdkconfig.h" #include +#include "BLE2904.h" #include "BLEService.h" #include "BLEDescriptor.h" #include "GeneralUtils.h" #include "esp32-hal-log.h" +/*************************************************************************** + * Common definitions * + ***************************************************************************/ + #define NULL_HANDLE (0xffff) +/*************************************************************************** + * Common global variables * + ***************************************************************************/ + +static BLEDescriptorCallbacks defaultCallbacks; + +/*************************************************************************** + * Common functions * + ***************************************************************************/ + /** * @brief BLEDescriptor constructor. */ @@ -32,13 +57,15 @@ BLEDescriptor::BLEDescriptor(const char *uuid, uint16_t len) : BLEDescriptor(BLE */ BLEDescriptor::BLEDescriptor(BLEUUID uuid, uint16_t max_len) { m_bleUUID = uuid; - m_value.attr_len = 0; // Initial length is 0. - m_value.attr_max_len = max_len; // Maximum length of the data. - m_handle = NULL_HANDLE; // Handle is initially unknown. - m_pCharacteristic = nullptr; // No initial characteristic. - m_pCallback = nullptr; // No initial callback. - + m_handle = NULL_HANDLE; // Handle is initially unknown. + m_pCharacteristic = nullptr; // No initial characteristic. + m_pCallback = nullptr; // No initial callback. + m_value.attr_len = 0; // Initial length is 0. + m_value.attr_max_len = max_len; // Maximum length of the data. m_value.attr_value = (uint8_t *)malloc(max_len); // Allocate storage for the value. +#if CONFIG_NIMBLE_ENABLED + m_removed = 0; +#endif } // BLEDescriptor /** @@ -62,6 +89,7 @@ void BLEDescriptor::executeCreate(BLECharacteristic *pCharacteristic) { m_pCharacteristic = pCharacteristic; // Save the characteristic associated with this service. +#if CONFIG_BLUEDROID_ENABLED esp_attr_control_t control; control.auto_rsp = ESP_GATT_AUTO_RSP; m_semaphoreCreateEvt.take("executeCreate"); @@ -73,6 +101,7 @@ void BLEDescriptor::executeCreate(BLECharacteristic *pCharacteristic) { } m_semaphoreCreateEvt.wait("executeCreate"); +#endif log_v("<< executeCreate"); } // executeCreate @@ -107,6 +136,118 @@ uint8_t *BLEDescriptor::getValue() { return m_value.attr_value; } // getValue +/** + * @brief Get the characteristic this descriptor belongs to. + * @return A pointer to the characteristic this descriptor belongs to. + */ +BLECharacteristic *BLEDescriptor::getCharacteristic() { + return m_pCharacteristic; +} // getCharacteristic + +/** + * @brief Set the callback handlers for this descriptor. + * @param [in] pCallbacks An instance of a callback structure used to define any callbacks for the descriptor. + */ +void BLEDescriptor::setCallbacks(BLEDescriptorCallbacks *pCallback) { + log_v(">> setCallbacks: 0x%x", (uint32_t)pCallback); + if (pCallback != nullptr) { + m_pCallback = pCallback; + } else { + m_pCallback = &defaultCallbacks; + } + log_v("<< setCallbacks"); +} // setCallbacks + +/** + * @brief Set the handle of this descriptor. + * Set the handle of this descriptor to be the supplied value. + * @param [in] handle The handle to be associated with this descriptor. + * @return N/A. + */ +void BLEDescriptor::setHandle(uint16_t handle) { +#if defined(CONFIG_BLUEDROID_ENABLED) + log_v(">> setHandle(0x%.2x): Setting descriptor handle to be 0x%.2x", handle, handle); + m_handle = handle; + log_v("<< setHandle()"); +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + log_w("NimBLE does not support manually setting the handle of a descriptor. Ignoring request."); +#endif +} // setHandle + +/** + * @brief Set the value of the descriptor. + * @param [in] data The data to set for the descriptor. + * @param [in] length The length of the data in bytes. + */ +void BLEDescriptor::setValue(uint8_t *data, size_t length) { + if (length > m_value.attr_max_len) { + log_e("Size %d too large, must be no bigger than %d", length, m_value.attr_max_len); + return; + } + + m_semaphoreSetValue.take(); + m_value.attr_len = length; + memcpy(m_value.attr_value, data, length); +#if CONFIG_BLUEDROID_ENABLED + if (m_handle != NULL_HANDLE) { + esp_ble_gatts_set_attr_value(m_handle, length, (const uint8_t *)data); + log_d("Set the value in the GATTS database using handle 0x%x", m_handle); + } +#endif + m_semaphoreSetValue.give(); +} // setValue + +/** + * @brief Set the value of the descriptor. + * @param [in] value The value of the descriptor in string form. + */ +void BLEDescriptor::setValue(String value) { + setValue((uint8_t *)value.c_str(), value.length()); +} // setValue + +void BLEDescriptor::setAccessPermissions(uint8_t perm) { + m_permissions = perm; +} + +/** + * @brief Return a string representation of the descriptor. + * @return A string representation of the descriptor. + */ +String BLEDescriptor::toString() { + char hex[5]; + snprintf(hex, sizeof(hex), "%04x", m_handle); + String res = "UUID: " + m_bleUUID.toString() + ", handle: 0x" + hex; + return res; +} // toString + +BLEDescriptorCallbacks::~BLEDescriptorCallbacks() {} + +/** + * @brief Callback function to support a read request. + * @param [in] pDescriptor The descriptor that is the source of the event. + */ +void BLEDescriptorCallbacks::onRead(BLEDescriptor *pDescriptor) { + log_d("BLEDescriptorCallbacks", ">> onRead: default"); + log_d("BLEDescriptorCallbacks", "<< onRead"); +} // onRead + +/** + * @brief Callback function to support a write request. + * @param [in] pDescriptor The descriptor that is the source of the event. + */ +void BLEDescriptorCallbacks::onWrite(BLEDescriptor *pDescriptor) { + log_d("BLEDescriptorCallbacks", ">> onWrite: default"); + log_d("BLEDescriptorCallbacks", "<< onWrite"); +} // onWrite + +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + /** * @brief Handle GATT server events for the descripttor. * @param [in] event @@ -185,88 +326,84 @@ void BLEDescriptor::handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_i } // switch event } // handleGATTServerEvent -/** - * @brief Set the callback handlers for this descriptor. - * @param [in] pCallbacks An instance of a callback structure used to define any callbacks for the descriptor. - */ -void BLEDescriptor::setCallbacks(BLEDescriptorCallbacks *pCallback) { - log_v(">> setCallbacks: 0x%x", (uint32_t)pCallback); - m_pCallback = pCallback; - log_v("<< setCallbacks"); -} // setCallbacks +#endif -/** - * @brief Set the handle of this descriptor. - * Set the handle of this descriptor to be the supplied value. - * @param [in] handle The handle to be associated with this descriptor. - * @return N/A. - */ -void BLEDescriptor::setHandle(uint16_t handle) { - log_v(">> setHandle(0x%.2x): Setting descriptor handle to be 0x%.2x", handle, handle); - m_handle = handle; - log_v("<< setHandle()"); -} // setHandle +/*************************************************************************** + * NimBLE functions * + ***************************************************************************/ -/** - * @brief Set the value of the descriptor. - * @param [in] data The data to set for the descriptor. - * @param [in] length The length of the data in bytes. - */ -void BLEDescriptor::setValue(uint8_t *data, size_t length) { - 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; - } - m_value.attr_len = length; - memcpy(m_value.attr_value, data, length); - if (m_handle != NULL_HANDLE) { - esp_ble_gatts_set_attr_value(m_handle, length, (const uint8_t *)data); - log_d("Set the value in the GATTS database using handle 0x%x", m_handle); - } -} // setValue +#if defined(CONFIG_NIMBLE_ENABLED) /** - * @brief Set the value of the descriptor. - * @param [in] value The value of the descriptor in string form. + * @brief Handle GATT server events for the descriptor. + * @param [in] conn_handle The connection handle. + * @param [in] attr_handle The attribute handle. + * @param [in] ctxt The GATT access context. + * @param [in] arg The argument. */ -void BLEDescriptor::setValue(String value) { - setValue((uint8_t *)value.c_str(), value.length()); -} // setValue +int BLEDescriptor::handleGATTServerEvent(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { + const ble_uuid_t *uuid; + int rc; + struct ble_gap_conn_desc desc; + BLEDescriptor *pDescriptor = (BLEDescriptor *)arg; + + log_d("Descriptor %s %s event", pDescriptor->getUUID().toString().c_str(), ctxt->op == BLE_GATT_ACCESS_OP_READ_DSC ? "Read" : "Write"); + + uuid = ctxt->chr->uuid; + if (ble_uuid_cmp(uuid, &pDescriptor->getUUID().getNative()->u) == 0) { + switch (ctxt->op) { + case BLE_GATT_ACCESS_OP_READ_DSC: + { + rc = ble_gap_conn_find(conn_handle, &desc); + assert(rc == 0); + + // If the packet header is only 8 bytes this is a follow up of a long read + // so we don't want to call the onRead() callback again. + if (ctxt->om->om_pkthdr_len > 8 || pDescriptor->m_value.attr_len <= (ble_att_mtu(desc.conn_handle) - 3)) { + pDescriptor->m_pCallback->onRead(pDescriptor); + } -void BLEDescriptor::setAccessPermissions(esp_gatt_perm_t perm) { - m_permissions = perm; -} + ble_npl_hw_enter_critical(); + rc = os_mbuf_append(ctxt->om, pDescriptor->m_value.attr_value, pDescriptor->m_value.attr_len); + ble_npl_hw_exit_critical(0); + return rc == 0 ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES; + } -/** - * @brief Return a string representation of the descriptor. - * @return A string representation of the descriptor. - */ -String BLEDescriptor::toString() { - char hex[5]; - snprintf(hex, sizeof(hex), "%04x", m_handle); - String res = "UUID: " + m_bleUUID.toString() + ", handle: 0x" + hex; - return res; -} // toString + case BLE_GATT_ACCESS_OP_WRITE_DSC: + { + uint16_t att_max_len = pDescriptor->m_value.attr_max_len; -BLEDescriptorCallbacks::~BLEDescriptorCallbacks() {} + if (ctxt->om->om_len > att_max_len) { + return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN; + } -/** - * @brief Callback function to support a read request. - * @param [in] pDescriptor The descriptor that is the source of the event. - */ -void BLEDescriptorCallbacks::onRead(BLEDescriptor *pDescriptor) { - log_d("BLEDescriptorCallbacks", ">> onRead: default"); - log_d("BLEDescriptorCallbacks", "<< onRead"); -} // onRead + uint8_t buf[att_max_len]; + size_t len = ctxt->om->om_len; + memcpy(buf, ctxt->om->om_data, len); + os_mbuf *next; + next = SLIST_NEXT(ctxt->om, om_next); + while (next != NULL) { + if ((len + next->om_len) > att_max_len) { + return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN; + } + memcpy(&buf[len], next->om_data, next->om_len); + len += next->om_len; + next = SLIST_NEXT(next, om_next); + } -/** - * @brief Callback function to support a write request. - * @param [in] pDescriptor The descriptor that is the source of the event. - */ -void BLEDescriptorCallbacks::onWrite(BLEDescriptor *pDescriptor) { - log_d("BLEDescriptorCallbacks", ">> onWrite: default"); - log_d("BLEDescriptorCallbacks", "<< onWrite"); -} // onWrite + pDescriptor->setValue(buf, len); + pDescriptor->m_pCallback->onWrite(pDescriptor); + return 0; + } + + default: break; + } + } + + return BLE_ATT_ERR_UNLIKELY; +} + +#endif -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEDescriptor.h b/libraries/BLE/src/BLEDescriptor.h index e155a1f2971..d0d34b24388 100644 --- a/libraries/BLE/src/BLEDescriptor.h +++ b/libraries/BLE/src/BLEDescriptor.h @@ -3,6 +3,10 @@ * * Created on: Jun 22, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLEDESCRIPTOR_H_ @@ -11,13 +15,60 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + #include #include "BLEUUID.h" #include "BLECharacteristic.h" -#include #include "RTOS.h" +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#endif + +/*************************************************************************** + * NimBLE includes * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#include "BLEConnInfo.h" + +#define ESP_GATT_PERM_READ BLE_ATT_F_READ +#define ESP_GATT_PERM_WRITE BLE_ATT_F_WRITE +#define ESP_GATT_PERM_READ_ENCRYPTED BLE_ATT_F_READ_ENC +#define ESP_GATT_PERM_WRITE_ENCRYPTED BLE_ATT_F_WRITE_ENC +#define ESP_GATT_PERM_READ_AUTHORIZATION BLE_ATT_F_READ_AUTHOR +#define ESP_GATT_PERM_WRITE_AUTHORIZATION BLE_ATT_F_WRITE_AUTHOR +#define ESP_GATT_PERM_READ_ENC_MITM BLE_ATT_F_READ_AUTHEN +#define ESP_GATT_PERM_WRITE_ENC_MITM BLE_ATT_F_WRITE_AUTHEN + +#endif + +/*************************************************************************** + * NimBLE types * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +typedef struct { + uint16_t attr_max_len; /*!< attribute max value length */ + uint16_t attr_len; /*!< attribute current value length */ + uint8_t *attr_value; /*!< the pointer to attribute value */ +} esp_attr_value_t; +#endif + +/*************************************************************************** + * Forward declarations * + ***************************************************************************/ + class BLEService; class BLECharacteristic; class BLEDescriptorCallbacks; @@ -27,33 +78,83 @@ class BLEDescriptorCallbacks; */ class BLEDescriptor { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + BLEDescriptor(const char *uuid, uint16_t max_len = 100); BLEDescriptor(BLEUUID uuid, uint16_t max_len = 100); virtual ~BLEDescriptor(); - uint16_t getHandle(); // Get the handle of the descriptor. - size_t getLength(); // Get the length of the value of the descriptor. - BLEUUID getUUID(); // Get the UUID of the descriptor. - uint8_t *getValue(); // Get a pointer to the value of the descriptor. - void handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); + uint16_t getHandle(); // Get the handle of the descriptor. + size_t getLength(); // Get the length of the value of the descriptor. + BLEUUID getUUID(); // Get the UUID of the descriptor. + uint8_t *getValue(); // Get a pointer to the value of the descriptor. + BLECharacteristic *getCharacteristic(); // Get the characteristic that this descriptor belongs to. - void setAccessPermissions(esp_gatt_perm_t perm); // Set the permissions of the descriptor. + void setAccessPermissions(uint8_t perm); // Set the permissions of the descriptor. void setCallbacks(BLEDescriptorCallbacks *pCallbacks); // Set callbacks to be invoked for the descriptor. void setValue(uint8_t *data, size_t size); // Set the value of the descriptor as a pointer to data. void setValue(String value); // Set the value of the descriptor as a data buffer. String toString(); // Convert the descriptor to a string representation. + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + void handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + static int handleGATTServerEvent(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg); +#endif + private: friend class BLEDescriptorMap; friend class BLECharacteristic; + friend class BLEService; + friend class BLE2901; + friend class BLE2902; + friend class BLE2904; + + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + BLEUUID m_bleUUID; uint16_t m_handle; + esp_attr_value_t m_value; BLEDescriptorCallbacks *m_pCallback; BLECharacteristic *m_pCharacteristic; - esp_gatt_perm_t m_permissions = ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE; + FreeRTOS::Semaphore m_semaphoreSetValue = FreeRTOS::Semaphore("SetValue"); + + /*************************************************************************** + * Bluedroid private properties * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) FreeRTOS::Semaphore m_semaphoreCreateEvt = FreeRTOS::Semaphore("CreateEvt"); - esp_attr_value_t m_value; + uint8_t m_permissions = ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE; +#endif + + /*************************************************************************** + * NimBLE private properties * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + uint8_t m_permissions = HA_FLAG_PERM_RW; + uint8_t m_removed = 0; +#endif + + /*************************************************************************** + * Common private declarations * + ***************************************************************************/ void executeCreate(BLECharacteristic *pCharacteristic); void setHandle(uint16_t handle); @@ -68,11 +169,15 @@ class BLEDescriptor { */ class BLEDescriptorCallbacks { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + virtual ~BLEDescriptorCallbacks(); virtual void onRead(BLEDescriptor *pDescriptor); virtual void onWrite(BLEDescriptor *pDescriptor); }; -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLEDESCRIPTOR_H_ */ diff --git a/libraries/BLE/src/BLEDescriptorMap.cpp b/libraries/BLE/src/BLEDescriptorMap.cpp index 732fb62cdcf..e0c8b3a7cc3 100644 --- a/libraries/BLE/src/BLEDescriptorMap.cpp +++ b/libraries/BLE/src/BLEDescriptorMap.cpp @@ -3,21 +3,50 @@ * * Created on: Jun 22, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + #include #include #include "BLECharacteristic.h" #include "BLEDescriptor.h" -#include // ESP32 BLE #ifdef ARDUINO_ARCH_ESP32 #include "esp32-hal-log.h" #endif +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include // ESP32 BLE +#endif + +/*************************************************************************** + * NimBLE includes * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include "host/ble_gatt.h" +#endif + +/*************************************************************************** + * Common functions * + ***************************************************************************/ + /** * @brief Return the descriptor by UUID. * @param [in] UUID The UUID to look up the descriptor. @@ -81,6 +110,24 @@ void BLEDescriptorMap::setByHandle(uint16_t handle, BLEDescriptor *pDescriptor) m_handleMap.insert(std::pair(handle, pDescriptor)); } // setByHandle +/** + * @brief Get the number of registered descriptors. + * @return The number of registered descriptors. + */ +int BLEDescriptorMap::getRegisteredDescriptorCount() { + return m_uuidMap.size(); +} + +/** + * @brief Remove a descriptor from the map. + * @param [in] pDescriptor The descriptor to remove. + * @return N/A. + */ +void BLEDescriptorMap::removeDescriptor(BLEDescriptor *pDescriptor) { + m_uuidMap.erase(pDescriptor); + m_handleMap.erase(pDescriptor->getHandle()); +} + /** * @brief Return a string representation of the descriptor map. * @return A string representation of the descriptor map. @@ -102,19 +149,6 @@ String BLEDescriptorMap::toString() { return res; } // toString -/** - * @brief Pass the GATT server event onwards to each of the descriptors found in the mapping - * @param [in] event - * @param [in] gatts_if - * @param [in] param - */ -void BLEDescriptorMap::handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { - // Invoke the handler for every descriptor we have. - for (auto &myPair : m_uuidMap) { - myPair.first->handleGATTServerEvent(event, gatts_if, param); - } -} // handleGATTServerEvent - /** * @brief Get the first descriptor in the map. * @return The first descriptor in the map. @@ -142,5 +176,41 @@ BLEDescriptor *BLEDescriptorMap::getNext() { return pRet; } // getNext -#endif /* CONFIG_BLUEDROID_ENABLED */ +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + +/** + * @brief Pass the GATT server event onwards to each of the descriptors found in the mapping + * @param [in] event + * @param [in] gatts_if + * @param [in] param + */ +void BLEDescriptorMap::handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { + // Invoke the handler for every descriptor we have. + for (auto &myPair : m_uuidMap) { + myPair.first->handleGATTServerEvent(event, gatts_if, param); + } +} // handleGATTServerEvent + +#endif + +/*************************************************************************** + * NimBLE functions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + +void BLEDescriptorMap::handleGATTServerEvent(uint16_t conn_handle, uint16_t attr_handle, ble_gatt_access_ctxt *ctxt, void *arg) { + // Invoke the handler for every descriptor we have. + for (auto &myPair : m_uuidMap) { + myPair.first->handleGATTServerEvent(conn_handle, attr_handle, ctxt, arg); + } +} + +#endif + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEDevice.cpp b/libraries/BLE/src/BLEDevice.cpp index 186b36d6a33..014806cc32b 100644 --- a/libraries/BLE/src/BLEDevice.cpp +++ b/libraries/BLE/src/BLEDevice.cpp @@ -1,30 +1,35 @@ /* - * BLE.cpp + * BLEDevice.cpp * * Created on: Mar 16, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + #include #include #include #include #include -#include // ESP32 BLE -#include // ESP32 BLE -#include // ESP32 BLE -#include // ESP32 BLE -#include // ESP32 BLE -#include // ESP32 BLE -#include // ESP32 BLE -#include // ESP32 ESP-IDF -#include // Part of C++ Standard library -#include // Part of C++ Standard library -#include // Part of C++ Standard library +#include + +#include +#include +#include +#include #include "BLEDevice.h" #include "BLEClient.h" @@ -37,34 +42,102 @@ #include "esp32-hal-log.h" +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#include +#include +#include +#include +#include +#endif + +/*************************************************************************** + * NimBLE includes * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#ifdef CONFIG_BT_NIMBLE_LEGACY_VHCI_ENABLE +#include +#endif +#include +#include +#include +#include +#include +#include "host/ble_hs_pvcy.h" +#include "host/util/util.h" +#include "services/gap/ble_svc_gap.h" +#include "services/gatt/ble_svc_gatt.h" +#endif + +/*************************************************************************** + * Common properties * + ***************************************************************************/ + /** * Singletons for the BLEDevice. */ BLEServer *BLEDevice::m_pServer = nullptr; BLEScan *BLEDevice::m_pScan = nullptr; BLEClient *BLEDevice::m_pClient = nullptr; -bool initialized = false; -esp_ble_sec_act_t BLEDevice::m_securityLevel = (esp_ble_sec_act_t)0; +static bool initialized = false; BLESecurityCallbacks *BLEDevice::m_securityCallbacks = nullptr; uint16_t BLEDevice::m_localMTU = 23; // not sure if this variable is useful BLEAdvertising *BLEDevice::m_bleAdvertising = nullptr; uint16_t BLEDevice::m_appId = 0; std::map BLEDevice::m_connectedClientsMap; gap_event_handler BLEDevice::m_customGapHandler = nullptr; + +/*************************************************************************** + * Bluedroid properties * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +esp_ble_sec_act_t BLEDevice::m_securityLevel = (esp_ble_sec_act_t)0; gattc_event_handler BLEDevice::m_customGattcHandler = nullptr; gatts_event_handler BLEDevice::m_customGattsHandler = nullptr; +#endif + +/*************************************************************************** + * NimBLE properties * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +ble_gap_event_listener BLEDevice::m_listener; +BLEDeviceCallbacks BLEDevice::defaultDeviceCallbacks{}; +BLEDeviceCallbacks *BLEDevice::m_pDeviceCallbacks = &defaultDeviceCallbacks; +uint8_t BLEDevice::m_ownAddrType = BLE_OWN_ADDR_PUBLIC; +bool BLEDevice::m_synced = false; +#endif + +/*************************************************************************** + * Common functions * + ***************************************************************************/ /** * @brief Create a new instance of a client. * @return A new instance of the client. */ -/* STATIC */ BLEClient *BLEDevice::createClient() { +BLEClient *BLEDevice::createClient() { log_v(">> createClient"); -#ifndef CONFIG_GATTC_ENABLE // Check that BLE GATTC is enabled in make menuconfig - log_e("BLE GATTC is not enabled - CONFIG_GATTC_ENABLE not defined"); +#if !defined(CONFIG_GATTC_ENABLE) && !defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) + log_e("BLE Client not enabled. Check CONFIG_GATTC_ENABLE for BlueDroid or CONFIG_BT_NIMBLE_ROLE_CENTRAL for NimBLE"); abort(); #endif // CONFIG_GATTC_ENABLE - m_pClient = new BLEClient(); + +#ifdef CONFIG_NIMBLE_ENABLED + if (m_connectedClientsMap.size() >= CONFIG_BT_NIMBLE_MAX_CONNECTIONS) { + log_e("Unable to create client. Max connections reached. Cur=%d Max=%d", m_connectedClientsMap.size(), CONFIG_BT_NIMBLE_MAX_CONNECTIONS); + m_pClient = nullptr; + } else +#endif + { + m_pClient = new BLEClient(); + } log_v("<< createClient"); return m_pClient; } // createClient @@ -73,200 +146,45 @@ gatts_event_handler BLEDevice::m_customGattsHandler = nullptr; * @brief Create a new instance of a server. * @return A new instance of the server. */ -/* STATIC */ BLEServer *BLEDevice::createServer() { +BLEServer *BLEDevice::createServer() { log_v(">> createServer"); -#ifndef CONFIG_GATTS_ENABLE // Check that BLE GATTS is enabled in make menuconfig - log_e("BLE GATTS is not enabled - CONFIG_GATTS_ENABLE not defined"); +#if !defined(CONFIG_GATTS_ENABLE) && !defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) + log_e("BLE Server not enabled. Check CONFIG_GATTS_ENABLE for BlueDroid or CONFIG_BT_NIMBLE_ROLE_PERIPHERAL for NimBLE"); abort(); #endif // CONFIG_GATTS_ENABLE - m_pServer = new BLEServer(); - m_pServer->createApp(m_appId++); + + if (m_pServer == nullptr) { + m_pServer = new BLEServer(); + m_pServer->createApp(m_appId++); +#if defined(CONFIG_NIMBLE_ENABLED) + ble_gatts_reset(); + ble_svc_gap_init(); + ble_svc_gatt_init(); +#endif + } log_v("<< createServer"); return m_pServer; } // createServer -/** - * @brief Handle GATT server events. - * - * @param [in] event The event that has been newly received. - * @param [in] gatts_if The connection to the GATT interface. - * @param [in] param Parameters for the event. - */ -/* STATIC */ void BLEDevice::gattServerEventHandler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { - log_d("gattServerEventHandler [esp_gatt_if: %d] ... %s", gatts_if, BLEUtils::gattServerEventTypeToString(event).c_str()); - - BLEUtils::dumpGattServerEvent(event, gatts_if, param); - - switch (event) { - case ESP_GATTS_CONNECT_EVT: - { -#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig - if (BLEDevice::m_securityLevel) { - esp_ble_set_encryption(param->connect.remote_bda, BLEDevice::m_securityLevel); - } -#endif // CONFIG_BLE_SMP_ENABLE - break; - } // ESP_GATTS_CONNECT_EVT - - default: - { - break; - } - } // switch - - if (BLEDevice::m_pServer != nullptr) { - BLEDevice::m_pServer->handleGATTServerEvent(event, gatts_if, param); - } - - if (m_customGattsHandler != nullptr) { - m_customGattsHandler(event, gatts_if, param); - } - -} // gattServerEventHandler - -/** - * @brief Handle GATT client events. - * - * Handler for the GATT client events. - * - * @param [in] event - * @param [in] gattc_if - * @param [in] param - */ -/* STATIC */ void BLEDevice::gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param) { - - log_d("gattClientEventHandler [esp_gatt_if: %d] ... %s", gattc_if, BLEUtils::gattClientEventTypeToString(event).c_str()); - BLEUtils::dumpGattClientEvent(event, gattc_if, param); - - switch (event) { - case ESP_GATTC_CONNECT_EVT: - { -#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig - if (BLEDevice::m_securityLevel) { - esp_ble_set_encryption(param->connect.remote_bda, BLEDevice::m_securityLevel); - } -#endif // CONFIG_BLE_SMP_ENABLE - break; - } // ESP_GATTS_CONNECT_EVT - - default: break; - } // switch - for (auto &myPair : BLEDevice::getPeerDevices(true)) { - conn_status_t conn_status = (conn_status_t)myPair.second; - if (((BLEClient *)conn_status.peer_device)->getGattcIf() == gattc_if || ((BLEClient *)conn_status.peer_device)->getGattcIf() == ESP_GATT_IF_NONE - || gattc_if == ESP_GATT_IF_NONE) { - ((BLEClient *)conn_status.peer_device)->gattClientEventHandler(event, gattc_if, param); - } - } - - if (m_customGattcHandler != nullptr) { - m_customGattcHandler(event, gattc_if, param); - } - -} // gattClientEventHandler - -/** - * @brief Handle GAP events. - */ -/* STATIC */ void BLEDevice::gapEventHandler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { - - BLEUtils::dumpGapEvent(event, param); - - switch (event) { - - case ESP_GAP_BLE_OOB_REQ_EVT: /* OOB request event */ log_i("ESP_GAP_BLE_OOB_REQ_EVT"); break; - case ESP_GAP_BLE_LOCAL_IR_EVT: /* BLE local IR event */ log_i("ESP_GAP_BLE_LOCAL_IR_EVT"); break; - case ESP_GAP_BLE_LOCAL_ER_EVT: /* BLE local ER event */ log_i("ESP_GAP_BLE_LOCAL_ER_EVT"); break; - case ESP_GAP_BLE_NC_REQ_EVT: /* NUMERIC CONFIRMATION */ log_i("ESP_GAP_BLE_NC_REQ_EVT"); -#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig - if (BLEDevice::m_securityCallbacks != nullptr) { - esp_ble_confirm_reply(param->ble_security.ble_req.bd_addr, BLEDevice::m_securityCallbacks->onConfirmPIN(param->ble_security.key_notif.passkey)); - } -#endif // CONFIG_BLE_SMP_ENABLE - break; - case ESP_GAP_BLE_PASSKEY_REQ_EVT: /* passkey request event */ - log_i("ESP_GAP_BLE_PASSKEY_REQ_EVT: "); - // esp_log_buffer_hex(m_remote_bda, sizeof(m_remote_bda)); -#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig - if (BLEDevice::m_securityCallbacks != nullptr) { - esp_ble_passkey_reply(param->ble_security.ble_req.bd_addr, true, BLEDevice::m_securityCallbacks->onPassKeyRequest()); - } -#endif // CONFIG_BLE_SMP_ENABLE - break; - /* - * TODO should we add white/black list comparison? - */ - case ESP_GAP_BLE_SEC_REQ_EVT: - /* send the positive(true) security response to the peer device to accept the security request. - If not accept the security request, should sent the security response with negative(false) accept value*/ - log_i("ESP_GAP_BLE_SEC_REQ_EVT"); -#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig - if (BLEDevice::m_securityCallbacks != nullptr) { - esp_ble_gap_security_rsp(param->ble_security.ble_req.bd_addr, BLEDevice::m_securityCallbacks->onSecurityRequest()); - } else { - esp_ble_gap_security_rsp(param->ble_security.ble_req.bd_addr, true); - } -#endif // CONFIG_BLE_SMP_ENABLE - break; - /* - * - */ - case ESP_GAP_BLE_PASSKEY_NOTIF_EVT: //the app will receive this evt when the IO has Output capability and the peer device IO has Input capability. - //display the passkey number to the user to input it in the peer device within 30 seconds - log_i("ESP_GAP_BLE_PASSKEY_NOTIF_EVT"); -#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig - log_i("passKey = %d", param->ble_security.key_notif.passkey); - if (BLEDevice::m_securityCallbacks != nullptr) { - BLEDevice::m_securityCallbacks->onPassKeyNotify(param->ble_security.key_notif.passkey); - } -#endif // CONFIG_BLE_SMP_ENABLE - break; - case ESP_GAP_BLE_KEY_EVT: - //shows the ble key type info share with peer device to the user. - log_d("ESP_GAP_BLE_KEY_EVT"); -#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig - log_i("key type = %s", BLESecurity::esp_key_type_to_str(param->ble_security.ble_key.key_type)); -#endif // CONFIG_BLE_SMP_ENABLE - break; - case ESP_GAP_BLE_AUTH_CMPL_EVT: log_i("ESP_GAP_BLE_AUTH_CMPL_EVT"); -#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig - if (BLEDevice::m_securityCallbacks != nullptr) { - BLEDevice::m_securityCallbacks->onAuthenticationComplete(param->ble_security.auth_cmpl); - } -#endif // CONFIG_BLE_SMP_ENABLE - break; - default: - { - break; - } - } // switch - - if (BLEDevice::m_pClient != nullptr) { - BLEDevice::m_pClient->handleGAPEvent(event, param); - } - - if (BLEDevice::m_pScan != nullptr) { - BLEDevice::getScan()->handleGAPEvent(event, param); - } - - if (m_bleAdvertising != nullptr) { - BLEDevice::getAdvertising()->handleGAPEvent(event, param); - } - - if (m_customGapHandler != nullptr) { - BLEDevice::m_customGapHandler(event, param); - } - -} // gapEventHandler - /** * @brief Get the BLE device address. * @return The BLE device address. */ -/* STATIC*/ BLEAddress BLEDevice::getAddress() { +BLEAddress BLEDevice::getAddress() { +#if defined(CONFIG_BLUEDROID_ENABLED) const uint8_t *bdAddr = esp_bt_dev_get_address(); esp_bd_addr_t addr; memcpy(addr, bdAddr, sizeof(addr)); +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + ble_addr_t addr; + int ret = ble_hs_id_copy_addr(m_ownAddrType, addr.val, NULL); + if (ret != 0) { + log_e("No BLE address found. rc=%d", ret); + return BLEAddress(); + } +#endif return BLEAddress(addr); } // getAddress @@ -275,7 +193,7 @@ gatts_event_handler BLEDevice::m_customGattsHandler = nullptr; * @return The scanning object reference. This is a singleton object. The caller should not * try and release/delete it. */ -/* STATIC */ BLEScan *BLEDevice::getScan() { +BLEScan *BLEDevice::getScan() { //log_v(">> getScan"); if (m_pScan == nullptr) { m_pScan = new BLEScan(); @@ -285,13 +203,21 @@ gatts_event_handler BLEDevice::m_customGattsHandler = nullptr; return m_pScan; } // getScan +/** + * @brief Retrieve the server object + * @return The server object + */ +BLEServer *BLEDevice::getServer() { + return m_pServer; +} // getServer + /** * @brief Get the value of a characteristic of a service on a remote device. * @param [in] bdAddress * @param [in] serviceUUID * @param [in] characteristicUUID */ -/* STATIC */ String BLEDevice::getValue(BLEAddress bdAddress, BLEUUID serviceUUID, BLEUUID characteristicUUID) { +String BLEDevice::getValue(BLEAddress bdAddress, BLEUUID serviceUUID, BLEUUID characteristicUUID) { log_v( ">> getValue: bdAddress: %s, serviceUUID: %s, characteristicUUID: %s", bdAddress.toString().c_str(), serviceUUID.toString().c_str(), characteristicUUID.toString().c_str() @@ -308,18 +234,25 @@ gatts_event_handler BLEDevice::m_customGattsHandler = nullptr; * @brief Initialize the %BLE environment. * @param deviceName The device name of the device. */ -/* STATIC */ void BLEDevice::init(String deviceName) { +void BLEDevice::init(String deviceName) { if (!initialized) { - initialized = true; // Set the initialization flag to ensure we are only initialized once. - esp_err_t errRc = ESP_OK; -#ifdef ARDUINO_ARCH_ESP32 +#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(ARDUINO_ARCH_ESP32) if (!btStart()) { errRc = ESP_FAIL; return; } #else - errRc = ::nvs_flash_init(); + btStarted(); + errRc = nvs_flash_init(); + if (errRc == ESP_ERR_NVS_NO_FREE_PAGES || errRc == ESP_ERR_NVS_NEW_VERSION_FOUND) { + errRc = nvs_flash_erase(); + if (errRc == ESP_OK) { + errRc = nvs_flash_init(); + } + } + if (errRc != ESP_OK) { log_e("nvs_flash_init: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); return; @@ -328,6 +261,7 @@ gatts_event_handler BLEDevice::m_customGattsHandler = nullptr; #ifndef CONFIG_BT_CLASSIC_ENABLED esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT); #endif + esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); errRc = esp_bt_controller_init(&bt_cfg); if (errRc != ESP_OK) { @@ -348,7 +282,7 @@ gatts_event_handler BLEDevice::m_customGattsHandler = nullptr; return; } #endif -#endif +#endif // !ARDUINO_ARCH_ESP32 esp_bluedroid_status_t bt_state = esp_bluedroid_get_status(); if (bt_state == ESP_BLUEDROID_STATUS_UNINITIALIZED) { @@ -403,6 +337,45 @@ gatts_event_handler BLEDevice::m_customGattsHandler = nullptr; return; }; #endif // CONFIG_BLE_SMP_ENABLE +#endif // CONFIG_BLUEDROID_ENABLED + +#if defined(CONFIG_NIMBLE_ENABLED) + errRc = nimble_port_init(); + if (errRc != ESP_OK) { + log_e("nimble_port_init: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + return; + } + + // Global struct ble_hs_cfg from nimble/host/ble_hs.h needs to be initialized + ble_hs_cfg.reset_cb = BLEDevice::onReset; + ble_hs_cfg.sync_cb = BLEDevice::onSync; + ble_hs_cfg.store_status_cb = [](struct ble_store_status_event *event, void *arg) { + return m_pDeviceCallbacks->onStoreStatus(event, arg); + }; + ble_hs_cfg.sm_io_cap = BLE_HS_IO_NO_INPUT_OUTPUT; + ble_hs_cfg.sm_bonding = 0; + ble_hs_cfg.sm_mitm = 0; + ble_hs_cfg.sm_sc = 1; + ble_hs_cfg.sm_our_key_dist = BLE_SM_PAIR_KEY_DIST_ENC; + ble_hs_cfg.sm_their_key_dist = BLE_SM_PAIR_KEY_DIST_ENC; +#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) + ble_hs_cfg.sm_our_key_dist |= BLE_SM_PAIR_KEY_DIST_ID; + ble_hs_cfg.sm_their_key_dist |= BLE_SM_PAIR_KEY_DIST_ID; +#endif + + errRc = ble_svc_gap_device_name_set(deviceName.c_str()); + if (errRc != ESP_OK) { + log_e("ble_svc_gap_device_name_set: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + } + + ble_store_config_init(); + nimble_port_freertos_init(BLEDevice::host_task); + + while (!m_synced) { + ble_npl_time_delay(1); + } +#endif // CONFIG_NIMBLE_ENABLED + initialized = true; // Set the initialization flag to ensure we are only initialized once. } vTaskDelay(200 / portTICK_PERIOD_MS); // Delay for 200 msecs as a workaround to an apparent Arduino environment issue. } // init @@ -435,7 +408,7 @@ gatts_event_handler BLEDevice::m_customGattsHandler = nullptr; * @param [in] powerType. * @param [in] powerLevel. */ -/* STATIC */ void BLEDevice::setPower(esp_power_level_t powerLevel, esp_ble_power_type_t powerType) { +void BLEDevice::setPower(esp_power_level_t powerLevel, esp_ble_power_type_t powerType) { log_v(">> setPower: %d (type: %d)", powerLevel, powerType); esp_err_t errRc = ::esp_ble_tx_power_set(powerType, powerLevel); if (errRc != ESP_OK) { @@ -444,13 +417,45 @@ gatts_event_handler BLEDevice::m_customGattsHandler = nullptr; log_v("<< setPower"); } // setPower +/** + * @brief Get the transmission power. + * @param [in] powerType The power level to set, can be one of: + * * ESP_BLE_PWR_TYPE_CONN_HDL0 = 0, For connection handle 0 + * * ESP_BLE_PWR_TYPE_CONN_HDL1 = 1, For connection handle 1 + * * ESP_BLE_PWR_TYPE_CONN_HDL2 = 2, For connection handle 2 + * * ESP_BLE_PWR_TYPE_CONN_HDL3 = 3, For connection handle 3 + * * ESP_BLE_PWR_TYPE_CONN_HDL4 = 4, For connection handle 4 + * * ESP_BLE_PWR_TYPE_CONN_HDL5 = 5, For connection handle 5 + * * ESP_BLE_PWR_TYPE_CONN_HDL6 = 6, For connection handle 6 + * * ESP_BLE_PWR_TYPE_CONN_HDL7 = 7, For connection handle 7 + * * ESP_BLE_PWR_TYPE_CONN_HDL8 = 8, For connection handle 8 + * * ESP_BLE_PWR_TYPE_ADV = 9, For advertising + * * ESP_BLE_PWR_TYPE_SCAN = 10, For scan + * * ESP_BLE_PWR_TYPE_DEFAULT = 11, For default, if not set other, it will use default value + * @return the power level currently used by the type specified. + */ + +int BLEDevice::getPower(esp_ble_power_type_t powerType) { + switch (esp_ble_tx_power_get(powerType)) { + case ESP_PWR_LVL_N12: return -12; + case ESP_PWR_LVL_N9: return -9; + case ESP_PWR_LVL_N6: return -6; + case ESP_PWR_LVL_N3: return -6; + case ESP_PWR_LVL_N0: return 0; + case ESP_PWR_LVL_P3: return 3; + case ESP_PWR_LVL_P6: return 6; + case ESP_PWR_LVL_P9: return 9; + default: return -128; + } +} // getPower + /** * @brief Set the value of a characteristic of a service on a remote device. * @param [in] bdAddress * @param [in] serviceUUID * @param [in] characteristicUUID */ -/* STATIC */ void BLEDevice::setValue(BLEAddress bdAddress, BLEUUID serviceUUID, BLEUUID characteristicUUID, String value) { +void BLEDevice::setValue(BLEAddress bdAddress, BLEUUID serviceUUID, BLEUUID characteristicUUID, String value) { log_v( ">> setValue: bdAddress: %s, serviceUUID: %s, characteristicUUID: %s", bdAddress.toString().c_str(), serviceUUID.toString().c_str(), characteristicUUID.toString().c_str() @@ -465,7 +470,7 @@ gatts_event_handler BLEDevice::m_customGattsHandler = nullptr; * @brief Return a string representation of the nature of this device. * @return A string representation of the nature of this device. */ -/* STATIC */ String BLEDevice::toString() { +String BLEDevice::toString() { String res = "BD Address: " + getAddress().toString(); return res; } // toString @@ -476,14 +481,27 @@ gatts_event_handler BLEDevice::m_customGattsHandler = nullptr; */ void BLEDevice::whiteListAdd(BLEAddress address) { log_v(">> whiteListAdd: %s", address.toString().c_str()); +#ifdef CONFIG_BLUEDROID_ENABLED #ifdef ESP_IDF_VERSION_MAJOR - esp_err_t errRc = esp_ble_gap_update_whitelist(true, *address.getNative(), BLE_WL_ADDR_TYPE_PUBLIC); // HACK!!! True to add an entry. + esp_err_t errRc = esp_ble_gap_update_whitelist(true, address.getNative(), BLE_WL_ADDR_TYPE_PUBLIC); // HACK!!! True to add an entry. #else - esp_err_t errRc = esp_ble_gap_update_whitelist(true, *address.getNative()); // True to add an entry. + esp_err_t errRc = esp_ble_gap_update_whitelist(true, address.getNative()); // True to add an entry. #endif if (errRc != ESP_OK) { log_e("esp_ble_gap_update_whitelist: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); } +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + if (!BLEDevice::onWhiteList(address)) { + m_whiteList.push_back(address); + int errRc = ble_gap_wl_set(reinterpret_cast(&m_whiteList[0]), m_whiteList.size()); + if (errRc != 0) { + log_e("Failed adding to whitelist rc=%d", errRc); + m_whiteList.pop_back(); + } + } +#endif log_v("<< whiteListAdd"); } // whiteListAdd @@ -493,28 +511,36 @@ void BLEDevice::whiteListAdd(BLEAddress address) { */ void BLEDevice::whiteListRemove(BLEAddress address) { log_v(">> whiteListRemove: %s", address.toString().c_str()); +#ifdef CONFIG_BLUEDROID_ENABLED #ifdef ESP_IDF_VERSION_MAJOR - esp_err_t errRc = esp_ble_gap_update_whitelist(false, *address.getNative(), BLE_WL_ADDR_TYPE_PUBLIC); // HACK!!! False to remove an entry. + esp_err_t errRc = esp_ble_gap_update_whitelist(false, address.getNative(), BLE_WL_ADDR_TYPE_PUBLIC); // HACK!!! False to remove an entry. #else - esp_err_t errRc = esp_ble_gap_update_whitelist(false, *address.getNative()); // False to remove an entry. + esp_err_t errRc = esp_ble_gap_update_whitelist(false, address.getNative()); // False to remove an entry. #endif if (errRc != ESP_OK) { log_e("esp_ble_gap_update_whitelist: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); } +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + for (auto it = m_whiteList.begin(); it < m_whiteList.end(); ++it) { + if (*it == address) { + m_whiteList.erase(it); + int errRc = ble_gap_wl_set(reinterpret_cast(&m_whiteList[0]), m_whiteList.size()); + if (errRc != 0) { + m_whiteList.push_back(address); + log_e("Failed removing from whitelist rc=%d", errRc); + } + std::vector(m_whiteList).swap(m_whiteList); + } + } +#endif log_v("<< whiteListRemove"); } // whiteListRemove /* - * @brief Set encryption level that will be negotiated with peer device durng connection - * @param [in] level Requested encryption level - */ -void BLEDevice::setEncryptionLevel(esp_ble_sec_act_t level) { - BLEDevice::m_securityLevel = level; -} - -/* - * @brief Set callbacks that will be used to handle encryption negotiation events and authentication events - * @param [in] cllbacks Pointer to BLESecurityCallbacks class callback + * @brief Set callbacks that will be used to handle encryption negotiation events and authentication events + * @param [in] callbacks Pointer to BLESecurityCallbacks class callback */ void BLEDevice::setSecurityCallbacks(BLESecurityCallbacks *callbacks) { BLEDevice::m_securityCallbacks = callbacks; @@ -526,11 +552,19 @@ void BLEDevice::setSecurityCallbacks(BLESecurityCallbacks *callbacks) { */ esp_err_t BLEDevice::setMTU(uint16_t mtu) { log_v(">> setLocalMTU: %d", mtu); + +#ifdef CONFIG_BLUEDROID_ENABLED esp_err_t err = esp_ble_gatt_set_local_mtu(mtu); +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + int err = ble_att_set_preferred_mtu(mtu); +#endif + if (err == ESP_OK) { m_localMTU = mtu; } else { - log_e("can't set local mtu value: %d", mtu); + log_e("can't set local mtu value: %d, rc=%d", mtu, err); } log_v("<< setLocalMTU"); return err; @@ -574,10 +608,23 @@ std::map BLEDevice::getPeerDevices(bool _client) { return m_connectedClientsMap; } +BLEClient *BLEDevice::getClientByID(uint16_t conn_id) { + return BLEDevice::getClientByGattIf(conn_id); +} + BLEClient *BLEDevice::getClientByGattIf(uint16_t conn_id) { return (BLEClient *)m_connectedClientsMap.find(conn_id)->second.peer_device; } +BLEClient *BLEDevice::getClientByAddress(BLEAddress address) { + for (auto &it : m_connectedClientsMap) { + if (((BLEClient *)it.second.peer_device)->getPeerAddress() == address) { + return (BLEClient *)it.second.peer_device; + } + } + return nullptr; +} + void BLEDevice::updatePeerDevice(void *peer, bool _client, uint16_t conn_id) { log_d("update conn_id: %d, GATT role: %s", conn_id, _client ? "client" : "server"); std::map::iterator it = m_connectedClientsMap.find(ESP_GATT_IF_NONE); @@ -619,20 +666,32 @@ void BLEDevice::removePeerDevice(uint16_t conn_id, bool _client) { * @brief de-Initialize the %BLE environment. * @param release_memory release the internal BT stack memory */ -/* STATIC */ void BLEDevice::deinit(bool release_memory) { +void BLEDevice::deinit(bool release_memory) { if (!initialized) { return; } +#ifdef CONFIG_BLUEDROID_ENABLED esp_bluedroid_disable(); esp_bluedroid_deinit(); +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + nimble_port_stop(); + nimble_port_deinit(); +#endif + esp_bt_controller_disable(); esp_bt_controller_deinit(); + #ifdef ARDUINO_ARCH_ESP32 if (release_memory) { - esp_bt_controller_mem_release(ESP_BT_MODE_BTDM - ); // <-- require tests because we released classic BT memory and this can cause crash (most likely not, esp-idf takes care of it) + // Require tests because we released classic BT memory and this can cause crash (most likely not, esp-idf takes care of it) + esp_bt_controller_mem_release(ESP_BT_MODE_BTDM); } else { +#ifdef CONFIG_NIMBLE_ENABLED + m_synced = false; +#endif initialized = false; } #endif @@ -640,8 +699,195 @@ void BLEDevice::removePeerDevice(uint16_t conn_id, bool _client) { void BLEDevice::setCustomGapHandler(gap_event_handler handler) { m_customGapHandler = handler; +#ifdef CONFIG_NIMBLE_ENABLED + int rc = ble_gap_event_listener_register(&m_listener, handler, NULL); + if (rc == BLE_HS_EALREADY) { + log_i("Already listening to GAP events."); + } else if (rc != 0) { + log_e("ble_gap_event_listener_register: rc=%d %s", rc, GeneralUtils::errorToString(rc)); + } +#endif } +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + +/** + * @brief Handle GATT server events. + * + * @param [in] event The event that has been newly received. + * @param [in] gatts_if The connection to the GATT interface. + * @param [in] param Parameters for the event. + */ +void BLEDevice::gattServerEventHandler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { + log_d("gattServerEventHandler [esp_gatt_if: %d] ... %s", gatts_if, BLEUtils::gattServerEventTypeToString(event).c_str()); + + BLEUtils::dumpGattServerEvent(event, gatts_if, param); + + switch (event) { + case ESP_GATTS_CONNECT_EVT: + { +#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig + if (BLEDevice::m_securityLevel) { + esp_ble_set_encryption(param->connect.remote_bda, BLEDevice::m_securityLevel); + } +#endif // CONFIG_BLE_SMP_ENABLE + break; + } // ESP_GATTS_CONNECT_EVT + + default: + { + break; + } + } // switch + + if (BLEDevice::m_pServer != nullptr) { + BLEDevice::m_pServer->handleGATTServerEvent(event, gatts_if, param); + } + + if (m_customGattsHandler != nullptr) { + m_customGattsHandler(event, gatts_if, param); + } + +} // gattServerEventHandler + +/** + * @brief Handle GATT client events. + * + * Handler for the GATT client events. + * + * @param [in] event + * @param [in] gattc_if + * @param [in] param + */ +void BLEDevice::gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param) { + + log_d("gattClientEventHandler [esp_gatt_if: %d] ... %s", gattc_if, BLEUtils::gattClientEventTypeToString(event).c_str()); + BLEUtils::dumpGattClientEvent(event, gattc_if, param); + + switch (event) { + case ESP_GATTC_CONNECT_EVT: + { +#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig + if (BLEDevice::m_securityLevel) { + esp_ble_set_encryption(param->connect.remote_bda, BLEDevice::m_securityLevel); + } +#endif // CONFIG_BLE_SMP_ENABLE + break; + } // ESP_GATTS_CONNECT_EVT + + default: break; + } // switch + for (auto &myPair : BLEDevice::getPeerDevices(true)) { + conn_status_t conn_status = (conn_status_t)myPair.second; + if (((BLEClient *)conn_status.peer_device)->getGattcIf() == gattc_if || ((BLEClient *)conn_status.peer_device)->getGattcIf() == ESP_GATT_IF_NONE + || gattc_if == ESP_GATT_IF_NONE) { + ((BLEClient *)conn_status.peer_device)->gattClientEventHandler(event, gattc_if, param); + } + } + + if (m_customGattcHandler != nullptr) { + m_customGattcHandler(event, gattc_if, param); + } + +} // gattClientEventHandler + +/** + * @brief Handle GAP events. + */ +void BLEDevice::gapEventHandler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { + + BLEUtils::dumpGapEvent(event, param); + + switch (event) { + + case ESP_GAP_BLE_OOB_REQ_EVT: /* OOB request event */ log_i("ESP_GAP_BLE_OOB_REQ_EVT"); break; + case ESP_GAP_BLE_LOCAL_IR_EVT: /* BLE local IR event */ log_i("ESP_GAP_BLE_LOCAL_IR_EVT"); break; + case ESP_GAP_BLE_LOCAL_ER_EVT: /* BLE local ER event */ log_i("ESP_GAP_BLE_LOCAL_ER_EVT"); break; + case ESP_GAP_BLE_NC_REQ_EVT: /* NUMERIC CONFIRMATION */ log_i("ESP_GAP_BLE_NC_REQ_EVT"); +#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig + if (BLEDevice::m_securityCallbacks != nullptr) { + esp_ble_confirm_reply(param->ble_security.ble_req.bd_addr, BLEDevice::m_securityCallbacks->onConfirmPIN(param->ble_security.key_notif.passkey)); + } +#endif // CONFIG_BLE_SMP_ENABLE + break; + case ESP_GAP_BLE_PASSKEY_REQ_EVT: /* passkey request event */ + log_i("ESP_GAP_BLE_PASSKEY_REQ_EVT: "); + // esp_log_buffer_hex(m_remote_bda, sizeof(m_remote_bda)); +#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig + if (BLEDevice::m_securityCallbacks != nullptr) { + esp_ble_passkey_reply(param->ble_security.ble_req.bd_addr, true, BLEDevice::m_securityCallbacks->onPassKeyRequest()); + } +#endif // CONFIG_BLE_SMP_ENABLE + break; + /* + * TODO should we add white/black list comparison? + */ + case ESP_GAP_BLE_SEC_REQ_EVT: + /* send the positive(true) security response to the peer device to accept the security request. + If not accept the security request, should sent the security response with negative(false) accept value*/ + log_i("ESP_GAP_BLE_SEC_REQ_EVT"); +#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig + if (BLEDevice::m_securityCallbacks != nullptr) { + esp_ble_gap_security_rsp(param->ble_security.ble_req.bd_addr, BLEDevice::m_securityCallbacks->onSecurityRequest()); + } else { + esp_ble_gap_security_rsp(param->ble_security.ble_req.bd_addr, true); + } +#endif // CONFIG_BLE_SMP_ENABLE + break; + /* + * + */ + case ESP_GAP_BLE_PASSKEY_NOTIF_EVT: //the app will receive this evt when the IO has Output capability and the peer device IO has Input capability. + //display the passkey number to the user to input it in the peer device within 30 seconds + log_i("ESP_GAP_BLE_PASSKEY_NOTIF_EVT"); +#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig + log_i("passKey = %d", param->ble_security.key_notif.passkey); + if (BLEDevice::m_securityCallbacks != nullptr) { + BLEDevice::m_securityCallbacks->onPassKeyNotify(param->ble_security.key_notif.passkey); + } +#endif // CONFIG_BLE_SMP_ENABLE + break; + case ESP_GAP_BLE_KEY_EVT: + //shows the ble key type info share with peer device to the user. + log_d("ESP_GAP_BLE_KEY_EVT"); +#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig + log_i("key type = %s", BLESecurity::esp_key_type_to_str(param->ble_security.ble_key.key_type)); +#endif // CONFIG_BLE_SMP_ENABLE + break; + case ESP_GAP_BLE_AUTH_CMPL_EVT: log_i("ESP_GAP_BLE_AUTH_CMPL_EVT"); +#ifdef CONFIG_BLE_SMP_ENABLE // Check that BLE SMP (security) is configured in make menuconfig + if (BLEDevice::m_securityCallbacks != nullptr) { + BLEDevice::m_securityCallbacks->onAuthenticationComplete(param->ble_security.auth_cmpl); + } +#endif // CONFIG_BLE_SMP_ENABLE + break; + default: + { + break; + } + } // switch + + if (BLEDevice::m_pClient != nullptr) { + BLEDevice::m_pClient->handleGAPEvent(event, param); + } + + if (BLEDevice::m_pScan != nullptr) { + BLEDevice::getScan()->handleGAPEvent(event, param); + } + + if (m_bleAdvertising != nullptr) { + BLEDevice::getAdvertising()->handleGAPEvent(event, param); + } + + if (m_customGapHandler != nullptr) { + BLEDevice::m_customGapHandler(event, param); + } + +} // gapEventHandler void BLEDevice::setCustomGattcHandler(gattc_event_handler handler) { m_customGattcHandler = handler; } @@ -650,5 +896,170 @@ void BLEDevice::setCustomGattsHandler(gatts_event_handler handler) { m_customGattsHandler = handler; } -#endif /* CONFIG_BLUEDROID_ENABLED */ +/* + * @brief Set encryption level that will be negotiated with peer device durng connection + * @param [in] level Requested encryption level + */ +void BLEDevice::setEncryptionLevel(esp_ble_sec_act_t level) { + BLEDevice::m_securityLevel = level; +} + +#endif + +/*************************************************************************** + * NimBLE functions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + +/** + * @brief Checks if a peer device is whitelisted. + * @param [in] address The address to check for in the whitelist. + * @returns True if the address is in the whitelist. + */ +bool BLEDevice::onWhiteList(BLEAddress &address) { + for (auto &addr : m_whiteList) { + if (addr == address) { + return true; + } + } + return false; +} + +void BLEDevice::host_task(void *param) { + log_i("NimBLE host task started"); + nimble_port_run(); // This function will return only when nimble_port_stop() is executed + nimble_port_freertos_deinit(); +} + +void BLEDevice::onReset(int reason) { + if (!m_synced) { + return; + } + + m_synced = false; + + log_i("onReset, reason=%d, %s", reason, BLEUtils::returnCodeToString(reason)); + + if (initialized) { + if (m_pScan != nullptr) { + m_pScan->onHostReset(); + } + } +} + +void BLEDevice::onSync() { + log_d("onSync"); + + if (m_synced) { + log_d("onSync: already synced"); + return; + } + + int rc = ble_hs_util_ensure_addr(0); + if (rc == 0) { + rc = ble_hs_util_ensure_addr(1); + } + + if (rc != 0) { + log_e("onSync: failed to ensure BLE address. rc=%d", rc); + return; + } + + rc = ble_hs_id_copy_addr(BLE_OWN_ADDR_PUBLIC, NULL, NULL); + if (rc != 0) { + log_d("onSync: no public address available"); + m_ownAddrType = BLE_OWN_ADDR_RANDOM; + } + + // Yield for housekeeping tasks before returning to operations. + // Occasionally triggers exception without. + ble_npl_time_delay(1); + + m_synced = true; + + if (initialized) { + if (m_pScan != nullptr) { + m_pScan->onHostSync(); + } + if (m_bleAdvertising != nullptr) { + m_bleAdvertising->onHostSync(); + } + } +} + +void BLEDevice::setDeviceCallbacks(BLEDeviceCallbacks *cb) { + if (cb == nullptr) { + m_pDeviceCallbacks = &defaultDeviceCallbacks; + } else { + m_pDeviceCallbacks = cb; + } +} + +/** + * @brief Sets the address type to use. + * @param [in] type Bluetooth Device address type. + * The available types are defined as: + * * 0x00: BLE_OWN_ADDR_PUBLIC - Public address; Uses the hardware static address. + * * 0x01: BLE_OWN_ADDR_RANDOM - Random static address; Uses the hardware or generated random static address. + * * 0x02: BLE_OWN_ADDR_RPA_PUBLIC_DEFAULT - Resolvable private address, defaults to public if no RPA available. + * * 0x03: BLE_OWN_ADDR_RPA_RANDOM_DEFAULT - Resolvable private address, defaults to random static if no RPA available. + */ +bool BLEDevice::setOwnAddrType(uint8_t type) { + int rc = ble_hs_id_copy_addr(type & 1, NULL, NULL); // Odd values are random + if (rc != 0) { + log_e("Unable to set address type %d, rc=%d", type, rc); + return false; + } + + m_ownAddrType = type; + + if (type == BLE_OWN_ADDR_RPA_PUBLIC_DEFAULT || type == BLE_OWN_ADDR_RPA_RANDOM_DEFAULT) { +#ifdef CONFIG_IDF_TARGET_ESP32 + // esp32 controller does not support RPA so we must use the random static for calls to the stack + // the host will take care of the random private address generation/setting. + m_ownAddrType = BLE_OWN_ADDR_RANDOM; + rc = ble_hs_pvcy_rpa_config(NIMBLE_HOST_ENABLE_RPA); +#endif + } else { +#ifdef CONFIG_IDF_TARGET_ESP32 + rc = ble_hs_pvcy_rpa_config(NIMBLE_HOST_DISABLE_PRIVACY); +#endif + } + return rc == 0; +} // setOwnAddrType + +/** + * @brief Set the device address to use. + * @param [in] addr The address to set. + * @return True if the address was set successfully. + * @details To use the address generated the address type must be set to random with `setOwnAddrType`. + */ +bool BLEDevice::setOwnAddr(BLEAddress &addr) { + return setOwnAddr(addr.getNative()); +} // setOwnAddr + +/** + * @brief Set the device address to use. + * @param [in] addr The address to set. + * @return True if the address was set successfully. + * @details To use the address generated the address type must be set to random with `setOwnAddrType`. + */ +bool BLEDevice::setOwnAddr(uint8_t *addr) { + int rc = ble_hs_id_set_rnd(addr); + if (rc != 0) { + log_e("Failed to set address, rc=%d", rc); + return false; + } + return true; +} // setOwnAddr + +int BLEDeviceCallbacks::onStoreStatus(struct ble_store_status_event *event, void *arg) { + log_d("onStoreStatus: default"); + return ble_store_util_status_rr(event, arg); +} + +#endif + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEDevice.h b/libraries/BLE/src/BLEDevice.h index 01bf143c101..66cfa2b371a 100644 --- a/libraries/BLE/src/BLEDevice.h +++ b/libraries/BLE/src/BLEDevice.h @@ -3,6 +3,10 @@ * * Created on: Mar 16, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef MAIN_BLEDevice_H_ @@ -11,88 +15,252 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) -#include // ESP32 BLE -#include // ESP32 BLE -#include // Part of C++ STL +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + +#include #include #include - #include "BLEServer.h" #include "BLEClient.h" #include "BLEUtils.h" #include "BLEScan.h" +#include "BLEAdvertising.h" +#include "BLESecurity.h" #include "BLEAddress.h" +#include "BLEUtils.h" -/** - * @brief BLE functions. - */ +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#include +#include +#endif + +/*************************************************************************** + * NimBLE includes and definitions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#define ESP_GATT_IF_NONE BLE_HS_CONN_HANDLE_NONE + +// NimBLE configuration compatibility macros +#if defined(CONFIG_SCAN_DUPLICATE_BY_DEVICE_ADDR) && !defined(CONFIG_BTDM_SCAN_DUPL_TYPE_DEVICE) +#define CONFIG_BTDM_SCAN_DUPL_TYPE_DEVICE CONFIG_SCAN_DUPLICATE_BY_DEVICE_ADDR +#endif + +#if defined(CONFIG_SCAN_DUPLICATE_BY_ADV_DATA) && !defined(CONFIG_BTDM_SCAN_DUPL_TYPE_DATA) +#define CONFIG_BTDM_SCAN_DUPL_TYPE_DATA CONFIG_SCAN_DUPLICATE_BY_ADV_DATA +#endif + +#if defined(CONFIG_SCAN_DUPLICATE_BY_ADV_DATA_AND_DEVICE_ADDR) && !defined(CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE) +#define CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE CONFIG_SCAN_DUPLICATE_BY_ADV_DATA_AND_DEVICE_ADDR +#endif + +#if defined(CONFIG_SCAN_DUPLICATE_TYPE) && !defined(CONFIG_BTDM_SCAN_DUPL_TYPE) +#define CONFIG_BTDM_SCAN_DUPL_TYPE CONFIG_SCAN_DUPLICATE_TYPE +#endif + +#if defined(CONFIG_BT_CTRL_SCAN_DUPL_TYPE) && !defined(CONFIG_BTDM_SCAN_DUPL_TYPE) +#define CONFIG_BTDM_SCAN_DUPL_TYPE CONFIG_BT_CTRL_SCAN_DUPL_TYPE +#endif + +#if defined(CONFIG_BT_LE_SCAN_DUPL_TYPE) && !defined(CONFIG_BTDM_SCAN_DUPL_TYPE) +#define CONFIG_BTDM_SCAN_DUPL_TYPE CONFIG_BT_LE_SCAN_DUPL_TYPE +#endif + +#if defined(CONFIG_DUPLICATE_SCAN_CACHE_SIZE) && !defined(CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE) +#define CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE CONFIG_DUPLICATE_SCAN_CACHE_SIZE +#endif + +#if defined(CONFIG_BT_CTRL_SCAN_DUPL_CACHE_SIZE) && !defined(CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE) +#define CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE CONFIG_BT_CTRL_SCAN_DUPL_CACHE_SIZE +#endif + +#if defined(CONFIG_BT_LE_LL_DUP_SCAN_LIST_COUNT) && !defined(CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE) +#define CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE CONFIG_BT_LE_LL_DUP_SCAN_LIST_COUNT +#endif + +#if defined(CONFIG_NIMBLE_MAX_CONNECTIONS) && !defined(CONFIG_BT_NIMBLE_MAX_CONNECTIONS) +#define CONFIG_BT_NIMBLE_MAX_CONNECTIONS CONFIG_NIMBLE_MAX_CONNECTIONS +#endif + +#endif + +/*************************************************************************** + * Forward declarations * + ***************************************************************************/ + +class BLEAddress; +class BLEDeviceCallbacks; +class BLESecurityCallbacks; +class BLEServer; +class BLEScan; +class BLEAdvertising; +class BLEClient; +class BLESecurity; + +/*************************************************************************** + * Bluedroid type definitions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) typedef void (*gap_event_handler)(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); typedef void (*gattc_event_handler)(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param); typedef void (*gatts_event_handler)(esp_gatts_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gatts_cb_param_t *param); +#endif + +/*************************************************************************** + * NimBLE type definitions and externals * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +extern "C" void ble_store_config_init(void); +typedef int (*gap_event_handler)(struct ble_gap_event *event, void *param); +#endif class BLEDevice { public: - static BLEClient *createClient(); // Create a new BLE client. - static BLEServer *createServer(); // Create a new BLE server. - static BLEAddress getAddress(); // Retrieve our own local BD address. - static BLEScan *getScan(); // Get the scan object - static String getValue(BLEAddress bdAddress, BLEUUID serviceUUID, BLEUUID characteristicUUID); // Get the value of a characteristic of a service on a server. - static void init(String deviceName); // Initialize the local BLE environment. - static void setPower(esp_power_level_t powerLevel, esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT); // Set our power level. - static void setValue( - BLEAddress bdAddress, BLEUUID serviceUUID, BLEUUID characteristicUUID, String value - ); // Set the value of a characteristic on a service on a server. - static String toString(); // Return a string representation of our device. - static void whiteListAdd(BLEAddress address); // Add an entry to the BLE white list. - static void whiteListRemove(BLEAddress address); // Remove an entry from the BLE white list. - static void setEncryptionLevel(esp_ble_sec_act_t level); + /*************************************************************************** + * Common public properties * + ***************************************************************************/ + + static uint16_t m_appId; + static uint16_t m_localMTU; + static gap_event_handler m_customGapHandler; + + /*************************************************************************** + * Bluedroid public properties * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + static esp_ble_sec_act_t m_securityLevel; + static gattc_event_handler m_customGattcHandler; + static gatts_event_handler m_customGattsHandler; +#endif + + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + + static BLEClient *createClient(); + static BLEServer *createServer(); + static BLEAddress getAddress(); + static BLEServer *getServer(); + static BLEScan *getScan(); + static String getValue(BLEAddress bdAddress, BLEUUID serviceUUID, BLEUUID characteristicUUID); + static void init(String deviceName); + static void setPower(esp_power_level_t powerLevel, esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT); + static int getPower(esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT); + static void setValue(BLEAddress bdAddress, BLEUUID serviceUUID, BLEUUID characteristicUUID, String value); + static String toString(); + static void whiteListAdd(BLEAddress address); + static void whiteListRemove(BLEAddress address); static void setSecurityCallbacks(BLESecurityCallbacks *pCallbacks); static esp_err_t setMTU(uint16_t mtu); static uint16_t getMTU(); - static bool getInitialized(); // Returns the state of the device, is it initialized or not? - /* move advertising to BLEDevice for saving ram and flash in beacons */ + static bool getInitialized(); static BLEAdvertising *getAdvertising(); static void startAdvertising(); static void stopAdvertising(); - static uint16_t m_appId; - /* multi connect */ static std::map getPeerDevices(bool client); static void addPeerDevice(void *peer, bool is_client, uint16_t conn_id); static void updatePeerDevice(void *peer, bool _client, uint16_t conn_id); static void removePeerDevice(uint16_t conn_id, bool client); + static BLEClient *getClientByID(uint16_t conn_id); + static BLEClient *getClientByAddress(BLEAddress address); static BLEClient *getClientByGattIf(uint16_t conn_id); static void setCustomGapHandler(gap_event_handler handler); + static void deinit(bool release_memory = false); + + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + static void setEncryptionLevel(esp_ble_sec_act_t level); static void setCustomGattcHandler(gattc_event_handler handler); static void setCustomGattsHandler(gatts_event_handler handler); - static void deinit(bool release_memory = false); - static uint16_t m_localMTU; - static esp_ble_sec_act_t m_securityLevel; +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + static void onReset(int reason); + static void onSync(void); + static void host_task(void *param); + static bool setOwnAddrType(uint8_t type); + static bool setOwnAddr(BLEAddress &addr); + static bool setOwnAddr(uint8_t *addr); + static void setDeviceCallbacks(BLEDeviceCallbacks *cb); + static bool onWhiteList(BLEAddress &address); +#endif private: + friend class BLEClient; + friend class BLEScan; + friend class BLEServer; + friend class BLECharacteristic; + friend class BLEAdvertising; + + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + static BLEServer *m_pServer; static BLEScan *m_pScan; static BLEClient *m_pClient; static BLESecurityCallbacks *m_securityCallbacks; static BLEAdvertising *m_bleAdvertising; - static esp_gatt_if_t getGattcIF(); static std::map m_connectedClientsMap; static portMUX_TYPE mux; - static void gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param); + /*************************************************************************** + * NimBLE private properties * + ***************************************************************************/ - static void gattServerEventHandler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); +#if defined(CONFIG_NIMBLE_ENABLED) + static uint8_t m_ownAddrType; + static bool m_synced; + static std::vector m_whiteList; + static BLEDeviceCallbacks defaultDeviceCallbacks; + static BLEDeviceCallbacks *m_pDeviceCallbacks; + static ble_gap_event_listener m_listener; +#endif + /*************************************************************************** + * Bluedroid private declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + static esp_gatt_if_t getGattcIF(); + static void gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param); + static void gattServerEventHandler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); static void gapEventHandler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); +#endif +}; // class BLE -public: - /* custom gap and gatt handlers for flexibility */ - static gap_event_handler m_customGapHandler; - static gattc_event_handler m_customGattcHandler; - static gatts_event_handler m_customGattsHandler; +/*************************************************************************** + * NimBLE specific classes * + ***************************************************************************/ -}; // class BLE +#if defined(CONFIG_NIMBLE_ENABLED) +class BLEDeviceCallbacks { +public: + virtual ~BLEDeviceCallbacks(){}; + virtual int onStoreStatus(struct ble_store_status_event *event, void *arg); +}; +#endif -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* MAIN_BLEDevice_H_ */ diff --git a/libraries/BLE/src/BLEEddystoneTLM.cpp b/libraries/BLE/src/BLEEddystoneTLM.cpp index 1a301f09011..ca0fb41b1a2 100644 --- a/libraries/BLE/src/BLEEddystoneTLM.cpp +++ b/libraries/BLE/src/BLEEddystoneTLM.cpp @@ -8,12 +8,16 @@ * Fix time stamp (0.1 second resolution) * Fixes based on EddystoneTLM frame specification https://github.com/google/eddystone/blob/master/eddystone-tlm/tlm-plain.md * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on pcbreflux's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) #include #include #include "esp32-hal-log.h" @@ -176,5 +180,5 @@ void BLEEddystoneTLM::setTime(uint32_t tmil) { m_eddystoneData.tmil = tmil; } // setTime -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEEddystoneTLM.cppwithheadder b/libraries/BLE/src/BLEEddystoneTLM.cppwithheadder deleted file mode 100644 index 07002dbab1f..00000000000 --- a/libraries/BLE/src/BLEEddystoneTLM.cppwithheadder +++ /dev/null @@ -1,202 +0,0 @@ -/* - * BLEEddystoneTLM.cpp - * - * Created on: Mar 12, 2018 - * Author: pcbreflux - * Edited on: Mar 20, 2020 by beegee-tokyo - * Fix temperature value (8.8 fixed format) - * Fix time stamp (0.1 second resolution) - * Fixes based on EddystoneTLM frame specification https://github.com/google/eddystone/blob/master/eddystone-tlm/tlm-plain.md - * - */ -#include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) -#include -#include -#include "esp32-hal-log.h" -#include "BLEEddystoneTLM.h" - -static const char LOG_TAG[] = "BLEEddystoneTLM"; - -BLEEddystoneTLM::BLEEddystoneTLM() { - m_eddystoneData.frameType = EDDYSTONE_TLM_FRAME_TYPE; - m_eddystoneData.version = 0; - m_eddystoneData.volt = 3300; // 3300mV = 3.3V - m_eddystoneData.temp = (uint16_t) ((float) 23.00)/256; - m_eddystoneData.advCount = 0; - m_eddystoneData.tmil = 0; - _initHeadder(); -} // BLEEddystoneTLM - -BLEEddystoneTLM::BLEEddystoneTLM(BLEAdvertisedDevice *advertisedDevice){ - char* payload = (char*)advertisedDevice->getPayload(); - for(int i = 0; i < advertisedDevice->getPayloadLength(); ++i){ - if(payload[i] == 0x16 && advertisedDevice->getPayloadLength() >= i+2+sizeof(m_eddystoneData) && payload[i+1] == 0xAA && payload[i+2] == 0xFE && payload[i+3] == 0x20){ - log_d("Eddystone TLM data frame starting at byte [%d]", i+3); - setData(std::string(payload+i+3, sizeof(m_eddystoneData))); - break; - } - } - _initHeadder(); -} - -String BLEEddystoneTLM::getData() { - return String((char*) &m_eddystoneData, sizeof(m_eddystoneData)); -} // getData - -BLEUUID BLEEddystoneTLM::getUUID() { - return beaconUUID; -} // getUUID - -uint8_t BLEEddystoneTLM::getVersion() { - return m_eddystoneData.version; -} // getVersion - -uint16_t BLEEddystoneTLM::getVolt() { - return ENDIAN_CHANGE_U16(m_eddystoneData.volt); -} // getVolt - -float BLEEddystoneTLM::getTemp() { - return EDDYSTONE_TEMP_U16_TO_FLOAT(m_eddystoneData.temp); -} // getTemp - -uint16_t BLEEddystoneTLM::getRawTemp() { - return ENDIAN_CHANGE_U16(m_eddystoneData.temp); -} // getRawTemp - -uint32_t BLEEddystoneTLM::getCount() { - return ENDIAN_CHANGE_U32(m_eddystoneData.advCount); -} // getCount - -uint32_t BLEEddystoneTLM::getTime() { - return (ENDIAN_CHANGE_U32(m_eddystoneData.tmil)) / 10; -} // getTime - -String BLEEddystoneTLM::getFrame(){ - String frame(BLEHeadder); - frame += String((char*) &m_eddystoneData, sizeof(m_eddystoneData)); - log_d("Compiled frame of length %d Bytes", frame.length()); - for(int i = 0; i < frame.length(); ++i){ - log_d("[%d]=0x%02X",i, frame[i]); - } - return frame; -} // getServiceData - -String BLEEddystoneTLM::toString() { - String out = ""; - uint32_t rawsec = ENDIAN_CHANGE_U32(m_eddystoneData.tmil); - char val[12]; - - out += "Version "; // + std::string(m_eddystoneData.version); - snprintf(val, sizeof(val), "%d", m_eddystoneData.version); - out += val; - out += "\n"; - out += "Battery Voltage "; // + ENDIAN_CHANGE_U16(m_eddystoneData.volt); - snprintf(val, sizeof(val), "%d", ENDIAN_CHANGE_U16(m_eddystoneData.volt)); - out += val; - out += " mV\n"; - - out += "Temperature "; - snprintf(val, sizeof(val), "%.2f", ((int16_t)ENDIAN_CHANGE_U16(m_eddystoneData.temp)) / 256.0f); - out += val; - out += " C\n"; - - out += "Adv. Count "; - snprintf(val, sizeof(val), "%d", ENDIAN_CHANGE_U32(m_eddystoneData.advCount)); - out += val; - out += "\n"; - - out += "Time in seconds "; - snprintf(val, sizeof(val), "%d", rawsec/10); - out += val; - out += "\n"; - - out += "Time "; - - snprintf(val, sizeof(val), "%04d", rawsec / 864000); - out += val; - out += "."; - - snprintf(val, sizeof(val), "%02d", (rawsec / 36000) % 24); - out += val; - out += ":"; - - snprintf(val, sizeof(val), "%02d", (rawsec / 600) % 60); - out += val; - out += ":"; - - snprintf(val, sizeof(val), "%02d", (rawsec / 10) % 60); - out += val; - out += "\n"; - - return out; -} // toString - -/** - * Set the raw data for the beacon record. - * Example: - * uint8_t *payload = advertisedDevice.getPayload(); - * eddystoneTLM.setData(std::string((char*)payload+22, advertisedDevice.getPayloadLength() - 22)); - * Note: the offset 22 works for current implementation of example BLE_EddystoneTLM Beacon.ino, however - * the position is not static and it is programmers responsibility to align the data. - * Data frame: - * | Field || Len | Type | UUID | EddyStone TLM | - * | Offset || 0 | 1 | 2 | 4 | - * | Len || 1 B | 1 B | 2 B | 14 B | - * | Data || ?? | ?? | 0xAA | 0xFE | ??? | - * - * EddyStone TLM frame: - * | Field || Type | Version | Batt mV | Beacon temp | Cnt since boot | Time since boot | - * | Offset || 0 | 1 | 2 | 4 | 6 | 10 | - * | Len || 1 B | 1 B | 2 B | 2 B | 4 B | 4 B | - * | Data || 0x20 | ?? | ?? | ?? | ?? | ?? | | | | | | | | | - */ -void BLEEddystoneTLM::setData(std::string data) { - if (data.length() != sizeof(m_eddystoneData)) { - log_e("Unable to set the data ... length passed in was %d and expected %d", data.length(), sizeof(m_eddystoneData)); - return; - } - memcpy(&m_eddystoneData, data.data(), data.length()); -} // setData - -void BLEEddystoneTLM::setUUID(BLEUUID l_uuid) { - beaconUUID = l_uuid; -} // setUUID - -void BLEEddystoneTLM::setVersion(uint8_t version) { - m_eddystoneData.version = version; -} // setVersion - -// Set voltage in ESP32 native Big endian and convert it to little endian used for BLE Frame -void BLEEddystoneTLM::setVolt(uint16_t volt) { - m_eddystoneData.volt = ENDIAN_CHANGE_U16(volt); -} // setVolt - -void BLEEddystoneTLM::setTemp(float temp) { - m_eddystoneData.temp = EDDYSTONE_TEMP_FLOAT_TO_U16(temp); -} // setTemp - -void BLEEddystoneTLM::setCount(uint32_t advCount) { - m_eddystoneData.advCount = advCount; -} // setCount - -void BLEEddystoneTLM::setTime(uint32_t tmil) { - m_eddystoneData.tmil = tmil; -} // setTime - -void BLEEddystoneTLM::_initHeadder(){ - BLEHeadder[0] = 0x02; // Len - BLEHeadder[1] = 0x01; // Type Flags - BLEHeadder[2] = 0x06; // GENERAL_DISC_MODE 0x02 | BR_EDR_NOT_SUPPORTED 0x04 - BLEHeadder[3] = 0x03; // Len - BLEHeadder[4] = 0x03; // Type 16-Bit UUID - BLEHeadder[5] = 0xAA; // Eddystone UUID 2 -> 0xFEAA LSB - BLEHeadder[6] = 0xFE; // Eddystone UUID 1 MSB - BLEHeadder[7] = 0x11; // Length of TLM Beacon Data is constant 17 B (not counting the length field itself) - BLEHeadder[8] = 0x16; // Type Service Data - BLEHeadder[9] = 0xAA; // Eddystone UUID 2 -> 0xFEAA LSB - BLEHeadder[10] = 0xFE; // Eddystone UUID 1 MSB - BLEHeadder[11] = 0x20; // Eddystone Frame Type - TLM -} - -#endif diff --git a/libraries/BLE/src/BLEEddystoneTLM.h b/libraries/BLE/src/BLEEddystoneTLM.h index 3981af4a4a9..17915a670da 100644 --- a/libraries/BLE/src/BLEEddystoneTLM.h +++ b/libraries/BLE/src/BLEEddystoneTLM.h @@ -1,8 +1,12 @@ /* - * BLEEddystoneTLM.cpp + * BLEEddystoneTLM.h * * Created on: Mar 12, 2018 * Author: pcbreflux + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on pcbreflux's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef _BLEEddystoneTLM_H_ @@ -10,6 +14,9 @@ #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED +#include "sdkconfig.h" +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + #include "BLEUUID.h" #include @@ -57,5 +64,6 @@ class BLEEddystoneTLM { } __attribute__((packed)) m_eddystoneData; }; // BLEEddystoneTLM +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* _BLEEddystoneTLM_H_ */ diff --git a/libraries/BLE/src/BLEEddystoneURL.cpp b/libraries/BLE/src/BLEEddystoneURL.cpp index ddee8af0b30..495671ca49b 100644 --- a/libraries/BLE/src/BLEEddystoneURL.cpp +++ b/libraries/BLE/src/BLEEddystoneURL.cpp @@ -3,14 +3,20 @@ * * Created on: Mar 12, 2018 * Author: pcbreflux + * * Upgraded on: Feb 20, 2023 * By: Tomas Pilny + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on pcbreflux's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) #include #include "esp32-hal-log.h" #include "BLEEddystoneURL.h" @@ -158,7 +164,11 @@ void BLEEddystoneURL::setData(String data) { } // setData void BLEEddystoneURL::setUUID(BLEUUID l_uuid) { +#if defined(CONFIG_BLUEDROID_ENABLED) uint16_t beaconUUID = l_uuid.getNative()->uuid.uuid16; +#elif defined(CONFIG_NIMBLE_ENABLED) + uint16_t beaconUUID = l_uuid.getNative()->u16.value; +#endif BLEHeadder[10] = beaconUUID >> 8; BLEHeadder[9] = beaconUUID & 0x00FF; } // setUUID diff --git a/libraries/BLE/src/BLEEddystoneURL.h b/libraries/BLE/src/BLEEddystoneURL.h index 92668eb6855..9ed89a23694 100644 --- a/libraries/BLE/src/BLEEddystoneURL.h +++ b/libraries/BLE/src/BLEEddystoneURL.h @@ -3,9 +3,13 @@ * * Created on: Mar 12, 2018 * Author: pcbreflux + * * Upgraded on: Feb 20, 2023 * By: Tomas Pilny * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on pcbreflux's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef _BLEEddystoneURL_H_ @@ -13,6 +17,9 @@ #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED +#include "sdkconfig.h" +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + #include "BLEUUID.h" #include #include "esp_bt.h" @@ -57,5 +64,6 @@ class BLEEddystoneURL { char BLEHeadder[12]; }; // BLEEddystoneURL +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* _BLEEddystoneURL_H_ */ diff --git a/libraries/BLE/src/BLEEddystoneURL.h.orig b/libraries/BLE/src/BLEEddystoneURL.h.orig deleted file mode 100644 index 57722d0b769..00000000000 --- a/libraries/BLE/src/BLEEddystoneURL.h.orig +++ /dev/null @@ -1,66 +0,0 @@ -/* - * BLEEddystoneURL.cpp - * - * Created on: Mar 12, 2018 - * Author: pcbreflux - * Upgraded on: Feb 17, 2023 - * By: Tomas Pilny - * - */ - -#ifndef _BLEEddystoneURL_H_ -#define _BLEEddystoneURL_H_ -#include "BLEUUID.h" -#include -#include - -#define EDDYSTONE_URL_FRAME_TYPE 0x10 - -extern String EDDYSTONE_URL_PREFIX[]; -extern String EDDYSTONE_URL_SUFFIX[]; - -/** - * @brief Representation of a beacon. - * See: - * * https://github.com/google/eddystone - */ -class BLEEddystoneURL { -public: - BLEEddystoneURL(); - BLEEddystoneURL(BLEAdvertisedDevice *advertisedDevice); - std::string getData(); - String getFrame(); - BLEUUID getUUID(); - int8_t getPower(); - std::string getURL(); - String getPrefix(); - String getSuffix(); - std::string getDecodedURL(); - void setData(std::string data); - void setUUID(BLEUUID l_uuid); - void setPower(int8_t advertisedTxPower); - void setURL(std::string url); - int setSmartURL(String url); - -private: -<<<<<<< Updated upstream - uint16_t beaconUUID; - uint8_t lengthURL; - struct { - uint8_t frameType; - int8_t advertisedTxPower; - uint8_t url[18]; // 18 bytes: 1 byte for URL scheme + up to 17 bytes of URL - } __attribute__((packed)) m_eddystoneData; - -======= - uint8_t lengthURL; // Describes length of URL part including prefix and suffix - max 18 B (excluding TX power, frame type and preceding header) - struct { - int8_t advertisedTxPower; - uint8_t url[18]; // Byte [0] is for prefix. Last byte **can** contain suffix - } __attribute__((packed)) m_eddystoneData; - void _initHeadder(); - char BLEHeadder[12]; ->>>>>>> Stashed changes -}; // BLEEddystoneURL - -#endif /* _BLEEddystoneURL_H_ */ diff --git a/libraries/BLE/src/BLEExceptions.cpp b/libraries/BLE/src/BLEExceptions.cpp index 4e6c31fca22..b88ea337493 100644 --- a/libraries/BLE/src/BLEExceptions.cpp +++ b/libraries/BLE/src/BLEExceptions.cpp @@ -5,4 +5,9 @@ * Author: kolban */ +#include "soc/soc_caps.h" +#if SOC_BLE_SUPPORTED + //#include "BLEExceptions.h" + +#endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEHIDDevice.cpp b/libraries/BLE/src/BLEHIDDevice.cpp index 0873aa1049f..a255879e2d8 100644 --- a/libraries/BLE/src/BLEHIDDevice.cpp +++ b/libraries/BLE/src/BLEHIDDevice.cpp @@ -3,15 +3,37 @@ * * Created on: Jan 03, 2018 * Author: chegewara + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ #include "BLEHIDDevice.h" #include "BLE2904.h" +#include "BLEDescriptor.h" + +/*************************************************************************** + * NimBLE includes and definitions * + ***************************************************************************/ + +#ifdef CONFIG_NIMBLE_ENABLED +#include +#endif + +/*************************************************************************** + * Common functions * + ***************************************************************************/ BLEHIDDevice::BLEHIDDevice(BLEServer *server) { /* @@ -45,10 +67,12 @@ BLEHIDDevice::BLEHIDDevice(BLEServer *server) { m_batteryLevelCharacteristic = m_batteryService->createCharacteristic((uint16_t)0x2a19, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY); m_batteryLevelCharacteristic->addDescriptor(batteryLevelDescriptor); +#if CONFIG_BLUEDROID_ENABLED BLE2902 *batLevelIndicator = new BLE2902(); // Battery Level Notification is ON by default, making it work always on BLE Pairing and Bonding batLevelIndicator->setNotifications(true); m_batteryLevelCharacteristic->addDescriptor(batLevelIndicator); +#endif /* * This value is setup here because its default value in most usage cases, its very rare to use boot mode @@ -117,16 +141,19 @@ BLECharacteristic *BLEHIDDevice::inputReport(uint8_t reportID) { BLECharacteristic *inputReportCharacteristic = m_hidService->createCharacteristic((uint16_t)0x2a4d, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY); BLEDescriptor *inputReportDescriptor = new BLEDescriptor(BLEUUID((uint16_t)0x2908)); - BLE2902 *p2902 = new BLE2902(); inputReportCharacteristic->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED); inputReportDescriptor->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED); - p2902->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED); uint8_t desc1_val[] = {reportID, 0x01}; inputReportDescriptor->setValue((uint8_t *)desc1_val, 2); - inputReportCharacteristic->addDescriptor(p2902); inputReportCharacteristic->addDescriptor(inputReportDescriptor); +#if CONFIG_BLUEDROID_ENABLED + BLE2902 *p2902 = new BLE2902(); + p2902->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED); + inputReportCharacteristic->addDescriptor(p2902); +#endif + return inputReportCharacteristic; } @@ -175,7 +202,9 @@ BLECharacteristic *BLEHIDDevice::featureReport(uint8_t reportID) { */ BLECharacteristic *BLEHIDDevice::bootInput() { BLECharacteristic *bootInputCharacteristic = m_hidService->createCharacteristic((uint16_t)0x2a22, BLECharacteristic::PROPERTY_NOTIFY); +#if CONFIG_BLUEDROID_ENABLED bootInputCharacteristic->addDescriptor(new BLE2902()); +#endif return bootInputCharacteristic; } @@ -252,5 +281,5 @@ BLEService *BLEHIDDevice::batteryService() { return m_batteryService; } -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEHIDDevice.h b/libraries/BLE/src/BLEHIDDevice.h index a92a23c21d5..9dde9452c12 100644 --- a/libraries/BLE/src/BLEHIDDevice.h +++ b/libraries/BLE/src/BLEHIDDevice.h @@ -3,6 +3,10 @@ * * Created on: Jan 03, 2018 * Author: chegewara + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef _BLEHIDDEVICE_H_ @@ -12,7 +16,7 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) #include "BLECharacteristic.h" #include "BLEService.h" @@ -75,6 +79,6 @@ class BLEHIDDevice { BLECharacteristic *m_batteryLevelCharacteristic; //0x2a19 }; -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* _BLEHIDDEVICE_H_ */ diff --git a/libraries/BLE/src/BLERemoteCharacteristic.cpp b/libraries/BLE/src/BLERemoteCharacteristic.cpp index 60d5108c1fc..aec9500d6f3 100644 --- a/libraries/BLE/src/BLERemoteCharacteristic.cpp +++ b/libraries/BLE/src/BLERemoteCharacteristic.cpp @@ -3,46 +3,55 @@ * * Created on: Jul 8, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ -#include "BLERemoteCharacteristic.h" - #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ -#include #include #include +#include "WString.h" //#include "BLEExceptions.h" #include "BLEUtils.h" #include "GeneralUtils.h" +#include "BLERemoteCharacteristic.h" #include "BLERemoteDescriptor.h" #include "esp32-hal-log.h" -/** - * @brief Constructor. - * @param [in] handle The BLE server side handle of this characteristic. - * @param [in] uuid The UUID of this characteristic. - * @param [in] charProp The properties of this characteristic. - * @param [in] pRemoteService A reference to the remote service to which this remote characteristic pertains. - */ -BLERemoteCharacteristic::BLERemoteCharacteristic(uint16_t handle, BLEUUID uuid, esp_gatt_char_prop_t charProp, BLERemoteService *pRemoteService) { - log_v(">> BLERemoteCharacteristic: handle: %d 0x%d, uuid: %s", handle, handle, uuid.toString().c_str()); - m_handle = handle; - m_uuid = uuid; - m_charProp = charProp; - m_pRemoteService = pRemoteService; - m_notifyCallback = nullptr; - m_rawData = nullptr; - m_auth = ESP_GATT_AUTH_REQ_NONE; +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ - retrieveDescriptors(); // Get the descriptors for this characteristic - log_v("<< BLERemoteCharacteristic"); -} // BLERemoteCharacteristic +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#endif + +/*************************************************************************** + * NimBLE includes * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#include +#include +#include +#endif + +/*************************************************************************** + * Common functions * + ***************************************************************************/ /** *@brief Destructor. @@ -100,211 +109,6 @@ bool BLERemoteCharacteristic::canWriteNoResponse() { return (m_charProp & ESP_GATT_CHAR_PROP_BIT_WRITE_NR) != 0; } // canWriteNoResponse -/* -static bool compareSrvcId(esp_gatt_srvc_id_t id1, esp_gatt_srvc_id_t id2) { - if (id1.id.inst_id != id2.id.inst_id) { - return false; - } - if (!BLEUUID(id1.id.uuid).equals(BLEUUID(id2.id.uuid))) { - return false; - } - return true; -} // compareSrvcId -*/ - -/* -static bool compareGattId(esp_gatt_id_t id1, esp_gatt_id_t id2) { - if (id1.inst_id != id2.inst_id) { - return false; - } - if (!BLEUUID(id1.uuid).equals(BLEUUID(id2.uuid))) { - return false; - } - return true; -} // compareCharId -*/ - -/** - * @brief Handle GATT Client events. - * When an event arrives for a GATT client we give this characteristic the opportunity to - * take a look at it to see if there is interest in it. - * @param [in] event The type of event. - * @param [in] gattc_if The interface on which the event was received. - * @param [in] evtParam Payload data for the event. - * @returns N/A - */ -void BLERemoteCharacteristic::gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *evtParam) { - switch (event) { - // ESP_GATTC_NOTIFY_EVT - // - // notify - // - uint16_t conn_id - The connection identifier of the server. - // - esp_bd_addr_t remote_bda - The device address of the BLE server. - // - uint16_t handle - The handle of the characteristic for which the event is being received. - // - uint16_t value_len - The length of the received data. - // - uint8_t* value - The received data. - // - bool is_notify - True if this is a notify, false if it is an indicate. - // - // We have received a notification event which means that the server wishes us to know about a notification - // piece of data. What we must now do is find the characteristic with the associated handle and then - // invoke its notification callback (if it has one). - case ESP_GATTC_NOTIFY_EVT: - { - if (evtParam->notify.handle != getHandle()) { - break; - } - if (m_notifyCallback != nullptr) { - log_d("Invoking callback for notification on characteristic %s", toString().c_str()); - m_notifyCallback(this, evtParam->notify.value, evtParam->notify.value_len, evtParam->notify.is_notify); - } // End we have a callback function ... - break; - } // ESP_GATTC_NOTIFY_EVT - - // ESP_GATTC_READ_CHAR_EVT - // This event indicates that the server has responded to the read request. - // - // read: - // - esp_gatt_status_t status - // - uint16_t conn_id - // - uint16_t handle - // - uint8_t* value - // - uint16_t value_len - case ESP_GATTC_READ_CHAR_EVT: - { - // If this event is not for us, then nothing further to do. - if (evtParam->read.handle != getHandle()) { - break; - } - - // At this point, we have determined that the event is for us, so now we save the value - // and unlock the semaphore to ensure that the requester of the data can continue. - if (evtParam->read.status == ESP_GATT_OK) { - m_value = String((char *)evtParam->read.value, evtParam->read.value_len); - if (m_rawData != nullptr) { - free(m_rawData); - } - m_rawData = (uint8_t *)calloc(evtParam->read.value_len, sizeof(uint8_t)); - memcpy(m_rawData, evtParam->read.value, evtParam->read.value_len); - } else { - m_value = ""; - } - - m_semaphoreReadCharEvt.give(); - break; - } // ESP_GATTC_READ_CHAR_EVT - - // ESP_GATTC_REG_FOR_NOTIFY_EVT - // - // reg_for_notify: - // - esp_gatt_status_t status - // - uint16_t handle - case ESP_GATTC_REG_FOR_NOTIFY_EVT: - { - // If the request is not for this BLERemoteCharacteristic then move on to the next. - if (evtParam->reg_for_notify.handle != getHandle()) { - break; - } - - // We have processed the notify registration and can unlock the semaphore. - m_semaphoreRegForNotifyEvt.give(); - break; - } // ESP_GATTC_REG_FOR_NOTIFY_EVT - - // ESP_GATTC_UNREG_FOR_NOTIFY_EVT - // - // unreg_for_notify: - // - esp_gatt_status_t status - // - uint16_t handle - case ESP_GATTC_UNREG_FOR_NOTIFY_EVT: - { - if (evtParam->unreg_for_notify.handle != getHandle()) { - break; - } - // We have processed the notify un-registration and can unlock the semaphore. - m_semaphoreRegForNotifyEvt.give(); - break; - } // ESP_GATTC_UNREG_FOR_NOTIFY_EVT: - - // ESP_GATTC_WRITE_CHAR_EVT - // - // write: - // - esp_gatt_status_t status - // - uint16_t conn_id - // - uint16_t handle - case ESP_GATTC_WRITE_CHAR_EVT: - { - // Determine if this event is for us and, if not, pass onwards. - if (evtParam->write.handle != getHandle()) { - break; - } - - // There is nothing further we need to do here. This is merely an indication - // that the write has completed and we can unlock the caller. - m_semaphoreWriteCharEvt.give(); - break; - } // ESP_GATTC_WRITE_CHAR_EVT - - case ESP_GATTC_READ_DESCR_EVT: - case ESP_GATTC_WRITE_DESCR_EVT: - for (auto &myPair : m_descriptorMap) { - myPair.second->gattClientEventHandler(event, gattc_if, evtParam); - } - break; - - case ESP_GATTC_DISCONNECT_EVT: - // Cleanup semaphores to avoid deadlocks. - m_semaphoreReadCharEvt.give(1); - m_semaphoreWriteCharEvt.give(1); - break; - - default: break; - } // End switch -}; // gattClientEventHandler - -/** - * @brief Populate the descriptors (if any) for this characteristic. - */ -void BLERemoteCharacteristic::retrieveDescriptors() { - log_v(">> retrieveDescriptors() for characteristic: %s", getUUID().toString().c_str()); - - removeDescriptors(); // Remove any existing descriptors. - - // Loop over each of the descriptors within the service associated with this characteristic. - // For each descriptor we find, create a BLERemoteDescriptor instance. - uint16_t offset = 0; - esp_gattc_descr_elem_t result; - while (true) { - uint16_t count = 10; - esp_gatt_status_t status = ::esp_ble_gattc_get_all_descr( - getRemoteService()->getClient()->getGattcIf(), getRemoteService()->getClient()->getConnId(), getHandle(), &result, &count, offset - ); - - if (status == ESP_GATT_INVALID_OFFSET) { // We have reached the end of the entries. - break; - } - - if (status != ESP_GATT_OK) { - log_e("esp_ble_gattc_get_all_descr: %s", BLEUtils::gattStatusToString(status).c_str()); - break; - } - - if (count == 0) { - break; - } - - log_d("Found a descriptor: Handle: %d, UUID: %s", result.handle, BLEUUID(result.uuid).toString().c_str()); - - // We now have a new characteristic ... let us add that to our set of known characteristics - BLERemoteDescriptor *pNewRemoteDescriptor = new BLERemoteDescriptor(result.handle, BLEUUID(result.uuid), this); - - m_descriptorMap.insert(std::pair(pNewRemoteDescriptor->getUUID().toString().c_str(), pNewRemoteDescriptor)); - - offset++; - } // while true - //m_haveCharacteristics = true; // Remember that we have received the characteristics. - log_v("<< retrieveDescriptors(): Found %d descriptors.", offset); -} // getDescriptors - /** * @brief Retrieve the map of descriptors keyed by UUID. */ @@ -404,44 +208,6 @@ float BLERemoteCharacteristic::readFloat() { return 0.0; } // readFloat -/** - * @brief Read the value of the remote characteristic. - * @return The value of the remote characteristic. - */ -String BLERemoteCharacteristic::readValue() { - log_v(">> readValue(): uuid: %s, handle: %d 0x%.2x", getUUID().toString().c_str(), getHandle(), getHandle()); - - // Check to see that we are connected. - if (!getRemoteService()->getClient()->isConnected()) { - log_e("Disconnected"); - return String(); - } - - m_semaphoreReadCharEvt.take("readValue"); - - // Ask the BLE subsystem to retrieve the value for the remote hosted characteristic. - // This is an asynchronous request which means that we must block waiting for the response - // to become available. - esp_err_t errRc = ::esp_ble_gattc_read_char( - m_pRemoteService->getClient()->getGattcIf(), - m_pRemoteService->getClient()->getConnId(), // The connection ID to the BLE server - getHandle(), // The handle of this characteristic - m_auth - ); // Security - - if (errRc != ESP_OK) { - log_e("esp_ble_gattc_read_char: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - return ""; - } - - // Block waiting for the event that indicates that the read has completed. When it has, the String found - // in m_value will contain our data. - m_semaphoreReadCharEvt.wait("readValue"); - - log_v("<< readValue(): length: %d", m_value.length()); - return m_value; -} // readValue - /** * @brief Register for notifications. * @param [in] notifyCallback A callback to be invoked for a notification. If NULL is provided then we are @@ -451,13 +217,14 @@ String BLERemoteCharacteristic::readValue() { void BLERemoteCharacteristic::registerForNotify(notify_callback notifyCallback, bool notifications, bool descriptorRequiresRegistration) { log_v(">> registerForNotify(): %s", toString().c_str()); +#if defined(CONFIG_BLUEDROID_ENABLED) m_notifyCallback = notifyCallback; // Save the notification callback. m_semaphoreRegForNotifyEvt.take("registerForNotify"); if (notifyCallback != nullptr) { // If we have a callback function, then this is a registration. esp_err_t errRc = ::esp_ble_gattc_register_for_notify( - m_pRemoteService->getClient()->getGattcIf(), *m_pRemoteService->getClient()->getPeerAddress().getNative(), getHandle() + m_pRemoteService->getClient()->getGattcIf(), m_pRemoteService->getClient()->getPeerAddress().getNative(), getHandle() ); if (errRc != ESP_OK) { @@ -475,7 +242,7 @@ void BLERemoteCharacteristic::registerForNotify(notify_callback notifyCallback, } // End Register else { // If we weren't passed a callback function, then this is an unregistration. esp_err_t errRc = ::esp_ble_gattc_unregister_for_notify( - m_pRemoteService->getClient()->getGattcIf(), *m_pRemoteService->getClient()->getPeerAddress().getNative(), getHandle() + m_pRemoteService->getClient()->getGattcIf(), m_pRemoteService->getClient()->getPeerAddress().getNative(), getHandle() ); if (errRc != ESP_OK) { @@ -491,8 +258,22 @@ void BLERemoteCharacteristic::registerForNotify(notify_callback notifyCallback, m_semaphoreRegForNotifyEvt.wait("registerForNotify"); - log_v("<< registerForNotify()"); -} // registerForNotify +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + bool success; + if (notifyCallback != nullptr) { + success = subscribe(notifications, notifyCallback, descriptorRequiresRegistration); + } else { + success = unsubscribe(descriptorRequiresRegistration); + } + + if (!success) { + log_e("Failed to subscribe/unsubscribe for notify"); + } +#endif + log_v("<< registerForNotify()"); +} // registerForNotify /** * @brief Delete the descriptors in the descriptor map. @@ -532,8 +313,8 @@ String BLERemoteCharacteristic::toString() { * @param [in] response Do we expect a response? * @return N/A. */ -void BLERemoteCharacteristic::writeValue(String newValue, bool response) { - writeValue((uint8_t *)newValue.c_str(), newValue.length(), response); +bool BLERemoteCharacteristic::writeValue(String newValue, bool response) { + return writeValue((uint8_t *)newValue.c_str(), newValue.length(), response); } // writeValue /** @@ -544,58 +325,678 @@ void BLERemoteCharacteristic::writeValue(String newValue, bool response) { * @param [in] response Whether we require a response from the write. * @return N/A. */ -void BLERemoteCharacteristic::writeValue(uint8_t newValue, bool response) { - writeValue(&newValue, 1, response); +bool BLERemoteCharacteristic::writeValue(uint8_t newValue, bool response) { + return writeValue(&newValue, 1, response); } // writeValue +/** + * @brief Read raw data from remote characteristic as hex bytes + * @return return pointer data read + */ +uint8_t *BLERemoteCharacteristic::readRawData() { + return m_rawData; +} + +/** + * @brief Set authentication request type for characteristic + * @param [in] auth Authentication request type. + */ +void BLERemoteCharacteristic::setAuth(uint8_t auth) { + m_auth = auth; +} + +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + +/** + * @brief Constructor. + * @param [in] handle The BLE server side handle of this characteristic. + * @param [in] uuid The UUID of this characteristic. + * @param [in] charProp The properties of this characteristic. + * @param [in] pRemoteService A reference to the remote service to which this remote characteristic pertains. + */ +BLERemoteCharacteristic::BLERemoteCharacteristic(uint16_t handle, BLEUUID uuid, esp_gatt_char_prop_t charProp, BLERemoteService *pRemoteService) { + log_v(">> BLERemoteCharacteristic: handle: %d 0x%d, uuid: %s", handle, handle, uuid.toString().c_str()); + m_handle = handle; + m_uuid = uuid; + m_charProp = charProp; + m_pRemoteService = pRemoteService; + m_notifyCallback = nullptr; + m_rawData = nullptr; + m_auth = ESP_GATT_AUTH_REQ_NONE; + + retrieveDescriptors(); // Get the descriptors for this characteristic + log_v("<< BLERemoteCharacteristic"); +} // BLERemoteCharacteristic + +/** + * @brief Handle GATT Client events. + * When an event arrives for a GATT client we give this characteristic the opportunity to + * take a look at it to see if there is interest in it. + * @param [in] event The type of event. + * @param [in] gattc_if The interface on which the event was received. + * @param [in] evtParam Payload data for the event. + * @returns N/A + */ +void BLERemoteCharacteristic::gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *evtParam) { + switch (event) { + // ESP_GATTC_NOTIFY_EVT + // + // notify + // - uint16_t conn_id - The connection identifier of the server. + // - esp_bd_addr_t remote_bda - The device address of the BLE server. + // - uint16_t handle - The handle of the characteristic for which the event is being received. + // - uint16_t value_len - The length of the received data. + // - uint8_t* value - The received data. + // - bool is_notify - True if this is a notify, false if it is an indicate. + // + // We have received a notification event which means that the server wishes us to know about a notification + // piece of data. What we must now do is find the characteristic with the associated handle and then + // invoke its notification callback (if it has one). + case ESP_GATTC_NOTIFY_EVT: + { + if (evtParam->notify.handle != getHandle()) { + break; + } + if (m_notifyCallback != nullptr) { + log_d("Invoking callback for notification on characteristic %s", toString().c_str()); + m_notifyCallback(this, evtParam->notify.value, evtParam->notify.value_len, evtParam->notify.is_notify); + } // End we have a callback function ... + break; + } // ESP_GATTC_NOTIFY_EVT + + // ESP_GATTC_READ_CHAR_EVT + // This event indicates that the server has responded to the read request. + // + // read: + // - esp_gatt_status_t status + // - uint16_t conn_id + // - uint16_t handle + // - uint8_t* value + // - uint16_t value_len + case ESP_GATTC_READ_CHAR_EVT: + { + // If this event is not for us, then nothing further to do. + if (evtParam->read.handle != getHandle()) { + break; + } + + // At this point, we have determined that the event is for us, so now we save the value + // and unlock the semaphore to ensure that the requester of the data can continue. + if (evtParam->read.status == ESP_GATT_OK) { + m_value = String((char *)evtParam->read.value, evtParam->read.value_len); + if (m_rawData != nullptr) { + free(m_rawData); + } + m_rawData = (uint8_t *)calloc(evtParam->read.value_len, sizeof(uint8_t)); + memcpy(m_rawData, evtParam->read.value, evtParam->read.value_len); + } else { + m_value = ""; + } + + m_semaphoreReadCharEvt.give(); + break; + } // ESP_GATTC_READ_CHAR_EVT + + // ESP_GATTC_REG_FOR_NOTIFY_EVT + // + // reg_for_notify: + // - esp_gatt_status_t status + // - uint16_t handle + case ESP_GATTC_REG_FOR_NOTIFY_EVT: + { + // If the request is not for this BLERemoteCharacteristic then move on to the next. + if (evtParam->reg_for_notify.handle != getHandle()) { + break; + } + + // We have processed the notify registration and can unlock the semaphore. + m_semaphoreRegForNotifyEvt.give(); + break; + } // ESP_GATTC_REG_FOR_NOTIFY_EVT + + // ESP_GATTC_UNREG_FOR_NOTIFY_EVT + // + // unreg_for_notify: + // - esp_gatt_status_t status + // - uint16_t handle + case ESP_GATTC_UNREG_FOR_NOTIFY_EVT: + { + if (evtParam->unreg_for_notify.handle != getHandle()) { + break; + } + // We have processed the notify un-registration and can unlock the semaphore. + m_semaphoreRegForNotifyEvt.give(); + break; + } // ESP_GATTC_UNREG_FOR_NOTIFY_EVT: + + // ESP_GATTC_WRITE_CHAR_EVT + // + // write: + // - esp_gatt_status_t status + // - uint16_t conn_id + // - uint16_t handle + case ESP_GATTC_WRITE_CHAR_EVT: + { + // Determine if this event is for us and, if not, pass onwards. + if (evtParam->write.handle != getHandle()) { + break; + } + + // There is nothing further we need to do here. This is merely an indication + // that the write has completed and we can unlock the caller. + m_semaphoreWriteCharEvt.give(); + break; + } // ESP_GATTC_WRITE_CHAR_EVT + + case ESP_GATTC_READ_DESCR_EVT: + case ESP_GATTC_WRITE_DESCR_EVT: + for (auto &myPair : m_descriptorMap) { + myPair.second->gattClientEventHandler(event, gattc_if, evtParam); + } + break; + + case ESP_GATTC_DISCONNECT_EVT: + // Cleanup semaphores to avoid deadlocks. + m_semaphoreReadCharEvt.give(1); + m_semaphoreWriteCharEvt.give(1); + break; + + default: break; + } // End switch +}; // gattClientEventHandler + +/** + * @brief Populate the descriptors (if any) for this characteristic. + */ +void BLERemoteCharacteristic::retrieveDescriptors() { + log_v(">> retrieveDescriptors() for characteristic: %s", getUUID().toString().c_str()); + + removeDescriptors(); // Remove any existing descriptors. + + // Loop over each of the descriptors within the service associated with this characteristic. + // For each descriptor we find, create a BLERemoteDescriptor instance. + uint16_t offset = 0; + esp_gattc_descr_elem_t result; + while (true) { + uint16_t count = 10; + esp_gatt_status_t status = ::esp_ble_gattc_get_all_descr( + getRemoteService()->getClient()->getGattcIf(), getRemoteService()->getClient()->getConnId(), getHandle(), &result, &count, offset + ); + + if (status == ESP_GATT_INVALID_OFFSET) { // We have reached the end of the entries. + break; + } + + if (status != ESP_GATT_OK) { + log_e("esp_ble_gattc_get_all_descr: %s", BLEUtils::gattStatusToString(status).c_str()); + break; + } + + if (count == 0) { + break; + } + + log_d("Found a descriptor: Handle: %d, UUID: %s", result.handle, BLEUUID(result.uuid).toString().c_str()); + + // We now have a new characteristic ... let us add that to our set of known characteristics + BLERemoteDescriptor *pNewRemoteDescriptor = new BLERemoteDescriptor(result.handle, BLEUUID(result.uuid), this); + + m_descriptorMap.insert(std::pair(pNewRemoteDescriptor->getUUID().toString().c_str(), pNewRemoteDescriptor)); + + offset++; + } // while true + //m_haveCharacteristics = true; // Remember that we have received the characteristics. + log_v("<< retrieveDescriptors(): Found %d descriptors.", offset); +} // getDescriptors + +/** + * @brief Read the value of the remote characteristic. + * @return The value of the remote characteristic. + */ +String BLERemoteCharacteristic::readValue() { + log_v(">> readValue(): uuid: %s, handle: %d 0x%.2x", getUUID().toString().c_str(), getHandle(), getHandle()); + + // Check to see that we are connected. + if (!getRemoteService()->getClient()->isConnected()) { + log_e("Disconnected"); + return String(); + } + + m_semaphoreReadCharEvt.take("readValue"); + + // Ask the BLE subsystem to retrieve the value for the remote hosted characteristic. + // This is an asynchronous request which means that we must block waiting for the response + // to become available. + esp_err_t errRc = ::esp_ble_gattc_read_char( + m_pRemoteService->getClient()->getGattcIf(), + m_pRemoteService->getClient()->getConnId(), // The connection ID to the BLE server + getHandle(), // The handle of this characteristic + (esp_gatt_auth_req_t)m_auth + ); // Security + + if (errRc != ESP_OK) { + log_e("esp_ble_gattc_read_char: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + return ""; + } + + // Block waiting for the event that indicates that the read has completed. When it has, the String found + // in m_value will contain our data. + m_semaphoreReadCharEvt.wait("readValue"); + + log_v("<< readValue(): length: %d", m_value.length()); + return m_value; +} // readValue + /** * @brief Write the new value for the characteristic from a data buffer. * @param [in] data A pointer to a data buffer. * @param [in] length The length of the data in the data buffer. * @param [in] response Whether we require a response from the write. + * @return True if successful */ -void BLERemoteCharacteristic::writeValue(uint8_t *data, size_t length, bool response) { +bool BLERemoteCharacteristic::writeValue(uint8_t *data, size_t length, bool response) { // writeValue(String((char*)data, length), response); log_v(">> writeValue(), length: %d", length); // Check to see that we are connected. if (!getRemoteService()->getClient()->isConnected()) { log_e("Disconnected"); - return; + return false; } m_semaphoreWriteCharEvt.take("writeValue"); // Invoke the ESP-IDF API to perform the write. esp_err_t errRc = ::esp_ble_gattc_write_char( m_pRemoteService->getClient()->getGattcIf(), m_pRemoteService->getClient()->getConnId(), getHandle(), length, data, - response ? ESP_GATT_WRITE_TYPE_RSP : ESP_GATT_WRITE_TYPE_NO_RSP, m_auth + response ? ESP_GATT_WRITE_TYPE_RSP : ESP_GATT_WRITE_TYPE_NO_RSP, (esp_gatt_auth_req_t)m_auth ); if (errRc != ESP_OK) { log_e("esp_ble_gattc_write_char: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - return; + return false; } m_semaphoreWriteCharEvt.wait("writeValue"); log_v("<< writeValue"); + return true; } // writeValue +#endif + +/*************************************************************************** + * NimBLE functions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + /** - * @brief Read raw data from remote characteristic as hex bytes - * @return return pointer data read + * @brief Constructor. + * @param [in] reference to the service this characteristic belongs to. + * @param [in] ble_gatt_chr struct defined as: + * struct ble_gatt_chr { + * uint16_t def_handle; + * uint16_t val_handle; + * uint8_t properties; + * ble_uuid_any_t uuid; + * }; */ -uint8_t *BLERemoteCharacteristic::readRawData() { - return m_rawData; +BLERemoteCharacteristic::BLERemoteCharacteristic(BLERemoteService *pRemoteService, const struct ble_gatt_chr *chr) { + log_v(">> BLERemoteCharacteristic()"); + switch (chr->uuid.u.type) { + case BLE_UUID_TYPE_16: m_uuid = BLEUUID(chr->uuid.u16.value); break; + case BLE_UUID_TYPE_32: m_uuid = BLEUUID(chr->uuid.u32.value); break; + case BLE_UUID_TYPE_128: m_uuid = BLEUUID(const_cast(&chr->uuid.u128)); break; + default: break; + } + + m_handle = chr->val_handle; + m_defHandle = chr->def_handle; + m_endHandle = 0; + m_charProp = chr->properties; + m_pRemoteService = pRemoteService; + m_notifyCallback = nullptr; + m_rawData = nullptr; + m_auth = 0; + + retrieveDescriptors(); // Get the descriptors for this characteristic + + log_v("<< BLERemoteCharacteristic(): %s", m_uuid.toString().c_str()); +} // BLERemoteCharacteristic + +/** + * @brief Callback used by the API when a descriptor is discovered or search complete. + */ +int BLERemoteCharacteristic::descriptorDiscCB( + uint16_t conn_handle, const struct ble_gatt_error *error, uint16_t chr_val_handle, const struct ble_gatt_dsc *dsc, void *arg +) { + int rc = error->status; + log_d("Descriptor Discovered >> status: %d handle: %d", rc, (rc == 0) ? dsc->handle : -1); + + desc_filter_t *filter = (desc_filter_t *)arg; + const BLEUUID *uuid_filter = filter->uuid; + BLETaskData *pTaskData = (BLETaskData *)filter->task_data; + BLERemoteCharacteristic *characteristic = (BLERemoteCharacteristic *)pTaskData->m_pInstance; + + if (characteristic->getRemoteService()->getClient()->getConnId() != conn_handle) { + return 0; + } + + if (rc == 0 && characteristic->getHandle() == chr_val_handle && (!uuid_filter || ble_uuid_cmp(&uuid_filter->getNative()->u, &dsc->uuid.u) == 0)) { + BLERemoteDescriptor *pNewRemoteDescriptor = new BLERemoteDescriptor(characteristic, dsc); + characteristic->m_descriptorMap.insert( + std::pair(pNewRemoteDescriptor->getUUID().toString().c_str(), pNewRemoteDescriptor) + ); + rc = !!uuid_filter * BLE_HS_EDONE; + } + + if (rc != 0) { + BLEUtils::taskRelease(*pTaskData, rc); + log_d("<< Descriptor Discovery"); + } + + return rc; } /** - * @brief Set authentication request type for characteristic - * @param [in] auth Authentication request type. + * @brief Callback for characteristic read operation. + * @return success == 0 or error code. */ -void BLERemoteCharacteristic::setAuth(esp_gatt_auth_req_t auth) { - m_auth = auth; +int BLERemoteCharacteristic::onReadCB(uint16_t conn_handle, const struct ble_gatt_error *error, struct ble_gatt_attr *attr, void *arg) { + BLETaskData *pTaskData = static_cast(arg); + BLERemoteCharacteristic *characteristic = static_cast(pTaskData->m_pInstance); + + if (error->status == BLE_HS_ENOTCONN) { + log_e("<< Characteristic Read; Not connected"); + BLEUtils::taskRelease(*pTaskData, error->status); + return error->status; + } + + if (characteristic->getRemoteService()->getClient()->getConnId() != conn_handle) { + return 0; + } + + int rc = error->status; + log_i("Read complete; status=%d conn_handle=%d", rc, conn_handle); + + String *strBuf = (String *)pTaskData->m_pBuf; + + if (rc == 0) { + if (attr) { + uint32_t data_len = OS_MBUF_PKTLEN(attr->om); + if (((*strBuf).length() + data_len) > BLE_ATT_ATTR_MAX_LEN) { + rc = BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN; + } else { + log_i("Got %d bytes", data_len); + (*strBuf) += String((char *)attr->om->om_data, data_len); + return 0; + } + } + } + + BLEUtils::taskRelease(*pTaskData, rc); + return rc; } -#endif /* CONFIG_BLUEDROID_ENABLED */ +/** + * @brief Callback for characteristic write operation. + * @return success == 0 or error code. + */ +int BLERemoteCharacteristic::onWriteCB(uint16_t conn_handle, const struct ble_gatt_error *error, struct ble_gatt_attr *attr, void *arg) { + BLETaskData *pTaskData = static_cast(arg); + BLERemoteCharacteristic *characteristic = static_cast(pTaskData->m_pInstance); + + if (error->status == BLE_HS_ENOTCONN) { + log_e("<< Characteristic Write; Not connected"); + BLEUtils::taskRelease(*pTaskData, error->status); + return error->status; + } + + if (characteristic->getRemoteService()->getClient()->getConnId() != conn_handle) { + return 0; + } + + log_i("Write complete; status=%d conn_handle=%d", error->status, conn_handle); + BLEUtils::taskRelease(*pTaskData, error->status); + return 0; +} + +/** + * @brief Populate the descriptors (if any) for this characteristic. + * @param [in] the end handle of the characteristic, or the service, whichever comes first. + */ +bool BLERemoteCharacteristic::retrieveDescriptors(const BLEUUID *uuid_filter) { + log_d(">> retrieveDescriptors() for characteristic: %s", getUUID().toString().c_str()); + + // If this is the last handle then there are no descriptors + if (m_handle == getRemoteService()->getEndHandle()) { + log_d("<< retrieveDescriptors(): No descriptors found"); + return true; + } + + BLETaskData taskData(const_cast(this)); + desc_filter_t filter = {uuid_filter, &taskData}; + int rc = 0; + + rc = ble_gattc_disc_all_dscs(getRemoteService()->getClient()->getConnId(), m_handle, m_endHandle, BLERemoteCharacteristic::descriptorDiscCB, &filter); + + if (rc != 0) { + log_e("ble_gattc_disc_all_dscs: rc=%d %s", rc, BLEUtils::returnCodeToString(rc)); + return false; + } + + [[maybe_unused]] + size_t prevDscCount = m_descriptorMap.size(); + BLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER); + rc = ((BLETaskData *)filter.task_data)->m_flags; + + if (rc != BLE_HS_EDONE) { + log_e("<< retrieveDescriptors(): failed: rc=%d %s", rc, BLEUtils::returnCodeToString(rc)); + return false; + } + + log_d("<< retrieveDescriptors(): Found %d descriptors.", m_descriptorMap.size() - prevDscCount); + return true; +} // retrieveDescriptors + +/** + * @brief Read the value of the remote characteristic. + * @return The value of the remote characteristic. + */ +String BLERemoteCharacteristic::readValue() { + log_d(">> readValue(): uuid: %s, handle: %d 0x%.2x", getUUID().toString().c_str(), getHandle(), getHandle()); + + BLEClient *pClient = getRemoteService()->getClient(); + String value{}; + + if (!pClient->isConnected()) { + log_e("Disconnected"); + return value; + } + + int rc = 0; + int retryCount = 1; + BLETaskData taskData(const_cast(this), 0, &value); + + do { + rc = ble_gattc_read_long(pClient->getConnId(), m_handle, 0, BLERemoteCharacteristic::onReadCB, &taskData); + if (rc != 0) { + goto exit; + } + + BLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER); + rc = taskData.m_flags; + + switch (rc) { + case 0: + case BLE_HS_EDONE: rc = 0; break; + // Characteristic is not long-readable, return with what we have. + case BLE_HS_ATT_ERR(BLE_ATT_ERR_ATTR_NOT_LONG): + log_i("Attribute not long"); + rc = ble_gattc_read(pClient->getConnId(), m_handle, BLERemoteCharacteristic::onReadCB, &taskData); + if (rc != 0) { + goto exit; + } + retryCount++; + break; + case BLE_HS_ATT_ERR(BLE_ATT_ERR_INSUFFICIENT_AUTHEN): + case BLE_HS_ATT_ERR(BLE_ATT_ERR_INSUFFICIENT_AUTHOR): + case BLE_HS_ATT_ERR(BLE_ATT_ERR_INSUFFICIENT_ENC): + if (retryCount && pClient->secureConnection()) { + break; + } + /* Else falls through. */ + default: goto exit; + } + } while (rc != 0 && retryCount--); + + m_semaphoreReadCharEvt.take("readValue"); + m_value = value; + m_rawData = (uint8_t *)calloc(value.length(), sizeof(uint8_t)); + for (size_t i = 0; i < value.length(); i++) { + m_rawData[i] = value[i]; + } + m_semaphoreReadCharEvt.give(); + +exit: + if (rc != 0) { + log_e("<< readValue failed rc=%d, %s", rc, BLEUtils::returnCodeToString(rc)); + } else { + log_d("<< readValue length: %d rc=%d", value.length(), rc); + } + + return value; +} // readValue + +/** + * @brief Write the new value for the characteristic from a data buffer. + * @param [in] data A pointer to a data buffer. + * @param [in] length The length of the data in the data buffer. + * @param [in] response Whether we require a response from the write. + * @return false if not connected or cant perform write for some reason. + */ +bool BLERemoteCharacteristic::writeValue(uint8_t *data, size_t length, bool response) { + log_d(">> writeValue(), length: %d", length); + + BLEClient *pClient = getRemoteService()->getClient(); + + if (!pClient->isConnected()) { + log_e("Disconnected"); + return false; + } + + int rc = 0; + int retryCount = 1; + uint16_t mtu = ble_att_mtu(pClient->getConnId()) - 3; + BLETaskData taskData(const_cast(this)); + + // Check if the data length is longer than we can write in one connection event. + // If so we must do a long write which requires a response. + if (length <= mtu && !response) { + rc = ble_gattc_write_no_rsp_flat(pClient->getConnId(), m_handle, data, length); + goto exit; + } + + do { + if (length > mtu) { + log_i("long write %d bytes", length); + os_mbuf *om = ble_hs_mbuf_from_flat(data, length); + rc = ble_gattc_write_long(pClient->getConnId(), m_handle, 0, om, BLERemoteCharacteristic::onWriteCB, &taskData); + } else { + rc = ble_gattc_write_flat(pClient->getConnId(), m_handle, data, length, BLERemoteCharacteristic::onWriteCB, &taskData); + } + if (rc != 0) { + goto exit; + } + + BLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER); + rc = taskData.m_flags; + + switch (rc) { + case 0: + case BLE_HS_EDONE: rc = 0; break; + case BLE_HS_ATT_ERR(BLE_ATT_ERR_ATTR_NOT_LONG): + log_e("Long write not supported by peer; Truncating length to %d", mtu); + retryCount++; + length = mtu; + break; + + case BLE_HS_ATT_ERR(BLE_ATT_ERR_INSUFFICIENT_AUTHEN): + case BLE_HS_ATT_ERR(BLE_ATT_ERR_INSUFFICIENT_AUTHOR): + case BLE_HS_ATT_ERR(BLE_ATT_ERR_INSUFFICIENT_ENC): + if (retryCount && pClient->secureConnection()) { + break; + } + /* Else falls through. */ + default: goto exit; + } + } while (rc != 0 && retryCount--); + +exit: + if (rc != 0) { + log_e("<< writeValue failed rc=%d, %s", rc, BLEUtils::returnCodeToString(rc)); + } else { + log_d("<< writeValue success. length: %d rc=%d", length, rc); + } + + return (rc == 0); +} // writeValue + +/** + * @brief Subscribe or unsubscribe for notifications or indications. + * @param [in] val 0x00 to unsubscribe, 0x01 for notifications, 0x02 for indications. + * @param [in] notifyCallback A callback to be invoked for a notification. + * @param [in] response If write response required set this to true. + * If NULL is provided then no callback is performed. + * @return false if writing to the descriptor failed. + */ +bool BLERemoteCharacteristic::setNotify(uint16_t val, notify_callback notifyCallback, bool response) { + log_v(">> setNotify(): %s, %02x", toString().c_str(), val); + + m_notifyCallback = notifyCallback; + + BLERemoteDescriptor *desc = getDescriptor(BLEUUID((uint16_t)0x2902)); + if (desc == nullptr) { + log_w("<< setNotify(): Callback set, CCCD not found"); + return true; + } + + log_d("<< setNotify()"); + + response = true; // Always write with response as per Bluetooth core specification. + return desc->writeValue((uint8_t *)&val, 2, response); +} // setNotify + +/** + * @brief Subscribe for notifications or indications. + * @param [in] notifications If true, subscribe for notifications, false subscribe for indications. + * @param [in] notifyCallback A callback to be invoked for a notification. + * @param [in] response If true, require a write response from the descriptor write operation. + * If NULL is provided then no callback is performed. + * @return false if writing to the descriptor failed. + */ +bool BLERemoteCharacteristic::subscribe(bool notifications, notify_callback notifyCallback, bool response) { + if (notifications) { + return setNotify(0x01, notifyCallback, response); + } else { + return setNotify(0x02, notifyCallback, response); + } +} // subscribe + +/** + * @brief Unsubscribe for notifications or indications. + * @param [in] response bool if true, require a write response from the descriptor write operation. + * @return false if writing to the descriptor failed. + */ +bool BLERemoteCharacteristic::unsubscribe(bool response) { + return setNotify(0x00, nullptr, response); +} // unsubscribe + +#endif + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLERemoteCharacteristic.h b/libraries/BLE/src/BLERemoteCharacteristic.h index dc63a3bc1a6..81ad7b2f4f5 100644 --- a/libraries/BLE/src/BLERemoteCharacteristic.h +++ b/libraries/BLE/src/BLERemoteCharacteristic.h @@ -3,6 +3,10 @@ * * Created on: Jul 8, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLEREMOTECHARACTERISTIC_H_ @@ -11,27 +15,80 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) -#include +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) -#include +/*************************************************************************** + * Common includes * + ***************************************************************************/ +#include #include "BLERemoteService.h" #include "BLERemoteDescriptor.h" #include "BLEUUID.h" #include "RTOS.h" +#include "BLEUtils.h" + +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#endif + +/*************************************************************************** + * NimBLE includes and definitions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#include +#include + +#define ESP_GATT_MAX_ATTR_LEN BLE_ATT_ATTR_MAX_LEN +#define ESP_GATT_CHAR_PROP_BIT_READ BLE_GATT_CHR_PROP_READ +#define ESP_GATT_CHAR_PROP_BIT_WRITE BLE_GATT_CHR_PROP_WRITE +#define ESP_GATT_CHAR_PROP_BIT_WRITE_NR BLE_GATT_CHR_PROP_WRITE_NO_RSP +#define ESP_GATT_CHAR_PROP_BIT_BROADCAST BLE_GATT_CHR_PROP_BROADCAST +#define ESP_GATT_CHAR_PROP_BIT_NOTIFY BLE_GATT_CHR_PROP_NOTIFY +#define ESP_GATT_CHAR_PROP_BIT_INDICATE BLE_GATT_CHR_PROP_INDICATE + +#endif + +/*************************************************************************** + * Common types * + ***************************************************************************/ + +typedef std::function notify_callback; + +/*************************************************************************** + * NimBLE types * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +typedef struct { + const BLEUUID *uuid; + void *task_data; +} desc_filter_t; +#endif + +/*************************************************************************** + * Forward declarations * + ***************************************************************************/ class BLERemoteService; class BLERemoteDescriptor; -typedef std::function notify_callback; + /** * @brief A model of a remote %BLE characteristic. */ class BLERemoteCharacteristic { public: - ~BLERemoteCharacteristic(); + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ - // Public member functions + ~BLERemoteCharacteristic(); bool canBroadcast(); bool canIndicate(); bool canNotify(); @@ -49,29 +106,34 @@ class BLERemoteCharacteristic { uint32_t readUInt32(); float readFloat(); void registerForNotify(notify_callback _callback, bool notifications = true, bool descriptorRequiresRegistration = true); - void writeValue(uint8_t *data, size_t length, bool response = false); - void writeValue(String newValue, bool response = false); - void writeValue(uint8_t newValue, bool response = false); + bool writeValue(uint8_t *data, size_t length, bool response = false); + bool writeValue(String newValue, bool response = false); + bool writeValue(uint8_t newValue, bool response = false); String toString(); uint8_t *readRawData(); - void setAuth(esp_gatt_auth_req_t auth); + void setAuth(uint8_t auth); + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + bool subscribe(bool notifications = true, notify_callback notifyCallback = nullptr, bool response = true); + bool unsubscribe(bool response = true); +#endif private: - BLERemoteCharacteristic(uint16_t handle, BLEUUID uuid, esp_gatt_char_prop_t charProp, BLERemoteService *pRemoteService); friend class BLEClient; friend class BLERemoteService; friend class BLERemoteDescriptor; - // Private member functions - void gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *evtParam); - - void removeDescriptors(); - void retrieveDescriptors(); + /*************************************************************************** + * Common private properties * + ***************************************************************************/ - // Private properties BLEUUID m_uuid; - esp_gatt_char_prop_t m_charProp; - esp_gatt_auth_req_t m_auth; + uint8_t m_charProp; + uint8_t m_auth; uint16_t m_handle; BLERemoteService *m_pRemoteService; FreeRTOS::Semaphore m_semaphoreReadCharEvt = FreeRTOS::Semaphore("ReadCharEvt"); @@ -83,8 +145,46 @@ class BLERemoteCharacteristic { // We maintain a map of descriptors owned by this characteristic keyed by a string representation of the UUID. std::map m_descriptorMap; + + /*************************************************************************** + * NimBLE private properties * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + uint16_t m_defHandle; + uint16_t m_endHandle; +#endif + + /*************************************************************************** + * Common private declarations * + ***************************************************************************/ + + void removeDescriptors(); + + /*************************************************************************** + * Bluedroid private declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + BLERemoteCharacteristic(uint16_t handle, BLEUUID uuid, uint8_t charProp, BLERemoteService *pRemoteService); + void retrieveDescriptors(); + void gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *evtParam); +#endif + + /*************************************************************************** + * NimBLE private declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + BLERemoteCharacteristic(BLERemoteService *pRemoteservice, const struct ble_gatt_chr *chr); + bool setNotify(uint16_t val, notify_callback notifyCallback = nullptr, bool response = true); + bool retrieveDescriptors(const BLEUUID *uuid_filter = nullptr); + static int onReadCB(uint16_t conn_handle, const struct ble_gatt_error *error, struct ble_gatt_attr *attr, void *arg); + static int onWriteCB(uint16_t conn_handle, const struct ble_gatt_error *error, struct ble_gatt_attr *attr, void *arg); + static int descriptorDiscCB(uint16_t conn_handle, const struct ble_gatt_error *error, uint16_t chr_val_handle, const struct ble_gatt_dsc *dsc, void *arg); +#endif }; // BLERemoteCharacteristic -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLEREMOTECHARACTERISTIC_H_ */ diff --git a/libraries/BLE/src/BLERemoteDescriptor.cpp b/libraries/BLE/src/BLERemoteDescriptor.cpp index b6d654cf9ec..a142fe11880 100644 --- a/libraries/BLE/src/BLERemoteDescriptor.cpp +++ b/libraries/BLE/src/BLERemoteDescriptor.cpp @@ -3,23 +3,48 @@ * * Created on: Jul 8, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + +#include "WString.h" #include #include "BLERemoteDescriptor.h" #include "GeneralUtils.h" #include "esp32-hal-log.h" -BLERemoteDescriptor::BLERemoteDescriptor(uint16_t handle, BLEUUID uuid, BLERemoteCharacteristic *pRemoteCharacteristic) { +/*************************************************************************** + * NimBLE includes * + ***************************************************************************/ +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#include +#include +#include +#endif + +/*************************************************************************** + * Common functions * + ***************************************************************************/ + +BLERemoteDescriptor::BLERemoteDescriptor(uint16_t handle, BLEUUID uuid, BLERemoteCharacteristic *pRemoteCharacteristic) { m_handle = handle; m_uuid = uuid; m_pRemoteCharacteristic = pRemoteCharacteristic; - m_auth = ESP_GATT_AUTH_REQ_NONE; + m_auth = 0; } /** @@ -46,6 +71,75 @@ BLEUUID BLERemoteDescriptor::getUUID() { return m_uuid; } // getUUID +uint8_t BLERemoteDescriptor::readUInt8() { + String value = readValue(); + if (value.length() >= 1) { + return (uint8_t)value[0]; + } + return 0; +} // readUInt8 + +uint16_t BLERemoteDescriptor::readUInt16() { + String value = readValue(); + if (value.length() >= 2) { + return *(uint16_t *)value.c_str(); + } + return 0; +} // readUInt16 + +uint32_t BLERemoteDescriptor::readUInt32() { + String value = readValue(); + if (value.length() >= 4) { + return *(uint32_t *)value.c_str(); + } + return 0; +} // readUInt32 + +/** + * @brief Return a string representation of this BLE Remote Descriptor. + * @return A string representation of this BLE Remote Descriptor. + */ +String BLERemoteDescriptor::toString() { + char val[6]; + snprintf(val, sizeof(val), "%d", getHandle()); + String res = "handle: "; + res += val; + res += ", uuid: " + getUUID().toString(); + return res; +} // toString + +/** + * @brief Write data represented as a string to the BLE Remote Descriptor. + * @param [in] newValue The data to send to the remote descriptor. + * @param [in] response True if we expect a response. + */ +bool BLERemoteDescriptor::writeValue(String newValue, bool response) { + return writeValue((uint8_t *)newValue.c_str(), newValue.length(), response); +} // writeValue + +/** + * @brief Write a byte value to the Descriptor. + * @param [in] The single byte to write. + * @param [in] True if we expect a response. + */ +bool BLERemoteDescriptor::writeValue(uint8_t newValue, bool response) { + return writeValue(&newValue, 1, response); +} // writeValue + +/** + * @brief Set authentication request type for characteristic + * @param [in] auth Authentication request type. + */ +void BLERemoteDescriptor::setAuth(uint8_t auth) { + m_auth = auth; +} + +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + void BLERemoteDescriptor::gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *evtParam) { switch (event) { // ESP_GATTC_READ_DESCR_EVT @@ -99,7 +193,7 @@ String BLERemoteDescriptor::readValue() { m_pRemoteCharacteristic->getRemoteService()->getClient()->getGattcIf(), m_pRemoteCharacteristic->getRemoteService()->getClient()->getConnId(), // The connection ID to the BLE server getHandle(), // The handle of this characteristic - m_auth + (esp_gatt_auth_req_t)m_auth ); // Security if (errRc != ESP_OK) { @@ -115,55 +209,19 @@ String BLERemoteDescriptor::readValue() { return m_value; } // readValue -uint8_t BLERemoteDescriptor::readUInt8() { - String value = readValue(); - if (value.length() >= 1) { - return (uint8_t)value[0]; - } - return 0; -} // readUInt8 - -uint16_t BLERemoteDescriptor::readUInt16() { - String value = readValue(); - if (value.length() >= 2) { - return *(uint16_t *)value.c_str(); - } - return 0; -} // readUInt16 - -uint32_t BLERemoteDescriptor::readUInt32() { - String value = readValue(); - if (value.length() >= 4) { - return *(uint32_t *)value.c_str(); - } - return 0; -} // readUInt32 - -/** - * @brief Return a string representation of this BLE Remote Descriptor. - * @return A string representation of this BLE Remote Descriptor. - */ -String BLERemoteDescriptor::toString() { - char val[6]; - snprintf(val, sizeof(val), "%d", getHandle()); - String res = "handle: "; - res += val; - res += ", uuid: " + getUUID().toString(); - return res; -} // toString - /** * @brief Write data to the BLE Remote Descriptor. * @param [in] data The data to send to the remote descriptor. * @param [in] length The length of the data to send. * @param [in] response True if we expect a response. + * @return True if successful */ -void BLERemoteDescriptor::writeValue(uint8_t *data, size_t length, bool response) { +bool BLERemoteDescriptor::writeValue(uint8_t *data, size_t length, bool response) { log_v(">> writeValue: %s", toString().c_str()); // Check to see that we are connected. if (!getRemoteCharacteristic()->getRemoteService()->getClient()->isConnected()) { log_e("Disconnected"); - return; + return false; } m_semaphoreWriteDescrEvt.take("writeValue"); @@ -172,7 +230,7 @@ void BLERemoteDescriptor::writeValue(uint8_t *data, size_t length, bool response m_pRemoteCharacteristic->getRemoteService()->getClient()->getGattcIf(), m_pRemoteCharacteristic->getRemoteService()->getClient()->getConnId(), getHandle(), length, // Data length data, // Data - response ? ESP_GATT_WRITE_TYPE_RSP : ESP_GATT_WRITE_TYPE_NO_RSP, m_auth + response ? ESP_GATT_WRITE_TYPE_RSP : ESP_GATT_WRITE_TYPE_NO_RSP, (esp_gatt_auth_req_t)m_auth ); if (errRc != ESP_OK) { log_e("esp_ble_gattc_write_char_descr: %d", errRc); @@ -180,33 +238,246 @@ void BLERemoteDescriptor::writeValue(uint8_t *data, size_t length, bool response m_semaphoreWriteDescrEvt.wait("writeValue"); log_v("<< writeValue"); + return (errRc == ESP_OK); } // writeValue +#endif + +/*************************************************************************** + * NimBLE functions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + /** - * @brief Write data represented as a string to the BLE Remote Descriptor. - * @param [in] newValue The data to send to the remote descriptor. - * @param [in] response True if we expect a response. + * @brief Remote descriptor constructor. + * @param [in] pRemoteCharacteristic A pointer to the Characteristic that this belongs to. + * @param [in] dsc A pointer to the struct that contains the descriptor information. */ -void BLERemoteDescriptor::writeValue(String newValue, bool response) { - writeValue((uint8_t *)newValue.c_str(), newValue.length(), response); -} // writeValue +BLERemoteDescriptor::BLERemoteDescriptor(BLERemoteCharacteristic *pRemoteCharacteristic, const struct ble_gatt_dsc *dsc) { + log_d(">> BLERemoteDescriptor()"); + switch (dsc->uuid.u.type) { + case BLE_UUID_TYPE_16: m_uuid = BLEUUID(dsc->uuid.u16.value); break; + case BLE_UUID_TYPE_32: m_uuid = BLEUUID(dsc->uuid.u32.value); break; + case BLE_UUID_TYPE_128: m_uuid = BLEUUID(const_cast(&dsc->uuid.u128)); break; + default: break; + } + + m_handle = dsc->handle; + m_pRemoteCharacteristic = pRemoteCharacteristic; + m_auth = 0; + + log_d("<< BLERemoteDescriptor(): %s", m_uuid.toString().c_str()); +} /** - * @brief Write a byte value to the Descriptor. - * @param [in] The single byte to write. - * @param [in] True if we expect a response. + * @brief Read the value of the remote descriptor. + * @return The value of the remote descriptor. */ -void BLERemoteDescriptor::writeValue(uint8_t newValue, bool response) { - writeValue(&newValue, 1, response); -} // writeValue +String BLERemoteDescriptor::readValue() { + log_d(">> Descriptor readValue: %s", toString().c_str()); + + BLEClient *pClient = getRemoteCharacteristic()->getRemoteService()->getClient(); + String value{}; + + if (!pClient->isConnected()) { + log_e("Disconnected"); + return value; + } + + int rc = 0; + int retryCount = 1; + BLETaskData taskData(const_cast(this), 0, &value); + + do { + rc = ble_gattc_read_long(pClient->getConnId(), m_handle, 0, BLERemoteDescriptor::onReadCB, &taskData); + if (rc != 0) { + goto exit; + } + + BLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER); + rc = taskData.m_flags; + + switch (rc) { + case 0: + case BLE_HS_EDONE: rc = 0; break; + // Descriptor is not long-readable, return with what we have. + case BLE_HS_ATT_ERR(BLE_ATT_ERR_ATTR_NOT_LONG): + log_i("Attribute not long"); + rc = ble_gattc_read(pClient->getConnId(), m_handle, BLERemoteDescriptor::onReadCB, &taskData); + if (rc != 0) { + goto exit; + } + retryCount++; + break; + case BLE_HS_ATT_ERR(BLE_ATT_ERR_INSUFFICIENT_AUTHEN): + case BLE_HS_ATT_ERR(BLE_ATT_ERR_INSUFFICIENT_AUTHOR): + case BLE_HS_ATT_ERR(BLE_ATT_ERR_INSUFFICIENT_ENC): + if (retryCount && pClient->secureConnection()) { + break; + } + /* Else falls through. */ + default: goto exit; + } + } while (rc != 0 && retryCount--); + + m_semaphoreReadDescrEvt.take("readValue"); + m_value = value; + m_semaphoreReadDescrEvt.give(); + +exit: + if (rc != 0) { + log_e("<< readValue failed rc=%d, %s", rc, BLEUtils::returnCodeToString(rc)); + } else { + log_d("<< Descriptor readValue(): length: %d rc=%d", value.length(), rc); + } + + return value; +} // readValue /** - * @brief Set authentication request type for characteristic - * @param [in] auth Authentication request type. + * @brief Callback for Descriptor read operation. + * @return success == 0 or error code. */ -void BLERemoteDescriptor::setAuth(esp_gatt_auth_req_t auth) { - m_auth = auth; +int BLERemoteDescriptor::onReadCB(uint16_t conn_handle, const struct ble_gatt_error *error, struct ble_gatt_attr *attr, void *arg) { + BLETaskData *pTaskData = static_cast(arg); + BLERemoteDescriptor *desc = static_cast(pTaskData->m_pInstance); + uint16_t conn_id = desc->getRemoteCharacteristic()->getRemoteService()->getClient()->getConnId(); + + if (error->status == BLE_HS_ENOTCONN) { + log_e("<< Descriptor Read; Not connected"); + BLEUtils::taskRelease(*pTaskData, error->status); + return error->status; + } + + if (conn_id != conn_handle) { + return 0; + } + + log_d("Read complete; status=%d conn_handle=%d", error->status, conn_handle); + + String *strBuf = static_cast(pTaskData->m_pBuf); + int rc = error->status; + + if (rc == 0) { + if (attr) { + uint32_t data_len = OS_MBUF_PKTLEN(attr->om); + if (((*strBuf).length() + data_len) > BLE_ATT_ATTR_MAX_LEN) { + rc = BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN; + } else { + log_d("Got %d bytes", data_len); + (*strBuf) += String((char *)attr->om->om_data, data_len); + return 0; + } + } + } + + BLEUtils::taskRelease(*pTaskData, rc); + return rc; +} + +/** + * @brief Callback for descriptor write operation. + * @return success == 0 or error code. + */ +int BLERemoteDescriptor::onWriteCB(uint16_t conn_handle, const struct ble_gatt_error *error, struct ble_gatt_attr *attr, void *arg) { + BLETaskData *pTaskData = static_cast(arg); + BLERemoteDescriptor *descriptor = static_cast(pTaskData->m_pInstance); + int rc = error->status; + + if (rc == BLE_HS_ENOTCONN) { + log_e("<< Descriptor Write; Not connected"); + BLEUtils::taskRelease(*pTaskData, rc); + return rc; + } + + if (descriptor->getRemoteCharacteristic()->getRemoteService()->getClient()->getConnId() != conn_handle) { + return 0; + } + + log_i("Write complete; status=%d conn_handle=%d", rc, conn_handle); + + BLEUtils::taskRelease(*pTaskData, rc); + return 0; } -#endif /* CONFIG_BLUEDROID_ENABLED */ +/** + * @brief Write data to the BLE Remote Descriptor. + * @param [in] data The data to send to the remote descriptor. + * @param [in] length The length of the data to send. + * @param [in] response True if we expect a write response. + * @return True if successful + */ +bool BLERemoteDescriptor::writeValue(uint8_t *data, size_t length, bool response) { + log_d(">> Descriptor writeValue: %s", toString().c_str()); + + BLEClient *pClient = getRemoteCharacteristic()->getRemoteService()->getClient(); + + // Check to see that we are connected. + if (!pClient->isConnected()) { + log_e("Disconnected"); + return false; + } + + int rc = 0; + int retryCount = 1; + uint16_t mtu = ble_att_mtu(pClient->getConnId()) - 3; + BLETaskData taskData(const_cast(this)); + + // Check if the data length is longer than we can write in 1 connection event. + // If so we must do a long write which requires a response. + if (length <= mtu && !response) { + rc = ble_gattc_write_no_rsp_flat(pClient->getConnId(), m_handle, data, length); + goto exit; + } + + do { + if (length > mtu) { + log_i("long write %d bytes", length); + os_mbuf *om = ble_hs_mbuf_from_flat(data, length); + rc = ble_gattc_write_long(pClient->getConnId(), m_handle, 0, om, BLERemoteDescriptor::onWriteCB, &taskData); + } else { + rc = ble_gattc_write_flat(pClient->getConnId(), m_handle, data, length, BLERemoteDescriptor::onWriteCB, &taskData); + } + + if (rc != 0) { + goto exit; + } + + BLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER); + rc = taskData.m_flags; + + switch (rc) { + case 0: + case BLE_HS_EDONE: rc = 0; break; + case BLE_HS_ATT_ERR(BLE_ATT_ERR_ATTR_NOT_LONG): + log_e("Long write not supported by peer; Truncating length to %d", mtu); + retryCount++; + length = mtu; + break; + + case BLE_HS_ATT_ERR(BLE_ATT_ERR_INSUFFICIENT_AUTHEN): + case BLE_HS_ATT_ERR(BLE_ATT_ERR_INSUFFICIENT_AUTHOR): + case BLE_HS_ATT_ERR(BLE_ATT_ERR_INSUFFICIENT_ENC): + if (retryCount && pClient->secureConnection()) { + break; + } + /* Else falls through. */ + default: goto exit; + } + } while (rc != 0 && retryCount--); + +exit: + if (rc != 0) { + log_e("<< writeValue failed rc=%d, %s", rc, BLEUtils::returnCodeToString(rc)); + } else { + log_d("<< writeValue success. length: %d rc=%d", length, rc); + } + + return (rc == 0); +} // writeValue + +#endif + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLERemoteDescriptor.h b/libraries/BLE/src/BLERemoteDescriptor.h index 94b11f1490a..afe113df551 100644 --- a/libraries/BLE/src/BLERemoteDescriptor.h +++ b/libraries/BLE/src/BLERemoteDescriptor.h @@ -3,6 +3,10 @@ * * Created on: Jul 8, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLEREMOTEDESCRIPTOR_H_ @@ -11,21 +15,41 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) -#include +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) -#include +/*************************************************************************** + * Common includes * + ***************************************************************************/ +#include #include "BLERemoteCharacteristic.h" #include "BLEUUID.h" #include "RTOS.h" +#include "BLEUtils.h" + +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#endif + +/*************************************************************************** + * Forward declarations * + ***************************************************************************/ class BLERemoteCharacteristic; + /** * @brief A model of remote %BLE descriptor. */ class BLERemoteDescriptor { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + uint16_t getHandle(); BLERemoteCharacteristic *getRemoteCharacteristic(); BLEUUID getUUID(); @@ -34,24 +58,50 @@ class BLERemoteDescriptor { uint16_t readUInt16(void); uint32_t readUInt32(void); String toString(void); - void writeValue(uint8_t *data, size_t length, bool response = false); - void writeValue(String newValue, bool response = false); - void writeValue(uint8_t newValue, bool response = false); - void setAuth(esp_gatt_auth_req_t auth); + bool writeValue(uint8_t *data, size_t length, bool response = false); + bool writeValue(String newValue, bool response = false); + bool writeValue(uint8_t newValue, bool response = false); + void setAuth(uint8_t auth); + + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) void gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *evtParam); +#endif private: friend class BLERemoteCharacteristic; - BLERemoteDescriptor(uint16_t handle, BLEUUID uuid, BLERemoteCharacteristic *pRemoteCharacteristic); - uint16_t m_handle; // Server handle of this descriptor. - BLEUUID m_uuid; // UUID of this descriptor. - String m_value; // Last received value of the descriptor. + + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + uint16_t m_handle; // Server handle of this descriptor. + BLEUUID m_uuid; // UUID of this descriptor. + String m_value; // Last received value of the descriptor. + uint8_t m_auth; BLERemoteCharacteristic *m_pRemoteCharacteristic; // Reference to the Remote characteristic of which this descriptor is associated. FreeRTOS::Semaphore m_semaphoreReadDescrEvt = FreeRTOS::Semaphore("ReadDescrEvt"); FreeRTOS::Semaphore m_semaphoreWriteDescrEvt = FreeRTOS::Semaphore("WriteDescrEvt"); - esp_gatt_auth_req_t m_auth; + + /*************************************************************************** + * Common private declarations * + ***************************************************************************/ + + BLERemoteDescriptor(uint16_t handle, BLEUUID uuid, BLERemoteCharacteristic *pRemoteCharacteristic); + + /*************************************************************************** + * NimBLE private declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + BLERemoteDescriptor(BLERemoteCharacteristic *pRemoteCharacteristic, const struct ble_gatt_dsc *dsc); + static int onWriteCB(uint16_t conn_handle, const struct ble_gatt_error *error, struct ble_gatt_attr *attr, void *arg); + static int onReadCB(uint16_t conn_handle, const struct ble_gatt_error *error, struct ble_gatt_attr *attr, void *arg); +#endif }; -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLEREMOTEDESCRIPTOR_H_ */ diff --git a/libraries/BLE/src/BLERemoteService.cpp b/libraries/BLE/src/BLERemoteService.cpp index e4cc31dbb33..7baf6908d40 100644 --- a/libraries/BLE/src/BLERemoteService.cpp +++ b/libraries/BLE/src/BLERemoteService.cpp @@ -3,12 +3,21 @@ * * Created on: Jul 8, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ #include #include "BLERemoteService.h" @@ -17,97 +26,14 @@ #include #include "esp32-hal-log.h" -#pragma GCC diagnostic warning "-Wunused-but-set-parameter" - -BLERemoteService::BLERemoteService(esp_gatt_id_t srvcId, BLEClient *pClient, uint16_t startHandle, uint16_t endHandle) { - - log_v(">> BLERemoteService()"); - m_srvcId = srvcId; - m_pClient = pClient; - m_uuid = BLEUUID(m_srvcId); - m_haveCharacteristics = false; - m_startHandle = startHandle; - m_endHandle = endHandle; - - log_v("<< BLERemoteService()"); -} +/*************************************************************************** + * Common functions * + ***************************************************************************/ BLERemoteService::~BLERemoteService() { removeCharacteristics(); } -/* -static bool compareSrvcId(esp_gatt_srvc_id_t id1, esp_gatt_srvc_id_t id2) { - if (id1.id.inst_id != id2.id.inst_id) { - return false; - } - if (!BLEUUID(id1.id.uuid).equals(BLEUUID(id2.id.uuid))) { - return false; - } - return true; -} // compareSrvcId -*/ - -/** - * @brief Handle GATT Client events - */ -void BLERemoteService::gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *evtParam) { - switch (event) { - // - // ESP_GATTC_GET_CHAR_EVT - // - // get_char: - // - esp_gatt_status_t status - // - uin1t6_t conn_id - // - esp_gatt_srvc_id_t srvc_id - // - esp_gatt_id_t char_id - // - esp_gatt_char_prop_t char_prop - // - /* - case ESP_GATTC_GET_CHAR_EVT: { - // Is this event for this service? If yes, then the local srvc_id and the event srvc_id will be - // the same. - if (compareSrvcId(m_srvcId, evtParam->get_char.srvc_id) == false) { - break; - } - - // If the status is NOT OK then we have a problem and continue. - if (evtParam->get_char.status != ESP_GATT_OK) { - m_semaphoreGetCharEvt.give(); - break; - } - - // This is an indication that we now have the characteristic details for a characteristic owned - // by this service so remember it. - m_characteristicMap.insert(std::pair( - BLEUUID(evtParam->get_char.char_id.uuid).toString().c_str(), - new BLERemoteCharacteristic(evtParam->get_char.char_id, evtParam->get_char.char_prop, this) )); - - - // Now that we have received a characteristic, lets ask for the next one. - esp_err_t errRc = ::esp_ble_gattc_get_characteristic( - m_pClient->getGattcIf(), - m_pClient->getConnId(), - &m_srvcId, - &evtParam->get_char.char_id); - if (errRc != ESP_OK) { - log_e("esp_ble_gattc_get_characteristic: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - break; - } - - //m_semaphoreGetCharEvt.give(); - break; - } // ESP_GATTC_GET_CHAR_EVT -*/ - default: break; - } // switch - - // Send the event to each of the characteristics owned by this service. - for (auto &myPair : m_characteristicMapByHandle) { - myPair.second->gattClientEventHandler(event, gattc_if, evtParam); - } -} // gattClientEventHandler - /** * @brief Get the remote characteristic object for the characteristic UUID. * @param [in] uuid Remote characteristic uuid. @@ -144,52 +70,6 @@ BLERemoteCharacteristic *BLERemoteService::getCharacteristic(BLEUUID uuid) { return nullptr; } // getCharacteristic -/** - * @brief Retrieve all the characteristics for this service. - * This function will not return until we have all the characteristics. - * @return N/A - */ -void BLERemoteService::retrieveCharacteristics() { - log_v(">> getCharacteristics() for service: %s", getUUID().toString().c_str()); - - removeCharacteristics(); // Forget any previous characteristics. - - uint16_t offset = 0; - esp_gattc_char_elem_t result; - while (true) { - uint16_t count = 1; // only room for 1 result allocated, so go one by one - esp_gatt_status_t status = - ::esp_ble_gattc_get_all_char(getClient()->getGattcIf(), getClient()->getConnId(), m_startHandle, m_endHandle, &result, &count, offset); - - if (status == ESP_GATT_INVALID_OFFSET) { // We have reached the end of the entries. - break; - } - - if (status != ESP_GATT_OK) { // If we got an error, end. - log_e("esp_ble_gattc_get_all_char: %s", BLEUtils::gattStatusToString(status).c_str()); - break; - } - - if (count == 0) { // If we failed to get any new records, end. - break; - } - - log_d("Found a characteristic: Handle: %d, UUID: %s", result.char_handle, BLEUUID(result.uuid).toString().c_str()); - - // We now have a new characteristic ... let us add that to our set of known characteristics - BLERemoteCharacteristic *pNewRemoteCharacteristic = new BLERemoteCharacteristic(result.char_handle, BLEUUID(result.uuid), result.properties, this); - - m_characteristicMap.insert( - std::pair(pNewRemoteCharacteristic->getUUID().toString().c_str(), pNewRemoteCharacteristic) - ); - m_characteristicMapByHandle.insert(std::pair(result.char_handle, pNewRemoteCharacteristic)); - offset++; // Increment our count of number of descriptors found. - } // Loop forever (until we break inside the loop). - - m_haveCharacteristics = true; // Remember that we have received the characteristics. - log_v("<< getCharacteristics()"); -} // getCharacteristics - /** * @brief Retrieve a map of all the characteristics of this service. * @return A map of all the characteristics of this service. @@ -248,10 +128,6 @@ uint16_t BLERemoteService::getEndHandle() { return m_endHandle; } // getEndHandle -esp_gatt_id_t *BLERemoteService::getSrvcId() { - return &m_srvcId; -} // getSrvcId - uint16_t BLERemoteService::getStartHandle() { return m_startHandle; } // getStartHandle @@ -330,5 +206,222 @@ String BLERemoteService::toString() { return res; } // toString -#endif /* CONFIG_BLUEDROID_ENABLED */ +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + +BLERemoteService::BLERemoteService(esp_gatt_id_t srvcId, BLEClient *pClient, uint16_t startHandle, uint16_t endHandle) { + log_v(">> BLERemoteService()"); + m_srvcId = srvcId; + m_pClient = pClient; + m_uuid = BLEUUID(m_srvcId); + m_haveCharacteristics = false; + m_startHandle = startHandle; + m_endHandle = endHandle; + + log_v("<< BLERemoteService()"); +} + +esp_gatt_id_t *BLERemoteService::getSrvcId() { + return &m_srvcId; +} // getSrvcId + +/** + * @brief Retrieve all the characteristics for this service. + * This function will not return until we have all the characteristics. + * @return N/A + */ +void BLERemoteService::retrieveCharacteristics() { + log_v(">> getCharacteristics() for service: %s", getUUID().toString().c_str()); + + removeCharacteristics(); // Forget any previous characteristics. + + uint16_t offset = 0; + esp_gattc_char_elem_t result; + while (true) { + uint16_t count = 1; // only room for 1 result allocated, so go one by one + esp_gatt_status_t status = + ::esp_ble_gattc_get_all_char(getClient()->getGattcIf(), getClient()->getConnId(), m_startHandle, m_endHandle, &result, &count, offset); + + if (status == ESP_GATT_INVALID_OFFSET) { // We have reached the end of the entries. + break; + } + + if (status != ESP_GATT_OK) { // If we got an error, end. + log_e("esp_ble_gattc_get_all_char: %s", BLEUtils::gattStatusToString(status).c_str()); + break; + } + + if (count == 0) { // If we failed to get any new records, end. + break; + } + + log_d("Found a characteristic: Handle: %d, UUID: %s", result.char_handle, BLEUUID(result.uuid).toString().c_str()); + + // We now have a new characteristic ... let us add that to our set of known characteristics + BLERemoteCharacteristic *pNewRemoteCharacteristic = new BLERemoteCharacteristic(result.char_handle, BLEUUID(result.uuid), result.properties, this); + + m_characteristicMap.insert( + std::pair(pNewRemoteCharacteristic->getUUID().toString().c_str(), pNewRemoteCharacteristic) + ); + m_characteristicMapByHandle.insert(std::pair(result.char_handle, pNewRemoteCharacteristic)); + offset++; // Increment our count of number of descriptors found. + } // Loop forever (until we break inside the loop). + + m_haveCharacteristics = true; // Remember that we have received the characteristics. + log_v("<< getCharacteristics()"); +} // getCharacteristics + +/** + * @brief Handle GATT Client events + */ +void BLERemoteService::gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *evtParam) { + switch (event) { + // + // ESP_GATTC_GET_CHAR_EVT + // + // get_char: + // - esp_gatt_status_t status + // - uin1t6_t conn_id + // - esp_gatt_srvc_id_t srvc_id + // - esp_gatt_id_t char_id + // - esp_gatt_char_prop_t char_prop + // + /* + case ESP_GATTC_GET_CHAR_EVT: { + // Is this event for this service? If yes, then the local srvc_id and the event srvc_id will be + // the same. + if (compareSrvcId(m_srvcId, evtParam->get_char.srvc_id) == false) { + break; + } + + // If the status is NOT OK then we have a problem and continue. + if (evtParam->get_char.status != ESP_GATT_OK) { + m_semaphoreGetCharEvt.give(); + break; + } + + // This is an indication that we now have the characteristic details for a characteristic owned + // by this service so remember it. + m_characteristicMap.insert(std::pair( + BLEUUID(evtParam->get_char.char_id.uuid).toString().c_str(), + new BLERemoteCharacteristic(evtParam->get_char.char_id, evtParam->get_char.char_prop, this) )); + + + // Now that we have received a characteristic, lets ask for the next one. + esp_err_t errRc = ::esp_ble_gattc_get_characteristic( + m_pClient->getGattcIf(), + m_pClient->getConnId(), + &m_srvcId, + &evtParam->get_char.char_id); + if (errRc != ESP_OK) { + log_e("esp_ble_gattc_get_characteristic: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + break; + } + + //m_semaphoreGetCharEvt.give(); + break; + } // ESP_GATTC_GET_CHAR_EVT +*/ + default: break; + } // switch + + // Send the event to each of the characteristics owned by this service. + for (auto &myPair : m_characteristicMapByHandle) { + myPair.second->gattClientEventHandler(event, gattc_if, evtParam); + } +} // gattClientEventHandler + +#endif + +/*************************************************************************** + * NimBLE functions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + +BLERemoteService::BLERemoteService(BLEClient *pClient, const struct ble_gatt_svc *service) { + log_v(">> BLERemoteService()"); + m_pClient = pClient; + switch (service->uuid.u.type) { + case BLE_UUID_TYPE_16: m_uuid = BLEUUID(service->uuid.u16.value); break; + case BLE_UUID_TYPE_32: m_uuid = BLEUUID(service->uuid.u32.value); break; + case BLE_UUID_TYPE_128: m_uuid = BLEUUID(const_cast(&service->uuid.u128)); break; + default: break; + } + m_startHandle = service->start_handle; + m_endHandle = service->end_handle; + m_haveCharacteristics = false; + log_v("<< BLERemoteService(): %s", m_uuid.toString().c_str()); +} + +/** + * @brief Retrieve all the characteristics for this service. + * This function will not return until we have all the characteristics. + */ +void BLERemoteService::retrieveCharacteristics() { + log_v(">> retrieveCharacteristics() for service: %s", getUUID().toString().c_str()); + + int rc = 0; + BLETaskData taskData(const_cast(this)); + + rc = ble_gattc_disc_all_chrs(m_pClient->getConnId(), m_startHandle, m_endHandle, BLERemoteService::characteristicDiscCB, &taskData); + + if (rc != 0) { + log_e("ble_gattc_disc_all_chrs: rc=%d %s", rc, BLEUtils::returnCodeToString(rc)); + return; + } + + BLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER); + rc = taskData.m_flags; + if (rc == 0 || rc == BLE_HS_EDONE) { + log_d("<< retrieveCharacteristics()"); + return; + } + + log_e("<< retrieveCharacteristics() rc=%d %s", rc, BLEUtils::returnCodeToString(rc)); +} // retrieveCharacteristics + +/** + * @brief Callback for characteristic discovery. + * @return success == 0 or error code. + */ +int BLERemoteService::characteristicDiscCB(uint16_t conn_handle, const struct ble_gatt_error *error, const struct ble_gatt_chr *chr, void *arg) { + log_d("Characteristic Discovered >> status: %d handle: %d", error->status, (error->status == 0) ? chr->val_handle : -1); + + BLETaskData *pTaskData = (BLETaskData *)arg; + BLERemoteService *service = (BLERemoteService *)pTaskData->m_pInstance; + + if (error->status == BLE_HS_ENOTCONN) { + log_e("<< Characteristic Discovery; Not connected"); + BLEUtils::taskRelease(*pTaskData, error->status); + return error->status; + } + + // Make sure the discovery is for this device + if (service->getClient()->getConnId() != conn_handle) { + return 0; + } + + if (error->status == 0) { + // Found a service - add it to the vector + BLERemoteCharacteristic *pRemoteCharacteristic = new BLERemoteCharacteristic(service, chr); + service->m_characteristicMap.insert( + std::pair(pRemoteCharacteristic->getUUID().toString().c_str(), pRemoteCharacteristic) + ); + service->m_characteristicMapByHandle.insert(std::pair(chr->val_handle, pRemoteCharacteristic)); + return 0; + } + + BLEUtils::taskRelease(*pTaskData, error->status); + service->m_haveCharacteristics = true; + log_d("<< Characteristic Discovered"); + return error->status; +} + +#endif + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLERemoteService.h b/libraries/BLE/src/BLERemoteService.h index 49845a0a1e8..c93d91f6852 100644 --- a/libraries/BLE/src/BLERemoteService.h +++ b/libraries/BLE/src/BLERemoteService.h @@ -3,6 +3,10 @@ * * Created on: Jul 8, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLEREMOTESERVICE_H_ @@ -11,7 +15,11 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ #include @@ -19,6 +27,19 @@ #include "BLERemoteCharacteristic.h" #include "BLEUUID.h" #include "RTOS.h" +#include "BLEUtils.h" + +/*************************************************************************** + * NimBLE includes * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#endif + +/*************************************************************************** + * Forward declarations * + ***************************************************************************/ class BLEClient; class BLERemoteCharacteristic; @@ -28,15 +49,18 @@ class BLERemoteCharacteristic; */ class BLERemoteService { public: - virtual ~BLERemoteService(); + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ - // Public methods + virtual ~BLERemoteService(); BLERemoteCharacteristic *getCharacteristic(const char *uuid); // Get the specified characteristic reference. BLERemoteCharacteristic *getCharacteristic(BLEUUID uuid); // Get the specified characteristic reference. BLERemoteCharacteristic *getCharacteristic(uint16_t uuid); // Get the specified characteristic reference. std::map *getCharacteristics(); std::map *getCharacteristicsByHandle(); // Get the characteristics map. void getCharacteristics(std::map **pCharacteristicMap); + void retrieveCharacteristics(); BLEClient *getClient(void); // Get a reference to the client associated with this service. uint16_t getHandle(); // Get the handle of this service. @@ -46,24 +70,12 @@ class BLERemoteService { String toString(void); private: - // Private constructor ... never meant to be created by a user application. - BLERemoteService(esp_gatt_id_t srvcId, BLEClient *pClient, uint16_t startHandle, uint16_t endHandle); - - // Friends friend class BLEClient; friend class BLERemoteCharacteristic; - // Private methods - void retrieveCharacteristics(void); // Retrieve the characteristics from the BLE Server. - esp_gatt_id_t *getSrvcId(void); - uint16_t getStartHandle(); // Get the start handle for this service. - uint16_t getEndHandle(); // Get the end handle for this service. - - void gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *evtParam); - - void removeCharacteristics(); - - // Properties + /*************************************************************************** + * Common private properties * + ***************************************************************************/ // We maintain a map of characteristics owned by this service keyed by a string representation of the UUID. std::map m_characteristicMap; @@ -74,12 +86,47 @@ class BLERemoteService { bool m_haveCharacteristics; // Have we previously obtained the characteristics. BLEClient *m_pClient; FreeRTOS::Semaphore m_semaphoreGetCharEvt = FreeRTOS::Semaphore("GetCharEvt"); - esp_gatt_id_t m_srvcId; BLEUUID m_uuid; // The UUID of this service. uint16_t m_startHandle; // The starting handle of this service. uint16_t m_endHandle; // The ending handle of this service. + + /*************************************************************************** + * Bluedroid private properties * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + esp_gatt_id_t m_srvcId; +#endif + + /*************************************************************************** + * Common private declarations * + ***************************************************************************/ + + uint16_t getStartHandle(); // Get the start handle for this service. + uint16_t getEndHandle(); // Get the end handle for this service. + void removeCharacteristics(); + + /*************************************************************************** + * Bluedroid private declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + // Private constructor ... never meant to be created by a user application. + BLERemoteService(esp_gatt_id_t srvcId, BLEClient *pClient, uint16_t startHandle, uint16_t endHandle); + esp_gatt_id_t *getSrvcId(); + void gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *evtParam); +#endif + + /*************************************************************************** + * NimBLE private declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + BLERemoteService(BLEClient *pClient, const struct ble_gatt_svc *service); + static int characteristicDiscCB(uint16_t conn_handle, const struct ble_gatt_error *error, const struct ble_gatt_chr *chr, void *arg); +#endif }; // BLERemoteService -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLEREMOTESERVICE_H_ */ diff --git a/libraries/BLE/src/BLEScan.cpp b/libraries/BLE/src/BLEScan.cpp index 0a99b46c61d..6d18bb2d751 100644 --- a/libraries/BLE/src/BLEScan.cpp +++ b/libraries/BLE/src/BLEScan.cpp @@ -6,12 +6,21 @@ * * Update: April, 2021 * add BLE5 support + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ #include @@ -23,12 +32,17 @@ #include "GeneralUtils.h" #include "esp32-hal-log.h" +/*************************************************************************** + * Common functions * + ***************************************************************************/ + /** - * Constructor + * @brief Constructor */ BLEScan::BLEScan() { memset(&m_scan_params, 0, sizeof(m_scan_params)); // Initialize all params - m_scan_params.scan_type = BLE_SCAN_TYPE_PASSIVE; // Default is a passive scan. +#if defined(CONFIG_BLUEDROID_ENABLED) + m_scan_params.scan_type = BLE_SCAN_TYPE_PASSIVE; // Default is a passive scan. m_scan_params.own_addr_type = BLE_ADDR_TYPE_PUBLIC; m_scan_params.scan_filter_policy = BLE_SCAN_FILTER_ALLOW_ALL; m_scan_params.scan_duplicate = BLE_SCAN_DUPLICATE_DISABLE; @@ -38,15 +52,246 @@ BLEScan::BLEScan() { m_shouldParse = true; setInterval(100); setWindow(100); +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + m_scan_params.filter_policy = BLE_HCI_SCAN_FILT_NO_WL; + m_scan_params.passive = 1; // If set, don’t send scan requests to advertisers (i.e., don’t request additional advertising data). + m_scan_params.limited = 0; // If set, only discover devices in limited discoverable mode. + m_scan_params.filter_duplicates = 1; // If set, the controller ignores all but the first advertisement from each device. + m_pAdvertisedDeviceCallbacks = nullptr; + m_ignoreResults = false; + m_pTaskData = nullptr; + m_duration = BLE_HS_FOREVER; // make sure this is non-zero in the event of a host reset + m_maxResults = 0xFF; + m_stopped = true; + m_wantDuplicates = false; + m_shouldParse = true; + // This is defined as the time interval from when the Controller started its last LE scan until it begins the subsequent LE scan. (units=0.625 msec) + setInterval(100); + // The duration of the LE scan. LE_Scan_Window shall be less than or equal to LE_Scan_Interval (units=0.625 msec) + setWindow(100); +#endif } // BLEScan +/** + * @brief Scan destructor, release any allocated resources. + */ +BLEScan::~BLEScan() { + clearResults(); +} + +/** + * @brief Should we perform an active or passive scan? + * The default is a passive scan. An active scan means that we will wish a scan response. + * @param [in] active If true, we perform an active scan otherwise a passive scan. + * @return N/A. + */ +void BLEScan::setActiveScan(bool active) { +#if defined(CONFIG_BLUEDROID_ENABLED) + if (active) { + m_scan_params.scan_type = BLE_SCAN_TYPE_ACTIVE; + } else { + m_scan_params.scan_type = BLE_SCAN_TYPE_PASSIVE; + } +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + m_scan_params.passive = !active; +#endif +} // setActiveScan + +/** + * @brief Set the call backs to be invoked. + * @param [in] pAdvertisedDeviceCallbacks Call backs to be invoked. + * @param [in] wantDuplicates True if we wish to be called back with duplicates. Default is false. + * @param [in] shouldParse True if we wish to parse advertised package or raw payload. Default is true. + */ +void BLEScan::setAdvertisedDeviceCallbacks(BLEAdvertisedDeviceCallbacks *pAdvertisedDeviceCallbacks, bool wantDuplicates, bool shouldParse) { + m_wantDuplicates = wantDuplicates; +#if defined(CONFIG_NIMBLE_ENABLED) + setDuplicateFilter(!wantDuplicates); +#endif + m_pAdvertisedDeviceCallbacks = pAdvertisedDeviceCallbacks; + m_shouldParse = shouldParse; +} // setAdvertisedDeviceCallbacks + +/** + * @brief Set the interval to scan. + * @param [in] The interval in msecs. + */ +void BLEScan::setInterval(uint16_t intervalMSecs) { +#if defined(CONFIG_BLUEDROID_ENABLED) + m_scan_params.scan_interval = intervalMSecs / 0.625; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + m_scan_params.itvl = intervalMSecs / 0.625; +#endif +} // setInterval + +/** + * @brief Set the window to actively scan. + * @param [in] windowMSecs How long to actively scan. + */ +void BLEScan::setWindow(uint16_t windowMSecs) { +#if defined(CONFIG_BLUEDROID_ENABLED) + m_scan_params.scan_window = windowMSecs / 0.625; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + m_scan_params.window = windowMSecs / 0.625; +#endif +} // setWindow + +// delete peer device from cache after disconnecting, it is required in case we are connecting to devices with not public address +void BLEScan::erase(BLEAddress address) { + log_i("erase device: %s", address.toString().c_str()); + BLEAdvertisedDevice *advertisedDevice = m_scanResults.m_vectorAdvertisedDevices.find(address.toString().c_str())->second; + m_scanResults.m_vectorAdvertisedDevices.erase(address.toString().c_str()); + delete advertisedDevice; +} + +/** + * @brief Dump the scan results to the log. + */ +void BLEScanResults::dump() { + log_v(">> Dump scan results:"); + for (int i = 0; i < getCount(); i++) { + log_d("- %s", getDevice(i).toString().c_str()); + } +} // dump + +/** + * @brief Return the count of devices found in the last scan. + * @return The number of devices found in the last scan. + */ +int BLEScanResults::getCount() { + return m_vectorAdvertisedDevices.size(); +} // getCount + +/** + * @brief Return the specified device at the given index. + * The index should be between 0 and getCount()-1. + * @param [in] i The index of the device. + * @return The device at the specified index. + */ +BLEAdvertisedDevice BLEScanResults::getDevice(uint32_t i) { + uint32_t x = 0; + BLEAdvertisedDevice dev = *m_vectorAdvertisedDevices.begin()->second; + for (auto it = m_vectorAdvertisedDevices.begin(); it != m_vectorAdvertisedDevices.end(); it++) { + dev = *it->second; + if (x == i) { + break; + } + x++; + } + return dev; +} + +BLEScanResults *BLEScan::getResults() { + return &m_scanResults; +} + +void BLEScan::clearResults() { + for (auto _dev : m_scanResults.m_vectorAdvertisedDevices) { + delete _dev.second; + } + m_scanResults.m_vectorAdvertisedDevices.clear(); +} + +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + +#if defined(SOC_BLE_50_SUPPORTED) + +void BLEScan::setExtendedScanCallback(BLEExtAdvertisingCallbacks *cb) { + m_pExtendedScanCb = cb; +} + +/** +* @brief This function is used to enable scanning. +* +* @param[in] duration : Scan duration +* @param[in] period : Time interval from when the Controller started its last Scan Duration until it begins the subsequent Scan Duration. +* +* @return - ESP_OK : success +* - other : failed +* +*/ +esp_err_t BLEScan::startExtScan(uint32_t duration, uint16_t period) { + esp_err_t rc = esp_ble_gap_start_ext_scan(duration, period); + if (rc) { + log_e("extended scan start failed: %d", rc); + } + return rc; +} + +esp_err_t BLEScan::stopExtScan() { + esp_err_t rc = esp_ble_gap_stop_ext_scan(); + if (rc) { + log_e("extended scan stop failed: %d", rc); + } + return rc; +} + +void BLEScan::setPeriodicScanCallback(BLEPeriodicScanCallbacks *cb) { + m_pPeriodicScanCb = cb; +} + +/** +* @brief This function is used to set the extended scan parameters to be used on the advertising channels. +* +* +* @return - ESP_OK : success +* - other : failed +* +*/ +esp_err_t BLEScan::setExtScanParams() { + esp_ble_ext_scan_params_t ext_scan_params = { + .own_addr_type = BLE_ADDR_TYPE_PUBLIC, + .filter_policy = BLE_SCAN_FILTER_ALLOW_ALL, + .scan_duplicate = BLE_SCAN_DUPLICATE_DISABLE, + .cfg_mask = ESP_BLE_GAP_EXT_SCAN_CFG_UNCODE_MASK | ESP_BLE_GAP_EXT_SCAN_CFG_CODE_MASK, + .uncoded_cfg = {BLE_SCAN_TYPE_ACTIVE, 40, 40}, + .coded_cfg = {BLE_SCAN_TYPE_ACTIVE, 40, 40}, + }; + + esp_err_t rc = esp_ble_gap_set_ext_scan_params(&ext_scan_params); + if (rc) { + log_e("set extend scan params error, error code = %x", rc); + } + return rc; +} + +/** +* @brief This function is used to set the extended scan parameters to be used on the advertising channels. +* +* @param[in] params : scan parameters +* +* @return - ESP_OK : success +* - other : failed +* +*/ +esp_err_t BLEScan::setExtScanParams(esp_ble_ext_scan_params_t *ext_scan_params) { + esp_err_t rc = esp_ble_gap_set_ext_scan_params(ext_scan_params); + if (rc) { + log_e("set extend scan params error, error code = %x", rc); + } + return rc; +} + +#endif // SOC_BLE_50_SUPPORTED + /** * @brief Handle GAP events related to scans. * @param [in] event The event type for this event. * @param [in] param Parameter data for this event. */ void BLEScan::handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { - switch (event) { // --------------------------- @@ -118,6 +363,7 @@ void BLEScan::handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_ advertisedDevice->setAddress(advertisedAddress); advertisedDevice->setRSSI(param->scan_rst.rssi); advertisedDevice->setAdFlag(param->scan_rst.flag); + advertisedDevice->setAdvType(param->scan_rst.ble_evt_type); if (m_shouldParse) { advertisedDevice->parseAdvertisement((uint8_t *)param->scan_rst.ble_adv, param->scan_rst.adv_data_len + param->scan_rst.scan_rsp_len); } else { @@ -245,126 +491,6 @@ void BLEScan::handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_ } // End switch } // gapEventHandler -/** - * @brief Should we perform an active or passive scan? - * The default is a passive scan. An active scan means that we will wish a scan response. - * @param [in] active If true, we perform an active scan otherwise a passive scan. - * @return N/A. - */ -void BLEScan::setActiveScan(bool active) { - if (active) { - m_scan_params.scan_type = BLE_SCAN_TYPE_ACTIVE; - } else { - m_scan_params.scan_type = BLE_SCAN_TYPE_PASSIVE; - } -} // setActiveScan - -/** - * @brief Set the call backs to be invoked. - * @param [in] pAdvertisedDeviceCallbacks Call backs to be invoked. - * @param [in] wantDuplicates True if we wish to be called back with duplicates. Default is false. - * @param [in] shouldParse True if we wish to parse advertised package or raw payload. Default is true. - */ -void BLEScan::setAdvertisedDeviceCallbacks(BLEAdvertisedDeviceCallbacks *pAdvertisedDeviceCallbacks, bool wantDuplicates, bool shouldParse) { - m_wantDuplicates = wantDuplicates; - m_pAdvertisedDeviceCallbacks = pAdvertisedDeviceCallbacks; - m_shouldParse = shouldParse; -} // setAdvertisedDeviceCallbacks - -#ifdef SOC_BLE_50_SUPPORTED - -void BLEScan::setExtendedScanCallback(BLEExtAdvertisingCallbacks *cb) { - m_pExtendedScanCb = cb; -} - -/** -* @brief This function is used to set the extended scan parameters to be used on the advertising channels. -* -* -* @return - ESP_OK : success -* - other : failed -* -*/ -esp_err_t BLEScan::setExtScanParams() { - esp_ble_ext_scan_params_t ext_scan_params = { - .own_addr_type = BLE_ADDR_TYPE_PUBLIC, - .filter_policy = BLE_SCAN_FILTER_ALLOW_ALL, - .scan_duplicate = BLE_SCAN_DUPLICATE_DISABLE, - .cfg_mask = ESP_BLE_GAP_EXT_SCAN_CFG_UNCODE_MASK | ESP_BLE_GAP_EXT_SCAN_CFG_CODE_MASK, - .uncoded_cfg = {BLE_SCAN_TYPE_ACTIVE, 40, 40}, - .coded_cfg = {BLE_SCAN_TYPE_ACTIVE, 40, 40}, - }; - - esp_err_t rc = esp_ble_gap_set_ext_scan_params(&ext_scan_params); - if (rc) { - log_e("set extend scan params error, error code = %x", rc); - } - return rc; -} - -/** -* @brief This function is used to set the extended scan parameters to be used on the advertising channels. -* -* @param[in] params : scan parameters -* -* @return - ESP_OK : success -* - other : failed -* -*/ -esp_err_t BLEScan::setExtScanParams(esp_ble_ext_scan_params_t *ext_scan_params) { - esp_err_t rc = esp_ble_gap_set_ext_scan_params(ext_scan_params); - if (rc) { - log_e("set extend scan params error, error code = %x", rc); - } - return rc; -} - -/** -* @brief This function is used to enable scanning. -* -* @param[in] duration : Scan duration -* @param[in] period : Time interval from when the Controller started its last Scan Duration until it begins the subsequent Scan Duration. -* -* @return - ESP_OK : success -* - other : failed -* -*/ -esp_err_t BLEScan::startExtScan(uint32_t duration, uint16_t period) { - esp_err_t rc = esp_ble_gap_start_ext_scan(duration, period); - if (rc) { - log_e("extended scan start failed: %d", rc); - } - return rc; -} - -esp_err_t BLEScan::stopExtScan() { - esp_err_t rc; - rc = esp_ble_gap_stop_ext_scan(); - - return rc; -} - -void BLEScan::setPeriodicScanCallback(BLEPeriodicScanCallbacks *cb) { - m_pPeriodicScanCb = cb; -} - -#endif // SOC_BLE_50_SUPPORTED -/** - * @brief Set the interval to scan. - * @param [in] The interval in msecs. - */ -void BLEScan::setInterval(uint16_t intervalMSecs) { - m_scan_params.scan_interval = intervalMSecs / 0.625; -} // setInterval - -/** - * @brief Set the window to actively scan. - * @param [in] windowMSecs How long to actively scan. - */ -void BLEScan::setWindow(uint16_t windowMSecs) { - m_scan_params.scan_window = windowMSecs / 0.625; -} // setWindow - /** * @brief Start scanning. * @param [in] duration The duration in seconds for which to scan. @@ -425,7 +551,7 @@ BLEScanResults *BLEScan::start(uint32_t duration, bool is_continue) { * @brief Stop an in progress scan. * @return N/A. */ -void BLEScan::stop() { +bool BLEScan::stop() { log_v(">> stop()"); esp_err_t errRc = ::esp_ble_gap_stop_scanning(); @@ -435,67 +561,303 @@ void BLEScan::stop() { if (errRc != ESP_OK) { log_e("esp_ble_gap_stop_scanning: err: %d, text: %s", errRc, GeneralUtils::errorToString(errRc)); - return; + return false; } log_v("<< stop()"); + return true; } // stop -// delete peer device from cache after disconnecting, it is required in case we are connecting to devices with not public address -void BLEScan::erase(BLEAddress address) { - log_i("erase device: %s", address.toString().c_str()); - BLEAdvertisedDevice *advertisedDevice = m_scanResults.m_vectorAdvertisedDevices.find(address.toString().c_str())->second; - m_scanResults.m_vectorAdvertisedDevices.erase(address.toString().c_str()); - delete advertisedDevice; +#endif // CONFIG_BLUEDROID_ENABLED + +/*************************************************************************** + * NimBLE functions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + +/** + * @brief Set whether or not the BLE controller should only report results + * from devices it has not already seen. + * @param [in] enabled If true, scanned devices will only be reported once. + * @details The controller has a limited buffer and will start reporting + * duplicate devices once the limit is reached. + */ +void BLEScan::setDuplicateFilter(bool enabled) { + m_scan_params.filter_duplicates = enabled; +} // setDuplicateFilter + +/** + * @brief Get the status of the scanner. + * @return true if scanning or scan starting. + */ +bool BLEScan::isScanning() { + return ble_gap_disc_active(); } /** - * @brief Dump the scan results to the log. + * @brief Handle GAP events related to scans. + * @param [in] event The event type for this event. + * @param [in] param Parameter data for this event. */ -void BLEScanResults::dump() { - log_v(">> Dump scan results:"); - for (int i = 0; i < getCount(); i++) { - log_d("- %s", getDevice(i).toString().c_str()); +int BLEScan::handleGAPEvent(ble_gap_event *event, void *arg) { + BLEScan *pScan = (BLEScan *)arg; + + switch (event->type) { + case BLE_GAP_EVENT_DISC: + { + if (pScan->m_ignoreResults) { + log_i("Scan op in progress - ignoring results"); + return 0; + } + + const auto &disc = event->disc; + const auto event_type = disc.event_type; + const bool isLegacyAdv = true; + BLEAddress advertisedAddress(disc.addr); + + BLEClient *client = BLEDevice::getClientByAddress(advertisedAddress); + if (client != nullptr && client->isConnected()) { + log_i("Client %s connected - ignoring event", advertisedAddress.toString().c_str()); + return 0; + } + + BLEAdvertisedDevice *advertisedDevice = nullptr; + + // If we've seen this device before get a pointer to it from the vector + for (auto &it : pScan->m_scanResults.m_vectorAdvertisedDevices) { + if (it.second->getAddress() == advertisedAddress) { + advertisedDevice = it.second; + break; + } + } + + // If we haven't seen this device before; create a new instance and insert it in the vector. + // Otherwise just update the relevant parameters of the already known device. + if (advertisedDevice == nullptr) { + // Check if we have reach the scan results limit, ignore this one if so. + // We still need to store each device when maxResults is 0 to be able to append the scan results + if (pScan->m_maxResults > 0 && pScan->m_maxResults < 0xFF && (pScan->m_scanResults.m_vectorAdvertisedDevices.size() >= pScan->m_maxResults)) { + return 0; + } + + if (isLegacyAdv && event_type == BLE_HCI_ADV_RPT_EVTYPE_SCAN_RSP) { + log_i("Scan response without advertisement: %s", advertisedAddress.toString().c_str()); + } + + advertisedDevice = new BLEAdvertisedDevice(); + advertisedDevice->setAddress(advertisedAddress); + advertisedDevice->setAddressType(event->disc.addr.type); + advertisedDevice->setAdvType(event_type); + pScan->m_scanResults.m_vectorAdvertisedDevices.insert( + std::pair(advertisedAddress.toString().c_str(), advertisedDevice) + ); + log_i("New advertiser: %s", advertisedAddress.toString().c_str()); + } else if (advertisedDevice != nullptr) { + log_i("Updated advertiser: %s", advertisedAddress.toString().c_str()); + } else { + // Scan response from unknown device + return 0; + } + + advertisedDevice->setRSSI(event->disc.rssi); + + if (pScan->m_shouldParse) { + advertisedDevice->parseAdvertisement((uint8_t *)event->disc.data, event->disc.length_data); + } else { + advertisedDevice->setPayload((uint8_t *)event->disc.data, event->disc.length_data, event_type == BLE_HCI_ADV_RPT_EVTYPE_SCAN_RSP); + } + + advertisedDevice->setScan(pScan); + + if (pScan->m_pAdvertisedDeviceCallbacks) { + // If not active scanning or scan response is not available + // report the result to the callback now. + if (pScan->m_scan_params.passive || !isLegacyAdv || !advertisedDevice->isScannable()) { + advertisedDevice->m_callbackSent = true; + pScan->m_pAdvertisedDeviceCallbacks->onResult(*advertisedDevice); + + // Otherwise, wait for the scan response so we can report the complete data. + } else if (isLegacyAdv && event_type == BLE_HCI_ADV_RPT_EVTYPE_SCAN_RSP) { + advertisedDevice->m_callbackSent = true; + pScan->m_pAdvertisedDeviceCallbacks->onResult(*advertisedDevice); + } + } + + // If not storing results and we have invoked the callback, delete the device. + if (pScan->m_maxResults == 0 && advertisedDevice->m_callbackSent) { + pScan->erase(advertisedAddress); + } + + return 0; + } + + case BLE_GAP_EVENT_DISC_COMPLETE: + { + log_d("discovery complete; reason=%d", event->disc_complete.reason); + + // If a device advertised with scan response available and it was not received + // the callback would not have been invoked, so do it here. + if (pScan->m_pAdvertisedDeviceCallbacks) { + for (auto &it : pScan->m_scanResults.m_vectorAdvertisedDevices) { + if (!it.second->m_callbackSent) { + pScan->m_pAdvertisedDeviceCallbacks->onResult(*(it.second)); + } + } + } + + if (pScan->m_maxResults == 0) { + pScan->clearResults(); + } + + if (pScan->m_scanCompleteCB != nullptr) { + pScan->m_scanCompleteCB(pScan->m_scanResults); + } + + if (pScan->m_pTaskData != nullptr) { + BLEUtils::taskRelease(*pScan->m_pTaskData, event->disc_complete.reason); + } + + return 0; + } + + default: return 0; } -} // dump +} // gapEventHandler /** - * @brief Return the count of devices found in the last scan. - * @return The number of devices found in the last scan. + * @brief Start scanning. + * @param [in] duration The duration in seconds for which to scan. + * @param [in] scanCompleteCB A function to be called when scanning has completed. + * @param [in] is_continue Set to true to save previous scan results, false to clear them. + * @return True if scan started or false if there was an error. */ -int BLEScanResults::getCount() { - return m_vectorAdvertisedDevices.size(); -} // getCount +bool BLEScan::start(uint32_t duration, void (*scanCompleteCB)(BLEScanResults), bool is_continue) { + log_d(">> start(duration=%d)", duration); + + if (!is_continue) { + clearResults(); + } + + // Save the callback to be invoked when the scan completes. + m_scanCompleteCB = scanCompleteCB; + // Save the duration in the case that the host is reset so we can reuse it. + m_duration = duration; + + // If 0 duration specified then we assume a continuous scan is desired. + if (duration == 0) { + duration = BLE_HS_FOREVER; + } else { + // convert duration to milliseconds + duration = duration * 1000; + } + + // Set the flag to ignore the results while we are deleting the vector + if (!is_continue) { + m_ignoreResults = true; + } + + int rc = ble_gap_disc(BLEDevice::m_ownAddrType, duration, &m_scan_params, BLEScan::handleGAPEvent, this); + + switch (rc) { + case 0: + case BLE_HS_EALREADY: break; + + case BLE_HS_EBUSY: log_e("Unable to scan - connection in progress."); break; + + case BLE_HS_ETIMEOUT_HCI: + case BLE_HS_EOS: + case BLE_HS_ECONTROLLER: + case BLE_HS_ENOTSYNCED: log_e("Unable to scan - Host Reset"); break; + + default: log_e("Error initiating GAP discovery procedure; rc=%d, %s", rc, BLEUtils::returnCodeToString(rc)); break; + } + + m_ignoreResults = false; + log_d("<< start()"); + + if (rc != 0 && rc != BLE_HS_EALREADY) { + return false; + } + return true; +} // start /** - * @brief Return the specified device at the given index. - * The index should be between 0 and getCount()-1. - * @param [in] i The index of the device. - * @return The device at the specified index. + * @brief Start scanning and block until scanning has been completed. + * @param [in] duration The duration in seconds for which to scan. + * @param [in] is_continue Set to true to save previous scan results, false to clear them. + * @return The BLEScanResults. */ -BLEAdvertisedDevice BLEScanResults::getDevice(uint32_t i) { - uint32_t x = 0; - BLEAdvertisedDevice dev = *m_vectorAdvertisedDevices.begin()->second; - for (auto it = m_vectorAdvertisedDevices.begin(); it != m_vectorAdvertisedDevices.end(); it++) { - dev = *it->second; - if (x == i) { - break; - } - x++; +BLEScanResults *BLEScan::start(uint32_t duration, bool is_continue) { + if (duration == 0) { + log_w("Blocking scan called with duration = forever"); } - return dev; -} -BLEScanResults *BLEScan::getResults() { + if (m_pTaskData != nullptr) { + log_e("Scan already in progress"); + return &m_scanResults; + } + + BLETaskData taskData(this); + m_pTaskData = &taskData; + + if (start(duration, nullptr, is_continue)) { + BLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER); + } + + m_pTaskData = nullptr; return &m_scanResults; +} // start + +/** + * @brief Stop an in progress scan. + * @return True if successful. + */ +bool BLEScan::stop() { + log_d(">> stop()"); + + int rc = ble_gap_disc_cancel(); + if (rc != 0 && rc != BLE_HS_EALREADY) { + log_e("Failed to cancel scan; rc=%d", rc); + return false; + } + + if (m_maxResults == 0) { + clearResults(); + } + + if (rc != BLE_HS_EALREADY && m_scanCompleteCB != nullptr) { + m_scanCompleteCB(m_scanResults); + } + + if (m_pTaskData != nullptr) { + BLEUtils::taskRelease(*m_pTaskData); + } + + log_d("<< stop()"); + return true; +} // stop + +/** + * @brief Called when host reset, we set a flag to stop scanning until synced. + */ +void BLEScan::onHostReset() { + m_ignoreResults = true; } -void BLEScan::clearResults() { - for (auto _dev : m_scanResults.m_vectorAdvertisedDevices) { - delete _dev.second; +/** + * @brief If the host reset and re-synced this is called. + * If the application was scanning indefinitely with a callback, restart it. + */ +void BLEScan::onHostSync() { + m_ignoreResults = false; + + if (m_duration == 0 && m_pAdvertisedDeviceCallbacks != nullptr) { + start(m_duration, m_scanCompleteCB); } - m_scanResults.m_vectorAdvertisedDevices.clear(); } -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif // CONFIG_NIMBLE_ENABLED + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEScan.h b/libraries/BLE/src/BLEScan.h index 080e3b803b2..842b7144f06 100644 --- a/libraries/BLE/src/BLEScan.h +++ b/libraries/BLE/src/BLEScan.h @@ -3,6 +3,10 @@ * * Created on: Jul 1, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLESCAN_H_ @@ -11,22 +15,51 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) -#include +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ -// #include #include #include "BLEAdvertisedDevice.h" #include "BLEClient.h" +#include "BLEUtils.h" #include "RTOS.h" +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#endif + +/*************************************************************************** + * NimBLE includes * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#endif + +/*************************************************************************** + * Forward declarations * + ***************************************************************************/ + class BLEAdvertisedDevice; class BLEAdvertisedDeviceCallbacks; class BLEExtAdvertisingCallbacks; class BLEClient; class BLEScan; class BLEPeriodicScanCallbacks; +struct BLETaskData; +/*************************************************************************** + * Bluedroid type definitions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) struct esp_ble_periodic_adv_sync_estab_param_t { uint8_t status; /*!< periodic advertising sync status */ uint16_t sync_handle; /*!< periodic advertising sync handle */ @@ -37,6 +70,7 @@ struct esp_ble_periodic_adv_sync_estab_param_t { uint16_t period_adv_interval; /*!< periodic advertising interval */ uint8_t adv_clk_accuracy; /*!< periodic advertising clock accuracy */ }; +#endif /** * @brief The result of having performed a scan. @@ -47,12 +81,21 @@ struct esp_ble_periodic_adv_sync_estab_param_t { */ class BLEScanResults { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + void dump(); int getCount(); BLEAdvertisedDevice getDevice(uint32_t i); private: friend BLEScan; + + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + std::map m_vectorAdvertisedDevices; }; @@ -63,37 +106,52 @@ class BLEScanResults { */ class BLEScan { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + + ~BLEScan(); void setActiveScan(bool active); void setAdvertisedDeviceCallbacks(BLEAdvertisedDeviceCallbacks *pAdvertisedDeviceCallbacks, bool wantDuplicates = false, bool shouldParse = true); void setInterval(uint16_t intervalMSecs); void setWindow(uint16_t windowMSecs); bool start(uint32_t duration, void (*scanCompleteCB)(BLEScanResults), bool is_continue = false); BLEScanResults *start(uint32_t duration, bool is_continue = false); - void stop(); + bool stop(); void erase(BLEAddress address); BLEScanResults *getResults(); void clearResults(); -#ifdef SOC_BLE_50_SUPPORTED + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(SOC_BLE_50_SUPPORTED) && defined(CONFIG_BLUEDROID_ENABLED) void setExtendedScanCallback(BLEExtAdvertisingCallbacks *cb); void setPeriodicScanCallback(BLEPeriodicScanCallbacks *cb); - esp_err_t stopExtScan(); esp_err_t setExtScanParams(); - esp_err_t setExtScanParams(esp_ble_ext_scan_params_t *ext_scan_params); esp_err_t startExtScan(uint32_t duration, uint16_t period); - -private: - BLEExtAdvertisingCallbacks *m_pExtendedScanCb = nullptr; - BLEPeriodicScanCallbacks *m_pPeriodicScanCb = nullptr; + esp_err_t setExtScanParams(esp_ble_ext_scan_params_t *ext_scan_params); #endif // SOC_BLE_50_SUPPORTED + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + void setDuplicateFilter(bool enabled); + bool isScanning(); + void clearDuplicateCache(); +#endif + private: - BLEScan(); // One doesn't create a new instance instead one asks the BLEDevice for the singleton. friend class BLEDevice; - void handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); - esp_ble_scan_params_t m_scan_params; + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + BLEAdvertisedDeviceCallbacks *m_pAdvertisedDeviceCallbacks = nullptr; bool m_stopped = true; bool m_shouldParse = true; @@ -101,21 +159,79 @@ class BLEScan { BLEScanResults m_scanResults; bool m_wantDuplicates; void (*m_scanCompleteCB)(BLEScanResults scanResults); + + /*************************************************************************** + * Bluedroid private properties * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + esp_ble_scan_params_t m_scan_params; +#if defined(SOC_BLE_50_SUPPORTED) + BLEExtAdvertisingCallbacks *m_pExtendedScanCb = nullptr; + BLEPeriodicScanCallbacks *m_pPeriodicScanCb = nullptr; +#endif // SOC_BLE_50_SUPPORTED +#endif + + /*************************************************************************** + * NimBLE private properties * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + uint32_t m_duration; + ble_gap_disc_params m_scan_params; + bool m_ignoreResults; + BLETaskData *m_pTaskData; + uint8_t m_maxResults; +#endif + + /*************************************************************************** + * Common private definitions * + ***************************************************************************/ + + BLEScan(); // One doesn't create a new instance instead one asks the BLEDevice for the singleton. + + /*************************************************************************** + * Bluedroid private definitions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + void handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); +#endif + + /*************************************************************************** + * NimBLE private definitions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + void onHostReset(); + void onHostSync(); + static int handleGAPEvent(ble_gap_event *event, void *arg); +#endif }; // BLEScan class BLEPeriodicScanCallbacks { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + virtual ~BLEPeriodicScanCallbacks() {} + virtual void onLostSync(uint16_t sync_handle) {} + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) virtual void onCreateSync(esp_bt_status_t status) {} virtual void onCancelSync(esp_bt_status_t status) {} virtual void onTerminateSync(esp_bt_status_t status) {} - virtual void onLostSync(uint16_t sync_handle) {} virtual void onSync(esp_ble_periodic_adv_sync_estab_param_t) {} virtual void onReport(esp_ble_gap_periodic_adv_report_t params) {} virtual void onStop(esp_bt_status_t status) {} +#endif }; -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLESCAN_H_ */ diff --git a/libraries/BLE/src/BLESecurity.cpp b/libraries/BLE/src/BLESecurity.cpp index 34fc3e69e9e..978026a3809 100644 --- a/libraries/BLE/src/BLESecurity.cpp +++ b/libraries/BLE/src/BLESecurity.cpp @@ -3,77 +3,114 @@ * * Created on: Dec 17, 2017 * Author: chegewara + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on chegewara's and h2zero's work) + * Description: Added support for NimBLE */ #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED -#include "BLESecurity.h" #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + +#include "BLESecurity.h" +#include "BLEUtils.h" +#include "esp32-hal-log.h" + +/*************************************************************************** + * NimBLE includes * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#endif + +/*************************************************************************** + * Common properties * + ***************************************************************************/ + +uint32_t BLESecurity::m_passkey = BLE_SM_DEFAULT_PASSKEY; + +/*************************************************************************** + * Common functions * + ***************************************************************************/ BLESecurity::BLESecurity() {} BLESecurity::~BLESecurity() {} -/* - * @brief Set requested authentication mode - */ -void BLESecurity::setAuthenticationMode(esp_ble_auth_req_t auth_req) { + +void BLESecurity::setAuthenticationMode(uint8_t auth_req) { m_authReq = auth_req; - esp_ble_gap_set_security_param(ESP_BLE_SM_AUTHEN_REQ_MODE, &m_authReq, sizeof(uint8_t)); // <--- setup requested authentication mode +#if defined(CONFIG_BLUEDROID_ENABLED) + esp_ble_gap_set_security_param(ESP_BLE_SM_AUTHEN_REQ_MODE, &m_authReq, sizeof(uint8_t)); +#elif defined(CONFIG_NIMBLE_ENABLED) + BLESecurity::setAuthenticationMode( + (auth_req & BLE_SM_PAIR_AUTHREQ_BOND) != 0, (auth_req & BLE_SM_PAIR_AUTHREQ_MITM) != 0, (auth_req & BLE_SM_PAIR_AUTHREQ_SC) != 0 + ); +#endif } -/** - * @brief Set our device IO capability to let end user perform authorization - * either by displaying or entering generated 6-digits pin code - */ -void BLESecurity::setCapability(esp_ble_io_cap_t iocap) { +void BLESecurity::setCapability(uint8_t iocap) { m_iocap = iocap; +#if defined(CONFIG_BLUEDROID_ENABLED) esp_ble_gap_set_security_param(ESP_BLE_SM_IOCAP_MODE, &iocap, sizeof(uint8_t)); -} // setCapability +#elif defined(CONFIG_NIMBLE_ENABLED) + ble_hs_cfg.sm_io_cap = iocap; +#endif +} -/** - * @brief Init encryption key by server - * @param key_size is value between 7 and 16 - */ void BLESecurity::setInitEncryptionKey(uint8_t init_key) { m_initKey = init_key; +#if defined(CONFIG_BLUEDROID_ENABLED) esp_ble_gap_set_security_param(ESP_BLE_SM_SET_INIT_KEY, &m_initKey, sizeof(uint8_t)); -} // setInitEncryptionKey +#elif defined(CONFIG_NIMBLE_ENABLED) + ble_hs_cfg.sm_our_key_dist = init_key; +#endif +} -/** - * @brief Init encryption key by client - * @param key_size is value between 7 and 16 - */ void BLESecurity::setRespEncryptionKey(uint8_t resp_key) { m_respKey = resp_key; +#if defined(CONFIG_BLUEDROID_ENABLED) esp_ble_gap_set_security_param(ESP_BLE_SM_SET_RSP_KEY, &m_respKey, sizeof(uint8_t)); -} // setRespEncryptionKey +#elif defined(CONFIG_NIMBLE_ENABLED) + ble_hs_cfg.sm_their_key_dist = resp_key; +#endif +} -/** - * - * - */ void BLESecurity::setKeySize(uint8_t key_size) { +#if defined(CONFIG_BLUEDROID_ENABLED) m_keySize = key_size; esp_ble_gap_set_security_param(ESP_BLE_SM_MAX_KEY_SIZE, &m_keySize, sizeof(uint8_t)); -} //setKeySize +#endif +} -/** - * Setup for static PIN connection, call it first and then call setAuthenticationMode eventually to change it - */ void BLESecurity::setStaticPIN(uint32_t pin) { - uint32_t passkey = pin; - esp_ble_gap_set_security_param(ESP_BLE_SM_SET_STATIC_PASSKEY, &passkey, sizeof(uint32_t)); + m_passkey = pin; +#if defined(CONFIG_BLUEDROID_ENABLED) + esp_ble_gap_set_security_param(ESP_BLE_SM_SET_STATIC_PASSKEY, &m_passkey, sizeof(uint32_t)); setCapability(ESP_IO_CAP_OUT); setKeySize(); setAuthenticationMode(ESP_LE_AUTH_REQ_SC_ONLY); setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK); +#elif defined(CONFIG_NIMBLE_ENABLED) + setCapability(BLE_HS_IO_DISPLAY_ONLY); + setKeySize(); + setAuthenticationMode(false, false, true); // No bonding, no MITM, secure connection only + setInitEncryptionKey(BLE_HS_KEY_DIST_ENC_KEY | BLE_HS_KEY_DIST_ID_KEY); +#endif } -/** - * @brief Debug function to display what keys are exchanged by peers - */ +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) char *BLESecurity::esp_key_type_to_str(esp_ble_key_type_t key_type) { char *key_str = nullptr; switch (key_type) { @@ -89,7 +126,34 @@ char *BLESecurity::esp_key_type_to_str(esp_ble_key_type_t key_type) { default: key_str = (char *)"INVALID BLE KEY TYPE"; break; } return key_str; -} // esp_key_type_to_str +} +#endif + +/*************************************************************************** + * NimBLE functions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +void BLESecurity::setAuthenticationMode(bool bonding, bool mitm, bool sc) { + m_authReq = bonding ? BLE_SM_PAIR_AUTHREQ_BOND : 0; + m_authReq |= mitm ? BLE_SM_PAIR_AUTHREQ_MITM : 0; + m_authReq |= sc ? BLE_SM_PAIR_AUTHREQ_SC : 0; + ble_hs_cfg.sm_bonding = bonding; + ble_hs_cfg.sm_mitm = mitm; + ble_hs_cfg.sm_sc = sc; +} + +bool BLESecurity::startSecurity(uint16_t connHandle, int *rcPtr) { + int rc = ble_gap_security_initiate(connHandle); + if (rc != 0) { + log_e("ble_gap_security_initiate: rc=%d %s", rc, BLEUtils::returnCodeToString(rc)); + } + if (rcPtr) { + *rcPtr = rc; + } + return rc == 0 || rc == BLE_HS_EALREADY; +} +#endif -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLESecurity.h b/libraries/BLE/src/BLESecurity.h index 2e3a44b42d1..574110e6118 100644 --- a/libraries/BLE/src/BLESecurity.h +++ b/libraries/BLE/src/BLESecurity.h @@ -3,74 +3,148 @@ * * Created on: Dec 17, 2017 * Author: chegewara + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on chegewara's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLESECURITY_H_ #define COMPONENTS_CPP_UTILS_BLESECURITY_H_ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + +#include "WString.h" +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) #include +#endif + +/*************************************************************************** + * NimBLE includes * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#endif +/*************************************************************************** + * Common definitions * + ***************************************************************************/ + +#define BLE_SM_DEFAULT_PASSKEY 123456 + +/*************************************************************************** + * Forward declarations * + ***************************************************************************/ + +class BLEServer; +class BLEClient; + +/** + * @brief Security management class + */ class BLESecurity { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + BLESecurity(); virtual ~BLESecurity(); - void setAuthenticationMode(esp_ble_auth_req_t auth_req); - void setCapability(esp_ble_io_cap_t iocap); - void setInitEncryptionKey(uint8_t init_key); - void setRespEncryptionKey(uint8_t resp_key); - void setKeySize(uint8_t key_size = 16); - void setStaticPIN(uint32_t pin); + static void setAuthenticationMode(uint8_t auth_req); + static void setCapability(uint8_t iocap); + static void setInitEncryptionKey(uint8_t init_key); + static void setRespEncryptionKey(uint8_t resp_key); + static void setKeySize(uint8_t key_size = 16); + static void setStaticPIN(uint32_t pin); + + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) static char *esp_key_type_to_str(esp_ble_key_type_t key_type); +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + static void setAuthenticationMode(bool bonding, bool mitm, bool sc); + static bool startSecurity(uint16_t connHandle, int *rcPtr = nullptr); +#endif private: - esp_ble_auth_req_t m_authReq; - esp_ble_io_cap_t m_iocap; - uint8_t m_initKey; - uint8_t m_respKey; - uint8_t m_keySize; + friend class BLEServer; + friend class BLEClient; + + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + + static uint8_t m_iocap; + static uint8_t m_authReq; + static uint8_t m_initKey; + static uint8_t m_respKey; + static uint32_t m_passkey; + + /*************************************************************************** + * Bluedroid private properties * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + static uint8_t m_keySize; +#endif }; // BLESecurity -/* +/** * @brief Callbacks to handle GAP events related to authorization */ class BLESecurityCallbacks { public: - virtual ~BLESecurityCallbacks(){}; + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ - /** - * @brief Its request from peer device to input authentication pin code displayed on peer device. - * It requires that our device is capable to input 6-digits code by end user - * @return Return 6-digits integer value from input device - */ + virtual ~BLESecurityCallbacks(){}; virtual uint32_t onPassKeyRequest() = 0; - - /** - * @brief Provide us 6-digits code to perform authentication. - * It requires that our device is capable to display this code to end user - * @param - */ virtual void onPassKeyNotify(uint32_t pass_key) = 0; + virtual bool onSecurityRequest() = 0; + virtual bool onConfirmPIN(uint32_t pin) = 0; - /** - * @brief Here we can make decision if we want to let negotiate authorization with peer device or not - * return Return true if we accept this peer device request - */ + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ - virtual bool onSecurityRequest() = 0; - /** - * Provide us information when authentication process is completed - */ +#if defined(CONFIG_BLUEDROID_ENABLED) virtual void onAuthenticationComplete(esp_ble_auth_cmpl_t) = 0; +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + virtual void onAuthenticationComplete(ble_gap_conn_desc *) = 0; +#endif - virtual bool onConfirmPIN(uint32_t pin) = 0; }; // BLESecurityCallbacks -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif // COMPONENTS_CPP_UTILS_BLESECURITY_H_ diff --git a/libraries/BLE/src/BLEServer.cpp b/libraries/BLE/src/BLEServer.cpp index a338cf61451..323237e965e 100644 --- a/libraries/BLE/src/BLEServer.cpp +++ b/libraries/BLE/src/BLEServer.cpp @@ -3,14 +3,23 @@ * * Created on: Apr 16, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/*************************************************************************** + * Common includes * + ***************************************************************************/ + #include -#include #include "GeneralUtils.h" #include "BLEDevice.h" #include "BLEServer.h" @@ -21,6 +30,27 @@ #include #include "esp32-hal-log.h" +/*************************************************************************** + * Bluedroid includes * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#endif + +/*************************************************************************** + * NimBLE includes * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#include +#endif + +/*************************************************************************** + * Common functions * + ***************************************************************************/ + /** * @brief Construct a %BLE Server * @@ -28,8 +58,17 @@ * the BLEDevice class. */ BLEServer::BLEServer() { - m_appId = ESP_GATT_IF_NONE; +#ifdef CONFIG_BLUEDROID_ENABLED m_gatts_if = ESP_GATT_IF_NONE; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + memset(m_indWait, BLE_HS_CONN_HANDLE_NONE, sizeof(m_indWait)); + m_svcChanged = false; +#endif + + m_appId = ESP_GATT_IF_NONE; + m_gattsStarted = false; m_connectedCount = 0; m_connId = ESP_GATT_IF_NONE; m_pServerCallbacks = nullptr; @@ -37,7 +76,9 @@ BLEServer::BLEServer() { void BLEServer::createApp(uint16_t appId) { m_appId = appId; +#ifdef CONFIG_BLUEDROID_ENABLED registerApp(appId); +#endif } // createApp /** @@ -64,7 +105,9 @@ BLEService *BLEServer::createService(const char *uuid) { */ BLEService *BLEServer::createService(BLEUUID uuid, uint32_t numHandles, uint8_t inst_id) { log_v(">> createService - %s", uuid.toString().c_str()); +#ifdef CONFIG_BLUEDROID_ENABLED m_semaphoreCreateEvt.take("createService"); +#endif // Check that a service with the supplied UUID does not already exist. if (m_serviceMap.getByUUID(uuid) != nullptr) { @@ -76,7 +119,14 @@ BLEService *BLEServer::createService(BLEUUID uuid, uint32_t numHandles, uint8_t m_serviceMap.setByUUID(uuid, pService); // Save a reference to this service being on this server. pService->executeCreate(this); // Perform the API calls to actually create the service. +#ifdef CONFIG_BLUEDROID_ENABLED m_semaphoreCreateEvt.wait("createService"); +#endif + +#ifdef CONFIG_NIMBLE_ENABLED + m_semaphoreCreateEvt.give(); + serviceChanged(); +#endif log_v("<< createService"); return pService; @@ -121,6 +171,190 @@ uint32_t BLEServer::getConnectedCount() { return m_connectedCount; } // getConnectedCount +void BLEServer::start() { + if (m_gattsStarted) { + return; + } + +#ifdef CONFIG_NIMBLE_ENABLED + int rc = ble_gatts_start(); + if (rc != 0) { + log_e("ble_gatts_start; rc=%d, %s", rc, BLEUtils::returnCodeToString(rc)); + return; + } + +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG + ble_gatts_show_local(); +#endif + + BLEService *svc = m_serviceMap.getFirst(); + while (svc != nullptr) { + if (svc->m_removed == 0) { + rc = ble_gatts_find_svc(&svc->getUUID().getNative()->u, &svc->m_handle); + if (rc != 0) { + abort(); + } + } + + BLECharacteristic *chr = svc->m_characteristicMap.getFirst(); + while (chr != nullptr) { + if ((chr->m_properties & BLE_GATT_CHR_F_INDICATE) || (chr->m_properties & BLE_GATT_CHR_F_NOTIFY)) { + m_notifyChrVec.push_back(chr); + } + chr = svc->m_characteristicMap.getNext(); + } + + svc = m_serviceMap.getNext(); + } + +#endif + + m_gattsStarted = true; +} + +/** + * @brief Set the server callbacks. + * + * As a %BLE server operates, it will generate server level events such as a new client connecting or a previous client + * disconnecting. This function can be called to register a callback handler that will be invoked when these + * events are detected. + * + * @param [in] pCallbacks The callbacks to be invoked. + */ +void BLEServer::setCallbacks(BLEServerCallbacks *pCallbacks) { + m_pServerCallbacks = pCallbacks; +} // setCallbacks + +/* + * Remove service + */ +void BLEServer::removeService(BLEService *service) { +#if defined(CONFIG_BLUEDROID_ENABLED) + service->stop(); + service->executeDelete(); + m_serviceMap.removeService(service); +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + if (service->m_removed == 0) { + int rc = ble_gatts_svc_set_visibility(service->getHandle(), 0); + if (rc != 0) { + return; + } + service->m_removed = NIMBLE_ATT_REMOVE_DELETE; + serviceChanged(); + m_serviceMap.removeService(service); + BLEDevice::getAdvertising()->removeServiceUUID(service->getUUID()); + } +#endif +} + +/** + * @brief Start advertising. + * + * Start the server advertising its existence. This is a convenience function and is equivalent to + * retrieving the advertising object and invoking start upon it. + */ +void BLEServer::startAdvertising() { + log_v(">> startAdvertising"); + BLEDevice::startAdvertising(); + log_v("<< startAdvertising"); +} // startAdvertising + +/* multi connect support */ +/* TODO do some more tweaks */ +void BLEServer::updatePeerMTU(uint16_t conn_id, uint16_t mtu) { + // set mtu in conn_status_t + const std::map::iterator it = m_connectedServersMap.find(conn_id); + if (it != m_connectedServersMap.end()) { + it->second.mtu = mtu; + std::swap(m_connectedServersMap[conn_id], it->second); + } +} + +std::map BLEServer::getPeerDevices(bool _client) { + return m_connectedServersMap; +} + +uint16_t BLEServer::getPeerMTU(uint16_t conn_id) { +#if defined(CONFIG_BLUEDROID_ENABLED) + return m_connectedServersMap.find(conn_id)->second.mtu; +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + return ble_att_mtu(conn_id); +#endif +} + +void BLEServer::addPeerDevice(void *peer, bool _client, uint16_t conn_id) { + conn_status_t status = {.peer_device = peer, .connected = true, .mtu = 23}; + + m_connectedServersMap.insert(std::pair(conn_id, status)); +} + +bool BLEServer::removePeerDevice(uint16_t conn_id, bool _client) { + return m_connectedServersMap.erase(conn_id) > 0; +} + +void BLEServerCallbacks::onConnect(BLEServer *pServer) { + log_d("BLEServerCallbacks", ">> onConnect(): Default"); + log_d("BLEServerCallbacks", "Device: %s", BLEDevice::toString().c_str()); + log_d("BLEServerCallbacks", "<< onConnect()"); +} // onConnect + +void BLEServerCallbacks::onDisconnect(BLEServer *pServer) { + log_d("BLEServerCallbacks", ">> onDisconnect(): Default"); + log_d("BLEServerCallbacks", "Device: %s", BLEDevice::toString().c_str()); + log_d("BLEServerCallbacks", "<< onDisconnect()"); +} // onDisconnect + +/*************************************************************************** + * Bluedroid functions * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + +/** + * Allow to connect GATT server to peer device + * Probably can be used in ANCS for iPhone + */ +bool BLEServer::connect(BLEAddress address) { + esp_bd_addr_t addr; + memcpy(&addr, address.getNative(), 6); + // Perform the open connection request against the target BLE Server. + m_semaphoreOpenEvt.take("connect"); + esp_err_t errRc = ::esp_ble_gatts_open( + getGattsIf(), + addr, // address + 1 // direct connection + ); + if (errRc != ESP_OK) { + log_e("esp_ble_gattc_open: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + return false; + } + + uint32_t rc = m_semaphoreOpenEvt.wait("connect"); // Wait for the connection to complete. + log_v("<< connect(), rc=%d", rc == ESP_GATT_OK); + return rc == ESP_GATT_OK; +} // connect + +/** + * Update connection parameters can be called only after connection has been established + */ +void BLEServer::updateConnParams(esp_bd_addr_t remote_bda, uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout) { + esp_ble_conn_update_params_t conn_params; + memcpy(conn_params.bda, remote_bda, sizeof(esp_bd_addr_t)); + conn_params.latency = latency; + conn_params.max_int = maxInterval; // max_int = 0x20*1.25ms = 40ms + conn_params.min_int = minInterval; // min_int = 0x10*1.25ms = 20ms + conn_params.timeout = timeout; // timeout = 400*10ms = 4000ms + esp_ble_gap_update_conn_params(&conn_params); +} + +void BLEServer::disconnect(uint16_t connId) { + esp_ble_gatts_close(m_gatts_if, connId); +} + uint16_t BLEServer::getGattsIf() { return m_gatts_if; } @@ -288,140 +522,450 @@ void BLEServer::registerApp(uint16_t m_appId) { log_v("<< registerApp"); } // registerApp +// Bluedroid callbacks + +void BLEServerCallbacks::onConnect(BLEServer *pServer, esp_ble_gatts_cb_param_t *param) { + log_d("BLEServerCallbacks", ">> onConnect(): Default"); + log_d("BLEServerCallbacks", "Device: %s", BLEDevice::toString().c_str()); + log_d("BLEServerCallbacks", "<< onConnect()"); +} // onConnect + +void BLEServerCallbacks::onDisconnect(BLEServer *pServer, esp_ble_gatts_cb_param_t *param) { + log_d("BLEServerCallbacks", ">> onDisconnect(): Default"); + log_d("BLEServerCallbacks", "Device: %s", BLEDevice::toString().c_str()); + log_d("BLEServerCallbacks", "<< onDisconnect()"); +} // onDisconnect + +void BLEServerCallbacks::onMtuChanged(BLEServer *pServer, esp_ble_gatts_cb_param_t *param) { + [[maybe_unused]] + uint16_t mtu = param->mtu.mtu; + log_d("BLEServerCallbacks", ">> onMtuChanged(): Default"); + log_d("BLEServerCallbacks", "Device: %s MTU: %d", BLEDevice::toString().c_str(), mtu); + log_d("BLEServerCallbacks", "<< onMtuChanged()"); +} // onMtuChanged + +#endif + +/*************************************************************************** + * NimBLE functions * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + +uint16_t BLEServer::getHandle() { + return getConnId(); +} + /** - * @brief Set the server callbacks. + * @brief Resets the GATT server, used when services are added/removed after initialization. + */ +void BLEServer::resetGATT() { + if (getConnectedCount() > 0) { + return; + } + + BLEDevice::stopAdvertising(); + ble_gatts_reset(); + ble_svc_gap_init(); + ble_svc_gatt_init(); + + BLEService *svc = m_serviceMap.getFirst(); + while (svc != nullptr) { + if (svc->m_removed > 0) { + if (svc->m_removed == NIMBLE_ATT_REMOVE_DELETE) { + m_serviceMap.removeService(svc); + delete svc; + } + } else { + svc->start(); + } + + svc = m_serviceMap.getNext(); + } + + m_svcChanged = false; + m_gattsStarted = false; +} + +/** + * @brief Handle a GATT Server Event. * - * As a %BLE server operates, it will generate server level events such as a new client connecting or a previous client - * disconnecting. This function can be called to register a callback handler that will be invoked when these - * events are detected. + * @param [in] event + * @param [in] gatts_if + * @param [in] param * - * @param [in] pCallbacks The callbacks to be invoked. */ -void BLEServer::setCallbacks(BLEServerCallbacks *pCallbacks) { - m_pServerCallbacks = pCallbacks; -} // setCallbacks +int BLEServer::handleGATTServerEvent(struct ble_gap_event *event, void *arg) { + BLEServer *server = (BLEServer *)arg; + log_v(">> handleGAPEvent: %s", BLEUtils::gapEventToString(event->type)); + int rc = 0; + struct ble_gap_conn_desc desc; + + switch (event->type) { + case BLE_GAP_EVENT_CONNECT: + { + if (event->connect.status != 0) { + /* Connection failed; resume advertising */ + log_e("Connection failed"); + BLEDevice::startAdvertising(); + } else { + server->m_connId = event->connect.conn_handle; + server->addPeerDevice((void *)server, false, event->connect.conn_handle); + rc = ble_gap_conn_find(event->connect.conn_handle, &desc); + if (rc != 0) { + return 0; + } + + if (server->m_pServerCallbacks != nullptr) { + server->m_pServerCallbacks->onConnect(server); + server->m_pServerCallbacks->onConnect(server, &desc); + } + + server->m_connectedCount++; + } -/* - * Remove service - */ -void BLEServer::removeService(BLEService *service) { - service->stop(); - service->executeDelete(); - m_serviceMap.removeService(service); + return 0; + } // BLE_GAP_EVENT_CONNECT + + case BLE_GAP_EVENT_DISCONNECT: + { + // If Host reset tell the device now before returning to prevent + // any errors caused by calling host functions before resyncing. + switch (event->disconnect.reason) { + case BLE_HS_ETIMEOUT_HCI: + case BLE_HS_EOS: + case BLE_HS_ECONTROLLER: + case BLE_HS_ENOTSYNCED: + log_d("Disconnect - host reset, rc=%d", event->disconnect.reason); + BLEDevice::onReset(event->disconnect.reason); + break; + default: break; + } + + if (server->removePeerDevice(event->disconnect.conn.conn_handle, false)) { + server->m_connectedCount--; + } + + if (server->m_svcChanged) { + server->resetGATT(); + } + + if (server->m_pServerCallbacks != nullptr) { + server->m_pServerCallbacks->onDisconnect(server); + server->m_pServerCallbacks->onDisconnect(server, &event->disconnect.conn); + } + + return 0; + } // BLE_GAP_EVENT_DISCONNECT + + case BLE_GAP_EVENT_SUBSCRIBE: + { + log_i("subscribe event; attr_handle=%d, subscribed: %s", event->subscribe.attr_handle, (event->subscribe.cur_notify ? "true" : "false")); + + for (auto &it : server->m_notifyChrVec) { + if (it->getHandle() == event->subscribe.attr_handle) { + uint16_t properties = it->getProperties(); + if ((properties & BLE_GATT_CHR_F_READ_AUTHEN) || (properties & BLE_GATT_CHR_F_READ_AUTHOR) || (properties & BLE_GATT_CHR_F_READ_ENC)) { + rc = ble_gap_conn_find(event->subscribe.conn_handle, &desc); + if (rc != 0) { + break; + } + + if (!desc.sec_state.encrypted) { + BLESecurity::startSecurity(event->subscribe.conn_handle); + } + } + + it->setSubscribe(event); + break; + } + } + + return 0; + } // BLE_GAP_EVENT_SUBSCRIBE + + case BLE_GAP_EVENT_MTU: + { + log_i("mtu update event; conn_handle=%d mtu=%d", event->mtu.conn_handle, event->mtu.value); + rc = ble_gap_conn_find(event->mtu.conn_handle, &desc); + if (rc != 0) { + return 0; + } + + if (server->m_pServerCallbacks != nullptr) { + server->m_pServerCallbacks->onMtuChanged(server, &desc, event->mtu.value); + } + return 0; + } // BLE_GAP_EVENT_MTU + + case BLE_GAP_EVENT_NOTIFY_TX: + { + BLECharacteristic *pChar = nullptr; + + for (auto &it : server->m_notifyChrVec) { + if (it->getHandle() == event->notify_tx.attr_handle) { + pChar = it; + } + } + + if (pChar == nullptr) { + return 0; + } + + BLECharacteristicCallbacks::Status statusRC; + + if (event->notify_tx.indication) { + if (event->notify_tx.status != 0) { + if (event->notify_tx.status == BLE_HS_EDONE) { + statusRC = BLECharacteristicCallbacks::Status::SUCCESS_INDICATE; + } else if (rc == BLE_HS_ETIMEOUT) { + statusRC = BLECharacteristicCallbacks::Status::ERROR_INDICATE_TIMEOUT; + } else { + statusRC = BLECharacteristicCallbacks::Status::ERROR_INDICATE_FAILURE; + } + } else { + return 0; + } + + server->clearIndicateWait(event->notify_tx.conn_handle); + } else { + if (event->notify_tx.status == 0) { + statusRC = BLECharacteristicCallbacks::Status::SUCCESS_NOTIFY; + } else { + statusRC = BLECharacteristicCallbacks::Status::ERROR_GATT; + } + } + + pChar->m_pCallbacks->onStatus(pChar, statusRC, event->notify_tx.status); + + return 0; + } // BLE_GAP_EVENT_NOTIFY_TX + + case BLE_GAP_EVENT_ADV_COMPLETE: + { + log_d("Advertising Complete"); + BLEDevice::getAdvertising()->advCompleteCB(); + return 0; + } + + case BLE_GAP_EVENT_CONN_UPDATE: + { + log_d("Connection parameters updated."); + return 0; + } // BLE_GAP_EVENT_CONN_UPDATE + + case BLE_GAP_EVENT_REPEAT_PAIRING: + { + /* We already have a bond with the peer, but it is attempting to + * establish a new secure link. This app sacrifices security for + * convenience: just throw away the old bond and accept the new link. + */ + + /* Delete the old bond. */ + rc = ble_gap_conn_find(event->repeat_pairing.conn_handle, &desc); + if (rc != 0) { + return BLE_GAP_REPEAT_PAIRING_IGNORE; + } + + ble_store_util_delete_peer(&desc.peer_id_addr); + + /* Return BLE_GAP_REPEAT_PAIRING_RETRY to indicate that the host should + * continue with the pairing operation. + */ + return BLE_GAP_REPEAT_PAIRING_RETRY; + } // BLE_GAP_EVENT_REPEAT_PAIRING + + case BLE_GAP_EVENT_ENC_CHANGE: + { + rc = ble_gap_conn_find(event->enc_change.conn_handle, &desc); + if (rc != 0) { + return BLE_ATT_ERR_INVALID_HANDLE; + } + + if (BLEDevice::m_securityCallbacks != nullptr) { + BLEDevice::m_securityCallbacks->onAuthenticationComplete(&desc); + } else if (server->m_pServerCallbacks != nullptr) { + server->m_pServerCallbacks->onAuthenticationComplete(&desc); + } + + return 0; + } // BLE_GAP_EVENT_ENC_CHANGE + + case BLE_GAP_EVENT_PASSKEY_ACTION: + { + struct ble_sm_io pkey = {0, 0}; + + if (event->passkey.params.action == BLE_SM_IOACT_DISP) { + pkey.action = event->passkey.params.action; + // backward compatibility + pkey.passkey = BLESecurity::m_passkey; + // if the (static)passkey is the default, check the callback for custom value + // both values default to the same. + if (pkey.passkey == BLE_SM_DEFAULT_PASSKEY) { + if (server->m_pServerCallbacks != nullptr) { + pkey.passkey = server->m_pServerCallbacks->onPassKeyRequest(); + } + } + rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); + log_d("BLE_SM_IOACT_DISP; ble_sm_inject_io result: %d", rc); + + } else if (event->passkey.params.action == BLE_SM_IOACT_NUMCMP) { + log_d("Passkey on device's display: %d", event->passkey.params.numcmp); + pkey.action = event->passkey.params.action; + // Compatibility only - Do not use, should be removed the in future + if (BLEDevice::m_securityCallbacks != nullptr) { + pkey.numcmp_accept = BLEDevice::m_securityCallbacks->onConfirmPIN(event->passkey.params.numcmp); + } else if (server->m_pServerCallbacks != nullptr) { + pkey.numcmp_accept = server->m_pServerCallbacks->onConfirmPIN(event->passkey.params.numcmp); + } + + rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); + log_d("BLE_SM_IOACT_NUMCMP; ble_sm_inject_io result: %d", rc); + + //TODO: Handle out of band pairing + } else if (event->passkey.params.action == BLE_SM_IOACT_OOB) { + static uint8_t tem_oob[16] = {0}; + pkey.action = event->passkey.params.action; + for (int i = 0; i < 16; i++) { + pkey.oob[i] = tem_oob[i]; + } + rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); + log_d("BLE_SM_IOACT_OOB; ble_sm_inject_io result: %d", rc); + } else if (event->passkey.params.action == BLE_SM_IOACT_INPUT) { + log_d("Enter the passkey"); + pkey.action = event->passkey.params.action; + + // Compatibility only - Do not use, should be removed the in future + if (BLEDevice::m_securityCallbacks != nullptr) { + pkey.passkey = BLEDevice::m_securityCallbacks->onPassKeyRequest(); + } else if (server->m_pServerCallbacks != nullptr) { + pkey.passkey = server->m_pServerCallbacks->onPassKeyRequest(); + } + + rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); + log_d("BLE_SM_IOACT_INPUT; ble_sm_inject_io result: %d", rc); + + } else if (event->passkey.params.action == BLE_SM_IOACT_NONE) { + log_d("No passkey action required"); + } + + log_d("<< handleGATTServerEvent"); + return 0; + } // BLE_GAP_EVENT_PASSKEY_ACTION + + default: break; + } + + log_d("<< handleGATTServerEvent"); + return 0; } /** - * @brief Start advertising. - * - * Start the server advertising its existence. This is a convenience function and is equivalent to - * retrieving the advertising object and invoking start upon it. + * @brief Request an Update the connection parameters: + * * Can only be used after a connection has been established. + * @param [in] conn_handle The connection handle of the peer to send the request to. + * @param [in] minInterval The minimum connection interval in 1.25ms units. + * @param [in] maxInterval The maximum connection interval in 1.25ms units. + * @param [in] latency The number of packets allowed to skip (extends max interval). + * @param [in] timeout The timeout time in 10ms units before disconnecting. */ -void BLEServer::startAdvertising() { - log_v(">> startAdvertising"); - BLEDevice::startAdvertising(); - log_v("<< startAdvertising"); -} // startAdvertising +void BLEServer::updateConnParams(uint16_t conn_handle, uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout) { + ble_gap_upd_params params; + + params.latency = latency; + params.itvl_max = maxInterval; // max_int = 0x20*1.25ms = 40ms + params.itvl_min = minInterval; // min_int = 0x10*1.25ms = 20ms + params.supervision_timeout = timeout; // timeout = 400*10ms = 4000ms + params.min_ce_len = BLE_GAP_INITIAL_CONN_MIN_CE_LEN; // Minimum length of connection event in 0.625ms units + params.max_ce_len = BLE_GAP_INITIAL_CONN_MAX_CE_LEN; // Maximum length of connection event in 0.625ms units + + int rc = ble_gap_update_params(conn_handle, ¶ms); + if (rc != 0) { + log_e("Update params error: %d, %s", rc, BLEUtils::returnCodeToString(rc)); + } +} // updateConnParams + +bool BLEServer::setIndicateWait(uint16_t conn_handle) { + for (auto i = 0; i < CONFIG_BT_NIMBLE_MAX_CONNECTIONS; i++) { + if (m_indWait[i] == conn_handle) { + return false; + } + } + + return true; +} + +void BLEServer::clearIndicateWait(uint16_t conn_handle) { + for (auto i = 0; i < CONFIG_BT_NIMBLE_MAX_CONNECTIONS; i++) { + if (m_indWait[i] == conn_handle) { + m_indWait[i] = BLE_HS_CONN_HANDLE_NONE; + return; + } + } +} /** - * Allow to connect GATT server to peer device - * Probably can be used in ANCS for iPhone + * @brief Disconnect the specified client with optional reason. + * @param [in] connId Connection Id of the client to disconnect. + * @param [in] reason code for disconnecting. + * @return NimBLE host return code. */ -bool BLEServer::connect(BLEAddress address) { - esp_bd_addr_t addr; - memcpy(&addr, address.getNative(), 6); - // Perform the open connection request against the target BLE Server. - m_semaphoreOpenEvt.take("connect"); - esp_err_t errRc = ::esp_ble_gatts_open( - getGattsIf(), - addr, // address - 1 // direct connection - ); - if (errRc != ESP_OK) { - log_e("esp_ble_gattc_open: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - return false; +int BLEServer::disconnect(uint16_t connId, uint8_t reason) { + log_d(">> disconnect()"); + + int rc = ble_gap_terminate(connId, reason); + if (rc != 0) { + log_e("ble_gap_terminate failed: rc=%d %s", rc, BLEUtils::returnCodeToString(rc)); } - uint32_t rc = m_semaphoreOpenEvt.wait("connect"); // Wait for the connection to complete. - log_v("<< connect(), rc=%d", rc == ESP_GATT_OK); - return rc == ESP_GATT_OK; -} // connect + log_d("<< disconnect()"); + return rc; +} // disconnect -void BLEServerCallbacks::onConnect(BLEServer *pServer) { - log_d("BLEServerCallbacks", ">> onConnect(): Default"); - log_d("BLEServerCallbacks", "Device: %s", BLEDevice::toString().c_str()); - log_d("BLEServerCallbacks", "<< onConnect()"); -} // onConnect +/** + * @brief Set the service changed flag + */ +void BLEServer::serviceChanged() { + if (m_gattsStarted) { + m_svcChanged = true; + } +} // serviceChanged -void BLEServerCallbacks::onConnect(BLEServer *pServer, esp_ble_gatts_cb_param_t *param) { +// NimBLE callbacks + +void BLEServerCallbacks::onConnect(BLEServer *pServer, struct ble_gap_conn_desc *desc) { log_d("BLEServerCallbacks", ">> onConnect(): Default"); log_d("BLEServerCallbacks", "Device: %s", BLEDevice::toString().c_str()); log_d("BLEServerCallbacks", "<< onConnect()"); } // onConnect -void BLEServerCallbacks::onDisconnect(BLEServer *pServer) { +void BLEServerCallbacks::onDisconnect(BLEServer *pServer, struct ble_gap_conn_desc *desc) { log_d("BLEServerCallbacks", ">> onDisconnect(): Default"); log_d("BLEServerCallbacks", "Device: %s", BLEDevice::toString().c_str()); log_d("BLEServerCallbacks", "<< onDisconnect()"); } // onDisconnect -void BLEServerCallbacks::onDisconnect(BLEServer *pServer, esp_ble_gatts_cb_param_t *param) { - log_d("BLEServerCallbacks", ">> onDisconnect(): Default"); - log_d("BLEServerCallbacks", "Device: %s", BLEDevice::toString().c_str()); - log_d("BLEServerCallbacks", "<< onDisconnect()"); -} // onDisconnect - -void BLEServerCallbacks::onMtuChanged(BLEServer *pServer, esp_ble_gatts_cb_param_t *param) { +void BLEServerCallbacks::onMtuChanged(BLEServer *pServer, ble_gap_conn_desc *desc, uint16_t mtu) { log_d("BLEServerCallbacks", ">> onMtuChanged(): Default"); - log_d("BLEServerCallbacks", "Device: %s MTU: %d", BLEDevice::toString().c_str(), param->mtu.mtu); + log_d("BLEServerCallbacks", "Device: %s MTU: %d", BLEDevice::toString().c_str(), mtu); log_d("BLEServerCallbacks", "<< onMtuChanged()"); } // onMtuChanged -/* multi connect support */ -/* TODO do some more tweaks */ -void BLEServer::updatePeerMTU(uint16_t conn_id, uint16_t mtu) { - // set mtu in conn_status_t - const std::map::iterator it = m_connectedServersMap.find(conn_id); - if (it != m_connectedServersMap.end()) { - it->second.mtu = mtu; - std::swap(m_connectedServersMap[conn_id], it->second); - } +uint32_t BLEServerCallbacks::onPassKeyRequest() { + log_d("BLEServerCallbacks", "onPassKeyRequest: default: 123456"); + return 123456; } -std::map BLEServer::getPeerDevices(bool _client) { - return m_connectedServersMap; +void BLEServerCallbacks::onAuthenticationComplete(ble_gap_conn_desc *) { + log_d("BLEServerCallbacks", "onAuthenticationComplete: default"); } -uint16_t BLEServer::getPeerMTU(uint16_t conn_id) { - return m_connectedServersMap.find(conn_id)->second.mtu; +bool BLEServerCallbacks::onConfirmPIN(uint32_t pin) { + log_d("BLEServerCallbacks", "onConfirmPIN: default: true"); + return true; } -void BLEServer::addPeerDevice(void *peer, bool _client, uint16_t conn_id) { - conn_status_t status = {.peer_device = peer, .connected = true, .mtu = 23}; - - m_connectedServersMap.insert(std::pair(conn_id, status)); -} - -bool BLEServer::removePeerDevice(uint16_t conn_id, bool _client) { - return m_connectedServersMap.erase(conn_id) > 0; -} -/* multi connect support */ - -/** - * Update connection parameters can be called only after connection has been established - */ -void BLEServer::updateConnParams(esp_bd_addr_t remote_bda, uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout) { - esp_ble_conn_update_params_t conn_params; - memcpy(conn_params.bda, remote_bda, sizeof(esp_bd_addr_t)); - conn_params.latency = latency; - conn_params.max_int = maxInterval; // max_int = 0x20*1.25ms = 40ms - conn_params.min_int = minInterval; // min_int = 0x10*1.25ms = 20ms - conn_params.timeout = timeout; // timeout = 400*10ms = 4000ms - esp_ble_gap_update_conn_params(&conn_params); -} - -void BLEServer::disconnect(uint16_t connId) { - esp_ble_gatts_close(m_gatts_if, connId); -} +#endif // CONFIG_NIMBLE_ENABLED -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEServer.h b/libraries/BLE/src/BLEServer.h index aa10f2210fa..865d1046312 100644 --- a/libraries/BLE/src/BLEServer.h +++ b/libraries/BLE/src/BLEServer.h @@ -3,6 +3,10 @@ * * Created on: Apr 16, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLESERVER_H_ @@ -11,13 +15,16 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) -#include +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/***************************************************************************** + * Common includes * + *****************************************************************************/ #include #include -// #include "BLEDevice.h" - +#include "BLEDevice.h" +#include "BLEConnInfo.h" #include "BLEUUID.h" #include "BLEAdvertising.h" #include "BLECharacteristic.h" @@ -25,24 +32,51 @@ #include "BLESecurity.h" #include "RTOS.h" #include "BLEAddress.h" +#include "BLEUtils.h" +#include "BLEUtils.h" + +/***************************************************************************** + * Bluedroid includes * + *****************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#endif + +/***************************************************************************** + * NimBLE includes and definitions * + *****************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#define ESP_GATT_IF_NONE BLE_HS_CONN_HANDLE_NONE +#define NIMBLE_ATT_REMOVE_HIDE 1 +#define NIMBLE_ATT_REMOVE_DELETE 2 +#endif + +/***************************************************************************** + * Forward declarations * + *****************************************************************************/ class BLEServerCallbacks; -/* TODO possibly refactor this struct */ -typedef struct { - void *peer_device; // peer device BLEClient or BLEServer - maybe its better to have 2 structures or union here - bool connected; // do we need it? - uint16_t mtu; // every peer device negotiate own mtu -} conn_status_t; +class BLEService; +class BLECharacteristic; +class BLEDevice; +class BLESecurity; +class BLEAdvertising; /** - * @brief A data structure that manages the %BLE servers owned by a BLE server. + * @brief A data structure that manages the %BLE services owned by a BLE server. */ class BLEServiceMap { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + BLEService *getByHandle(uint16_t handle); BLEService *getByUUID(const char *uuid); BLEService *getByUUID(BLEUUID uuid, uint8_t inst_id = 0); - void handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); void setByHandle(uint16_t handle, BLEService *service); void setByUUID(const char *uuid, BLEService *service); void setByUUID(BLEUUID uuid, BLEService *service); @@ -52,7 +86,19 @@ class BLEServiceMap { void removeService(BLEService *service); int getRegisteredServiceCount(); + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + void handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); +#endif + private: + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + std::map m_handleMap; std::map m_uuidMap; std::map::iterator m_iterator; @@ -63,6 +109,16 @@ class BLEServiceMap { */ class BLEServer { public: + /*************************************************************************** + * Common public properties * + ***************************************************************************/ + + uint16_t m_appId; + + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + uint32_t getConnectedCount(); BLEService *createService(const char *uuid); BLEService *createService(BLEUUID uuid, uint32_t numHandles = 15, uint8_t inst_id = 0); @@ -72,12 +128,9 @@ class BLEServer { void removeService(BLEService *service); BLEService *getServiceByUUID(const char *uuid); BLEService *getServiceByUUID(BLEUUID uuid); - bool connect(BLEAddress address); - void disconnect(uint16_t connId); - uint16_t m_appId; - void updateConnParams(esp_bd_addr_t remote_bda, uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout); + void start(); - /* multi connection support */ + // Connection management functions std::map getPeerDevices(bool client); void addPeerDevice(void *peer, bool is_client, uint16_t conn_id); bool removePeerDevice(uint16_t conn_id, bool client); @@ -86,28 +139,95 @@ class BLEServer { uint16_t getPeerMTU(uint16_t conn_id); uint16_t getConnId(); + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + bool connect(BLEAddress address); + void updateConnParams(esp_bd_addr_t remote_bda, uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout); + void disconnect(uint16_t connId); +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + uint16_t getHandle(); + void updateConnParams(uint16_t conn_handle, uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout); + int disconnect(uint16_t connId, uint8_t reason = BLE_ERR_REM_USER_CONN_TERM); +#endif + private: - BLEServer(); friend class BLEService; friend class BLECharacteristic; friend class BLEDevice; - esp_ble_adv_data_t m_adv_data; - // BLEAdvertising m_bleAdvertising; + friend class BLESecurity; + friend class BLEAdvertising; + + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + uint16_t m_connId; uint32_t m_connectedCount; - uint16_t m_gatts_if; + bool m_gattsStarted; std::map m_connectedServersMap; - FreeRTOS::Semaphore m_semaphoreRegisterAppEvt = FreeRTOS::Semaphore("RegisterAppEvt"); FreeRTOS::Semaphore m_semaphoreCreateEvt = FreeRTOS::Semaphore("CreateEvt"); FreeRTOS::Semaphore m_semaphoreOpenEvt = FreeRTOS::Semaphore("OpenEvt"); BLEServiceMap m_serviceMap; BLEServerCallbacks *m_pServerCallbacks = nullptr; + /*************************************************************************** + * Bluedroid private properties * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + uint16_t m_gatts_if; + esp_ble_adv_data_t m_adv_data; +#endif + + /*************************************************************************** + * NimBLE private properties * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + bool m_svcChanged; + uint16_t m_indWait[CONFIG_BT_NIMBLE_MAX_CONNECTIONS]; + std::vector m_notifyChrVec; + ble_hs_adv_fields m_adv_data; +#endif + + /*************************************************************************** + * Common private declarations * + ***************************************************************************/ + + BLEServer(); void createApp(uint16_t appId); + + /*************************************************************************** + * Bluedroid private declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) uint16_t getGattsIf(); - void handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); void registerApp(uint16_t); + void handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); +#endif + + /*************************************************************************** + * NimBLE private declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + void serviceChanged(); + void resetGATT(); + bool setIndicateWait(uint16_t conn_handle); + void clearIndicateWait(uint16_t conn_handle); + static int handleGATTServerEvent(struct ble_gap_event *event, void *arg); +#endif }; // BLEServer /** @@ -115,37 +235,38 @@ class BLEServer { */ class BLEServerCallbacks { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + virtual ~BLEServerCallbacks(){}; - /** - * @brief Handle a new client connection. - * - * When a new client connects, we are invoked. - * - * @param [in] pServer A reference to the %BLE server that received the client connection. - */ virtual void onConnect(BLEServer *pServer); - virtual void onConnect(BLEServer *pServer, esp_ble_gatts_cb_param_t *param); - /** - * @brief Handle an existing client disconnection. - * - * When an existing client disconnects, we are invoked. - * - * @param [in] pServer A reference to the %BLE server that received the existing client disconnection. - */ virtual void onDisconnect(BLEServer *pServer); - virtual void onDisconnect(BLEServer *pServer, esp_ble_gatts_cb_param_t *param); - /** - * @brief Handle a new client connection. - * - * When the MTU changes this method is invoked. - * - * @param [in] pServer A reference to the %BLE server that received the client connection. - * @param [in] param A reference to esp_ble_gatts_cb_param_t. - */ + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + virtual void onConnect(BLEServer *pServer, esp_ble_gatts_cb_param_t *param); + virtual void onDisconnect(BLEServer *pServer, esp_ble_gatts_cb_param_t *param); virtual void onMtuChanged(BLEServer *pServer, esp_ble_gatts_cb_param_t *param); +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + virtual void onConnect(BLEServer *pServer, ble_gap_conn_desc *desc); + virtual void onDisconnect(BLEServer *pServer, ble_gap_conn_desc *desc); + virtual void onMtuChanged(BLEServer *pServer, ble_gap_conn_desc *desc, uint16_t mtu); + virtual uint32_t onPassKeyRequest(); + virtual void onAuthenticationComplete(ble_gap_conn_desc *desc); + virtual bool onConfirmPIN(uint32_t pin); +#endif }; // BLEServerCallbacks -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLESERVER_H_ */ diff --git a/libraries/BLE/src/BLEService.cpp b/libraries/BLE/src/BLEService.cpp index 58c5d4eb9c3..60449719b6a 100644 --- a/libraries/BLE/src/BLEService.cpp +++ b/libraries/BLE/src/BLEService.cpp @@ -3,6 +3,10 @@ * * Created on: Mar 25, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ // A service is identified by a UUID. A service is also the container for one or more characteristics. @@ -11,10 +15,13 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) -#include -#include +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) +/***************************************************************************** + * Common includes * + *****************************************************************************/ + +#include #include #include #include @@ -25,8 +32,24 @@ #include "GeneralUtils.h" #include "esp32-hal-log.h" +/***************************************************************************** + * Bluedroid includes * + *****************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#endif + +/***************************************************************************** + * Common definitions * + *****************************************************************************/ + #define NULL_HANDLE (0xffff) +/***************************************************************************** + * Common functions * + *****************************************************************************/ + /** * @brief Construct an instance of the BLEService * @param [in] uuid The UUID of the service. @@ -44,10 +67,32 @@ BLEService::BLEService(BLEUUID uuid, uint16_t numHandles) { m_handle = NULL_HANDLE; m_pServer = nullptr; //m_serializeMutex.setName("BLEService"); - m_lastCreatedCharacteristic = nullptr; m_numHandles = numHandles; +#ifdef CONFIG_BLUEDROID_ENABLED + m_lastCreatedCharacteristic = nullptr; +#endif +#if defined(CONFIG_NIMBLE_ENABLED) + m_pSvcDef = nullptr; +#endif } // BLEService +BLEService::~BLEService() { +#if defined(CONFIG_NIMBLE_ENABLED) + if (m_pSvcDef != nullptr) { + if (m_pSvcDef->characteristics != nullptr) { + for (int i = 0; m_pSvcDef->characteristics[i].uuid != NULL; ++i) { + if (m_pSvcDef->characteristics[i].descriptors) { + delete (m_pSvcDef->characteristics[i].descriptors); + } + } + delete (m_pSvcDef->characteristics); + } + + delete (m_pSvcDef); + } +#endif +} + /** * @brief Create the service. * Create the service. @@ -56,8 +101,9 @@ BLEService::BLEService(BLEUUID uuid, uint16_t numHandles) { */ void BLEService::executeCreate(BLEServer *pServer) { - log_v(">> executeCreate() - Creating service (esp_ble_gatts_create_service) service uuid: %s", getUUID().toString().c_str()); + log_v(">> executeCreate() - Creating service with uuid: %s", getUUID().toString().c_str()); m_pServer = pServer; +#if defined(CONFIG_BLUEDROID_ENABLED) m_semaphoreCreateEvt.take("executeCreate"); // Take the mutex and release at event ESP_GATTS_CREATE_EVT esp_gatt_srvc_id_t srvc_id; @@ -73,6 +119,7 @@ void BLEService::executeCreate(BLEServer *pServer) { } m_semaphoreCreateEvt.wait("executeCreate"); +#endif log_v("<< executeCreate"); } // executeCreate @@ -83,6 +130,7 @@ void BLEService::executeCreate(BLEServer *pServer) { */ void BLEService::executeDelete() { +#if defined(CONFIG_BLUEDROID_ENABLED) log_v(">> executeDelete()"); m_semaphoreDeleteEvt.take("executeDelete"); // Take the mutex and release at event ESP_GATTS_DELETE_EVT @@ -95,6 +143,11 @@ void BLEService::executeDelete() { m_semaphoreDeleteEvt.wait("executeDelete"); log_v("<< executeDelete"); +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) && CONFIG_BT_NIMBLE_DYNAMIC_SERVICE + ble_gatts_delete_svc(&m_uuid.getNative()->u); +#endif } // executeDelete /** @@ -114,49 +167,11 @@ BLEUUID BLEService::getUUID() { return m_uuid; } // getUUID -/** - * @brief Start the service. - * Here we wish to start the service which means that we will respond to partner requests about it. - * Starting a service also means that we can create the corresponding characteristics. - * @return Start the service. - */ -void BLEService::start() { - // We ask the BLE runtime to start the service and then create each of the characteristics. - // We start the service through its local handle which was returned in the ESP_GATTS_CREATE_EVT event - // obtained as a result of calling esp_ble_gatts_create_service(). - // - log_v(">> start(): Starting service (esp_ble_gatts_start_service): %s", toString().c_str()); - if (m_handle == NULL_HANDLE) { - log_e("<< !!! We attempted to start a service but don't know its handle!"); - return; - } - - BLECharacteristic *pCharacteristic = m_characteristicMap.getFirst(); - - while (pCharacteristic != nullptr) { - m_lastCreatedCharacteristic = pCharacteristic; - pCharacteristic->executeCreate(this); - - pCharacteristic = m_characteristicMap.getNext(); - } - // Start each of the characteristics ... these are found in the m_characteristicMap. - - m_semaphoreStartEvt.take("start"); - esp_err_t errRc = ::esp_ble_gatts_start_service(m_handle); - - if (errRc != ESP_OK) { - log_e("<< esp_ble_gatts_start_service: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); - return; - } - m_semaphoreStartEvt.wait("start"); - - log_v("<< start()"); -} // start - /** * @brief Stop the service. */ void BLEService::stop() { +#if defined(CONFIG_BLUEDROID_ENABLED) // We ask the BLE runtime to start the service and then create each of the characteristics. // We start the service through its local handle which was returned in the ESP_GATTS_CREATE_EVT event // obtained as a result of calling esp_ble_gatts_create_service(). @@ -176,13 +191,19 @@ void BLEService::stop() { m_semaphoreStopEvt.wait("stop"); log_v("<< stop()"); -} // start +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + log_w("NimBLE does not support stopping a service. Ignoring request."); +#endif +} // stop /** * @brief Set the handle associated with this service. * @param [in] handle The handle associated with the service. */ void BLEService::setHandle(uint16_t handle) { +#if defined(CONFIG_BLUEDROID_ENABLED) log_v(">> setHandle - Handle=0x%.2x, service UUID=%s)", handle, getUUID().toString().c_str()); if (m_handle != NULL_HANDLE) { log_e("!!! Handle is already set %.2x", m_handle); @@ -190,6 +211,11 @@ void BLEService::setHandle(uint16_t handle) { } m_handle = handle; log_v("<< setHandle"); +#endif + +#if defined(CONFIG_NIMBLE_ENABLED) + log_w("NimBLE does not support manually setting the handle of a service. Ignoring request."); +#endif } // setHandle /** @@ -213,14 +239,25 @@ void BLEService::addCharacteristic(BLECharacteristic *pCharacteristic) { log_d("Adding characteristic: uuid=%s to service: %s", pCharacteristic->getUUID().toString().c_str(), toString().c_str()); // Check that we don't add the same characteristic twice. - if (m_characteristicMap.getByUUID(pCharacteristic->getUUID()) != nullptr) { + BLECharacteristic *pExisting = m_characteristicMap.getByUUID(pCharacteristic->getUUID()); + if (pExisting != nullptr) { log_w("<< Adding a new characteristic with the same UUID as a previous one"); - //return; } - // Remember this characteristic in our map of characteristics. At this point, we can lookup by UUID - // but not by handle. The handle is allocated to us on the ESP_GATTS_ADD_CHAR_EVT. - m_characteristicMap.setByUUID(pCharacteristic, pCharacteristic->getUUID()); +#if defined(CONFIG_NIMBLE_ENABLED) + if (pExisting != nullptr) { + pExisting->m_removed = 0; + } else +#endif + { + // Remember this characteristic in our map of characteristics. At this point, we can lookup by UUID + // but not by handle. The handle is allocated to us on the ESP_GATTS_ADD_CHAR_EVT. + m_characteristicMap.setByUUID(pCharacteristic, pCharacteristic->getUUID()); + } + +#if defined(CONFIG_NIMBLE_ENABLED) + getServer()->serviceChanged(); +#endif log_v("<< addCharacteristic()"); } // addCharacteristic @@ -247,6 +284,54 @@ BLECharacteristic *BLEService::createCharacteristic(BLEUUID uuid, uint32_t prope return pCharacteristic; } // createCharacteristic +BLECharacteristic *BLEService::getCharacteristic(const char *uuid) { + return getCharacteristic(BLEUUID(uuid)); +} + +BLECharacteristic *BLEService::getCharacteristic(BLEUUID uuid) { + return m_characteristicMap.getByUUID(uuid); +} + +/** + * @brief Return a string representation of this service. + * A service is defined by: + * * Its UUID + * * Its handle + * @return A string representation of this service. + */ +String BLEService::toString() { + String res = "UUID: " + getUUID().toString(); + char hex[5]; + snprintf(hex, sizeof(hex), "%04x", getHandle()); + res += ", handle: 0x"; + res += hex; + return res; +} // toString + +/** + * @brief Get the BLE server associated with this service. + * @return The BLEServer associated with this service. + */ +BLEServer *BLEService::getServer() { + return m_pServer; +} // getServer + +/***************************************************************************** + * Bluedroid functions * + *****************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +/** + * @brief Get the last created characteristic. + * It is lamentable that this function has to exist. It returns the last created characteristic. + * We need this because the descriptor API is built around the notion that a new descriptor, when created, + * is associated with the last characteristics created and we need that information. + * @return The last created characteristic. + */ +BLECharacteristic *BLEService::getLastCreatedCharacteristic() { + return m_lastCreatedCharacteristic; +} // getLastCreatedCharacteristic + /** * @brief Handle a GATTS server event. */ @@ -347,48 +432,222 @@ void BLEService::handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t m_characteristicMap.handleGATTServerEvent(event, gatts_if, param); } // handleGATTServerEvent -BLECharacteristic *BLEService::getCharacteristic(const char *uuid) { - return getCharacteristic(BLEUUID(uuid)); -} - -BLECharacteristic *BLEService::getCharacteristic(BLEUUID uuid) { - return m_characteristicMap.getByUUID(uuid); -} - /** - * @brief Return a string representation of this service. - * A service is defined by: - * * Its UUID - * * Its handle - * @return A string representation of this service. + * @brief Start the service. + * Here we wish to start the service which means that we will respond to partner requests about it. + * Starting a service also means that we can create the corresponding characteristics. + * @return Start the service. */ -String BLEService::toString() { - String res = "UUID: " + getUUID().toString(); - char hex[5]; - snprintf(hex, sizeof(hex), "%04x", getHandle()); - res += ", handle: 0x"; - res += hex; - return res; -} // toString +bool BLEService::start() { + // We ask the BLE runtime to start the service and then create each of the characteristics. + // We start the service through its local handle which was returned in the ESP_GATTS_CREATE_EVT event + // obtained as a result of calling esp_ble_gatts_create_service(). + // + log_v(">> start(): Starting service (esp_ble_gatts_start_service): %s", toString().c_str()); + if (m_handle == NULL_HANDLE) { + log_e("<< !!! We attempted to start a service but don't know its handle!"); + return false; + } + + BLECharacteristic *pCharacteristic = m_characteristicMap.getFirst(); + + while (pCharacteristic != nullptr) { + m_lastCreatedCharacteristic = pCharacteristic; + pCharacteristic->executeCreate(this); + + pCharacteristic = m_characteristicMap.getNext(); + } + // Start each of the characteristics ... these are found in the m_characteristicMap. + + m_semaphoreStartEvt.take("start"); + esp_err_t errRc = ::esp_ble_gatts_start_service(m_handle); + + if (errRc != ESP_OK) { + log_e("<< esp_ble_gatts_start_service: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); + return false; + } + m_semaphoreStartEvt.wait("start"); + + log_v("<< start()"); + return true; +} // start + +#endif // CONFIG_BLUEDROID_ENABLED + +/***************************************************************************** + * NimBLE functions * + *****************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) /** - * @brief Get the last created characteristic. - * It is lamentable that this function has to exist. It returns the last created characteristic. - * We need this because the descriptor API is built around the notion that a new descriptor, when created, - * is associated with the last characteristics created and we need that information. - * @return The last created characteristic. + * @brief Remove a characteristic from the service. Check if the characteristic was already removed and if so, check if this + * is being called to delete the object and do so if requested. Otherwise, ignore the call and return. + * @param [in] pCharacteristic - The characteristic to remove. + * @param [in] deleteChr - If true, delete the characteristic. */ -BLECharacteristic *BLEService::getLastCreatedCharacteristic() { - return m_lastCreatedCharacteristic; -} // getLastCreatedCharacteristic +void BLEService::removeCharacteristic(BLECharacteristic *pCharacteristic, bool deleteChr) { + if (pCharacteristic->m_removed > 0) { + if (deleteChr) { + BLECharacteristic *pExisting = m_characteristicMap.getByUUID(pCharacteristic->getUUID()); + if (pExisting != nullptr) { + m_characteristicMap.removeCharacteristic(pExisting); + delete pExisting; + } + } + + return; + } + + pCharacteristic->m_removed = deleteChr ? NIMBLE_ATT_REMOVE_DELETE : NIMBLE_ATT_REMOVE_HIDE; + getServer()->serviceChanged(); +} /** - * @brief Get the BLE server associated with this service. - * @return The BLEServer associated with this service. + * @brief Builds the database of characteristics/descriptors for the service + * and registers it with the NimBLE stack. + * @return bool success/failure . */ -BLEServer *BLEService::getServer() { - return m_pServer; -} // getServer +bool BLEService::start() { + log_d(">> start(): Starting service: %s", toString().c_str()); + + // Rebuild the service definition if the server attributes have changed. + if (getServer()->m_svcChanged && m_pSvcDef != nullptr) { + if (m_pSvcDef[0].characteristics) { + if (m_pSvcDef[0].characteristics[0].descriptors) { + delete (m_pSvcDef[0].characteristics[0].descriptors); + } + delete (m_pSvcDef[0].characteristics); + } + delete (m_pSvcDef); + m_pSvcDef = nullptr; + } + + if (m_pSvcDef == nullptr) { + // Nimble requires an array of services to be sent to the api + // Since we are adding 1 at a time we create an array of 2 and set the type + // of the second service to 0 to indicate the end of the array. + ble_gatt_svc_def *svc = new ble_gatt_svc_def[2]{}; + ble_gatt_chr_def *pChr_a = nullptr; + ble_gatt_dsc_def *pDsc_a = nullptr; + + svc[0].type = BLE_GATT_SVC_TYPE_PRIMARY; + svc[0].uuid = (const ble_uuid_t *)&(m_uuid.getNative()->u); + svc[0].includes = nullptr; + + int removedCount = 0; + BLECharacteristic *pCharacteristic; + + pCharacteristic = m_characteristicMap.getFirst(); + while (pCharacteristic != nullptr) { + if (pCharacteristic->m_removed > 0) { + if (pCharacteristic->m_removed == NIMBLE_ATT_REMOVE_DELETE) { + m_characteristicMap.removeCharacteristic(pCharacteristic); + delete pCharacteristic; + } else { + ++removedCount; + } + } else { + pCharacteristic->executeCreate(this); + } + + pCharacteristic = m_characteristicMap.getNext(); + } + + size_t numChrs = m_characteristicMap.getRegisteredCharacteristicCount() - removedCount; + log_d("Adding %d characteristics for service %s", numChrs, toString().c_str()); + + if (!numChrs) { + svc[0].characteristics = nullptr; + } else { + // Nimble requires the last characteristic to have it's uuid = 0 to indicate the end + // of the characteristics for the service. We create 1 extra and set it to null + // for this purpose. + pChr_a = new ble_gatt_chr_def[numChrs + 1]{}; + uint8_t i = 0; + pCharacteristic = m_characteristicMap.getFirst(); + while (pCharacteristic != nullptr) { + if (pCharacteristic->m_removed <= 0) { + removedCount = 0; + BLEDescriptor *pDescriptor; + + pDescriptor = pCharacteristic->m_descriptorMap.getFirst(); + while (pDescriptor != nullptr) { + if (pDescriptor->m_removed > 0) { + if (pDescriptor->m_removed == NIMBLE_ATT_REMOVE_DELETE) { + pCharacteristic->m_descriptorMap.removeDescriptor(pDescriptor); + delete pDescriptor; + } else { + ++removedCount; + } + } + pDescriptor = pCharacteristic->m_descriptorMap.getNext(); + } + + size_t numDscs = pCharacteristic->m_descriptorMap.getRegisteredDescriptorCount() - removedCount; + log_d("Adding %d descriptors for characteristic %s", numDscs, pCharacteristic->getUUID().toString().c_str()); + + if (!numDscs) { + pChr_a[i].descriptors = nullptr; + } else { + // Must have last descriptor uuid = 0 so we have to create 1 extra + pDsc_a = new ble_gatt_dsc_def[numDscs + 1]{}; + uint8_t d = 0; + pDescriptor = pCharacteristic->m_descriptorMap.getFirst(); + while (pDescriptor != nullptr) { + if (pDescriptor->m_removed <= 0) { + pDsc_a[d].uuid = (const ble_uuid_t *)&(pDescriptor->m_bleUUID.getNative()->u); + pDsc_a[d].att_flags = pDescriptor->m_permissions; + pDsc_a[d].min_key_size = 0; + pDsc_a[d].access_cb = BLEDescriptor::handleGATTServerEvent; + pDsc_a[d].arg = pDescriptor; + ++d; + } + pDescriptor = pCharacteristic->m_descriptorMap.getNext(); + } + + pDsc_a[numDscs].uuid = nullptr; + pChr_a[i].descriptors = pDsc_a; + } + + pChr_a[i].uuid = (const ble_uuid_t *)&(pCharacteristic->m_bleUUID.getNative()->u); + pChr_a[i].access_cb = BLECharacteristic::handleGATTServerEvent; + pChr_a[i].arg = pCharacteristic; + pChr_a[i].flags = pCharacteristic->m_properties; + pChr_a[i].min_key_size = 0; + pChr_a[i].val_handle = &pCharacteristic->m_handle; + ++i; + } + + pCharacteristic = m_characteristicMap.getNext(); + } + + pChr_a[numChrs].uuid = nullptr; + svc[0].characteristics = pChr_a; + } + + // end of services must indicate to api with type = 0 + svc[1].type = 0; + m_pSvcDef = svc; + } + + int rc = ble_gatts_count_cfg((const ble_gatt_svc_def *)m_pSvcDef); + if (rc != 0) { + log_e("ble_gatts_count_cfg failed, rc= %d, %s", rc, BLEUtils::returnCodeToString(rc)); + return false; + } + + rc = ble_gatts_add_svcs((const ble_gatt_svc_def *)m_pSvcDef); + if (rc != 0) { + log_e("ble_gatts_add_svcs, rc= %d, %s", rc, BLEUtils::returnCodeToString(rc)); + return false; + } + + log_d("<< start()"); + return true; +} // start + +#endif -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEService.h b/libraries/BLE/src/BLEService.h index 61f867b2a02..67088b60310 100644 --- a/libraries/BLE/src/BLEService.h +++ b/libraries/BLE/src/BLEService.h @@ -3,6 +3,10 @@ * * Created on: Mar 25, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLESERVICE_H_ @@ -11,15 +15,38 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) -#include +/***************************************************************************** + * Common includes * + *****************************************************************************/ #include "BLECharacteristic.h" #include "BLEServer.h" #include "BLEUUID.h" +#include "BLEUtils.h" #include "RTOS.h" +/***************************************************************************** + * Bluedroid includes * + *****************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#endif + +/***************************************************************************** + * NimBLE includes * + *****************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#endif + +/***************************************************************************** + * Forward declarations * + *****************************************************************************/ + class BLEServer; /** @@ -27,6 +54,10 @@ class BLEServer; */ class BLECharacteristicMap { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + void setByUUID(BLECharacteristic *pCharacteristic, const char *uuid); void setByUUID(BLECharacteristic *pCharacteristic, BLEUUID uuid); void setByHandle(uint16_t handle, BLECharacteristic *pCharacteristic); @@ -36,9 +67,30 @@ class BLECharacteristicMap { BLECharacteristic *getFirst(); BLECharacteristic *getNext(); String toString(); + int getRegisteredCharacteristicCount(); + void removeCharacteristic(BLECharacteristic *characteristic); + + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) void handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + void handleGATTServerEvent(uint16_t conn_handle, uint16_t attr_handle, ble_gatt_access_ctxt *ctxt, void *arg); +#endif private: + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + std::map m_uuidMap; std::map m_handleMap; std::map::iterator m_iterator; @@ -46,10 +98,19 @@ class BLECharacteristicMap { /** * @brief The model of a %BLE service. - * */ class BLEService { public: + /*************************************************************************** + * Common properties * + ***************************************************************************/ + + uint8_t m_instId = 0; + + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + void addCharacteristic(BLECharacteristic *pCharacteristic); BLECharacteristic *createCharacteristic(const char *uuid, uint32_t properties); BLECharacteristic *createCharacteristic(BLEUUID uuid, uint32_t properties); @@ -60,40 +121,81 @@ class BLEService { BLECharacteristic *getCharacteristic(BLEUUID uuid); BLEUUID getUUID(); BLEServer *getServer(); - void start(); + bool start(); void stop(); String toString(); uint16_t getHandle(); - uint8_t m_instId = 0; + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + void removeCharacteristic(BLECharacteristic *pCharacteristic, bool deleteChr = false); +#endif private: - BLEService(const char *uuid, uint16_t numHandles); - BLEService(BLEUUID uuid, uint16_t numHandles); friend class BLEServer; friend class BLEServiceMap; friend class BLEDescriptor; friend class BLECharacteristic; friend class BLEDevice; + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + BLECharacteristicMap m_characteristicMap; uint16_t m_handle; BLECharacteristic *m_lastCreatedCharacteristic = nullptr; BLEServer *m_pServer = nullptr; BLEUUID m_uuid; + FreeRTOS::Semaphore m_semaphoreStartEvt = FreeRTOS::Semaphore("StartEvt"); + uint16_t m_numHandles; + + /*************************************************************************** + * Bluedroid private properties * + ***************************************************************************/ +#if defined(CONFIG_BLUEDROID_ENABLED) FreeRTOS::Semaphore m_semaphoreCreateEvt = FreeRTOS::Semaphore("CreateEvt"); FreeRTOS::Semaphore m_semaphoreDeleteEvt = FreeRTOS::Semaphore("DeleteEvt"); - FreeRTOS::Semaphore m_semaphoreStartEvt = FreeRTOS::Semaphore("StartEvt"); FreeRTOS::Semaphore m_semaphoreStopEvt = FreeRTOS::Semaphore("StopEvt"); +#endif - uint16_t m_numHandles; + /*************************************************************************** + * NimBLE private properties * + ***************************************************************************/ +#if defined(CONFIG_NIMBLE_ENABLED) + uint8_t m_removed; + ble_gatt_svc_def *m_pSvcDef; +#endif + + /*************************************************************************** + * Common private declarations * + ***************************************************************************/ + + BLEService(const char *uuid, uint16_t numHandles); + BLEService(BLEUUID uuid, uint16_t numHandles); + ~BLEService(); + + /*************************************************************************** + * Common private declarations * + ***************************************************************************/ + + void setHandle(uint16_t handle); + + /*************************************************************************** + * Bluedroid private declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) BLECharacteristic *getLastCreatedCharacteristic(); void handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); - void setHandle(uint16_t handle); - //void setService(esp_gatt_srvc_id_t srvc_id); +#endif }; // BLEService -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLESERVICE_H_ */ diff --git a/libraries/BLE/src/BLEServiceMap.cpp b/libraries/BLE/src/BLEServiceMap.cpp index 30a9db499f1..477da5b4cc2 100644 --- a/libraries/BLE/src/BLEServiceMap.cpp +++ b/libraries/BLE/src/BLEServiceMap.cpp @@ -3,16 +3,30 @@ * * Created on: Jun 22, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/***************************************************************************** + * Common includes * + *****************************************************************************/ + #include #include #include "BLEService.h" +/***************************************************************************** + * Common functions * + *****************************************************************************/ + /** * @brief Return the service by UUID. * @param [in] UUID The UUID to look up the service. @@ -82,13 +96,6 @@ String BLEServiceMap::toString() { return res; } // toString -void BLEServiceMap::handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { - // Invoke the handler for every Service we have. - for (auto &myPair : m_uuidMap) { - myPair.first->handleGATTServerEvent(event, gatts_if, param); - } -} - /** * @brief Get the first service in the map. * @return The first service in the map. @@ -130,8 +137,21 @@ void BLEServiceMap::removeService(BLEService *service) { * @return amount of registered services */ int BLEServiceMap::getRegisteredServiceCount() { - return m_handleMap.size(); + return m_uuidMap.size(); +} + +/***************************************************************************** + * Bluedroid functions * + *****************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +void BLEServiceMap::handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { + // Invoke the handler for every Service we have. + for (auto &myPair : m_uuidMap) { + myPair.first->handleGATTServerEvent(event, gatts_if, param); + } } +#endif -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEUUID.cpp b/libraries/BLE/src/BLEUUID.cpp index 8074ea82f8f..d61fb695799 100644 --- a/libraries/BLE/src/BLEUUID.cpp +++ b/libraries/BLE/src/BLEUUID.cpp @@ -3,12 +3,22 @@ * * Created on: Jun 21, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/***************************************************************************** + * Common includes * + *****************************************************************************/ + #include #include #include @@ -18,25 +28,10 @@ #include "BLEUUID.h" #include "esp32-hal-log.h" -/** - * @brief Copy memory from source to target but in reverse order. - * - * When we move memory from one location it is normally: - * - * ``` - * [0][1][2]...[n] -> [0][1][2]...[n] - * ``` - * - * with this function, it is: - * - * ``` - * [0][1][2]...[n] -> [n][n-1][n-2]...[0] - * ``` - * - * @param [in] target The target of the copy - * @param [in] source The source of the copy - * @param [in] size The number of bytes to copy - */ +/***************************************************************************** + * Common functions * + *****************************************************************************/ + static void memrcpy(uint8_t *target, uint8_t *source, uint32_t size) { assert(size > 0); target += (size - 1); // Point target to the last byte of the target data @@ -48,29 +43,15 @@ static void memrcpy(uint8_t *target, uint8_t *source, uint32_t size) { } } // memrcpy -/** - * @brief Create a UUID from a string. - * - * Create a UUID from a string. There will be two possible stories here. Either the string represents - * a binary data field or the string represents a hex encoding of a UUID. - * For the hex encoding, here is an example: - * - * ``` - * "beb5483e-36e1-4688-b7f5-ea07361b26a8" - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - * 12345678-90ab-cdef-1234-567890abcdef - * ``` - * - * This has a length of 36 characters. We need to parse this into 16 bytes. - * - * @param [in] value The string to build a UUID from. - */ +BLEUUID::BLEUUID() { + m_valueSet = false; +} // BLEUUID + BLEUUID::BLEUUID(String value) { - //Serial.printf("BLEUUID constructor from String=\"%s\"\n", value.c_str()); m_valueSet = true; if (value.length() == 4) { - m_uuid.len = ESP_UUID_LEN_16; - m_uuid.uuid.uuid16 = 0; + UUID_LEN(m_uuid) = BLE_UUID_16_BITS; + UUID_VAL_16(m_uuid) = 0; for (int i = 0; i < value.length();) { uint8_t MSB = value.c_str()[i]; uint8_t LSB = value.c_str()[i + 1]; @@ -81,12 +62,12 @@ BLEUUID::BLEUUID(String value) { if (LSB > '9') { LSB -= 7; } - m_uuid.uuid.uuid16 += (((MSB & 0x0F) << 4) | (LSB & 0x0F)) << (2 - i) * 4; + UUID_VAL_16(m_uuid) += (((MSB & 0x0F) << 4) | (LSB & 0x0F)) << (2 - i) * 4; i += 2; } } else if (value.length() == 8) { - m_uuid.len = ESP_UUID_LEN_32; - m_uuid.uuid.uuid32 = 0; + UUID_LEN(m_uuid) = BLE_UUID_32_BITS; + UUID_VAL_32(m_uuid) = 0; for (int i = 0; i < value.length();) { uint8_t MSB = value.c_str()[i]; uint8_t LSB = value.c_str()[i + 1]; @@ -97,18 +78,14 @@ BLEUUID::BLEUUID(String value) { if (LSB > '9') { LSB -= 7; } - m_uuid.uuid.uuid32 += (((MSB & 0x0F) << 4) | (LSB & 0x0F)) << (6 - i) * 4; + UUID_VAL_32(m_uuid) += (((MSB & 0x0F) << 4) | (LSB & 0x0F)) << (6 - i) * 4; i += 2; } - } else if (value.length() - == 16) { // How we can have 16 byte length string representing 128 bit uuid??? needs to be investigated (lack of time) - maybe raw data encoded as String (128b==16B)? - m_uuid.len = ESP_UUID_LEN_128; - memrcpy(m_uuid.uuid.uuid128, (uint8_t *)value.c_str(), 16); + } else if (value.length() == 16) { + UUID_LEN(m_uuid) = BLE_UUID_128_BITS; + memrcpy(UUID_VAL_128(m_uuid), (uint8_t *)value.c_str(), 16); } else if (value.length() == 36) { - //log_d("36 characters:"); - // If the length of the string is 36 bytes then we will assume it is a long hex string in - // UUID format. - m_uuid.len = ESP_UUID_LEN_128; + UUID_LEN(m_uuid) = BLE_UUID_128_BITS; int n = 0; for (int i = 0; i < value.length();) { if (value.c_str()[i] == '-') { @@ -123,7 +100,7 @@ BLEUUID::BLEUUID(String value) { if (LSB > '9') { LSB -= 7; } - m_uuid.uuid.uuid128[15 - n++] = ((MSB & 0x0F) << 4) | (LSB & 0x0F); + UUID_VAL_128(m_uuid)[15 - n++] = ((MSB & 0x0F) << 4) | (LSB & 0x0F); i += 2; } } else { @@ -132,128 +109,73 @@ BLEUUID::BLEUUID(String value) { } } //BLEUUID(String) -/* -BLEUUID::BLEUUID(String value) { - this.BLEUUID(String(value.c_str(), value.length())); -} //BLEUUID(String) -*/ - -/** - * @brief Create a UUID from 16 bytes of memory. - * - * @param [in] pData The pointer to the start of the UUID. - * @param [in] size The size of the data. - * @param [in] msbFirst Is the MSB first in pData memory? - */ BLEUUID::BLEUUID(uint8_t *pData, size_t size, bool msbFirst) { if (size != 16) { log_e("ERROR: UUID length not 16 bytes"); return; } - m_uuid.len = ESP_UUID_LEN_128; + UUID_LEN(m_uuid) = BLE_UUID_128_BITS; if (msbFirst) { - memrcpy(m_uuid.uuid.uuid128, pData, 16); + memrcpy(UUID_VAL_128(m_uuid), pData, 16); } else { - memcpy(m_uuid.uuid.uuid128, pData, 16); + memcpy(UUID_VAL_128(m_uuid), pData, 16); } m_valueSet = true; } // BLEUUID -/** - * @brief Create a UUID from the 16bit value. - * - * @param [in] uuid The 16bit short form UUID. - */ BLEUUID::BLEUUID(uint16_t uuid) { - m_uuid.len = ESP_UUID_LEN_16; - m_uuid.uuid.uuid16 = uuid; + UUID_LEN(m_uuid) = BLE_UUID_16_BITS; + UUID_VAL_16(m_uuid) = uuid; m_valueSet = true; } // BLEUUID -/** - * @brief Create a UUID from the 32bit value. - * - * @param [in] uuid The 32bit short form UUID. - */ BLEUUID::BLEUUID(uint32_t uuid) { - m_uuid.len = ESP_UUID_LEN_32; - m_uuid.uuid.uuid32 = uuid; + UUID_LEN(m_uuid) = BLE_UUID_32_BITS; + UUID_VAL_32(m_uuid) = uuid; m_valueSet = true; } // BLEUUID -/** - * @brief Create a UUID from the native UUID. - * - * @param [in] uuid The native UUID. - */ -BLEUUID::BLEUUID(esp_bt_uuid_t uuid) { - m_uuid = uuid; +BLEUUID::BLEUUID(uint32_t first, uint16_t second, uint16_t third, uint64_t fourth) { + UUID_LEN(m_uuid) = BLE_UUID_128_BITS; + memcpy(UUID_VAL_128(m_uuid) + 12, &first, 4); + memcpy(UUID_VAL_128(m_uuid) + 10, &second, 2); + memcpy(UUID_VAL_128(m_uuid) + 8, &third, 2); + memcpy(UUID_VAL_128(m_uuid), &fourth, 8); m_valueSet = true; -} // BLEUUID - -/** - * @brief Create a UUID from the ESP32 esp_gat_id_t. - * - * @param [in] gattId The data to create the UUID from. - */ -BLEUUID::BLEUUID(esp_gatt_id_t gattId) : BLEUUID(gattId.uuid) {} // BLEUUID - -BLEUUID::BLEUUID() { - m_valueSet = false; -} // BLEUUID +} -/** - * @brief Get the number of bits in this uuid. - * @return The number of bits in the UUID. One of 16, 32 or 128. - */ uint8_t BLEUUID::bitSize() { if (!m_valueSet) { return 0; } - switch (m_uuid.len) { - case ESP_UUID_LEN_16: return 16; - case ESP_UUID_LEN_32: return 32; - case ESP_UUID_LEN_128: return 128; - default: log_e("Unknown UUID length: %d", m_uuid.len); return 0; + switch (UUID_LEN(m_uuid)) { + case BLE_UUID_16_BITS: return 16; + case BLE_UUID_32_BITS: return 32; + case BLE_UUID_128_BITS: return 128; + default: log_e("Unknown UUID length: %d", UUID_LEN(m_uuid)); return 0; } // End of switch } // bitSize -/** - * @brief Compare a UUID against this UUID. - * - * @param [in] uuid The UUID to compare against. - * @return True if the UUIDs are equal and false otherwise. - */ -bool BLEUUID::equals(BLEUUID uuid) { - //log_d("Comparing: %s to %s", toString().c_str(), uuid.toString().c_str()); +bool BLEUUID::equals(const BLEUUID &uuid) const { if (!m_valueSet || !uuid.m_valueSet) { return false; } - if (uuid.m_uuid.len != m_uuid.len) { + if (UUID_LEN(uuid.m_uuid) != UUID_LEN(m_uuid)) { return uuid.toString() == toString(); } - if (uuid.m_uuid.len == ESP_UUID_LEN_16) { - return uuid.m_uuid.uuid.uuid16 == m_uuid.uuid.uuid16; + if (UUID_LEN(uuid.m_uuid) == BLE_UUID_16_BITS) { + return UUID_VAL_16(uuid.m_uuid) == UUID_VAL_16(m_uuid); } - if (uuid.m_uuid.len == ESP_UUID_LEN_32) { - return uuid.m_uuid.uuid.uuid32 == m_uuid.uuid.uuid32; + if (UUID_LEN(uuid.m_uuid) == BLE_UUID_32_BITS) { + return UUID_VAL_32(uuid.m_uuid) == UUID_VAL_32(m_uuid); } - return memcmp(uuid.m_uuid.uuid.uuid128, m_uuid.uuid.uuid128, 16) == 0; + return memcmp(UUID_VAL_128(uuid.m_uuid), UUID_VAL_128(m_uuid), 16) == 0; } // equals -/** - * Create a BLEUUID from a string of the form: - * 0xNNNN - * 0xNNNNNNNN - * 0x - * NNNN - * NNNNNNNN - * - */ BLEUUID BLEUUID::fromString(String _uuid) { uint8_t start = 0; if (strstr(_uuid.c_str(), "0x") != nullptr) { // If the string starts with 0x, skip those characters. @@ -273,117 +195,142 @@ BLEUUID BLEUUID::fromString(String _uuid) { return BLEUUID(); } // fromString -/** - * @brief Get the native UUID value. - * - * @return The native UUID value or NULL if not set. - */ -esp_bt_uuid_t *BLEUUID::getNative() { - //log_d(">> getNative()") - if (m_valueSet == false) { - log_v("<< Return of un-initialized UUID!"); - return nullptr; - } - //log_d("<< getNative()"); - return &m_uuid; -} // getNative - -/** - * @brief Convert a UUID to its 128 bit representation. - * - * A UUID can be internally represented as 16bit, 32bit or the full 128bit. This method - * will convert 16 or 32 bit representations to the full 128bit. - */ BLEUUID BLEUUID::to128() { - //log_v(">> toFull() - %s", toString().c_str()); - - // If we either don't have a value or are already a 128 bit UUID, nothing further to do. - if (!m_valueSet || m_uuid.len == ESP_UUID_LEN_128) { + if (!m_valueSet || UUID_LEN(m_uuid) == BLE_UUID_128_BITS) { return *this; } - // If we are 16 bit or 32 bit, then set the 4 bytes of the variable part of the UUID. - if (m_uuid.len == ESP_UUID_LEN_16) { - uint16_t temp = m_uuid.uuid.uuid16; - m_uuid.uuid.uuid128[15] = 0; - m_uuid.uuid.uuid128[14] = 0; - m_uuid.uuid.uuid128[13] = (temp >> 8) & 0xff; - m_uuid.uuid.uuid128[12] = temp & 0xff; - - } else if (m_uuid.len == ESP_UUID_LEN_32) { - uint32_t temp = m_uuid.uuid.uuid32; - m_uuid.uuid.uuid128[15] = (temp >> 24) & 0xff; - m_uuid.uuid.uuid128[14] = (temp >> 16) & 0xff; - m_uuid.uuid.uuid128[13] = (temp >> 8) & 0xff; - m_uuid.uuid.uuid128[12] = temp & 0xff; + if (UUID_LEN(m_uuid) == BLE_UUID_16_BITS) { + uint16_t temp = UUID_VAL_16(m_uuid); + UUID_VAL_128(m_uuid)[15] = 0; + UUID_VAL_128(m_uuid)[14] = 0; + UUID_VAL_128(m_uuid)[13] = (temp >> 8) & 0xff; + UUID_VAL_128(m_uuid)[12] = temp & 0xff; + } else if (UUID_LEN(m_uuid) == BLE_UUID_32_BITS) { + uint16_t temp = UUID_VAL_32(m_uuid); + UUID_VAL_128(m_uuid)[15] = (temp >> 24) & 0xff; + UUID_VAL_128(m_uuid)[14] = (temp >> 16) & 0xff; + UUID_VAL_128(m_uuid)[13] = (temp >> 8) & 0xff; + UUID_VAL_128(m_uuid)[12] = temp & 0xff; } - // Set the fixed parts of the UUID. - m_uuid.uuid.uuid128[11] = 0x00; - m_uuid.uuid.uuid128[10] = 0x00; - - m_uuid.uuid.uuid128[9] = 0x10; - m_uuid.uuid.uuid128[8] = 0x00; + UUID_VAL_128(m_uuid)[11] = 0x00; + UUID_VAL_128(m_uuid)[10] = 0x00; + UUID_VAL_128(m_uuid)[9] = 0x10; + UUID_VAL_128(m_uuid)[8] = 0x00; + UUID_VAL_128(m_uuid)[7] = 0x80; + UUID_VAL_128(m_uuid)[6] = 0x00; + UUID_VAL_128(m_uuid)[5] = 0x00; + UUID_VAL_128(m_uuid)[4] = 0x80; + UUID_VAL_128(m_uuid)[3] = 0x5f; + UUID_VAL_128(m_uuid)[2] = 0x9b; + UUID_VAL_128(m_uuid)[1] = 0x34; + UUID_VAL_128(m_uuid)[0] = 0xfb; + + UUID_LEN(m_uuid) = BLE_UUID_128_BITS; + return *this; +} // to128 - m_uuid.uuid.uuid128[7] = 0x80; - m_uuid.uuid.uuid128[6] = 0x00; +BLEUUID BLEUUID::to16() { + if (!m_valueSet || UUID_LEN(m_uuid) == BLE_UUID_16_BITS) { + return *this; + } - m_uuid.uuid.uuid128[5] = 0x00; - m_uuid.uuid.uuid128[4] = 0x80; - m_uuid.uuid.uuid128[3] = 0x5f; - m_uuid.uuid.uuid128[2] = 0x9b; - m_uuid.uuid.uuid128[1] = 0x34; - m_uuid.uuid.uuid128[0] = 0xfb; + if (UUID_LEN(m_uuid) == BLE_UUID_128_BITS) { + uint8_t base128[] = {0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00}; + if (memcmp(UUID_VAL_128(m_uuid), base128, sizeof(base128)) == 0) { + *this = BLEUUID(*(uint16_t *)(UUID_VAL_128(m_uuid) + 12)); + } + } - m_uuid.len = ESP_UUID_LEN_128; - //log_d("<< toFull <- %s", toString().c_str()); return *this; -} // to128 +} -/** - * @brief Get a string representation of the UUID. - * - * The format of a string is: - * 01234567 8901 2345 6789 012345678901 - * 0000180d-0000-1000-8000-00805f9b34fb - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - * - * @return A string representation of the UUID. - */ -String BLEUUID::toString() { +String BLEUUID::toString() const { if (!m_valueSet) { return ""; // If we have no value, nothing to format. } - // If the UUIDs are 16 or 32 bit, pad correctly. - if (m_uuid.len == ESP_UUID_LEN_16) { // If the UUID is 16bit, pad correctly. + if (UUID_LEN(m_uuid) == BLE_UUID_16_BITS) { // If the UUID is 16bit, pad correctly. char hex[9]; - snprintf(hex, sizeof(hex), "%08x", m_uuid.uuid.uuid16); + snprintf(hex, sizeof(hex), "%08x", UUID_VAL_16(m_uuid)); return String(hex) + "-0000-1000-8000-00805f9b34fb"; } // End 16bit UUID - if (m_uuid.len == ESP_UUID_LEN_32) { // If the UUID is 32bit, pad correctly. + if (UUID_LEN(m_uuid) == BLE_UUID_32_BITS) { // If the UUID is 32bit, pad correctly. char hex[9]; - snprintf(hex, sizeof(hex), "%08lx", m_uuid.uuid.uuid32); + snprintf(hex, sizeof(hex), "%08lx", UUID_VAL_32(m_uuid)); return String(hex) + "-0000-1000-8000-00805f9b34fb"; } // End 32bit UUID // The UUID is not 16bit or 32bit which means that it is 128bit. - // - // UUID string format: - // AABBCCDD-EEFF-GGHH-IIJJ-KKLLMMNNOOPP auto size = 37; // 32 for UUID data, 4 for '-' delimiters and one for a terminator == 37 chars char *hex = (char *)malloc(size); snprintf( - hex, size, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", m_uuid.uuid.uuid128[15], m_uuid.uuid.uuid128[14], - m_uuid.uuid.uuid128[13], m_uuid.uuid.uuid128[12], m_uuid.uuid.uuid128[11], m_uuid.uuid.uuid128[10], m_uuid.uuid.uuid128[9], m_uuid.uuid.uuid128[8], - m_uuid.uuid.uuid128[7], m_uuid.uuid.uuid128[6], m_uuid.uuid.uuid128[5], m_uuid.uuid.uuid128[4], m_uuid.uuid.uuid128[3], m_uuid.uuid.uuid128[2], - m_uuid.uuid.uuid128[1], m_uuid.uuid.uuid128[0] + hex, size, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", UUID_VAL_128(m_uuid)[15], UUID_VAL_128(m_uuid)[14], + UUID_VAL_128(m_uuid)[13], UUID_VAL_128(m_uuid)[12], UUID_VAL_128(m_uuid)[11], UUID_VAL_128(m_uuid)[10], UUID_VAL_128(m_uuid)[9], UUID_VAL_128(m_uuid)[8], + UUID_VAL_128(m_uuid)[7], UUID_VAL_128(m_uuid)[6], UUID_VAL_128(m_uuid)[5], UUID_VAL_128(m_uuid)[4], UUID_VAL_128(m_uuid)[3], UUID_VAL_128(m_uuid)[2], + UUID_VAL_128(m_uuid)[1], UUID_VAL_128(m_uuid)[0] ); + String res(hex); free(hex); return res; } // toString -#endif /* CONFIG_BLUEDROID_ENABLED */ +bool BLEUUID::operator==(const BLEUUID &rhs) const { + return equals(rhs); +} + +bool BLEUUID::operator!=(const BLEUUID &rhs) const { + return !equals(rhs); +} + +/***************************************************************************** + * Bluedroid functions * + *****************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +BLEUUID::BLEUUID(esp_bt_uuid_t uuid) { + m_uuid = uuid; + m_valueSet = true; +} // BLEUUID + +BLEUUID::BLEUUID(esp_gatt_id_t gattId) : BLEUUID(gattId.uuid) {} // BLEUUID + +esp_bt_uuid_t *BLEUUID::getNative() { + if (m_valueSet == false) { + log_v("<< Return of un-initialized UUID!"); + return nullptr; + } + return &m_uuid; +} // getNative +#endif + +/***************************************************************************** + * NimBLE functions * + *****************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +BLEUUID::BLEUUID(ble_uuid_any_t uuid) { + m_uuid = uuid; + m_valueSet = true; +} // BLEUUID + +BLEUUID::BLEUUID(const ble_uuid128_t *uuid) { + m_uuid.u.type = BLE_UUID_TYPE_128; + memcpy(m_uuid.u128.value, uuid->value, 16); + m_valueSet = true; +} // BLEUUID + +const ble_uuid_any_t *BLEUUID::getNative() const { + if (m_valueSet == false) { + log_v("<< Return of un-initialized UUID!"); + return nullptr; + } + return &m_uuid; +} // getNative +#endif + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEUUID.h b/libraries/BLE/src/BLEUUID.h index 1be013942e3..43c4e91b01d 100644 --- a/libraries/BLE/src/BLEUUID.h +++ b/libraries/BLE/src/BLEUUID.h @@ -3,42 +3,125 @@ * * Created on: Jun 21, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLEUUID_H_ #define COMPONENTS_CPP_UTILS_BLEUUID_H_ #include "soc/soc_caps.h" -#include "WString.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if CONFIG_BLUEDROID_ENABLED +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/***************************************************************************** + * Common includes * + *****************************************************************************/ + +#include "WString.h" + +/***************************************************************************** + * Bluedroid includes and definitions * + *****************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) #include +#define BLE_UUID_16_BITS ESP_UUID_LEN_16 +#define BLE_UUID_32_BITS ESP_UUID_LEN_32 +#define BLE_UUID_128_BITS ESP_UUID_LEN_128 +#define UUID_LEN(s) s.len +#define UUID_VAL_16(s) s.uuid.uuid16 +#define UUID_VAL_32(s) s.uuid.uuid32 +#define UUID_VAL_128(s) s.uuid.uuid128 +#endif + +/***************************************************************************** + * NimBLE includes and definitions * + *****************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#define BLE_UUID_16_BITS BLE_UUID_TYPE_16 +#define BLE_UUID_32_BITS BLE_UUID_TYPE_32 +#define BLE_UUID_128_BITS BLE_UUID_TYPE_128 +#define UUID_LEN(s) s.u.type +#define UUID_VAL_16(s) s.u16.value +#define UUID_VAL_32(s) s.u32.value +#define UUID_VAL_128(s) s.u128.value +#endif /** * @brief A model of a %BLE UUID. */ class BLEUUID { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + BLEUUID(String uuid); BLEUUID(uint16_t uuid); BLEUUID(uint32_t uuid); - BLEUUID(esp_bt_uuid_t uuid); BLEUUID(uint8_t *pData, size_t size, bool msbFirst); - BLEUUID(esp_gatt_id_t gattId); + BLEUUID(uint32_t first, uint16_t second, uint16_t third, uint64_t fourth); BLEUUID(); uint8_t bitSize(); // Get the number of bits in this uuid. - bool equals(BLEUUID uuid); - esp_bt_uuid_t *getNative(); + bool equals(const BLEUUID &uuid) const; BLEUUID to128(); - String toString(); + BLEUUID to16(); + String toString() const; static BLEUUID fromString(String uuid); // Create a BLEUUID from a string + bool operator==(const BLEUUID &rhs) const; + bool operator!=(const BLEUUID &rhs) const; + + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + BLEUUID(esp_bt_uuid_t uuid); + BLEUUID(esp_gatt_id_t gattId); + esp_bt_uuid_t *getNative(); +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + BLEUUID(ble_uuid_any_t uuid); + BLEUUID(const ble_uuid128_t *uuid); + const ble_uuid_any_t *getNative() const; +#endif + private: - esp_bt_uuid_t m_uuid; // The underlying UUID structure that this class wraps. + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + bool m_valueSet = false; // Is there a value set for this instance. + + /*************************************************************************** + * Bluedroid private properties * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + esp_bt_uuid_t m_uuid; // The underlying UUID structure that this class wraps. +#endif + + /*************************************************************************** + * NimBLE private properties * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + ble_uuid_any_t m_uuid; // The underlying UUID structure that this class wraps. +#endif }; // BLEUUID -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLEUUID_H_ */ diff --git a/libraries/BLE/src/BLEUtils.cpp b/libraries/BLE/src/BLEUtils.cpp index 05e1e32deed..4ca04e6e2b6 100644 --- a/libraries/BLE/src/BLEUtils.cpp +++ b/libraries/BLE/src/BLEUtils.cpp @@ -3,12 +3,22 @@ * * Created on: Mar 25, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/***************************************************************************** + * Common includes * + *****************************************************************************/ + #include "BLEAddress.h" #include "BLEClient.h" #include "BLEUtils.h" @@ -17,17 +27,56 @@ #include #include -#include // ESP32 BLE -#include // ESP32 BLE -#include // ESP32 BLE -#include // ESP32 BLE -#include // ESP32 ESP-IDF -#include // Part of C++ STL +#include + +#include +#include #include #include #include "esp32-hal-log.h" +/***************************************************************************** + * Bluedroid includes * + *****************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#include +#include +#endif + +/***************************************************************************** + * NimBLE includes and definitions * + *****************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#include +#include +#include +#include +#include +#include + +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG +#define CONFIG_NIMBLE_ENABLE_RETURN_CODE_TEXT +#define CONFIG_NIMBLE_ENABLE_ADVERTISMENT_TYPE_TEXT +#define CONFIG_NIMBLE_ENABLE_GAP_EVENT_CODE_TEXT +#endif + +#ifndef CONFIG_NIMBLE_FREERTOS_TASK_BLOCK_BIT +#define CONFIG_NIMBLE_FREERTOS_TASK_BLOCK_BIT 31 +#endif + +constexpr uint32_t TASK_BLOCK_BIT = (1 << CONFIG_NIMBLE_FREERTOS_TASK_BLOCK_BIT); +#endif + +/***************************************************************************** + * Bluedroid types and constants * + *****************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) typedef struct { uint32_t assignedNumber; const char *name; @@ -593,90 +642,58 @@ static const gattService_t g_gattServices[] = { #endif {"", "", 0} }; +#endif -/** - * @brief Convert characteristic properties into a string representation. - * @param [in] prop Characteristic properties. - * @return A string representation of characteristic properties. - */ -String BLEUtils::characteristicPropertiesToString(esp_gatt_char_prop_t prop) { - String res = "broadcast: "; - res += ((prop & ESP_GATT_CHAR_PROP_BIT_BROADCAST) ? "1" : "0"); - res += ", read: "; - res += ((prop & ESP_GATT_CHAR_PROP_BIT_READ) ? "1" : "0"); - res += ", write_nr: "; - res += ((prop & ESP_GATT_CHAR_PROP_BIT_WRITE_NR) ? "1" : "0"); - res += ", write: "; - res += ((prop & ESP_GATT_CHAR_PROP_BIT_WRITE) ? "1" : "0"); - res += ", notify: "; - res += ((prop & ESP_GATT_CHAR_PROP_BIT_NOTIFY) ? "1" : "0"); - res += ", indicate: "; - res += ((prop & ESP_GATT_CHAR_PROP_BIT_INDICATE) ? "1" : "0"); - res += ", auth: "; - res += ((prop & ESP_GATT_CHAR_PROP_BIT_AUTH) ? "1" : "0"); - return res; -} // characteristicPropertiesToString - -/** - * @brief Convert an esp_gatt_id_t to a string. - */ -static String gattIdToString(esp_gatt_id_t gattId) { - String res = "uuid: " + BLEUUID(gattId.uuid).toString() + ", inst_id: "; - char val[8]; - snprintf(val, sizeof(val), "%d", (int)gattId.inst_id); - res += val; - return res; -} // gattIdToString +/***************************************************************************** + * Common functions * + *****************************************************************************/ /** - * @brief Convert an esp_ble_addr_type_t to a string representation. + * @brief Create a hex representation of data. + * + * @param [in] target Where to write the hex string. If this is null, we malloc storage. + * @param [in] source The start of the binary data. + * @param [in] length The length of the data to convert. + * @return A pointer to the formatted buffer. */ -const char *BLEUtils::addressTypeToString(esp_ble_addr_type_t type) { - switch (type) { -#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG - case BLE_ADDR_TYPE_PUBLIC: return "BLE_ADDR_TYPE_PUBLIC"; - case BLE_ADDR_TYPE_RANDOM: return "BLE_ADDR_TYPE_RANDOM"; - case BLE_ADDR_TYPE_RPA_PUBLIC: return "BLE_ADDR_TYPE_RPA_PUBLIC"; - case BLE_ADDR_TYPE_RPA_RANDOM: return "BLE_ADDR_TYPE_RPA_RANDOM"; -#endif - default: return " esp_ble_addr_type_t"; +char *BLEUtils::buildHexData(uint8_t *target, uint8_t *source, uint8_t length) { + // Guard against too much data. + if (length > 100) { + length = 100; } -} // addressTypeToString -/** - * @brief Convert the BLE Advertising Data flags to a string. - * @param adFlags The flags to convert - * @return String A string representation of the advertising flags. - */ -String BLEUtils::adFlagsToString(uint8_t adFlags) { - String res; - if (adFlags & (1 << 0)) { - res += "[LE Limited Discoverable Mode] "; - } - if (adFlags & (1 << 1)) { - res += "[LE General Discoverable Mode] "; - } - if (adFlags & (1 << 2)) { - res += "[BR/EDR Not Supported] "; + if (target == nullptr) { + target = (uint8_t *)malloc(length * 2 + 1); + if (target == nullptr) { + log_e("buildHexData: malloc failed"); + return nullptr; + } } - if (adFlags & (1 << 3)) { - res += "[Simultaneous LE and BR/EDR to Same Device Capable (Controller)] "; + char *startOfData = (char *)target; + + for (int i = 0; i < length; i++) { + sprintf((char *)target, "%.2x", (char)*source); + source++; + target += 2; } - if (adFlags & (1 << 4)) { - res += "[Simultaneous LE and BR/EDR to Same Device Capable (Host)] "; + + // Handle the special case where there was no data. + if (length == 0) { + *startOfData = 0; } - return res; -} // adFlagsToString + + return startOfData; +} // buildHexData /** - * @brief Given an advertising type, return a string representation of the type. + * @brief Given an advertising data type, return a string representation of the type. * * For details see ... * https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile * * @return A string representation of the type. */ -const char *BLEUtils::advTypeToString(uint8_t advType) { +const char *BLEUtils::advDataTypeToString(uint8_t advType) { switch (advType) { #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG case ESP_BLE_AD_TYPE_FLAG: // 0x01 @@ -721,7 +738,8 @@ const char *BLEUtils::advTypeToString(uint8_t advType) { return "ESP_BLE_AD_TYPE_APPEARANCE"; case ESP_BLE_AD_TYPE_ADV_INT: // 0x1a return "ESP_BLE_AD_TYPE_ADV_INT"; - case ESP_BLE_AD_TYPE_32SOL_SRV_UUID: return "ESP_BLE_AD_TYPE_32SOL_SRV_UUID"; + case ESP_BLE_AD_TYPE_32SOL_SRV_UUID: // 0x1f + return "ESP_BLE_AD_TYPE_32SOL_SRV_UUID"; case ESP_BLE_AD_TYPE_32SERVICE_DATA: // 0x20 return "ESP_BLE_AD_TYPE_32SERVICE_DATA"; case ESP_BLE_AD_TYPE_128SERVICE_DATA: // 0x21 @@ -731,58 +749,36 @@ const char *BLEUtils::advTypeToString(uint8_t advType) { #endif default: log_v(" adv data type: 0x%x", advType); return ""; } // End switch -} // advTypeToString +} // advDataTypeToString -esp_gatt_id_t BLEUtils::buildGattId(esp_bt_uuid_t uuid, uint8_t inst_id) { - esp_gatt_id_t retGattId; - retGattId.uuid = uuid; - retGattId.inst_id = inst_id; - return retGattId; -} +/***************************************************************************** + * Bluedroid functions * + *****************************************************************************/ -esp_gatt_srvc_id_t BLEUtils::buildGattSrvcId(esp_gatt_id_t gattId, bool is_primary) { - esp_gatt_srvc_id_t retSrvcId; - retSrvcId.id = gattId; - retSrvcId.is_primary = is_primary; - return retSrvcId; -} +#if defined(CONFIG_BLUEDROID_ENABLED) /** - * @brief Create a hex representation of data. - * - * @param [in] target Where to write the hex string. If this is null, we malloc storage. - * @param [in] source The start of the binary data. - * @param [in] length The length of the data to convert. - * @return A pointer to the formatted buffer. + * @brief Convert characteristic properties into a string representation. + * @param [in] prop Characteristic properties. + * @return A string representation of characteristic properties. */ -char *BLEUtils::buildHexData(uint8_t *target, uint8_t *source, uint8_t length) { - // Guard against too much data. - if (length > 100) { - length = 100; - } - - if (target == nullptr) { - target = (uint8_t *)malloc(length * 2 + 1); - if (target == nullptr) { - log_e("buildHexData: malloc failed"); - return nullptr; - } - } - char *startOfData = (char *)target; - - for (int i = 0; i < length; i++) { - sprintf((char *)target, "%.2x", (char)*source); - source++; - target += 2; - } - - // Handle the special case where there was no data. - if (length == 0) { - *startOfData = 0; - } - - return startOfData; -} // buildHexData +String BLEUtils::characteristicPropertiesToString(uint8_t prop) { + String res = "broadcast: "; + res += ((prop & ESP_GATT_CHAR_PROP_BIT_BROADCAST) ? "1" : "0"); + res += ", read: "; + res += ((prop & ESP_GATT_CHAR_PROP_BIT_READ) ? "1" : "0"); + res += ", write_nr: "; + res += ((prop & ESP_GATT_CHAR_PROP_BIT_WRITE_NR) ? "1" : "0"); + res += ", write: "; + res += ((prop & ESP_GATT_CHAR_PROP_BIT_WRITE) ? "1" : "0"); + res += ", notify: "; + res += ((prop & ESP_GATT_CHAR_PROP_BIT_NOTIFY) ? "1" : "0"); + res += ", indicate: "; + res += ((prop & ESP_GATT_CHAR_PROP_BIT_INDICATE) ? "1" : "0"); + res += ", auth: "; + res += ((prop & ESP_GATT_CHAR_PROP_BIT_AUTH) ? "1" : "0"); + return res; +} // characteristicPropertiesToString /** * @brief Build a printable string of memory range. @@ -802,6 +798,71 @@ String BLEUtils::buildPrintData(uint8_t *source, size_t length) { return res; } // buildPrintData +/** + * @brief Convert an esp_gatt_id_t to a string. + */ +static String gattIdToString(esp_gatt_id_t gattId) { + String res = "uuid: " + BLEUUID(gattId.uuid).toString() + ", inst_id: "; + char val[8]; + snprintf(val, sizeof(val), "%d", (int)gattId.inst_id); + res += val; + return res; +} // gattIdToString + +/** + * @brief Convert an esp_ble_addr_type_t to a string representation. + */ +const char *BLEUtils::addressTypeToString(esp_ble_addr_type_t type) { + switch (type) { +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG + case BLE_ADDR_TYPE_PUBLIC: return "BLE_ADDR_TYPE_PUBLIC"; + case BLE_ADDR_TYPE_RANDOM: return "BLE_ADDR_TYPE_RANDOM"; + case BLE_ADDR_TYPE_RPA_PUBLIC: return "BLE_ADDR_TYPE_RPA_PUBLIC"; + case BLE_ADDR_TYPE_RPA_RANDOM: return "BLE_ADDR_TYPE_RPA_RANDOM"; +#endif + default: return " esp_ble_addr_type_t"; + } +} // addressTypeToString + +/** + * @brief Convert the BLE Advertising Data flags to a string. + * @param adFlags The flags to convert + * @return String A string representation of the advertising flags. + */ +String BLEUtils::adFlagsToString(uint8_t adFlags) { + String res; + if (adFlags & (1 << 0)) { + res += "[LE Limited Discoverable Mode] "; + } + if (adFlags & (1 << 1)) { + res += "[LE General Discoverable Mode] "; + } + if (adFlags & (1 << 2)) { + res += "[BR/EDR Not Supported] "; + } + if (adFlags & (1 << 3)) { + res += "[Simultaneous LE and BR/EDR to Same Device Capable (Controller)] "; + } + if (adFlags & (1 << 4)) { + res += "[Simultaneous LE and BR/EDR to Same Device Capable (Host)] "; + } + return res; +} // adFlagsToString + +esp_gatt_id_t BLEUtils::buildGattId(esp_bt_uuid_t uuid, uint8_t inst_id) { + esp_gatt_id_t retGattId; + retGattId.uuid = uuid; + retGattId.inst_id = inst_id; + return retGattId; +} + +esp_gatt_srvc_id_t BLEUtils::buildGattSrvcId(esp_gatt_id_t gattId, bool is_primary) { + esp_gatt_srvc_id_t retSrvcId; + retSrvcId.id = gattId; + retSrvcId.is_primary = is_primary; + return retSrvcId; +} + /** * @brief Convert a close/disconnect reason to a string. * @param [in] reason The close reason. @@ -1817,5 +1878,380 @@ const char *BLEUtils::searchEventTypeToString(esp_gap_search_evt_t searchEvt) { } } // searchEventTypeToString -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif // CONFIG_BLUEDROID_ENABLED + +/***************************************************************************** + * NimBLE functions * + *****************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + +/** + * @brief Construct a BLETaskData instance. + * @param [in] pInstance An instance of the class that will be waiting. + * @param [in] flags General purpose flags for the caller. + * @param [in] buf A buffer for data. + */ +BLETaskData::BLETaskData(void *pInstance, int flags, void *buf) : m_pInstance{pInstance}, m_flags{flags}, m_pBuf{buf}, m_pHandle{xTaskGetCurrentTaskHandle()} {} + +/** + * @brief Destructor. + */ +BLETaskData::~BLETaskData() {} + +/** + * @brief A function for checking validity of connection parameters. + * @param [in] params A pointer to the structure containing the parameters to check. + * @return valid == 0 or error code. + */ +int BLEUtils::checkConnParams(ble_gap_conn_params *params) { + /* Check connection interval min */ + if ((params->itvl_min < BLE_HCI_CONN_ITVL_MIN) || (params->itvl_min > BLE_HCI_CONN_ITVL_MAX)) { + return BLE_ERR_INV_HCI_CMD_PARMS; + } + /* Check connection interval max */ + if ((params->itvl_max < BLE_HCI_CONN_ITVL_MIN) || (params->itvl_max > BLE_HCI_CONN_ITVL_MAX) || (params->itvl_max < params->itvl_min)) { + return BLE_ERR_INV_HCI_CMD_PARMS; + } + + /* Check connection latency */ + if (params->latency > BLE_HCI_CONN_LATENCY_MAX) { + return BLE_ERR_INV_HCI_CMD_PARMS; + } + + /* Check supervision timeout */ + if ((params->supervision_timeout < BLE_HCI_CONN_SPVN_TIMEOUT_MIN) || (params->supervision_timeout > BLE_HCI_CONN_SPVN_TIMEOUT_MAX)) { + return BLE_ERR_INV_HCI_CMD_PARMS; + } + + /* Check connection event length */ + if (params->min_ce_len > params->max_ce_len) { + return BLE_ERR_INV_HCI_CMD_PARMS; + } + + return 0; +} + +/** + * @brief Converts a return code from the NimBLE stack to a text string. + * @param [in] rc The return code to convert. + * @return A string representation of the return code. + */ +const char *BLEUtils::returnCodeToString(int rc) { +#if defined(CONFIG_NIMBLE_ENABLE_RETURN_CODE_TEXT) + switch (rc) { + case 0: return "SUCCESS"; + case BLE_HS_EAGAIN: return "Temporary failure; try again."; + case BLE_HS_EALREADY: return "Operation already in progress or completed."; + case BLE_HS_EINVAL: return "One or more arguments are invalid."; + case BLE_HS_EMSGSIZE: return "The provided buffer is too small."; + case BLE_HS_ENOENT: return "No entry matching the specified criteria."; + case BLE_HS_ENOMEM: return "Operation failed due to resource exhaustion."; + case BLE_HS_ENOTCONN: return "No open connection with the specified handle."; + case BLE_HS_ENOTSUP: return "Operation disabled at compile time."; + case BLE_HS_EAPP: return "Application callback behaved unexpectedly."; + case BLE_HS_EBADDATA: return "Command from peer is invalid."; + case BLE_HS_EOS: return "Mynewt OS error."; + case BLE_HS_ECONTROLLER: return "Event from controller is invalid."; + case BLE_HS_ETIMEOUT: return "Operation timed out."; + case BLE_HS_EDONE: return "Operation completed successfully."; + case BLE_HS_EBUSY: return "Operation cannot be performed until procedure completes."; + case BLE_HS_EREJECT: return "Peer rejected a connection parameter update request."; + case BLE_HS_EUNKNOWN: return "Unexpected failure; catch all."; + case BLE_HS_EROLE: return "Operation requires different role (e.g., central vs. peripheral)."; + case BLE_HS_ETIMEOUT_HCI: return "HCI request timed out; controller unresponsive."; + case BLE_HS_ENOMEM_EVT: return "Controller failed to send event due to memory exhaustion (combined host-controller only)."; + case BLE_HS_ENOADDR: return "Operation requires an identity address but none configured."; + case BLE_HS_ENOTSYNCED: return "Attempt to use the host before it is synced with controller."; + case BLE_HS_EAUTHEN: return "Insufficient authentication."; + case BLE_HS_EAUTHOR: return "Insufficient authorization."; + case BLE_HS_EENCRYPT: return "Insufficient encryption level."; + case BLE_HS_EENCRYPT_KEY_SZ: return "Insufficient key size."; + case BLE_HS_ESTORE_CAP: return "Storage at capacity."; + case BLE_HS_ESTORE_FAIL: return "Storage IO error."; + case BLE_HS_EPREEMPTED: return "Operation was preempted."; + case BLE_HS_EDISABLED: return "Operation disabled."; + case BLE_HS_ESTALLED: return "Operation stalled."; + case (0x0100 + BLE_ATT_ERR_INVALID_HANDLE): return "The attribute handle given was not valid on this server."; + case (0x0100 + BLE_ATT_ERR_READ_NOT_PERMITTED): return "The attribute cannot be read."; + case (0x0100 + BLE_ATT_ERR_WRITE_NOT_PERMITTED): return "The attribute cannot be written."; + case (0x0100 + BLE_ATT_ERR_INVALID_PDU): return "The attribute PDU was invalid."; + case (0x0100 + BLE_ATT_ERR_INSUFFICIENT_AUTHEN): return "The attribute requires authentication before it can be read or written."; + case (0x0100 + BLE_ATT_ERR_REQ_NOT_SUPPORTED): return "Attribute server does not support the request received from the client."; + case (0x0100 + BLE_ATT_ERR_INVALID_OFFSET): return "Offset specified was past the end of the attribute."; + case (0x0100 + BLE_ATT_ERR_INSUFFICIENT_AUTHOR): return "The attribute requires authorization before it can be read or written."; + case (0x0100 + BLE_ATT_ERR_PREPARE_QUEUE_FULL): return "Too many prepare writes have been queued."; + case (0x0100 + BLE_ATT_ERR_ATTR_NOT_FOUND): return "No attribute found within the given attribute handle range."; + case (0x0100 + BLE_ATT_ERR_ATTR_NOT_LONG): return "The attribute cannot be read or written using the Read Blob Request."; + case (0x0100 + BLE_ATT_ERR_INSUFFICIENT_KEY_SZ): return "The Encryption Key Size used for encrypting this link is insufficient."; + case (0x0100 + BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN): return "The attribute value length is invalid for the operation."; + case (0x0100 + BLE_ATT_ERR_UNLIKELY): return "The attribute request has encountered an error that was unlikely, could not be completed as requested."; + case (0x0100 + BLE_ATT_ERR_INSUFFICIENT_ENC): return "The attribute requires encryption before it can be read or written."; + case (0x0100 + BLE_ATT_ERR_UNSUPPORTED_GROUP): + return "The attribute type is not a supported grouping attribute as defined by a higher layer specification."; + case (0x0100 + BLE_ATT_ERR_INSUFFICIENT_RES): return "Insufficient Resources to complete the request."; + case (0x0200 + BLE_ERR_UNKNOWN_HCI_CMD): return "Unknown HCI Command"; + case (0x0200 + BLE_ERR_UNK_CONN_ID): return "Unknown Connection Identifier"; + case (0x0200 + BLE_ERR_HW_FAIL): return "Hardware Failure"; + case (0x0200 + BLE_ERR_PAGE_TMO): return "Page Timeout"; + case (0x0200 + BLE_ERR_AUTH_FAIL): return "Authentication Failure"; + case (0x0200 + BLE_ERR_PINKEY_MISSING): return "PIN or Key Missing"; + case (0x0200 + BLE_ERR_MEM_CAPACITY): return "Memory Capacity Exceeded"; + case (0x0200 + BLE_ERR_CONN_SPVN_TMO): return "Connection Timeout"; + case (0x0200 + BLE_ERR_CONN_LIMIT): return "Connection Limit Exceeded"; + case (0x0200 + BLE_ERR_SYNCH_CONN_LIMIT): return "Synchronous Connection Limit To A Device Exceeded"; + case (0x0200 + BLE_ERR_ACL_CONN_EXISTS): return "ACL Connection Already Exists"; + case (0x0200 + BLE_ERR_CMD_DISALLOWED): return "Command Disallowed"; + case (0x0200 + BLE_ERR_CONN_REJ_RESOURCES): return "Connection Rejected due to Limited Resources"; + case (0x0200 + BLE_ERR_CONN_REJ_SECURITY): return "Connection Rejected Due To Security Reasons"; + case (0x0200 + BLE_ERR_CONN_REJ_BD_ADDR): return "Connection Rejected due to Unacceptable BD_ADDR"; + case (0x0200 + BLE_ERR_CONN_ACCEPT_TMO): return "Connection Accept Timeout Exceeded"; + case (0x0200 + BLE_ERR_UNSUPPORTED): return "Unsupported Feature or Parameter Value"; + case (0x0200 + BLE_ERR_INV_HCI_CMD_PARMS): return "Invalid HCI Command Parameters"; + case (0x0200 + BLE_ERR_REM_USER_CONN_TERM): return "Remote User Terminated Connection"; + case (0x0200 + BLE_ERR_RD_CONN_TERM_RESRCS): return "Remote Device Terminated Connection due to Low Resources"; + case (0x0200 + BLE_ERR_RD_CONN_TERM_PWROFF): return "Remote Device Terminated Connection due to Power Off"; + case (0x0200 + BLE_ERR_CONN_TERM_LOCAL): return "Connection Terminated By Local Host"; + case (0x0200 + BLE_ERR_REPEATED_ATTEMPTS): return "Repeated Attempts"; + case (0x0200 + BLE_ERR_NO_PAIRING): return "Pairing Not Allowed"; + case (0x0200 + BLE_ERR_UNK_LMP): return "Unknown LMP PDU"; + case (0x0200 + BLE_ERR_UNSUPP_REM_FEATURE): return "Unsupported Remote Feature / Unsupported LMP Feature"; + case (0x0200 + BLE_ERR_SCO_OFFSET): return "SCO Offset Rejected"; + case (0x0200 + BLE_ERR_SCO_ITVL): return "SCO Interval Rejected"; + case (0x0200 + BLE_ERR_SCO_AIR_MODE): return "SCO Air Mode Rejected"; + case (0x0200 + BLE_ERR_INV_LMP_LL_PARM): return "Invalid LMP Parameters / Invalid LL Parameters"; + case (0x0200 + BLE_ERR_UNSPECIFIED): return "Unspecified Error"; + case (0x0200 + BLE_ERR_UNSUPP_LMP_LL_PARM): return "Unsupported LMP Parameter Value / Unsupported LL Parameter Value"; + case (0x0200 + BLE_ERR_NO_ROLE_CHANGE): return "Role Change Not Allowed"; + case (0x0200 + BLE_ERR_LMP_LL_RSP_TMO): return "LMP Response Timeout / LL Response Timeout"; + case (0x0200 + BLE_ERR_LMP_COLLISION): return "LMP Error Transaction Collision"; + case (0x0200 + BLE_ERR_LMP_PDU): return "LMP PDU Not Allowed"; + case (0x0200 + BLE_ERR_ENCRYPTION_MODE): return "Encryption Mode Not Acceptable"; + case (0x0200 + BLE_ERR_LINK_KEY_CHANGE): return "Link Key cannot be Changed"; + case (0x0200 + BLE_ERR_UNSUPP_QOS): return "Requested QoS Not Supported"; + case (0x0200 + BLE_ERR_INSTANT_PASSED): return "Instant Passed"; + case (0x0200 + BLE_ERR_UNIT_KEY_PAIRING): return "Pairing With Unit Key Not Supported"; + case (0x0200 + BLE_ERR_DIFF_TRANS_COLL): return "Different Transaction Collision"; + case (0x0200 + BLE_ERR_QOS_PARM): return "QoS Unacceptable Parameter"; + case (0x0200 + BLE_ERR_QOS_REJECTED): return "QoS Rejected"; + case (0x0200 + BLE_ERR_CHAN_CLASS): return "Channel Classification Not Supported"; + case (0x0200 + BLE_ERR_INSUFFICIENT_SEC): return "Insufficient Security"; + case (0x0200 + BLE_ERR_PARM_OUT_OF_RANGE): return "Parameter Out Of Mandatory Range"; + case (0x0200 + BLE_ERR_PENDING_ROLE_SW): return "Role Switch Pending"; + case (0x0200 + BLE_ERR_RESERVED_SLOT): return "Reserved Slot Violation"; + case (0x0200 + BLE_ERR_ROLE_SW_FAIL): return "Role Switch Failed"; + case (0x0200 + BLE_ERR_INQ_RSP_TOO_BIG): return "Extended Inquiry Response Too Large"; + case (0x0200 + BLE_ERR_SEC_SIMPLE_PAIR): return "Secure Simple Pairing Not Supported By Host"; + case (0x0200 + BLE_ERR_HOST_BUSY_PAIR): return "Host Busy - Pairing"; + case (0x0200 + BLE_ERR_CONN_REJ_CHANNEL): return "Connection Rejected, No Suitable Channel Found"; + case (0x0200 + BLE_ERR_CTLR_BUSY): return "Controller Busy"; + case (0x0200 + BLE_ERR_CONN_PARMS): return "Unacceptable Connection Parameters"; + case (0x0200 + BLE_ERR_DIR_ADV_TMO): return "Directed Advertising Timeout"; + case (0x0200 + BLE_ERR_CONN_TERM_MIC): return "Connection Terminated due to MIC Failure"; + case (0x0200 + BLE_ERR_CONN_ESTABLISHMENT): return "Connection Failed to be Established"; + case (0x0200 + BLE_ERR_MAC_CONN_FAIL): return "MAC Connection Failed"; + case (0x0200 + BLE_ERR_COARSE_CLK_ADJ): return "Coarse Clock Adjustment Rejected"; + case (0x0300 + BLE_L2CAP_SIG_ERR_CMD_NOT_UNDERSTOOD): return "Invalid or unsupported incoming L2CAP sig command."; + case (0x0300 + BLE_L2CAP_SIG_ERR_MTU_EXCEEDED): return "Incoming packet too large."; + case (0x0300 + BLE_L2CAP_SIG_ERR_INVALID_CID): return "No channel with specified ID."; + case (0x0400 + BLE_SM_ERR_PASSKEY): return "The user input of passkey failed, for example, the user canceled the operation."; + case (0x0400 + BLE_SM_ERR_OOB): return "The OOB data is not available."; + case (0x0400 + BLE_SM_ERR_AUTHREQ): + return "The pairing procedure cannot be performed as authentication requirements cannot be met due to IO capabilities of one or both devices."; + case (0x0400 + BLE_SM_ERR_CONFIRM_MISMATCH): return "The confirm value does not match the calculated compare value."; + case (0x0400 + BLE_SM_ERR_PAIR_NOT_SUPP): return "Pairing is not supported by the device."; + case (0x0400 + BLE_SM_ERR_ENC_KEY_SZ): return "The resultant encryption key size is insufficient for the security requirements of this device."; + case (0x0400 + BLE_SM_ERR_CMD_NOT_SUPP): return "The SMP command received is not supported on this device."; + case (0x0400 + BLE_SM_ERR_UNSPECIFIED): return "Pairing failed due to an unspecified reason."; + case (0x0400 + BLE_SM_ERR_REPEATED): + return "Pairing or authentication procedure disallowed, too little time has elapsed since last pairing request or security request."; + case (0x0400 + BLE_SM_ERR_INVAL): return "Command length is invalid or that a parameter is outside of the specified range."; + case (0x0400 + BLE_SM_ERR_DHKEY): return "DHKey Check value received doesn't match the one calculated by the local device."; + case (0x0400 + BLE_SM_ERR_NUMCMP): return "Confirm values in the numeric comparison protocol do not match."; + case (0x0400 + BLE_SM_ERR_ALREADY): return "Pairing over the LE transport failed - Pairing Request sent over the BR/EDR transport in process."; + case (0x0400 + BLE_SM_ERR_CROSS_TRANS): + return "BR/EDR Link Key generated on the BR/EDR transport cannot be used to derive and distribute keys for the LE transport."; + case (0x0500 + BLE_SM_ERR_PASSKEY): return "The user input of passkey failed or the user canceled the operation."; + case (0x0500 + BLE_SM_ERR_OOB): return "The OOB data is not available."; + case (0x0500 + BLE_SM_ERR_AUTHREQ): + return "The pairing procedure cannot be performed as authentication requirements cannot be met due to IO capabilities of one or both devices."; + case (0x0500 + BLE_SM_ERR_CONFIRM_MISMATCH): return "The confirm value does not match the calculated compare value."; + case (0x0500 + BLE_SM_ERR_PAIR_NOT_SUPP): return "Pairing is not supported by the device."; + case (0x0500 + BLE_SM_ERR_ENC_KEY_SZ): return "The resultant encryption key size is insufficient for the security requirements of this device."; + case (0x0500 + BLE_SM_ERR_CMD_NOT_SUPP): return "The SMP command received is not supported on this device."; + case (0x0500 + BLE_SM_ERR_UNSPECIFIED): return "Pairing failed due to an unspecified reason."; + case (0x0500 + BLE_SM_ERR_REPEATED): + return "Pairing or authentication procedure is disallowed because too little time has elapsed since last pairing request or security request."; + case (0x0500 + BLE_SM_ERR_INVAL): return "Command length is invalid or a parameter is outside of the specified range."; + case (0x0500 + BLE_SM_ERR_DHKEY): + return "Indicates to the remote device that the DHKey Check value received doesn't match the one calculated by the local device."; + case (0x0500 + BLE_SM_ERR_NUMCMP): return "Confirm values in the numeric comparison protocol do not match."; + case (0x0500 + BLE_SM_ERR_ALREADY): return "Pairing over the LE transport failed - Pairing Request sent over the BR/EDR transport in process."; + case (0x0500 + BLE_SM_ERR_CROSS_TRANS): + return "BR/EDR Link Key generated on the BR/EDR transport cannot be used to derive and distribute keys for the LE transport."; + default: return "Unknown"; + } +#else // #if defined(CONFIG_NIMBLE_ENABLE_RETURN_CODE_TEXT) + return ""; +#endif // #if defined(CONFIG_NIMBLE_ENABLE_RETURN_CODE_TEXT) +} + +/** + * @brief Utility function to log the gap event info. + * @param [in] event A pointer to the gap event structure. + * @param [in] arg Unused. + */ +void BLEUtils::dumpGapEvent(ble_gap_event *event, void *arg) { +#if defined(CONFIG_NIMBLE_ENABLE_GAP_EVENT_CODE_TEXT) + log_d("Received a GAP event: %s", gapEventToString(event->type)); +#endif +} + +/** + * @brief Convert a GAP event type to a string representation. + * @param [in] eventType The type of event. + * @return A string representation of the event type. + */ +const char *BLEUtils::gapEventToString(uint8_t eventType) { +#if defined(CONFIG_NIMBLE_ENABLE_GAP_EVENT_CODE_TEXT) + switch (eventType) { + case BLE_GAP_EVENT_CONNECT: //0 + return "BLE_GAP_EVENT_CONNECT "; + + case BLE_GAP_EVENT_DISCONNECT: //1 + return "BLE_GAP_EVENT_DISCONNECT"; + + case BLE_GAP_EVENT_CONN_UPDATE: //3 + return "BLE_GAP_EVENT_CONN_UPDATE"; + + case BLE_GAP_EVENT_CONN_UPDATE_REQ: //4 + return "BLE_GAP_EVENT_CONN_UPDATE_REQ"; + + case BLE_GAP_EVENT_L2CAP_UPDATE_REQ: //5 + return "BLE_GAP_EVENT_L2CAP_UPDATE_REQ"; + + case BLE_GAP_EVENT_TERM_FAILURE: //6 + return "BLE_GAP_EVENT_TERM_FAILURE"; + + case BLE_GAP_EVENT_DISC: //7 + return "BLE_GAP_EVENT_DISC"; + + case BLE_GAP_EVENT_DISC_COMPLETE: //8 + return "BLE_GAP_EVENT_DISC_COMPLETE"; + + case BLE_GAP_EVENT_ADV_COMPLETE: //9 + return "BLE_GAP_EVENT_ADV_COMPLETE"; + + case BLE_GAP_EVENT_ENC_CHANGE: //10 + return "BLE_GAP_EVENT_ENC_CHANGE"; + + case BLE_GAP_EVENT_PASSKEY_ACTION: //11 + return "BLE_GAP_EVENT_PASSKEY_ACTION"; + + case BLE_GAP_EVENT_NOTIFY_RX: //12 + return "BLE_GAP_EVENT_NOTIFY_RX"; + + case BLE_GAP_EVENT_NOTIFY_TX: //13 + return "BLE_GAP_EVENT_NOTIFY_TX"; + + case BLE_GAP_EVENT_SUBSCRIBE: //14 + return "BLE_GAP_EVENT_SUBSCRIBE"; + + case BLE_GAP_EVENT_MTU: //15 + return "BLE_GAP_EVENT_MTU"; + + case BLE_GAP_EVENT_IDENTITY_RESOLVED: //16 + return "BLE_GAP_EVENT_IDENTITY_RESOLVED"; + + case BLE_GAP_EVENT_REPEAT_PAIRING: //17 + return "BLE_GAP_EVENT_REPEAT_PAIRING"; + + case BLE_GAP_EVENT_PHY_UPDATE_COMPLETE: //18 + return "BLE_GAP_EVENT_PHY_UPDATE_COMPLETE"; + + case BLE_GAP_EVENT_EXT_DISC: //19 + return "BLE_GAP_EVENT_EXT_DISC"; +#ifdef BLE_GAP_EVENT_PERIODIC_SYNC // IDF 4.0 does not support these + case BLE_GAP_EVENT_PERIODIC_SYNC: //20 + return "BLE_GAP_EVENT_PERIODIC_SYNC"; + + case BLE_GAP_EVENT_PERIODIC_REPORT: //21 + return "BLE_GAP_EVENT_PERIODIC_REPORT"; + + case BLE_GAP_EVENT_PERIODIC_SYNC_LOST: //22 + return "BLE_GAP_EVENT_PERIODIC_SYNC_LOST"; + + case BLE_GAP_EVENT_SCAN_REQ_RCVD: //23 + return "BLE_GAP_EVENT_SCAN_REQ_RCVD"; +#endif + default: log_d("gapEventToString: Unknown event type %d 0x%.2x", eventType, eventType); return "Unknown event type"; + } +#else // #if defined(CONFIG_NIMBLE_ENABLE_GAP_EVENT_CODE_TEXT) + return ""; +#endif // #if defined(CONFIG_NIMBLE_ENABLE_GAP_EVENT_CODE_TEXT) +} // gapEventToString + +/** + * @brief Convert characteristic properties into a string representation. + * @param [in] prop Characteristic properties. + * @return A string representation of characteristic properties. + */ +String BLEUtils::characteristicPropertiesToString(uint8_t prop) { + String res = "broadcast: "; + res += ((prop & BLE_GATT_CHR_PROP_BROADCAST) ? "1" : "0"); + res += ", read: "; + res += ((prop & BLE_GATT_CHR_PROP_READ) ? "1" : "0"); + res += ", write_nr: "; + res += ((prop & BLE_GATT_CHR_PROP_WRITE_NO_RSP) ? "1" : "0"); + res += ", write: "; + res += ((prop & BLE_GATT_CHR_PROP_WRITE) ? "1" : "0"); + res += ", notify: "; + res += ((prop & BLE_GATT_CHR_PROP_NOTIFY) ? "1" : "0"); + res += ", indicate: "; + res += ((prop & BLE_GATT_CHR_PROP_INDICATE) ? "1" : "0"); + res += ", auth_sign_write: "; + res += ((prop & BLE_GATT_CHR_PROP_AUTH_SIGN_WRITE) ? "1" : "0"); + res += ", extended: "; + res += ((prop & BLE_GATT_CHR_PROP_EXTENDED) ? "1" : "0"); + return res; +} // characteristicPropertiesToString + +/** + * @brief Blocks the calling task until released or timeout. + * @param [in] taskData A pointer to the task data structure. + * @param [in] timeout The time to wait in milliseconds. + * @return True if the task completed, false if the timeout was reached. + */ +bool BLEUtils::taskWait(const BLETaskData &taskData, uint32_t timeout) { + ble_npl_time_t ticks; + if (timeout == BLE_NPL_TIME_FOREVER) { + ticks = BLE_NPL_TIME_FOREVER; + } else { + ble_npl_time_ms_to_ticks(timeout, &ticks); + } + + uint32_t notificationValue; + xTaskNotifyWait(0, TASK_BLOCK_BIT, ¬ificationValue, 0); + if (notificationValue & TASK_BLOCK_BIT) { + return true; + } + + return xTaskNotifyWait(0, TASK_BLOCK_BIT, nullptr, ticks) == pdTRUE; +} // taskWait + +/** + * @brief Release a task. + * @param [in] taskData A pointer to the task data structure. + * @param [in] flags A return value to set in the task data structure. + */ +void BLEUtils::taskRelease(const BLETaskData &taskData, int flags) { + taskData.m_flags = flags; + if (taskData.m_pHandle != nullptr) { + xTaskNotify(static_cast(taskData.m_pHandle), TASK_BLOCK_BIT, eSetBits); + } +} // taskRelease + +#endif // CONFIG_NIMBLE_ENABLED + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEUtils.h b/libraries/BLE/src/BLEUtils.h index 7c6f58d284b..2689706b7a1 100644 --- a/libraries/BLE/src/BLEUtils.h +++ b/libraries/BLE/src/BLEUtils.h @@ -3,6 +3,10 @@ * * Created on: Mar 25, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLEUTILS_H_ @@ -11,24 +15,99 @@ #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) -#include // ESP32 BLE -#include // ESP32 BLE -#include // ESP32 BLE +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/***************************************************************************** + * Common includes * + *****************************************************************************/ + #include -#include "BLEClient.h" +#include "BLEAddress.h" +#include "WString.h" +#include + +/***************************************************************************** + * Bluedroid includes * + *****************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#include +#include +#endif + +/***************************************************************************** + * NimBLE includes * + *****************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) +#include +#include +#include +#endif + +/***************************************************************************** + * Common types * + *****************************************************************************/ + +typedef struct { + void *peer_device; // peer device BLEClient or BLEServer + bool connected; // connection status + uint16_t mtu; // negotiated MTU per peer device +} conn_status_t; + +/***************************************************************************** + * NimBLE types * + *****************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + +/** + * @brief A structure to hold data for a task that is waiting for a response. + * @details This structure is used in conjunction with BLEUtils::taskWait() and BLEUtils::taskRelease(). + * All items are optional, the m_pHandle will be set in taskWait(). + */ +struct BLETaskData { + BLETaskData(void *pInstance = nullptr, int flags = 0, void *buf = nullptr); + ~BLETaskData(); + void *m_pInstance{nullptr}; + mutable int m_flags{0}; + void *m_pBuf{nullptr}; + +private: + mutable void *m_pHandle{nullptr}; // semaphore or task handle + friend class BLEUtils; +}; + +#endif + +/***************************************************************************** + * Forward declarations * + *****************************************************************************/ + +class BLEClient; /** * @brief A set of general %BLE utilities. */ class BLEUtils { public: - static const char *addressTypeToString(esp_ble_addr_type_t type); - static String adFlagsToString(uint8_t adFlags); - static const char *advTypeToString(uint8_t advType); + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + static char *buildHexData(uint8_t *target, uint8_t *source, uint8_t length); static String buildPrintData(uint8_t *source, size_t length); - static String characteristicPropertiesToString(esp_gatt_char_prop_t prop); + static const char *advDataTypeToString(uint8_t advType); + static String characteristicPropertiesToString(uint8_t prop); + + /*************************************************************************** + * Bluedroid public declarations * + ***************************************************************************/ + +#if defined(CONFIG_BLUEDROID_ENABLED) + static const char *addressTypeToString(esp_ble_addr_type_t type); + static String adFlagsToString(uint8_t adFlags); static const char *devTypeToString(esp_bt_dev_type_t type); static esp_gatt_id_t buildGattId(esp_bt_uuid_t uuid, uint8_t inst_id = 0); static esp_gatt_srvc_id_t buildGattSrvcId(esp_gatt_id_t gattId, bool is_primary = true); @@ -52,8 +131,22 @@ class BLEUtils { static void registerByAddress(BLEAddress address, BLEClient *pDevice); static void registerByConnId(uint16_t conn_id, BLEClient *pDevice); static const char *searchEventTypeToString(esp_gap_search_evt_t searchEvt); +#endif + + /*************************************************************************** + * NimBLE public declarations * + ***************************************************************************/ + +#if defined(CONFIG_NIMBLE_ENABLED) + static void dumpGapEvent(ble_gap_event *event, void *arg); + static const char *gapEventToString(uint8_t eventType); + static const char *returnCodeToString(int rc); + static int checkConnParams(ble_gap_conn_params *params); + static bool taskWait(const BLETaskData &taskData, uint32_t timeout); + static void taskRelease(const BLETaskData &taskData, int rc = 0); +#endif }; -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLEUTILS_H_ */ diff --git a/libraries/BLE/src/BLEValue.cpp b/libraries/BLE/src/BLEValue.cpp index 26811c985ac..efc97697baa 100644 --- a/libraries/BLE/src/BLEValue.cpp +++ b/libraries/BLE/src/BLEValue.cpp @@ -3,15 +3,29 @@ * * Created on: Jul 17, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ + #include "soc/soc_caps.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/***************************************************************************** + * Common includes * + *****************************************************************************/ + #include "BLEValue.h" #include "esp32-hal-log.h" +/***************************************************************************** + * Common functions * + *****************************************************************************/ + BLEValue::BLEValue() { m_accumulation = ""; m_value = ""; @@ -120,5 +134,5 @@ void BLEValue::setValue(uint8_t *pData, size_t length) { m_value = String((char *)pData, length); } // setValue -#endif /* CONFIG_BLUEDROID_ENABLED */ +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ diff --git a/libraries/BLE/src/BLEValue.h b/libraries/BLE/src/BLEValue.h index f9c91bdcd4e..56a7a5bc4ec 100644 --- a/libraries/BLE/src/BLEValue.h +++ b/libraries/BLE/src/BLEValue.h @@ -3,22 +3,36 @@ * * Created on: Jul 17, 2017 * Author: kolban + * + * Modified on: Feb 18, 2025 + * Author: lucasssvaz (based on kolban's and h2zero's work) + * Description: Added support for NimBLE */ #ifndef COMPONENTS_CPP_UTILS_BLEVALUE_H_ #define COMPONENTS_CPP_UTILS_BLEVALUE_H_ + #include "soc/soc_caps.h" -#include "WString.h" #if SOC_BLE_SUPPORTED #include "sdkconfig.h" -#if defined(CONFIG_BLUEDROID_ENABLED) +#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED) + +/***************************************************************************** + * Common includes * + *****************************************************************************/ + +#include "WString.h" /** * @brief The model of a %BLE value. */ class BLEValue { public: + /*************************************************************************** + * Common public declarations * + ***************************************************************************/ + BLEValue(); void addPart(String part); void addPart(uint8_t *pData, size_t length); @@ -33,10 +47,15 @@ class BLEValue { void setValue(uint8_t *pData, size_t length); private: + /*************************************************************************** + * Common private properties * + ***************************************************************************/ + String m_accumulation; uint16_t m_readOffset; String m_value; }; -#endif /* CONFIG_BLUEDROID_ENABLED */ + +#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */ #endif /* SOC_BLE_SUPPORTED */ #endif /* COMPONENTS_CPP_UTILS_BLEVALUE_H_ */ From dc82467ba41c7ed589dfb480db742ea14e65b68f Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 23 Jun 2025 08:48:37 -0300 Subject: [PATCH 184/290] fix(esp_now): Fix broadcast example and use nullptr (#11490) * fix(esp_now): Fix example and use nullptr * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../ESP_NOW_Broadcast_Master.ino | 2 +- .../ESP_NOW_Broadcast_Slave.ino | 28 ++++++++--- .../ESP_NOW_Network/ESP_NOW_Network.ino | 13 +++-- libraries/ESP_NOW/src/ESP32_NOW.cpp | 42 ++++++++-------- libraries/ESP_NOW/src/ESP32_NOW.h | 4 +- libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp | 50 +++++++++---------- libraries/ESP_NOW/src/ESP32_NOW_Serial.h | 4 +- 7 files changed, 81 insertions(+), 62 deletions(-) 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 6ee7dc6f846..025a53c913b 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 @@ -58,7 +58,7 @@ public: uint32_t msg_count = 0; // Create a broadcast peer object -ESP_NOW_Broadcast_Peer broadcast_peer(ESPNOW_WIFI_CHANNEL, WIFI_IF_STA, NULL); +ESP_NOW_Broadcast_Peer broadcast_peer(ESPNOW_WIFI_CHANNEL, WIFI_IF_STA, nullptr); /* Main */ 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 5f1a8bd8807..e61524b64f9 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 @@ -52,7 +52,8 @@ public: /* Global Variables */ // List of all the masters. It will be populated when a new master is registered -std::vector masters; +// Note: Using pointers instead of objects to prevent dangling pointers when the vector reallocates +std::vector masters; /* Callbacks */ @@ -62,13 +63,14 @@ void register_new_master(const esp_now_recv_info_t *info, const uint8_t *data, i Serial.printf("Unknown peer " MACSTR " sent a broadcast message\n", MAC2STR(info->src_addr)); Serial.println("Registering the peer as a master"); - ESP_NOW_Peer_Class new_master(info->src_addr, ESPNOW_WIFI_CHANNEL, WIFI_IF_STA, NULL); - - masters.push_back(new_master); - if (!masters.back().add_peer()) { + ESP_NOW_Peer_Class *new_master = new ESP_NOW_Peer_Class(info->src_addr, ESPNOW_WIFI_CHANNEL, WIFI_IF_STA, nullptr); + if (!new_master->add_peer()) { Serial.println("Failed to register the new master"); + delete new_master; return; } + masters.push_back(new_master); + Serial.printf("Successfully registered master " MACSTR " (total masters: %zu)\n", MAC2STR(new_master->addr()), masters.size()); } else { // The slave will only receive broadcast messages log_v("Received a unicast message from " MACSTR, MAC2STR(info->src_addr)); @@ -103,11 +105,23 @@ void setup() { } // Register the new peer callback - ESP_NOW.onNewPeer(register_new_master, NULL); + ESP_NOW.onNewPeer(register_new_master, nullptr); Serial.println("Setup complete. Waiting for a master to broadcast a message..."); } void loop() { - delay(1000); + // Print debug information every 10 seconds + static unsigned long last_debug = 0; + if (millis() - last_debug > 10000) { + last_debug = millis(); + Serial.printf("Registered masters: %zu\n", masters.size()); + for (size_t i = 0; i < masters.size(); i++) { + if (masters[i]) { + Serial.printf(" Master %zu: " MACSTR "\n", i, MAC2STR(masters[i]->addr())); + } + } + } + + delay(100); } 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 48ea6b731ce..6731340c922 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 @@ -123,7 +123,7 @@ public: } bool send_message(const uint8_t *data, size_t len) { - if (data == NULL || len == 0) { + if (data == nullptr || len == 0) { log_e("Data to be sent is NULL or has a length of 0"); return false; } @@ -169,9 +169,12 @@ public: /* Peers */ -std::vector peers; // Create a vector to store the peer pointers -ESP_NOW_Network_Peer broadcast_peer(ESP_NOW.BROADCAST_ADDR, 0, NULL); // Register the broadcast peer (no encryption support for the broadcast address) -ESP_NOW_Network_Peer *master_peer = nullptr; // Pointer to peer that is the master +// Create a vector to store the peer pointers +std::vector peers; +// Register the broadcast peer (no encryption support for the broadcast address) +ESP_NOW_Network_Peer broadcast_peer(ESP_NOW.BROADCAST_ADDR, 0, nullptr); +// Pointer to the peer that is the master +ESP_NOW_Network_Peer *master_peer = nullptr; /* Helper functions */ @@ -279,7 +282,7 @@ void setup() { } // Register the callback to be called when a new peer is found - ESP_NOW.onNewPeer(register_new_peer, NULL); + ESP_NOW.onNewPeer(register_new_peer, nullptr); Serial.println("Setup complete. Broadcasting own priority to find the master..."); memset(&new_msg, 0, sizeof(new_msg)); diff --git a/libraries/ESP_NOW/src/ESP32_NOW.cpp b/libraries/ESP_NOW/src/ESP32_NOW.cpp index 6fd3ff0a0b1..25a5609e8db 100644 --- a/libraries/ESP_NOW/src/ESP32_NOW.cpp +++ b/libraries/ESP_NOW/src/ESP32_NOW.cpp @@ -9,12 +9,12 @@ #include "esp32-hal.h" #include "esp_wifi.h" -static void (*new_cb)(const esp_now_recv_info_t *info, const uint8_t *data, int len, void *arg) = NULL; -static void *new_arg = NULL; // * tx_arg = NULL, * rx_arg = NULL, +static void (*new_cb)(const esp_now_recv_info_t *info, const uint8_t *data, int len, void *arg) = nullptr; +static void *new_arg = nullptr; // * tx_arg = nullptr, * rx_arg = nullptr, static bool _esp_now_has_begun = false; static ESP_NOW_Peer *_esp_now_peers[ESP_NOW_MAX_TOTAL_PEER_NUM]; -static esp_err_t _esp_now_add_peer(const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface, const uint8_t *lmk, ESP_NOW_Peer *_peer = NULL) { +static esp_err_t _esp_now_add_peer(const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface, const uint8_t *lmk, ESP_NOW_Peer *_peer = nullptr) { log_v(MACSTR, MAC2STR(mac_addr)); if (esp_now_is_peer_exist(mac_addr)) { log_e("Peer Already Exists"); @@ -26,16 +26,16 @@ static esp_err_t _esp_now_add_peer(const uint8_t *mac_addr, uint8_t channel, wif memcpy(peer.peer_addr, mac_addr, ESP_NOW_ETH_ALEN); peer.channel = channel; peer.ifidx = iface; - peer.encrypt = lmk != NULL; + peer.encrypt = lmk != nullptr; if (lmk) { memcpy(peer.lmk, lmk, ESP_NOW_KEY_LEN); } esp_err_t result = esp_now_add_peer(&peer); if (result == ESP_OK) { - if (_peer != NULL) { + if (_peer != nullptr) { for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { - if (_esp_now_peers[i] == NULL) { + if (_esp_now_peers[i] == nullptr) { _esp_now_peers[i] = _peer; return ESP_OK; } @@ -67,8 +67,8 @@ static esp_err_t _esp_now_del_peer(const uint8_t *mac_addr) { } for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { - if (_esp_now_peers[i] != NULL && memcmp(mac_addr, _esp_now_peers[i]->addr(), ESP_NOW_ETH_ALEN) == 0) { - _esp_now_peers[i] = NULL; + if (_esp_now_peers[i] != nullptr && memcmp(mac_addr, _esp_now_peers[i]->addr(), ESP_NOW_ETH_ALEN) == 0) { + _esp_now_peers[i] = nullptr; break; } } @@ -87,7 +87,7 @@ static esp_err_t _esp_now_modify_peer(const uint8_t *mac_addr, uint8_t channel, memcpy(peer.peer_addr, mac_addr, ESP_NOW_ETH_ALEN); peer.channel = channel; peer.ifidx = iface; - peer.encrypt = lmk != NULL; + peer.encrypt = lmk != nullptr; if (lmk) { memcpy(peer.lmk, lmk, ESP_NOW_KEY_LEN); } @@ -111,17 +111,17 @@ static void _esp_now_rx_cb(const esp_now_recv_info_t *info, const uint8_t *data, bool broadcast = memcmp(info->des_addr, ESP_NOW.BROADCAST_ADDR, ESP_NOW_ETH_ALEN) == 0; log_v("%s from " MACSTR ", data length : %u", broadcast ? "Broadcast" : "Unicast", MAC2STR(info->src_addr), len); log_buf_v(data, len); - if (!esp_now_is_peer_exist(info->src_addr) && new_cb != NULL) { + if (!esp_now_is_peer_exist(info->src_addr) && new_cb != nullptr) { log_v("Calling new_cb, peer not found."); new_cb(info, data, len, new_arg); return; } //find the peer and call it's callback for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { - if (_esp_now_peers[i] != NULL) { + if (_esp_now_peers[i] != nullptr) { log_v("Checking peer " MACSTR, MAC2STR(_esp_now_peers[i]->addr())); } - if (_esp_now_peers[i] != NULL && memcmp(info->src_addr, _esp_now_peers[i]->addr(), ESP_NOW_ETH_ALEN) == 0) { + if (_esp_now_peers[i] != nullptr && memcmp(info->src_addr, _esp_now_peers[i]->addr(), ESP_NOW_ETH_ALEN) == 0) { log_v("Calling onReceive"); _esp_now_peers[i]->onReceive(data, len, broadcast); return; @@ -133,7 +133,7 @@ static void _esp_now_tx_cb(const uint8_t *mac_addr, esp_now_send_status_t status log_v(MACSTR " : %s", MAC2STR(mac_addr), (status == ESP_NOW_SEND_SUCCESS) ? "SUCCESS" : "FAILED"); //find the peer and call it's callback for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { - if (_esp_now_peers[i] != NULL && memcmp(mac_addr, _esp_now_peers[i]->addr(), ESP_NOW_ETH_ALEN) == 0) { + if (_esp_now_peers[i] != nullptr && memcmp(mac_addr, _esp_now_peers[i]->addr(), ESP_NOW_ETH_ALEN) == 0) { _esp_now_peers[i]->onSent(status == ESP_NOW_SEND_SUCCESS); return; } @@ -197,7 +197,7 @@ bool ESP_NOW_Class::end() { } //remove all peers for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { - if (_esp_now_peers[i] != NULL) { + if (_esp_now_peers[i] != nullptr) { removePeer(*_esp_now_peers[i]); } } @@ -249,7 +249,7 @@ size_t ESP_NOW_Class::write(const uint8_t *data, size_t len) { if (len > ESP_NOW_MAX_DATA_LEN) { len = ESP_NOW_MAX_DATA_LEN; } - esp_err_t result = esp_now_send(NULL, data, len); + esp_err_t result = esp_now_send(nullptr, data, len); if (result == ESP_OK) { return len; } else if (result == ESP_ERR_ESPNOW_NOT_INIT) { @@ -292,7 +292,7 @@ ESP_NOW_Peer::ESP_NOW_Peer(const uint8_t *mac_addr, uint8_t channel, wifi_interf } chan = channel; ifc = iface; - encrypt = lmk != NULL; + encrypt = lmk != nullptr; if (encrypt) { memcpy(key, lmk, 16); } @@ -305,7 +305,7 @@ bool ESP_NOW_Peer::add() { if (added) { return true; } - if (_esp_now_add_peer(mac, chan, ifc, encrypt ? key : NULL, this) != ESP_OK) { + if (_esp_now_add_peer(mac, chan, ifc, encrypt ? key : nullptr, this) != ESP_OK) { return false; } log_v("Peer added - " MACSTR, MAC2STR(mac)); @@ -350,7 +350,7 @@ bool ESP_NOW_Peer::setChannel(uint8_t channel) { if (!_esp_now_has_begun || !added) { return true; } - return _esp_now_modify_peer(mac, chan, ifc, encrypt ? key : NULL) == ESP_OK; + return _esp_now_modify_peer(mac, chan, ifc, encrypt ? key : nullptr) == ESP_OK; } wifi_interface_t ESP_NOW_Peer::getInterface() const { @@ -362,7 +362,7 @@ bool ESP_NOW_Peer::setInterface(wifi_interface_t iface) { if (!_esp_now_has_begun || !added) { return true; } - return _esp_now_modify_peer(mac, chan, ifc, encrypt ? key : NULL) == ESP_OK; + return _esp_now_modify_peer(mac, chan, ifc, encrypt ? key : nullptr) == ESP_OK; } bool ESP_NOW_Peer::isEncrypted() const { @@ -370,14 +370,14 @@ bool ESP_NOW_Peer::isEncrypted() const { } bool ESP_NOW_Peer::setKey(const uint8_t *lmk) { - encrypt = lmk != NULL; + encrypt = lmk != nullptr; if (encrypt) { memcpy(key, lmk, 16); } if (!_esp_now_has_begun || !added) { return true; } - return _esp_now_modify_peer(mac, chan, ifc, encrypt ? key : NULL) == ESP_OK; + return _esp_now_modify_peer(mac, chan, ifc, encrypt ? key : nullptr) == ESP_OK; } size_t ESP_NOW_Peer::send(const uint8_t *data, int len) { diff --git a/libraries/ESP_NOW/src/ESP32_NOW.h b/libraries/ESP_NOW/src/ESP32_NOW.h index efba9243aee..5940cfa2221 100644 --- a/libraries/ESP_NOW/src/ESP32_NOW.h +++ b/libraries/ESP_NOW/src/ESP32_NOW.h @@ -20,7 +20,7 @@ class ESP_NOW_Class : public Print { ESP_NOW_Class(); ~ESP_NOW_Class(); - bool begin(const uint8_t *pmk = NULL /* 16 bytes */); + bool begin(const uint8_t *pmk = nullptr /* 16 bytes */); bool end(); int getTotalPeerCount(); @@ -50,7 +50,7 @@ class ESP_NOW_Peer { bool remove(); size_t send(const uint8_t *data, int len); - ESP_NOW_Peer(const uint8_t *mac_addr, uint8_t channel = 0, wifi_interface_t iface = WIFI_IF_AP, const uint8_t *lmk = NULL); + ESP_NOW_Peer(const uint8_t *mac_addr, uint8_t channel = 0, wifi_interface_t iface = WIFI_IF_AP, const uint8_t *lmk = nullptr); public: virtual ~ESP_NOW_Peer() {} diff --git a/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp b/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp index 5603da2ba13..edd6e32aacc 100644 --- a/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp +++ b/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp @@ -18,11 +18,11 @@ ESP_NOW_Serial_Class::ESP_NOW_Serial_Class(const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface, const uint8_t *lmk, bool remove_on_fail) : ESP_NOW_Peer(mac_addr, channel, iface, lmk) { - tx_ring_buf = NULL; - rx_queue = NULL; - tx_sem = NULL; + tx_ring_buf = nullptr; + rx_queue = nullptr; + tx_sem = nullptr; queued_size = 0; - queued_buff = NULL; + queued_buff = nullptr; resend_count = 0; _remove_on_fail = remove_on_fail; } @@ -34,7 +34,7 @@ ESP_NOW_Serial_Class::~ESP_NOW_Serial_Class() { size_t ESP_NOW_Serial_Class::setTxBufferSize(size_t tx_queue_len) { if (tx_ring_buf) { vRingbufferDelete(tx_ring_buf); - tx_ring_buf = NULL; + tx_ring_buf = nullptr; } if (!tx_queue_len) { return 0; @@ -49,7 +49,7 @@ size_t ESP_NOW_Serial_Class::setTxBufferSize(size_t tx_queue_len) { size_t ESP_NOW_Serial_Class::setRxBufferSize(size_t rx_queue_len) { if (rx_queue) { vQueueDelete(rx_queue); - rx_queue = NULL; + rx_queue = nullptr; } if (!rx_queue_len) { return 0; @@ -65,7 +65,7 @@ bool ESP_NOW_Serial_Class::begin(unsigned long baud) { if (!ESP_NOW.begin() || !add()) { return false; } - if (tx_sem == NULL) { + if (tx_sem == nullptr) { tx_sem = xSemaphoreCreateBinary(); //xSemaphoreTake(tx_sem, 0); xSemaphoreGive(tx_sem); @@ -79,22 +79,22 @@ void ESP_NOW_Serial_Class::end() { remove(); setRxBufferSize(0); setTxBufferSize(0); - if (tx_sem != NULL) { + if (tx_sem != nullptr) { vSemaphoreDelete(tx_sem); - tx_sem = NULL; + tx_sem = nullptr; } } //Stream int ESP_NOW_Serial_Class::available(void) { - if (rx_queue == NULL) { + if (rx_queue == nullptr) { return 0; } return uxQueueMessagesWaiting(rx_queue); } int ESP_NOW_Serial_Class::peek(void) { - if (rx_queue == NULL) { + if (rx_queue == nullptr) { return -1; } uint8_t c; @@ -105,7 +105,7 @@ int ESP_NOW_Serial_Class::peek(void) { } int ESP_NOW_Serial_Class::read(void) { - if (rx_queue == NULL) { + if (rx_queue == nullptr) { return -1; } uint8_t c = 0; @@ -116,7 +116,7 @@ int ESP_NOW_Serial_Class::read(void) { } size_t ESP_NOW_Serial_Class::read(uint8_t *buffer, size_t size) { - if (rx_queue == NULL) { + if (rx_queue == nullptr) { return -1; } uint8_t c = 0; @@ -128,11 +128,11 @@ size_t ESP_NOW_Serial_Class::read(uint8_t *buffer, size_t size) { } void ESP_NOW_Serial_Class::flush() { - if (tx_ring_buf == NULL) { + if (tx_ring_buf == nullptr) { return; } UBaseType_t uxItemsWaiting = 0; - vRingbufferGetInfo(tx_ring_buf, NULL, NULL, NULL, NULL, &uxItemsWaiting); + vRingbufferGetInfo(tx_ring_buf, nullptr, nullptr, nullptr, nullptr, &uxItemsWaiting); if (uxItemsWaiting) { // Now trigger the ISR to read data from the ring buffer. if (xSemaphoreTake(tx_sem, 0) == pdTRUE) { @@ -141,13 +141,13 @@ void ESP_NOW_Serial_Class::flush() { } while (uxItemsWaiting) { delay(5); - vRingbufferGetInfo(tx_ring_buf, NULL, NULL, NULL, NULL, &uxItemsWaiting); + vRingbufferGetInfo(tx_ring_buf, nullptr, nullptr, nullptr, nullptr, &uxItemsWaiting); } } //RX callback void ESP_NOW_Serial_Class::onReceive(const uint8_t *data, size_t len, bool broadcast) { - if (rx_queue == NULL) { + if (rx_queue == nullptr) { return; } for (uint32_t i = 0; i < len; i++) { @@ -165,7 +165,7 @@ void ESP_NOW_Serial_Class::onReceive(const uint8_t *data, size_t len, bool broad //Print int ESP_NOW_Serial_Class::availableForWrite() { //return ESP_NOW_MAX_DATA_LEN; - if (tx_ring_buf == NULL) { + if (tx_ring_buf == nullptr) { return 0; } return xRingbufferGetCurFreeSize(tx_ring_buf); @@ -178,7 +178,7 @@ size_t ESP_NOW_Serial_Class::tryToSend() { //_onSent will not be called anymore //the data is lost in this case vRingbufferReturnItem(tx_ring_buf, queued_buff); - queued_buff = NULL; + queued_buff = nullptr; xSemaphoreGive(tx_sem); end(); } @@ -188,12 +188,12 @@ size_t ESP_NOW_Serial_Class::tryToSend() { bool ESP_NOW_Serial_Class::checkForTxData() { //do we have something that failed the last time? resend_count = 0; - if (queued_buff == NULL) { + if (queued_buff == nullptr) { queued_buff = (uint8_t *)xRingbufferReceiveUpTo(tx_ring_buf, &queued_size, 0, ESP_NOW_MAX_DATA_LEN); } else { log_d(MACSTR " : PREVIOUS", MAC2STR(addr())); } - if (queued_buff != NULL) { + if (queued_buff != nullptr) { return tryToSend() > 0; } //log_d(MACSTR ": EMPTY", MAC2STR(addr())); @@ -203,7 +203,7 @@ bool ESP_NOW_Serial_Class::checkForTxData() { size_t ESP_NOW_Serial_Class::write(const uint8_t *buffer, size_t size, uint32_t timeout) { log_v(MACSTR ", size %u", MAC2STR(addr()), size); - if (tx_sem == NULL || tx_ring_buf == NULL || !added) { + if (tx_sem == nullptr || tx_ring_buf == nullptr || !added) { return 0; } size_t space = availableForWrite(); @@ -249,12 +249,12 @@ size_t ESP_NOW_Serial_Class::write(const uint8_t *buffer, size_t size, uint32_t //TX Done Callback void ESP_NOW_Serial_Class::onSent(bool success) { log_v(MACSTR " : %s", MAC2STR(addr()), success ? "OK" : "FAIL"); - if (tx_sem == NULL || tx_ring_buf == NULL || !added) { + if (tx_sem == nullptr || tx_ring_buf == nullptr || !added) { return; } if (success) { vRingbufferReturnItem(tx_ring_buf, queued_buff); - queued_buff = NULL; + queued_buff = nullptr; //send next packet? //log_d(MACSTR ": NEXT", MAC2STR(addr())); checkForTxData(); @@ -269,7 +269,7 @@ void ESP_NOW_Serial_Class::onSent(bool success) { //resend limit reached //the data is lost in this case vRingbufferReturnItem(tx_ring_buf, queued_buff); - queued_buff = NULL; + queued_buff = nullptr; log_e(MACSTR " : RE-SEND_MAX[%u]", MAC2STR(addr()), resend_count); //if we are not able to send the data and remove_on_fail is set, remove the peer if (_remove_on_fail) { diff --git a/libraries/ESP_NOW/src/ESP32_NOW_Serial.h b/libraries/ESP_NOW/src/ESP32_NOW_Serial.h index 7cc43d85ef8..5ccb7763ec2 100644 --- a/libraries/ESP_NOW/src/ESP32_NOW_Serial.h +++ b/libraries/ESP_NOW/src/ESP32_NOW_Serial.h @@ -28,7 +28,9 @@ class ESP_NOW_Serial_Class : public Stream, public ESP_NOW_Peer { size_t tryToSend(); public: - ESP_NOW_Serial_Class(const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface = WIFI_IF_AP, const uint8_t *lmk = NULL, bool remove_on_fail = false); + ESP_NOW_Serial_Class( + const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface = WIFI_IF_AP, const uint8_t *lmk = nullptr, bool remove_on_fail = false + ); ~ESP_NOW_Serial_Class(); size_t setRxBufferSize(size_t); size_t setTxBufferSize(size_t); From 95ae8cf9c63e3045034cdbc7b642d9bd0c5148b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Andr=C3=BDsek?= Date: Mon, 23 Jun 2025 14:02:47 +0200 Subject: [PATCH 185/290] feat(test): Enhance NVS test (#11481) * feat(test): Enhance NVS test * fix(nvs): Remove unused Unity header and improve Serial wait loop * refactor(nvs): Extract string increment logic into a separate function * refactor(test): Format long strings in expect_exact calls for better readability --- tests/validation/nvs/nvs.ino | 132 +++++++++++++++++++++++++++---- tests/validation/nvs/test_nvs.py | 24 ++++-- 2 files changed, 136 insertions(+), 20 deletions(-) diff --git a/tests/validation/nvs/nvs.ino b/tests/validation/nvs/nvs.ino index 20b5b460098..12c640c65b0 100644 --- a/tests/validation/nvs/nvs.ino +++ b/tests/validation/nvs/nvs.ino @@ -1,35 +1,139 @@ +#include #include +struct TestData { + uint8_t id; + uint16_t value; +}; + Preferences preferences; +void validate_types() { + assert(preferences.getType("char") == PT_I8); + assert(preferences.getType("uchar") == PT_U8); + assert(preferences.getType("short") == PT_I16); + assert(preferences.getType("ushort") == PT_U16); + assert(preferences.getType("int") == PT_I32); + assert(preferences.getType("uint") == PT_U32); + assert(preferences.getType("long") == PT_I32); + assert(preferences.getType("ulong") == PT_U32); + assert(preferences.getType("long64") == PT_I64); + assert(preferences.getType("ulong64") == PT_U64); + assert(preferences.getType("float") == PT_BLOB); + assert(preferences.getType("double") == PT_BLOB); + assert(preferences.getType("bool") == PT_U8); + assert(preferences.getType("str") == PT_STR); + assert(preferences.getType("strLen") == PT_STR); + assert(preferences.getType("struct") == PT_BLOB); +} + +// Function to increment string values +void incrementStringValues(String &val_string, char *val_string_buf, size_t buf_size) { + // Extract the number from string and increment it + val_string = "str" + String(val_string.substring(3).toInt() + 1); + + // Extract the number from strLen and increment it + String strLen_str = String(val_string_buf); + int strLen_num = strLen_str.substring(6).toInt(); + snprintf(val_string_buf, buf_size, "strLen%d", strLen_num + 1); +} + void setup() { Serial.begin(115200); - while (!Serial) { ; } preferences.begin("my-app", false); - // Get the counter value, if the key does not exist, return a default value of 0 - unsigned int counter = preferences.getUInt("counter", 0); + // Get the preferences value and if not exists, use default parameter + char val_char = preferences.getChar("char", 'A'); + unsigned char val_uchar = preferences.getUChar("uchar", 0); + int16_t val_short = preferences.getShort("short", 0); + uint16_t val_ushort = preferences.getUShort("ushort", 0); + int32_t val_int = preferences.getInt("int", 0); + uint32_t val_uint = preferences.getUInt("uint", 0); + int64_t val_long = preferences.getLong("long", 0); + uint32_t val_ulong = preferences.getULong("ulong", 0); + int64_t val_long64 = preferences.getLong64("long64", 0); + uint64_t val_ulong64 = preferences.getULong64("ulong64", 0); + float val_float = preferences.getFloat("float", 0.0f); + double val_double = preferences.getDouble("double", 0.0); + bool val_bool = preferences.getBool("bool", false); - // Print the counter to Serial Monitor - Serial.printf("Current counter value: %u\n", counter); + // Strings + String val_string = preferences.getString("str", "str0"); + char val_string_buf[20] = "strLen0"; + preferences.getString("strLen", val_string_buf, sizeof(val_string_buf)); - // Increase counter by 1 - counter++; + // Structure data + TestData test_data = {0, 0}; - // Store the counter to the Preferences - preferences.putUInt("counter", counter); + size_t struct_size = preferences.getBytes("struct", &test_data, sizeof(test_data)); + if (struct_size == 0) { + // First time - set initial values using parameter names + test_data.id = 1; + test_data.value = 100; + } - // Close the Preferences - preferences.end(); + Serial.printf("Values from Preferences: "); + Serial.printf("char: %c | uchar: %u | short: %d | ushort: %u | int: %ld | uint: %lu | ", val_char, val_uchar, val_short, val_ushort, val_int, val_uint); + Serial.printf("long: %lld | ulong: %lu | long64: %lld | ulong64: %llu | ", val_long, val_ulong, val_long64, val_ulong64); + Serial.printf( + "float: %.2f | double: %.2f | bool: %s | str: %s | strLen: %s | struct: {id:%u,val:%u}\n", val_float, val_double, val_bool ? "true" : "false", + val_string.c_str(), val_string_buf, test_data.id, test_data.value + ); - // Wait 1 second - delay(1000); + // Increment the values + val_char += 1; // Increment char A -> B + val_uchar += 1; + val_short += 1; + val_ushort += 1; + val_int += 1; + val_uint += 1; + val_long += 1; + val_ulong += 1; + val_long64 += 1; + val_ulong64 += 1; + val_float += 1.1f; + val_double += 1.1; + val_bool = !val_bool; // Toggle boolean value + + // Increment string values using function + incrementStringValues(val_string, val_string_buf, sizeof(val_string_buf)); + + test_data.id += 1; + test_data.value += 10; + + // Store the updated values back to Preferences + preferences.putChar("char", val_char); + preferences.putUChar("uchar", val_uchar); + preferences.putShort("short", val_short); + preferences.putUShort("ushort", val_ushort); + preferences.putInt("int", val_int); + preferences.putUInt("uint", val_uint); + preferences.putLong("long", val_long); + preferences.putULong("ulong", val_ulong); + preferences.putLong64("long64", val_long64); + preferences.putULong64("ulong64", val_ulong64); + preferences.putFloat("float", val_float); + preferences.putDouble("double", val_double); + preferences.putBool("bool", val_bool); + preferences.putString("str", val_string); + preferences.putString("strLen", val_string_buf); + preferences.putBytes("struct", &test_data, sizeof(test_data)); - // Restart ESP + // Check if the keys exist + assert(preferences.isKey("char")); + assert(preferences.isKey("struct")); + + // Validate the types of the keys + validate_types(); + + // Close the Preferences, wait and restart + preferences.end(); + Serial.flush(); + delay(1000); ESP.restart(); } diff --git a/tests/validation/nvs/test_nvs.py b/tests/validation/nvs/test_nvs.py index 424095a49ba..7f595b8e93d 100644 --- a/tests/validation/nvs/test_nvs.py +++ b/tests/validation/nvs/test_nvs.py @@ -4,11 +4,23 @@ def test_nvs(dut): LOGGER = logging.getLogger(__name__) - LOGGER.info("Expecting counter value 0") - dut.expect_exact("Current counter value: 0") + LOGGER.info("Expecting default values from Preferences") + dut.expect_exact( + "Values from Preferences: char: A | uchar: 0 | short: 0 | ushort: 0 | int: 0 | uint: 0 | long: 0 | ulong: 0 | " + "long64: 0 | ulong64: 0 | float: 0.00 | double: 0.00 | bool: false | str: str0 | strLen: strLen0 | " + "struct: {id:1,val:100}" + ) - LOGGER.info("Expecting counter value 1") - dut.expect_exact("Current counter value: 1") + LOGGER.info("Expecting updated preferences for the first time") + dut.expect_exact( + "Values from Preferences: char: B | uchar: 1 | short: 1 | ushort: 1 | int: 1 | uint: 1 | long: 1 | ulong: 1 | " + "long64: 1 | ulong64: 1 | float: 1.10 | double: 1.10 | bool: true | str: str1 | strLen: strLen1 | " + "struct: {id:2,val:110}" + ) - LOGGER.info("Expecting counter value 2") - dut.expect_exact("Current counter value: 2") + LOGGER.info("Expecting updated preferences for the second time") + dut.expect_exact( + "Values from Preferences: char: C | uchar: 2 | short: 2 | ushort: 2 | int: 2 | uint: 2 | long: 2 | ulong: 2 | " + "long64: 2 | ulong64: 2 | float: 2.20 | double: 2.20 | bool: false | str: str2 | strLen: strLen2 | " + "struct: {id:3,val:120}" + ) From bad975daa5910b42b48f9f1eda6154c45eb18e6f Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Tue, 24 Jun 2025 03:37:07 -0300 Subject: [PATCH 186/290] fix(uart): removes assert() to avoid reset (#11508) --- cores/esp32/esp32-hal-uart.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index 2163e9b5f42..21fe88b57fb 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -305,7 +305,10 @@ static bool _uartTrySetIomuxPin(uart_port_t uart_num, int io_num, uint32_t idx) } // Assign the correct function to the GPIO. - assert(upin->iomux_func != -1); + if (upin->iomux_func == -1) { + log_e("IO#%d has bad IOMUX internal information. Switching to GPIO Matrix UART function.", io_num); + return false; + } if (uart_num < SOC_UART_HP_NUM) { gpio_iomux_out(io_num, upin->iomux_func, false); // If the pin is input, we also have to redirect the signal, in order to bypass the GPIO matrix. From 36d049659bcea13e4e2afb4463e7f29bc998ffa3 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 24 Jun 2025 12:30:29 +0300 Subject: [PATCH 187/290] IDF release/v5.5 (#11504) * IDF release/v5.5 4c3d086c * fix(prov): Enable BLE provisioning with NimBLE * fix(uart): idf 5.5 new gpio_iomux_* functions (#11507) * fix(uart): idf 5.5 new gpio_iomux_* functions * fix(uart): formatting and style * fix(uart): commentaries style fix * fix(uart): commentaries style fix * fix(uart): commentaries style fix * fix(uart): support to any idf 5.x version * fix(uart): changing assert in order to avoid reset * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> * IDF release/v5.5 cbe9388f --------- Co-authored-by: Sugar Glider Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- cores/esp32/esp32-hal-uart.c | 19 ++++-- .../WiFiProv/examples/WiFiProv/WiFiProv.ino | 2 +- libraries/WiFiProv/src/WiFiProv.cpp | 20 +++--- libraries/WiFiProv/src/WiFiProv.h | 4 +- package/package_esp32_index.template.json | 68 +++++++++---------- 5 files changed, 62 insertions(+), 51 deletions(-) diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index 3e33c588c3b..6e5a22da9f8 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -317,13 +317,24 @@ static bool _uartTrySetIomuxPin(uart_port_t uart_num, int io_num, uint32_t idx) } // Assign the correct function to the GPIO. - assert(upin->iomux_func != -1); + if (upin->iomux_func == -1) { + log_e("IO#%d has bad IOMUX internal information. Switching to GPIO Matrix UART function.", io_num); + return false; + } if (uart_num < SOC_UART_HP_NUM) { +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) + if (upin->input) { + gpio_iomux_input(io_num, upin->iomux_func, upin->signal); + } else { + gpio_iomux_output(io_num, upin->iomux_func); + } +#else gpio_iomux_out(io_num, upin->iomux_func, false); // If the pin is input, we also have to redirect the signal, in order to bypass the GPIO matrix. if (upin->input) { gpio_iomux_in(io_num, upin->signal); } +#endif } #if (SOC_UART_LP_NUM >= 1) && (SOC_RTCIO_PIN_COUNT >= 1) else { @@ -1276,11 +1287,11 @@ bool uartSetClockSource(uint8_t uartNum, uart_sclk_t clkSrc) { #if SOC_UART_LP_NUM >= 1 if (uart->num >= SOC_UART_HP_NUM) { switch (clkSrc) { - case UART_SCLK_XTAL: uart->_uart_clock_source = LP_UART_SCLK_XTAL_D2; break; + case UART_SCLK_XTAL: uart->_uart_clock_source = LP_UART_SCLK_XTAL_D2; break; #if CONFIG_IDF_TARGET_ESP32C5 - case UART_SCLK_RTC: uart->_uart_clock_source = LP_UART_SCLK_RC_FAST; break; + case UART_SCLK_RTC: uart->_uart_clock_source = LP_UART_SCLK_RC_FAST; break; #else - case UART_SCLK_RTC: uart->_uart_clock_source = LP_UART_SCLK_LP_FAST; break; + case UART_SCLK_RTC: uart->_uart_clock_source = LP_UART_SCLK_LP_FAST; break; #endif case UART_SCLK_DEFAULT: default: uart->_uart_clock_source = LP_UART_SCLK_DEFAULT; diff --git a/libraries/WiFiProv/examples/WiFiProv/WiFiProv.ino b/libraries/WiFiProv/examples/WiFiProv/WiFiProv.ino index 76025d75770..2f7d8c5089f 100644 --- a/libraries/WiFiProv/examples/WiFiProv/WiFiProv.ino +++ b/libraries/WiFiProv/examples/WiFiProv/WiFiProv.ino @@ -62,7 +62,7 @@ void setup() { WiFi.onEvent(SysProvEvent); // 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) +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") && !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}; diff --git a/libraries/WiFiProv/src/WiFiProv.cpp b/libraries/WiFiProv/src/WiFiProv.cpp index 31337196b5f..f372caf0e49 100644 --- a/libraries/WiFiProv/src/WiFiProv.cpp +++ b/libraries/WiFiProv/src/WiFiProv.cpp @@ -34,7 +34,7 @@ #endif #include -#if CONFIG_BLUEDROID_ENABLED +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") #include "network_provisioning/scheme_ble.h" #endif #include @@ -47,7 +47,7 @@ bool wifiLowLevelInit(bool persistent); -#if CONFIG_BLUEDROID_ENABLED +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") static const uint8_t custom_service_uuid[16] = { 0xb4, 0xdf, 0x5a, 0x1c, 0x3f, 0x6b, 0xf4, 0xbf, 0xea, 0x4a, 0x82, 0x03, 0x04, 0x90, 0x1a, 0x02, }; @@ -61,13 +61,13 @@ static void get_device_service_name(prov_scheme_t prov_scheme, char *service_nam log_e("esp_wifi_get_mac failed!"); return; } -#if CONFIG_IDF_TARGET_ESP32 && defined(CONFIG_BLUEDROID_ENABLED) +#if CONFIG_IDF_TARGET_ESP32 && (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") if (prov_scheme == NETWORK_PROV_SCHEME_BLE) { snprintf(service_name, max, "%s%02X%02X%02X", SERV_NAME_PREFIX_PROV, eth_mac[3], eth_mac[4], eth_mac[5]); } else { #endif snprintf(service_name, max, "%s%02X%02X%02X", SERV_NAME_PREFIX_PROV, eth_mac[3], eth_mac[4], eth_mac[5]); -#if CONFIG_IDF_TARGET_ESP32 && defined(CONFIG_BLUEDROID_ENABLED) +#if CONFIG_IDF_TARGET_ESP32 && (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") } #endif } @@ -78,20 +78,20 @@ void WiFiProvClass ::initProvision(prov_scheme_t prov_scheme, scheme_handler_t s return; } network_prov_mgr_config_t config; -#if CONFIG_BLUEDROID_ENABLED +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") if (prov_scheme == NETWORK_PROV_SCHEME_BLE) { config.scheme = network_prov_scheme_ble; } else { #endif config.scheme = network_prov_scheme_softap; -#if CONFIG_BLUEDROID_ENABLED +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") } if (scheme_handler == NETWORK_PROV_SCHEME_HANDLER_NONE) { #endif network_prov_event_handler_t scheme_event_handler = NETWORK_PROV_EVENT_HANDLER_NONE; memcpy(&config.scheme_event_handler, &scheme_event_handler, sizeof(network_prov_event_handler_t)); -#if CONFIG_BLUEDROID_ENABLED +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") } else if (scheme_handler == NETWORK_PROV_SCHEME_HANDLER_FREE_BTDM) { network_prov_event_handler_t scheme_event_handler = NETWORK_PROV_SCHEME_BLE_EVENT_HANDLER_FREE_BTDM; memcpy(&config.scheme_event_handler, &scheme_event_handler, sizeof(network_prov_event_handler_t)); @@ -133,7 +133,7 @@ void WiFiProvClass ::beginProvision( } static char service_name_temp[32]; if (provisioned == false) { -#if CONFIG_BLUEDROID_ENABLED +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") if (prov_scheme == NETWORK_PROV_SCHEME_BLE) { service_key = NULL; if (uuid == NULL) { @@ -148,7 +148,7 @@ void WiFiProvClass ::beginProvision( service_name = (const char *)service_name_temp; } -#if CONFIG_BLUEDROID_ENABLED +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") if (prov_scheme == NETWORK_PROV_SCHEME_BLE) { log_i("Starting AP using BLE. service_name : %s, pop : %s", service_name, pop); } else { @@ -158,7 +158,7 @@ void WiFiProvClass ::beginProvision( } else { log_i("Starting provisioning AP using SOFTAP. service_name : %s, password : %s, pop : %s", service_name, service_key, pop); } -#if CONFIG_BLUEDROID_ENABLED +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") } #endif if (network_prov_mgr_start_provisioning(security, pop, service_name, service_key) != ESP_OK) { diff --git a/libraries/WiFiProv/src/WiFiProv.h b/libraries/WiFiProv/src/WiFiProv.h index b660f8cf064..d34727b6896 100644 --- a/libraries/WiFiProv/src/WiFiProv.h +++ b/libraries/WiFiProv/src/WiFiProv.h @@ -29,7 +29,7 @@ //Select the scheme using which you want to provision typedef enum { NETWORK_PROV_SCHEME_SOFTAP, -#if CONFIG_BLUEDROID_ENABLED +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") NETWORK_PROV_SCHEME_BLE, #endif NETWORK_PROV_SCHEME_MAX @@ -37,7 +37,7 @@ typedef enum { typedef enum { NETWORK_PROV_SCHEME_HANDLER_NONE, -#if CONFIG_BLUEDROID_ENABLED +#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h") NETWORK_PROV_SCHEME_HANDLER_FREE_BTDM, NETWORK_PROV_SCHEME_HANDLER_FREE_BLE, NETWORK_PROV_SCHEME_HANDLER_FREE_BT, diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 3ae2ff09ee6..1d753792b43 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.5-28ac0243-v1" + "version": "idf-release_v5.5-cbe9388f-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.5-28ac0243-v1", + "version": "idf-release_v5.5-cbe9388f-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", - "size": "405149394" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", + "size": "421300036" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", - "size": "405149394" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", + "size": "421300036" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", - "size": "405149394" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", + "size": "421300036" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", - "size": "405149394" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", + "size": "421300036" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", - "size": "405149394" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", + "size": "421300036" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", - "size": "405149394" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", + "size": "421300036" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", - "size": "405149394" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", + "size": "421300036" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-28ac0243-v1.zip", - "checksum": "SHA-256:280401ea803d8a782c11ef4f96cfbf80eb12a0f51bd12eac9cb96d6c26489f6e", - "size": "405149394" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", + "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", + "size": "421300036" } ] }, From 882ef25a36399e3c32fc16986f00edddd3324d5a Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Mon, 23 Jun 2025 12:11:32 +0300 Subject: [PATCH 188/290] fix(p4): Update hosted and wifi_remote components --- idf_component.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/idf_component.yml b/idf_component.yml index 7f090cb26a0..450929a4067 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -105,11 +105,11 @@ dependencies: rules: - if: "target in [esp32s3]" espressif/esp_hosted: - version: "^0.0.25" + version: "^2.0.12" rules: - if: "target == esp32p4" espressif/esp_wifi_remote: - version: "^0.4.1" + version: "^0.13.0" rules: - if: "target == esp32p4" espressif/libsodium: From b7e5169ea17eabedb82171457f08f43c72bd2c5f 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, 24 Jun 2025 13:43:05 +0200 Subject: [PATCH 189/290] fix(spi): Update spi bus for esp32s2 (#11510) --- cores/esp32/esp32-hal-spi.c | 32 ++++++++++++-------------------- cores/esp32/esp32-hal-spi.h | 12 +++--------- libraries/SD/src/SD.cpp | 4 +++- libraries/SPI/src/SPI.cpp | 1 + 4 files changed, 19 insertions(+), 30 deletions(-) diff --git a/cores/esp32/esp32-hal-spi.c b/cores/esp32/esp32-hal-spi.c index 6b8e3f8c013..d39aceb5f8d 100644 --- a/cores/esp32/esp32-hal-spi.c +++ b/cores/esp32/esp32-hal-spi.c @@ -79,16 +79,15 @@ struct spi_struct_t { #if CONFIG_IDF_TARGET_ESP32S2 // ESP32S2 -#define SPI_COUNT (3) +#define SPI_COUNT (2) -#define SPI_CLK_IDX(p) ((p == 0) ? SPICLK_OUT_MUX_IDX : ((p == 1) ? FSPICLK_OUT_MUX_IDX : ((p == 2) ? SPI3_CLK_OUT_MUX_IDX : 0))) -#define SPI_MISO_IDX(p) ((p == 0) ? SPIQ_OUT_IDX : ((p == 1) ? FSPIQ_OUT_IDX : ((p == 2) ? SPI3_Q_OUT_IDX : 0))) -#define SPI_MOSI_IDX(p) ((p == 0) ? SPID_IN_IDX : ((p == 1) ? FSPID_IN_IDX : ((p == 2) ? SPI3_D_IN_IDX : 0))) +#define SPI_CLK_IDX(p) ((p == 0) ? FSPICLK_OUT_MUX_IDX : ((p == 1) ? SPI3_CLK_OUT_MUX_IDX : 0)) +#define SPI_MISO_IDX(p) ((p == 0) ? FSPIQ_OUT_IDX : ((p == 1) ? SPI3_Q_OUT_IDX : 0)) +#define SPI_MOSI_IDX(p) ((p == 0) ? FSPID_IN_IDX : ((p == 1) ? SPI3_D_IN_IDX : 0)) -#define SPI_SPI_SS_IDX(n) ((n == 0) ? SPICS0_OUT_IDX : ((n == 1) ? SPICS1_OUT_IDX : 0)) -#define SPI_HSPI_SS_IDX(n) ((n == 0) ? SPI3_CS0_OUT_IDX : ((n == 1) ? SPI3_CS1_OUT_IDX : ((n == 2) ? SPI3_CS2_OUT_IDX : SPI3_CS0_OUT_IDX))) -#define SPI_FSPI_SS_IDX(n) ((n == 0) ? FSPICS0_OUT_IDX : ((n == 1) ? FSPICS1_OUT_IDX : ((n == 2) ? FSPICS2_OUT_IDX : FSPICS0_OUT_IDX))) -#define SPI_SS_IDX(p, n) ((p == 0) ? SPI_SPI_SS_IDX(n) : ((p == 1) ? SPI_SPI_SS_IDX(n) : ((p == 2) ? SPI_HSPI_SS_IDX(n) : 0))) +#define SPI_HSPI_SS_IDX(n) ((n == 0) ? SPI3_CS0_OUT_IDX : ((n == 1) ? SPI3_CS1_OUT_IDX : ((n == 2) ? SPI3_CS2_OUT_IDX : 0))) +#define SPI_FSPI_SS_IDX(n) ((n == 0) ? FSPICS0_OUT_IDX : ((n == 1) ? FSPICS1_OUT_IDX : ((n == 2) ? FSPICS2_OUT_IDX : 0))) +#define SPI_SS_IDX(p, n) ((p == 0) ? SPI_FSPI_SS_IDX(n) : ((p == 1) ? SPI_HSPI_SS_IDX(n) : 0)) #elif CONFIG_IDF_TARGET_ESP32S3 // ESP32S3 @@ -98,8 +97,8 @@ struct spi_struct_t { #define SPI_MISO_IDX(p) ((p == 0) ? FSPIQ_OUT_IDX : ((p == 1) ? SPI3_Q_OUT_IDX : 0)) #define SPI_MOSI_IDX(p) ((p == 0) ? FSPID_IN_IDX : ((p == 1) ? SPI3_D_IN_IDX : 0)) -#define SPI_HSPI_SS_IDX(n) ((n == 0) ? SPI3_CS0_OUT_IDX : ((n == 1) ? SPI3_CS1_OUT_IDX : 0)) -#define SPI_FSPI_SS_IDX(n) ((n == 0) ? FSPICS0_OUT_IDX : ((n == 1) ? FSPICS1_OUT_IDX : 0)) +#define SPI_HSPI_SS_IDX(n) ((n == 0) ? SPI3_CS0_OUT_IDX : ((n == 1) ? SPI3_CS1_OUT_IDX : ((n == 2) ? SPI3_CS2_OUT_IDX : 0))) +#define SPI_FSPI_SS_IDX(n) ((n == 0) ? FSPICS0_OUT_IDX : ((n == 1) ? FSPICS1_OUT_IDX : ((n == 2) ? FSPICS2_OUT_IDX : 0))) #define SPI_SS_IDX(p, n) ((p == 0) ? SPI_FSPI_SS_IDX(n) : ((p == 1) ? SPI_HSPI_SS_IDX(n) : 0)) #elif CONFIG_IDF_TARGET_ESP32P4 @@ -151,11 +150,7 @@ struct spi_struct_t { #define SPI_MUTEX_UNLOCK() // clang-format off static spi_t _spi_bus_array[] = { -#if CONFIG_IDF_TARGET_ESP32S2 - {(volatile spi_dev_t *)(DR_REG_SPI1_BASE), 0, -1, -1, -1, -1, false}, - {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 1, -1, -1, -1, -1, false}, - {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), 2, -1, -1, -1, -1, false} -#elif CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32S2 ||CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4 {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1, false}, {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), 1, -1, -1, -1, -1, false} #elif CONFIG_IDF_TARGET_ESP32C2 @@ -179,11 +174,7 @@ static spi_t _spi_bus_array[] = { #define SPI_MUTEX_UNLOCK() xSemaphoreGive(spi->lock) static spi_t _spi_bus_array[] = { -#if CONFIG_IDF_TARGET_ESP32S2 - {(volatile spi_dev_t *)(DR_REG_SPI1_BASE), NULL, 0, -1, -1, -1, -1, false}, - {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 1, -1, -1, -1, -1, false}, - {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), NULL, 2, -1, -1, -1, -1, false} -#elif CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4 +#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4 {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1, false}, {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), NULL, 1, -1, -1, -1, -1, false} #elif CONFIG_IDF_TARGET_ESP32C2 {(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1, false} @@ -621,6 +612,7 @@ void spiStopBus(spi_t *spi) { spi_t *spiStartBus(uint8_t spi_num, uint32_t clockDiv, uint8_t dataMode, uint8_t bitOrder) { if (spi_num >= SPI_COUNT) { + log_e("SPI bus index %d is out of range", spi_num); return NULL; } diff --git a/cores/esp32/esp32-hal-spi.h b/cores/esp32/esp32-hal-spi.h index 565ca43f60d..0284fea8829 100644 --- a/cores/esp32/esp32-hal-spi.h +++ b/cores/esp32/esp32-hal-spi.h @@ -27,19 +27,13 @@ extern "C" { #include #define SPI_HAS_TRANSACTION - -#ifdef CONFIG_IDF_TARGET_ESP32S2 -#define FSPI 1 //SPI 1 bus. ESP32S2: for external memory only (can use the same data lines but different SS) -#define HSPI 2 //SPI 2 bus. ESP32S2: external memory or device - it can be matrixed to any pins -#define SPI2 2 // Another name for ESP32S2 SPI 2 -#define SPI3 3 //SPI 3 bus. ESP32S2: device only - it can be matrixed to any pins -#elif CONFIG_IDF_TARGET_ESP32 +#ifdef CONFIG_IDF_TARGET_ESP32 #define FSPI 1 //SPI 1 bus attached to the flash (can use the same data lines but different SS) #define HSPI 2 //SPI 2 bus normally mapped to pins 12 - 15, but can be matrixed to any pins #define VSPI 3 //SPI 3 bus normally attached to pins 5, 18, 19 and 23, but can be matrixed to any pins #else -#define FSPI 0 // ESP32C2, C3, C6, H2, S3, P4 - SPI 2 bus -#define HSPI 1 // ESP32S3, P4 - SPI 3 bus +#define FSPI 0 // ESP32C2, C3, C6, H2, S2, S3, P4 - SPI 2 bus +#define HSPI 1 // ESP32S2, S3, P4 - SPI 3 bus #endif // This defines are not representing the real Divider of the ESP32 diff --git a/libraries/SD/src/SD.cpp b/libraries/SD/src/SD.cpp index eaec2483053..2d646276d87 100644 --- a/libraries/SD/src/SD.cpp +++ b/libraries/SD/src/SD.cpp @@ -27,7 +27,9 @@ bool SDFS::begin(uint8_t ssPin, SPIClass &spi, uint32_t frequency, const char *m return true; } - spi.begin(); + if (!spi.begin()) { + return false; + } _pdrv = sdcard_init(ssPin, &spi, frequency); if (_pdrv == 0xFF) { diff --git a/libraries/SPI/src/SPI.cpp b/libraries/SPI/src/SPI.cpp index c0d7665df03..7d8d44320a6 100644 --- a/libraries/SPI/src/SPI.cpp +++ b/libraries/SPI/src/SPI.cpp @@ -74,6 +74,7 @@ bool SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss) { _spi = spiStartBus(_spi_num, _div, SPI_MODE0, SPI_MSBFIRST); if (!_spi) { + log_e("SPI bus %d start failed.", _spi_num); return false; } From 30fb3cbb4f2eb749863f39a040601df3decd87a5 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 24 Jun 2025 08:43:27 -0300 Subject: [PATCH 190/290] fix(docs): Fix links and versions (#11505) * fix(docs): Fix links and versions * fix(docs): Apply suggestions and leftover substitutions --- docs/conf_common.py | 7 +++++++ docs/en/contributing.rst | 4 ++-- docs/en/esp-idf_component.rst | 10 ++++++---- docs/en/guides/docs_contributing.rst | 13 +++++-------- docs/en/index.rst | 1 + docs/en/lib_builder.rst | 16 ++++++++++------ docs/requirements.txt | 2 ++ 7 files changed, 33 insertions(+), 20 deletions(-) diff --git a/docs/conf_common.py b/docs/conf_common.py index 676cca899d5..6945c0d190d 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -2,6 +2,12 @@ from esp_docs.conf_docs import * # noqa: F403,F401 +# Used for substituting variables in the documentation +rst_prolog = """ +.. |version| replace:: 3.2.0 +.. |idf_version| replace:: 5.4 +""" + languages = ["en"] # idf_targets = [ @@ -27,6 +33,7 @@ extensions += [ # noqa: F405 "sphinx_copybutton", "sphinx_tabs.tabs", + "sphinx_substitution_extensions", # For allowing substitutions inside code blocks "esp_docs.esp_extensions.dummy_build_system", ] diff --git a/docs/en/contributing.rst b/docs/en/contributing.rst index 4ebe01cbf5b..7a7b99894eb 100644 --- a/docs/en/contributing.rst +++ b/docs/en/contributing.rst @@ -222,7 +222,7 @@ Documentation ------------- If you are contributing to the documentation, please follow the instructions described in the -`documentation guidelines `_ to properly format and test your changes. +`documentation guidelines `_ to properly format and test your changes. Testing and CI -------------- @@ -435,7 +435,7 @@ Documentation Checks ^^^^^^^^^^^^^^^^^^^^ The CI also checks the documentation for any compilation errors. This is important to ensure that the documentation layout is not broken. -To build the documentation locally, please refer to the `documentation guidelines `_. +To build the documentation locally, please refer to the `documentation guidelines `_. Code Style Checks ^^^^^^^^^^^^^^^^^ diff --git a/docs/en/esp-idf_component.rst b/docs/en/esp-idf_component.rst index f38dc44ec0c..13542cc3c87 100644 --- a/docs/en/esp-idf_component.rst +++ b/docs/en/esp-idf_component.rst @@ -14,9 +14,9 @@ For a simplified method, see `Installing using Boards Manager `_. -.. note:: Latest Arduino Core ESP32 version (3.0.X) is now compatible with `ESP-IDF v5.1 `_. Please consider this compatibility when using Arduino as a component in ESP-IDF. +.. note:: Latest Arduino Core ESP32 version (|version|) is now compatible with ESP-IDF v\ |idf_version|\ . Please consider this compatibility when using Arduino as a component in ESP-IDF. -For easiest use of Arduino framework as a ESP-IDF component, you can use the `IDF Component Manager `_ to add the Arduino component to your project. +For easiest use of Arduino framework as a ESP-IDF component, you can use the `IDF Component Manager `_ to add the Arduino component to your project. This will automatically clone the repository and its submodules. You can find the Arduino component in the `ESP Registry `_ together with dependencies list and examples. Installation @@ -32,14 +32,16 @@ Installing using IDF Component Manager To add the Arduino component to your project using the IDF Component Manager, run the following command in your project directory: .. code-block:: bash + :substitutions: - idf.py add-dependency "espressif/arduino-esp32^3.0.2" + idf.py add-dependency "espressif/arduino-esp32^|version|" Or you can start a new project from a template with the Arduino component: .. code-block:: bash + :substitutions: - idf.py create-project-from-example "espressif/arduino-esp32^3.0.2:hello_world" + idf.py create-project-from-example "espressif/arduino-esp32^|version|:hello_world" Manual installation of Arduino framework **************************************** diff --git a/docs/en/guides/docs_contributing.rst b/docs/en/guides/docs_contributing.rst index 20dc4c84cab..13f08c47618 100644 --- a/docs/en/guides/docs_contributing.rst +++ b/docs/en/guides/docs_contributing.rst @@ -49,11 +49,11 @@ Before starting your collaboration, you need to get the documentation source cod Requirements ************ -To properly work with the documentation, you need to install some packages in your system. +To build the documentation properly, you need to install some packages in your system. Note that depending on +your system, you may need to use a virtual environment to install the packages. .. code-block:: - pip install -U Sphinx pip install -r requirements.txt The requirements file is under the ``docs`` folder. @@ -62,17 +62,14 @@ Using Visual Studio Code ************************ If you are using the Visual Studio Code, you can install some extensions to help you while writing documentation. +For reStructuredText, you can install the `reStructuredText Pack `_ extension. -`reStructuredText Pack `_ - -We also recommend you install to grammar check extension to help you to review English grammar. - -`Grammarly `_ +We also recommend you to install some grammar check extension to help you to review English grammar. Building ******** -To build the documentation and generate the HTML files, you can use the following command inside the ``docs`` folder. After a successful build, you can check the files inside the `_build/en/generic/html` folder. +To build the documentation and generate the HTML files, you can use the following command inside the ``docs`` folder. After a successful build, you can check the files inside the ``_build/en/generic/html`` folder. .. code-block:: diff --git a/docs/en/index.rst b/docs/en/index.rst index 1314a8fc78d..89fc7e3bd6e 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -3,6 +3,7 @@ Welcome to ESP32 Arduino Core's documentation ############################################# Here you will find all the relevant information about the project. +This documentation is valid for the Arduino Core for ESP32 version |version| based on ESP-IDF |idf_version|. .. note:: This is a work in progress documentation and we will appreciate your help! We are looking for contributors! diff --git a/docs/en/lib_builder.rst b/docs/en/lib_builder.rst index e7edb331fd3..a8126c18edc 100644 --- a/docs/en/lib_builder.rst +++ b/docs/en/lib_builder.rst @@ -293,8 +293,9 @@ You have two options to run the Docker image to build the libraries. Manually or To run the Docker image manually, use the following command from the root of the ``arduino-esp32`` repository: .. code-block:: bash + :substitutions: - docker run --rm -it -v $PWD:/arduino-esp32 -e TERM=xterm-256color espressif/esp32-arduino-lib-builder:release-v5.1 + docker run --rm -it -v $PWD:/arduino-esp32 -e TERM=xterm-256color espressif/esp32-arduino-lib-builder:release-v|idf_version| This will start the Lib Builder UI for compiling the libraries. The above command explained: @@ -304,7 +305,7 @@ This will start the Lib Builder UI for compiling the libraries. The above comman - ``-t`` Allocate a pseudo-TTY; - ``-e TERM=xterm-256color``: Optional. Sets the terminal type to ``xterm-256color`` to display colors correctly; - ``-v $PWD:/arduino-esp32``: Optional. Mounts the current folder at ``/arduino-esp32`` inside the container. If not provided, the container will not copy the compiled libraries to the host machine; -- ``espressif/esp32-arduino-lib-builder:release-v5.1``: uses Docker image ``espressif/esp32-arduino-lib-builder`` with tag ``release-v5.1``. +- :substitution-code:`espressif/esp32-arduino-lib-builder:release-v|idf_version|`: uses Docker image ``espressif/esp32-arduino-lib-builder`` with tag :substitution-code:`release-v|idf_version|`. The ``latest`` tag is implicitly added by Docker when no tag is specified. It is recommended to use a specific version tag to ensure reproducibility of the build process. .. warning:: @@ -324,24 +325,27 @@ By default the docker container will run the user interface script. If you want For example, to run a terminal inside the container, you can run: .. code-block:: bash + :substitutions: - docker run -it espressif/esp32-arduino-lib-builder:release-v5.1 /bin/bash + docker run -it espressif/esp32-arduino-lib-builder:release-v|idf_version| /bin/bash Running the Docker image using the provided run script will depend on the host OS. Use the following command from the root of the ``arduino-esp32`` repository to execute the image in a Linux or macOS environment for -the ``release-v5.1`` tag: +the :substitution-code:`release-v|idf_version|` tag: .. code-block:: bash + :substitutions: - curl -LJO https://raw.githubusercontent.com/espressif/esp32-arduino-lib-builder/refs/heads/release/v5.1/tools/docker/run.sh + curl -LJO https://raw.githubusercontent.com/espressif/esp32-arduino-lib-builder/refs/heads/release/v|idf_version|/tools/docker/run.sh chmod +x run.sh ./run.sh $PWD For Windows, use the following command in PowerShell from the root of the ``arduino-esp32`` repository: .. code-block:: powershell + :substitutions: - Invoke-WebRequest -Uri "https://raw.githubusercontent.com/espressif/esp32-arduino-lib-builder/refs/heads/release/v5.1/tools/docker/run.ps1" -OutFile "run.ps1" + Invoke-WebRequest -Uri "https://raw.githubusercontent.com/espressif/esp32-arduino-lib-builder/refs/heads/release/v|idf_version|/tools/docker/run.ps1" -OutFile "run.ps1" .\run.ps1 $pwd As the script is unsigned, you may need to change the execution policy of the current session before running the script. diff --git a/docs/requirements.txt b/docs/requirements.txt index d3017fb5adc..ef2ab88cb65 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,7 @@ +sphinx==4.5.0 esp-docs>=1.4.0 sphinx-copybutton==0.5.0 sphinx-tabs==3.2.0 numpydoc==1.5.0 standard-imghdr==3.13.0 +Sphinx-Substitution-Extensions==2022.2.16 From e9b0930f9dd1fb2e1df28c7156fa7892e4306b66 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, 24 Jun 2025 14:34:17 +0200 Subject: [PATCH 191/290] ci(sizes): Update sizes workflow action --- .github/workflows/publishsizes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publishsizes.yml b/.github/workflows/publishsizes.yml index 8ff591e052b..f3c401d635c 100644 --- a/.github/workflows/publishsizes.yml +++ b/.github/workflows/publishsizes.yml @@ -66,7 +66,7 @@ jobs: path: ./artifacts/sizes-report/pr_num.txt - name: Report results - uses: P-R-O-C-H-Y/report-size-deltas@2043188c68f483a7b50527c4eacf609d05bb67a5 # sizes_v2 + uses: P-R-O-C-H-Y/report-size-deltas@sizes_v2 #2043188c68f483a7b50527c4eacf609d05bb67a5 # sizes_v2 with: sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }} github-token: ${{ env.GITHUB_TOKEN }} From 0213200b3d66cae7849623dc6551503346228de3 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, 24 Jun 2025 14:40:53 +0200 Subject: [PATCH 192/290] ci(sizes): Use commit id in report-size-delta action --- .github/workflows/publishsizes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publishsizes.yml b/.github/workflows/publishsizes.yml index f3c401d635c..fad2418668c 100644 --- a/.github/workflows/publishsizes.yml +++ b/.github/workflows/publishsizes.yml @@ -66,7 +66,7 @@ jobs: path: ./artifacts/sizes-report/pr_num.txt - name: Report results - uses: P-R-O-C-H-Y/report-size-deltas@sizes_v2 #2043188c68f483a7b50527c4eacf609d05bb67a5 # sizes_v2 + uses: P-R-O-C-H-Y/report-size-deltas@bea91d2c99ca80c88a883b39b1c4012f00ec3d09 # sizes_v2 with: sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }} github-token: ${{ env.GITHUB_TOKEN }} From 9e61fa7e4bce59c05cb17c15b11b53b9bafca077 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 24 Jun 2025 17:23:50 +0300 Subject: [PATCH 193/290] IDF release/v5.4 (#11512) * IDF release/v5.4 f0f2980d * fix(p4): Allow custom pins on P4 for ESP-Hosted --- libraries/WiFi/src/WiFiGeneric.cpp | 12 +++- package/package_esp32_index.template.json | 68 +++++++++++------------ 2 files changed, 45 insertions(+), 35 deletions(-) diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index 3faf34fef34..bddcb5fd448 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -252,13 +252,23 @@ static bool wifiHostedInit() { if (!hosted_initialized) { hosted_initialized = true; struct esp_hosted_sdio_config conf = INIT_DEFAULT_HOST_SDIO_CONFIG(); +#ifdef BOARD_HAS_SDIO_ESP_HOSTED + conf.pin_clk.pin = BOARD_SDIO_ESP_HOSTED_CLK; + conf.pin_cmd.pin = BOARD_SDIO_ESP_HOSTED_CMD; + conf.pin_d0.pin = BOARD_SDIO_ESP_HOSTED_D0; + conf.pin_d1.pin = BOARD_SDIO_ESP_HOSTED_D1; + conf.pin_d2.pin = BOARD_SDIO_ESP_HOSTED_D2; + conf.pin_d3.pin = BOARD_SDIO_ESP_HOSTED_D3; + conf.pin_reset.pin = BOARD_SDIO_ESP_HOSTED_RESET; +#else conf.pin_clk.pin = CONFIG_ESP_SDIO_PIN_CLK; conf.pin_cmd.pin = CONFIG_ESP_SDIO_PIN_CMD; conf.pin_d0.pin = CONFIG_ESP_SDIO_PIN_D0; conf.pin_d1.pin = CONFIG_ESP_SDIO_PIN_D1; conf.pin_d2.pin = CONFIG_ESP_SDIO_PIN_D2; conf.pin_d3.pin = CONFIG_ESP_SDIO_PIN_D3; - //conf.pin_rst.pin = CONFIG_ESP_SDIO_GPIO_RESET_SLAVE; + conf.pin_reset.pin = CONFIG_ESP_SDIO_GPIO_RESET_SLAVE; +#endif // esp_hosted_sdio_set_config() will fail on second attempt but here temporarily to not cause exception on reinit if (esp_hosted_sdio_set_config(&conf) != ESP_OK || esp_hosted_init() != ESP_OK) { log_e("esp_hosted_init failed!"); diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 22d3cc05455..9c1516dbacd 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-aed8bdc8-v1" + "version": "idf-release_v5.4-f0f2980d-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-aed8bdc8-v1", + "version": "idf-release_v5.4-f0f2980d-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", - "size": "353758763" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", + "size": "353978504" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", - "size": "353758763" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", + "size": "353978504" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", - "size": "353758763" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", + "size": "353978504" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", - "size": "353758763" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", + "size": "353978504" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", - "size": "353758763" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", + "size": "353978504" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", - "size": "353758763" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", + "size": "353978504" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", - "size": "353758763" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", + "size": "353978504" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-aed8bdc8-v1.zip", - "checksum": "SHA-256:448691c3171f79b2136e4ab8006e9c78bd1627156dab1365fff8f8867a6a7e5b", - "size": "353758763" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", + "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", + "size": "353978504" } ] }, From 21640ac82a1bb5efa8cf0b3841be1ac80add6785 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Thu, 26 Jun 2025 12:43:50 +0300 Subject: [PATCH 194/290] fix(webserver): Validate header inputs --- libraries/WebServer/src/WebServer.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libraries/WebServer/src/WebServer.cpp b/libraries/WebServer/src/WebServer.cpp index 652a86f587f..7523e40259b 100644 --- a/libraries/WebServer/src/WebServer.cpp +++ b/libraries/WebServer/src/WebServer.cpp @@ -502,6 +502,16 @@ void WebServer::stop() { } void WebServer::sendHeader(const String &name, const String &value, bool first) { + if (name.indexOf('\r') != -1 || name.indexOf('\n') != -1) { + log_e("Invalid character in HTTP header name"); + return; + } + + if (value.indexOf('\r') != -1 || value.indexOf('\n') != -1) { + log_e("Invalid character in HTTP header value"); + return; + } + RequestArgument *header = new RequestArgument(); header->key = name; header->value = value; From 875b92303510dca333620aa88140a993275d28fd Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 30 Jun 2025 05:50:17 -0300 Subject: [PATCH 195/290] ci(ext_lib): Skip P4 in ArduinoBLE test (#11520) --- .github/workflows/lib.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/lib.json b/.github/workflows/lib.json index 5b93d6689ef..f1ff111d25b 100644 --- a/.github/workflows/lib.json +++ b/.github/workflows/lib.json @@ -9,7 +9,8 @@ { "name": "ArduinoBLE", "exclude_targets": [ - "esp32s2" + "esp32s2", + "esp32p4" ], "sketch_path": [ "~/Arduino/libraries/ArduinoBLE/examples/Central/Scan/Scan.ino" From 9a35d9455f23f0f7055fbc6afb6845979f27cb04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Andr=C3=BDsek?= Date: Mon, 30 Jun 2025 10:50:49 +0200 Subject: [PATCH 196/290] feat(SDFS): Add destructor for SD card to clean up resources (#11521) * feat(test): Enhance NVS test * fix(nvs): Remove unused Unity header and improve Serial wait loop * refactor(nvs): Extract string increment logic into a separate function * refactor(test): Format long strings in expect_exact calls for better readability * feat(SDFS): Add destructor to clean up resources --- libraries/SD/src/SD.cpp | 4 ++++ libraries/SD/src/SD.h | 1 + 2 files changed, 5 insertions(+) diff --git a/libraries/SD/src/SD.cpp b/libraries/SD/src/SD.cpp index 2d646276d87..077a7c1121f 100644 --- a/libraries/SD/src/SD.cpp +++ b/libraries/SD/src/SD.cpp @@ -22,6 +22,10 @@ using namespace fs; SDFS::SDFS(FSImplPtr impl) : FS(impl), _pdrv(0xFF) {} +SDFS::~SDFS() { + end(); +} + bool SDFS::begin(uint8_t ssPin, SPIClass &spi, uint32_t frequency, const char *mountpoint, uint8_t max_files, bool format_if_empty) { if (_pdrv != 0xFF) { return true; diff --git a/libraries/SD/src/SD.h b/libraries/SD/src/SD.h index aebc781a5e3..d8252ee44f7 100644 --- a/libraries/SD/src/SD.h +++ b/libraries/SD/src/SD.h @@ -26,6 +26,7 @@ class SDFS : public FS { public: SDFS(FSImplPtr impl); + ~SDFS(); bool begin( uint8_t ssPin = SS, SPIClass &spi = SPI, uint32_t frequency = 4000000, const char *mountpoint = "/sd", uint8_t max_files = 5, bool format_if_empty = false ); From 6754b1962c791de6c0a06120c42ad7f248600703 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 30 Jun 2025 06:02:12 -0300 Subject: [PATCH 197/290] feat(esp_now): Add support for ESP NOW V2 (#11524) * feat(esp_now): Add support for ESP NOW V2 * fix(esp_now): Return -1 on error --- .../ESP_NOW_Broadcast_Master.ino | 2 + .../ESP_NOW_Broadcast_Slave.ino | 2 + .../ESP_NOW_Network/ESP_NOW_Network.ino | 9 ++- .../ESP_NOW_Serial/ESP_NOW_Serial.ino | 1 + libraries/ESP_NOW/src/ESP32_NOW.cpp | 65 ++++++++++++++++--- libraries/ESP_NOW/src/ESP32_NOW.h | 10 ++- libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp | 24 +++++-- 7 files changed, 98 insertions(+), 15 deletions(-) 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 025a53c913b..7b71c0e432d 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 @@ -86,6 +86,8 @@ void setup() { ESP.restart(); } + Serial.printf("ESP-NOW version: %d, max data length: %d\n", ESP_NOW.getVersion(), ESP_NOW.getMaxDataLen()); + Serial.println("Setup complete. Broadcasting messages every 5 seconds."); } 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 e61524b64f9..ca0ece2fff8 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 @@ -104,6 +104,8 @@ void setup() { ESP.restart(); } + Serial.printf("ESP-NOW version: %d, max data length: %d\n", ESP_NOW.getVersion(), ESP_NOW.getMaxDataLen()); + // Register the new peer callback ESP_NOW.onNewPeer(register_new_master, nullptr); 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 6731340c922..d30d6cd40cf 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 @@ -75,7 +75,12 @@ // The following struct is used to send data to the peer device. // We use the attribute "packed" to ensure that the struct is not padded (all data // is contiguous in the memory and without gaps). -// The maximum size of the complete message is 250 bytes (ESP_NOW_MAX_DATA_LEN). +// The maximum size of the payload is 250 bytes (ESP_NOW_MAX_DATA_LEN) for ESP-NOW v1.0. +// For ESP-NOW v2.0, the maximum size of the payload is 1470 bytes (ESP_NOW_MAX_DATA_LEN_V2). +// You can use ESP_NOW.getMaxDataLen() after calling ESP_NOW.begin() to get the maximum size +// of the data that can be sent. +// Read about the compatibility between ESP-NOW v1.0 and v2.0 in the ESP-IDF documentation: +// https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html#frame-format typedef struct { uint32_t count; @@ -276,6 +281,8 @@ void setup() { fail_reboot(); } + Serial.printf("ESP-NOW version: %d, max data length: %d\n", ESP_NOW.getVersion(), ESP_NOW.getMaxDataLen()); + if (!broadcast_peer.begin()) { Serial.println("Failed to initialize broadcast peer"); fail_reboot(); diff --git a/libraries/ESP_NOW/examples/ESP_NOW_Serial/ESP_NOW_Serial.ino b/libraries/ESP_NOW/examples/ESP_NOW_Serial/ESP_NOW_Serial.ino index e1f28382fe2..2a5406cd844 100644 --- a/libraries/ESP_NOW/examples/ESP_NOW_Serial/ESP_NOW_Serial.ino +++ b/libraries/ESP_NOW/examples/ESP_NOW_Serial/ESP_NOW_Serial.ino @@ -64,6 +64,7 @@ void setup() { // Start the ESP-NOW communication Serial.println("ESP-NOW communication starting..."); NowSerial.begin(115200); + Serial.printf("ESP-NOW version: %d, max data length: %d\n", ESP_NOW.getVersion(), ESP_NOW.getMaxDataLen()); Serial.println("You can now send data to the peer device using the Serial Monitor.\n"); } diff --git a/libraries/ESP_NOW/src/ESP32_NOW.cpp b/libraries/ESP_NOW/src/ESP32_NOW.cpp index 25a5609e8db..b5cdc3f3da7 100644 --- a/libraries/ESP_NOW/src/ESP32_NOW.cpp +++ b/libraries/ESP_NOW/src/ESP32_NOW.cpp @@ -140,7 +140,10 @@ static void _esp_now_tx_cb(const uint8_t *mac_addr, esp_now_send_status_t status } } -ESP_NOW_Class::ESP_NOW_Class() {} +ESP_NOW_Class::ESP_NOW_Class() { + max_data_len = 0; + version = 0; +} ESP_NOW_Class::~ESP_NOW_Class() {} @@ -155,6 +158,23 @@ bool ESP_NOW_Class::begin(const uint8_t *pmk) { return false; } + // Unfortunately we can't get the ESP-NOW version before initializing the Wi-Fi + uint32_t esp_now_version; + err = esp_now_get_version(&esp_now_version); + if (err != ESP_OK) { + log_w("esp_now_get_version failed! Assuming ESP-NOW v1.0"); + esp_now_version = 1; + } + + if (esp_now_version == 1) { + max_data_len = ESP_NOW_MAX_DATA_LEN; + } else { + max_data_len = ESP_NOW_MAX_DATA_LEN_V2; + } + + version = esp_now_version; + log_i("ESP-NOW version: %lu, max_data_len: %lu", version, max_data_len); + _esp_now_has_begun = true; memset(_esp_now_peers, 0, sizeof(ESP_NOW_Peer *) * ESP_NOW_MAX_TOTAL_PEER_NUM); @@ -212,7 +232,7 @@ bool ESP_NOW_Class::end() { return true; } -int ESP_NOW_Class::getTotalPeerCount() { +int ESP_NOW_Class::getTotalPeerCount() const { if (!_esp_now_has_begun) { return -1; } @@ -225,7 +245,7 @@ int ESP_NOW_Class::getTotalPeerCount() { return num.total_num; } -int ESP_NOW_Class::getEncryptedPeerCount() { +int ESP_NOW_Class::getEncryptedPeerCount() const { if (!_esp_now_has_begun) { return -1; } @@ -238,16 +258,38 @@ int ESP_NOW_Class::getEncryptedPeerCount() { return num.encrypt_num; } +int ESP_NOW_Class::getMaxDataLen() const { + if (max_data_len == 0) { + log_e("ESP-NOW not initialized. Please call begin() first to get the max data length."); + return -1; + } + + return max_data_len; +} + +int ESP_NOW_Class::getVersion() const { + if (version == 0) { + log_e("ESP-NOW not initialized. Please call begin() first to get the version."); + return -1; + } + + return version; +} + int ESP_NOW_Class::availableForWrite() { - return ESP_NOW_MAX_DATA_LEN; + int available = getMaxDataLen(); + if (available < 0) { + return 0; + } + return available; } size_t ESP_NOW_Class::write(const uint8_t *data, size_t len) { if (!_esp_now_has_begun) { return 0; } - if (len > ESP_NOW_MAX_DATA_LEN) { - len = ESP_NOW_MAX_DATA_LEN; + if (len > max_data_len) { + len = max_data_len; } esp_err_t result = esp_now_send(nullptr, data, len); if (result == ESP_OK) { @@ -386,8 +428,15 @@ size_t ESP_NOW_Peer::send(const uint8_t *data, int len) { log_e("Peer not added."); return 0; } - if (len > ESP_NOW_MAX_DATA_LEN) { - len = ESP_NOW_MAX_DATA_LEN; + + int max_data_len = ESP_NOW.getMaxDataLen(); + if (max_data_len < 0) { + log_e("Error getting max data length."); + return 0; + } + + if (len > max_data_len) { + len = max_data_len; } esp_err_t result = esp_now_send(mac, data, len); if (result == ESP_OK) { diff --git a/libraries/ESP_NOW/src/ESP32_NOW.h b/libraries/ESP_NOW/src/ESP32_NOW.h index 5940cfa2221..5b5bbe72673 100644 --- a/libraries/ESP_NOW/src/ESP32_NOW.h +++ b/libraries/ESP_NOW/src/ESP32_NOW.h @@ -23,8 +23,10 @@ class ESP_NOW_Class : public Print { bool begin(const uint8_t *pmk = nullptr /* 16 bytes */); bool end(); - int getTotalPeerCount(); - int getEncryptedPeerCount(); + int getTotalPeerCount() const; + int getEncryptedPeerCount() const; + int getMaxDataLen() const; + int getVersion() const; int availableForWrite(); size_t write(const uint8_t *data, size_t len); @@ -34,6 +36,10 @@ class ESP_NOW_Class : public Print { void onNewPeer(void (*cb)(const esp_now_recv_info_t *info, const uint8_t *data, int len, void *arg), void *arg); bool removePeer(ESP_NOW_Peer &peer); + +protected: + size_t max_data_len; + uint32_t version; }; class ESP_NOW_Peer { diff --git a/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp b/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp index edd6e32aacc..c86c8546c5b 100644 --- a/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp +++ b/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp @@ -70,8 +70,25 @@ bool ESP_NOW_Serial_Class::begin(unsigned long baud) { //xSemaphoreTake(tx_sem, 0); xSemaphoreGive(tx_sem); } - setRxBufferSize(1024); //default if not preset - setTxBufferSize(1024); //default if not preset + + size_t buf_size = 0; + if (ESP_NOW.getVersion() == 2) { + // ESP-NOW v2.0 has a larger maximum data length, so we need to increase the buffer sizes + // to hold around 3-4 packets + buf_size = setRxBufferSize(4096); + buf_size &= setTxBufferSize(4096); + } else { + // ESP-NOW v1.0 has a smaller maximum data length, so we can use the default buffer sizes + // to hold around 3-4 packets + buf_size = setRxBufferSize(1024); + buf_size &= setTxBufferSize(1024); + } + + if (buf_size == 0) { + log_e("Failed to set buffer size"); + return false; + } + return true; } @@ -164,7 +181,6 @@ void ESP_NOW_Serial_Class::onReceive(const uint8_t *data, size_t len, bool broad //Print int ESP_NOW_Serial_Class::availableForWrite() { - //return ESP_NOW_MAX_DATA_LEN; if (tx_ring_buf == nullptr) { return 0; } @@ -189,7 +205,7 @@ bool ESP_NOW_Serial_Class::checkForTxData() { //do we have something that failed the last time? resend_count = 0; if (queued_buff == nullptr) { - queued_buff = (uint8_t *)xRingbufferReceiveUpTo(tx_ring_buf, &queued_size, 0, ESP_NOW_MAX_DATA_LEN); + queued_buff = (uint8_t *)xRingbufferReceiveUpTo(tx_ring_buf, &queued_size, 0, ESP_NOW.getMaxDataLen()); } else { log_d(MACSTR " : PREVIOUS", MAC2STR(addr())); } From 6476260e8fc8759e96a9c4cbff499436e421b2cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Sch=C3=A4ffersmann?= <117294155+MattiasTF@users.noreply.github.com> Date: Mon, 30 Jun 2025 12:04:11 +0200 Subject: [PATCH 198/290] fix(esp32): Fix appending to Strings longer than 64k (#11523) If oldLen is truncated to uint16_t, appending to a String that is longer than 65535 bytes will create a broken string. --- cores/esp32/WString.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cores/esp32/WString.cpp b/cores/esp32/WString.cpp index 18e64767545..6632aa5f85d 100644 --- a/cores/esp32/WString.cpp +++ b/cores/esp32/WString.cpp @@ -180,7 +180,7 @@ bool String::changeBuffer(unsigned int maxStrLen) { if (maxStrLen < sizeof(sso.buff) - 1) { if (isSSO() || !buffer()) { // Already using SSO, nothing to do - uint16_t oldLen = len(); + size_t oldLen = len(); setSSO(true); setLen(oldLen); } else { // if bufptr && !isSSO() @@ -188,7 +188,7 @@ bool String::changeBuffer(unsigned int maxStrLen) { char temp[sizeof(sso.buff)]; memcpy(temp, buffer(), maxStrLen); free(wbuffer()); - uint16_t oldLen = len(); + size_t oldLen = len(); setSSO(true); memcpy(wbuffer(), temp, maxStrLen); setLen(oldLen); @@ -201,7 +201,7 @@ bool String::changeBuffer(unsigned int maxStrLen) { if (newSize > CAPACITY_MAX) { return false; } - uint16_t oldLen = len(); + size_t oldLen = len(); char *newbuffer = (char *)realloc(isSSO() ? nullptr : wbuffer(), newSize); if (newbuffer) { size_t oldSize = capacity() + 1; // include NULL. From 6e60f2f6b9e28ac20082e7e7387eaa90f362da48 Mon Sep 17 00:00:00 2001 From: LusimiCollado Date: Mon, 30 Jun 2025 12:18:02 +0200 Subject: [PATCH 199/290] =?UTF-8?q?feat(variant):=20add=20kode=20dot=20ESP?= =?UTF-8?q?32-S3=20board=20with=20QSPI=20LCD,=20SD=20and=20GPIO=20?= =?UTF-8?q?=E2=80=A6=20(#11371)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(variant): add KodeDot ESP32-S3 board with QSPI LCD, SD and GPIO header * fix(kodedot): Reorder board definitions and translate comments to English * fix(kodedot): Clean up OTA override and remove unused partition menu for kode dot * fix(kodedot): Build board changed from ESP32S3_DEV to KODE_DOT on kode dot board * ci(pre-commit): Fix whitespace, EOLs and codespell 'Analog' * ci(pre-commit): Add bash script formatter * fix(merge): New name and description for custom merge tool and change partitions table to variants folder --- boards.txt | 57 ++++++++++++ platform.txt | 16 ++++ variants/kodedot/custom_ota_override.cpp | 14 +++ variants/kodedot/kodedot_partitions.csv | 7 ++ variants/kodedot/pins_arduino.h | 107 +++++++++++++++++++++++ 5 files changed, 201 insertions(+) create mode 100644 variants/kodedot/custom_ota_override.cpp create mode 100644 variants/kodedot/kodedot_partitions.csv create mode 100644 variants/kodedot/pins_arduino.h diff --git a/boards.txt b/boards.txt index b51a8840757..ceb0dc63d02 100644 --- a/boards.txt +++ b/boards.txt @@ -50547,3 +50547,60 @@ cyobot_v2_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR cyobot_v2_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote ############################################################## + +kodedot.name=kode dot + +kodedot.bootloader.tool=esptool_py +kodedot.bootloader.tool.default=esptool_py + +kodedot.upload.tool=esptool_py_app_only +kodedot.upload.tool.default=esptool_py_app_only +kodedot.upload.tool.network=esp_ota + +kodedot.upload.maximum_size=8388608 +kodedot.upload.maximum_data_size=327680 +kodedot.upload.flags= +kodedot.upload.extra_flags= +kodedot.upload.use_1200bps_touch=false +kodedot.upload.wait_for_upload_port=false +kodedot.upload.speed=921600 + +kodedot.upload.erase_cmd= + +kodedot.serial.disableDTR=false +kodedot.serial.disableRTS=false + +kodedot.build.tarch=xtensa +kodedot.build.bootloader_addr=0x0 +kodedot.build.target=esp32s3 +kodedot.build.mcu=esp32s3 +kodedot.build.core=esp32 +kodedot.build.variant=kodedot +kodedot.build.board=KODE_DOT + +kodedot.build.usb_mode=1 +kodedot.build.cdc_on_boot=1 +kodedot.build.msc_on_boot=0 +kodedot.build.dfu_on_boot=0 + +kodedot.build.f_cpu=240000000L + +kodedot.build.flash_offset=0x400000 +kodedot.build.flash_size=16MB +kodedot.build.flash_freq=80m +kodedot.build.flash_mode=dio + +kodedot.build.custom_partitions=kodedot_partitions + +kodedot.build.psram_type=qspi +kodedot.build.defines= + +kodedot.build.loop_core=-DARDUINO_RUNNING_CORE=1 +kodedot.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 + +kodedot.recipe.hooks.objcopy.postobjcopy.3.pattern= +kodedot.recipe.hooks.objcopy.postobjcopy.3.pattern_args= + +kodedot.recipe.output.save_file={build.project_name}.ino.bin + +############################################################## diff --git a/platform.txt b/platform.txt index 8c7f4432377..7bc89426323 100644 --- a/platform.txt +++ b/platform.txt @@ -330,3 +330,19 @@ tools.dfu-util.cmd=dfu-util tools.dfu-util.upload.params.verbose=-d tools.dfu-util.upload.params.quiet= tools.dfu-util.upload.pattern="{path}/{cmd}" --device {vid.0}:{pid.0} -D "{build.path}/{build.project_name}.bin" -Q + +## -------------------------------------------------------------------------- +## esptool_py_app_only is used to upload only the application image +## It won't upload the bootloader or any other binary except for the main application +## -------------------------------------------------------------------------- +tools.esptool_py_app_only.path={runtime.tools.esptool_py.path} +tools.esptool_py_app_only.cmd=esptool +tools.esptool_py_app_only.cmd.windows=esptool.exe + +tools.esptool_py_app_only.upload.protocol=serial +tools.esptool_py_app_only.upload.params.verbose= +tools.esptool_py_app_only.upload.params.quiet= + +tools.esptool_py_app_only.upload.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset write_flash --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size {build.flash_size} {build.flash_offset} "{build.path}/{build.project_name}.bin" {upload.extra_flags} + +tools.esptool_py_app_only.upload.pattern="{path}/{cmd}" {tools.esptool_py_app_only.upload.pattern_args} diff --git a/variants/kodedot/custom_ota_override.cpp b/variants/kodedot/custom_ota_override.cpp new file mode 100644 index 00000000000..a41db01db16 --- /dev/null +++ b/variants/kodedot/custom_ota_override.cpp @@ -0,0 +1,14 @@ +// custom_ota_override.cpp +// This function overrides the weak definition of `verifyRollbackLater()` in the kode dot board. + +extern "C" { +// Declare the weak function symbol to override it +bool verifyRollbackLater() __attribute__((weak)); +} + +// Custom implementation of verifyRollbackLater() +// Returning `true` prevents the OTA image from being automatically marked as valid. +// This ensures that the system will roll back to the previous image unless it is explicitly validated later. +bool verifyRollbackLater() { + return true; +} diff --git a/variants/kodedot/kodedot_partitions.csv b/variants/kodedot/kodedot_partitions.csv new file mode 100644 index 00000000000..f0732330850 --- /dev/null +++ b/variants/kodedot/kodedot_partitions.csv @@ -0,0 +1,7 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x6000, +phy_init, data, phy, 0xf000, 0x1000, +otadata, data, ota, 0x10000, 0x2000, +ota_0, app, ota_0, 0x20000, 0x3E0000, +ota_1, app, ota_1, 0x400000, 0x800000, +storage, data, spiffs, 0xC00000, 0x400000, diff --git a/variants/kodedot/pins_arduino.h b/variants/kodedot/pins_arduino.h new file mode 100644 index 00000000000..f19ddb8a616 --- /dev/null +++ b/variants/kodedot/pins_arduino.h @@ -0,0 +1,107 @@ +/* + ──────────────────────────────────────────────────────────────────────── + KodeDot – ESP32-S3R8 Variant + Pin definition file for the Arduino-ESP32 core + ──────────────────────────────────────────────────────────────────────── + * External 2 × 10 connector → simple aliases PIN1 … PIN20 + * On-board QSPI LCD 410×502 @40 MHz (SPI3_HOST) + * micro-SD on SPI2_HOST + * Dual-I²C: external (GPIO37/36) + internal-sensors (GPIO48/47) + * USB VID/PID 0x303A:0x1001 +*/ + +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include +#include + +/*──────────────── USB device descriptor ────────────────*/ +#define USB_VID 0x303A // Espressif Systems VID +#define USB_PID 0x1001 // Product ID: KodeDot-S3 + +/*──────────────── UART0 (Arduino Serial) ────────────────*/ +static const uint8_t TX = 43; // U0TXD – PIN16 on the 2×10 header +static const uint8_t RX = 44; // U0RXD – PIN18 on the 2×10 header + +/*──────────────── I²C buses ─────────────────────────────*/ +/* External expansion bus → header pins 11/13 */ +static const uint8_t SCL = 37; // GPIO37 – PIN12 +static const uint8_t SDA = 36; // GPIO36 – PIN14 + +/* Internal sensor/touch bus (not on header) */ +#define INT_I2C_SCL 47 // GPIO47 +#define INT_I2C_SDA 48 // GPIO48 + +/*──────────────── SPI2 – micro-SD ───────────────────────*/ +static const uint8_t SS = 15; // SD_CS +static const uint8_t MOSI = 16; // SD_MOSI +static const uint8_t MISO = 18; // SD_MISO +static const uint8_t SCK = 17; // SD_CLK +#define BOARD_HAS_SD_SPI +#define SD_CS SS + +/*──────────────── QSPI LCD (SPI3_HOST) ─────────────────– + * Controller: ST7789 / 4-line SPI (no D/C pin) + * Resolution: 410×502 px, 16 bpp, RGB color-space + * Clock: 40 MHz + */ +#define BOARD_HAS_SPI_LCD +#define LCD_MODEL ST7789 +#define LCD_WIDTH 410 +#define LCD_HEIGHT 502 + +#define LCD_HOST SPI3_HOST +#define LCD_SCK 35 // GPIO35 • QSPI_CLK +#define LCD_MOSI 33 // GPIO33 • QSPI_IO0 (D0) +#define LCD_IO1 34 // GPIO34 • QSPI_IO1 (D1) +#define LCD_IO2 37 // GPIO37 • QSPI_IO2 (D2) +#define LCD_IO3 36 // GPIO36 • QSPI_IO3 (D3) +#define LCD_CS 10 // GPIO10 +#define LCD_RST 9 // GPIO09 +#define LCD_DC -1 // not used in 4-line SPI +/* Optional: back-light enable shares the NeoPixel pin */ +#define LCD_BL 5 // GPIO05 (same as NEOPIXEL) + +/*──────────────── Analog / Touch pads ────────────────*/ +static const uint8_t A0 = 11; // PIN4 – GPIO11 / TOUCH11 / ADC2_CH0 +static const uint8_t A1 = 12; // PIN6 – GPIO12 / TOUCH12 / ADC2_CH1 +static const uint8_t A2 = 13; // PIN8 – GPIO13 / TOUCH13 / ADC2_CH2 +static const uint8_t A3 = 14; // PIN10 – GPIO14 / TOUCH14 / ADC2_CH3 +static const uint8_t T0 = A0, T1 = A1, T2 = A2, T3 = A3; + +/*──────────────── On-board controls & indicator ─────────*/ +#define BUTTON_TOP 0 // GPIO00 – BOOT • active-LOW +#define BUTTON_BOTTOM 6 // GPIO06 • active-LOW +#define NEOPIXEL_PIN 5 // GPIO05 – WS2812 +#define LED_BUILTIN NEOPIXEL_PIN + +/*──────────────── JTAG (also on connector) ──────────────*/ +#define MTCK 39 // PIN11 – GPIO39 +#define MTDO 40 // PIN13 – GPIO40 +#define MTDI 41 // PIN15 – GPIO41 +#define MTMS 42 // PIN17 – GPIO42 + +/*──────────────── 2×10 header: simple aliases ─────────── + NOTE: power pins (1 = 5 V, 2 = 3 V3, 19/20 = GND) are **not** + exposed as GPIO numbers – they remain undefined here. */ +#define PIN3 1 // GPIO01 / TOUCH1 / ADC1_CH0 +#define PIN4 11 // GPIO11 / TOUCH11 / ADC2_CH0 +#define PIN5 2 // GPIO02 / TOUCH2 / ADC1_CH1 +#define PIN6 12 // GPIO12 / TOUCH12 / ADC2_CH1 +#define PIN7 3 // GPIO03 / TOUCH3 / ADC1_CH2 +#define PIN8 13 // GPIO13 / TOUCH13 / ADC2_CH2 +#define PIN9 4 // GPIO04 / TOUCH4 / ADC1_CH3 +#define PIN10 14 // GPIO14 / TOUCH14 / ADC2_CH3 +#define PIN11 39 // MTCK +#define PIN12 37 // SCL (external I²C) +#define PIN13 40 // MTDO +#define PIN14 36 // SDA (external I²C) +#define PIN15 41 // MTDI +#define PIN16 43 // TX (U0TXD) +#define PIN17 42 // MTMS +#define PIN18 44 // RX (U0RXD) +/* PIN1, PIN2, PIN19, PIN20 are power/ground and deliberately + left undefined – they are **not** usable as GPIO. */ + +#endif /* Pins_Arduino_h */ From 2592a7b3bb475554385b501a6a6f4a0d1b2fe060 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Mon, 30 Jun 2025 16:03:38 +0300 Subject: [PATCH 200/290] feat(p4): Add method to set the pins for SDIO to WiFi chip (#11513) * feat(p4): Add method to set the pins for SDIO to WiFi chip * 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/WiFi/src/WiFiGeneric.cpp | 86 +++++++++++++++++++++--------- libraries/WiFi/src/WiFiGeneric.h | 5 ++ 2 files changed, 67 insertions(+), 24 deletions(-) diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index bddcb5fd448..ec661ef7d8f 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -246,29 +246,67 @@ extern "C" { extern esp_err_t esp_hosted_init(); extern esp_err_t esp_hosted_deinit(); }; +typedef struct { + uint8_t pin_clk; + uint8_t pin_cmd; + uint8_t pin_d0; + uint8_t pin_d1; + uint8_t pin_d2; + uint8_t pin_d3; + uint8_t pin_reset; +} sdio_pin_config_t; + static bool hosted_initialized = false; +static sdio_pin_config_t sdio_pin_config = { +#ifdef BOARD_HAS_SDIO_ESP_HOSTED + .pin_clk = BOARD_SDIO_ESP_HOSTED_CLK, + .pin_cmd = BOARD_SDIO_ESP_HOSTED_CMD, + .pin_d0 = BOARD_SDIO_ESP_HOSTED_D0, + .pin_d1 = BOARD_SDIO_ESP_HOSTED_D1, + .pin_d2 = BOARD_SDIO_ESP_HOSTED_D2, + .pin_d3 = BOARD_SDIO_ESP_HOSTED_D3, + .pin_reset = BOARD_SDIO_ESP_HOSTED_RESET +#else + .pin_clk = CONFIG_ESP_SDIO_PIN_CLK, + .pin_cmd = CONFIG_ESP_SDIO_PIN_CMD, + .pin_d0 = CONFIG_ESP_SDIO_PIN_D0, + .pin_d1 = CONFIG_ESP_SDIO_PIN_D1, + .pin_d2 = CONFIG_ESP_SDIO_PIN_D2, + .pin_d3 = CONFIG_ESP_SDIO_PIN_D3, + .pin_reset = CONFIG_ESP_SDIO_GPIO_RESET_SLAVE +#endif +}; + +bool WiFiGenericClass::setPins(int8_t clk, int8_t cmd, int8_t d0, int8_t d1, int8_t d2, int8_t d3, int8_t rst) { + if (clk < 0 || cmd < 0 || d0 < 0 || d1 < 0 || d2 < 0 || d3 < 0 || rst < 0) { + log_e("All SDIO pins must be defined"); + return false; + } + if (hosted_initialized) { + log_e("SDIO pins must be set before WiFi is initialized"); + return false; + } + sdio_pin_config.pin_clk = clk; + sdio_pin_config.pin_cmd = cmd; + sdio_pin_config.pin_d0 = d0; + sdio_pin_config.pin_d1 = d1; + sdio_pin_config.pin_d2 = d2; + sdio_pin_config.pin_d3 = d3; + sdio_pin_config.pin_reset = rst; + return true; +} static bool wifiHostedInit() { if (!hosted_initialized) { hosted_initialized = true; struct esp_hosted_sdio_config conf = INIT_DEFAULT_HOST_SDIO_CONFIG(); -#ifdef BOARD_HAS_SDIO_ESP_HOSTED - conf.pin_clk.pin = BOARD_SDIO_ESP_HOSTED_CLK; - conf.pin_cmd.pin = BOARD_SDIO_ESP_HOSTED_CMD; - conf.pin_d0.pin = BOARD_SDIO_ESP_HOSTED_D0; - conf.pin_d1.pin = BOARD_SDIO_ESP_HOSTED_D1; - conf.pin_d2.pin = BOARD_SDIO_ESP_HOSTED_D2; - conf.pin_d3.pin = BOARD_SDIO_ESP_HOSTED_D3; - conf.pin_reset.pin = BOARD_SDIO_ESP_HOSTED_RESET; -#else - conf.pin_clk.pin = CONFIG_ESP_SDIO_PIN_CLK; - conf.pin_cmd.pin = CONFIG_ESP_SDIO_PIN_CMD; - conf.pin_d0.pin = CONFIG_ESP_SDIO_PIN_D0; - conf.pin_d1.pin = CONFIG_ESP_SDIO_PIN_D1; - conf.pin_d2.pin = CONFIG_ESP_SDIO_PIN_D2; - conf.pin_d3.pin = CONFIG_ESP_SDIO_PIN_D3; - conf.pin_reset.pin = CONFIG_ESP_SDIO_GPIO_RESET_SLAVE; -#endif + conf.pin_clk.pin = sdio_pin_config.pin_clk; + conf.pin_cmd.pin = sdio_pin_config.pin_cmd; + conf.pin_d0.pin = sdio_pin_config.pin_d0; + conf.pin_d1.pin = sdio_pin_config.pin_d1; + conf.pin_d2.pin = sdio_pin_config.pin_d2; + conf.pin_d3.pin = sdio_pin_config.pin_d3; + conf.pin_reset.pin = sdio_pin_config.pin_reset; // esp_hosted_sdio_set_config() will fail on second attempt but here temporarily to not cause exception on reinit if (esp_hosted_sdio_set_config(&conf) != ESP_OK || esp_hosted_init() != ESP_OK) { log_e("esp_hosted_init failed!"); @@ -279,13 +317,13 @@ static bool wifiHostedInit() { } // Attach pins to PeriMan here // Slave chip model is CONFIG_IDF_SLAVE_TARGET - // CONFIG_ESP_SDIO_PIN_CMD - // CONFIG_ESP_SDIO_PIN_CLK - // CONFIG_ESP_SDIO_PIN_D0 - // CONFIG_ESP_SDIO_PIN_D1 - // CONFIG_ESP_SDIO_PIN_D2 - // CONFIG_ESP_SDIO_PIN_D3 - // CONFIG_ESP_SDIO_GPIO_RESET_SLAVE + // sdio_pin_config.pin_clk + // sdio_pin_config.pin_cmd + // sdio_pin_config.pin_d0 + // sdio_pin_config.pin_d1 + // sdio_pin_config.pin_d2 + // sdio_pin_config.pin_d3 + // sdio_pin_config.pin_reset return true; } diff --git a/libraries/WiFi/src/WiFiGeneric.h b/libraries/WiFi/src/WiFiGeneric.h index ed216229ed4..bdfa7b5dd85 100644 --- a/libraries/WiFi/src/WiFiGeneric.h +++ b/libraries/WiFi/src/WiFiGeneric.h @@ -82,6 +82,11 @@ class WiFiGenericClass { public: WiFiGenericClass(); +#if CONFIG_ESP_WIFI_REMOTE_ENABLED + // Set SDIO pins for connection to external ESP MCU + static bool setPins(int8_t clk, int8_t cmd, int8_t d0, int8_t d1, int8_t d2, int8_t d3, int8_t rst); +#endif + wifi_event_id_t onEvent(WiFiEventCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); wifi_event_id_t onEvent(WiFiEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); wifi_event_id_t onEvent(WiFiEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); From 8cf0818d824837ff1b13b63f10643c93adeecef6 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 2 Jul 2025 13:17:00 +0200 Subject: [PATCH 201/290] make adresses for partitions.bin and boot_app0.bin configureable (#11534) --- tools/pioarduino-build.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/pioarduino-build.py b/tools/pioarduino-build.py index b6a0c0435c5..b67580e264c 100644 --- a/tools/pioarduino-build.py +++ b/tools/pioarduino-build.py @@ -216,8 +216,14 @@ def add_tinyuf2_extra_image(): "0x1000" if build_mcu in ["esp32", "esp32s2"] else ("0x2000" if build_mcu in ["esp32p4"] else "0x0000"), get_bootloader_image(variants_dir), ), - ("0x8000", join(env.subst("$BUILD_DIR"), "partitions.bin")), - ("0xe000", join(FRAMEWORK_DIR, "tools", "partitions", "boot_app0.bin")), + ( + board_config.get("upload.arduino.partitions_bin", "0x8000"), + join(env.subst("$BUILD_DIR"), "partitions.bin"), + ), + ( + board_config.get("upload.arduino.boot_app0", "0xe000"), + join(FRAMEWORK_DIR, "tools", "partitions", "boot_app0.bin"), + ), ] + [(offset, join(FRAMEWORK_DIR, img)) for offset, img in board_config.get("upload.arduino.flash_extra_images", [])], ) From f4fdecc60c465384e465a4b1d2bd1eac8f67912e Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Wed, 2 Jul 2025 14:41:06 +0300 Subject: [PATCH 202/290] fix(csrf): Fix SCRF vulnerability in OTA examples and libraries (#11530) * fix(csrf): Fix SCRF vulnerability in WebUpdate.ino * fix(csrf): Prevent CSRF on other OTA examples * fix(csrf): Require auth user and pass to be changed * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../HTTPUpdateServer/src/HTTPUpdateServer.h | 19 ++++++++ .../examples/OTAWebUpdater/OTAWebUpdater.ino | 35 ++++++++++++++- .../examples/WebUpdate/WebUpdate.ino | 43 ++++++++++++++++--- 3 files changed, 90 insertions(+), 7 deletions(-) diff --git a/libraries/HTTPUpdateServer/src/HTTPUpdateServer.h b/libraries/HTTPUpdateServer/src/HTTPUpdateServer.h index bb32bc03fdb..65d8cbaa783 100644 --- a/libraries/HTTPUpdateServer/src/HTTPUpdateServer.h +++ b/libraries/HTTPUpdateServer/src/HTTPUpdateServer.h @@ -27,6 +27,7 @@ static const char serverIndex[] PROGMEM = )"; static const char successResponse[] PROGMEM = "Update Success! Rebooting..."; +static const char *csrfHeaders[2] = {"Origin", "Host"}; class HTTPUpdateServer { public: @@ -56,6 +57,9 @@ class HTTPUpdateServer { _username = username; _password = password; + // collect headers for CSRF verification + _server->collectHeaders(csrfHeaders, 2); + // handler for the /update form page _server->on(path.c_str(), HTTP_GET, [&]() { if (_username != emptyString && _password != emptyString && !_server->authenticate(_username.c_str(), _password.c_str())) { @@ -69,6 +73,10 @@ class HTTPUpdateServer { path.c_str(), HTTP_POST, [&]() { if (!_authenticated) { + if (_username == emptyString || _password == emptyString) { + _server->send(200, F("text/html"), String(F("Update error: Wrong origin received!"))); + return; + } return _server->requestAuthentication(); } if (Update.hasError()) { @@ -100,6 +108,17 @@ class HTTPUpdateServer { return; } + String origin = _server->header(String(csrfHeaders[0])); + String host = _server->header(String(csrfHeaders[1])); + String expectedOrigin = String("http://") + host; + if (origin != expectedOrigin) { + if (_serial_output) { + Serial.printf("Wrong origin received! Expected: %s, Received: %s\n", expectedOrigin.c_str(), origin.c_str()); + } + _authenticated = false; + return; + } + if (_serial_output) { Serial.printf("Update: %s\n", upload.filename.c_str()); } diff --git a/libraries/Update/examples/OTAWebUpdater/OTAWebUpdater.ino b/libraries/Update/examples/OTAWebUpdater/OTAWebUpdater.ino index 7059bef4496..39d6cbce4af 100644 --- a/libraries/Update/examples/OTAWebUpdater/OTAWebUpdater.ino +++ b/libraries/Update/examples/OTAWebUpdater/OTAWebUpdater.ino @@ -8,10 +8,17 @@ #define SSID_FORMAT "ESP32-%06lX" // 12 chars total //#define PASSWORD "test123456" // generate if remarked +// Set the username and password for firmware upload +const char *authUser = "........"; +const char *authPass = "........"; + WebServer server(80); Ticker tkSecond; uint8_t otaDone = 0; +const char *csrfHeaders[2] = {"Origin", "Host"}; +static bool authenticated = false; + const char *alphanum = "0123456789!@#$%^&*abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; String generatePass(uint8_t str_len) { String buff; @@ -38,6 +45,9 @@ void apMode() { } void handleUpdateEnd() { + if (!authenticated) { + return server.requestAuthentication(); + } server.sendHeader("Connection", "close"); if (Update.hasError()) { server.send(502, "text/plain", Update.errorString()); @@ -45,6 +55,7 @@ void handleUpdateEnd() { server.sendHeader("Refresh", "10"); server.sendHeader("Location", "/"); server.send(307); + delay(500); ESP.restart(); } } @@ -56,18 +67,34 @@ void handleUpdate() { } HTTPUpload &upload = server.upload(); if (upload.status == UPLOAD_FILE_START) { + authenticated = server.authenticate(authUser, authPass); + if (!authenticated) { + Serial.println("Authentication fail!"); + otaDone = 0; + return; + } + String origin = server.header(String(csrfHeaders[0])); + String host = server.header(String(csrfHeaders[1])); + String expectedOrigin = String("http://") + host; + if (origin != expectedOrigin) { + Serial.printf("Wrong origin received! Expected: %s, Received: %s\n", expectedOrigin.c_str(), origin.c_str()); + authenticated = false; + otaDone = 0; + return; + } + Serial.printf("Receiving Update: %s, Size: %d\n", upload.filename.c_str(), fsize); if (!Update.begin(fsize)) { otaDone = 0; Update.printError(Serial); } - } else if (upload.status == UPLOAD_FILE_WRITE) { + } else if (authenticated && upload.status == UPLOAD_FILE_WRITE) { if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { Update.printError(Serial); } else { otaDone = 100 * Update.progress() / Update.size(); } - } else if (upload.status == UPLOAD_FILE_END) { + } else if (authenticated && upload.status == UPLOAD_FILE_END) { if (Update.end(true)) { Serial.printf("Update Success: %u bytes\nRebooting...\n", upload.totalSize); } else { @@ -78,6 +105,7 @@ void handleUpdate() { } void webServerInit() { + server.collectHeaders(csrfHeaders, 2); server.on( "/update", HTTP_POST, []() { @@ -92,6 +120,9 @@ void webServerInit() { server.send_P(200, "image/x-icon", favicon_ico_gz, favicon_ico_gz_len); }); server.onNotFound([]() { + if (!server.authenticate(authUser, authPass)) { + return server.requestAuthentication(); + } server.send(200, "text/html", indexHtml); }); server.begin(); diff --git a/libraries/WebServer/examples/WebUpdate/WebUpdate.ino b/libraries/WebServer/examples/WebUpdate/WebUpdate.ino index 10ddb5e7b64..9e45de7d985 100644 --- a/libraries/WebServer/examples/WebUpdate/WebUpdate.ino +++ b/libraries/WebServer/examples/WebUpdate/WebUpdate.ino @@ -12,10 +12,17 @@ const char *host = "esp32-webupdate"; const char *ssid = "........"; const char *password = "........"; +// Set the username and password for firmware upload +const char *authUser = "........"; +const char *authPass = "........"; + WebServer server(80); const char *serverIndex = "

    "; +const char *csrfHeaders[2] = {"Origin", "Host"}; +static bool authenticated = false; + void setup(void) { Serial.begin(115200); Serial.println(); @@ -24,37 +31,63 @@ void setup(void) { WiFi.begin(ssid, password); if (WiFi.waitForConnectResult() == WL_CONNECTED) { MDNS.begin(host); + server.collectHeaders(csrfHeaders, 2); server.on("/", HTTP_GET, []() { + if (!server.authenticate(authUser, authPass)) { + return server.requestAuthentication(); + } server.sendHeader("Connection", "close"); server.send(200, "text/html", serverIndex); }); server.on( "/update", HTTP_POST, []() { + if (!authenticated) { + return server.requestAuthentication(); + } server.sendHeader("Connection", "close"); - server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK"); - ESP.restart(); + if (Update.hasError()) { + server.send(200, "text/plain", "FAIL"); + } else { + server.send(200, "text/plain", "Success! Rebooting..."); + delay(500); + ESP.restart(); + } }, []() { HTTPUpload &upload = server.upload(); if (upload.status == UPLOAD_FILE_START) { Serial.setDebugOutput(true); + authenticated = server.authenticate(authUser, authPass); + if (!authenticated) { + Serial.println("Authentication fail!"); + return; + } + String origin = server.header(String(csrfHeaders[0])); + String host = server.header(String(csrfHeaders[1])); + String expectedOrigin = String("http://") + host; + if (origin != expectedOrigin) { + Serial.printf("Wrong origin received! Expected: %s, Received: %s\n", expectedOrigin.c_str(), origin.c_str()); + authenticated = false; + return; + } + Serial.printf("Update: %s\n", upload.filename.c_str()); if (!Update.begin()) { //start with max available size Update.printError(Serial); } - } else if (upload.status == UPLOAD_FILE_WRITE) { + } else if (authenticated && upload.status == UPLOAD_FILE_WRITE) { if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { Update.printError(Serial); } - } else if (upload.status == UPLOAD_FILE_END) { + } else if (authenticated && upload.status == UPLOAD_FILE_END) { if (Update.end(true)) { //true to set the size to the current progress Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize); } else { Update.printError(Serial); } Serial.setDebugOutput(false); - } else { + } else if (authenticated) { Serial.printf("Update Failed Unexpectedly (likely broken connection): status=%d\n", upload.status); } } From 212b12b625f7dca9b646a2ae5c422936c7ef0ab6 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Wed, 2 Jul 2025 14:41:39 +0300 Subject: [PATCH 203/290] IDF release/v5.4 (#11517) * IDF release/v5.4 dfa785ed * IDF release/v5.4 72775cd6 * IDF release/v5.4 858a988d --- 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 9c1516dbacd..bbb77f8ef5a 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-f0f2980d-v1" + "version": "idf-release_v5.4-858a988d-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.4-f0f2980d-v1", + "version": "idf-release_v5.4-858a988d-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", - "size": "353978504" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "checksum": "SHA-256:4fc6eace642735036404c722d5602a379fe16378c72ffd060096cbef1c62d69d", + "size": "354134726" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", - "size": "353978504" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "checksum": "SHA-256:4fc6eace642735036404c722d5602a379fe16378c72ffd060096cbef1c62d69d", + "size": "354134726" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", - "size": "353978504" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "checksum": "SHA-256:4fc6eace642735036404c722d5602a379fe16378c72ffd060096cbef1c62d69d", + "size": "354134726" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", - "size": "353978504" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "checksum": "SHA-256:4fc6eace642735036404c722d5602a379fe16378c72ffd060096cbef1c62d69d", + "size": "354134726" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", - "size": "353978504" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "checksum": "SHA-256:4fc6eace642735036404c722d5602a379fe16378c72ffd060096cbef1c62d69d", + "size": "354134726" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", - "size": "353978504" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "checksum": "SHA-256:4fc6eace642735036404c722d5602a379fe16378c72ffd060096cbef1c62d69d", + "size": "354134726" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", - "size": "353978504" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "checksum": "SHA-256:4fc6eace642735036404c722d5602a379fe16378c72ffd060096cbef1c62d69d", + "size": "354134726" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-f0f2980d-v1.zip", - "checksum": "SHA-256:b1a77c83634111d78a356f1d1756dc815eeeb91605c5d8714a0db7cccbd0bede", - "size": "353978504" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.4/esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.4-858a988d-v1.zip", + "checksum": "SHA-256:4fc6eace642735036404c722d5602a379fe16378c72ffd060096cbef1c62d69d", + "size": "354134726" } ] }, From bc7a549876c33686f6d9050e71a2f045717c41e2 Mon Sep 17 00:00:00 2001 From: HighDoping Date: Wed, 2 Jul 2025 19:54:12 +0800 Subject: [PATCH 204/290] fix(example): led flash not working if not using default model in camera example. (#11466) * fix(example): led flash not working if not using default model in camera example fix(example): add camera_config.h and enable LED FLASH based on board model fix(example): Remove face detection description as no longer supported * fix(example): add header guard for board_config.h --- .../CameraWebServer/CameraWebServer.ino | 39 +++---------------- .../Camera/CameraWebServer/app_httpd.cpp | 30 +++++++------- .../Camera/CameraWebServer/board_config.h | 34 ++++++++++++++++ 3 files changed, 53 insertions(+), 50 deletions(-) create mode 100644 libraries/ESP32/examples/Camera/CameraWebServer/board_config.h diff --git a/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino b/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino index d483e11b1df..83733d4b5cf 100644 --- a/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino +++ b/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino @@ -1,37 +1,10 @@ #include "esp_camera.h" #include -// -// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality -// Ensure ESP32 Wrover Module or other board with PSRAM is selected -// Partial images will be transmitted if image exceeds buffer size -// -// You must select partition scheme from the board menu that has at least 3MB APP space. -// Face Recognition is DISABLED for ESP32 and ESP32-S2, because it takes up from 15 -// seconds to process single frame. Face Detection is ENABLED if PSRAM is enabled as well - -// =================== -// Select camera model -// =================== -//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM -#define CAMERA_MODEL_ESP_EYE // Has PSRAM -//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM -//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM -//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM -//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM -//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM -//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM -//#define CAMERA_MODEL_M5STACK_CAMS3_UNIT // Has PSRAM -//#define CAMERA_MODEL_AI_THINKER // Has PSRAM -//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM -//#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM -// ** Espressif Internal Boards ** -//#define CAMERA_MODEL_ESP32_CAM_BOARD -//#define CAMERA_MODEL_ESP32S2_CAM_BOARD -//#define CAMERA_MODEL_ESP32S3_CAM_LCD -//#define CAMERA_MODEL_DFRobot_FireBeetle2_ESP32S3 // Has PSRAM -//#define CAMERA_MODEL_DFRobot_Romeo_ESP32S3 // Has PSRAM -#include "camera_pins.h" +// =========================== +// Select camera model in board_config.h +// =========================== +#include "board_config.h" // =========================== // Enter your WiFi credentials @@ -40,7 +13,7 @@ const char *ssid = "**********"; const char *password = "**********"; void startCameraServer(); -void setupLedFlash(int pin); +void setupLedFlash(); void setup() { Serial.begin(115200); @@ -130,7 +103,7 @@ void setup() { // Setup LED FLash if LED pin is defined in camera_pins.h #if defined(LED_GPIO_NUM) - setupLedFlash(LED_GPIO_NUM); + setupLedFlash(); #endif WiFi.begin(ssid, password); diff --git a/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp b/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp index cc924bd5b3b..589fea33b7f 100644 --- a/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp +++ b/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp @@ -19,18 +19,14 @@ #include "esp32-hal-ledc.h" #include "sdkconfig.h" #include "camera_index.h" +#include "board_config.h" #if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG) #include "esp32-hal-log.h" #endif -// Enable LED FLASH setting -#define CONFIG_LED_ILLUMINATOR_ENABLED 1 - // LED FLASH setup -#if CONFIG_LED_ILLUMINATOR_ENABLED - -#define LED_LEDC_GPIO 22 //configure LED pin +#if defined(LED_GPIO_NUM) #define CONFIG_LED_MAX_INTENSITY 255 int led_duty = 0; @@ -91,13 +87,13 @@ static int ra_filter_run(ra_filter_t *filter, int value) { } #endif -#if CONFIG_LED_ILLUMINATOR_ENABLED +#if defined(LED_GPIO_NUM) void enable_led(bool en) { // Turn LED On or Off int duty = en ? led_duty : 0; if (en && isStreaming && (led_duty > CONFIG_LED_MAX_INTENSITY)) { duty = CONFIG_LED_MAX_INTENSITY; } - ledcWrite(LED_LEDC_GPIO, duty); + ledcWrite(LED_GPIO_NUM, duty); //ledc_set_duty(CONFIG_LED_LEDC_SPEED_MODE, CONFIG_LED_LEDC_CHANNEL, duty); //ledc_update_duty(CONFIG_LED_LEDC_SPEED_MODE, CONFIG_LED_LEDC_CHANNEL); log_i("Set LED intensity to %d", duty); @@ -162,7 +158,7 @@ static esp_err_t capture_handler(httpd_req_t *req) { int64_t fr_start = esp_timer_get_time(); #endif -#if CONFIG_LED_ILLUMINATOR_ENABLED +#if defined(LED_GPIO_NUM) enable_led(true); vTaskDelay(150 / portTICK_PERIOD_MS); // The LED needs to be turned on ~150ms before the call to esp_camera_fb_get() fb = esp_camera_fb_get(); // or it won't be visible in the frame. A better way to do this is needed. @@ -230,7 +226,7 @@ static esp_err_t stream_handler(httpd_req_t *req) { httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); httpd_resp_set_hdr(req, "X-Framerate", "60"); -#if CONFIG_LED_ILLUMINATOR_ENABLED +#if defined(LED_GPIO_NUM) isStreaming = true; enable_led(true); #endif @@ -293,7 +289,7 @@ static esp_err_t stream_handler(httpd_req_t *req) { ); } -#if CONFIG_LED_ILLUMINATOR_ENABLED +#if defined(LED_GPIO_NUM) isStreaming = false; enable_led(false); #endif @@ -393,7 +389,7 @@ static esp_err_t cmd_handler(httpd_req_t *req) { } else if (!strcmp(variable, "ae_level")) { res = s->set_ae_level(s, val); } -#if CONFIG_LED_ILLUMINATOR_ENABLED +#if defined(LED_GPIO_NUM) else if (!strcmp(variable, "led_intensity")) { led_duty = val; if (isStreaming) { @@ -481,7 +477,7 @@ static esp_err_t status_handler(httpd_req_t *req) { p += sprintf(p, "\"vflip\":%u,", s->status.vflip); p += sprintf(p, "\"dcw\":%u,", s->status.dcw); p += sprintf(p, "\"colorbar\":%u", s->status.colorbar); -#if CONFIG_LED_ILLUMINATOR_ENABLED +#if defined(LED_GPIO_NUM) p += sprintf(p, ",\"led_intensity\":%u", led_duty); #else p += sprintf(p, ",\"led_intensity\":%d", -1); @@ -843,10 +839,10 @@ void startCameraServer() { } } -void setupLedFlash(int pin) { -#if CONFIG_LED_ILLUMINATOR_ENABLED - ledcAttach(pin, 5000, 8); +void setupLedFlash() { +#if defined(LED_GPIO_NUM) + ledcAttach(LED_GPIO_NUM, 5000, 8); #else - log_i("LED flash is disabled -> CONFIG_LED_ILLUMINATOR_ENABLED = 0"); + log_i("LED flash is disabled -> LED_GPIO_NUM undefined"); #endif } diff --git a/libraries/ESP32/examples/Camera/CameraWebServer/board_config.h b/libraries/ESP32/examples/Camera/CameraWebServer/board_config.h new file mode 100644 index 00000000000..ca7edbab73e --- /dev/null +++ b/libraries/ESP32/examples/Camera/CameraWebServer/board_config.h @@ -0,0 +1,34 @@ +#ifndef BOARD_CONFIG_H +#define BOARD_CONFIG_H + +// +// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality +// Ensure ESP32 Wrover Module or other board with PSRAM is selected +// Partial images will be transmitted if image exceeds buffer size +// +// You must select partition scheme from the board menu that has at least 3MB APP space. + +// =================== +// Select camera model +// =================== +//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM +#define CAMERA_MODEL_ESP_EYE // Has PSRAM +//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM +//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM +//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM +//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM +//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM +//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM +//#define CAMERA_MODEL_M5STACK_CAMS3_UNIT // Has PSRAM +//#define CAMERA_MODEL_AI_THINKER // Has PSRAM +//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM +//#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM +// ** Espressif Internal Boards ** +//#define CAMERA_MODEL_ESP32_CAM_BOARD +//#define CAMERA_MODEL_ESP32S2_CAM_BOARD +//#define CAMERA_MODEL_ESP32S3_CAM_LCD +//#define CAMERA_MODEL_DFRobot_FireBeetle2_ESP32S3 // Has PSRAM +//#define CAMERA_MODEL_DFRobot_Romeo_ESP32S3 // Has PSRAM +#include "camera_pins.h" + +#endif // BOARD_CONFIG_H From 7f75e445f7e3ff20f44da48a15160b247d93510e Mon Sep 17 00:00:00 2001 From: "Daniel.Cao" <144674500+DanielCao0@users.noreply.github.com> Date: Wed, 2 Jul 2025 20:23:01 +0800 Subject: [PATCH 205/290] feat(board): add support for RAKwireless RAK3112 (#11485) * feat(rak3112): add pins_arduino.h for RAKWireless RAK3112 module * feat(rak3112): update pins_arduino.h to define LED pins and update board.txt * Delete the redundant configuration information in board.txt * Restore the incorrect modifications to board.txt * Delete blank lines * Move the rak configuration information to the end of the boards.txt . * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Daniel.Cao 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 | 158 ++++++++++++++++++++ variants/rakwireless_rak3112/pins_arduino.h | 50 +++++++ 2 files changed, 208 insertions(+) create mode 100644 variants/rakwireless_rak3112/pins_arduino.h diff --git a/boards.txt b/boards.txt index ceb0dc63d02..fe67071ea17 100644 --- a/boards.txt +++ b/boards.txt @@ -50548,6 +50548,164 @@ cyobot_v2_esp32s3.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzbo ############################################################## +rakwireless_rak3112.name=RAKwireless RAK3112 + +rakwireless_rak3112.upload.tool=esptool_py +rakwireless_rak3112.upload.tool.default=esptool_py +rakwireless_rak3112.upload.tool.network=esp_ota +rakwireless_rak3112.upload.maximum_size=1310720 +rakwireless_rak3112.upload.maximum_data_size=327680 +rakwireless_rak3112.upload.wait_for_upload_port=false +rakwireless_rak3112.upload.speed=460800 +rakwireless_rak3112.upload.flags= +rakwireless_rak3112.upload.extra_flags= + +rakwireless_rak3112.bootloader.tool=esptool_py +rakwireless_rak3112.bootloader.tool.default=esptool_py + +rakwireless_rak3112.serial.disableDTR=true +rakwireless_rak3112.serial.disableRTS=true + +rakwireless_rak3112.build.tarch=xtensa +rakwireless_rak3112.build.bootloader_addr=0x0 +rakwireless_rak3112.build.mcu=esp32s3 +rakwireless_rak3112.build.core=esp32 +rakwireless_rak3112.build.target=esp32s3 +rakwireless_rak3112.build.variant=rakwireless_rak3112 +rakwireless_rak3112.build.board=RAKWIRELESS_RAK3112 + +rakwireless_rak3112.build.usb_mode=1 +rakwireless_rak3112.build.cdc_on_boot=1 +rakwireless_rak3112.build.msc_on_boot=0 +rakwireless_rak3112.build.dfu_on_boot=0 + +rakwireless_rak3112.build.f_cpu=240000000L +rakwireless_rak3112.build.flash_size=16MB +rakwireless_rak3112.build.flash_freq=80m +rakwireless_rak3112.build.flash_mode=dio +rakwireless_rak3112.build.boot=dio +rakwireless_rak3112.build.partitions=default +rakwireless_rak3112.build.defines= + +rakwireless_rak3112.menu.PSRAM.enabled=Enabled +rakwireless_rak3112.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM +rakwireless_rak3112.menu.PSRAM.enabled.build.psram_type=opi +rakwireless_rak3112.menu.PSRAM.disabled=Disabled +rakwireless_rak3112.menu.PSRAM.disabled.build.defines= + +rakwireless_rak3112.menu.LoopCore.1=Core 1 +rakwireless_rak3112.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +rakwireless_rak3112.menu.LoopCore.0=Core 0 +rakwireless_rak3112.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +rakwireless_rak3112.menu.EventsCore.1=Core 1 +rakwireless_rak3112.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +rakwireless_rak3112.menu.EventsCore.0=Core 0 +rakwireless_rak3112.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +rakwireless_rak3112.menu.USBMode.hwcdc=Hardware CDC and JTAG +rakwireless_rak3112.menu.USBMode.hwcdc.build.usb_mode=1 +rakwireless_rak3112.menu.USBMode.default=USB-OTG (TinyUSB) +rakwireless_rak3112.menu.USBMode.default.build.usb_mode=0 + +rakwireless_rak3112.menu.CDCOnBoot.default=Enabled +rakwireless_rak3112.menu.CDCOnBoot.default.build.cdc_on_boot=1 +rakwireless_rak3112.menu.CDCOnBoot.cdc=Disabled +rakwireless_rak3112.menu.CDCOnBoot.cdc.build.cdc_on_boot=0 + +rakwireless_rak3112.menu.MSCOnBoot.default=Disabled +rakwireless_rak3112.menu.MSCOnBoot.default.build.msc_on_boot=0 +rakwireless_rak3112.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +rakwireless_rak3112.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +rakwireless_rak3112.menu.DFUOnBoot.default=Disabled +rakwireless_rak3112.menu.DFUOnBoot.default.build.dfu_on_boot=0 +rakwireless_rak3112.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +rakwireless_rak3112.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +rakwireless_rak3112.menu.UploadMode.default=UART0 / Hardware CDC +rakwireless_rak3112.menu.UploadMode.default.upload.use_1200bps_touch=false +rakwireless_rak3112.menu.UploadMode.default.upload.wait_for_upload_port=false +rakwireless_rak3112.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +rakwireless_rak3112.menu.UploadMode.cdc.upload.use_1200bps_touch=true +rakwireless_rak3112.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +rakwireless_rak3112.menu.PartitionScheme.default_16MB=Default (6.25MB APP/3.43MB SPIFFS) +rakwireless_rak3112.menu.PartitionScheme.default_16MB.build.partitions=default_16MB +rakwireless_rak3112.menu.PartitionScheme.default_16MB.upload.maximum_size=6553600 +rakwireless_rak3112.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9MB FATFS) +rakwireless_rak3112.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB +rakwireless_rak3112.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 +rakwireless_rak3112.menu.PartitionScheme.tinyuf2=TinyUF2 16MB (2MB APP/11.6MB FATFS) +rakwireless_rak3112.menu.PartitionScheme.tinyuf2.build.custom_bootloader=bootloader-tinyuf2 +rakwireless_rak3112.menu.PartitionScheme.tinyuf2.build.partitions=tinyuf2-partitions-16MB +rakwireless_rak3112.menu.PartitionScheme.tinyuf2.upload.maximum_size=2097152 +rakwireless_rak3112.menu.PartitionScheme.tinyuf2.upload.extra_flags=0x410000 "{runtime.platform.path}/variants/{build.variant}/tinyuf2.bin" +rakwireless_rak3112.menu.PartitionScheme.tinyuf2_noota=TinyUF2 16MB No OTA(4MB APP/11.6MB FATFS) +rakwireless_rak3112.menu.PartitionScheme.tinyuf2_noota.build.custom_bootloader=bootloader-tinyuf2 +rakwireless_rak3112.menu.PartitionScheme.tinyuf2_noota.build.partitions=tinyuf2-partitions-16MB-noota +rakwireless_rak3112.menu.PartitionScheme.tinyuf2_noota.upload.maximum_size=4194304 +rakwireless_rak3112.menu.PartitionScheme.tinyuf2_noota.upload.extra_flags=0x410000 "{runtime.platform.path}/variants/{build.variant}/tinyuf2.bin" +rakwireless_rak3112.menu.PartitionScheme.large_spiffs=Large SPIFFS (4.5MB APP/6.93MB SPIFFS) +rakwireless_rak3112.menu.PartitionScheme.large_spiffs.build.partitions=large_spiffs_16MB +rakwireless_rak3112.menu.PartitionScheme.large_spiffs.upload.maximum_size=4718592 +rakwireless_rak3112.menu.PartitionScheme.custom=Custom +rakwireless_rak3112.menu.PartitionScheme.custom.build.partitions= +rakwireless_rak3112.menu.PartitionScheme.custom.upload.maximum_size=16777216 + +rakwireless_rak3112.menu.CPUFreq.240=240MHz (WiFi/BT) +rakwireless_rak3112.menu.CPUFreq.240.build.f_cpu=240000000L +rakwireless_rak3112.menu.CPUFreq.160=160MHz (WiFi/BT) +rakwireless_rak3112.menu.CPUFreq.160.build.f_cpu=160000000L +rakwireless_rak3112.menu.CPUFreq.80=80MHz (WiFi/BT) +rakwireless_rak3112.menu.CPUFreq.80.build.f_cpu=80000000L + +rakwireless_rak3112.menu.FlashMode.qio=QIO +rakwireless_rak3112.menu.FlashMode.qio.build.flash_mode=dio +rakwireless_rak3112.menu.FlashMode.qio.build.boot=qio +rakwireless_rak3112.menu.FlashMode.dio=DIO +rakwireless_rak3112.menu.FlashMode.dio.build.flash_mode=dio +rakwireless_rak3112.menu.FlashMode.dio.build.boot=dio + +rakwireless_rak3112.menu.FlashFreq.80=80MHz +rakwireless_rak3112.menu.FlashFreq.80.build.flash_freq=80m +rakwireless_rak3112.menu.FlashFreq.40=40MHz +rakwireless_rak3112.menu.FlashFreq.40.build.flash_freq=40m + +rakwireless_rak3112.menu.UploadSpeed.921600=921600 +rakwireless_rak3112.menu.UploadSpeed.921600.upload.speed=921600 +rakwireless_rak3112.menu.UploadSpeed.115200=115200 +rakwireless_rak3112.menu.UploadSpeed.115200.upload.speed=115200 +rakwireless_rak3112.menu.UploadSpeed.256000.windows=256000 +rakwireless_rak3112.menu.UploadSpeed.256000.upload.speed=256000 +rakwireless_rak3112.menu.UploadSpeed.230400.windows.upload.speed=256000 +rakwireless_rak3112.menu.UploadSpeed.230400=230400 +rakwireless_rak3112.menu.UploadSpeed.230400.upload.speed=230400 +rakwireless_rak3112.menu.UploadSpeed.460800.linux=460800 +rakwireless_rak3112.menu.UploadSpeed.460800.macosx=460800 +rakwireless_rak3112.menu.UploadSpeed.460800.upload.speed=460800 +rakwireless_rak3112.menu.UploadSpeed.512000.windows=512000 +rakwireless_rak3112.menu.UploadSpeed.512000.upload.speed=512000 + +rakwireless_rak3112.menu.DebugLevel.none=None +rakwireless_rak3112.menu.DebugLevel.none.build.code_debug=0 +rakwireless_rak3112.menu.DebugLevel.error=Error +rakwireless_rak3112.menu.DebugLevel.error.build.code_debug=1 +rakwireless_rak3112.menu.DebugLevel.warn=Warn +rakwireless_rak3112.menu.DebugLevel.warn.build.code_debug=2 +rakwireless_rak3112.menu.DebugLevel.info=Info +rakwireless_rak3112.menu.DebugLevel.info.build.code_debug=3 +rakwireless_rak3112.menu.DebugLevel.debug=Debug +rakwireless_rak3112.menu.DebugLevel.debug.build.code_debug=4 +rakwireless_rak3112.menu.DebugLevel.verbose=Verbose +rakwireless_rak3112.menu.DebugLevel.verbose.build.code_debug=5 + +rakwireless_rak3112.menu.EraseFlash.none=Disabled +rakwireless_rak3112.menu.EraseFlash.none.upload.erase_cmd= +rakwireless_rak3112.menu.EraseFlash.all=Enabled +rakwireless_rak3112.menu.EraseFlash.all.upload.erase_cmd=-e + +############################################################## kodedot.name=kode dot kodedot.bootloader.tool=esptool_py diff --git a/variants/rakwireless_rak3112/pins_arduino.h b/variants/rakwireless_rak3112/pins_arduino.h new file mode 100644 index 00000000000..5d1e451494a --- /dev/null +++ b/variants/rakwireless_rak3112/pins_arduino.h @@ -0,0 +1,50 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +// Reference: RAK3112 Module Datasheet +// https://docs.rakwireless.com/product-categories/wisduo/rak3112-module/datasheet/ + +// Note:GPIO33,GPIO34,GPIO35.GPIO36,GPIO37 is not available in the 8MB and 16MB Octal PSRAM version + +#define USB_VID 0x303a +#define USB_PID 0x1001 + +#define LED_GREEN 46 +#define LED_BLUE 45 + +static const uint8_t LED_BUILTIN = LED_GREEN; +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN + +static const uint8_t BAT_VOLT = 21; + +static const uint8_t TX = 43; +static const uint8_t RX = 44; + +static const uint8_t SDA = 9; +static const uint8_t SCL = 40; + +#define WIRE1_PIN_DEFINED +static const uint8_t SDA1 = 17; +static const uint8_t SCL1 = 18; + +static const uint8_t SS = 12; +static const uint8_t MOSI = 11; +static const uint8_t MISO = 10; +static const uint8_t SCK = 13; + +#define LORA_ANT_SWITCH 4 // Antenna switch power control pin + +#define LORA_SCK 5 // SX1262 SCK +#define LORA_MISO 3 // SX1262 MISO +#define LORA_MOSI 6 // SX1262 MOSI +#define LORA_CS 7 // SX1262 CS +#define LORA_RST 8 // SX1262 RST + +#define LORA_DIO1 47 //SX1262 DIO1 +#define LORA_BUSY 48 +#define LORA_IRQ LORA_DIO1 + +#endif /* Pins_Arduino_h */ From 6474127dd4359bbf3860a6874c9b2b99b871659e Mon Sep 17 00:00:00 2001 From: John Date: Wed, 2 Jul 2025 08:48:03 -0400 Subject: [PATCH 206/290] Update ZigbeeColorDimmableLight to clamp color hue and saturation to 0-254 (Fixes #11527) (#11528) * Clamp Zigbee color saturation to 0-254 * Clamp hue to 0-254 for Zigbee color lights * Use std::min instead of ternary operator * 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/ep/ZigbeeColorDimmableLight.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp index caac73b5c68..2fb07fc2187 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp @@ -1,3 +1,4 @@ +#include #include "ZigbeeColorDimmableLight.h" #if CONFIG_ZB_ENABLED @@ -127,7 +128,8 @@ bool ZigbeeColorDimmableLight::setLight(bool state, uint8_t level, uint8_t red, espXyColor_t xy_color = espRgbColorToXYColor(_current_color); espHsvColor_t hsv_color = espRgbColorToHsvColor(_current_color); - uint8_t hue = (uint8_t)hsv_color.h; + uint8_t hue = std::min((uint8_t)hsv_color.h, (uint8_t)254); // Clamp to 0-254 + uint8_t saturation = std::min((uint8_t)hsv_color.s, (uint8_t)254); // Clamp to 0-254 log_v("Updating light state: %d, level: %d, color: %d, %d, %d", state, level, red, green, blue); /* Update light clusters */ @@ -174,7 +176,7 @@ bool ZigbeeColorDimmableLight::setLight(bool state, uint8_t level, uint8_t red, } //set saturation ret = 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 + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_SATURATION_ID, &saturation, false ); if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) { log_e("Failed to set light saturation: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret)); From 33c84382635223489d23efd60e39926c3b175f02 Mon Sep 17 00:00:00 2001 From: Paul Price <56952812+strid3r21@users.noreply.github.com> Date: Wed, 2 Jul 2025 08:48:40 -0400 Subject: [PATCH 207/290] Add FED4 board (#11536) * Added Fed 4 board * fixed boards.txt * fixed board.txt again * added usb pid address * fixed typo: updated name to upper case * fix(fed4): update PID and change partition scheme to default_16MB * fix(fed4): remove unused OPI flash mode configurations * 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 | 185 +++++++++++++++++++++++++++++++++++ variants/fed4/pins_arduino.h | 79 +++++++++++++++ 2 files changed, 264 insertions(+) create mode 100644 variants/fed4/pins_arduino.h diff --git a/boards.txt b/boards.txt index fe67071ea17..4e92d2665e9 100644 --- a/boards.txt +++ b/boards.txt @@ -50762,3 +50762,188 @@ kodedot.recipe.hooks.objcopy.postobjcopy.3.pattern_args= kodedot.recipe.output.save_file={build.project_name}.ino.bin ############################################################## + +# FED4 Board +fed4.name=FED4 +fed4.vid.0=0x303A +fed4.pid.0=0x82E5 +fed4.upload_port.0.vid=0x303A +fed4.upload_port.0.pid=0x82E5 +fed4.bootloader.tool=esptool_py +fed4.bootloader.tool.default=esptool_py + +fed4.upload.tool=esptool_py +fed4.upload.tool.default=esptool_py +fed4.upload.tool.network=esp_ota + +fed4.upload.maximum_size=1310720 +fed4.upload.maximum_data_size=327680 +fed4.upload.flags= +fed4.upload.extra_flags= +fed4.upload.use_1200bps_touch=false +fed4.upload.wait_for_upload_port=false + +fed4.serial.disableDTR=false +fed4.serial.disableRTS=false + +fed4.build.tarch=xtensa +fed4.build.bootloader_addr=0x0 +fed4.build.target=esp32s3 +fed4.build.mcu=esp32s3 +fed4.build.core=esp32 +fed4.build.variant=fed4 +fed4.build.board=FED4 + +fed4.build.usb_mode=1 +fed4.build.cdc_on_boot=0 +fed4.build.msc_on_boot=0 +fed4.build.dfu_on_boot=0 +fed4.build.f_cpu=240000000L +fed4.build.flash_size=16MB +fed4.build.flash_freq=80m +fed4.build.flash_mode=dio +fed4.build.boot=qio +fed4.build.boot_freq=80m +fed4.build.partitions=default_16MB +fed4.build.defines= +fed4.build.loop_core= +fed4.build.event_core= +fed4.build.psram_type=qspi +fed4.build.memory_type={build.boot}_{build.psram_type} + +## IDE 2.0 Seems to not update the value +fed4.menu.JTAGAdapter.default=Disabled +fed4.menu.JTAGAdapter.default.build.copy_jtag_files=0 +fed4.menu.JTAGAdapter.builtin=Integrated USB JTAG +fed4.menu.JTAGAdapter.builtin.build.openocdscript=fed4-builtin.cfg +fed4.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 +fed4.menu.JTAGAdapter.external=FTDI Adapter +fed4.menu.JTAGAdapter.external.build.openocdscript=fed4-ftdi.cfg +fed4.menu.JTAGAdapter.external.build.copy_jtag_files=1 +fed4.menu.JTAGAdapter.bridge=ESP USB Bridge +fed4.menu.JTAGAdapter.bridge.build.openocdscript=fed4-bridge.cfg +fed4.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +fed4.menu.FlashMode.qio=QIO 80MHz +fed4.menu.FlashMode.qio.build.flash_mode=dio +fed4.menu.FlashMode.qio.build.boot=qio +fed4.menu.FlashMode.qio.build.boot_freq=80m +fed4.menu.FlashMode.qio.build.flash_freq=80m +fed4.menu.FlashMode.qio120=QIO 120MHz +fed4.menu.FlashMode.qio120.build.flash_mode=dio +fed4.menu.FlashMode.qio120.build.boot=qio +fed4.menu.FlashMode.qio120.build.boot_freq=120m +fed4.menu.FlashMode.qio120.build.flash_freq=80m +fed4.menu.FlashMode.dio=DIO 80MHz +fed4.menu.FlashMode.dio.build.flash_mode=dio +fed4.menu.FlashMode.dio.build.boot=dio +fed4.menu.FlashMode.dio.build.boot_freq=80m +fed4.menu.FlashMode.dio.build.flash_freq=80m + +fed4.menu.FlashSize.16M=16MB (128Mb) +fed4.menu.FlashSize.16M.build.flash_size=16MB + +fed4.menu.LoopCore.1=Core 1 +fed4.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +fed4.menu.LoopCore.0=Core 0 +fed4.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +fed4.menu.EventsCore.1=Core 1 +fed4.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +fed4.menu.EventsCore.0=Core 0 +fed4.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +fed4.menu.USBMode.hwcdc=Hardware CDC and JTAG +fed4.menu.USBMode.hwcdc.build.usb_mode=1 +fed4.menu.USBMode.default=USB-OTG (TinyUSB) +fed4.menu.USBMode.default.build.usb_mode=0 + +fed4.menu.CDCOnBoot.default=Disabled +fed4.menu.CDCOnBoot.default.build.cdc_on_boot=0 +fed4.menu.CDCOnBoot.cdc=Enabled +fed4.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 + +fed4.menu.MSCOnBoot.default=Disabled +fed4.menu.MSCOnBoot.default.build.msc_on_boot=0 +fed4.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +fed4.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +fed4.menu.DFUOnBoot.default=Disabled +fed4.menu.DFUOnBoot.default.build.dfu_on_boot=0 +fed4.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +fed4.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +fed4.menu.UploadMode.default=UART0 / Hardware CDC +fed4.menu.UploadMode.default.upload.use_1200bps_touch=false +fed4.menu.UploadMode.default.upload.wait_for_upload_port=false +fed4.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +fed4.menu.UploadMode.cdc.upload.use_1200bps_touch=true +fed4.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +fed4.menu.PartitionScheme.default_16MB=Default (6.25MB APP/3.43MB SPIFFS) +fed4.menu.PartitionScheme.default_16MB.build.partitions=default_16MB +fed4.menu.PartitionScheme.default_16MB.upload.maximum_size=6553600 +fed4.menu.PartitionScheme.large_spiffs=Large SPIFFS (4.5MB APP/6.93MB SPIFFS) +fed4.menu.PartitionScheme.large_spiffs.build.partitions=large_spiffs_16MB +fed4.menu.PartitionScheme.large_spiffs.upload.maximum_size=4718592 +fed4.menu.PartitionScheme.app3M_fat9M_16MB=FFAT (3MB APP/9MB FATFS) +fed4.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB +fed4.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 +fed4.menu.PartitionScheme.fatflash=Large FFAT (2MB APP/12.5MB FATFS) +fed4.menu.PartitionScheme.fatflash.build.partitions=ffat +fed4.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 + +fed4.menu.CPUFreq.240=240MHz (WiFi) +fed4.menu.CPUFreq.240.build.f_cpu=240000000L +fed4.menu.CPUFreq.160=160MHz (WiFi) +fed4.menu.CPUFreq.160.build.f_cpu=160000000L +fed4.menu.CPUFreq.80=80MHz (WiFi) +fed4.menu.CPUFreq.80.build.f_cpu=80000000L +fed4.menu.CPUFreq.40=40MHz +fed4.menu.CPUFreq.40.build.f_cpu=40000000L +fed4.menu.CPUFreq.20=20MHz +fed4.menu.CPUFreq.20.build.f_cpu=20000000L +fed4.menu.CPUFreq.10=10MHz +fed4.menu.CPUFreq.10.build.f_cpu=10000000L + +fed4.menu.UploadSpeed.921600=921600 +fed4.menu.UploadSpeed.921600.upload.speed=921600 +fed4.menu.UploadSpeed.115200=115200 +fed4.menu.UploadSpeed.115200.upload.speed=115200 +fed4.menu.UploadSpeed.256000.windows=256000 +fed4.menu.UploadSpeed.256000.upload.speed=256000 +fed4.menu.UploadSpeed.230400.windows.upload.speed=256000 +fed4.menu.UploadSpeed.230400=230400 +fed4.menu.UploadSpeed.230400.upload.speed=230400 +fed4.menu.UploadSpeed.460800.linux=460800 +fed4.menu.UploadSpeed.460800.macosx=460800 +fed4.menu.UploadSpeed.460800.upload.speed=460800 +fed4.menu.UploadSpeed.512000.windows=512000 +fed4.menu.UploadSpeed.512000.upload.speed=512000 + +fed4.menu.DebugLevel.none=None +fed4.menu.DebugLevel.none.build.code_debug=0 +fed4.menu.DebugLevel.error=Error +fed4.menu.DebugLevel.error.build.code_debug=1 +fed4.menu.DebugLevel.warn=Warn +fed4.menu.DebugLevel.warn.build.code_debug=2 +fed4.menu.DebugLevel.info=Info +fed4.menu.DebugLevel.info.build.code_debug=3 +fed4.menu.DebugLevel.debug=Debug +fed4.menu.DebugLevel.debug.build.code_debug=4 +fed4.menu.DebugLevel.verbose=Verbose +fed4.menu.DebugLevel.verbose.build.code_debug=5 + +fed4.menu.EraseFlash.none=Disabled +fed4.menu.EraseFlash.none.upload.erase_cmd= +fed4.menu.EraseFlash.all=Enabled +fed4.menu.EraseFlash.all.upload.erase_cmd=-e + +fed4.menu.ZigbeeMode.default=Disabled +fed4.menu.ZigbeeMode.default.build.zigbee_mode= +fed4.menu.ZigbeeMode.default.build.zigbee_libs= +fed4.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) +fed4.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +fed4.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote + +############################################################## diff --git a/variants/fed4/pins_arduino.h b/variants/fed4/pins_arduino.h new file mode 100644 index 00000000000..f3741700ffa --- /dev/null +++ b/variants/fed4/pins_arduino.h @@ -0,0 +1,79 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include +#include "soc/soc_caps.h" + +#define USB_VID 0x303A +#define USB_PID 0x82E5 +#define USB_MANUFACTURER "Smart Bee Designs LLC" +#define USB_PRODUCT "FED4" +#define USB_SERIAL "" + +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 SDA2 = 20; +static const uint8_t SCL2 = 19; + +static const uint8_t SS = 47; +static const uint8_t MOSI = 11; +static const uint8_t MISO = 13; +static const uint8_t SCK = 12; +static const uint8_t SDCS = 10; // sd cs pin +static const uint8_t DSCS = 14; //display cs pin + +static const uint8_t A1 = 1; +static const uint8_t A2 = 2; +static const uint8_t A3 = 3; +static const uint8_t A4 = 4; +static const uint8_t A5 = 5; +static const uint8_t A6 = 6; + +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 D8 = 8; +static const uint8_t D13 = 13; +static const uint8_t D9 = 9; + +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 BOOT_BTN = 0; +static const uint8_t VBAT_VOLTAGE = 7; +static const uint8_t LDO2 = 47; +static const uint8_t STATUS_RGB = 35; +static const uint8_t RGB_STRIP = 36; +static const uint8_t INTERRUPT_PIN = 18; +static const uint8_t USER_BTN_1 = 14; +static const uint8_t USER_BTN_2 = 39; +static const uint8_t USER_BTN_3 = 40; +static const uint8_t AMP_DIN = 39; +static const uint8_t AMP_SD = 42; +static const uint8_t AMP_BCLK = 45; +static const uint8_t AMP_LRCLK = 48; +static const uint8_t MSBY = 15; +static const uint8_t TRRS_1 = 4; +static const uint8_t TRRS_2 = 2; +static const uint8_t TRRS_3 = 3; + +#define PIN_RGB_LED STATUS_RGB +// 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 RGB_BRIGHTNESS 64 + +#endif /* Pins_Arduino_h */ From 12e881b6d6cd91bfbe0f58feac10bb58ceeb34c2 Mon Sep 17 00:00:00 2001 From: Paula Scharf <48286621+PaulaScharf@users.noreply.github.com> Date: Wed, 2 Jul 2025 21:22:20 +0200 Subject: [PATCH 208/290] fix(board): Update variant.cpp for senseBox MCU-S2 ESP32-S2 (#11532) * fix(board): Update variant.cpp for senseBox MCU-S2 ESP32-S2 * fix(board): translate comments * ci(pre-commit): Apply automatic fixes * fix(board): translate comments * 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 | 2 +- variants/sensebox_mcu_esp32s2/APOTA.bin | Bin 0 -> 783824 bytes variants/sensebox_mcu_esp32s2/APOTA.ino | 283 ++++++++++++++++++++++ variants/sensebox_mcu_esp32s2/variant.cpp | 74 +++--- 4 files changed, 331 insertions(+), 28 deletions(-) create mode 100644 variants/sensebox_mcu_esp32s2/APOTA.bin create mode 100644 variants/sensebox_mcu_esp32s2/APOTA.ino diff --git a/boards.txt b/boards.txt index 4e92d2665e9..4198f3856b0 100644 --- a/boards.txt +++ b/boards.txt @@ -40993,7 +40993,7 @@ sensebox_mcu_esp32s2.menu.PartitionScheme.tinyuf2=TinyUF2 4MB (1.3MB APP/960KB F sensebox_mcu_esp32s2.menu.PartitionScheme.tinyuf2.build.custom_bootloader=bootloader-tinyuf2 sensebox_mcu_esp32s2.menu.PartitionScheme.tinyuf2.build.custom_partitions=partitions-4MB-tinyuf2 sensebox_mcu_esp32s2.menu.PartitionScheme.tinyuf2.upload.maximum_size=1441792 -sensebox_mcu_esp32s2.menu.PartitionScheme.tinyuf2.upload.extra_flags=0x2d0000 "{runtime.platform.path}/variants/{build.variant}/tinyuf2.bin" +sensebox_mcu_esp32s2.menu.PartitionScheme.tinyuf2.upload.extra_flags=0x2d0000 "{runtime.platform.path}/variants/{build.variant}/tinyuf2.bin" 0x170000 "{runtime.platform.path}/variants/{build.variant}/APOTA.bin" sensebox_mcu_esp32s2.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) sensebox_mcu_esp32s2.menu.PartitionScheme.default.build.partitions=default sensebox_mcu_esp32s2.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) diff --git a/variants/sensebox_mcu_esp32s2/APOTA.bin b/variants/sensebox_mcu_esp32s2/APOTA.bin new file mode 100644 index 0000000000000000000000000000000000000000..0ea39335dce0e13a3c900367b76eacc9b413922a GIT binary patch literal 783824 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’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 KyFd;c3iu+q7se)RIqiEi%qr+Nis-^Sv9m4z zg`F*!No9TBOuos+H~Os4@a%cRajsr0KX9{5P$AzxS6UKTvn#So|JICUTVnFBd@8HN zq*%Fhct!T}5C5FojmVi*X69zY}KgHZTB zqYsNsjl?z9(iTq6CR@`|hOMa=*OP5ml`XLzp$k7C;B%YF-X&He6reEWN3PUEGk!%c z!1-VnW_7;05=a+|vly-bv81V{AKbpomHiT=4DdoNVZqnos}4H&P8c0Y`~Ls#$iDxN zjvTp=yC>rRceRKP9*9taf0hZBzZ(1p8bH$gByH7qXvMVe%1B#FCh6bFuwGyk>N~rb zI3V*G7we()YWl~@r4m6JoZM3}R~OA{3hO9BPvWhwCVJJh`jWK`e0-lebj1pE6a0I@ zS~wOS=d=bmt%ID_wubOOmTF&~OSffGnyJ6j0E&VQqZPmzDih23UzDlkuYX=4FfYo6 zeGlk^rS@gZLz?w;us$r;o=27sKdV>E+dp&gjUd!ZC7O2#a0^U&(Ng)0dU=C>`7!cE~FP9p#nP*0~Q42z~3q@;qL3 zfPIX+PUsMRH*|5mbj31o{VPlr<$L*+Q!A>?7TRYHgA?@zpyLt)ipc10UOBg`ttD)H zhhuw}vA+HeVwCCJjGzgXPi9n8(Z~qv0n3`O{LGE&y{uCq7^>a|dtqZ5wQQ%#n8xXT z?ha!bec-ui7t5qumy$XkWrPj`t`aYYi3Dx^p6Q_>; z`{1F2zYXhuB)4jHSTon~k3|yA)EStjn z^&pq5p=GMV;;{LZzhDvJIk*HP`Kx`1O&G-G^Z!oMt;q`B6Hb1WZ01yKW|QunD{tVI ze`O*$yB#-qI!nme`zbu?^M*CTdkMp+Vz^;9r}5>9v~?c%<3!Dxx;(1>9#Ct z{10s4ckJLFSiwm^?C5rLa;BE+cGEdipVsZBu-n@{nUJ48h>>VLSf-NCJ$QR3gF8SE zvHx|877C`4#nSfKM7>x(ZAhOcKXQOn4kXGOZacupG=rp&MWo%DI}oL~&r-|Hyy z;nz_l|Mg!L*>-IrQskmSDlD&f6?x)b#RRBqtW6PQz2*ha1C6Wm5Gr(`<_hK_`|fgS#h~uHZJ(CER1m zqndF2f$*SAfIslyfTMJ2lqECVEZ(=I4=4lizI!F^;o7(6YlT1=2A4$yc2djPl1DG4 zQg1TC{djfF8yL78e>qz;jf-g@Yf3|dpG%#g_+3@?XSm- z@3RN`QRa9=(22d@vb4osXNQOj5AS8Er%rK|R&=Cy_~cWFw~pgl=TOtNm2lCoP`$wX zLoPGBIdT|wOiNGTaeuj8&$D&SOKOEJQbuNaAwz{%#59li$3CNfje;~mkB%{zf z26?a`()iIV^w_dj3f)oTzbx;U1P`IVEN7Ni8s#57u|L>4)TJ#zqmTuT4QrdWc@3 z_P`7c@I!PMf*kNs12n)`;MMp|EU3Weu|?!m&d-+UjsVIAhD?R6_mXfqqA;}l*Lm>! zvAKsEYuQvdMddhBnW(;aX9517)xp_Y4uc*+2d@JGLzz290ttsXh-eO&7`8ytf$>@WO8#AnA<-7GlRbKQv|T6 zfZH(N7n*<%{iOWF^3MsNDIpZpbtZa$_QN0??(qIs7lb~K)FjjMaE*W_B$M1EBtF+9 z@!(lLi!_R?l29$#N&OR{=S$imvMuN`{yu@58SL%{Xj?f~{pCb6miAX!@)c29v4fDJ z7A$6e&ZG@Ss2&JpUuE?Md;ioYWMUAH17S)+?@#$EYeX6g+X~oVrCOFxV7s502*#uR zP>Cr^W0Z(TCrTe=WVzLdb2r}cS;zP30dsj&`wW`Bi#idQJ`zYJ_K9C-0n7Eh2{5v# zV=XR@p~}hmeTIxKJewjNQA%U-;aT}#Kj}TWvCtS}Y%aN}i~mZw`1h1a#pExh1w z`3~y!TT08xKvQTM`V69sPKQoSxEoU(SpW^cR49V*8Ui%;MQ1wY-Yc;lj05>ShDAL& z0v2gRjjM2OT0>jwP;f0N}ksZt<^;%!Vrkr(JxY7?`rXNxu21o zErY+_SrObKjP4&x2$A5g#KKZ?n#Ahgk(pWYv%0w?V&IK|OSh+2r$Ih2gBl4S%uXug zYda^lm+_Wr(tt}zA}Im4^jkYh&&nu<;cW3@mL<&0Tk~3C)^jY zomxJXXbvZ!?Qc#nQwC_5z(%Zj5VK>pSnxym_=gfmV`ay+T_xiRW>Lwfl9W&3hIN?x z{%6#us$)FJl}E|yCX2U78c`~R){+f^d^0^Q=*&YqDk5xZlDgKfq~W zqLanRtz^FjCZ0x8{{Gqr#SgYZ4Fxp~=GWm~I6Nz9mRO_Y&e}C=Yv9V$`Tx@jxS*~n z4*|H4<6DiXtqgK72BB4Wl*5P)a;`frLJw)#HUXWjRUC`m(=$bFE=jJ*6=OenSBn5> zaB+#$y|BeI@bvM8()|7w-`)uruc3WVr$NOHA~Zk)N#Pe;0FDi(l{>$xJ0)!>#_|}> z^mK94wTLSLTrC>6!m=)@&f0#dv-KEEaj{@6EfbxaM*@#PUQPR+p6J{{o=I$nO%rV3 z!4A%)z(SZdPL48i{LjSR!H@bW-?9>>D_0yWqA1s(sWPo|L%m=u$03*3t7Z}RCm3XA zMix&wf%`X>CxzUx-tw79_a#ou7cvQHX?Mev6H%ytRXkeb^G$3Me2XxIB~zVUeQ`vR=<@98n9=!?H zOuPX2_t72lGf{qVY|9bn$v(POv#G1g^I77RrBx+X%!B||$Z zF=}smc9cAAc4v;bIdw0Sn>(711Io8@!mOC#sNOfPZ;(mczBUt*o3XY&&(1~y(t1_y zRm_C35i*7>vEVa5Dw6mEk6=Lk6T#jvG-7yz3LU5r)pbrds*~#42p>Y>owHozYl{sP zl(_87^P~+u9s%@hAR=zcSuReorF6q5?BnoZakqTdklg0EaY`X}X}UmL-l+>|CeM?n zCZL%XrL=anw5*I+Hr{GeXv3{Gb$)Ypt~&Kr8$wU~x(y6XT2P4=q?fCoByIS5(*uK+ z4AO?QBpKQex+$4#LulshHiYhvjnqG5vi>y_a6S~JY>Cv5D4P*FhA{~}IpJP`b6%do zSDf6G7Wata-iEZUCrvz#Iw?XR2KegLI16Fr8G1BUsfL1(vHU(3p6=|!+Nr&?p6_&D z)N?a?B-S@&N*OQ1!LFu=fBVV_B?)Y$jRdTAh?Sx_ohS7?NN7}GHI+qk1XsgNAK>l* z%SMW_#FsqE3L@t#=!hl4E4{T-lO3;FuuSPL^T|pkX`%o}CPfvAvyvN>yg5a@OroNq`gWGa)F)c%O?*=b4P2u?%5rPRyt4k=rq z;w0x+`R_Lw;c7FLGhV(aP`=6Y*e1V+w*RdOB?Aw4ItM{a+~IwEM%#g{l&dbDdzilx z`c6$ODSs!k6Al-?=^W(w#nwv6{WjTgm>c-*rZfi~_{}CCY>h~8pviSsVA$l~5k={u zO@X3Ko&r>NzkP&M=XHxhaUAGdfO`dDbe(xH4Jt=cMvw4uS$-~)n-YxUp5o@P5 zc`GP#w}3v=wZ4Vrc-VTlj8bVgJg?FboO5~A2&$l zyLlO#&pD(S4(Qm-p46>d);i#9VsqcDvPx{+cth90APPAR8PSO~)cbYa-Jkrs6~j3j;zQjoMBBjc!eq;Vs!7!)wy}P zA}VEJ%ejS8`~|bLWRa4mx@x#1>-FYyN@<1)w#J)3ODBSXj-l zLWR9>Mr0oB)N!439i2gHTB&R)*xpPG#8O+7^vpMO((&%*KzFle8-}gGew~O3E*hj6 z3rn{&-)eJwJ^rv9WpWLXzL0^r$mZ z5h2j@4kxmK5p~$OaK>ytwB_*(jW5XD!rNgjY0X+?!4sr0wvp7vT6pEYUWe+vM`iB) zS4O-o5B6JHvCoXysAqm=#t0V|Z~rsNQu>GH=sEy&$zqjmj`|6Uw^XbwkTYXS599`L znN*fCmH>x&hnbR8_k!@)6r~VQK_@!JXKkLxnvbfte>t4ip9t>OhKtH|LardI8yg<3 z1>-}^7r}1wev=IajV~ah8gFhdGecE4iwDL7k8a+}#XKL+PyMPx+cSIxwsGoKC9HG#}>WDY10s z2_ZzpHn(yFePJDU=KRMl9+BpaWld{7J|;bS1T-G&<_%a0DVqaIto~J=sm*qlOfMEg zMl04*L2PqmH*MW)6wR_+zXOabRcMuoT=FzhJ8CETyof^9*;fuzlYo5E1 zk&RAf5H)6LY;)d1?<28!OBs!MsjxJMu8146R;b1_`s{rw+!a0|#-8%$03SHRI+rfYq{go|1+F&vU)tApB21ay zxS6yRp;HUt6>JoxL@$L$r?Du-^xO@jNRc%8OQBgr2U94|$B>oH1W~xE0T}0@d2xo-(m9&Ul0KV@kPq*|?B3B}wZZE;+YzF1XM zRGe)P!7U+T51YTU6>il<3F+Cz+;mlX9L%l?2}~R7(I#29)@h&w{#zI<43-Iz6DZ?( z#Euj~|1olpW5&pJoabxfG>bL;bm6;{S1Mz;zPT2Ky$MCEqn-2&;N}a29H%UHPa+-U zalF#_rc1tT%QmrBI<-R@(pj7w&0fWJ1nf)W!I{@NJK7Zi8Z%v*bzCLQbHacmFET;T zdp+v@y(41EG+*G4n)&^jCMqGH+T}SIdHbT5AAde7e$Na9aiIG6r=v7a(rpgv)Xq7h zQ~MJ4^v>>6yVARNYREUwcn%I7hwVtXZ?5xhF3!a6ow3d-5+h%-ed#bREMUG(3FVF5ZDhlD;B^=--JsRrdJpav1)4`wZi|X3D>9!^+seAi&fXC9o2I|u&vb{l% zoaLNQHOD2@ETILp6f2F^T%&{4R33{N%_B4F$BEW<(1Dfbci-Iaka(qHO#0(kMKl}bp@O_Wp0XnrE*DJ-JkK-_Pnc6_su^`x%o*-Bj4 zCImYD}^JeIwY+{-Iye zyhl?8KiRoky%l6w@0B9mz(WH2*A z23MF+`PMBq5@~p%YJ2U~^dv?Gt(dvhTm-uTUl{FIE}GFSue}|K@w<0s@{>C| zTY;)Lv>wL}{PU6;BRW=`U4A&!M+4sw`~p0Yr>k#-$Bej6WWenyV(01w!t;)>7hXIF zkCvgvpS;lau)S=f^CkCAm)E0Jie{Lc9JiyT+jZGfu@Ruq>KuXHx=~p~MN9_(!3C8Z2Zn===+!uPA0-o{Km6Dd~7vgZ>O2RG~$rRy2<-UM$2?Jbfh zi{PYA{K*vyH+qZW(?xsrd$o93G)bvjh9>cFsL))L)7h^R#cNiP@I|H#H}DRY>!_xK zgQ>v6b#UaRYfb&~@KOfA)l35_-bGht$=^&#TKa&}y6D1= zaASoOvDO*b>0w2@VE|C~Iaa#0-64|qB_i;8y0q<43c(uzP%r=ZpV9L&7j>CVe%%H; z2ZNh40&xAeTQO{qb+?lNGadbB@Wn6_RXWy)Luqe{jvrsdx2{s%D;oQvXzJKYMe4ED z`nj1!UGP3Q+nUrvtb=nu*14|-oxnE8*LQ(MCw89DjhSA_XZ*hwi$HYlJ2eUQBG+w(DP}5uS_#_^W7fW|8 z1RK6H!h)1oVOV3>TN^OmV6hMQFYkXpWpGa; zZaKas0$c;Bw^U7A_avP?r$Vg)ZZ5sHx{Wr;_et&gJT8r5X%ss`f#vUnf zakWzA0+rQ}4kl>941M{M1?N(w1sfX)SCr0!Nqw{xU~(&KF=wW>FJMUyJHM@sWd*pD z7FG8tl9a}Uz>22SOT&tmMhw9SZVsJ)9c*gE#$@6{-}4PX+MSD*Uo1qdRrg(%Hv|am zpxhlct-Xv^qBWJY05RZTn|ar5nQ-XHujK%iIWd;O)oTB0-%2VJBT#p9)USwqudKFQ z!JP!(5#OvA==u9*{qyXJh}8OBmsE}e(Jf#fh_|d23yA+Kbt*xa)B`Vj)3uxO2LL)n z-aQZ{ApJoZ;NT$mR=Tf4qM)4)`T&?st2rukBFa4}knmj<-S!cMyVHewOaMGj8>!G; zF`>+uJ1*X{wduX>2>3Pq@_1omps>-ixY6$hN(;#tX(OC!7BmJHG(u+L$#1l8Cok?{ zCqI%g(np@SM*A{SX(%}c+gGQ&-xP;n%`uQZI7ILnVj2Tc$afwJmZTn#tdRu1KY@3k z_p`H!Y4djt zf$thTUpDyNJ@yRJX8X4dSzkA>=DX})H|UHTSaaqt{>>zRs38z)@O;wX-|eu^Ao-p2 zw+IW^A+eUJg{u-BvfiScO2Gq&aj2GvSo+?`&g4$-t#H| zE|EYL`;Rd2q>^&M-|Gwsq^2Lj2%n9pz8!NqQaj?I+a>G5PL0K7W!I0z7wGE8rj};a zJGh-ijELx;MgpRU*2jkkJ_$uUm#sTqP;4Wb?#v>7*@4?#@#NsE+F_rhk-T3 zvxbBYTL;_W?C`RNS*#(m<3z{#j!Udr!WtH`h9aB!F6YRD&7ywqv1q2EA*vyKKnTTyUUEta&!H%jSD+=KE~s`)%fYn~_Ce+^@0*=yS2SOxKzk zFWH}L(8;O*a%!vwub`tZz_`d4)23+ZG~{fS@tAWkt^}7RfHQ;>P10d5~Os+|<^7-=D)knYU*DjjZjZVtgoE1zDE*8tHXtkuWQ@ zfmH#xg2%e44zB%<2E8b)OQ@wuKkgODTf+`+n(GJr<_cin^h=waZeF)Tj((w6P<1Up zTYwqxEhf z_7_QehJwsz9k27b0bZz(A~LmgTpeWUHDSw9hE?7#AEH@hzUeeI{%L*S3@UTtmQPWJ z3d(HGM;7_+8=h13gb{X5K(=Tw-;Z=A4ys*@+azrcT_$HI=xk(-+@jZ){+$N8BP1v; z^mwp75Ult6$~=Ab_U{OnN!6%c&WRl#LBwvPFDL8~e5rDzja@_xVX{-NP* zG5b5a4vPRbdih1 zRrNrgRn-?O_Li1FkiuW{tjI`TfaxcMLRE$qV?lzE_v~Uz+{Hc8s{WSa{Zj8yTpqFg zEv|4?Ym1SSj8&&o&@F6>5h2zp;;a^!KIquKV%HB5x3L_T9IbJJYSphRqE;Z zQ66Y7kW%c&n$N*-mUe0F5ZS{fmNZ&yQFw@pz7CyUJ zem}OV(Jg@t5n;&JR76Ff6wtawOt0oF|Ke_GUjJlwNr)RuN7%6VS<}mud_6WKVBgXG z$^AS)quxK%2mXNaKlbF++c!lTePsO6`oIdLorx??Cs)$>F^)xS3%FUsBdWb;9((jb zCTizFfAq84Q)+t;jf#f22YRQDCJeHm(8Y;f1k)u4%S3TFZ@(|u(pE<#rr*`8dfU&Pcs zKE5jj3z98HJbEEzB#N-$kYuh6Zp9a8U5ZezOxKY*kCpy`^NanUocOId9Il% z9gnULMAv&nsP8v+C8^KrmV_RM-6w~TG-#i6D|osUd_x4V$hbn-v7}?gEgcsFTm($t zmD@TmCOPtZ5?SPSe=gPquGD!h*7?1^wTmPD@%~4D_~;Mmid>t39hIk3Ch&3-+{$5P z8P8e9|AjYcc~u2^_t7B;MOIoO;UYi+BcE z&CSO$z!@9cJ^o=`-~+t*0rW(7B#d>gGsK2i#?*@AEXJ%vkY|z4W+#5|hvc)q8YEPI{V&B2N_a>=?iFCZb$)K$#cEuOYIIDPAhkr?7Tgq~pV8W$wX zlZ^Z%BJ)|kL|h8MmfiE*3ggNi3F|wFrZm03ebgKRhCt}C)Y+dVlh->ZUD%R6jGVPp|O3>Ch#s)(N#}0Su7AhU z8`EcYw04e?bZ;E5zXvUzEppK4fa&xEE8}-3NXJ!m0acwR2Bkc1Pa~x`<9N9=e7lW2 z0kmFdJH`Vm1Un4olH@8y((?1KVA086Wz2EB#fW4LCtM*TPg&E2n{yrfn`V)b&R^eB z*GIRdD^^Hp#tu`4S z6)Za-9lyCDaC3wIC9Ws5!5$_tCD}OsnxW|NpEd-3L^=;g&Kj3U&o#wSH@;v5%eoDi z5*c+PwRaW6M_yYTug(=)&+Y8ST{ps

    _1Dr>Izi4YFJuLKpmeYnuO)T7R%G(6yoe4wvZr{8%d0yLnJ`Z>kxG|o|xmQ~T zdyMmIz%Br<+5g)g&$54rMAhbG`bYk`4&pydzTzj8{}=q zDuJ!w&om`R{4PfulRk53B~CBlt$(x!|iBR%=1Mc-(=r|ZL$gZ`gJ&X z-JwTQc?gaxnoC-}H>ypVCZc4}2&_$}nK*C99nYY&pt@LNqN?a?e{!5EBUWuZr4qFs zO~&K_y%SZm`g97#qwD)xG`i=All@%567xjSb;ZRp%^3wpTj%Lk4KDp|=hVxEImVWGLEGlA=m3!m zt@5E(*ZEd9gd*nY<_&K9ZVXQN-tN|2nu`LL$Kyq4G4H=x&tT(CE!#nG&X-N@I5kv# z*cA%yOPsjjwGyq}sj(HC3Kyvgnp^YST6XJ*L%*$r`Huhu%ju3*S5xa1-GyLwn_}h# zmE%5URU8yH+V&Q_-)h`(yI^0d4l5;m%m!Th1Knb+?uOsHPvPcZFlP$R$~bRy?@*w! zR<&YsBCXCI!fW2xnu>FB9F$%R7NK2z&`>Cdb!s#xgs?j>t~v;c#?{!aBl9$Kolk|o8koH1LsHn>SD+YOGt7~)X1p(gLSPKEgM+B3nFLmDQ zw~3Yg6lY%Fx*>zDqei!=+b#u!#Dq(xkf9JO>6e_6P0bBO@WsAh++P2b7TRpg%^jJ6tC-pF z3mL#Qt=082!nLgrR}p1`My77&l+9B+1^D~1Xr7B0%r*xyJl^WcY`vgml@tb%pA&rZ zZjvt-I@Q>(Dkqh^d2rrbmiJxI$Fp18H5Xvs;&zVf9r&HNqj$f4?9A3i_p%E*CwDOi z!*-5K!^-KmMYy0l)&_GJ4O^px#YvDyQ1dbt0JPEXn4mPw%aTjO9m9dX-KE)Phq!zN zhZ5L}fnOdL^<%iC5OCWH0rbm2VprgohtUBPJUelB#0mpRzYF|68~Dwq-}~^HhqrEe zuoasWXw?sEwY~Z-J}p9}6lQw+-E;}tCX=(?Bn}nzyDQ3Uc(SmCd5++{5$JW=-rT$) zgialNuOLRn{NNEt*VEw|pOyeD_9c-lq&2xI#>S1t9g&-Kt=zaK>7Hx-NM!boYyogp zqH*{CTAbRK7@MKz3ZICAy(z}YwN$I4yx$#zO)9d~L=nwCigfP{io>st4GZ8)0={pY z@D|UtCwQ_EVou;oZ7ivOZuDY~W`Qu}OIead~G5#NI_7UGH8FuNO2~|#t z?S>2Jod?l>X@#u)t-#I@NPfySxPI8qerQHul7R-q35vf5zMa5(*FhbhqP>TY$<4>^ zVAZ%la)Sv(lhK6*oixhDLan$~xLO(&?c>g9;YnYIZoJ#Wn|d zvw+rcy2CW(JAd4N{LYz_H9q=~lUYL@xLFIG`H?g&dS4o`m~JU=rGB_N5Z z3NQP>4P}ZctqNvaSex!fWQ zbiRPmz9e~lnX}r7&z2DJVZ8K$ucM?++7eRw5uShP4~kFyIQ5@>sZ~uDCpRN)32FFJ z{Ue}{=N@TIA${=mE5g60(BDT0s` zCh=G+AuYu7|9SEROrcEGf=kWQ=?N8aYkZ{O zc52e0R-u#-j(6!ii1X^3M`LC{z5#zfeEw5EDL`ogPaY1F;s)xcrxfRY4Ixoz(EwV+ zfOl-=QS5I>fa^Yt*~+@{sH9cpWe98|&5~kb?PwLNI6B4vncGc#AP!S;HGv{OKzC_| zNm8bYZKfzO0>^#g18=yzd=$ITjTFmP9fcRvdkUUgDUSTAuW)A}mMuT(E>Yn>VqGsB zWh{W3aQy0M?>E6t+elokcRI;0_W+VkRS-nG!Bu?ppwL@+tM6XaiYd4DwsO~4psH&0 zi~CWmE&JoxZzzNJ7e`}qeLp`cKXde+64bvaK@o7O_N5GE&vU?8M`H?oIY;GL0YDsu z&cDivc-oAkG0T0^j>=E=rCsqCFBhgfsJd>S7N4=?dhWPl`12pBDoz%3W>wK<_2mOB zkLP^+=!^*8#G`ULat7A7KT|^Kweo-aT@M|N&lOxLN9i7^{6l|y)jY9o6yDIa&n+6H z(qStK!BEvVz2$0lwAr@94l~c*YPF8uEmN5nH@jUI(RD0>-IWfdH%mi z2(VnO;)m?zaQ39|^)~jgDt6-#5^>_fL8~?r@2^73Tj2{Q`}pXf-m89FVtAnc8=7g< zX}WI=h+C#MFKad>+Hu+(eii$M-rJ-sDaEQxqen`OYExn(jqtEV_n zExAXPV@WR2QR-hQm3Bi;`q-r{`o>RMCphCs_>;(CW=7*6m_bIA2<%S;lbTWbIaUEN zI4xtBc6Bn_$|KdD$OVtAjDEPN=v!`0@fyWe8y9SM?g-yeL#;!r!RqYN@9Aegw)Ptc zA|oDVfHo)INf>8CLPl(OY0ylrCkX{dk2<+2oxMzOu!Qizj+ZwlcuRo4;i&S@zC%Zlvd zFFVqsX0r$m6AaYq0=&6YX$3gnXiVeE@D^Cx!qkGK*=5EeT>cTL_o(jq?uc1Zsi zyLmX>9T~P1+p(M{4b2)Ay4MTAd2p*K;cgDz92Lu3l7uu6HkjumjxY~yL7NL~2w^Re zjLkz=CGQf3LDv)3DHMmE8$!Qg$ofZ@H%HZ2;UA16ifIL+zY(I1(2E}7SysWYJ_HeL zYOsUlX=19a6~Q%8X(gMEA4;8DGjFkeSW4Plw>j8epl7$60EZ4r-S-B4r|NbI@JLym zGOVU1g?&p=4mL?&)ih{VNDX2BibqZM8>d{_rRzQD*R6#fO{OJc)N9eKo8vupj7Vb#0dbNeF#DcdaCOSn=Xy<|N`TXqq=-0%q^<0&G3vt3D$C`3QVL!Y(JfPZ z@GY(gzvooyLnYrNJ>F4J;dKM{3PoTUkK64}wN77&E@6$IC6q7m!_eU!KeJJ?_r)XC zIT9TFEj=QyLj7Ja)Nor2QOAx@`XsblkZzN|BIg-x-iw|6SJo>j6>|)1ehb+P998}i zyR*)>t;>d*+Co!|4ZPioE9daJLAS zhy>iSkZmnfrCGCcp3%Ibouq}I?VoW389>nBd+La6

    mA-Yt~G^OxjK{C27_fn`#R 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 Date: Wed, 9 Jul 2025 16:52:51 +0200 Subject: [PATCH 243/290] fix(board): add APOTA description comments --- variants/sensebox_mcu_esp32s2/APOTA.ino | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/variants/sensebox_mcu_esp32s2/APOTA.ino b/variants/sensebox_mcu_esp32s2/APOTA.ino index 5f683752abc..afb741499b2 100644 --- a/variants/sensebox_mcu_esp32s2/APOTA.ino +++ b/variants/sensebox_mcu_esp32s2/APOTA.ino @@ -1,3 +1,7 @@ +// APOTA is a arduino fallback sketch that is written to OTA1_Partition. +// APOTA opens an access point which waits to receive a .binfile on /sketch. +// After succesful upload, the file is written to OTA0_Partition and the microcontroller reboots to the newly uploaded sketch. + #define DISPLAY_ENABLED #include From 76210797ed11288bfd3c6c27122f0103562196d3 Mon Sep 17 00:00:00 2001 From: Paula Scharf Date: Wed, 9 Jul 2025 16:53:33 +0200 Subject: [PATCH 244/290] fix(board): add APOTA to senseBox Eye --- boards.txt | 2 +- variants/sensebox_eye/APOTA.bin | Bin 0 -> 976464 bytes variants/sensebox_eye/APOTA.ino | 287 ++++++++++++++++++++++++++++++ variants/sensebox_eye/variant.cpp | 65 +++++-- 4 files changed, 343 insertions(+), 11 deletions(-) create mode 100644 variants/sensebox_eye/APOTA.bin create mode 100644 variants/sensebox_eye/APOTA.ino diff --git a/boards.txt b/boards.txt index 2363fe2a63b..faa7f94a994 100644 --- a/boards.txt +++ b/boards.txt @@ -41448,7 +41448,7 @@ sensebox_eye.menu.PartitionScheme.tinyuf2=TinyUF2 Compatibility (2MB APP/12MB FF sensebox_eye.menu.PartitionScheme.tinyuf2.build.custom_bootloader=bootloader_tinyuf2 sensebox_eye.menu.PartitionScheme.tinyuf2.build.custom_partitions=partitions_tinyuf2 sensebox_eye.menu.PartitionScheme.tinyuf2.upload.maximum_size=2097152 -sensebox_eye.menu.PartitionScheme.tinyuf2.upload.extra_flags=0x410000 "{runtime.platform.path}/variants/{build.variant}/tinyuf2.bin" +sensebox_eye.menu.PartitionScheme.tinyuf2.upload.extra_flags=0x410000 "{runtime.platform.path}/variants/{build.variant}/tinyuf2.bin" 0x210000 "{runtime.platform.path}/variants/{build.variant}/APOTA.bin" sensebox_eye.menu.PartitionScheme.gen4esp32scheme4=Huge App (16MB APP) sensebox_eye.menu.PartitionScheme.gen4esp32scheme4.build.custom_partitions=gen4esp32_16MBapp sensebox_eye.menu.PartitionScheme.gen4esp32scheme4.upload.maximum_size=16646144 diff --git a/variants/sensebox_eye/APOTA.bin b/variants/sensebox_eye/APOTA.bin new file mode 100644 index 0000000000000000000000000000000000000000..571336d378a9aaee97e074142d0e73cad85eacc9 GIT binary patch literal 976464 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≷x^7FI%UcR3XkqLI_RFGL$vd@ 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%0DP+A;b81N@9EePsk-uYiI&kE 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

    AOHUP{o*fRv~Cd6SN4qBLKczQ~18jMH7B*O| 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�^0xBfI3Fv>?00`5tR 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νoK>^ZCdccnlY$kw|K0708fqyvzeRgwf{I- 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 z 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

    mA-Yt~G^OxjK{C27_fn`#R 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 Date: Thu, 17 Jul 2025 16:15:10 +0200 Subject: [PATCH 247/290] feat(board): use additional button for APOTA --- variants/sensebox_eye/variant.cpp | 50 +++++++++++-------------------- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/variants/sensebox_eye/variant.cpp b/variants/sensebox_eye/variant.cpp index c802c614cc1..1eef839494e 100644 --- a/variants/sensebox_eye/variant.cpp +++ b/variants/sensebox_eye/variant.cpp @@ -72,45 +72,29 @@ void initVariant(void) { .loop_count = 0 }; - uint8_t pixel[3] = { 0x10, 0x00, 0x00 }; // green - blinkLED(pixel, led_chan, ws2812_encoder, tx_config); - // define button pin - pinMode(0, INPUT_PULLUP); - - // keep button pressed - unsigned long pressStartTime = 0; - bool buttonPressed = false; - - // Wait 3.5 seconds for the button to be pressed - unsigned long startTime = millis(); + pinMode(47, INPUT_PULLUP); // Check if button is pressed - while (millis() - startTime < 3500) { - if (digitalRead(0) == LOW) { - if (!buttonPressed) { - // The button was pressed - buttonPressed = true; - } - } else if (buttonPressed) { - // When the button is pressed and then released, boot into the OTA1 partition - const esp_partition_t *ota1_partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_1, NULL); + if (digitalRead(47) == LOW) { + // When the button is pressed and then released, boot into the OTA1 partition + const esp_partition_t *ota1_partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_1, NULL); - if (ota1_partition) { - esp_err_t err = esp_ota_set_boot_partition(ota1_partition); - if (err == ESP_OK) { - uint8_t pixel[3] = { 0x00, 0x00, 0x10 }; // blue - blinkLED(pixel, led_chan, ws2812_encoder, tx_config); - esp_restart(); // restart, to boot OTA1 partition - } else { - uint8_t pixel[3] = { 0x00, 0x10, 0x00 }; // red - blinkLED(pixel, led_chan, ws2812_encoder, tx_config); - ESP_LOGE("OTA", "Error setting OTA1 partition: %s", esp_err_to_name(err)); - } + if (ota1_partition) { + esp_err_t err = esp_ota_set_boot_partition(ota1_partition); + if (err == ESP_OK) { + uint8_t pixel[3] = { 0x00, 0x00, 0x10 }; // blue + blinkLED(pixel, led_chan, ws2812_encoder, tx_config); + esp_restart(); // restart, to boot OTA1 partition + } else { + uint8_t pixel[3] = { 0x00, 0x10, 0x00 }; // red + blinkLED(pixel, led_chan, ws2812_encoder, tx_config); + ESP_LOGE("OTA", "Error setting OTA1 partition: %s", esp_err_to_name(err)); } - // Abort after releasing the button - break; } + } else { + uint8_t pixel[3] = { 0x10, 0x00, 0x00 }; // green + blinkLED(pixel, led_chan, ws2812_encoder, tx_config); } } } From cf0a58908de30271845b036c17ef42ed2436d466 Mon Sep 17 00:00:00 2001 From: Paula Scharf Date: Fri, 18 Jul 2025 13:47:24 +0200 Subject: [PATCH 248/290] feat(board): remove APOTA --- boards.txt | 2 +- variants/sensebox_eye/APOTA.bin | Bin 976464 -> 0 bytes variants/sensebox_eye/APOTA.ino | 287 ------------------------------ variants/sensebox_eye/variant.cpp | 54 +----- 4 files changed, 3 insertions(+), 340 deletions(-) delete mode 100644 variants/sensebox_eye/APOTA.bin delete mode 100644 variants/sensebox_eye/APOTA.ino diff --git a/boards.txt b/boards.txt index faa7f94a994..2363fe2a63b 100644 --- a/boards.txt +++ b/boards.txt @@ -41448,7 +41448,7 @@ sensebox_eye.menu.PartitionScheme.tinyuf2=TinyUF2 Compatibility (2MB APP/12MB FF sensebox_eye.menu.PartitionScheme.tinyuf2.build.custom_bootloader=bootloader_tinyuf2 sensebox_eye.menu.PartitionScheme.tinyuf2.build.custom_partitions=partitions_tinyuf2 sensebox_eye.menu.PartitionScheme.tinyuf2.upload.maximum_size=2097152 -sensebox_eye.menu.PartitionScheme.tinyuf2.upload.extra_flags=0x410000 "{runtime.platform.path}/variants/{build.variant}/tinyuf2.bin" 0x210000 "{runtime.platform.path}/variants/{build.variant}/APOTA.bin" +sensebox_eye.menu.PartitionScheme.tinyuf2.upload.extra_flags=0x410000 "{runtime.platform.path}/variants/{build.variant}/tinyuf2.bin" sensebox_eye.menu.PartitionScheme.gen4esp32scheme4=Huge App (16MB APP) sensebox_eye.menu.PartitionScheme.gen4esp32scheme4.build.custom_partitions=gen4esp32_16MBapp sensebox_eye.menu.PartitionScheme.gen4esp32scheme4.upload.maximum_size=16646144 diff --git a/variants/sensebox_eye/APOTA.bin b/variants/sensebox_eye/APOTA.bin deleted file mode 100644 index 571336d378a9aaee97e074142d0e73cad85eacc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 976464 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≷x^7FI%UcR3XkqLI_RFGL$vd@ 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%0DP+A;b81N@9EePsk-uYiI&kE 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

    AOHUP{o*fRv~Cd6SN4qBLKczQ~18jMH7B*O| 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�^0xBfI3Fv>?00`5tR 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 z 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 +#include +#include +#include +#include +#include +#ifdef DISPLAY_ENABLED +#define SCREEN_WIDTH 128 +#define SCREEN_HEIGHT 64 +#define OLED_RESET -1 +#include +#include +Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); +#include +Adafruit_NeoPixel rgb_led_1 = Adafruit_NeoPixel(1, 1, NEO_GRB + NEO_KHZ800); + +#endif +#include "esp_partition.h" +#include "esp_ota_ops.h" +#include "esp_system.h" + +String ssid; +uint8_t mac[6]; + +// Create an instance of the server +WebServer server(80); +bool displayEnabled; + +const int BUTTON_PIN = 0; // GPIO for the button +volatile unsigned long lastPressTime = 0; // Time of last button press +volatile bool doublePressDetected = false; // Flag for double press +const unsigned long doublePressInterval = 500; // Max. time (in ms) between two presses for double press +volatile int pressCount = 0; // Counts the button presses + +const unsigned char epd_bitmap_wifi[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0xff, 0x00, 0x00, + 0x00, 0x3f, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x7c, 0x00, 0x03, 0xe0, 0x00, 0x00, 0xf0, 0x00, 0x01, 0xf0, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x78, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x7f, 0xe0, 0x0e, 0x00, + 0x0c, 0x01, 0xff, 0xf0, 0x06, 0x00, 0x00, 0x07, 0xff, 0xfc, 0x02, 0x00, 0x00, 0x0f, 0x80, 0x3e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x07, 0x80, 0x00, 0x00, 0x38, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x70, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x01, 0xe0, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x78, 0x00, 0x00, 0x00, 0x03, 0x80, 0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +// 'checkmark', 44x44px +const unsigned char epd_bitmap_checkmark[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0x83, 0xc0, 0x00, 0x00, 0x00, 0x07, 0xc7, 0x80, 0x00, 0x00, 0x00, 0x03, 0xef, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +void IRAM_ATTR handleButtonPress() { + unsigned long currentTime = millis(); // Get current time + + // Debounce: If the current press is too close to the last one, ignore it + if (currentTime - lastPressTime > 50) { + pressCount++; // Count the button press + + // Check if this is the second press within the double-press interval + if (pressCount == 2 && (currentTime - lastPressTime <= doublePressInterval)) { + doublePressDetected = true; // Double press detected + pressCount = 0; // Reset counter + } + + lastPressTime = currentTime; // Update the time of the last press + } +} + +// Function to switch the boot partition to OTA1 +void setBootPartitionToOTA0() { + const esp_partition_t *ota0_partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_0, NULL); + + if (ota0_partition) { + // Set OTA1 as new boot partition + esp_ota_set_boot_partition(ota0_partition); + Serial.println("Boot partition changed to OTA0. Restarting..."); + + // Restart to boot from the new partition + esp_restart(); + } else { + Serial.println("OTA1 partition not found!"); + } +} + +void setupDisplay() { + displayEnabled = display.begin(SSD1306_SWITCHCAPVCC, 0x3D); + if (displayEnabled) { + display.display(); + delay(100); + display.clearDisplay(); + } +} + +void displayStatusBar(int progress) { + display.clearDisplay(); + display.setCursor(24, 8); + display.println("Sketch wird"); + display.setCursor(22, 22); + display.println("hochgeladen!"); + + display.fillRect(0, SCREEN_HEIGHT - 24, SCREEN_WIDTH - 4, 8, BLACK); // Clear status bar area + display.drawRect(0, SCREEN_HEIGHT - 24, SCREEN_WIDTH - 4, 8, WHITE); // Draw border + int filledWidth = (progress * SCREEN_WIDTH - 4) / 100; // Calculate progress width + display.fillRect(1, SCREEN_HEIGHT - 23, filledWidth - 4, 6, WHITE); // Fill progress bar + + display.setCursor((SCREEN_WIDTH / 2) - 12, SCREEN_HEIGHT - 10); + display.setTextSize(1); + display.setTextColor(WHITE, BLACK); + display.print(progress); + display.println(" %"); + display.display(); +} + +void displayWelcomeScreen() { + display.clearDisplay(); + + // Draw WiFi symbol + display.drawBitmap(0, 12, epd_bitmap_wifi, 44, 44, WHITE); + + // Display SSID text + display.setCursor(40, 13); + display.setTextSize(1); + display.setTextColor(WHITE, BLACK); + display.println("Verbinde dich"); // "Connect" + display.setCursor(60, 27); + display.println("mit:"); // "with" + + // Display SSID + display.setCursor(40, 43); + display.setTextSize(1); // Larger text for SSID + display.print(ssid); + + display.display(); +} + +void displaySuccessScreen() { + display.clearDisplay(); + + // Draw WiFi symbol + display.drawBitmap(0, 12, epd_bitmap_checkmark, 44, 44, WHITE); + + // Display SSID text + display.setCursor(48, 22); + display.setTextSize(1); + display.setTextColor(WHITE, BLACK); + display.println("Erfolgreich"); // "Successfully" + display.setCursor(48, 36); + display.println("hochgeladen!"); // "uploaded!" + + display.display(); +} + +void wipeDisplay() { + display.clearDisplay(); + display.println(""); + display.display(); +} + +void setupWiFi() { + WiFi.macAddress(mac); + char macLastFour[5]; + snprintf(macLastFour, sizeof(macLastFour), "%02X%02X", mac[4], mac[5]); + ssid = "senseBox:" + String(macLastFour); + + // Define the IP address, gateway, and subnet mask + IPAddress local_IP(192, 168, 1, 1); // The new IP address + IPAddress gateway(192, 168, 1, 1); // Gateway address (can be the same as the AP's IP) + IPAddress subnet(255, 255, 255, 0); // Subnet mask + + // Set the IP address, gateway, and subnet mask of the access point + WiFi.softAPConfig(local_IP, gateway, subnet); + + // Start the access point + WiFi.softAP(ssid.c_str()); +} + +void setupOTA() { + // Handle updating process + server.on( + "/sketch", HTTP_POST, + []() { + server.sendHeader("Connection", "close"); + server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK"); + ESP.restart(); + }, + []() { + HTTPUpload &upload = server.upload(); + + if (upload.status == UPLOAD_FILE_START) { + Serial.setDebugOutput(true); + size_t fsize = UPDATE_SIZE_UNKNOWN; + if (server.clientContentLength() > 0) { + fsize = server.clientContentLength(); + } + Serial.printf("Receiving Update: %s, Size: %d\n", upload.filename.c_str(), fsize); + + Serial.printf("Update: %s\n", upload.filename.c_str()); + if (!Update.begin(fsize)) { //start with max available size + Update.printError(Serial); + } + } else if (upload.status == UPLOAD_FILE_WRITE) { + /* flashing firmware to ESP*/ + if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { + Update.printError(Serial); + } else { + int progress = (Update.progress() * 100) / Update.size(); + displayStatusBar(progress); // Update progress on status bar + } + } else if (upload.status == UPLOAD_FILE_END) { + if (Update.end(true)) { //true to set the size to the current progress + displaySuccessScreen(); + delay(3000); + wipeDisplay(); + } else { + Update.printError(Serial); + } + Serial.setDebugOutput(false); + } + yield(); + } + ); +} + +void setup() { + // Start Serial communication + Serial.begin(115200); + rgb_led_1.begin(); + rgb_led_1.setBrightness(30); + rgb_led_1.setPixelColor(0, rgb_led_1.Color(51, 51, 255)); + rgb_led_1.show(); + + // Configure button pin as input + pinMode(BUTTON_PIN, INPUT_PULLUP); + + // Interrupt for the button + attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), handleButtonPress, FALLING); + +#ifdef DISPLAY_ENABLED + setupDisplay(); +#endif + setupWiFi(); + // Set the ESP32 as an access point + setupOTA(); + server.begin(); +} + +void loop() { + // Handle client requests + server.handleClient(); + +#ifdef DISPLAY_ENABLED + displayWelcomeScreen(); +#endif + + if (doublePressDetected) { + Serial.println("Doppeldruck erkannt!"); // "Double press detected!" + setBootPartitionToOTA0(); +#ifdef DISPLAY_ENABLED + display.setCursor(0, 0); + display.setTextSize(1); + display.setTextColor(WHITE, BLACK); + display.println(""); + display.display(); + delay(50); +#endif + // Restart to boot from the new partition + esp_restart(); + } +} diff --git a/variants/sensebox_eye/variant.cpp b/variants/sensebox_eye/variant.cpp index 42269d11357..c802c614cc1 100644 --- a/variants/sensebox_eye/variant.cpp +++ b/variants/sensebox_eye/variant.cpp @@ -26,9 +26,25 @@ #include "pins_arduino.h" #include "driver/rmt_tx.h" #include "esp_log.h" +#include "esp_partition.h" +#include "esp_system.h" +#include "esp_ota_ops.h" extern "C" { +void blinkLED(uint8_t color[3], rmt_channel_handle_t led_chan, rmt_encoder_handle_t ws2812_encoder, rmt_transmit_config_t tx_config) { + ESP_ERROR_CHECK(rmt_transmit(led_chan, ws2812_encoder, color, sizeof(color), &tx_config)); + rmt_tx_wait_all_done(led_chan, portMAX_DELAY); + + // Wait a moment + delay(50); + + // Turn LED off + uint8_t pixel_off[3] = { 0x00, 0x00, 0x00 }; + ESP_ERROR_CHECK(rmt_transmit(led_chan, ws2812_encoder, pixel_off, sizeof(pixel_off), &tx_config)); + rmt_tx_wait_all_done(led_chan, portMAX_DELAY); +} + void initVariant(void) { rmt_channel_handle_t led_chan = NULL; rmt_tx_channel_config_t tx_chan_config = {}; @@ -52,20 +68,49 @@ void initVariant(void) { ESP_ERROR_CHECK(rmt_enable(led_chan)); - // WS2812 GRB data (green pixel) - uint8_t pixel[3] = { 0x10, 0x00, 0x00 }; // green rmt_transmit_config_t tx_config = { .loop_count = 0 }; - ESP_ERROR_CHECK(rmt_transmit(led_chan, ws2812_encoder, pixel, sizeof(pixel), &tx_config)); - rmt_tx_wait_all_done(led_chan, portMAX_DELAY); - // Wait a moment - delay(50); + uint8_t pixel[3] = { 0x10, 0x00, 0x00 }; // green + blinkLED(pixel, led_chan, ws2812_encoder, tx_config); - // Turn LED off - uint8_t pixel_off[3] = { 0x00, 0x00, 0x00 }; - ESP_ERROR_CHECK(rmt_transmit(led_chan, ws2812_encoder, pixel_off, sizeof(pixel_off), &tx_config)); - rmt_tx_wait_all_done(led_chan, portMAX_DELAY); + // define button pin + pinMode(0, INPUT_PULLUP); + + // keep button pressed + unsigned long pressStartTime = 0; + bool buttonPressed = false; + + // Wait 3.5 seconds for the button to be pressed + unsigned long startTime = millis(); + + // Check if button is pressed + while (millis() - startTime < 3500) { + if (digitalRead(0) == LOW) { + if (!buttonPressed) { + // The button was pressed + buttonPressed = true; + } + } else if (buttonPressed) { + // When the button is pressed and then released, boot into the OTA1 partition + const esp_partition_t *ota1_partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_1, NULL); + + if (ota1_partition) { + esp_err_t err = esp_ota_set_boot_partition(ota1_partition); + if (err == ESP_OK) { + uint8_t pixel[3] = { 0x00, 0x00, 0x10 }; // blue + blinkLED(pixel, led_chan, ws2812_encoder, tx_config); + esp_restart(); // restart, to boot OTA1 partition + } else { + uint8_t pixel[3] = { 0x00, 0x10, 0x00 }; // red + blinkLED(pixel, led_chan, ws2812_encoder, tx_config); + ESP_LOGE("OTA", "Error setting OTA1 partition: %s", esp_err_to_name(err)); + } + } + // Abort after releasing the button + break; + } + } } } From f330585717ee9758b15a0ae8fe939967937a4539 Mon Sep 17 00:00:00 2001 From: Paula Scharf Date: Tue, 15 Jul 2025 11:14:26 +0200 Subject: [PATCH 245/290] feat(board): update PID --- variants/sensebox_eye/pins_arduino.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/sensebox_eye/pins_arduino.h b/variants/sensebox_eye/pins_arduino.h index 583cb38283e..99984dbc6a4 100644 --- a/variants/sensebox_eye/pins_arduino.h +++ b/variants/sensebox_eye/pins_arduino.h @@ -4,7 +4,7 @@ #include #define USB_VID 0x303A -#define USB_PID 0x81B8 +#define USB_PID 0x82D1 #define USB_MANUFACTURER "senseBox" #define USB_PRODUCT "Eye ESP32S3" #define USB_SERIAL "" // Empty string for MAC address From cdf606af5f4424a2ea568734be290e00d906c538 Mon Sep 17 00:00:00 2001 From: Paula Scharf Date: Tue, 15 Jul 2025 16:45:03 +0200 Subject: [PATCH 246/290] feat(board): updated tinyuf2 bins --- variants/sensebox_eye/bootloader-tinyuf2.bin | Bin 22352 -> 23120 bytes variants/sensebox_eye/tinyuf2.bin | Bin 186912 -> 193056 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/variants/sensebox_eye/bootloader-tinyuf2.bin b/variants/sensebox_eye/bootloader-tinyuf2.bin index c7676c718f2383a78785da38dcffde52ca67eab0..7a83be05436d3ea295c2a06e4ffd5a814c145f42 100644 GIT binary patch literal 23120 zcmbun4_uU0_CJ1S7-ojyF#&ZXz0?FAs}F&OP}T$ zTNu=B0WHC={q~uuS&@wusV&U>1m=>Jnps=cW|1|mWtO?}e`cQF`#jH#fUAA>_4)Yf z%=0|w-h1vj=bn4+x#wQ`R->M?c*`uy4~(%009#EzOvNXknByDCSQ>o*9>3%E$+u6! z%XR)O+K|IfoWxHuPr8Gjc*o3%(`Mc=^;%UW{EJ5cK|&Cc(=@DmOqkpcyQs%bN;k@;Q0dHGICcpeVa2J1>_nvaZUp@wS43yn@lFz0RPtnY3=Z0t&Z9h+i&o1P1^NM8ZB>%PalnO$51sjRQes!4& z2e2_%uc7)yB*TB&=-%ZigX{8zIpE8*W>80i2V-7#A$ZQtUCS@KXFhMU7UXOsg%#xG zZ{!Q}HWaM3-G2M+3Y+tm-Mi#kvMpR^U2Ef4=j9ezvvUjibsKVuvh!gErb52Zwssw; z72eL@n+w84SvEe$3W@S^ZG3TdP7c4y#;=2Twl%>%7GCLNFq?~M)G!=SUuHqxx_%v! zq2^^~l10H-b4sqO(Ywef`RrW2xFEa8_DEilb&a*i%ID?V3S^79oy-%K^2>&dtmlzx_`-FVeSGq| z?A+{i8`hBluG$C_7<*ls{TBVmIw&$(*1>p16=V5KYc}Sx(s)@aPXe=$MX~#{Q?nJ+ zJ?Z!HkJ&aBGF#?`LK|C=`&e#XajsHEHYK+UVKD?OXlN|6->TULrPZ|zy^5Xj{9;?~+M=xMk~B?P!hs ziAp}GA91x2O#{EUZgSa6=G}otw$+an z!a2cZK|OiJAqRuzSI^#sxvTRE3TSB_*z&slTvHera`tLIcf-0>Sj4Y#&V$XfzqvB@ zSr{eQ5f*>=Q}}q;H?3?N$IGj=Y_|$4w!-{Jv4c{4(S8=Ad^LJWvR&U6$7GXIe zcK8AtLZF{zOr}i>l`;s#S7@jd>B!0R$%r8k>a0};2h_7{1-3cYcl}pU4KB4C%6dY!Hect^9u(=LVRHnrYyTwiR|~U6exiczi?T~61EB=%b}lj&6)yR zVIf~&&0TxVz~??C0w9JUJ%Y&z$|IzKnFtfEYY+?N$RbDfw(>H$CeK!wJEn-w%r2r? z(?8<a zmcx)}>#RkqvlKTQEE_;`@ER9lz_ey2RDqG0Ew3#6Jh2g4~c)8Ya-IJ<6x{s9=^WUj0UIo5);n6yP%)?9w#)FpEjG6Uuhy2!fL2r1)E zrNIyeE=@6aI302+8}f@3Vt19~!@baCAyPE5w_`R>o>VybT6BYBT%2Xg-2HO$ z;ASalY5!w0>iCh>dF$3)i+e>Yw6V!XkGveL@vCwkL;sKSznaZIjzIEuz<7Suh9bqe zLtP>4b;s~$$)-t)boS|CyA$!Q+Y6Rbraf{4eEHD27~|BIy5>Si$N6lFHjWgi}}Rf3Uw_xn$BE zOBa-s40c%8wR!SvN}zYezhO6}RG(sAvS1UNH1+mr^qj7I$-he%-piKWyJ9(;hnIQu zlA40O&$7Ex=CS)0-+RCEHgU;ZMlPLAo`j#NQ|NQjbo|OzIGF9ZaBBR0X$$%L@)3OU zSFQMi>r%BPd22$Oum7=bDuu`VePn`H)g3$&f}S5UR9=1iEjhTZWFd&N{Y=g(;8Sr+SsQ87xJ}HRoY31fTVvHM%SJKTX73L&taBmo{PHyj04$OoCsBtfNb0h?mOirVuK5VS zayHn;W0#11l8u+=+I5-UkXyJRKOgy5OpQ!AYni)xBW2Svv)67=Qd3IXASXy6WnVKD z8)An-lYT-nD++--%?oauK9>cRinK4YGl^*`S%x0K0ipoI0kMDt01vnokPH|PFaxFl zrUPaHEP#1{1%SnXG{ADeN&wLx_%8>zd_WPP1W*dF1D*mn0owqTfE|Duz;1vDcmYrc zcoEPDcp1H_Po?{mF-WANBf%y>_X${I>21L9B z%uz7fk9h?ce&lpXI*M{1(P;tZ_@Fu@6Xn^Z#V8j6s;7U2R{xk~nF4qn@C?4G)*8Hj z22kqf{FC04cY3n&Sr*E}PZf}l$9r-#V{|S67BfCrvMS0F$1F$f{d#-{W$yvP#-5ln z0k8rfqNf)CBHo|FQ=f`46EH4A!Wil3WH_^w0=RfkB^YyJPAq6pKTiSj?>I5%3Ba3x zUVxr)8603iJD0H-kOo)|SP6ItkO5c&$O5zjz6P8Fd=Iz?xD4n9G=uMP6G#2wWjv`L z3!aMs(o07)5^I6-{snkX+O1`l;Th_TB9z54E(6FP^O*+EKT6O_hKAmUGHI3*ZKZN4 zSuWehq$j(jSiDC8KLs!y@3Z7Gog~famU13umanA~b9T*yZUA+FzW`naGy@I+S^;f< zlYmbFUjx1c{0R6Q@D<=3-~v6NH`3L=@P6|zPt3U+kP*QwX$EFF7tJg*HpRfb3h)AM z{@wYdm|Pj#fNvkdEXg-8%lCM`4wz?RmJjjl2E@%eG3S239{{fcU=EOTDE_-Bv0vSk zV3`ZyXWx{NH3$5m`~u)sSmZ;12cDf}c>(>ua5J+M0kZJE1N~hFKTBW>4+13Slb#~I z&uM{bRe^c!MBgt>O<|*L(x{75txU+2+VxDV7xABUmDKWJv|#PWG;WF(enX$tYL(-K zvz0qis#EaJ>{}f2yQ*5P&RF5jD0XK!-N0}+f0-s#r>N7?Q}Q2Av6rQA1}?%ZMc40N z70J#-a9a1B`<~24T8{%8q1a=fAdBddJkNpM@2vA(x;MCP~JX zOfVDk-kX_m9JAf25pI`};|ckkiZhINKJL`)ji`QG6XoJ`)TD@l@)zJ|X zL**J>`LFWeV!9^Ncv;X%ZkK?1EA{xP(Oc@H#ado&H~v#0oa$FG$=yKOaYk6r2SjHS zUMq;SvyHpaUiOT+Hd=J5DxK7-q76T_nZj2AG!%Xc*y|m_7x;CHe@ek%*`a)A%bw|- zuCD`$u77zxlc0d}a@{WjZa4ZTvJs*}D*}aHDzvQ&n{A+yPTjdjJvk)KM*(h#7pz5VS`2hnrgyXnK&S0CP5%vYD8Uy7s&U-SL$H+{-W!}e`Cpz3KX*{XSHZn{c z#~Wv=Ob>^Nuko#a3b_6h5S}ABM_u&(hM_Qhkz}&635N7{0^WJ_Toi!fo}nu13~o^+ zRMRVW`U%6@W_9X#_E1TsGkWc5b=g?vy&t-4tqQoR1A>!kCBzm_k8`{*A2o_sMtfJt zeO3fqTLXff%7v#%NK6yq_o0_<^y1VDTZ7Ln!DmJA=?p&0gU_-pZh*0$DW%VIe&;>(ymR@L~Z@TcdZz)~YI^O-bP`TU7R^Ml627QXAdkREhb+ zVd*YwphhLuM&Y$W#mzu@ORWl}FmC(fn?2*g_dggw-OAzZdsVF~1C7ooGHLL&MRHaipM2ZD1~xGPZF1Kw-(a97OxU*W>s zz@F)9?MITfQ?^IXCfEV&vMMFO#i61zA__A&IDe{U2iz}^Svw;ZM~0BXbfqTEb;v-o zwpN+@uE~Mc=>do(qpHjS*F<>?BDmSmDHkWAevq*?&ijNBC?l=)J1Ud zEwFqALr$VDqG=z4fZQ(!AZzq)@k#fmcJ$?T;a6dzYGh#lNa_((?m?6Bzce3=9?+^z zUwR(sD}8Y%m2Nn>N$Ze6uu$$+pYvPlb!)J_%$$C|D!?rXk=V}yu7DqH50EL<>05%N z1)tyLlkwEZIe0F+y8KQ1zL4=;=@zG5NWpuBLAXQ>>hvMn@<(Z3(?2eTFs}3d{pYEY z(*See{&BM3Kgh`aUcZdzA#%`f5I%y7OY0xdAjaN55L~=l%oaZO(+t0vyPccBl{Seg z!kv#mQ`X|l>J?t?Hje{E4Akn zH8-^p! zAEISjm6=>W~Z)Hf?<#15-wis zIO}4TGtul=H0)YN%`2Ee)dx0e4>P{>+)`vJWKdfB7>PsZ-yVtWWsc-jl4G z{h3+nvd<)|;Lj{kr+z9~H~N#n^J&TYTYuR{(&EUZtg0r_o>a2cakP)SZG1%87jRA( z3s{jP~dIPl>9-Vk~Fyn8PL*cE@@8)bQa2epi9N^pap4P}lpl zT6~oE^r+Y8`Ju=BkKC*xz!~sr#C$BlQHtT zhp#mHGM&;qVZg^C`WU~({pl^@t8Q_R21)p>1Da`aY zs6xJ4m`7Q!rXfn)S z__uz1Tq_)*N?tEoxo-0x*PePSS$IQk_cfu$03{rxZ+Tp-%yvxe7Mbw5T;1mSR=D;wY%VG4`hY;pAQ_$SXTlk%+>J5X=Ra zo-25&ntc!0R;RPqM%%ZV+iUrqdbM^U z^SrOF)~OsiM)+FZp;MpIg)zCl{fr93@|n-|na_TP7uFId8JUfivP!q!P_2)!*GE^@ z^VRyu0zJnNXV&ueVwGEeLuE0LLqerP=jx-B(z@_OeYAa^s&XFB8HIWx*REqM#=3%21 zdxT0GeXjjJVHTBYKcrX!fkY#HDZft`gnjgN$dE4<2@Ukxc0t14eE*+)35&5iQ21J> z;&kpLa;Wjewqfk<%*^|L;eE*T6LanY;muBXtl@)v!0 z-aB5&9c;sM2jDrt9zY}D6~LQ-V}R3ucEI<5%Ya`@I58&+PzCrJka+uvIZFY*1H2B< z{{n5G`_*_h0D1r!F~~`Qhwq`+s8P%^1z-VGqF(;VS(ZA;#_>_muwPn$eAdgzVVncd zFi*jA&%_gR_5&^h7EMCmfIkC{06qaESQHuGpqv|Q{D5HPc0^*qg{Dy$fgoE*d$bD26;ApcM4&01coBPy+B_ETo&e zCHC?W&DzY&%*B`+l%rxO(*rE+$X9|+25eNtRICK=n2zZCNjp4l2Hii#8fMDJjyJdl zXJizO*H^2|JYSTSR6Mbx!;oNZv~e zXI(P3Gm`3}vaz6gby=lS)D;Xhs&jHrw$w*kB$fC=O0Xu8sB`{wIUtH1tUemf4T!x? zF3$Ygc9{r&5JaPbn-Q5xN#ta)K00HvO8irbS*cIlER5Y&;rcvKXK)*CtY5(m1*$oV zi(4{u;-`VMMcd8uROW+GmV-q90MThKiCi&vUrSora?8P}GzCv|nzJ(YZT{&*Agx|? z@nDqrXPKcaE^=Gysx~R3aR*W!mtJJ3SXa}}SPi}lvW&>I#aF(z`KLqjW-QAxh<7Yl z#)T~MKx5+$YF!5^{RHX=rRUVs6ILEo`JJ zLC&~Gy_Y2z+_pnuv*JvbB`RMZEI$n9Be_N1OA_rD5_X-eSM8}yvDXx3e)3DZy(r;< z@&l7YT-h#4qUEykHS0mokCMn2akrQ!MS(S4@o;t7$LL*+Z9?kzQmBpT0s`1j6WjNa zeNlA&JlR0aTpBJ8Ss*{tW&E}#>R(45bXTj(16Sh87 zZ+chJaSBU-vM}Oq@sD04z{W-M{07m!fh9(Zbw&0>o`Q%(UY>s`Y`r<)7{lDj%#^~6 zGv(|l7oTA8bW4auGvE2aHjj;-5J2=iA;2Hzg$W@A%k&R;+ev*GW4E}`)c-EozL4B| zP71e#YEy+jn?9Ek76~^Iu0-eQkoM}lGg$g--KJk5>~a|c$JK(73QI3(KbP|)!f>+X z;;JN>GRygW{wd1CZRz zK{(_Q2pN~rpHU&5fDAGnG8McAvn+CZ`LpVx-z|6DpYbe1f>_@FRekSweJ`gA`cqur z4*r(q5WKXRK*;$uJ&ilV#f+l-smt@l<@t-3=Pz54U$WwmTKJp_`6k}{JTLr%-Vdo8 zG{WiNTe$EMz0J}WPme%>PDvfi(yx_2wZaK1h26F#yqfU$@tTBxC48s-F39I8Q4j0J z2yzd4kH|)&@P7qA>p|O_|AxnGc+lGlbjWB;trAR$A19j4iU#1fkhtdyP6)CiWuF0W<>bD{XAe()$1M z*Xaa@q8*yj$nw4_0riATCfL&ZSL%-Vsw($8M3rM9t19#3SNNTxFS*QvxOWquUo4t9 zhF@_E&LQPC`81f0vGMp#96Q`@AC4_K{=>~WK3P=c71mOn#N;TRhtVo}6;_3Cqx*3W z`#CjgI!_~e;V>Obrpmgk@XACpmO`Yc%6gSKa38g;PBzNF!z-&z=?4^3kFTs8o^&Iv zjc~?%@(2(J)~PXN-uO>W-3AH@-*e^u#}W<4*x~$`aP(+TZ2XLt4)@r2Q5>EbcLOyZ zJG`>SRQp>x19R{Nx75(FM_UMpZvZr*eg;|usiksbRqs~Gzlza(b1aIqOd{;bUNjbu&m3km*=2i;p7X)99F zHi#Ir_TuOzhWt$}#w^{K*9yH|QpPFwA;Z8tN-O7gaen*RmW?WZxX?wLozhEH20zx( z*j?L^dZ}#QZr-xFJaY2N3<@8?LUaFK41F}(L|;F zs}{kl5W@aN-F9BqzrY;oA=PRwxY-sXAkfa(F`geJ;Lpl<^wxUL=lb5)evap!6F!t_ zbW8{*<#<1ma9*%XWSzHM5YGDSi`))fl;y4z%Nj8wQ*6(S&Um!Nts4sJ$n%yr{h}hp z^sVGfsruM=$WVFO-Fj*Or++6-vsHdg`?(e+6H?ldIqX@7F1kP$<9g3$r$h$tcuTU| zFPFcjZu?vsGfka(MzWof(tA6hg!fy0;PvFk?$+1)$%3Zq4WCT*pDluim`5HB>lOqp zy|jBzgU_&Aab!ePx)Ld**L`2Q1>bL!`j8$=Zd;i?wkTm1# zHb1AfSc=5PqVK|2%f{avE*$oILP_L)E6 zh4oZH$r&;}zk}y5nzdm=Yi?o46D(d9GDa+31*ss~hDN5%@3Uv(kujP7_irEi(7 zL`9{xr&V06Bb7avn0f)scu!FO_tOqs8_XT9U++V*#aN=Ed}f^2sq#DqML6a&A*J9&d&)!yE5CcGLm?@^Voz{lP80J(d+s%oKc*RyFAEj9Z5vX(8IYxQ?$ zrk5v&4Wa!3d_V#35P1lk zC~DG@xAWy^cONw!B;oWv*Drh*)Ms>pUY5OA*;6q7sk6qFDsQtaXQ0nD#>b!K&uGdh z`Cx`}YE)PlXoS1^T%+X??xrM&_D33+6;k@6eMnoIU*a2d+dRUJGC$!=drlHY(z}+@ z5%5>?LMN}Gi#%z;HB5-|DLy^9ygQzYncr>X5{tW|xk>*#$Ju|cF*~EVW!ysh*zG}| z_?()HNj#O2bYl#cNYAlwJ+PU|Et~C1f)@QGx-s&2a{6u6tv!9G_WWX64F~U{ENBLA z1+!NU-=_a;Biwf#*Zy4?p3Piiy}9wbu=ay3uO9kgOA{Mw5i6^z?`HANHjcc+QhkfXIz(L;oeXdgq>dJ{r zMAh-DD!tq1s=5mGR$uT;j83|OCs#pzm7cS<_N_nMR~~a?rh1%b7p%bbM&B82{#(3I zPJB>3Q!Nc{#z(yCKpzU)uv=x`omBOez6;tj>f<`0liD`y%I==h>$GJ24)P+<+pMheuyEjQd2Ht9YEfP3j7m?0U1_R3BuE{d zWQtBRUMnKZjudVzDrCl}&6_n<|L@-_$Z`qH^fcM?wm#Q0eGjXJ6~vv_i&J(}5#u5p z;_fYuxrYGPw^n8Pg{t*8ecVliWj{m{(saA3W@*0MU{`TkaSMO411)sy zOmxtTd2dr4*B;Vv2JiRa6er+6O2>7F!ts4x`TjwY%j3M?(RZBff>Ivm{Z{$Lw&ynN z!o0Ip-Upd;Jp`=Nl-`(u^k98y5B%t!8K&LOSFG=`+MYmz_m}szF6eXJ*C)h~F1oGG z^)$5bqDehZY^}a9i>EP8~y-x}@byHK%Mru00uXRSB>#jZ_tiNfpzC=^IG+w&f zxpiJ!qcVS;F^9sAC6il6l;J(k(#J`j4brJZY(-kf_PM6^aWTTBUi98ZXSM=+_A9M0 zsn3CMeWi9hc2`n^N|;DpaLMtL8&nn687fbqw0FJfQXoq`+mP{Minj?HywS$KW8a+# z8_yk5W&DYkQM<>P^2kJ8H}~a#%wyAYn!53>1NWy@uJ}G+J|ql`1NK&@enOq-3V(52 zX?OET`{uvBI(?MsF^Rhgl}ENpy{_m!^AFL&QEE^M@6VX6O2U~?`Z$#*3lz_dJgsZ( z=ymD)={Hun35S!TFq>3;89zivk%Krq^j|Mmon#{Ghj1T@j;2dJ1)3tV=q&+P-7T z#P@nLZybk%&bpB`V{UWu&c?mTwbLDmNfY1cjdwa$C27OpAm#RLy|sxIlT6Dc=a@r= ziiysVuA{vbqe1K4e^x|;gEQI+l|KyfXAxiVnFVk0+V>^7X=88g+=^wXxW&aL?(0oj zaA4wJdXrYZgkP+Q@V~9hiE%Z?Y8%vtR31u>q{ngAUA^v9hO-85uJrv($CxBzoto|? zJtk!u)NP}1ARjHd?8yd{L?+r3&uSx>yOk#&^_XP*&gUGn{JZZ_eNy4S}#g(SV9kX+(w?24m5~6s?Ulgslum^&1v z{YGjCGwqb(Cu?aiO_PYgA|mh&5omI0;2Y-4B7cCnWM!FQLuwM8ljv?rvTAxXV$yTv z+qE@woy$^tC9W5TvJul}w!0IP_B{V7Ke@4HwX=}MLDnNpY0{@~2N4`Ssh7JAVbWy! zkmG_wVTe|^A?Zy_+0r9^!1fhEVEXBRYfP^&R;ek|fKaFx+%?1PYnkh&-t;#y*G~)a zp?bni^roD;pkL4v;zDJ_M{I9J05p1rdu~~49=xut}FVvCX!mwU@mPMDPzL-LT zt?(_spk37sy``_o5d!vvSR>^HQZV%5S)<=}*cILzI>my-T--%DDWmO^*W4k*tGd`z`rW^^{jtAo%b>RZ>~AYD_pQ@PBYq#g z?478}6;WJ7t*SP@eCeAo66x15s3|x)=W#4Lwm^igqrM5C+sDf6T)Wb?w;15 z=0+tTwTWp2|MH#2=+(J(@m%b4YO!W}Wo6OsY>Q(vw)Dnx%=?M7S7UrsD_8$is@7>7 z;iQx1;hJa_<@U^ zb}KeO+>Q4qsC0r?aGvQE&>->%j^%;w+1$v0dmzsO9VNWzYus%Lt(Y_3QtpRvJO z*&~$pJi2D>0d-p{?ilRf3IUFX;R+M7n?hkv`lC_%H}tq32iE*1Z|joM#|`zl_iyZR z{Z_7soG};k;;yR4d+Jhz;+{P-bPh2ON8npFH;H*`4{X?9*mFFR0;xlK>|{D24^37f zzsHpi7RqPlSLO5w5B2QYvGX;$qqhH{9@oP%VedtB6`9`Yv##pdze+|mXc1F!F~-;W zT)*zgSlt5KSUXea*jFX@SGA(2a)*8AOk)!eNQ%Eqy&l(>|5@GEE+JXEe{l~ktT0x! zu&1QRhGnAl_V!tla9 z-hg9tIL11;$2GYJYnz5PvcmpuvQoA7sKkWio>U~vW3+#h$IYRRcPCE6I#$PgQygQa zIgaue--0pI5=B=0(#&+5%GMshiqSf}$7Sv@f5n5^b22ruA1%(_9Eor~?Tt-#nErTf zOFfKfg26bh4~m3ckng#LY)1+CN`1SkTi!}}0@;F{ufsN!0CFc6zw>pvr_t!-OZysM zPT_7WK1e3xScRZ}Og?S|_?)KXyYWE2-WD zEm@CawBA@l^-)=Ga!WN!SKhcFA`R|*rM9$JtV_9n=EKm&)^dcvrM(qaaZk#wr?_F| zuc^4OQc7jlKZR<0paeoiR8Hn`P+2|%)gL-V@=B4&iLBel$xa#`?uEC zE^YgxRF^`#&$#Ek%FCR-vSf43`_7;8H?|;0lUBTX+w__$ z+@H%Y^tqYkE>t}5!KdcZmUTPF{0}tjGqSFV^zjYP+oeEwnlB-t8E(g zfP2_V+g}6E8I13QH-w?S>C3>X(b1`!C1=&H=j#mHRyOO!gXRNzqgExX?;evqu_>8V z9hkW|;u+1jTH74khGVJ-dCh~_ z*0ge3q`)>IoSl}MP3vGQ(px`PR6VTbhIUR;UuwM-o;9vQupraWSd^X>Z~pW4bOY|O zIEUHmRn1}LuT4rC5#xD*6f~^$)^695Zebs(C()&@6SmF7U9#UwwBBfhA*7hHyRq2g zn)NGpkjoy)85%cjwpSM6bguSGEP))iZRFurKGK6iqnNe*^p`z9UC=gYJUgWBpRhF5 z_tprGzXdAZuWjWLUP)FT7TM|63qucSVPVKup~jZ(v!bf=4*i$CUG2G+_I6EkRb4CH zMfCiRig$G${jz!386x?L{N3SfMOuB=W~_3?g<9iCZPoW(mDv{Ew<{_BFKy3GBNt=pjyN0!N7|Dj~df$1s({w%Cn>B?>vDiPlJJ zq4U}#xH7~B0&eaYcTqyfmW`pP71CFQ*Sz03c7)Z}RioYZNsVz^ZNZTQF1%V3zSE={ zb#c-dhLau7ekpy6I)260Vr`Ga%m>7}NL}`@quLgXeq?-Y-AK`m&G9$bgdQ~_xz0tD z;fK6uD$JCIqwRYdU&@~!597v#&RJ7b!pttre5d{i^~zY>@zZcxw^(02lDR)k+f#c_ z&B&d9y~X&v%2pOwW~FUm_n31dTTgenPIsNr3R9G!)|BC3aEw~4weP&+)T%aBwU~h| z&dz85`r`9m2Px!Om+NF#8~#UPcQhv_|mYiiAMzZE6?mA0(}7o#oq#b}PO z6BJNXtK;;IQgnq%p|ego6fO4tL`N^Uo7z+Ti5;mRd{iKbL+hIrbCNo~Bt{MB*!x4U zW9s+GF78ITc~mW3)KePkD^v+X(IV7^N4cSVjV{P8gyzomxm`{@r_RzNN<(CalLFAH z)@gC%Zl{}lI=g%UExm*ZwyuqIX}v)U{b3>gG*IwX6plBE&TqQv^wowT4g+Ub+8J(e z8-^l0p@p_yWv}Pk4Z*Z6^~=RoE$iazqaAJ*nrxz~>Yl+UQZUh8NaN-4h0f*{-N~s( z+D1E&=y9q_5lbP>Q$FJcA*Bn8w*4u4`2l6!*63`BrLh@uoyn-f>8H)WJ<_f%^SIdg z2jGfu*exH!p^pZ2+O7Dwye-BvS#sbu#WQ@G6C=VS|5Od?=eXIF!ZLMB#&`Us-FAD& zmdp%$2jr{JMNYJQ0(U(Dfr4zfFNcoi#w?V9Ic;MOOlLT#- zTh9vgs`mP5yhBaxd!mJKdZ}`DHti$pa*Sn%_t8mtMTFq!#B=bK_K4sedF6&Zii4N_ z=`DyGa6dnyQTd<}`7e9uuNc5fQjFTfOU7ZU%wc-rn@;qP!4tlw7vU@VO;z@4sOK3a z38y<1wvG1@=b6JIgpY%5nD8OJkr*Gy?UZv)L}A8NhN=%bgV|qPw+Ll_tKK7_`p?^i zqn)mI300#H?HT0{*IS)*pg&XDI|3E@6N$qL-h9>N$#$l>3e3|#E-*&qHLKjT?)Awx=vS}hpKs~-*g{p%z;&xrpklQt0 z*h}1wx+oJa?Nvxe$s6l7+(2PAUqI%;O5!9YGye7wNiq7Q#BgIG^YjKPDSCj7aWNjh z6qOjA6gOn_1D#3ZbffR@rFuN@lcDE*{-hMph&HJ@ltU#6nm(QsOP@P}{H zJI6bOJcYP2FCB*^oJ{R$zKP#**j@$Q*zL84IrYw+ky!h~_71DKW#eQzH+V>29uw;j z#qyYu4iRU<P}%=PGVsLhF>jga5<-)ft0yhp(pXn&(kQHeR+ZhQNK$qO@vq7=?J>juop1&zm z16LJmqs-t*ZNIqG;+$Qq0L3Ps9CBB8nsJuj#pNy{PC_RX`8hr>O zf8cM=f{8?jtG#@Ly6u#*}9g~(I-FVx$&}rWD2the@4sAB7J5GGw9PF2BV+AJru06m6QnFJqYSTxH7_> z67x@f$a6WtdgG`qH%C5v-5tc0QoZ$~W$o+AOS-sv;Vwc!9E6=4LouiP$t?^{9-T0} z;{ko$B-0V8Y%l&IpY*`p4bipD63M%O%fvnnJ2|~rvi%eeeC3IoDHvo1rf@5{urlO; zl9JVJwbFpxomULNKUQ71EHGloJ(iWf6YfCJhCs}I88;C5D`r7H_}j~4DcqEO-#3?& zL+_btwXHT#b@8(6r_025#QuvkN%1QGrEXnBWul5N-+*YL_5UedzaVjz7rh`HNqhYq(Ab@dY5+_#jkB{K@&}f(a4fFBA|6VP1$#m6N_{ zGD1O`bWxf3k^?9JlmI>ermXcPmdGe}v#FHLHWd_@b6AswOrFXqv8lw8Z^>U@#9B;Q1!mS2Y3^p5#VirW`K7A_5&OOXahI`z~+~-Me8lnIN?nG+>9r~kgPA+ zf`ff$;&r7X26VK9441dyZ2V6vJ-X63x-45-0DS3kMm02AtdjCef#>|9wQSlWi&(R% zq+kn9eaZUbEo|xfjV0OU2OfC9!)8+2qsxA-Zz+YQwPrSZeUZhKUsTE#ZY;3m7lT0S zO4(BL+CrdK`T+ZA5fHZInb`sp^k{vNncbXUP{3xH*+S@^Img>Z%I!8rv$+)I4+IN_ zFSlfU;hizWCAU5|7uN~Dxg_6WermnNlw-1(*!9Kc5=rzQ!1V{~ z^5?U%Kn}H1$ltr<* zrhHH!p2}&-EHX!iC!eg&PtNzC9!X!pK5gDoO3b+%OU-0e(bGliHy3&GaQdZs!&n$C z;*|-Kdq)7tMo+Duo6DbJ(!=9jECQow~Ux0Nx_X6n9-w}dRq~$ z#N{*Ro(03h*`=l|a{)WzZ&fJ@-|fGZTZ+x>ik0l69+6<#rRJiwmb`nC)Wzhmx|z|l zONXEOm@-!9dBhjsCp_<2dtp%y2;aZy=;%d_GLv7FyM9E4()?#&p`Z+v!pN;>OABEm zVIvFki}DLM7NRcA+5%z_bx#(O%(*69aIk=3pXH-!5OTjWD8P2VbPDM z_Al&9@->3}{Gv^!g8ZBr&~SmIM6yiTPmf^ae?f~i!Jro1=5U5bPXL1~j?C>%^WLfx zdWTXh?WxiVx?KksDypD6h`R+dws7@`EjRhDP7SX|7B>9#sLyVN4*sBwzY-%k_43&BICys^6^_*5ATVe)V?%y&d(Z+qsGYQDo@KkwvhfAD|1QP;mwzZzg0qS|? z67&3#3x9NX@1pA6X<-}Q2zDPx!|+@enm~(rH&>M_(=2Rmz6Dp!of*GV#zPF5Be2Q-+>DOc;ykNMnnBO>dS~e_rGMAJ zdvxBgZNqxomL~U}T^TVBqXteI4KxFWyH;qjWaoL*tT%52&C&bj@RaLv=D<+EOw5yZ zD|XZHw`c7G_Q8U(JkV>iJ^sfCf_L>y8gH*Pg<`t7M6%89S>etEj8HPS_k;pd$y!*n zmON7t8$EkjqKC|g^#e`h{oD+B<{fjrW)Y|~kGO-z(7xdFCRvWMfeguC|P23vdaPST=%X3F>SHENG-N(h(cIE2O49$}UJ< zg-wF_ilijZENct9I%%cXj0NrOv$%3fbs_;cJB=7Vv7!XfGHl%yH3 z#J#=O;SLN7A8eVCZsF+J^^7Wdc=^Dwhf0Zg6Z@-q>?U2#14tulqs4=VarWTuIraCV zHut}$cJ~7Oxz1Wj@?loNq8U*bt!CD;IX`=(Wiz^ucb7&b247%PXU(w4F3F=4^8v~EovoIMG4^K%7N3)#>T7q4Xn!>Iq25XMJYYQD+7K<%gpEK+s z{kLV4(cWZNpa|YocJxZ{s!~{>(sp)7lD&#L53C~dzlml^It;W=eklaN=KQO&8QqJ8 zMgP+n#ij=zh<;$!&yCu`6{#~*l9Dkh5d(@6rV#wbJA99r_0esEIxYs+oVDZ^f(2|U zVPoRh7=6rxtUi8D%&a-l@%OB`4E-|LuKu-|4f*SzDuh}2Sw4sR3W5Vly=0`ZKFU@a z&F1YP%JDdaBdY`~%{3eXP%Z_`>%>4ly^UE8m>Yl*Uxxf| z0el|=%u$Hk-N8Ho820{nQS5{K8K;3xE?`cKDuYoz4B(38Q05c>Rbt70D!brm&)AOM zgNM!Tw3Q2<%2;V!`c!h-!sSn;EnEaPQ^7{_3~=ngwK22OYQE=?Z7eF?SX>OTUs!y( zQpB_vixD>GXaQU zA~77b-ieo%Kumlyz#jlU2e=tPhzs5<=Z(3Jk&&8&lk;B&SPbxA0NWRm%u4~pa7sZ8 z>%^8&obJPdsVj#Jgdfb*3A=_$XyvV04?A*P-=3viud zh#_(;Fg*SX;l!{xpg5O>?|hkqAIte*4bz~zqzOkTURfOL5AOtJ^bc;+Wj7Yvfsa`3dp8v1 zZn{ku-PS#}%smeNEo1RzS>|O~ac&xnO73ecRDM%9>o$KWaz~}MKXWht z2-{AT+J=Txq4`y9yB_RW{vmSu*c;KG0uKZ~WzioaDn*ujNOTsvh_%Qc7G##Z;VSyvjKB+mPZc_T4zAUc(zp-PZ zvnn?>x|#8w%(t+w33BHe(vU+s&WW{rl(jx!^<%qr{~@ti}EZAO0J{RqBu_t2F(qIudKPe%qO zP*DL5Aqpm;t)6PzMlD@YZTC0C2Jmc<-p&fy?s$ri^@q(7Mnb_(gnj-bm-;k{&`Mx-w@v273K#bCpYzS_Nng-*vnry;!?k##B|+^s)D z@%8==!OGWTM!l+Liko>vssdv%<01VA0nK-+G^)z402(Q%+V98q8<|s{Y(}cn9_;q! zOUoynLsAo8otB9 z)8_s1=$BkSHn`$t%%nyc6V}#3T@;And;mEfzzIl%nGS_?X)?43meLV=G`I^^;5R9&Nql@w5kGFBNv6gq7_f@&h@YG>Ggi-5e%XUuGsc}Ev?h>}UxS3e4 zd|;;9TUOUc!(QO@k)5t|wO6=KopHeae(H1Msh4=Go$s^<2%O7$v5lL8^@LJrtwAkg zR7@ZrS;4ZIpchOedW(ypUlbCeqcon$XoVEF8Ee3M6TZ*WCuj*KLz*EdoQGI=XW^TB($z%Osp3QGsTdQ*J&w30 zs+Hy*^L%j`_#W=#01f?L>Jl)sJD3+2z;M{5?kPN%t`+d`U)J(z4LwTDAO( zKsxy$q7QFQ)mGbRWfrZdrB$%!W!l*++6T5s>x=r#diGTnT^UWxSLj-r%A$#lrq9qa z$b~Fo4*)f6Jx{?fOm+#AUDop~_Xq5SKDIfvqFSp`$EbX*+5o+ljZyifsm7An05+D@ zsu=4k(DamqAJZt;uY&w>C8_|(hfO_A<*wQA7p*=G`k6K1M zz|?$~4b?V`ClANwrrlsdoBW)CIFYjjQuFPQ@!KIu118kyV=V@|KN}km#aTV3i*HTU zki7;qjIZ&lA?u44L#)3;qw2C#dP!B<@(KUeMzc)OSi?rX%=1&7K8olwL$z<94Qt0~ zfC+%lDztg+GUM?fMh#6!m>7!X)+6UlGToqDcy|aEg4rc^wEH_7<*if`y?BG}4f(n0 z4X}jN?H>*a9}aO3VR`ebGBB#Ykn@*ijErw_@DAGvIau?*!%Y72_?q{I>>SK0Y`CnQ zWn#cQsNz`I9s=QunK-R3Ot(?q3Pv~8V3jv=yyHIS4t&3PpUw_*P=2#nOHH?1-`K%7 zTROTy>3|&TwNym-l%81T_&3Z?`m9vKl1hq1#NI!ti;?Lsrs^R*Br>s{td4$>39sx& zef2MYf0=7I_e;RC7$aZ_IC|p%J_L}Vp9}A=0eS&$ps#3ObaK8s<>dUC;HP3d04~cJ zNHO@^;Jf+*KsgTmSkRqB1vJs0M87fw;spnQ-hO~fSg(_Y_OML~{c&g)njP0Aq92Pf zi@Gpka6sJPZ2}mg$KFh`&eQA80)<#Rx>vjWGlk0Db<9IVb0%FP;zYdVrGv zP}T^r0N^2jc{v6qQw~5s1pYR_LVz~`b^~C1rWPQa0kxn@$)aidzSQlL!?VE`CbF^s2)j~_+aAngWu{T^a6H!v;(a`zy# z?GNv@xw*Mhp^Zp@A($U=N}m+^k|SU59+8K^n*~@3>jvXI1o1#m1#d$q@Bs2l5sH)n z&a<>3680MrecpzR;8uF~(9BHB3{@=!SFJ3msg||-{m_#=)yg)FX?T=+HNK1Mbql>{ z8h;rHkE40;*k1;Z-I#35D|h=}r#d~hI_5RnFI;nXf^q(w;Wpkb;mh6RdI02jT?IQs zGm|9}`im8s3vTv01)ju6N@bdJZok;fSj6k+paM_8hEqbeS82X*N77n)!t_;AI3Yfd znQZ*bJyV_fzz)!nusy*3iRF=__%iL@HosMDtbc0iO0P4FbYdcv;N)jsu1JNJWBoh5 zHFgCnvO2^}{$;FMr+u419`DJk15`;~FlOXw4!9XbB2QH>tS}^DeS^3D>IsUpPsG$z zseYrUzPHszs2Qn(jXD%Xpd+(cx6Mc2y&uqrJ0G&9&z>kv~ntGlyMt}OSO(+mYBOmw4k&2qibJ{ zOU<+7{yiGF4ohGCUKH~ZTBOVx-A`hn+LM^O#(Y!ci!F>UGxJvJYX3un==WAgGT%DpR1<4vsZ+55H+iDhTVhP4>jpF( z_Tm$J%qND&mSMtP0*)N~@6F$fHeMvt1Hi%q2b#BTv}#$vfOTlyKt z#fGm%$F5V{IAOqr$cdTY(t4u+*mJ48hYEbw;}Y=Jmy$JCTn?#eyYH|gTnUj>$^NPN-X(l5 z`P#ShYQ7zvmiobUqLn*O&3%pU;CB?f!J^-^QqQl{7p&B$tUpGv8vl&+xNJ(Mr!%aHsG)?m<5&rGJCvj$?AsgTAdatcXuA0UZiE6828m=QEUH zy4rAf^}de!?I!~n%~1EXOYNA;ZSCY z?oZep@>TPk%f?f-6jJl73!YrLcldA(!rrs|8Q1obx48T&P93o^p{M@l zh>NEfzhjMlA21WP&Y^30a_R$X^8qU-d9&%$iS8odlWc9V0U$s2RfgEZ<+lt;0s5)$ zq8s5c{8vd?njDv2KMQQ|Hc-IvsDKkNL#vzYw+G%)7!8W2G*7r-RiZ`*$JnFPF(VQm zTJz-Lv3JUFIkQ?`=R@GhYvFeV*iX$ImnZ&qhM}!C-SJ4Q;FG7Q*6N{~R?b*CAjt@) zN5KUxFFk`;tuDRAv&2HHtAipYU?2)|*~t5V0DRX*236PTawmMBJSf$#VX?j~N~#|f zWZkL&60E&>yLP5(QWs=7qC$B-D0kuwtQ_U3{7q#au6wq6<4ZI{=YBHVT4%9ZExG>~ zYdd<4nZTUgdXRmc?og7Y6L;17+K&DJxYv{e;uGp!^=jMEE6jwR$bVL|7Vn(G@d_7+ z^Vqx%;#h6Goj--D@bK^$fnY3k>=ijRmhtXQtb=6}S?72-Z<+Sm*mz5m-0TwhH`d+(6YJJflRP5qqZq=-Oy z|4d(~ZT?PtR?YbKgm)RchHSLIVVwh=b+a)unKvZyok;$I_|EIRaB-;fdO!-5*~4}^+qfg>(beu1bI1QKh7L@l1FVw&?H6AD zIqW{Eskf&6iSGDX+#E}TR@EFtKUS;t_sOCw&x#G##M39Cg;Sq7+K=670muu-hCD5N z)8>f=RGyUfBN(q>2L+>~yCyn}#BrEyxC$Q>6NcWXjvgMzI+_WI@b#_Bs{O?EUKGWs ztSl&Tk6vIx8DI8y6-~6kV5zoRhJ5ueR$Se$m62K*bv&*7X7w+2OzN7c3a%34x7pR! z@a*kD*6>oR4dUAnw+^r9=oQOvR(j&koG=7oK#m`Z(E2hVK)0&GYRyC$!?sLh`R|5G z6eKu~a{g0ts!YMnM_AxXXg z8-w`^Yt3$!Da@5HL`P4 z!)I81@sO~7=seA(AmimdGnJFN44FZ}5mduz%r*=Oc|+&r$-TG{=^-PS(w&lelrSV@ zV~;Ak#Nbs5L!xoR6GLng&)V3nLHoPC&GviRP9dhp;0| zZ`c6x;BiIc@>$qi^2OT^AYTl-;j_nbWI6; zW~4rQqLP^}T!djWAC~$?4+$|tncuPJ<#-k$_4^g7p-svg9290qGdVN}4OU7Mks+pU z8#EkY_3yAv^!5gBDiU^nC01S%IW2xGhdlEGd(^2DEI1jkL9FoZM_LDLrobQj{yuqMH zv)>nt;qpG-uJ@j(`08Wj%A3#*N1VSyNo*Vx_6;&V+&bhKL>B_*#pEKt^GW*h#l*v5 zTb9rCdC6ysah^}1k3*r@wTn)UAay!sdcCP?gY#EZdAC_dEjGeROD*+Z5?dVG#>i9u z?(YKCal!}GhCGFG&Y&8X+c%_U`R~zYYTF=-PW{qfQYv!YFQ^l;Rv*}gt^qSma$T1Q zzKIgjS3T()BIbj2a|P1OMBQ~MAJUgS>1!ga>v+nULF!DMz7S(A56%35s>v8UxMx?w zw4EI`lg~wyQuh*+K3z80UN9(Z9^`(BeZ6F|Z>S5(8yhdLH#W-Ql&Saw>foMzO9pp6 zq}iGGgUMNibqWXDpBfa_4RTsfow^|V*hqQ(^3cr>Uw<*F@}PI^+XGu=$0Jdt!rtM$ zLei&;&R>gXv}pQ2Iw(9b$OLi$NTCDuI!9jlMrq6#Oq7%0mCCT=Exh=!z^%so(AWeD zVz=Q5CTE4XdxOs9UJSuP?il}6Mh}LbBVbO3nmQW8PYi{Rfz#o=O)C?lCWPO*0~W8(Gube zBIfxlHZF>o*yPjjx~Q{Y<_szGuTo2amEVeqGCKH(EH{X*)DYw3!G;Z@Eu4nFRYlv! z3sVNGG&Y&+uisP!*kts1WfkR;1D}Vmc4%(QM{MQyzy_3fyD{QuT)A&`oxf2%n0sKq z)jDf&_%G~Woz;y`iBHr<)JKLUC1yn!<%5;qiHpPS<5Oa)v_@)B`He`VWLj0Cv1cIp zYY#o+t%2M~y5lRcCqBq{V<0`RM=BIpMH_z{Q2t#c#%lw)i)q*gj8_J7Gw9^gqVe)T z$EV`#cG5@(FY((S7=3f#{n)UE9Fds}(-PQzY(Tg%puZl#ZAb34dtaZ_rK=F(MnU>S z%A5s5b1Cpky1jis_--J%2WR&%50^-|OIUga)AE`BF@gIQ6L59HE=G3@Fe!p%b+5?f?wCa|JX9iIxH2#j}4lgb@cE zfi1>1xIf}k3Gp%$eOQpUc&_~X29dVC?q#wxLB4gznpVnj*k5;4+&-s?a<+(|OB)^m zvhAeZaJ(u9V10#RLzVx8ZouA)wxfKw zp-^l{_h(?RRi<=`FkAIvXl(LjkvJD%_03q_5355b!LOybbWC)d#yeiQvN7@6$QZmO z5lO`dz^TNgtvi(QiIHi^10tM54!o|4o5MJ?5xd?{va!u|+4jps>_HMbb8AFzU9pyjVF z?sz{`<9;<@%`^Dq(OpJq&ZVc+c1^-S`9avn?7rZ>4exz0vw*5oZ9go;4nU9t67^^i zGZVX{V29G{qfH+uKl?9rBfWLcFcS?ULnFeQ{XnV%s^XZ{gbtKn{+GHF@6>G@RW}IP z@YLmqZ7OJ=lB53BoBbI-use@GELbAE)w%lg7HqQ>u%`-@?eFkmJVg^jIw3Rnh)m$ybGSGA*Y0PdU+HguxxZDmIo{_mzaH*496Q2H2A8?f z2tix)$Fl&N8_@n@|GIZJ$A7c#NM)~RdbNMUtNoeT*0t}`$r@t%ZGX+S{>&UqR!%4T zYWsy9{a|>WkUe`Tg~g!yQ6O!ffQjrX?+W=NY{H!5(bcwg;pv zc-x>i?t%K~VU#Hw*m-uU{Z!w!S|;SxLm)5Z6Ef?m*J_ziO!>hTp?y31mYvTF^s{ggxR}cD^9{{)EH7%5xL%ps74O`6X9ZmMzJW0P1Hh! zlUBY#(#QKcFJNy;zYy8a*|49fz+_(7v#VArUSkM)3e{46_ZKy8O7Z=|O?p38%4C?*{Ecb1=WIUr$v>)vg zuJ&kNs=P|eOeT)bClD`z~95caMe2Y=oFBCtvBQ>L~+M)+nsJPgYxhi{mT-}f9 zDRQ_gk@_cA=X5`-KDVvm2z32Ru6`X)qP?b3;OkiK?Y^rA8jU9u ztv*}fc7ZP0M2Hm%8_5Kt4 zg>A3a`EGx_(XV=sez)KDTf(b-U#K2zR3A0+_4;jx>iz0!cJ^DVUp}|n`f(dvUTmz{ z_C63iWAd*)o^5_kJfrakx)0lxS4Gk|5#s+b+PKB-hS;_>u`yY3j9j@E)@nP%3R2pi zr3+QBt9oJ>KP?l?Rzh&fQrkXN%ioBqiEL-o%ze8#wxNP&E$P!I>U9y)sHs${D zjqT@EnH}gdL7it5>7OgNJ6h#UG}wF24Ppw{Gc9cSvc5>g&cw+3cGC9tLV3*5FnhaJ zrI_{>t(-2csl)B;u6eZbb1~xn@y=Z^k!QlG_K-fo*vGxr3saRS(2d;oIdD&`Kx}N6 zwpZ>VW^~*TgAeydEBf@=2A^yi0%c*xTh+TMN4uOmiv^nKR?3_&w*Rtkh96kZIbwXf zmhYS%j*cFfU)&6o1Q6^79vAyyuMpA4J&P6Fby$PenV<{CTfN}2*usgm5eKQE8G3(p zU1;u$vC0#owU#gQ^~oCFsNgs2xA=x?%f=U%7&pg!r|cCQ?}H#SsN(? z#DE~z1!4h`73`HSbb|0g7O#YIhM%CvCCe_uqUVZJ+y5Lve4-bBWYIwz6 zVj^JW_eER^Zm0SLstrkg(wXr(cA6;mzk z{*LxM?lOLdF)i(R$KK-3VPdB`ICjXq9f_Uo70&l|T!A}PA<5^&NM$bVYyEXwm0WUo zgFoxnZG%!5gGu|TUg2-O&?T;`ge(juC7ci zPi}r1riJs%F3Uw;<%y!fshW;*gWU~x20MCh7Y7qFQpSY9rDCWE2bfS1P*JjGF@T|= zK7^M4izz%o!|9QO-|QTcj@x84@AbmPCMZ}178Tg5CIW3jgEx79=D+T=H{kNLx2M;0 zcUk7SyDT-p&{0&_I1h0cJASjS*Gv2NqiMr=_E$ZOI$pL|7X4bUO{S=o$swo@TVt(E zN#F)vJ!_NsSnYV*Io(c-wY@Xd39tb*$zi~PFS}zt^6!8XL>#vldmB}?>M=GogE#k} zo_ef9Jq`>K+-LW|{cW~W4Z&6H5|*#A_U^OxzU1q0kWJfU2Yer{7s`8UAyFmUt$Nrl z`7qoToEM#I_?&CWf>f*ge)9}1Y))FL=I=ez!>1)o))e*9W4`(W>4nHze zbx6hdzT~Tf|GW&&LPDmNhh*9*;aJbM*w^Wo=(ss!qH|!_<|HjTNWp21WD1};34Art zsZ&`vd)OXmjuCBeTj94XC}!wG&11b=6D~9JPAI{x)b)Zb?&1#hq^5Rn%gxN}22(HJ z$FGzbUmR1xJ=zNam?gPuUxtVgF%$=FBD zg5KRUmxQ05=k7pm0j6p`?BPD_K|%5@{|e{Ub4k1W>hJ|=z%}}|d9Gk%UL+p+dM-a; z(p%nJ0P`Asy;Vn)mgEf1vulZGDI|lZpBt#+G{^#Ea#Qf*HqX%^y~kVNI5I@S%Ag~S z<8uRjxnOT`!Uf@1B}TTfkKo+}$M_24Jd#?cJ_WboJ*U=c!LJv1s#9C5@XQddgsXZ5 zm4s5^0rwn_&j(rF!)$@>mGF9qd3X=LvA#-h^+@>4yYL`hqslQ8$(<6Dy11)74&EwJ z7*$NTjO2#z26C5rpbJo{QC0I@52(su8bXR6j+g?wuW+FUJXnWd7(Q8_JDnTT1EawG z1E;S}bx0Po_j&yte|D+gh%5F`|Fl%UfehDI!n%s#t@?Vl55lr`^>u+3?!oYRYNj`3!VCq1qZqSI!_c$`NIehHnk&alDO#bB7ZtA<)vg zd-L|X)}#*yubIZnsmJWS2ynUO;p2K5#lx%upakW zw}0)brjc8oysp3kRV>wo|_b?+~ZX>C%daX2Suvr)6j}7`mfzlviNA^ zf5&XiC;!6#B#Hkcck_S0m;ZCOkdODfqu=ia`jIL5M^oao72zV5U=A7YO8$8j+^#Qc$%5tt|#qIY&Lx^GpY(7EWhv~nfU zec;~S2ep*>q%p?)cM*gG{#vxOLo0*BAqC!wn7ai)H2SWhUXkrO2XdyB)_mB_y+S80kq?W+ow(6d9AlFWte&QYa== zzkuZ*t~kTzJNR7g1sn`!HnY0zi-1#qW0@J!+~;!7A^uB>nd?nIgK3uxgkUD~gctWQ z4j|wjVG3{K+7Ne!FFy5m*1K+Uxu>NzCNcA&_D(pz#dhDra?#m1@{46#ExpVht_)F9 zx_r~82oB>&dpL>#sNV@V(aYU?6=Wv5gtkHA}@yN8a)^^p&nGmpk zS?et@ept_%Mv3?AY2n=-A%c1w+Z`zh6ny8>wD~nRH?3QUL`rqAt4Tk5<5A(&tE#2n zm%*~o!bwOstOMAwAj5m>lbOIvdzgfQmb~*l&|l|LhqGibqp@MkbluQKex3r-$t zWB-*})i7~n8qV47{xf`L8rPih$L~siH>W~v$}X$QmMvLtc*^wpk}-QSQUV`3|NjB? C4c&VH diff --git a/variants/sensebox_eye/tinyuf2.bin b/variants/sensebox_eye/tinyuf2.bin index 6b0fb1bcd0417ce9175fc75bf09b49f7516ab078..67c00aa39f0644371b2aeac5b2cbd898970a4481 100644 GIT binary patch literal 193056 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�toB(t4TH44ReY**I&WYHW7 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 literal 186912 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 d9 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νoK>^ZCdccnlY$kw|K0708fqyvzeRgwf{I- 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 z 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 z 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 -#include -#include -#include -#include -#include -#ifdef DISPLAY_ENABLED -#define SCREEN_WIDTH 128 -#define SCREEN_HEIGHT 64 -#define OLED_RESET -1 -#include -#include -Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); -#include -Adafruit_NeoPixel rgb_led_1 = Adafruit_NeoPixel(1, 1, NEO_GRB + NEO_KHZ800); - -#endif -#include "esp_partition.h" -#include "esp_ota_ops.h" -#include "esp_system.h" - -String ssid; -uint8_t mac[6]; - -// Create an instance of the server -WebServer server(80); -bool displayEnabled; - -const int BUTTON_PIN = 0; // GPIO for the button -volatile unsigned long lastPressTime = 0; // Time of last button press -volatile bool doublePressDetected = false; // Flag for double press -const unsigned long doublePressInterval = 500; // Max. time (in ms) between two presses for double press -volatile int pressCount = 0; // Counts the button presses - -const unsigned char epd_bitmap_wifi[] PROGMEM = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0xff, 0x00, 0x00, - 0x00, 0x3f, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x7c, 0x00, 0x03, 0xe0, 0x00, 0x00, 0xf0, 0x00, 0x01, 0xf0, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x78, 0x00, - 0x03, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x7f, 0xe0, 0x0e, 0x00, - 0x0c, 0x01, 0xff, 0xf0, 0x06, 0x00, 0x00, 0x07, 0xff, 0xfc, 0x02, 0x00, 0x00, 0x0f, 0x80, 0x3e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x1c, 0x00, 0x07, 0x80, 0x00, 0x00, 0x38, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x70, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x00, 0x00, 0xc0, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, - 0x00, 0x01, 0xe0, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x78, 0x00, 0x00, 0x00, 0x03, 0x80, 0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// 'checkmark', 44x44px -const unsigned char epd_bitmap_checkmark[] PROGMEM = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xf0, 0x00, 0x00, - 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0x83, 0xc0, 0x00, 0x00, 0x00, 0x07, 0xc7, 0x80, 0x00, 0x00, 0x00, 0x03, 0xef, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -void IRAM_ATTR handleButtonPress() { - unsigned long currentTime = millis(); // Get current time - - // Debounce: If the current press is too close to the last one, ignore it - if (currentTime - lastPressTime > 50) { - pressCount++; // Count the button press - - // Check if this is the second press within the double-press interval - if (pressCount == 2 && (currentTime - lastPressTime <= doublePressInterval)) { - doublePressDetected = true; // Double press detected - pressCount = 0; // Reset counter - } - - lastPressTime = currentTime; // Update the time of the last press - } -} - -// Function to switch the boot partition to OTA1 -void setBootPartitionToOTA0() { - const esp_partition_t *ota0_partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_0, NULL); - - if (ota0_partition) { - // Set OTA1 as new boot partition - esp_ota_set_boot_partition(ota0_partition); - Serial.println("Boot partition changed to OTA0. Restarting..."); - - // Restart to boot from the new partition - esp_restart(); - } else { - Serial.println("OTA1 partition not found!"); - } -} - -void setupDisplay() { - displayEnabled = display.begin(SSD1306_SWITCHCAPVCC, 0x3D); - if (displayEnabled) { - display.display(); - delay(100); - display.clearDisplay(); - } -} - -void displayStatusBar(int progress) { - display.clearDisplay(); - display.setCursor(24, 8); - display.println("Sketch wird"); - display.setCursor(22, 22); - display.println("hochgeladen!"); - - display.fillRect(0, SCREEN_HEIGHT - 24, SCREEN_WIDTH - 4, 8, BLACK); // Clear status bar area - display.drawRect(0, SCREEN_HEIGHT - 24, SCREEN_WIDTH - 4, 8, WHITE); // Draw border - int filledWidth = (progress * SCREEN_WIDTH - 4) / 100; // Calculate progress width - display.fillRect(1, SCREEN_HEIGHT - 23, filledWidth - 4, 6, WHITE); // Fill progress bar - - display.setCursor((SCREEN_WIDTH / 2) - 12, SCREEN_HEIGHT - 10); - display.setTextSize(1); - display.setTextColor(WHITE, BLACK); - display.print(progress); - display.println(" %"); - display.display(); -} - -void displayWelcomeScreen() { - display.clearDisplay(); - - // Draw WiFi symbol - display.drawBitmap(0, 12, epd_bitmap_wifi, 44, 44, WHITE); - - // Display SSID text - display.setCursor(40, 13); - display.setTextSize(1); - display.setTextColor(WHITE, BLACK); - display.println("Verbinde dich"); // "Connect" - display.setCursor(60, 27); - display.println("mit:"); // "with" - - // Display SSID - display.setCursor(40, 43); - display.setTextSize(1); // Larger text for SSID - display.print(ssid); - - display.display(); -} - -void displaySuccessScreen() { - display.clearDisplay(); - - // Draw WiFi symbol - display.drawBitmap(0, 12, epd_bitmap_checkmark, 44, 44, WHITE); - - // Display SSID text - display.setCursor(48, 22); - display.setTextSize(1); - display.setTextColor(WHITE, BLACK); - display.println("Erfolgreich"); // "Successfully" - display.setCursor(48, 36); - display.println("hochgeladen!"); // "uploaded!" - - display.display(); -} - -void wipeDisplay() { - display.clearDisplay(); - display.println(""); - display.display(); -} - -void setupWiFi() { - WiFi.macAddress(mac); - char macLastFour[5]; - snprintf(macLastFour, sizeof(macLastFour), "%02X%02X", mac[4], mac[5]); - ssid = "senseBox:" + String(macLastFour); - - // Define the IP address, gateway, and subnet mask - IPAddress local_IP(192, 168, 1, 1); // The new IP address - IPAddress gateway(192, 168, 1, 1); // Gateway address (can be the same as the AP's IP) - IPAddress subnet(255, 255, 255, 0); // Subnet mask - - // Set the IP address, gateway, and subnet mask of the access point - WiFi.softAPConfig(local_IP, gateway, subnet); - - // Start the access point - WiFi.softAP(ssid.c_str()); -} - -void setupOTA() { - // Handle updating process - server.on( - "/sketch", HTTP_POST, - []() { - server.sendHeader("Connection", "close"); - server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK"); - ESP.restart(); - }, - []() { - HTTPUpload &upload = server.upload(); - - if (upload.status == UPLOAD_FILE_START) { - Serial.setDebugOutput(true); - size_t fsize = UPDATE_SIZE_UNKNOWN; - if (server.clientContentLength() > 0) { - fsize = server.clientContentLength(); - } - Serial.printf("Receiving Update: %s, Size: %d\n", upload.filename.c_str(), fsize); - - Serial.printf("Update: %s\n", upload.filename.c_str()); - if (!Update.begin(fsize)) { //start with max available size - Update.printError(Serial); - } - } else if (upload.status == UPLOAD_FILE_WRITE) { - /* flashing firmware to ESP*/ - if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { - Update.printError(Serial); - } else { - int progress = (Update.progress() * 100) / Update.size(); - displayStatusBar(progress); // Update progress on status bar - } - } else if (upload.status == UPLOAD_FILE_END) { - if (Update.end(true)) { //true to set the size to the current progress - displaySuccessScreen(); - delay(3000); - wipeDisplay(); - } else { - Update.printError(Serial); - } - Serial.setDebugOutput(false); - } - yield(); - } - ); -} - -void setup() { - // Start Serial communication - Serial.begin(115200); - rgb_led_1.begin(); - rgb_led_1.setBrightness(30); - rgb_led_1.setPixelColor(0, rgb_led_1.Color(51, 51, 255)); - rgb_led_1.show(); - - // Configure button pin as input - pinMode(BUTTON_PIN, INPUT_PULLUP); - - // Interrupt for the button - attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), handleButtonPress, FALLING); - -#ifdef DISPLAY_ENABLED - setupDisplay(); -#endif - setupWiFi(); - // Set the ESP32 as an access point - setupOTA(); - server.begin(); -} - -void loop() { - // Handle client requests - server.handleClient(); - -#ifdef DISPLAY_ENABLED - displayWelcomeScreen(); -#endif - - if (doublePressDetected) { - Serial.println("Doppeldruck erkannt!"); // "Double press detected!" - setBootPartitionToOTA0(); -#ifdef DISPLAY_ENABLED - display.setCursor(0, 0); - display.setTextSize(1); - display.setTextColor(WHITE, BLACK); - display.println(""); - display.display(); - delay(50); -#endif - // Restart to boot from the new partition - esp_restart(); - } -} diff --git a/variants/sensebox_eye/variant.cpp b/variants/sensebox_eye/variant.cpp index 1eef839494e..d8a37f58758 100644 --- a/variants/sensebox_eye/variant.cpp +++ b/variants/sensebox_eye/variant.cpp @@ -1,34 +1,6 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2021 Ha Thach (tinyusb.org) for Adafruit Industries - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - #include "esp32-hal-gpio.h" #include "pins_arduino.h" #include "driver/rmt_tx.h" -#include "esp_log.h" -#include "esp_partition.h" -#include "esp_system.h" -#include "esp_ota_ops.h" extern "C" { @@ -72,29 +44,7 @@ void initVariant(void) { .loop_count = 0 }; - // define button pin - pinMode(47, INPUT_PULLUP); - - // Check if button is pressed - if (digitalRead(47) == LOW) { - // When the button is pressed and then released, boot into the OTA1 partition - const esp_partition_t *ota1_partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_1, NULL); - - if (ota1_partition) { - esp_err_t err = esp_ota_set_boot_partition(ota1_partition); - if (err == ESP_OK) { - uint8_t pixel[3] = { 0x00, 0x00, 0x10 }; // blue - blinkLED(pixel, led_chan, ws2812_encoder, tx_config); - esp_restart(); // restart, to boot OTA1 partition - } else { - uint8_t pixel[3] = { 0x00, 0x10, 0x00 }; // red - blinkLED(pixel, led_chan, ws2812_encoder, tx_config); - ESP_LOGE("OTA", "Error setting OTA1 partition: %s", esp_err_to_name(err)); - } - } - } else { - uint8_t pixel[3] = { 0x10, 0x00, 0x00 }; // green - blinkLED(pixel, led_chan, ws2812_encoder, tx_config); - } + uint8_t pixel[3] = { 0x10, 0x00, 0x00 }; // green + blinkLED(pixel, led_chan, ws2812_encoder, tx_config); } } From 28e90766018ffe46fef16526487ba2a905052e53 Mon Sep 17 00:00:00 2001 From: Paula Scharf Date: Sun, 20 Jul 2025 22:53:35 +0200 Subject: [PATCH 249/290] feat(board): build name uppercase --- boards.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards.txt b/boards.txt index 2363fe2a63b..07c34649ea0 100644 --- a/boards.txt +++ b/boards.txt @@ -41343,7 +41343,7 @@ sensebox_eye.build.target=esp32s3 sensebox_eye.build.mcu=esp32s3 sensebox_eye.build.core=esp32 sensebox_eye.build.variant=sensebox_eye -sensebox_eye.build.board=sensebox_eye +sensebox_eye.build.board=SENSEBOX_EYE sensebox_eye.build.usb_mode=0 sensebox_eye.build.cdc_on_boot=1 From 349b11d2d86b37f3e6613cf25ea490b02c9fdecf Mon Sep 17 00:00:00 2001 From: Paula Scharf Date: Sun, 20 Jul 2025 23:00:05 +0200 Subject: [PATCH 250/290] feat(board): name tag lowercase --- boards.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/boards.txt b/boards.txt index 07c34649ea0..1043ece4445 100644 --- a/boards.txt +++ b/boards.txt @@ -41313,12 +41313,12 @@ sensebox_mcu_esp32s2.menu.EraseFlash.all.upload.erase_cmd=-e # senseBox Eye sensebox_eye.name=senseBox Eye -senseBox_eye.vid.0=0x303A -senseBox_eye.pid.0=0x82D1 -senseBox_eye.vid.1=0x303A -senseBox_eye.pid.1=0x82D2 -senseBox_eye.vid.2=0x303A -senseBox_eye.pid.2=0x82D3 +sensebox_eye.vid.0=0x303A +sensebox_eye.pid.0=0x82D1 +sensebox_eye.vid.1=0x303A +sensebox_eye.pid.1=0x82D2 +sensebox_eye.vid.2=0x303A +sensebox_eye.pid.2=0x82D3 sensebox_eye.bootloader.tool=esptool_py sensebox_eye.bootloader.tool.default=esptool_py From cb3329be60f7cb446faa4aaa4572975ffdabab42 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, 21 Jul 2025 14:47:21 +0200 Subject: [PATCH 251/290] feat(zigbee): Add callback option for default response message (#11613) * feat(zigbee): Add cb option for default response message * fix(example): Add timeout and fix spelling * feat(zigbee): Add global default response cb option * fix(example): Use task for measure and sleep * fix(zigbee): Remove debug logs * ci(pre-commit): Apply automatic fixes * fix(example): Add retry and fix typo * 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_Temp_Hum_Sensor_Sleepy.ino | 81 ++++++++++++++++--- libraries/Zigbee/keywords.txt | 2 + libraries/Zigbee/src/Zigbee.h | 3 + libraries/Zigbee/src/ZigbeeCore.cpp | 7 ++ libraries/Zigbee/src/ZigbeeCore.h | 12 +++ libraries/Zigbee/src/ZigbeeEP.cpp | 12 ++- libraries/Zigbee/src/ZigbeeEP.h | 15 +++- libraries/Zigbee/src/ZigbeeHandlers.cpp | 10 +++ libraries/Zigbee/src/ZigbeeTypes.h | 30 +++++++ 9 files changed, 158 insertions(+), 14 deletions(-) create mode 100644 libraries/Zigbee/src/ZigbeeTypes.h 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 e9d08d32175..54c085fbfea 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,18 +32,49 @@ #include "Zigbee.h" +#define USE_GLOBAL_ON_RESPONSE_CALLBACK 1 // Set to 0 to use local callback specified directly for the endpoint. + /* 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 */ +#define REPORT_TIMEOUT 1000 /* Timeout for response from coordinator in ms */ uint8_t button = BOOT_PIN; ZigbeeTempSensor zbTempSensor = ZigbeeTempSensor(TEMP_SENSOR_ENDPOINT_NUMBER); +uint8_t dataToSend = 2; // Temperature and humidity values are reported in same endpoint, so 2 values are reported +bool resend = false; + +/************************ Callbacks *****************************/ +#if USE_GLOBAL_ON_RESPONSE_CALLBACK +void onGlobalResponse(zb_cmd_type_t command, esp_zb_zcl_status_t status, uint8_t endpoint, uint16_t cluster) { + Serial.printf("Global response command: %d, status: %s, endpoint: %d, cluster: 0x%04x\r\n", command, esp_zb_zcl_status_to_name(status), endpoint, cluster); + if ((command == ZB_CMD_REPORT_ATTRIBUTE) && (endpoint == TEMP_SENSOR_ENDPOINT_NUMBER)) { + switch (status) { + case ESP_ZB_ZCL_STATUS_SUCCESS: dataToSend--; break; + case ESP_ZB_ZCL_STATUS_FAIL: resend = true; break; + default: break; // add more statuses like ESP_ZB_ZCL_STATUS_INVALID_VALUE, ESP_ZB_ZCL_STATUS_TIMEOUT etc. + } + } +} +#else +void onResponse(zb_cmd_type_t command, esp_zb_zcl_status_t status) { + Serial.printf("Response command: %d, status: %s\r\n", command, esp_zb_zcl_status_to_name(status)); + if (command == ZB_CMD_REPORT_ATTRIBUTE) { + switch (status) { + case ESP_ZB_ZCL_STATUS_SUCCESS: dataToSend--; break; + case ESP_ZB_ZCL_STATUS_FAIL: resend = true; break; + default: break; // add more statuses like ESP_ZB_ZCL_STATUS_INVALID_VALUE, ESP_ZB_ZCL_STATUS_TIMEOUT etc. + } + } +} +#endif + /************************ Temp sensor *****************************/ -void meausureAndSleep() { +static void meausureAndSleep(void *arg) { // Measure temperature sensor value float temperature = temperatureRead(); @@ -55,13 +86,35 @@ void meausureAndSleep() { zbTempSensor.setHumidity(humidity); // Report temperature and humidity values - zbTempSensor.report(); + zbTempSensor.report(); // reports temperature and humidity values (if humidity sensor is not added, only temperature is reported) 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); + unsigned long startTime = millis(); + const unsigned long timeout = REPORT_TIMEOUT; + + Serial.printf("Waiting for data report to be confirmed \r\n"); + // Wait until data was successfully sent + int tries = 0; + const int maxTries = 3; + while (dataToSend != 0 && tries < maxTries) { + if (resend) { + Serial.println("Resending data on failure!"); + resend = false; + dataToSend = 2; + zbTempSensor.report(); // report again + } + if (millis() - startTime >= timeout) { + Serial.println("\nReport timeout! Report Again"); + dataToSend = 2; + zbTempSensor.report(); // report again + startTime = millis(); + tries++; + } + Serial.printf("."); + delay(50); // 50ms delay to avoid busy-waiting + } - // Put device to deep sleep + // Put device to deep sleep after data was sent successfully or timeout Serial.println("Going to sleep now"); esp_deep_sleep_start(); } @@ -92,6 +145,16 @@ void setup() { // Add humidity cluster to the temperature sensor device with min, max and tolerance values zbTempSensor.addHumiditySensor(0, 100, 1); + // Set callback for default response to handle status of reported data, there are 2 options. + +#if USE_GLOBAL_ON_RESPONSE_CALLBACK + // Global callback for all endpoints with more params to determine the endpoint and cluster in the callback function. + Zigbee.onGlobalDefaultResponse(onGlobalResponse); +#else + // Callback specified for endpoint + zbTempSensor.onDefaultResponse(onResponse); +#endif + // Add endpoint to Zigbee Core Zigbee.addEndpoint(&zbTempSensor); @@ -117,8 +180,8 @@ void setup() { Serial.println(); Serial.println("Successfully connected to Zigbee network"); - // Delay approx 1s (may be adjusted) to allow establishing proper connection with coordinator, needed for sleepy devices - delay(1000); + // Start Temperature sensor reading task + xTaskCreate(meausureAndSleep, "temp_sensor_update", 2048, NULL, 10, NULL); } void loop() { @@ -141,7 +204,5 @@ void loop() { } } } - - // Call the function to measure temperature and put the device to sleep - meausureAndSleep(); + delay(100); } diff --git a/libraries/Zigbee/keywords.txt b/libraries/Zigbee/keywords.txt index 23f3af3bf02..68721c1a66f 100644 --- a/libraries/Zigbee/keywords.txt +++ b/libraries/Zigbee/keywords.txt @@ -47,6 +47,7 @@ zb_power_source_t KEYWORD1 ZigbeeWindowCoveringType KEYWORD1 ZigbeeFanMode KEYWORD1 ZigbeeFanModeSequence KEYWORD1 +zb_cmd_type_t KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -96,6 +97,7 @@ getTime KEYWORD2 getTimezone KEYWORD2 addOTAClient KEYWORD2 clearBoundDevices KEYWORD2 +onDefaultResponse KEYWORD2 # ZigbeeLight + ZigbeeColorDimmableLight onLightChange KEYWORD2 diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index 65c9e7f0daa..ab94a163f3e 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -2,6 +2,9 @@ #pragma once +// Common types and functions +#include "ZigbeeTypes.h" + // Core #include "ZigbeeCore.h" #include "ZigbeeEP.h" diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index c49dedb221f..bf652642ac1 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -32,6 +32,7 @@ ZigbeeCore::ZigbeeCore() { _scan_duration = 3; // default scan duration _rx_on_when_idle = true; _debug = false; + _global_default_response_cb = nullptr; // Initialize global callback to nullptr if (!lock) { lock = xSemaphoreCreateBinary(); if (lock == NULL) { @@ -792,6 +793,12 @@ const char *ZigbeeCore::getDeviceTypeString(esp_zb_ha_standard_devices_t deviceI } } +void ZigbeeCore::callDefaultResponseCallback(zb_cmd_type_t resp_to_cmd, esp_zb_zcl_status_t status, uint8_t endpoint, uint16_t cluster) { + if (_global_default_response_cb) { + _global_default_response_cb(resp_to_cmd, status, endpoint, cluster); + } +} + ZigbeeCore Zigbee = ZigbeeCore(); #endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ZigbeeCore.h b/libraries/Zigbee/src/ZigbeeCore.h index 69c91c63ac4..df334e1620d 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -11,6 +11,7 @@ #include "aps/esp_zigbee_aps.h" #include #include +#include "ZigbeeTypes.h" #include "ZigbeeEP.h" class ZigbeeEP; @@ -103,6 +104,9 @@ class ZigbeeCore { SemaphoreHandle_t lock; bool _debug; + // Global default response callback + void (*_global_default_response_cb)(zb_cmd_type_t resp_to_cmd, esp_zb_zcl_status_t status, uint8_t endpoint, uint16_t cluster); + 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); @@ -176,6 +180,14 @@ class ZigbeeCore { return _debug; } + // Set global default response callback + void onGlobalDefaultResponse(void (*callback)(zb_cmd_type_t resp_to_cmd, esp_zb_zcl_status_t status, uint8_t endpoint, uint16_t cluster)) { + _global_default_response_cb = callback; + } + + // Call global default response callback (for internal use) + void callDefaultResponseCallback(zb_cmd_type_t resp_to_cmd, esp_zb_zcl_status_t status, uint8_t endpoint, uint16_t cluster); + // Friend function declaration to allow access to private members friend void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct); friend bool zb_apsde_data_indication_handler(esp_zb_apsde_data_ind_t ind); diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index efddbdd0368..6b63cae0312 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -608,7 +608,17 @@ void ZigbeeEP::removeBoundDevice(zb_device_params_t *device) { log_w("No matching device found for removal"); } -const char *ZigbeeEP::esp_zb_zcl_status_to_name(esp_zb_zcl_status_t status) { +void ZigbeeEP::zbDefaultResponse(const esp_zb_zcl_cmd_default_resp_message_t *message) { + log_v("Default response received for endpoint %d", _endpoint); + log_v("Status code: %s", esp_zb_zcl_status_to_name(message->status_code)); + log_v("Response to command: %d", message->resp_to_cmd); + if (_on_default_response) { + _on_default_response((zb_cmd_type_t)message->resp_to_cmd, message->status_code); + } +} + +// Global function implementation +const char *esp_zb_zcl_status_to_name(esp_zb_zcl_status_t status) { switch (status) { case ESP_ZB_ZCL_STATUS_SUCCESS: return "Success"; case ESP_ZB_ZCL_STATUS_FAIL: return "Fail"; diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index a3217cbd066..23217407003 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -38,6 +38,9 @@ typedef enum { ZB_POWER_SOURCE_BATTERY = 0x03, } zb_power_source_t; +// Global function for converting ZCL status to name +const char *esp_zb_zcl_status_to_name(esp_zb_zcl_status_t status); + /* Zigbee End Device Class */ class ZigbeeEP { public: @@ -138,6 +141,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 zbDefaultResponse(const esp_zb_zcl_cmd_default_resp_message_t *message); //already implemented virtual void addBoundDevice(zb_device_params_t *device) { _bound_devices.push_back(device); @@ -156,17 +160,21 @@ class ZigbeeEP { _on_identify = callback; } + void onDefaultResponse(void (*callback)(zb_cmd_type_t resp_to_cmd, esp_zb_zcl_status_t status)) { + _on_default_response = callback; + } + + // Convert ZCL status to name + private: char *_read_manufacturer; char *_read_model; void (*_on_identify)(uint16_t time); + void (*_on_default_response)(zb_cmd_type_t resp_to_cmd, esp_zb_zcl_status_t status); time_t _read_time; int32_t _read_timezone; protected: - // Convert ZCL status to name - const char *esp_zb_zcl_status_to_name(esp_zb_zcl_status_t status); - uint8_t _endpoint; esp_zb_ha_standard_devices_t _device_id; esp_zb_endpoint_config_t _ep_config; @@ -179,6 +187,7 @@ class ZigbeeEP { zb_power_source_t _power_source; uint8_t _time_status; + // Friend class declaration to allow access to protected members friend class ZigbeeCore; }; diff --git a/libraries/Zigbee/src/ZigbeeHandlers.cpp b/libraries/Zigbee/src/ZigbeeHandlers.cpp index 5d54e459058..0986056dcd9 100644 --- a/libraries/Zigbee/src/ZigbeeHandlers.cpp +++ b/libraries/Zigbee/src/ZigbeeHandlers.cpp @@ -398,6 +398,16 @@ static esp_err_t zb_cmd_default_resp_handler(const esp_zb_zcl_cmd_default_resp_m "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 ); + + // Call global callback if set + Zigbee.callDefaultResponseCallback((zb_cmd_type_t)message->resp_to_cmd, message->status_code, message->info.dst_endpoint, message->info.cluster); + + // 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)->zbDefaultResponse(message); //method zbDefaultResponse is implemented in the common EP class + } + } return ESP_OK; } diff --git a/libraries/Zigbee/src/ZigbeeTypes.h b/libraries/Zigbee/src/ZigbeeTypes.h new file mode 100644 index 00000000000..5025f90db7c --- /dev/null +++ b/libraries/Zigbee/src/ZigbeeTypes.h @@ -0,0 +1,30 @@ +#pragma once + +#include "esp_zigbee_core.h" + +// Foundation Command Types +typedef enum { + ZB_CMD_READ_ATTRIBUTE = 0x00U, /*!< Read attributes command */ + ZB_CMD_READ_ATTRIBUTE_RESPONSE = 0x01U, /*!< Read attributes response command */ + ZB_CMD_WRITE_ATTRIBUTE = 0x02U, /*!< Write attributes foundation command */ + ZB_CMD_WRITE_ATTRIBUTE_UNDIVIDED = 0x03U, /*!< Write attributes undivided command */ + ZB_CMD_WRITE_ATTRIBUTE_RESPONSE = 0x04U, /*!< Write attributes response command */ + ZB_CMD_WRITE_ATTRIBUTE_NO_RESPONSE = 0x05U, /*!< Write attributes no response command */ + ZB_CMD_CONFIGURE_REPORTING = 0x06U, /*!< Configure reporting command */ + ZB_CMD_CONFIGURE_REPORTING_RESPONSE = 0x07U, /*!< Configure reporting response command */ + ZB_CMD_READ_REPORTING_CONFIG = 0x08U, /*!< Read reporting config command */ + ZB_CMD_READ_REPORTING_CONFIG_RESPONSE = 0x09U, /*!< Read reporting config response command */ + ZB_CMD_REPORT_ATTRIBUTE = 0x0aU, /*!< Report attribute command */ + ZB_CMD_DEFAULT_RESPONSE = 0x0bU, /*!< Default response command */ + ZB_CMD_DISCOVER_ATTRIBUTES = 0x0cU, /*!< Discover attributes command */ + ZB_CMD_DISCOVER_ATTRIBUTES_RESPONSE = 0x0dU, /*!< Discover attributes response command */ + ZB_CMD_READ_ATTRIBUTE_STRUCTURED = 0x0eU, /*!< Read attributes structured */ + ZB_CMD_WRITE_ATTRIBUTE_STRUCTURED = 0x0fU, /*!< Write attributes structured */ + ZB_CMD_WRITE_ATTRIBUTE_STRUCTURED_RESPONSE = 0x10U, /*!< Write attributes structured response */ + ZB_CMD_DISCOVER_COMMANDS_RECEIVED = 0x11U, /*!< Discover Commands Received command */ + ZB_CMD_DISCOVER_COMMANDS_RECEIVED_RESPONSE = 0x12U, /*!< Discover Commands Received response command */ + ZB_CMD_DISCOVER_COMMANDS_GENERATED = 0x13U, /*!< Discover Commands Generated command */ + ZB_CMD_DISCOVER_COMMANDS_GENERATED_RESPONSE = 0x14U, /*!< Discover Commands Generated response command */ + ZB_CMD_DISCOVER_ATTRIBUTES_EXTENDED = 0x15U, /*!< Discover attributes extended command */ + ZB_CMD_DISCOVER_ATTRIBUTES_EXTENDED_RESPONSE = 0x16U, /*!< Discover attributes extended response command */ +} zb_cmd_type_t; From 995e603d3af8305959948a46ff0793c72e5c1687 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, 21 Jul 2025 14:47:43 +0200 Subject: [PATCH 252/290] fix(zigbee): Replace assert with error log to solve immediate crash (#11614) * fix(zigbee): Replace assert with error log to solve immediate crash * 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/ZigbeeCore.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index bf652642ac1..90b29cf9d0a 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -238,7 +238,9 @@ void ZigbeeCore::closeNetwork() { } static void bdb_start_top_level_commissioning_cb(uint8_t mode_mask) { - ESP_ERROR_CHECK(esp_zb_bdb_start_top_level_commissioning(mode_mask)); + if (esp_zb_bdb_start_top_level_commissioning(mode_mask) != ESP_OK) { + log_e("Failed to start Zigbee commissioning"); + } } void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { From f1712943b4960749316612bcf0fb4caf5d74efa0 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Mon, 21 Jul 2025 15:48:05 +0300 Subject: [PATCH 253/290] fix(ppp): Detach PPP RST pin from periman on end (#11620) --- libraries/PPP/src/PPP.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp index 87fee6920c3..2a5c5760287 100644 --- a/libraries/PPP/src/PPP.cpp +++ b/libraries/PPP/src/PPP.cpp @@ -432,6 +432,11 @@ void PPPClass::end(void) { _pin_cts = -1; perimanClearPinBus(pin); } + if (_pin_rst != -1) { + pin = _pin_rst; + _pin_rst = -1; + perimanClearPinBus(pin); + } _mode = ESP_MODEM_MODE_COMMAND; } From 4a3c6d7fbbb21ac7439e145680f8201c00b11b67 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Mon, 21 Jul 2025 15:49:15 +0300 Subject: [PATCH 254/290] feat(netif): Allow setting interface's routing priority (#11617) * feat(netif): Allow setting interface's routing priority * feat(netif): Rename route priority method names and add notes * feat(netif): Print route prio for each interface --- libraries/Network/src/NetworkInterface.cpp | 28 ++++++++++++++++++++-- libraries/Network/src/NetworkInterface.h | 5 +++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/libraries/Network/src/NetworkInterface.cpp b/libraries/Network/src/NetworkInterface.cpp index 01790ec2493..06cf2a377b0 100644 --- a/libraries/Network/src/NetworkInterface.cpp +++ b/libraries/Network/src/NetworkInterface.cpp @@ -606,13 +606,33 @@ int NetworkInterface::impl_index() const { return esp_netif_get_netif_impl_index(_esp_netif); } -int NetworkInterface::route_prio() const { +/** + * Every netif has a parameter named route_prio, you can refer to file esp_netif_defaults.h. + * A higher value of route_prio indicates a higher priority. + * The active interface with highest priority will be used for default route (gateway). + * Defaults are: STA=100, BR=70, ETH=50, PPP=20, AP/NAN=10 + */ +int NetworkInterface::getRoutePrio() const { if (_esp_netif == NULL) { return -1; } return esp_netif_get_route_prio(_esp_netif); } +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) +int NetworkInterface::setRoutePrio(int prio) { + if (_esp_netif == NULL) { + return -1; + } + return esp_netif_set_route_prio(_esp_netif, prio); +} +#endif + +/** + * This API overrides the automatic configuration of the default interface based on the route_prio + * If the selected netif is set default using this API, no other interface could be set-default disregarding + * its route_prio number (unless the selected netif gets destroyed) + */ bool NetworkInterface::setDefault() { if (_esp_netif == NULL) { return false; @@ -819,7 +839,11 @@ size_t NetworkInterface::printTo(Print &out) const { if (flags & ESP_NETIF_FLAG_MLDV6_REPORT) { bytes += out.print(",V6_REP"); } - bytes += out.println(")"); + bytes += out.print(")"); + + bytes += out.print(" PRIO: "); + bytes += out.print(getRoutePrio()); + bytes += out.println(""); bytes += out.print(" "); bytes += out.print("ether "); diff --git a/libraries/Network/src/NetworkInterface.h b/libraries/Network/src/NetworkInterface.h index 4f97181d4fd..fd26df77697 100644 --- a/libraries/Network/src/NetworkInterface.h +++ b/libraries/Network/src/NetworkInterface.h @@ -57,7 +57,10 @@ class NetworkInterface : public Printable { const char *desc() const; String impl_name() const; int impl_index() const; - int route_prio() const; + int getRoutePrio() const; +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) + int setRoutePrio(int prio); +#endif bool setDefault(); bool isDefault() const; From c369dca062ee99bf8b20ffee89537f3c66d9ea52 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, 21 Jul 2025 23:35:28 +0200 Subject: [PATCH 255/290] feat(docs): Add Zigbee library API documentation (#11525) * feat(docs): Add Zigbee library documentation * fix: Remove helper scripts * fix: Proper class naming for better readability * fix(docs): Fix typos Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * ci(pre-commit): Apply automatic fixes * fix(docs): Precommit fixes * fix(docs): Precommit fixes --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- docs/en/libraries.rst | 12 + docs/en/zigbee/ep_analog.rst | 280 ++++++++++++++ docs/en/zigbee/ep_binary.rst | 137 +++++++ docs/en/zigbee/ep_carbon_dioxide_sensor.rst | 105 ++++++ docs/en/zigbee/ep_color_dimmable_light.rst | 223 +++++++++++ docs/en/zigbee/ep_color_dimmer_switch.rst | 186 +++++++++ docs/en/zigbee/ep_contact_switch.rst | 95 +++++ docs/en/zigbee/ep_dimmable_light.rst | 138 +++++++ docs/en/zigbee/ep_door_window_handle.rst | 95 +++++ docs/en/zigbee/ep_electrical_measurement.rst | 254 +++++++++++++ docs/en/zigbee/ep_flow_sensor.rst | 119 ++++++ docs/en/zigbee/ep_gateway.rst | 35 ++ docs/en/zigbee/ep_illuminance_sensor.rst | 109 ++++++ docs/en/zigbee/ep_light.rst | 88 +++++ docs/en/zigbee/ep_occupancy_sensor.rst | 81 ++++ docs/en/zigbee/ep_pm25_sensor.rst | 109 ++++++ docs/en/zigbee/ep_power_outlet.rst | 88 +++++ docs/en/zigbee/ep_pressure_sensor.rst | 109 ++++++ docs/en/zigbee/ep_range_extender.rst | 34 ++ docs/en/zigbee/ep_switch.rst | 136 +++++++ docs/en/zigbee/ep_temperature_sensor.rst | 184 +++++++++ docs/en/zigbee/ep_thermostat.rst | 238 ++++++++++++ docs/en/zigbee/ep_vibration_sensor.rst | 87 +++++ docs/en/zigbee/ep_wind_speed_sensor.rst | 119 ++++++ docs/en/zigbee/ep_window_covering.rst | 233 ++++++++++++ docs/en/zigbee/zigbee.rst | 159 ++++++++ docs/en/zigbee/zigbee_core.rst | 375 +++++++++++++++++++ docs/en/zigbee/zigbee_ep.rst | 357 ++++++++++++++++++ 28 files changed, 4185 insertions(+) create mode 100644 docs/en/zigbee/ep_analog.rst create mode 100644 docs/en/zigbee/ep_binary.rst create mode 100644 docs/en/zigbee/ep_carbon_dioxide_sensor.rst create mode 100644 docs/en/zigbee/ep_color_dimmable_light.rst create mode 100644 docs/en/zigbee/ep_color_dimmer_switch.rst create mode 100644 docs/en/zigbee/ep_contact_switch.rst create mode 100644 docs/en/zigbee/ep_dimmable_light.rst create mode 100644 docs/en/zigbee/ep_door_window_handle.rst create mode 100644 docs/en/zigbee/ep_electrical_measurement.rst create mode 100644 docs/en/zigbee/ep_flow_sensor.rst create mode 100644 docs/en/zigbee/ep_gateway.rst create mode 100644 docs/en/zigbee/ep_illuminance_sensor.rst create mode 100644 docs/en/zigbee/ep_light.rst create mode 100644 docs/en/zigbee/ep_occupancy_sensor.rst create mode 100644 docs/en/zigbee/ep_pm25_sensor.rst create mode 100644 docs/en/zigbee/ep_power_outlet.rst create mode 100644 docs/en/zigbee/ep_pressure_sensor.rst create mode 100644 docs/en/zigbee/ep_range_extender.rst create mode 100644 docs/en/zigbee/ep_switch.rst create mode 100644 docs/en/zigbee/ep_temperature_sensor.rst create mode 100644 docs/en/zigbee/ep_thermostat.rst create mode 100644 docs/en/zigbee/ep_vibration_sensor.rst create mode 100644 docs/en/zigbee/ep_wind_speed_sensor.rst create mode 100644 docs/en/zigbee/ep_window_covering.rst create mode 100644 docs/en/zigbee/zigbee.rst create mode 100644 docs/en/zigbee/zigbee_core.rst create mode 100644 docs/en/zigbee/zigbee_ep.rst diff --git a/docs/en/libraries.rst b/docs/en/libraries.rst index 525a5c4ba26..07f0978be68 100644 --- a/docs/en/libraries.rst +++ b/docs/en/libraries.rst @@ -91,3 +91,15 @@ The Arduino ESP32 offers some unique APIs, described in this section: :glob: api/* + +Zigbee APIs +----------- + +.. toctree:: + :maxdepth: 1 + :glob: + + zigbee/zigbee + zigbee/zigbee_core + zigbee/zigbee_ep + zigbee/ep_* diff --git a/docs/en/zigbee/ep_analog.rst b/docs/en/zigbee/ep_analog.rst new file mode 100644 index 00000000000..45740007881 --- /dev/null +++ b/docs/en/zigbee/ep_analog.rst @@ -0,0 +1,280 @@ +############ +ZigbeeAnalog +############ + +About +----- + +The ``ZigbeeAnalog`` class provides analog input and output endpoints for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for analog signal processing and control. +Analog Input (AI) is meant to be used for sensors that provide an analog signal, such as temperature, humidity, pressure to be sent to the coordinator. +Analog Output (AO) is meant to be used for actuators that require an analog signal, such as dimmers, valves, etc. to be controlled by the coordinator. + + +Common API +---------- + +Constructor +*********** + +ZigbeeAnalog +^^^^^^^^^^^^ + +Creates a new Zigbee analog endpoint. + +.. code-block:: arduino + + ZigbeeAnalog(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Cluster Management +****************** + +addAnalogInput +^^^^^^^^^^^^^^ + +Adds analog input cluster to the endpoint. + +.. code-block:: arduino + + bool addAnalogInput(); + +This function will return ``true`` if successful, ``false`` otherwise. + +addAnalogOutput +^^^^^^^^^^^^^^^ + +Adds analog output cluster to the endpoint. + +.. code-block:: arduino + + bool addAnalogOutput(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Analog Input API +---------------- + +Configuration Methods +********************* + +setAnalogInputApplication +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Sets the application type for the analog input. + +.. code-block:: arduino + + bool setAnalogInputApplication(uint32_t application_type); + +* ``application_type`` - Application type constant (see esp_zigbee_zcl_analog_input.h for values) + +This function will return ``true`` if successful, ``false`` otherwise. + +setAnalogInputDescription +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Sets a custom description for the analog input. + +.. code-block:: arduino + + bool setAnalogInputDescription(const char *description); + +* ``description`` - Description string + +This function will return ``true`` if successful, ``false`` otherwise. + +setAnalogInputResolution +^^^^^^^^^^^^^^^^^^^^^^^^ + +Sets the resolution for the analog input. + +.. code-block:: arduino + + bool setAnalogInputResolution(float resolution); + +* ``resolution`` - Resolution value + +This function will return ``true`` if successful, ``false`` otherwise. + +setAnalogInputMinMax +^^^^^^^^^^^^^^^^^^^^ + +Sets the minimum and maximum values for the analog input. + +.. code-block:: arduino + + bool setAnalogInputMinMax(float min, float max); + +* ``min`` - Minimum value +* ``max`` - Maximum value + +This function will return ``true`` if successful, ``false`` otherwise. + +Value Control +************* + +setAnalogInput +^^^^^^^^^^^^^^ + +Sets the analog input value. + +.. code-block:: arduino + + bool setAnalogInput(float analog); + +* ``analog`` - Analog input value + +This function will return ``true`` if successful, ``false`` otherwise. + +Reporting Methods +***************** + +setAnalogInputReporting +^^^^^^^^^^^^^^^^^^^^^^^ + +Sets the reporting configuration for analog input. + +.. code-block:: arduino + + bool setAnalogInputReporting(uint16_t min_interval, uint16_t max_interval, float delta); + +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change in value to trigger a report + +This function will return ``true`` if successful, ``false`` otherwise. + +reportAnalogInput +^^^^^^^^^^^^^^^^^ + +Manually reports the current analog input value. + +.. code-block:: arduino + + bool reportAnalogInput(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Analog Output API +----------------- + +Configuration Methods +********************* + +setAnalogOutputApplication +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Sets the application type for the analog output. + +.. code-block:: arduino + + bool setAnalogOutputApplication(uint32_t application_type); + +* ``application_type`` - Application type constant (see esp_zigbee_zcl_analog_output.h for values) + +This function will return ``true`` if successful, ``false`` otherwise. + +setAnalogOutputDescription +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Sets a custom description for the analog output. + +.. code-block:: arduino + + bool setAnalogOutputDescription(const char *description); + +* ``description`` - Description string + +This function will return ``true`` if successful, ``false`` otherwise. + +setAnalogOutputResolution +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Sets the resolution for the analog output. + +.. code-block:: arduino + + bool setAnalogOutputResolution(float resolution); + +* ``resolution`` - Resolution value + +This function will return ``true`` if successful, ``false`` otherwise. + +setAnalogOutputMinMax +^^^^^^^^^^^^^^^^^^^^^ + +Sets the minimum and maximum values for the analog output. + +.. code-block:: arduino + + bool setAnalogOutputMinMax(float min, float max); + +* ``min`` - Minimum value +* ``max`` - Maximum value + +This function will return ``true`` if successful, ``false`` otherwise. + +Value Control +************* + +setAnalogOutput +^^^^^^^^^^^^^^^ + +Sets the analog output value. + +.. code-block:: arduino + + bool setAnalogOutput(float analog); + +* ``analog`` - Analog output value + +This function will return ``true`` if successful, ``false`` otherwise. + +getAnalogOutput +^^^^^^^^^^^^^^^ + +Gets the current analog output value. + +.. code-block:: arduino + + float getAnalogOutput(); + +This function will return current analog output value. + +Reporting Methods +***************** + +reportAnalogOutput +^^^^^^^^^^^^^^^^^^ + +Manually reports the current analog output value. + +.. code-block:: arduino + + bool reportAnalogOutput(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Event Handling +************** + +onAnalogOutputChange +^^^^^^^^^^^^^^^^^^^^ + +Sets a callback function to be called when the analog output value changes. + +.. code-block:: arduino + + void onAnalogOutputChange(void (*callback)(float analog)); + +* ``callback`` - Function to call when analog output changes + +Example +------- + +Analog Input/Output +******************* + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Analog_Input_Output/Zigbee_Analog_Input_Output.ino + :language: arduino diff --git a/docs/en/zigbee/ep_binary.rst b/docs/en/zigbee/ep_binary.rst new file mode 100644 index 00000000000..950e20ef42b --- /dev/null +++ b/docs/en/zigbee/ep_binary.rst @@ -0,0 +1,137 @@ +############ +ZigbeeBinary +############ + +About +----- + +The ``ZigbeeBinary`` class provides an endpoint for binary input/output sensors in Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for binary sensors, supporting various application types for HVAC, security, and general binary sensing. +Binary Input (BI) is meant to be used for sensors that provide a binary signal, such as door/window sensors, motion detectors, etc. to be sent to the network. + +.. note:: + + Binary Output (BO) is not supported yet. + +API Reference +------------- + +Constructor +*********** + +ZigbeeBinary +^^^^^^^^^^^^ + +Creates a new Zigbee binary sensor endpoint. + +.. code-block:: arduino + + ZigbeeBinary(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Binary Input Application Types +****************************** + +HVAC Application Types +^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: arduino + + #define BINARY_INPUT_APPLICATION_TYPE_HVAC_BOILER_STATUS 0x00000003 + #define BINARY_INPUT_APPLICATION_TYPE_HVAC_CHILLER_STATUS 0x00000013 + #define BINARY_INPUT_APPLICATION_TYPE_HVAC_OCCUPANCY 0x00000031 + #define BINARY_INPUT_APPLICATION_TYPE_HVAC_FAN_STATUS 0x00000035 + #define BINARY_INPUT_APPLICATION_TYPE_HVAC_FILTER_STATUS 0x00000036 + #define BINARY_INPUT_APPLICATION_TYPE_HVAC_HEATING_ALARM 0x0000003E + #define BINARY_INPUT_APPLICATION_TYPE_HVAC_COOLING_ALARM 0x0000001D + #define BINARY_INPUT_APPLICATION_TYPE_HVAC_UNIT_ENABLE 0x00000090 + #define BINARY_INPUT_APPLICATION_TYPE_HVAC_OTHER 0x0000FFFF + +Security Application Types +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: arduino + + #define BINARY_INPUT_APPLICATION_TYPE_SECURITY_GLASS_BREAKAGE_DETECTION_0 0x01000000 + #define BINARY_INPUT_APPLICATION_TYPE_SECURITY_INTRUSION_DETECTION 0x01000001 + #define BINARY_INPUT_APPLICATION_TYPE_SECURITY_MOTION_DETECTION 0x01000002 + #define BINARY_INPUT_APPLICATION_TYPE_SECURITY_GLASS_BREAKAGE_DETECTION_1 0x01000003 + #define BINARY_INPUT_APPLICATION_TYPE_SECURITY_ZONE_ARMED 0x01000004 + #define BINARY_INPUT_APPLICATION_TYPE_SECURITY_GLASS_BREAKAGE_DETECTION_2 0x01000005 + #define BINARY_INPUT_APPLICATION_TYPE_SECURITY_SMOKE_DETECTION 0x01000006 + #define BINARY_INPUT_APPLICATION_TYPE_SECURITY_CARBON_DIOXIDE_DETECTION 0x01000007 + #define BINARY_INPUT_APPLICATION_TYPE_SECURITY_HEAT_DETECTION 0x01000008 + #define BINARY_INPUT_APPLICATION_TYPE_SECURITY_OTHER 0x0100FFFF + +API Methods +*********** + +addBinaryInput +^^^^^^^^^^^^^^ + +Adds a binary input cluster to the endpoint. + +.. code-block:: arduino + + bool addBinaryInput(); + +This function will return ``true`` if successful, ``false`` otherwise. + +setBinaryInputApplication +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Sets the application type for the binary input. + +.. code-block:: arduino + + bool setBinaryInputApplication(uint32_t application_type); + +* ``application_type`` - Application type constant (see above) + +This function will return ``true`` if successful, ``false`` otherwise. + +setBinaryInputDescription +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Sets a custom description for the binary input. + +.. code-block:: arduino + + bool setBinaryInputDescription(const char *description); + +* ``description`` - Description string + +This function will return ``true`` if successful, ``false`` otherwise. + +setBinaryInput +^^^^^^^^^^^^^^ + +Sets the binary input value. + +.. code-block:: arduino + + bool setBinaryInput(bool input); + +* ``input`` - Binary value (true/false) + +This function will return ``true`` if successful, ``false`` otherwise. + +reportBinaryInput +^^^^^^^^^^^^^^^^^ + +Manually reports the current binary input value. + +.. code-block:: arduino + + bool reportBinaryInput(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Example +------- + +Binary Input Implementation +**************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Binary_Input/Zigbee_Binary_Input.ino + :language: arduino diff --git a/docs/en/zigbee/ep_carbon_dioxide_sensor.rst b/docs/en/zigbee/ep_carbon_dioxide_sensor.rst new file mode 100644 index 00000000000..6f219a16fd0 --- /dev/null +++ b/docs/en/zigbee/ep_carbon_dioxide_sensor.rst @@ -0,0 +1,105 @@ +######################### +ZigbeeCarbonDioxideSensor +######################### + +About +----- + +The ``ZigbeeCarbonDioxideSensor`` class provides a CO2 sensor endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for carbon dioxide measurement devices. + +API Reference +------------- + +Constructor +*********** + +ZigbeeCarbonDioxideSensor +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee CO2 sensor endpoint. + +.. code-block:: arduino + + ZigbeeCarbonDioxideSensor(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +API Methods +*********** + +setCarbonDioxide +^^^^^^^^^^^^^^^^ + +Sets the CO2 concentration measurement value. + +.. code-block:: arduino + + bool setCarbonDioxide(float carbon_dioxide); + +* ``carbon_dioxide`` - CO2 concentration value in ppm + +This function will return ``true`` if successful, ``false`` otherwise. + +setMinMaxValue +^^^^^^^^^^^^^^ + +Sets the minimum and maximum measurement values. + +.. code-block:: arduino + + bool setMinMaxValue(float min, float max); + +* ``min`` - Minimum CO2 concentration value in ppm +* ``max`` - Maximum CO2 concentration value in ppm + +This function will return ``true`` if successful, ``false`` otherwise. + +setTolerance +^^^^^^^^^^^^ + +Sets the tolerance value for measurements. + +.. code-block:: arduino + + bool setTolerance(float tolerance); + +* ``tolerance`` - Tolerance value in ppm + +This function will return ``true`` if successful, ``false`` otherwise. + +setReporting +^^^^^^^^^^^^ + +Sets the reporting configuration for CO2 measurements. + +.. code-block:: arduino + + bool setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta); + +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change required to trigger a report in ppm + +**Note:** Delta reporting is currently not supported by the carbon dioxide sensor. + +This function will return ``true`` if successful, ``false`` otherwise. + +report +^^^^^^ + +Manually reports the current CO2 concentration value. + +.. code-block:: arduino + + bool report(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Example +------- + +CO2 Sensor Implementation +************************* + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_CarbonDioxide_Sensor/Zigbee_CarbonDioxide_Sensor.ino + :language: arduino diff --git a/docs/en/zigbee/ep_color_dimmable_light.rst b/docs/en/zigbee/ep_color_dimmable_light.rst new file mode 100644 index 00000000000..b2fa6d0bf91 --- /dev/null +++ b/docs/en/zigbee/ep_color_dimmable_light.rst @@ -0,0 +1,223 @@ +######################## +ZigbeeColorDimmableLight +######################## + +About +----- + +The ``ZigbeeColorDimmableLight`` class provides an endpoint for color dimmable lights in Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for color lighting devices, supporting RGB color control, dimming, and scene management. + +**Features:** +* On/off control +* Brightness level control (0-100%) +* RGB color control +* HSV color support +* Scene and group support +* Automatic state restoration +* Integration with common endpoint features (binding, OTA, etc.) +* Zigbee HA standard compliance + +**Use Cases:** +* Smart RGB light bulbs +* Color-changing LED strips +* Mood lighting systems +* Entertainment lighting +* Architectural lighting +* Smart home color lighting + +API Reference +------------- + +Constructor +*********** + +ZigbeeColorDimmableLight +^^^^^^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee color dimmable light endpoint. + +.. code-block:: arduino + + ZigbeeColorDimmableLight(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Callback Functions +****************** + +onLightChange +^^^^^^^^^^^^^ + +Sets the callback function for light state changes. + +.. code-block:: arduino + + void onLightChange(void (*callback)(bool, uint8_t, uint8_t, uint8_t, uint8_t)); + +* ``callback`` - Function pointer to the light change callback (state, red, green, blue, level) + +Control Methods +*************** + +setLightState +^^^^^^^^^^^^^ + +Sets the light on/off state. + +.. code-block:: arduino + + bool setLightState(bool state); + +* ``state`` - Light state (true = on, false = off) + +This function will return ``true`` if successful, ``false`` otherwise. + +setLightLevel +^^^^^^^^^^^^^ + +Sets the light brightness level. + +.. code-block:: arduino + + bool setLightLevel(uint8_t level); + +* ``level`` - Brightness level (0-100, where 0 is off, 100 is full brightness) + +This function will return ``true`` if successful, ``false`` otherwise. + +setLightColor (RGB) +^^^^^^^^^^^^^^^^^^^ + +Sets the light color using RGB values. + +.. code-block:: arduino + + bool setLightColor(uint8_t red, uint8_t green, uint8_t blue); + bool setLightColor(espRgbColor_t rgb_color); + +* ``red`` - Red component (0-255) +* ``green`` - Green component (0-255) +* ``blue`` - Blue component (0-255) +* ``rgb_color`` - RGB color structure + +This function will return ``true`` if successful, ``false`` otherwise. + +setLightColor (HSV) +^^^^^^^^^^^^^^^^^^^ + +Sets the light color using HSV values. + +.. code-block:: arduino + + bool setLightColor(espHsvColor_t hsv_color); + +* ``hsv_color`` - HSV color structure + +This function will return ``true`` if successful, ``false`` otherwise. + +setLight +^^^^^^^^ + +Sets all light parameters at once. + +.. code-block:: arduino + + bool setLight(bool state, uint8_t level, uint8_t red, uint8_t green, uint8_t blue); + +* ``state`` - Light state (true/false) +* ``level`` - Brightness level (0-100) +* ``red`` - Red component (0-255) +* ``green`` - Green component (0-255) +* ``blue`` - Blue component (0-255) + +This function will return ``true`` if successful, ``false`` otherwise. + +State Retrieval Methods +*********************** + +getLightState +^^^^^^^^^^^^^ + +Gets the current light state. + +.. code-block:: arduino + + bool getLightState(); + +This function will return current light state (true = on, false = off). + +getLightLevel +^^^^^^^^^^^^^ + +Gets the current brightness level. + +.. code-block:: arduino + + uint8_t getLightLevel(); + +This function will return current brightness level (0-100). + +getLightColor +^^^^^^^^^^^^^ + +Gets the current RGB color. + +.. code-block:: arduino + + espRgbColor_t getLightColor(); + +This function will return current RGB color structure. + +getLightRed +^^^^^^^^^^^ + +Gets the current red component. + +.. code-block:: arduino + + uint8_t getLightRed(); + +This function will return current red component (0-255). + +getLightGreen +^^^^^^^^^^^^^ + +Gets the current green component. + +.. code-block:: arduino + + uint8_t getLightGreen(); + +This function will return current green component (0-255). + +getLightBlue +^^^^^^^^^^^^ + +Gets the current blue component. + +.. code-block:: arduino + + uint8_t getLightBlue(); + +This function will return current blue component (0-255). + +Utility Methods +*************** + +restoreLight +^^^^^^^^^^^^ + +Restores the light to its last known state. + +.. code-block:: arduino + + void restoreLight(); + +Example +------- + +Color Dimmable Light Implementation +*********************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Color_Dimmable_Light/Zigbee_Color_Dimmable_Light.ino + :language: arduino diff --git a/docs/en/zigbee/ep_color_dimmer_switch.rst b/docs/en/zigbee/ep_color_dimmer_switch.rst new file mode 100644 index 00000000000..720c5d8f5bf --- /dev/null +++ b/docs/en/zigbee/ep_color_dimmer_switch.rst @@ -0,0 +1,186 @@ +####################### +ZigbeeColorDimmerSwitch +####################### + +About +----- + +The ``ZigbeeColorDimmerSwitch`` class provides a color dimmer switch endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for advanced lighting control switches that can control both dimming and color of lights. + +**Features:** +* On/off control for bound lights +* Brightness level control (0-100%) +* Color control (RGB, HSV) +* Color temperature control +* Scene and group support +* Special effects and timed operations +* Integration with common endpoint features (binding, OTA, etc.) +* Zigbee HA standard compliance + +**Use Cases:** +* Smart lighting switches +* Color control remotes +* Advanced lighting controllers +* Smart home lighting automation +* Entertainment lighting control + +API Reference +------------- + +Constructor +*********** + +ZigbeeColorDimmerSwitch +^^^^^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee color dimmer switch endpoint. + +.. code-block:: arduino + + ZigbeeColorDimmerSwitch(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Basic Control Commands +********************** + +lightToggle +^^^^^^^^^^^ + +Toggles the state of bound lights (on to off, or off to on). + +.. code-block:: arduino + + 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); + +* ``group_addr`` - Group address to control (optional) +* ``endpoint`` - Target device endpoint (optional) +* ``short_addr`` - Target device short address (optional) +* ``ieee_addr`` - Target device IEEE address (optional) + +lightOn +^^^^^^^ + +Turns on bound lights. + +.. code-block:: arduino + + 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); + +* ``group_addr`` - Group address to control (optional) +* ``endpoint`` - Target device endpoint (optional) +* ``short_addr`` - Target device short address (optional) +* ``ieee_addr`` - Target device IEEE address (optional) + +lightOff +^^^^^^^^ + +Turns off bound lights. + +.. code-block:: arduino + + 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); + +* ``group_addr`` - Group address to control (optional) +* ``endpoint`` - Target device endpoint (optional) +* ``short_addr`` - Target device short address (optional) +* ``ieee_addr`` - Target device IEEE address (optional) + +Dimmer Control Commands +*********************** + +setLightLevel +^^^^^^^^^^^^^ + +Sets the brightness level of bound lights. + +.. code-block:: arduino + + 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); + +* ``level`` - Brightness level (0-100, where 0 is off, 100 is full brightness) +* ``group_addr`` - Group address to control (optional) +* ``endpoint`` - Target device endpoint (optional) +* ``short_addr`` - Target device short address (optional) +* ``ieee_addr`` - Target device IEEE address (optional) + +Color Control Commands +********************** + +setLightColor +^^^^^^^^^^^^^ + +Sets the color of bound lights using RGB values. + +.. code-block:: arduino + + 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); + +* ``red`` - Red component (0-255) +* ``green`` - Green component (0-255) +* ``blue`` - Blue component (0-255) +* ``group_addr`` - Group address to control (optional) +* ``endpoint`` - Target device endpoint (optional) +* ``short_addr`` - Target device short address (optional) +* ``ieee_addr`` - Target device IEEE address (optional) + +Advanced Control Commands +************************* + +lightOffWithEffect +^^^^^^^^^^^^^^^^^^ + +Turns off lights with a specific effect. + +.. code-block:: arduino + + void lightOffWithEffect(uint8_t effect_id, uint8_t effect_variant); + +* ``effect_id`` - Effect identifier +* ``effect_variant`` - Effect variant + +lightOnWithTimedOff +^^^^^^^^^^^^^^^^^^^ + +Turns on lights with automatic turn-off after specified time. + +.. code-block:: arduino + + void lightOnWithTimedOff(uint8_t on_off_control, uint16_t time_on, uint16_t time_off); + +* ``on_off_control`` - Control byte +* ``time_on`` - Time to stay on (in 1/10th seconds) +* ``time_off`` - Time to stay off (in 1/10th seconds) + +lightOnWithSceneRecall +^^^^^^^^^^^^^^^^^^^^^^ + +Turns on lights with scene recall. + +.. code-block:: arduino + + void lightOnWithSceneRecall(); + +Example +------- + +Color Dimmer Switch Implementation +********************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Color_Dimmer_Switch/Zigbee_Color_Dimmer_Switch.ino + :language: arduino diff --git a/docs/en/zigbee/ep_contact_switch.rst b/docs/en/zigbee/ep_contact_switch.rst new file mode 100644 index 00000000000..f7f6dc15c66 --- /dev/null +++ b/docs/en/zigbee/ep_contact_switch.rst @@ -0,0 +1,95 @@ +################### +ZigbeeContactSwitch +################### + +About +----- + +The ``ZigbeeContactSwitch`` class provides a contact switch endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for door/window contact sensors and other binary contact devices. + +**Features:** +* Contact state detection (open/closed) +* Configurable application types +* Automatic reporting capabilities +* Integration with common endpoint features (binding, OTA, etc.) +* Zigbee HA standard compliance + +**Use Cases:** +* Door and window sensors +* Security system contacts +* Cabinet and drawer sensors +* Industrial contact monitoring +* Smart home security applications + +API Reference +------------- + +Constructor +*********** + +ZigbeeContactSwitch +^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee contact switch endpoint. + +.. code-block:: arduino + + ZigbeeContactSwitch(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +API Methods +*********** + +setClosed +^^^^^^^^^ + +Sets the contact switch to closed state. + +.. code-block:: arduino + + bool setClosed(); + +This function will return ``true`` if successful, ``false`` otherwise. + +setOpen +^^^^^^^ + +Sets the contact switch to open state. + +.. code-block:: arduino + + bool setOpen(); + +This function will return ``true`` if successful, ``false`` otherwise. + +setIASClientEndpoint +^^^^^^^^^^^^^^^^^^^^ + +Sets the IAS Client endpoint number (default is 1). + +.. code-block:: arduino + + void setIASClientEndpoint(uint8_t ep_number); + +* ``ep_number`` - IAS Client endpoint number + +report +^^^^^^ + +Manually reports the current contact state. + +.. code-block:: arduino + + bool report(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Example +------- + +Contact Switch Implementation +***************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Contact_Switch/Zigbee_Contact_Switch.ino + :language: arduino diff --git a/docs/en/zigbee/ep_dimmable_light.rst b/docs/en/zigbee/ep_dimmable_light.rst new file mode 100644 index 00000000000..dcfe6e1fc9d --- /dev/null +++ b/docs/en/zigbee/ep_dimmable_light.rst @@ -0,0 +1,138 @@ +################### +ZigbeeDimmableLight +################### + +About +----- + +The ``ZigbeeDimmableLight`` class provides a dimmable light endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for dimmable lighting control with both on/off and brightness level control. + +**Features:** +* On/off control +* Brightness level control (0-100%) +* State and level change callbacks +* Integration with common endpoint features (binding, OTA, etc.) +* Zigbee HA standard compliance + +**Use Cases:** +* Dimmable smart bulbs +* LED strips with brightness control +* Any device requiring both on/off and dimming functionality + +API Reference +------------- + +Constructor +*********** + +ZigbeeDimmableLight +^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee dimmable light endpoint. + +.. code-block:: arduino + + ZigbeeDimmableLight(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Light Control +************* + +setLightState +^^^^^^^^^^^^^ + +Sets only the light state (on or off) without changing the brightness level. + +.. code-block:: arduino + + bool setLightState(bool state); + +* ``state`` - ``true`` to turn on, ``false`` to turn off + +This function will return ``true`` if successful, ``false`` otherwise. + +setLightLevel +^^^^^^^^^^^^^ + +Sets only the brightness level (0-100) without changing the on/off state. + +.. code-block:: arduino + + bool setLightLevel(uint8_t level); + +* ``level`` - Brightness level (0-100, where 0 is off, 100 is full brightness) + +This function will return ``true`` if successful, ``false`` otherwise. + +setLight +^^^^^^^^ + +Sets both the light state and brightness level simultaneously. + +.. code-block:: arduino + + bool setLight(bool state, uint8_t level); + +* ``state`` - ``true`` to turn on, ``false`` to turn off +* ``level`` - Brightness level (0-100) + +This function will return ``true`` if successful, ``false`` otherwise. + +getLightState +^^^^^^^^^^^^^ + +Gets the current light state. + +.. code-block:: arduino + + bool getLightState(); + +This function will return current light state (``true`` = on, ``false`` = off). + +getLightLevel +^^^^^^^^^^^^^ + +Gets the current brightness level. + +.. code-block:: arduino + + uint8_t getLightLevel(); + +This function will return current brightness level (0-100). + +restoreLight +^^^^^^^^^^^^ + +Restores the light state and triggers any registered callbacks. + +.. code-block:: arduino + + void restoreLight(); + +Event Handling +************** + +onLightChange +^^^^^^^^^^^^^ + +Sets a callback function to be called when the light state or level changes. + +.. code-block:: arduino + + void onLightChange(void (*callback)(bool, uint8_t)); + +* ``callback`` - Function to call when light state or level changes + +**Callback Parameters:** +* ``bool state`` - New light state (true = on, false = off) +* ``uint8_t level`` - New brightness level (0-100) + +Example +------- + +Dimmable Light Implementation +***************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino + :language: arduino diff --git a/docs/en/zigbee/ep_door_window_handle.rst b/docs/en/zigbee/ep_door_window_handle.rst new file mode 100644 index 00000000000..53203f463dd --- /dev/null +++ b/docs/en/zigbee/ep_door_window_handle.rst @@ -0,0 +1,95 @@ +###################### +ZigbeeDoorWindowHandle +###################### + +About +----- + +The ``ZigbeeDoorWindowHandle`` class provides a door/window handle endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for handle position sensors and other handle-related devices. + +**Features:** +* Handle position detection +* Multiple position states support +* Configurable application types +* Automatic reporting capabilities + + +API Reference +------------- + +Constructor +*********** + +ZigbeeDoorWindowHandle +^^^^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee door/window handle endpoint. + +.. code-block:: arduino + + ZigbeeDoorWindowHandle(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +API Methods +*********** + +setClosed +^^^^^^^^^ + +Sets the door/window handle to closed position. + +.. code-block:: arduino + + bool setClosed(); + +This function will return ``true`` if successful, ``false`` otherwise. + +setOpen +^^^^^^^ + +Sets the door/window handle to open position. + +.. code-block:: arduino + + bool setOpen(); + +This function will return ``true`` if successful, ``false`` otherwise. + +setTilted +^^^^^^^^^ + +Sets the door/window handle to tilted position. + +.. code-block:: arduino + + bool setTilted(); + +This function will return ``true`` if successful, ``false`` otherwise. + +setIASClientEndpoint +^^^^^^^^^^^^^^^^^^^^ + +Sets the IAS Client endpoint number (default is 1). + +.. code-block:: arduino + + void setIASClientEndpoint(uint8_t ep_number); + +* ``ep_number`` - IAS Client endpoint number + +report +^^^^^^ + +Manually reports the current handle position. + +.. code-block:: arduino + + bool report(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Example +------- + +*To be added* diff --git a/docs/en/zigbee/ep_electrical_measurement.rst b/docs/en/zigbee/ep_electrical_measurement.rst new file mode 100644 index 00000000000..86410768484 --- /dev/null +++ b/docs/en/zigbee/ep_electrical_measurement.rst @@ -0,0 +1,254 @@ +########################### +ZigbeeElectricalMeasurement +########################### + +About +----- + +The ``ZigbeeElectricalMeasurement`` class provides an endpoint for electrical measurement devices in Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for power monitoring and electrical measurement. + +**Features:** +* AC and DC electrical measurements +* Voltage, current, and power monitoring +* Power factor measurement +* Multi-phase support +* Configurable measurement ranges +* Automatic reporting capabilities +* Integration with common endpoint features (binding, OTA, etc.) +* Zigbee HA standard compliance + +**Use Cases:** +* Smart power monitoring +* Energy monitoring systems +* Solar panel monitoring +* Battery monitoring systems +* Electrical load monitoring + +Common API +---------- + +Constructor +*********** + +ZigbeeElectricalMeasurement +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee electrical measurement endpoint. + +.. code-block:: arduino + + ZigbeeElectricalMeasurement(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +DC Electrical Measurement +************************* + +addDCMeasurement +^^^^^^^^^^^^^^^^ + +Adds a DC measurement type to the endpoint. + +.. code-block:: arduino + + bool addDCMeasurement(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type); + +* ``measurement_type`` - DC measurement type constant (ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_DC_MEASUREMENT_TYPE_POWER) + +This function will return ``true`` if successful, ``false`` otherwise. + +setDCMeasurement +^^^^^^^^^^^^^^^^ + +Sets the DC measurement value for a specific measurement type. + +.. code-block:: arduino + + bool setDCMeasurement(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type, int16_t value); + +* ``measurement_type`` - DC measurement type constant (ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_DC_MEASUREMENT_TYPE_POWER) +* ``value`` - Measurement value + +This function will return ``true`` if successful, ``false`` otherwise. + +setDCMinMaxValue +^^^^^^^^^^^^^^^^ + +Sets the minimum and maximum values for a DC measurement type. + +.. code-block:: arduino + + bool setDCMinMaxValue(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type, int16_t min, int16_t max); + +* ``measurement_type`` - DC measurement type constant (ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_DC_MEASUREMENT_TYPE_POWER) +* ``min`` - Minimum value +* ``max`` - Maximum value + +This function will return ``true`` if successful, ``false`` otherwise. + +setDCMultiplierDivisor +^^^^^^^^^^^^^^^^^^^^^^ + +Sets the multiplier and divisor for scaling DC measurements. + +.. code-block:: arduino + + bool setDCMultiplierDivisor(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type, uint16_t multiplier, uint16_t divisor); + +* ``measurement_type`` - DC measurement type constant (ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_DC_MEASUREMENT_TYPE_POWER) +* ``multiplier`` - Multiplier value +* ``divisor`` - Divisor value + +This function will return ``true`` if successful, ``false`` otherwise. + +setDCReporting +^^^^^^^^^^^^^^ + +Sets the reporting configuration for DC measurements. + +.. code-block:: arduino + + bool setDCReporting(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type, uint16_t min_interval, uint16_t max_interval, int16_t delta); + +* ``measurement_type`` - DC measurement type constant (ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_DC_MEASUREMENT_TYPE_POWER) +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change required to trigger a report + +This function will return ``true`` if successful, ``false`` otherwise. + +reportDC +^^^^^^^^ + +Manually reports a DC measurement value. + +.. code-block:: arduino + + bool reportDC(ZIGBEE_DC_MEASUREMENT_TYPE measurement_type); + +* ``measurement_type`` - DC measurement type constant (ZIGBEE_DC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_DC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_DC_MEASUREMENT_TYPE_POWER) + +This function will return ``true`` if successful, ``false`` otherwise. + +AC Electrical Measurement +************************* + +addACMeasurement +^^^^^^^^^^^^^^^^ + +Adds an AC measurement type for a specific phase. + +.. code-block:: arduino + + bool addACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type); + +* ``measurement_type`` - AC measurement type constant (ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR, ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY) +* ``phase_type`` - Phase type constant (ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC, ZIGBEE_AC_PHASE_TYPE_A, ZIGBEE_AC_PHASE_TYPE_B, ZIGBEE_AC_PHASE_TYPE_C) + +This function will return ``true`` if successful, ``false`` otherwise. + +setACMeasurement +^^^^^^^^^^^^^^^^ + +Sets the AC measurement value for a specific measurement type and phase. + +.. code-block:: arduino + + bool setACMeasurement(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type, int32_t value); + +* ``measurement_type`` - AC measurement type constant (ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR, ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY) +* ``phase_type`` - Phase type constant (ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC, ZIGBEE_AC_PHASE_TYPE_A, ZIGBEE_AC_PHASE_TYPE_B, ZIGBEE_AC_PHASE_TYPE_C) +* ``value`` - Measurement value + +This function will return ``true`` if successful, ``false`` otherwise. + +setACMinMaxValue +^^^^^^^^^^^^^^^^ + +Sets the minimum and maximum values for an AC measurement type and phase. + +.. code-block:: arduino + + bool setACMinMaxValue(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type, int32_t min, int32_t max); + +* ``measurement_type`` - AC measurement type constant (ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR, ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY) +* ``phase_type`` - Phase type constant (ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC, ZIGBEE_AC_PHASE_TYPE_A, ZIGBEE_AC_PHASE_TYPE_B, ZIGBEE_AC_PHASE_TYPE_C) +* ``min`` - Minimum value +* ``max`` - Maximum value + +This function will return ``true`` if successful, ``false`` otherwise. + +setACMultiplierDivisor +^^^^^^^^^^^^^^^^^^^^^^ + +Sets the multiplier and divisor for scaling AC measurements. + +.. code-block:: arduino + + bool setACMultiplierDivisor(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, uint16_t multiplier, uint16_t divisor); + +* ``measurement_type`` - AC measurement type constant (ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR, ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY) +* ``multiplier`` - Multiplier value +* ``divisor`` - Divisor value + +This function will return ``true`` if successful, ``false`` otherwise. + +setACPowerFactor +^^^^^^^^^^^^^^^^ + +Sets the power factor for a specific phase. + +.. code-block:: arduino + + bool setACPowerFactor(ZIGBEE_AC_PHASE_TYPE phase_type, int8_t power_factor); + +* ``phase_type`` - Phase type constant (ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC, ZIGBEE_AC_PHASE_TYPE_A, ZIGBEE_AC_PHASE_TYPE_B, ZIGBEE_AC_PHASE_TYPE_C) +* ``power_factor`` - Power factor value (-100 to 100) + +This function will return ``true`` if successful, ``false`` otherwise. + +setACReporting +^^^^^^^^^^^^^^ + +Sets the reporting configuration for AC measurements. + +.. code-block:: arduino + + bool setACReporting(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type, uint16_t min_interval, uint16_t max_interval, int32_t delta); + +* ``measurement_type`` - AC measurement type constant (ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR, ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY) +* ``phase_type`` - Phase type constant (ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC, ZIGBEE_AC_PHASE_TYPE_A, ZIGBEE_AC_PHASE_TYPE_B, ZIGBEE_AC_PHASE_TYPE_C) +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change required to trigger a report + +This function will return ``true`` if successful, ``false`` otherwise. + +reportAC +^^^^^^^^ + +Manually reports an AC measurement value. + +.. code-block:: arduino + + bool reportAC(ZIGBEE_AC_MEASUREMENT_TYPE measurement_type, ZIGBEE_AC_PHASE_TYPE phase_type); + +* ``measurement_type`` - AC measurement type constant (ZIGBEE_AC_MEASUREMENT_TYPE_VOLTAGE, ZIGBEE_AC_MEASUREMENT_TYPE_CURRENT, ZIGBEE_AC_MEASUREMENT_TYPE_POWER, ZIGBEE_AC_MEASUREMENT_TYPE_POWER_FACTOR, ZIGBEE_AC_MEASUREMENT_TYPE_FREQUENCY) +* ``phase_type`` - Phase type constant (ZIGBEE_AC_PHASE_TYPE_NON_SPECIFIC, ZIGBEE_AC_PHASE_TYPE_A, ZIGBEE_AC_PHASE_TYPE_B, ZIGBEE_AC_PHASE_TYPE_C) + +This function will return ``true`` if successful, ``false`` otherwise. + +Example +------- + +DC Electrical Measurement +************************* + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Electrical_DC_Sensor/Zigbee_Electrical_DC_Sensor.ino + :language: arduino + +AC Electrical Measurement +************************* + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Electrical_AC_Sensor_MultiPhase/Zigbee_Electrical_AC_Sensor_MultiPhase.ino + :language: arduino diff --git a/docs/en/zigbee/ep_flow_sensor.rst b/docs/en/zigbee/ep_flow_sensor.rst new file mode 100644 index 00000000000..9423f321a5d --- /dev/null +++ b/docs/en/zigbee/ep_flow_sensor.rst @@ -0,0 +1,119 @@ +################ +ZigbeeFlowSensor +################ + +About +----- + +The ``ZigbeeFlowSensor`` class provides a flow sensor endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for liquid and gas flow measurement devices. + +**Features:** +* Flow rate measurement in m³/h +* Configurable measurement range +* Tolerance and reporting configuration +* Automatic reporting capabilities +* Integration with common endpoint features (binding, OTA, etc.) +* Zigbee HA standard compliance + +**Use Cases:** +* Water flow monitoring +* Gas flow measurement +* Industrial process monitoring +* Smart home water management +* HVAC system flow monitoring +* Agricultural irrigation systems + +API Reference +------------- + +Constructor +*********** + +ZigbeeFlowSensor +^^^^^^^^^^^^^^^^ + +Creates a new Zigbee flow sensor endpoint. + +.. code-block:: arduino + + ZigbeeFlowSensor(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +API Methods +*********** + +setFlow +^^^^^^^ + +Sets the flow rate measurement value. + +.. code-block:: arduino + + bool setFlow(float value); + +* ``value`` - Flow rate value in 0.1 m³/h + +This function will return ``true`` if successful, ``false`` otherwise. + +setMinMaxValue +^^^^^^^^^^^^^^ + +Sets the minimum and maximum measurement values. + +.. code-block:: arduino + + bool setMinMaxValue(float min, float max); + +* ``min`` - Minimum flow rate value in 0.1 m³/h +* ``max`` - Maximum flow rate value in 0.1 m³/h + +This function will return ``true`` if successful, ``false`` otherwise. + +setTolerance +^^^^^^^^^^^^ + +Sets the tolerance value for measurements. + +.. code-block:: arduino + + bool setTolerance(float tolerance); + +* ``tolerance`` - Tolerance value in 0.01 m³/h + +This function will return ``true`` if successful, ``false`` otherwise. + +setReporting +^^^^^^^^^^^^ + +Sets the reporting configuration for flow rate measurements. + +.. code-block:: arduino + + bool setReporting(uint16_t min_interval, uint16_t max_interval, float delta); + +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change required to trigger a report in 0.1 m³/h + +This function will return ``true`` if successful, ``false`` otherwise. + +report +^^^^^^ + +Manually reports the current flow rate value. + +.. code-block:: arduino + + bool report(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Example +------- + +Flow + PressureSensor Implementation +************************************ + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino + :language: arduino diff --git a/docs/en/zigbee/ep_gateway.rst b/docs/en/zigbee/ep_gateway.rst new file mode 100644 index 00000000000..d436887a373 --- /dev/null +++ b/docs/en/zigbee/ep_gateway.rst @@ -0,0 +1,35 @@ +############# +ZigbeeGateway +############# + +About +----- + +The ``ZigbeeGateway`` class provides a gateway endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for network coordination and gateway functionality. +Gateway is a device that can be used to bridge Zigbee network to other networks (e.g. Wi-Fi, Ethernet, etc.). + +API Reference +------------- + +Constructor +*********** + +ZigbeeGateway +^^^^^^^^^^^^^ + +Creates a new Zigbee gateway endpoint. + +.. code-block:: arduino + + ZigbeeGateway(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Example +------- + +Gateway Implementation +********************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Gateway/Zigbee_Gateway.ino + :language: arduino diff --git a/docs/en/zigbee/ep_illuminance_sensor.rst b/docs/en/zigbee/ep_illuminance_sensor.rst new file mode 100644 index 00000000000..1e627f7dfe9 --- /dev/null +++ b/docs/en/zigbee/ep_illuminance_sensor.rst @@ -0,0 +1,109 @@ +####################### +ZigbeeIlluminanceSensor +####################### + +About +----- + +The ``ZigbeeIlluminanceSensor`` class provides an endpoint for illuminance sensors in Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for light level measurement devices, supporting ambient light monitoring. + +**Features:** +* Illuminance measurement in lux +* Configurable measurement range +* Tolerance and reporting configuration +* Automatic reporting capabilities + +API Reference +------------- + +Constructor +*********** + +ZigbeeIlluminanceSensor +^^^^^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee illuminance sensor endpoint. + +.. code-block:: arduino + + ZigbeeIlluminanceSensor(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +API Methods +*********** + +setIlluminance +^^^^^^^^^^^^^^ + +Sets the illuminance measurement value. + +.. code-block:: arduino + + bool setIlluminance(uint16_t value); + +* ``value`` - Illuminance value in lux + +This function will return ``true`` if successful, ``false`` otherwise. + +setMinMaxValue +^^^^^^^^^^^^^^ + +Sets the minimum and maximum measurement values. + +.. code-block:: arduino + + bool setMinMaxValue(uint16_t min, uint16_t max); + +* ``min`` - Minimum illuminance value in lux +* ``max`` - Maximum illuminance value in lux + +This function will return ``true`` if successful, ``false`` otherwise. + +setTolerance +^^^^^^^^^^^^ + +Sets the tolerance value for measurements. + +.. code-block:: arduino + + bool setTolerance(uint16_t tolerance); + +* ``tolerance`` - Tolerance value in lux + +This function will return ``true`` if successful, ``false`` otherwise. + +setReporting +^^^^^^^^^^^^ + +Sets the reporting configuration for illuminance measurements. + +.. code-block:: arduino + + bool setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta); + +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change required to trigger a report in lux + +This function will return ``true`` if successful, ``false`` otherwise. + +report +^^^^^^ + +Manually reports the current illuminance value. + +.. code-block:: arduino + + bool report(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Example +------- + +Illuminance Sensor Implementation +********************************* + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Illuminance_Sensor/Zigbee_Illuminance_Sensor.ino + :language: arduino diff --git a/docs/en/zigbee/ep_light.rst b/docs/en/zigbee/ep_light.rst new file mode 100644 index 00000000000..fb70320321b --- /dev/null +++ b/docs/en/zigbee/ep_light.rst @@ -0,0 +1,88 @@ +########### +ZigbeeLight +########### + +About +----- + +The ``ZigbeeLight`` class provides a simple on/off light endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for basic lighting control. + +**Features:** +* Simple on/off control +* State change callbacks + +API Reference +------------- + +Constructor +*********** + +ZigbeeLight +^^^^^^^^^^^ + +Creates a new Zigbee light endpoint. + +.. code-block:: arduino + + ZigbeeLight(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Light Control +************* + +setLight +^^^^^^^^ + +Sets the light state (on or off). + +.. code-block:: arduino + + bool setLight(bool state); + +* ``state`` - ``true`` to turn on, ``false`` to turn off + +This function will return ``true`` if successful, ``false`` otherwise. + +getLightState +^^^^^^^^^^^^^ + +Gets the current light state. + +.. code-block:: arduino + + bool getLightState(); + +This function will return current light state (``true`` = on, ``false`` = off). + +restoreLight +^^^^^^^^^^^^ + +Restores the light state and triggers any registered callbacks. + +.. code-block:: arduino + + void restoreLight(); + +Event Handling +************** + +onLightChange +^^^^^^^^^^^^^ + +Sets a callback function to be called when the light state changes. + +.. code-block:: arduino + + void onLightChange(void (*callback)(bool)); + +* ``callback`` - Function to call when light state changes + +Example +------- + +Basic Light Implementation +************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_On_Off_Light/Zigbee_On_Off_Light.ino + :language: arduino diff --git a/docs/en/zigbee/ep_occupancy_sensor.rst b/docs/en/zigbee/ep_occupancy_sensor.rst new file mode 100644 index 00000000000..7fe50d59ea4 --- /dev/null +++ b/docs/en/zigbee/ep_occupancy_sensor.rst @@ -0,0 +1,81 @@ +##################### +ZigbeeOccupancySensor +##################### + +About +----- + +The ``ZigbeeOccupancySensor`` class provides an endpoint for occupancy sensors in Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for occupancy detection devices, supporting various sensor types for detecting presence. + +**Features:** +* Occupancy detection (occupied/unoccupied) +* Multiple sensor type support (PIR, ultrasonic, etc.) +* Automatic reporting capabilities +* Integration with common endpoint features (binding, OTA, etc.) +* Zigbee HA standard compliance + +API Reference +------------- + +Constructor +*********** + +ZigbeeOccupancySensor +^^^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee occupancy sensor endpoint. + +.. code-block:: arduino + + ZigbeeOccupancySensor(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +API Methods +*********** + +setOccupancy +^^^^^^^^^^^^ + +Sets the occupancy state. + +.. code-block:: arduino + + bool setOccupancy(bool occupied); + +* ``occupied`` - Occupancy state (true = occupied, false = unoccupied) + +This function will return ``true`` if successful, ``false`` otherwise. + +setSensorType +^^^^^^^^^^^^^ + +Sets the sensor type. + +.. code-block:: arduino + + bool setSensorType(uint8_t sensor_type); + +* ``sensor_type`` - Sensor type identifier (see esp_zb_zcl_occupancy_sensing_occupancy_sensor_type_t) + +This function will return ``true`` if successful, ``false`` otherwise. + +report +^^^^^^ + +Manually reports the current occupancy state. + +.. code-block:: arduino + + bool report(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Example +------- + +Occupancy Sensor Implementation +******************************* + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Occupancy_Sensor/Zigbee_Occupancy_Sensor.ino + :language: arduino diff --git a/docs/en/zigbee/ep_pm25_sensor.rst b/docs/en/zigbee/ep_pm25_sensor.rst new file mode 100644 index 00000000000..2f1432f8224 --- /dev/null +++ b/docs/en/zigbee/ep_pm25_sensor.rst @@ -0,0 +1,109 @@ +################ +ZigbeePM25Sensor +################ + +About +----- + +The ``ZigbeePM25Sensor`` class provides a PM2.5 air quality sensor endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for particulate matter measurement devices. + +**Features:** +* PM2.5 concentration measurement in μg/m³ +* Configurable measurement range +* Tolerance and reporting configuration +* Automatic reporting capabilities + +API Reference +------------- + +Constructor +*********** + +ZigbeePM25Sensor +^^^^^^^^^^^^^^^^ + +Creates a new Zigbee PM2.5 sensor endpoint. + +.. code-block:: arduino + + ZigbeePM25Sensor(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +API Methods +*********** + +setPM25 +^^^^^^^ + +Sets the PM2.5 concentration measurement value. + +.. code-block:: arduino + + bool setPM25(float pm25); + +* ``pm25`` - PM2.5 concentration value in 0.1 μg/m³ + +This function will return ``true`` if successful, ``false`` otherwise. + +setMinMaxValue +^^^^^^^^^^^^^^ + +Sets the minimum and maximum measurement values. + +.. code-block:: arduino + + bool setMinMaxValue(float min, float max); + +* ``min`` - Minimum PM2.5 concentration value in 0.1 μg/m³ +* ``max`` - Maximum PM2.5 concentration value in 0.1 μg/m³ + +This function will return ``true`` if successful, ``false`` otherwise. + +setTolerance +^^^^^^^^^^^^ + +Sets the tolerance value for measurements. + +.. code-block:: arduino + + bool setTolerance(float tolerance); + +* ``tolerance`` - Tolerance value in 0.1 μg/m³ + +This function will return ``true`` if successful, ``false`` otherwise. + +setReporting +^^^^^^^^^^^^ + +Sets the reporting configuration for PM2.5 measurements. + +.. code-block:: arduino + + bool setReporting(uint16_t min_interval, uint16_t max_interval, float delta); + +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change required to trigger a report in 0.1 μg/m³ + +This function will return ``true`` if successful, ``false`` otherwise. + +report +^^^^^^ + +Manually reports the current PM2.5 concentration value. + +.. code-block:: arduino + + bool report(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Example +------- + +PM2.5 Sensor Implementation +*************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_PM25_Sensor/Zigbee_PM25_Sensor.ino + :language: arduino diff --git a/docs/en/zigbee/ep_power_outlet.rst b/docs/en/zigbee/ep_power_outlet.rst new file mode 100644 index 00000000000..97b22cbbc2a --- /dev/null +++ b/docs/en/zigbee/ep_power_outlet.rst @@ -0,0 +1,88 @@ +################# +ZigbeePowerOutlet +################# + +About +----- + +The ``ZigbeePowerOutlet`` class provides a smart power outlet endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for power control, allowing remote on/off control of electrical devices. + +**Features:** +* On/off power control +* State change callbacks + +API Reference +------------- + +Constructor +*********** + +ZigbeePowerOutlet +^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee power outlet endpoint. + +.. code-block:: arduino + + ZigbeePowerOutlet(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Power Control +************* + +setState +^^^^^^^^ + +Sets the power outlet state (on or off). + +.. code-block:: arduino + + bool setState(bool state); + +* ``state`` - ``true`` to turn on, ``false`` to turn off + +This function will return ``true`` if successful, ``false`` otherwise. + +getPowerOutletState +^^^^^^^^^^^^^^^^^^^ + +Gets the current power outlet state. + +.. code-block:: arduino + + bool getPowerOutletState(); + +This function will return current power state (``true`` = on, ``false`` = off). + +restoreState +^^^^^^^^^^^^ + +Restores the power outlet state and triggers any registered callbacks. + +.. code-block:: arduino + + void restoreState(); + +Event Handling +************** + +onPowerOutletChange +^^^^^^^^^^^^^^^^^^^ + +Sets a callback function to be called when the power outlet state changes. + +.. code-block:: arduino + + void onPowerOutletChange(void (*callback)(bool)); + +* ``callback`` - Function to call when power outlet state changes + +Example +------- + +Smart Power Outlet Implementation +********************************* + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Power_Outlet/Zigbee_Power_Outlet.ino + :language: arduino diff --git a/docs/en/zigbee/ep_pressure_sensor.rst b/docs/en/zigbee/ep_pressure_sensor.rst new file mode 100644 index 00000000000..5d857bb163e --- /dev/null +++ b/docs/en/zigbee/ep_pressure_sensor.rst @@ -0,0 +1,109 @@ +#################### +ZigbeePressureSensor +#################### + +About +----- + +The ``ZigbeePressureSensor`` class provides an endpoint for pressure sensors in Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for pressure measurement devices, supporting atmospheric pressure, barometric pressure, and other pressure measurements. + +**Features:** +* Pressure measurement in hPa (hectopascals) +* Configurable measurement range +* Tolerance and reporting configuration +* Automatic reporting capabilities + +API Reference +------------- + +Constructor +*********** + +ZigbeePressureSensor +^^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee pressure sensor endpoint. + +.. code-block:: arduino + + ZigbeePressureSensor(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +API Methods +*********** + +setPressure +^^^^^^^^^^^ + +Sets the pressure measurement value. + +.. code-block:: arduino + + bool setPressure(int16_t value); + +* ``value`` - Pressure value in hPa + +This function will return ``true`` if successful, ``false`` otherwise. + +setMinMaxValue +^^^^^^^^^^^^^^ + +Sets the minimum and maximum measurement values. + +.. code-block:: arduino + + bool setMinMaxValue(int16_t min, int16_t max); + +* ``min`` - Minimum pressure value in hPa +* ``max`` - Maximum pressure value in hPa + +This function will return ``true`` if successful, ``false`` otherwise. + +setTolerance +^^^^^^^^^^^^ + +Sets the tolerance value for measurements. + +.. code-block:: arduino + + bool setTolerance(uint16_t tolerance); + +* ``tolerance`` - Tolerance value in hPa + +This function will return ``true`` if successful, ``false`` otherwise. + +setReporting +^^^^^^^^^^^^ + +Sets the reporting configuration for pressure measurements. + +.. code-block:: arduino + + bool setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta); + +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change required to trigger a report in hPa + +This function will return ``true`` if successful, ``false`` otherwise. + +report +^^^^^^ + +Manually reports the current pressure value. + +.. code-block:: arduino + + bool report(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Example +------- + +Pressure + Flow Sensor Implementation +************************************* + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Pressure_Flow_Sensor/Zigbee_Pressure_Flow_Sensor.ino + :language: arduino diff --git a/docs/en/zigbee/ep_range_extender.rst b/docs/en/zigbee/ep_range_extender.rst new file mode 100644 index 00000000000..b451f8764fc --- /dev/null +++ b/docs/en/zigbee/ep_range_extender.rst @@ -0,0 +1,34 @@ +################### +ZigbeeRangeExtender +################### + +About +----- + +The ``ZigbeeRangeExtender`` class provides a range extender endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for range extender devices that help extend the coverage of Zigbee networks by acting as repeaters. + +API Reference +------------- + +Constructor +*********** + +ZigbeeRangeExtender +^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee range extender endpoint. + +.. code-block:: arduino + + ZigbeeRangeExtender(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Example +------- + +Range Extender Implementation +***************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Range_Extender/Zigbee_Range_Extender.ino + :language: arduino diff --git a/docs/en/zigbee/ep_switch.rst b/docs/en/zigbee/ep_switch.rst new file mode 100644 index 00000000000..e1847996cc2 --- /dev/null +++ b/docs/en/zigbee/ep_switch.rst @@ -0,0 +1,136 @@ +############ +ZigbeeSwitch +############ + +About +----- + +The ``ZigbeeSwitch`` class provides a switch endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for controlling other devices (typically lights) through on/off commands. + +**Features:** +* On/off control commands for bound devices +* Group control support +* Direct device addressing + +API Reference +------------- + +Constructor +*********** + +ZigbeeSwitch +^^^^^^^^^^^^ + +Creates a new Zigbee switch endpoint. + +.. code-block:: arduino + + ZigbeeSwitch(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Basic Control Commands +********************** + +lightToggle +^^^^^^^^^^^ + +Toggles the state of bound lights (on to off, or off to on). + +.. code-block:: arduino + + 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); + +* ``group_addr`` - Group address to control (optional) +* ``endpoint`` - Target device endpoint (optional) +* ``short_addr`` - Target device short address (optional) +* ``ieee_addr`` - Target device IEEE address (optional) + +lightOn +^^^^^^^ + +Turns on bound lights. + +.. code-block:: arduino + + 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); + +* ``group_addr`` - Group address to control (optional) +* ``endpoint`` - Target device endpoint (optional) +* ``short_addr`` - Target device short address (optional) +* ``ieee_addr`` - Target device IEEE address (optional) + +lightOff +^^^^^^^^ + +Turns off bound lights. + +.. code-block:: arduino + + 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); + +* ``group_addr`` - Group address to control (optional) +* ``endpoint`` - Target device endpoint (optional) +* ``short_addr`` - Target device short address (optional) +* ``ieee_addr`` - Target device IEEE address (optional) + +Advanced Control Commands +************************* + +lightOffWithEffect +^^^^^^^^^^^^^^^^^^ + +Turns off lights with a specific effect. + +.. code-block:: arduino + + void lightOffWithEffect(uint8_t effect_id, uint8_t effect_variant); + +* ``effect_id`` - Effect identifier +* ``effect_variant`` - Effect variant + +lightOnWithTimedOff +^^^^^^^^^^^^^^^^^^^ + +Turns on lights with automatic turn-off after specified time. + +.. code-block:: arduino + + void lightOnWithTimedOff(uint8_t on_off_control, uint16_t time_on, uint16_t time_off); + +* ``on_off_control`` - Control byte +* ``time_on`` - Time to stay on (in 1/10th seconds) +* ``time_off`` - Time to stay off (in 1/10th seconds) + +lightOnWithSceneRecall +^^^^^^^^^^^^^^^^^^^^^^ + +Turns on lights by recalling a scene. + +.. code-block:: arduino + + void lightOnWithSceneRecall(); + +Example +------- + +Basic Switch Implementation +*************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino + :language: arduino + +Multi Switch Implementation +*************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_On_Off_MultiSwitch/Zigbee_On_Off_MultiSwitch.ino + :language: arduino diff --git a/docs/en/zigbee/ep_temperature_sensor.rst b/docs/en/zigbee/ep_temperature_sensor.rst new file mode 100644 index 00000000000..85c2147f1a1 --- /dev/null +++ b/docs/en/zigbee/ep_temperature_sensor.rst @@ -0,0 +1,184 @@ +################ +ZigbeeTempSensor +################ + +About +----- + +The ``ZigbeeTempSensor`` class provides a temperature and humidity sensor endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for environmental monitoring with configurable reporting intervals and thresholds. + +**Features:** +* Temperature measurement and reporting +* Optional humidity measurement +* Configurable reporting intervals +* Min/max value and tolerance settings + +API Reference +------------- + +Constructor +*********** + +ZigbeeTempSensor +^^^^^^^^^^^^^^^^ + +Creates a new Zigbee temperature sensor endpoint. + +.. code-block:: arduino + + ZigbeeTempSensor(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Temperature Control +******************* + +setTemperature +^^^^^^^^^^^^^^ + +Sets the temperature value in 0.01°C resolution. + +.. code-block:: arduino + + bool setTemperature(float value); + +* ``value`` - Temperature value in degrees Celsius + +This function will return ``true`` if successful, ``false`` otherwise. + +setMinMaxValue +^^^^^^^^^^^^^^ + +Sets the minimum and maximum temperature values for the sensor. + +.. code-block:: arduino + + bool setMinMaxValue(float min, float max); + +* ``min`` - Minimum temperature value in degrees Celsius +* ``max`` - Maximum temperature value in degrees Celsius + +This function will return ``true`` if successful, ``false`` otherwise. + +setTolerance +^^^^^^^^^^^^ + +Sets the tolerance value for temperature reporting. + +.. code-block:: arduino + + bool setTolerance(float tolerance); + +* ``tolerance`` - Tolerance value in degrees Celsius + +This function will return ``true`` if successful, ``false`` otherwise. + +setReporting +^^^^^^^^^^^^ + +Sets the reporting interval for temperature measurements. + +.. code-block:: arduino + + bool setReporting(uint16_t min_interval, uint16_t max_interval, float delta); + +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change in temperature to trigger report (in 0.01°C) + +This function will return ``true`` if successful, ``false`` otherwise. + +reportTemperature +^^^^^^^^^^^^^^^^^ + +Manually reports the current temperature value. + +.. code-block:: arduino + + bool reportTemperature(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Humidity Control (Optional) +*************************** + +addHumiditySensor +^^^^^^^^^^^^^^^^^ + +Adds humidity measurement capability to the temperature sensor. + +.. code-block:: arduino + + void addHumiditySensor(float min, float max, float tolerance); + +* ``min`` - Minimum humidity value in percentage +* ``max`` - Maximum humidity value in percentage +* ``tolerance`` - Tolerance value in percentage + +setHumidity +^^^^^^^^^^^ + +Sets the humidity value in 0.01% resolution. + +.. code-block:: arduino + + bool setHumidity(float value); + +* ``value`` - Humidity value in percentage (0-100) + +This function will return ``true`` if successful, ``false`` otherwise. + +setHumidityReporting +^^^^^^^^^^^^^^^^^^^^ + +Sets the reporting interval for humidity measurements. + +.. code-block:: arduino + + bool setHumidityReporting(uint16_t min_interval, uint16_t max_interval, float delta); + +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change in humidity to trigger report (in 0.01%) + +This function will return ``true`` if successful, ``false`` otherwise. + +reportHumidity +^^^^^^^^^^^^^^ + +Manually reports the current humidity value. + +.. code-block:: arduino + + bool reportHumidity(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Combined Reporting +****************** + +report +^^^^^^ + +Reports both temperature and humidity values if humidity sensor is enabled. + +.. code-block:: arduino + + bool report(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Example +------- + +Temperature Sensor Implementation +********************************* + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Temperature_Sensor/Zigbee_Temperature_Sensor.ino + :language: arduino + +Temperature + Humidity Sleepy Sensor Implementation +*************************************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino + :language: arduino diff --git a/docs/en/zigbee/ep_thermostat.rst b/docs/en/zigbee/ep_thermostat.rst new file mode 100644 index 00000000000..b7c79254d0f --- /dev/null +++ b/docs/en/zigbee/ep_thermostat.rst @@ -0,0 +1,238 @@ +################ +ZigbeeThermostat +################ + +About +----- + +The ``ZigbeeThermostat`` class provides a thermostat endpoint for Zigbee networks that receives temperature data from temperature sensors. This endpoint implements the Zigbee Home Automation (HA) standard for thermostats that can bind to temperature sensors and receive temperature readings. + +**Features:** +* Automatic discovery and binding to temperature sensors +* Temperature data reception from bound sensors +* Configurable temperature reporting intervals +* Sensor settings retrieval (min/max temperature, tolerance) +* Multiple addressing modes (group, specific endpoint, IEEE address) + +API Reference +------------- + +Constructor +*********** + +ZigbeeThermostat +^^^^^^^^^^^^^^^^ + +Creates a new Zigbee thermostat endpoint. + +.. code-block:: arduino + + ZigbeeThermostat(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Event Handling +************** + +onTempReceive +^^^^^^^^^^^^^ + +Sets a callback function for receiving temperature data. + +.. code-block:: arduino + + void onTempReceive(void (*callback)(float temperature)); + +* ``callback`` - Function to call when temperature data is received +* ``temperature`` - Temperature value in degrees Celsius + +onTempReceiveWithSource +^^^^^^^^^^^^^^^^^^^^^^^ + +Sets a callback function for receiving temperature data with source information. + +.. code-block:: arduino + + void onTempReceiveWithSource(void (*callback)(float temperature, uint8_t src_endpoint, esp_zb_zcl_addr_t src_address)); + +* ``callback`` - Function to call when temperature data is received +* ``temperature`` - Temperature value in degrees Celsius +* ``src_endpoint`` - Source endpoint that sent the temperature data +* ``src_address`` - Source address information + +onConfigReceive +^^^^^^^^^^^^^^^ + +Sets a callback function for receiving sensor configuration data. + +.. code-block:: arduino + + void onConfigReceive(void (*callback)(float min_temp, float max_temp, float tolerance)); + +* ``callback`` - Function to call when sensor configuration is received +* ``min_temp`` - Minimum temperature supported by the sensor +* ``max_temp`` - Maximum temperature supported by the sensor +* ``tolerance`` - Temperature tolerance of the sensor + +Temperature Data Retrieval +************************** + +getTemperature +^^^^^^^^^^^^^^ + +Requests temperature data from all bound sensors. + +.. code-block:: arduino + + void getTemperature(); + +getTemperature (Group) +^^^^^^^^^^^^^^^^^^^^^^ + +Requests temperature data from a specific group. + +.. code-block:: arduino + + void getTemperature(uint16_t group_addr); + +* ``group_addr`` - Group address to send the request to + +getTemperature (Endpoint + Short Address) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Requests temperature data from a specific endpoint using short address. + +.. code-block:: arduino + + void getTemperature(uint8_t endpoint, uint16_t short_addr); + +* ``endpoint`` - Target endpoint number +* ``short_addr`` - Short address of the target device + +getTemperature (Endpoint + IEEE Address) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Requests temperature data from a specific endpoint using IEEE address. + +.. code-block:: arduino + + void getTemperature(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr); + +* ``endpoint`` - Target endpoint number +* ``ieee_addr`` - IEEE address of the target device + +Sensor Settings Retrieval +************************* + +getSensorSettings +^^^^^^^^^^^^^^^^^ + +Requests sensor settings from all bound sensors. + +.. code-block:: arduino + + void getSensorSettings(); + +getSensorSettings (Group) +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Requests sensor settings from a specific group. + +.. code-block:: arduino + + void getSensorSettings(uint16_t group_addr); + +* ``group_addr`` - Group address to send the request to + +getSensorSettings (Endpoint + Short Address) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Requests sensor settings from a specific endpoint using short address. + +.. code-block:: arduino + + void getSensorSettings(uint8_t endpoint, uint16_t short_addr); + +* ``endpoint`` - Target endpoint number +* ``short_addr`` - Short address of the target device + +getSensorSettings (Endpoint + IEEE Address) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Requests sensor settings from a specific endpoint using IEEE address. + +.. code-block:: arduino + + void getSensorSettings(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr); + +* ``endpoint`` - Target endpoint number +* ``ieee_addr`` - IEEE address of the target device + +Temperature Reporting Configuration +*********************************** + +setTemperatureReporting +^^^^^^^^^^^^^^^^^^^^^^^ + +Configures temperature reporting for all bound sensors. + +.. code-block:: arduino + + void setTemperatureReporting(uint16_t min_interval, uint16_t max_interval, float delta); + +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change in temperature to trigger a report + +setTemperatureReporting (Group) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Configures temperature reporting for a specific group. + +.. code-block:: arduino + + void setTemperatureReporting(uint16_t group_addr, uint16_t min_interval, uint16_t max_interval, float delta); + +* ``group_addr`` - Group address to configure +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change in temperature to trigger a report + +setTemperatureReporting (Endpoint + Short Address) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Configures temperature reporting for a specific endpoint using short address. + +.. code-block:: arduino + + void setTemperatureReporting(uint8_t endpoint, uint16_t short_addr, uint16_t min_interval, uint16_t max_interval, float delta); + +* ``endpoint`` - Target endpoint number +* ``short_addr`` - Short address of the target device +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change in temperature to trigger a report + +setTemperatureReporting (Endpoint + IEEE Address) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Configures temperature reporting for a specific endpoint using IEEE address. + +.. code-block:: arduino + + void setTemperatureReporting(uint8_t endpoint, esp_zb_ieee_addr_t ieee_addr, uint16_t min_interval, uint16_t max_interval, float delta); + +* ``endpoint`` - Target endpoint number +* ``ieee_addr`` - IEEE address of the target device +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change in temperature to trigger a report + +Example +------- + +Thermostat Implementation +************************* + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Thermostat/Zigbee_Thermostat.ino + :language: arduino diff --git a/docs/en/zigbee/ep_vibration_sensor.rst b/docs/en/zigbee/ep_vibration_sensor.rst new file mode 100644 index 00000000000..896c4672c6d --- /dev/null +++ b/docs/en/zigbee/ep_vibration_sensor.rst @@ -0,0 +1,87 @@ +##################### +ZigbeeVibrationSensor +##################### + +About +----- + +The ``ZigbeeVibrationSensor`` class provides a vibration sensor endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for vibration detection devices. + +**Features:** +* Vibration detection and measurement +* Configurable sensitivity levels +* Multiple detection modes +* Automatic reporting capabilities +* Integration with common endpoint features (binding, OTA, etc.) +* Zigbee HA standard compliance + +**Use Cases:** +* Security system vibration detection +* Industrial equipment monitoring +* Structural health monitoring +* Smart home security applications +* Machine condition monitoring + +API Reference +------------- + +Constructor +*********** + +ZigbeeVibrationSensor +^^^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee vibration sensor endpoint. + +.. code-block:: arduino + + ZigbeeVibrationSensor(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +API Methods +*********** + +setVibration +^^^^^^^^^^^^ + +Sets the vibration detection state. + +.. code-block:: arduino + + bool setVibration(bool sensed); + +* ``sensed`` - Vibration state (true = sensed, false = not sensed) + +This function will return ``true`` if successful, ``false`` otherwise. + +setIASClientEndpoint +^^^^^^^^^^^^^^^^^^^^ + +Sets the IAS Client endpoint number (default is 1). + +.. code-block:: arduino + + void setIASClientEndpoint(uint8_t ep_number); + +* ``ep_number`` - IAS Client endpoint number + +report +^^^^^^ + +Manually reports the current vibration state. + +.. code-block:: arduino + + void report(); + +This function does not return a value. + +Example +------- + +Vibration Sensor Implementation +******************************* + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Vibration_Sensor/Zigbee_Vibration_Sensor.ino + :language: arduino diff --git a/docs/en/zigbee/ep_wind_speed_sensor.rst b/docs/en/zigbee/ep_wind_speed_sensor.rst new file mode 100644 index 00000000000..67c4958e37c --- /dev/null +++ b/docs/en/zigbee/ep_wind_speed_sensor.rst @@ -0,0 +1,119 @@ +##################### +ZigbeeWindSpeedSensor +##################### + +About +----- + +The ``ZigbeeWindSpeedSensor`` class provides a wind speed sensor endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for wind speed measurement devices. + +**Features:** +* Wind speed measurement in m/s +* Configurable measurement range +* Tolerance and reporting configuration +* Automatic reporting capabilities +* Integration with common endpoint features (binding, OTA, etc.) +* Zigbee HA standard compliance + +**Use Cases:** +* Weather stations +* Wind turbine monitoring +* Agricultural weather monitoring +* Marine applications +* Smart home weather systems +* Industrial wind monitoring + +API Reference +------------- + +Constructor +*********** + +ZigbeeWindSpeedSensor +^^^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee wind speed sensor endpoint. + +.. code-block:: arduino + + ZigbeeWindSpeedSensor(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +API Methods +*********** + +setWindSpeed +^^^^^^^^^^^^ + +Sets the wind speed measurement value. + +.. code-block:: arduino + + bool setWindSpeed(float value); + +* ``value`` - Wind speed value in 0.01 m/s + +This function will return ``true`` if successful, ``false`` otherwise. + +setMinMaxValue +^^^^^^^^^^^^^^ + +Sets the minimum and maximum measurement values. + +.. code-block:: arduino + + bool setMinMaxValue(float min, float max); + +* ``min`` - Minimum wind speed value in 0.01 m/s +* ``max`` - Maximum wind speed value in 0.01 m/s + +This function will return ``true`` if successful, ``false`` otherwise. + +setTolerance +^^^^^^^^^^^^ + +Sets the tolerance value for measurements. + +.. code-block:: arduino + + bool setTolerance(float tolerance); + +* ``tolerance`` - Tolerance value in 0.01 m/s + +This function will return ``true`` if successful, ``false`` otherwise. + +setReporting +^^^^^^^^^^^^ + +Sets the reporting configuration for wind speed measurements. + +.. code-block:: arduino + + bool setReporting(uint16_t min_interval, uint16_t max_interval, float delta); + +* ``min_interval`` - Minimum reporting interval in seconds +* ``max_interval`` - Maximum reporting interval in seconds +* ``delta`` - Minimum change required to trigger a report in 0.01 m/s + +This function will return ``true`` if successful, ``false`` otherwise. + +reportWindSpeed +^^^^^^^^^^^^^^^ + +Manually reports the current wind speed value. + +.. code-block:: arduino + + bool reportWindSpeed(); + +This function will return ``true`` if successful, ``false`` otherwise. + +Example +------- + +Wind Speed Sensor Implementation +******************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino + :language: arduino diff --git a/docs/en/zigbee/ep_window_covering.rst b/docs/en/zigbee/ep_window_covering.rst new file mode 100644 index 00000000000..a4b8cd918a6 --- /dev/null +++ b/docs/en/zigbee/ep_window_covering.rst @@ -0,0 +1,233 @@ +#################### +ZigbeeWindowCovering +#################### + +About +----- + +The ``ZigbeeWindowCovering`` class provides a window covering endpoint for Zigbee networks. This endpoint implements the Zigbee Home Automation (HA) standard for motorized blinds, shades, and other window coverings. + +**Features:** +* Position control (lift and tilt) +* Multiple window covering types support +* Configurable operation modes and limits +* Status reporting and callbacks +* Safety features and limits + +**Supported Window Covering Types:** +* ROLLERSHADE - Lift support +* ROLLERSHADE_2_MOTOR - Lift support +* ROLLERSHADE_EXTERIOR - Lift support +* ROLLERSHADE_EXTERIOR_2_MOTOR - Lift support +* DRAPERY - Lift support +* AWNING - Lift support +* SHUTTER - Tilt support +* BLIND_TILT_ONLY - Tilt support +* BLIND_LIFT_AND_TILT - Lift and Tilt support +* PROJECTOR_SCREEN - Lift support + +API Reference +------------- + +Constructor +*********** + +ZigbeeWindowCovering +^^^^^^^^^^^^^^^^^^^^ + +Creates a new Zigbee window covering endpoint. + +.. code-block:: arduino + + ZigbeeWindowCovering(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Position Control +**************** + +setLiftPosition +^^^^^^^^^^^^^^^ + +Sets the window covering lift position. + +.. code-block:: arduino + + bool setLiftPosition(uint16_t lift_position); + +* ``lift_position`` - Lift position + +This function will return ``true`` if successful, ``false`` otherwise. + +setLiftPercentage +^^^^^^^^^^^^^^^^^ + +Sets the window covering lift position as a percentage. + +.. code-block:: arduino + + bool setLiftPercentage(uint8_t lift_percentage); + +* ``lift_percentage`` - Lift percentage (0-100, where 0 is fully closed, 100 is fully open) + +This function will return ``true`` if successful, ``false`` otherwise. + +setTiltPosition +^^^^^^^^^^^^^^^ + +Sets the window covering tilt position in degrees. + +.. code-block:: arduino + + bool setTiltPosition(uint16_t tilt_position); + +* ``tilt_position`` - Tilt position in degrees + +This function will return ``true`` if successful, ``false`` otherwise. + +setTiltPercentage +^^^^^^^^^^^^^^^^^ + +Sets the window covering tilt position as a percentage. + +.. code-block:: arduino + + bool setTiltPercentage(uint8_t tilt_percentage); + +* ``tilt_percentage`` - Tilt percentage (0-100) + +This function will return ``true`` if successful, ``false`` otherwise. + +Configuration +************* + +setCoveringType +^^^^^^^^^^^^^^^ + +Sets the window covering type. + +.. code-block:: arduino + + bool setCoveringType(ZigbeeWindowCoveringType covering_type); + +* ``covering_type`` - Window covering type (see supported types above) + +This function will return ``true`` if successful, ``false`` otherwise. + +setConfigStatus +^^^^^^^^^^^^^^^ + +Sets the window covering configuration status. + +.. code-block:: arduino + + bool setConfigStatus(bool operational, bool online, bool commands_reversed, bool lift_closed_loop, bool tilt_closed_loop, bool lift_encoder_controlled, bool tilt_encoder_controlled); + +* ``operational`` - Operational status +* ``online`` - Online status +* ``commands_reversed`` - Commands reversed flag +* ``lift_closed_loop`` - Lift closed loop flag +* ``tilt_closed_loop`` - Tilt closed loop flag +* ``lift_encoder_controlled`` - Lift encoder controlled flag +* ``tilt_encoder_controlled`` - Tilt encoder controlled flag + +This function will return ``true`` if successful, ``false`` otherwise. + +setMode +^^^^^^^ + +Sets the window covering operation mode. + +.. code-block:: arduino + + bool setMode(bool motor_reversed, bool calibration_mode, bool maintenance_mode, bool leds_on); + +* ``motor_reversed`` - Motor reversed flag +* ``calibration_mode`` - Calibration mode flag +* ``maintenance_mode`` - Maintenance mode flag +* ``leds_on`` - LEDs on flag + +This function will return ``true`` if successful, ``false`` otherwise. + +setLimits +^^^^^^^^^ + +Sets the motion limits for the window covering. + +.. code-block:: arduino + + bool 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 for lift +* ``installed_closed_limit_lift`` - Installed closed limit for lift +* ``installed_open_limit_tilt`` - Installed open limit for tilt +* ``installed_closed_limit_tilt`` - Installed closed limit for tilt + +This function will return ``true`` if successful, ``false`` otherwise. + +Event Handling +************** + +onOpen +^^^^^^ + +Sets a callback function to be called when the window covering opens. + +.. code-block:: arduino + + void onOpen(void (*callback)()); + +* ``callback`` - Function to call when window covering opens + +onClose +^^^^^^^ + +Sets a callback function to be called when the window covering closes. + +.. code-block:: arduino + + void onClose(void (*callback)()); + +* ``callback`` - Function to call when window covering closes + +onGoToLiftPercentage +^^^^^^^^^^^^^^^^^^^^ + +Sets a callback function to be called when lift percentage changes. + +.. code-block:: arduino + + void onGoToLiftPercentage(void (*callback)(uint8_t)); + +* ``callback`` - Function to call when lift percentage changes + +onGoToTiltPercentage +^^^^^^^^^^^^^^^^^^^^ + +Sets a callback function to be called when tilt percentage changes. + +.. code-block:: arduino + + void onGoToTiltPercentage(void (*callback)(uint8_t)); + +* ``callback`` - Function to call when tilt percentage changes + +onStop +^^^^^^ + +Sets a callback function to be called when window covering stops. + +.. code-block:: arduino + + void onStop(void (*callback)()); + +* ``callback`` - Function to call when window covering stops + +Example +------- + +Window Covering Implementation +****************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Window_Covering/Zigbee_Window_Covering.ino + :language: arduino diff --git a/docs/en/zigbee/zigbee.rst b/docs/en/zigbee/zigbee.rst new file mode 100644 index 00000000000..ba14adad8e1 --- /dev/null +++ b/docs/en/zigbee/zigbee.rst @@ -0,0 +1,159 @@ +###### +Zigbee +###### + +About +----- + +The Zigbee library provides support for creating Zigbee 3.0 compatible devices including: + +* Support for different Zigbee roles (Coordinator, Router, End Device) +* Network management (scanning, joining, commissioning) +* Multiple endpoint types for various device categories +* OTA (Over-The-Air) update support +* Power management for battery-powered devices +* Time synchronization +* Advanced binding and group management + +The Zigbee library is built on top of `ESP-ZIGBEE-SDK `_ and provides a high-level Arduino-style interface for creating Zigbee devices. + +Zigbee Network Topology +*********************** + +.. code-block:: text + + ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ + │ Coordinator │◄─────►│ Router │◄─────►│ Router │ + │ (Gateway) │ │ (Repeater) │ │ (Thermostat) │ + └─────────────────┘ └─────────────────┘ └─────────────────┘ + │ │ │ + │ ▼ │ + │ ┌─────────────────┐ │ + │ │ End Device │ │ + │ │ (Sensor) │ │ + │ └─────────────────┘ │ + │ │ + ▼ ▼ + ┌─────────────────┐ ┌─────────────────┐ + │ End Device │ │ End Device │ + │ (Sensor) │ │ (Sensor) │ + └─────────────────┘ └─────────────────┘ + + +**Device Roles** + +* **Coordinator**: Forms and manages the network, stores network information +* **Router**: Extends network range, routes messages, mains powered devices (typically lights, switches, etc.) +* **End Device**: Battery-powered devices that can sleep for extended periods (typically sensors) + +Zigbee Library Structure +------------------------ + +**The library is split into three main components:** + +* ``ZigbeeCore``: The main class that manages the Zigbee network +* ``ZigbeeEP``: The base class for all Zigbee endpoints, which provides common functionality for all endpoint types +* ``Specific endpoint classes``: The classes for all Zigbee endpoints, which provides the specific functionality for each endpoint type + +ZigbeeCore +********** + +The ``ZigbeeCore`` class is the main entry point for all Zigbee operations. It serves as the central coordinator that manages: + +* **Network Operations**: Starting, stopping, and managing the Zigbee network +* **Device Role Management**: Configuring the device as Coordinator, Router, or End Device +* **Endpoint Management**: Adding and managing multiple device endpoints +* **Network Discovery**: Scanning for and joining existing networks +* **OTA Updates**: Managing over-the-air firmware updates +* **Power Management**: Configuring sleep modes for battery-powered devices + +The ``ZigbeeCore`` class is implemented as a singleton, meaning there's only one instance available globally. You access it directly as ``Zigbee`` without creating an instance. + +.. toctree:: + :maxdepth: 3 + + zigbee_core + +ZigbeeEP +******** + +The ``ZigbeeEP`` class is the base class for all Zigbee endpoints. It provides common functionality for all endpoint types. + +* **Device Information**: Every endpoint can be configured with manufacturer and model information that helps identify the device on the network +* **Binding Management**: Binding allows endpoints to establish direct communication links with other devices. This enables automatic command transmission without requiring manual addressing +* **Power Management**: Endpoints can report their power source type and battery status, which helps the network optimize communication patterns +* **Time Synchronization**: Endpoints can synchronize with network time, enabling time-based operations and scheduling +* **OTA Support**: Endpoints can receive over-the-air firmware updates to add new features or fix bugs +* **Device Discovery**: Endpoints can read manufacturer and model information from other devices on the network + +.. toctree:: + :maxdepth: 2 + + zigbee_ep + +Specific endpoint classes +************************* + +Library provides the following endpoint classes from lights, switches, sensors, etc. Each endpoint class provides the specific functionality for each endpoint type and inherits from the ``ZigbeeEP`` class. + +.. toctree:: + :maxdepth: 1 + :glob: + + ep_* + + +Common Problems and Issues +-------------------------- + +Troubleshooting +--------------- + +Common Issues +************* + +**Device won't join network** + * Ensure the coordinator is in pairing mode + * Check that the device is configured with the correct role + * Verify the channel mask includes the coordinator's channel + +**OTA updates fail** + * Ensure the OTA server is properly configured + * Check that the device has sufficient memory for the update + * Verify network connectivity + +**Battery devices not working** + * Ensure proper power source configuration + * Check sleep/wake timing settings + * Verify parent device (router/coordinator) is always powered + +**Binding issues** + * Check that both devices support the required clusters + * Verify that binding is enabled on both devices + * Ensure devices are on the same network + +**Network connectivity problems** + * Check that devices are within range + * Verify that routers are properly configured + * Check for interference from other 2.4 GHz devices + +Factory Reset +************* + +If you have problems with connecting to the network, you can try to factory reset the device. This will erase all the network settings and act as brand new device. + +.. code-block:: arduino + + Zigbee.factoryReset(true); // true = restart after reset + +Debug Mode +********** + +For better debugging, you can enable debug mode to get detailed information about network operations. Call debug mode before starting Zigbee. +Also selecting zigbee mode with *debug* suffix is recommended. + +.. code-block:: arduino + + Zigbee.setDebugMode(true); + // Start Zigbee with debug output + Zigbee.begin(); diff --git a/docs/en/zigbee/zigbee_core.rst b/docs/en/zigbee/zigbee_core.rst new file mode 100644 index 00000000000..ee8f7234210 --- /dev/null +++ b/docs/en/zigbee/zigbee_core.rst @@ -0,0 +1,375 @@ +########## +ZigbeeCore +########## + +About +----- + +The ``ZigbeeCore`` class is the main entry point for all Zigbee operations. It serves as the central class that manages: + +* **Network Operations**: Starting, stopping, and managing the Zigbee network +* **Device Role Management**: Configuring the device as Coordinator, Router, or End Device +* **Endpoint Management**: Adding and managing multiple device endpoints +* **Network Discovery**: Scanning for and joining existing networks + +ZigbeeCore APIs +--------------- + +Network Initialization +********************** + +begin +^^^^^ + +Initializes the Zigbee stack and starts the network. + +.. code-block:: arduino + + bool begin(zigbee_role_t role = ZIGBEE_END_DEVICE, bool erase_nvs = false); + bool begin(esp_zb_cfg_t *role_cfg, bool erase_nvs = false); + +* ``role`` - Device role (default: ``ZIGBEE_END_DEVICE``) +* ``role_cfg`` - Custom role configuration structure +* ``erase_nvs`` - Whether to erase NVS storage (default: ``false``) + +This function will return ``true`` if initialization successful, ``false`` otherwise. + +**Available Roles:** + +* **ZIGBEE_COORDINATOR**: Network coordinator, forms and manages the network +* **ZIGBEE_ROUTER**: Network router, connects to existing network and extends network range and routes messages (if device is mains powered, always use this role) +* **ZIGBEE_END_DEVICE**: End device, connects to existing network (typically battery-powered which can sleep) + +.. note:: + + Depending on the Zigbee role, proper Zigbee mode and partition scheme must be set in the Arduino IDE. + + * **ZIGBEE_COORDINATOR** and **ZIGBEE_ROUTER**: + * Zigbee mode to ``Zigbee ZCZR (coordinator/router)``. + * Partition scheme to ``Zigbee ZCZR xMB with spiffs`` (where ``x`` is the number of MB of selected flash size). + * **ZIGBEE_END_DEVICE**: + * Zigbee mode to ``Zigbee ED (end device)``. + * Partition scheme to ``Zigbee xMB with spiffs`` (where ``x`` is the number of MB of selected flash size). + +Network Status +************** + +started +^^^^^^^ + +Checks if the Zigbee stack has been started. + +.. code-block:: arduino + + bool started(); + +This function will return ``true`` if Zigbee stack is running, ``false`` otherwise. + +connected +^^^^^^^^^ + +Checks if the device is connected to a Zigbee network. + +.. code-block:: arduino + + bool connected(); + +This function will return ``true`` if connected to network, ``false`` otherwise. + +getRole +^^^^^^^ + +Gets the current Zigbee device role. + +.. code-block:: arduino + + zigbee_role_t getRole(); + +This function will return current device role (``ZIGBEE_COORDINATOR``, ``ZIGBEE_ROUTER``, ``ZIGBEE_END_DEVICE``). + +Endpoint Management +******************* + +addEndpoint +^^^^^^^^^^^ + +Adds an endpoint to the Zigbee network. + +.. code-block:: arduino + + bool addEndpoint(ZigbeeEP *ep); + +* ``ep`` - Pointer to the endpoint object to add + +This function will return ``true`` if endpoint added successfully, ``false`` otherwise. + +Network Configuration +********************* + +setPrimaryChannelMask +^^^^^^^^^^^^^^^^^^^^^ + +Sets the primary channel mask for network scanning and joining. + +.. code-block:: arduino + + void setPrimaryChannelMask(uint32_t mask); + +* ``mask`` - Channel mask (default: all channels 11-26, mask 0x07FFF800) + +setScanDuration +^^^^^^^^^^^^^^^ + +Sets the scan duration for network discovery. + +.. code-block:: arduino + + void setScanDuration(uint8_t duration); + +* ``duration`` - Scan duration (1-4, where 1 is fastest, 4 is slowest) + +getScanDuration +^^^^^^^^^^^^^^^ + +Gets the current scan duration setting. + +.. code-block:: arduino + + uint8_t getScanDuration(); + +This function will return current scan duration (1-4). + +Power Management +**************** + +setRxOnWhenIdle +^^^^^^^^^^^^^^^ + +Sets whether the device keeps its receiver on when idle. + +.. code-block:: arduino + + void setRxOnWhenIdle(bool rx_on_when_idle); + +* ``rx_on_when_idle`` - ``true`` to keep receiver on, ``false`` to allow sleep + +getRxOnWhenIdle +^^^^^^^^^^^^^^^ + +Gets the current receiver idle setting. + +.. code-block:: arduino + + bool getRxOnWhenIdle(); + +This function will return current receiver idle setting. + +setTimeout +^^^^^^^^^^ + +Sets the timeout for network operations. + +.. code-block:: arduino + + void setTimeout(uint32_t timeout); + +* ``timeout`` - Timeout in milliseconds (default: 30000 ms) + +Network Discovery +***************** + +scanNetworks +^^^^^^^^^^^^ + +Scans for available Zigbee networks. + +.. code-block:: arduino + + void scanNetworks(uint32_t channel_mask = ESP_ZB_TRANSCEIVER_ALL_CHANNELS_MASK, uint8_t scan_duration = 5); + +* ``channel_mask`` - Channels to scan (default: all channels) +* ``scan_duration`` - Scan duration (default: 5) + +scanComplete +^^^^^^^^^^^^ + +Checks if network scanning is complete. + +.. code-block:: arduino + + int16_t scanComplete(); + +This function will return: +* ``-2``: Scan failed or not started +* ``-1``: Scan running +* ``0``: No networks found +* ``>0``: Number of networks found + +getScanResult +^^^^^^^^^^^^^ + +Gets the scan results. + +.. code-block:: arduino + + zigbee_scan_result_t *getScanResult(); + +This function will return pointer to scan results, or ``NULL`` if no results. + +scanDelete +^^^^^^^^^^ + +Deletes the scan results from memory. + +.. code-block:: arduino + + void scanDelete(); + +Network Management (Coordinator only) +************************************* + +setRebootOpenNetwork +^^^^^^^^^^^^^^^^^^^^ + +Opens the network for joining after reboot for a specified time. + +.. code-block:: arduino + + void setRebootOpenNetwork(uint8_t time); + +* ``time`` - Time in seconds to keep network open after reboot + +openNetwork +^^^^^^^^^^^ + +Opens the network for device joining for a specified time. + +.. code-block:: arduino + + void openNetwork(uint8_t time); + +* ``time`` - Time in seconds to keep network open for device joining + +closeNetwork +^^^^^^^^^^^^ + +Closes the network to prevent new devices from joining. + +.. code-block:: arduino + + void closeNetwork(); + +Radio Configuration +******************* + +setRadioConfig +^^^^^^^^^^^^^^ + +Sets the radio configuration. + +.. code-block:: arduino + + void setRadioConfig(esp_zb_radio_config_t config); + +* ``config`` - Radio configuration structure + +getRadioConfig +^^^^^^^^^^^^^^ + +Gets the current radio configuration. + +.. code-block:: arduino + + esp_zb_radio_config_t getRadioConfig(); + +This function will return current radio configuration. + +Host Configuration +****************** + +setHostConfig +^^^^^^^^^^^^^ + +Sets the host configuration. + +.. code-block:: arduino + + void setHostConfig(esp_zb_host_config_t config); + +* ``config`` - Host configuration structure + +getHostConfig +^^^^^^^^^^^^^ + +Gets the current host configuration. + +.. code-block:: arduino + + esp_zb_host_config_t getHostConfig(); + +This function will return current host configuration. + +Debug and Utilities +******************* + +setDebugMode +^^^^^^^^^^^^ + +Enables or disables debug mode. + +.. code-block:: arduino + + void setDebugMode(bool debug); + +* ``debug`` - ``true`` to enable debug output, ``false`` to disable + +getDebugMode +^^^^^^^^^^^^ + +Gets the current debug mode setting. + +.. code-block:: arduino + + bool getDebugMode(); + +This function will return current debug mode setting. + +factoryReset +^^^^^^^^^^^^ + +Performs a factory reset, clearing all network settings. + +.. code-block:: arduino + + void factoryReset(bool restart = true); + +* ``restart`` - ``true`` to restart after reset (default: ``true``) + +Utility Functions +***************** + +formatIEEEAddress +^^^^^^^^^^^^^^^^^ + +Formats an IEEE address for display. + +.. code-block:: arduino + + static const char *formatIEEEAddress(const esp_zb_ieee_addr_t addr); + +* ``addr`` - IEEE address to format + +This function will return formatted address string. + +formatShortAddress +^^^^^^^^^^^^^^^^^^ + +Formats a short address for display. + +.. code-block:: arduino + + static const char *formatShortAddress(uint16_t addr); + +* ``addr`` - Short address to format + +This function will return formatted address string. diff --git a/docs/en/zigbee/zigbee_ep.rst b/docs/en/zigbee/zigbee_ep.rst new file mode 100644 index 00000000000..ce13d60bbaf --- /dev/null +++ b/docs/en/zigbee/zigbee_ep.rst @@ -0,0 +1,357 @@ +######## +ZigbeeEP +######## + +About +----- + +The ``ZigbeeEP`` class is the base class for all Zigbee endpoints. It provides common functionality for all endpoint types. + +* **Device Information**: Every endpoint can be configured with manufacturer and model information that helps identify the device on the network +* **Binding Management**: Binding allows endpoints to establish direct communication links with other devices. This enables automatic command transmission without requiring manual addressing +* **Power Management**: Endpoints can report their power source type and battery status, which helps the network optimize communication patterns +* **Time Synchronization**: Endpoints can synchronize with network time, enabling time-based operations and scheduling +* **OTA Support**: Endpoints can receive over-the-air firmware updates to add new features or fix bugs +* **Device Discovery**: Endpoints can read manufacturer and model information from other devices on the network + + +ZigbeeEP APIs +------------- + +Device Information +****************** + +setManufacturerAndModel +^^^^^^^^^^^^^^^^^^^^^^^ + +Sets the manufacturer name and model identifier for the device. + +.. code-block:: arduino + + bool setManufacturerAndModel(const char *name, const char *model); + +* ``name`` - Manufacturer name (max 32 characters) +* ``model`` - Model identifier (max 32 characters) + +This function will return ``true`` if set successfully, ``false`` otherwise. + +getEndpoint +^^^^^^^^^^^ + +Gets the endpoint number assigned to this device. + +.. code-block:: arduino + + uint8_t getEndpoint(); + +This function will return the endpoint number (1-254). + +Binding Management +****************** + +bound +^^^^^ + +Checks if the endpoint has any bound devices. + +.. code-block:: arduino + + bool bound(); + +This function will return ``true`` if the endpoint has bound devices, ``false`` otherwise. + +getBoundDevices +^^^^^^^^^^^^^^^ + +Gets the list of devices bound to this endpoint. + +.. code-block:: arduino + + std::vector getBoundDevices(); + +This function will return list of bound device parameters. + +printBoundDevices +^^^^^^^^^^^^^^^^^ + +Prints information about bound devices to Serial or a custom Print object. + +.. code-block:: arduino + + void printBoundDevices(Print &print = Serial); + +* ``print`` - Custom Print object (optional, defaults to Serial) + +allowMultipleBinding +^^^^^^^^^^^^^^^^^^^^ + +Enables or disables multiple device binding for this endpoint. + +.. code-block:: arduino + + void allowMultipleBinding(bool bind); + +* ``bind`` - ``true`` to allow multiple bindings, ``false`` for single binding only + +setManualBinding +^^^^^^^^^^^^^^^^ + +Enables or disables manual binding mode. Manual binding mode is supposed to be used when using ZHA or Z2M where you bind devices manually. + +.. code-block:: arduino + + void setManualBinding(bool bind); + +* ``bind`` - ``true`` for manual binding, ``false`` for automatic binding (default) + +clearBoundDevices +^^^^^^^^^^^^^^^^^ + +Removes all bound devices from this endpoint. + +.. code-block:: arduino + + void clearBoundDevices(); + +Binding Status +************** + +epAllowMultipleBinding +^^^^^^^^^^^^^^^^^^^^^^ + +Gets whether multiple device binding is allowed for this endpoint. + +.. code-block:: arduino + + bool epAllowMultipleBinding(); + +This function will return ``true`` if multiple bindings are allowed, ``false`` otherwise. + +epUseManualBinding +^^^^^^^^^^^^^^^^^^ + +Gets whether manual binding mode is enabled for this endpoint. + +.. code-block:: arduino + + bool epUseManualBinding(); + +This function will return ``true`` if manual binding is enabled, ``false`` otherwise. + +Power Management +**************** + +setPowerSource +^^^^^^^^^^^^^^ + +Sets the power source type for the endpoint. + +.. code-block:: arduino + + bool setPowerSource(uint8_t source, uint8_t percentage = 0xff, uint8_t voltage = 0xff); + +* ``source`` - Power source type (``ZB_POWER_SOURCE_MAINS``, ``ZB_POWER_SOURCE_BATTERY``, etc.) +* ``percentage`` - Battery percentage (0-100, default: 0xff) +* ``voltage`` - Battery voltage in 100 mV units (default: 0xff) + +This function will return ``true`` if set successfully, ``false`` otherwise. + +setBatteryPercentage +^^^^^^^^^^^^^^^^^^^^ + +Sets the current battery percentage. + +.. code-block:: arduino + + bool setBatteryPercentage(uint8_t percentage); + +* ``percentage`` - Battery percentage (0-100) + +This function will return ``true`` if set successfully, ``false`` otherwise. + +setBatteryVoltage +^^^^^^^^^^^^^^^^^ + +Sets the battery voltage. + +.. code-block:: arduino + + bool setBatteryVoltage(uint8_t voltage); + +* ``voltage`` - Battery voltage in 100 mV units (e.g., 35 for 3.5 V) + +This function will return ``true`` if set successfully, ``false`` otherwise. + +reportBatteryPercentage +^^^^^^^^^^^^^^^^^^^^^^^ + +Reports the current battery percentage to the network. + +.. code-block:: arduino + + bool reportBatteryPercentage(); + +This function will return ``true`` if reported successfully, ``false`` otherwise. + +Time Synchronization +******************** + +addTimeCluster +^^^^^^^^^^^^^^ + +Adds time synchronization cluster to the endpoint. When you want to add a server cluster (have the time and GMT offset) fill the time structure with the current time and GMT offset. +For client cluster (get the time and GMT offset) keep the default parameters. + +.. code-block:: arduino + + bool addTimeCluster(tm time = {}, int32_t gmt_offset = 0); + +* ``time`` - Current time structure (default: empty) +* ``gmt_offset`` - GMT offset in seconds (default: 0) + +This function will return ``true`` if added successfully, ``false`` otherwise. + +setTime +^^^^^^^ + +Sets the current time for the endpoint. + +.. code-block:: arduino + + bool setTime(tm time); + +* ``time`` - Time structure to set + +This function will return ``true`` if set successfully, ``false`` otherwise. + +setTimezone +^^^^^^^^^^^ + +Sets the timezone offset for the endpoint. + +.. code-block:: arduino + + bool setTimezone(int32_t gmt_offset); + +* ``gmt_offset`` - GMT offset in seconds + +This function will return ``true`` if set successfully, ``false`` otherwise. + +getTime +^^^^^^^ + +Gets the current network time. + +.. code-block:: arduino + + struct tm getTime(uint8_t endpoint = 1, int32_t short_addr = 0x0000, esp_zb_ieee_addr_t ieee_addr = {}); + +* ``endpoint`` - Target endpoint (default: 1) +* ``short_addr`` - Target device short address (default: 0x0000) +* ``ieee_addr`` - Target device IEEE address (default: empty) + +This function will return network time structure. + +getTimezone +^^^^^^^^^^^ + +Gets the timezone offset. + +.. code-block:: arduino + + int32_t getTimezone(uint8_t endpoint = 1, int32_t short_addr = 0x0000, esp_zb_ieee_addr_t ieee_addr = {}); + +* ``endpoint`` - Target endpoint (default: 1) +* ``short_addr`` - Target device short address (default: 0x0000) +* ``ieee_addr`` - Target device IEEE address (default: empty) + +This function will return GMT offset in seconds. + +OTA Support +*********** + +addOTAClient +^^^^^^^^^^^^ + +Adds OTA client to the endpoint for firmware updates. + +.. code-block:: arduino + + bool 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); + +* ``file_version`` - Current firmware version +* ``downloaded_file_ver`` - Downloaded file version +* ``hw_version`` - Hardware version +* ``manufacturer`` - Manufacturer code (default: 0x1001) +* ``image_type`` - Image type code (default: 0x1011) +* ``max_data_size`` - Maximum data size for OTA transfer (default: 223) + +This function will return ``true`` if added successfully, ``false`` otherwise. + +requestOTAUpdate +^^^^^^^^^^^^^^^^ + +Requests OTA update from the server. + +.. code-block:: arduino + + void requestOTAUpdate(); + +Device Discovery +**************** + +readManufacturer +^^^^^^^^^^^^^^^^ + +Reads the manufacturer name from a remote device. + +.. code-block:: arduino + + char *readManufacturer(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr); + +* ``endpoint`` - Target endpoint number +* ``short_addr`` - Target device short address +* ``ieee_addr`` - Target device IEEE address + +This function will return pointer to manufacturer string, or ``NULL`` if read failed. + +readModel +^^^^^^^^^ + +Reads the model identifier from a remote device. + +.. code-block:: arduino + + char *readModel(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr); + +* ``endpoint`` - Target endpoint number +* ``short_addr`` - Target device short address +* ``ieee_addr`` - Target device IEEE address + +This function will return pointer to model string, or ``NULL`` if read failed. + +Event Handling +************** + +onIdentify +^^^^^^^^^^ + +Sets a callback function for identify events. + +.. code-block:: arduino + + void onIdentify(void (*callback)(uint16_t)); + +* ``callback`` - Function to call when identify event occurs +* ``time`` - Identify time in seconds + +Supported Endpoints +------------------- + +The Zigbee library provides specialized endpoint classes for different device types. Each endpoint type includes specific clusters and functionality relevant to that device category. + +.. toctree:: + :maxdepth: 1 + :glob: + + ep_* From 554de56f40e68d591b945bd1a8c931798e8a9167 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 22 Jul 2025 11:23:49 +0300 Subject: [PATCH 256/290] IDF release/v5.5 25c7c119 (#11623) --- 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 6e2dd0ab337..f844a91161a 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.5-cf8dad07-v1" + "version": "idf-release_v5.5-25c7c119-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.5-cf8dad07-v1", + "version": "idf-release_v5.5-25c7c119-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", - "size": "430423461" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", + "size": "430472412" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", - "size": "430423461" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", + "size": "430472412" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", - "size": "430423461" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", + "size": "430472412" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", - "size": "430423461" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", + "size": "430472412" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", - "size": "430423461" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", + "size": "430472412" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", - "size": "430423461" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", + "size": "430472412" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", - "size": "430423461" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", + "size": "430472412" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", - "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", - "size": "430423461" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", + "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", + "size": "430472412" } ] }, From 69d891434bd5cd327cd93516fc60941f3e2bfd85 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Wed, 23 Jul 2025 01:37:23 +0300 Subject: [PATCH 257/290] IDF release/v5.5 b66b5448 (#11626) IDF release/v5.5 b66b5448 --- 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 f844a91161a..3909c833c56 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.5-25c7c119-v1" + "version": "idf-release_v5.5-b66b5448-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.5-25c7c119-v1", + "version": "idf-release_v5.5-b66b5448-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", - "size": "430472412" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "checksum": "SHA-256:a871d945c6bfb685ecff5e30ad759f280c841ea143071466b2e611bd1800f18f", + "size": "430471837" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", - "size": "430472412" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "checksum": "SHA-256:a871d945c6bfb685ecff5e30ad759f280c841ea143071466b2e611bd1800f18f", + "size": "430471837" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", - "size": "430472412" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "checksum": "SHA-256:a871d945c6bfb685ecff5e30ad759f280c841ea143071466b2e611bd1800f18f", + "size": "430471837" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", - "size": "430472412" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "checksum": "SHA-256:a871d945c6bfb685ecff5e30ad759f280c841ea143071466b2e611bd1800f18f", + "size": "430471837" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", - "size": "430472412" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "checksum": "SHA-256:a871d945c6bfb685ecff5e30ad759f280c841ea143071466b2e611bd1800f18f", + "size": "430471837" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", - "size": "430472412" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "checksum": "SHA-256:a871d945c6bfb685ecff5e30ad759f280c841ea143071466b2e611bd1800f18f", + "size": "430471837" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", - "size": "430472412" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "checksum": "SHA-256:a871d945c6bfb685ecff5e30ad759f280c841ea143071466b2e611bd1800f18f", + "size": "430471837" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-25c7c119-v1.zip", - "checksum": "SHA-256:5760b8d2215c07b0f054e9cd62a268f218c2026db8b395e90696d8038f69d9a8", - "size": "430472412" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-b66b5448-v1.zip", + "checksum": "SHA-256:a871d945c6bfb685ecff5e30ad759f280c841ea143071466b2e611bd1800f18f", + "size": "430471837" } ] }, From a14ce89715088edd5c97d51f4c14f6cd380dded8 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 22 Jul 2025 19:38:01 -0300 Subject: [PATCH 258/290] fix(tamc_termod_s3): Fix header includes (#11625) --- variants/tamc_termod_s3/pins_arduino.h | 1 + variants/tamc_termod_s3/variant.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/variants/tamc_termod_s3/pins_arduino.h b/variants/tamc_termod_s3/pins_arduino.h index 3d846c9b111..89d0b5107ae 100644 --- a/variants/tamc_termod_s3/pins_arduino.h +++ b/variants/tamc_termod_s3/pins_arduino.h @@ -2,6 +2,7 @@ #define Pins_Arduino_h #include +#include #define USB_VID 0x303a #define USB_PID 0x1001 diff --git a/variants/tamc_termod_s3/variant.cpp b/variants/tamc_termod_s3/variant.cpp index 8079bdbba8d..cc255c31684 100644 --- a/variants/tamc_termod_s3/variant.cpp +++ b/variants/tamc_termod_s3/variant.cpp @@ -1,4 +1,5 @@ #include "Arduino.h" +#include "pins_arduino.h" float getBatteryVoltage() { int analogVolt = analogReadMilliVolts(1); From f08efa1fa3dd7c816ddfecc7ef26f771e4aff1a5 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, 23 Jul 2025 00:43:23 +0200 Subject: [PATCH 259/290] feat(docs): Updaze Zigbee docs with latest changes (#11627) --- docs/en/zigbee/ep_fan_control.rst | 133 ++++++++++++++++++++++++++++++ docs/en/zigbee/zigbee_core.rst | 13 +++ docs/en/zigbee/zigbee_ep.rst | 13 +++ 3 files changed, 159 insertions(+) create mode 100644 docs/en/zigbee/ep_fan_control.rst diff --git a/docs/en/zigbee/ep_fan_control.rst b/docs/en/zigbee/ep_fan_control.rst new file mode 100644 index 00000000000..1cfff0820df --- /dev/null +++ b/docs/en/zigbee/ep_fan_control.rst @@ -0,0 +1,133 @@ +################ +ZigbeeFanControl +################ + +About +----- + +The ``ZigbeeFanControl`` class provides a Zigbee endpoint for controlling fan devices in a Home Automation (HA) network. This endpoint implements the Fan Control cluster and allows for controlling fan modes and sequences. + +**Features:** +* Fan mode control (OFF, LOW, MEDIUM, HIGH, ON, AUTO, SMART) +* Fan mode sequence configuration +* State change callbacks +* Zigbee HA standard compliance + +**Use Cases:** +* Smart ceiling fans +* HVAC system fans +* Exhaust fans +* Any device requiring fan speed control + +API Reference +------------- + +Constructor +*********** + +ZigbeeFanControl +^^^^^^^^^^^^^^^^ + +Creates a new Zigbee fan control endpoint. + +.. code-block:: arduino + + ZigbeeFanControl(uint8_t endpoint); + +* ``endpoint`` - Endpoint number (1-254) + +Fan Mode Enums +************** + +ZigbeeFanMode +^^^^^^^^^^^^^ + +Available fan modes for controlling the fan speed and operation. + +.. code-block:: arduino + + enum ZigbeeFanMode { + FAN_MODE_OFF, // Fan is off + FAN_MODE_LOW, // Low speed + FAN_MODE_MEDIUM, // Medium speed + FAN_MODE_HIGH, // High speed + FAN_MODE_ON, // Fan is on (full speed) + FAN_MODE_AUTO, // Automatic mode + FAN_MODE_SMART, // Smart mode + }; + +ZigbeeFanModeSequence +^^^^^^^^^^^^^^^^^^^^^ + +Available fan mode sequences that define which modes are available for the fan. + +.. code-block:: arduino + + enum ZigbeeFanModeSequence { + FAN_MODE_SEQUENCE_LOW_MED_HIGH, // Low -> Medium -> High + FAN_MODE_SEQUENCE_LOW_HIGH, // Low -> High + FAN_MODE_SEQUENCE_LOW_MED_HIGH_AUTO, // Low -> Medium -> High -> Auto + FAN_MODE_SEQUENCE_LOW_HIGH_AUTO, // Low -> High -> Auto + FAN_MODE_SEQUENCE_ON_AUTO, // On -> Auto + }; + +API Methods +*********** + +setFanModeSequence +^^^^^^^^^^^^^^^^^^ + +Sets the fan mode sequence and initializes the fan control. + +.. code-block:: arduino + + bool setFanModeSequence(ZigbeeFanModeSequence sequence); + +* ``sequence`` - The fan mode sequence to set + +This function will return ``true`` if successful, ``false`` otherwise. + +getFanMode +^^^^^^^^^^ + +Gets the current fan mode. + +.. code-block:: arduino + + ZigbeeFanMode getFanMode(); + +This function will return current fan mode. + +getFanModeSequence +^^^^^^^^^^^^^^^^^^ + +Gets the current fan mode sequence. + +.. code-block:: arduino + + ZigbeeFanModeSequence getFanModeSequence(); + +This function will return current fan mode sequence. + +Event Handling +************** + +onFanModeChange +^^^^^^^^^^^^^^^ + +Sets a callback function to be called when the fan mode changes. + +.. code-block:: arduino + + void onFanModeChange(void (*callback)(ZigbeeFanMode mode)); + +* ``callback`` - Function to call when fan mode changes + +Example +------- + +Fan Control Implementation +************************** + +.. literalinclude:: ../../../libraries/Zigbee/examples/Zigbee_Fan_Control/Zigbee_Fan_Control.ino + :language: arduino diff --git a/docs/en/zigbee/zigbee_core.rst b/docs/en/zigbee/zigbee_core.rst index ee8f7234210..89cf88ecca1 100644 --- a/docs/en/zigbee/zigbee_core.rst +++ b/docs/en/zigbee/zigbee_core.rst @@ -345,6 +345,19 @@ Performs a factory reset, clearing all network settings. * ``restart`` - ``true`` to restart after reset (default: ``true``) +onGlobalDefaultResponse +^^^^^^^^^^^^^^^^^^^^^^^ + +Sets a global callback for default response messages. + +.. code-block:: arduino + + void onGlobalDefaultResponse(void (*callback)(zb_cmd_type_t resp_to_cmd, esp_zb_zcl_status_t status, uint8_t endpoint, uint16_t cluster)); + +* ``callback`` - Function pointer to the callback function + +This callback will be called for all endpoints when a default response is received. + Utility Functions ***************** diff --git a/docs/en/zigbee/zigbee_ep.rst b/docs/en/zigbee/zigbee_ep.rst index ce13d60bbaf..10c0c9fd084 100644 --- a/docs/en/zigbee/zigbee_ep.rst +++ b/docs/en/zigbee/zigbee_ep.rst @@ -345,6 +345,19 @@ Sets a callback function for identify events. * ``callback`` - Function to call when identify event occurs * ``time`` - Identify time in seconds +onDefaultResponse +^^^^^^^^^^^^^^^^^ + +Sets a callback for default response messages for this endpoint. + +.. code-block:: arduino + + void onDefaultResponse(void (*callback)(zb_cmd_type_t resp_to_cmd, esp_zb_zcl_status_t status)); + +* ``callback`` - Function pointer to the callback function + +This callback will be called when a default response is received for this specific endpoint. + Supported Endpoints ------------------- From ae634a92e3b3af3a68daf8e79b025a45ca9134ef 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, 23 Jul 2025 00:44:36 +0200 Subject: [PATCH 260/290] fix(zigbee): Fix RGB color calculation (#11624) --- cores/esp32/ColorFormat.c | 12 +++++++----- cores/esp32/ColorFormat.h | 3 ++- libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp | 5 ++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/cores/esp32/ColorFormat.c b/cores/esp32/ColorFormat.c index a01123545b3..052249f2127 100644 --- a/cores/esp32/ColorFormat.c +++ b/cores/esp32/ColorFormat.c @@ -119,10 +119,10 @@ espHsvColor_t espRgbColorToHsvColor(espRgbColor_t rgb) { } espRgbColor_t espXYColorToRgbColor(uint8_t Level, espXyColor_t xy) { - return espXYToRgbColor(Level, xy.x, xy.y); + return espXYToRgbColor(Level, xy.x, xy.y, true); } -espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t current_Y) { +espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t current_Y, bool addXYZScaling) { // convert xyY color space to RGB // https://www.easyrgb.com/en/math.php @@ -156,9 +156,11 @@ espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t curren // 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; + if (addXYZScaling) { + 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); diff --git a/cores/esp32/ColorFormat.h b/cores/esp32/ColorFormat.h index 0bb87145d16..288b79b5714 100644 --- a/cores/esp32/ColorFormat.h +++ b/cores/esp32/ColorFormat.h @@ -19,6 +19,7 @@ #pragma once #include +#include #ifdef __cplusplus extern "C" { #endif @@ -49,7 +50,7 @@ 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 espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t current_Y, bool addXYZScaling); 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); diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp index 2fb07fc2187..3611c232c20 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.cpp @@ -76,14 +76,13 @@ void ZigbeeColorDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_me 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 if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL) { if (message->attribute.id == ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_X_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_U16) { uint16_t light_color_x = (*(uint16_t *)message->attribute.data.value); uint16_t light_color_y = getCurrentColorY(); //calculate RGB from XY and call setColor() - _current_color = espXYToRgbColor(255, light_color_x, light_color_y); //TODO: Check if level is correct + _current_color = espXYToRgbColor(255, light_color_x, light_color_y, false); lightChanged(); return; @@ -91,7 +90,7 @@ 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() - _current_color = espXYToRgbColor(255, light_color_x, light_color_y); //TODO: Check if level is correct + _current_color = espXYToRgbColor(255, light_color_x, light_color_y, false); 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) { From 6fdfccf21b1532dede0e886dd4ab904581a036f3 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, 22 Jul 2025 22:46:36 +0000 Subject: [PATCH 261/290] ci(pre-commit): Apply automatic fixes --- cores/esp32/esp32-hal-i2c-slave.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cores/esp32/esp32-hal-i2c-slave.c b/cores/esp32/esp32-hal-i2c-slave.c index 79c994869e2..da3a819387a 100644 --- a/cores/esp32/esp32-hal-i2c-slave.c +++ b/cores/esp32/esp32-hal-i2c-slave.c @@ -338,8 +338,7 @@ 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, 5, 0)) \ - || (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 5, 0)) \ +#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)) || (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 5, 0)) \ || (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 3) && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 4, 0)) i2c_ll_set_mode(i2c->dev, I2C_BUS_MODE_SLAVE); i2c_ll_enable_pins_open_drain(i2c->dev, true); From e92e631811002adba98eb1e8e0ce167755e0864f Mon Sep 17 00:00:00 2001 From: Angel Nunez Mencias Date: Wed, 23 Jul 2025 07:11:11 +0200 Subject: [PATCH 262/290] feat: Allow calls to timer functions within ISR --- cores/esp32/esp32-hal-timer.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/cores/esp32/esp32-hal-timer.c b/cores/esp32/esp32-hal-timer.c index ec6c507358e..508d510508e 100644 --- a/cores/esp32/esp32-hal-timer.c +++ b/cores/esp32/esp32-hal-timer.c @@ -36,9 +36,8 @@ struct timer_struct_t { bool timer_started; }; -inline uint64_t timerRead(hw_timer_t *timer) { +inline IRAM_ATTR uint64_t timerRead(hw_timer_t *timer) { if (timer == NULL) { - log_e("Timer handle is NULL"); return 0; } uint64_t value; @@ -46,15 +45,14 @@ inline uint64_t timerRead(hw_timer_t *timer) { return value; } -void timerWrite(hw_timer_t *timer, uint64_t val) { +void IRAM_ATTR timerWrite(hw_timer_t *timer, uint64_t val) { if (timer == NULL) { - log_e("Timer handle is NULL"); return; } gptimer_set_raw_count(timer->timer_handle, val); } -void timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autoreload, uint64_t reload_count) { +void IRAM_ATTR timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autoreload, uint64_t reload_count) { if (timer == NULL) { log_e("Timer handle is NULL"); return; @@ -67,7 +65,7 @@ void timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autoreload, uint64 }; err = gptimer_set_alarm_action(timer->timer_handle, &alarm_cfg); if (err != ESP_OK) { - log_e("Timer Alarm Write failed, error num=%d", err); + ; // Ignore } } @@ -80,27 +78,24 @@ uint32_t timerGetFrequency(hw_timer_t *timer) { return frequency; } -void timerStart(hw_timer_t *timer) { +void IRAM_ATTR timerStart(hw_timer_t *timer) { if (timer == NULL) { - log_e("Timer handle is NULL"); return; } gptimer_start(timer->timer_handle); timer->timer_started = true; } -void timerStop(hw_timer_t *timer) { +void IRAM_ATTR timerStop(hw_timer_t *timer) { if (timer == NULL) { - log_e("Timer handle is NULL"); return; } gptimer_stop(timer->timer_handle); timer->timer_started = false; } -void timerRestart(hw_timer_t *timer) { +void IRAM_ATTR timerRestart(hw_timer_t *timer) { if (timer == NULL) { - log_e("Timer handle is NULL"); return; } gptimer_set_raw_count(timer->timer_handle, 0); From 67c59a202196abe0029b868c34e57faf4032f0c5 Mon Sep 17 00:00:00 2001 From: Angel Nunez Mencias Date: Wed, 23 Jul 2025 07:26:03 +0200 Subject: [PATCH 263/290] fix: remove log from IRAM function --- cores/esp32/esp32-hal-timer.c | 1 - 1 file changed, 1 deletion(-) diff --git a/cores/esp32/esp32-hal-timer.c b/cores/esp32/esp32-hal-timer.c index 508d510508e..6875b5b2d8f 100644 --- a/cores/esp32/esp32-hal-timer.c +++ b/cores/esp32/esp32-hal-timer.c @@ -54,7 +54,6 @@ void IRAM_ATTR timerWrite(hw_timer_t *timer, uint64_t val) { void IRAM_ATTR timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autoreload, uint64_t reload_count) { if (timer == NULL) { - log_e("Timer handle is NULL"); return; } esp_err_t err = ESP_OK; From 3da3ad2f2d38badab90524c7c647681acbd8274e Mon Sep 17 00:00:00 2001 From: Wulu Date: Wed, 23 Jul 2025 20:28:19 +0800 Subject: [PATCH 264/290] feat(board): Add onboard LED support for Waveshare ESP32-S3 Zero (#11630) Defines the standard LED_BUILTIN and RGB_BUILTIN macros for the Waveshare ESP32-S3 Zero, allowing its onboard WS2812 RGB LED to be controlled via standard Arduino APIs. --- variants/waveshare_esp32_s3_zero/pins_arduino.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/variants/waveshare_esp32_s3_zero/pins_arduino.h b/variants/waveshare_esp32_s3_zero/pins_arduino.h index 0d73bee16d0..20ce1c88859 100644 --- a/variants/waveshare_esp32_s3_zero/pins_arduino.h +++ b/variants/waveshare_esp32_s3_zero/pins_arduino.h @@ -2,6 +2,7 @@ #define Pins_Arduino_h #include +#include "soc/soc_caps.h" #define USB_VID 0x303a #define USB_PID 0x822B @@ -9,9 +10,17 @@ #define USB_PRODUCT "ESP32-S3-Zero" #define USB_SERIAL "" // Empty string for MAC address -// Partial voltage measurement method +// Onboard WS2812 RGB LED #define WS_RGB 21 +// BUILTIN_LED can be used in new Arduino API digitalWrite() like in Blink.ino +static const uint8_t LED_BUILTIN = SOC_GPIO_PIN_COUNT + WS_RGB; +#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 RGB_BRIGHTNESS 64 + // Mapping based on the ESP32S3 data sheet - alternate for OUTPUT static const uint8_t OUTPUT_IO1 = 1; static const uint8_t OUTPUT_IO2 = 2; From c7520ccef0c343611d7f9eb0afb3576f612de2f2 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Wed, 23 Jul 2025 17:15:59 +0300 Subject: [PATCH 265/290] fix(report): Update Issue-report.yml for version 3.3.0 --- .github/ISSUE_TEMPLATE/Issue-report.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/Issue-report.yml b/.github/ISSUE_TEMPLATE/Issue-report.yml index 6dc1b0de171..a16a6ae3d44 100644 --- a/.github/ISSUE_TEMPLATE/Issue-report.yml +++ b/.github/ISSUE_TEMPLATE/Issue-report.yml @@ -43,6 +43,7 @@ body: - latest stable Release (if not listed below) - latest development Release Candidate (RC-X) - latest master (checkout manually) + - v3.3.0 - v3.2.1 - v3.2.0 - v3.1.3 From 126039663f83b3d6f5868a30f7dc2093812ee7b4 Mon Sep 17 00:00:00 2001 From: Angel Nunez Mencias Date: Thu, 24 Jul 2025 00:09:17 +0200 Subject: [PATCH 266/290] fix: conditional logs when not ISR --- cores/esp32/esp32-hal-timer.c | 40 +++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/cores/esp32/esp32-hal-timer.c b/cores/esp32/esp32-hal-timer.c index 6875b5b2d8f..38575fc9799 100644 --- a/cores/esp32/esp32-hal-timer.c +++ b/cores/esp32/esp32-hal-timer.c @@ -22,6 +22,12 @@ #include "esp_clk_tree.h" #endif +#if CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM +#define TIMER_IRAM IRAM_ATTR +#else +#define TIMER_IRAM +#endif + typedef void (*voidFuncPtr)(void); typedef void (*voidFuncPtrArg)(void *); @@ -36,8 +42,11 @@ struct timer_struct_t { bool timer_started; }; -inline IRAM_ATTR uint64_t timerRead(hw_timer_t *timer) { +inline TIMER_IRAM uint64_t timerRead(hw_timer_t *timer) { if (timer == NULL) { + #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM + log_e("Timer handle is NULL"); + #endif return 0; } uint64_t value; @@ -45,15 +54,21 @@ inline IRAM_ATTR uint64_t timerRead(hw_timer_t *timer) { return value; } -void IRAM_ATTR timerWrite(hw_timer_t *timer, uint64_t val) { +void TIMER_IRAM timerWrite(hw_timer_t *timer, uint64_t val) { if (timer == NULL) { + #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM + log_e("Timer handle is NULL"); + #endif return; } gptimer_set_raw_count(timer->timer_handle, val); } -void IRAM_ATTR timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autoreload, uint64_t reload_count) { +void TIMER_IRAM timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autoreload, uint64_t reload_count) { if (timer == NULL) { + #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM + log_e("Timer handle is NULL"); + #endif return; } esp_err_t err = ESP_OK; @@ -64,7 +79,9 @@ void IRAM_ATTR timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autorelo }; err = gptimer_set_alarm_action(timer->timer_handle, &alarm_cfg); if (err != ESP_OK) { - ; // Ignore + #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM + log_e("Timer Alarm Write failed, error num=%d", err); + #endif } } @@ -77,24 +94,33 @@ uint32_t timerGetFrequency(hw_timer_t *timer) { return frequency; } -void IRAM_ATTR timerStart(hw_timer_t *timer) { +void TIMER_IRAM timerStart(hw_timer_t *timer) { if (timer == NULL) { + #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM + log_e("Timer handle is NULL"); + #endif return; } gptimer_start(timer->timer_handle); timer->timer_started = true; } -void IRAM_ATTR timerStop(hw_timer_t *timer) { +void TIMER_IRAM timerStop(hw_timer_t *timer) { if (timer == NULL) { + #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM + log_e("Timer handle is NULL"); + #endif return; } gptimer_stop(timer->timer_handle); timer->timer_started = false; } -void IRAM_ATTR timerRestart(hw_timer_t *timer) { +void TIMER_IRAM timerRestart(hw_timer_t *timer) { if (timer == NULL) { + #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM + log_e("Timer handle is NULL"); + #endif return; } gptimer_set_raw_count(timer->timer_handle, 0); From e3a0a3a6c58eca709dacf6f1d2e7cd169f522e86 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, 24 Jul 2025 11:22:13 +0000 Subject: [PATCH 267/290] ci(pre-commit): Apply automatic fixes --- cores/esp32/esp32-hal-timer.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/cores/esp32/esp32-hal-timer.c b/cores/esp32/esp32-hal-timer.c index 38575fc9799..85e007143bd 100644 --- a/cores/esp32/esp32-hal-timer.c +++ b/cores/esp32/esp32-hal-timer.c @@ -44,9 +44,9 @@ struct timer_struct_t { inline TIMER_IRAM uint64_t timerRead(hw_timer_t *timer) { if (timer == NULL) { - #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM +#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM log_e("Timer handle is NULL"); - #endif +#endif return 0; } uint64_t value; @@ -56,9 +56,9 @@ inline TIMER_IRAM uint64_t timerRead(hw_timer_t *timer) { void TIMER_IRAM timerWrite(hw_timer_t *timer, uint64_t val) { if (timer == NULL) { - #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM +#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM log_e("Timer handle is NULL"); - #endif +#endif return; } gptimer_set_raw_count(timer->timer_handle, val); @@ -66,9 +66,9 @@ void TIMER_IRAM timerWrite(hw_timer_t *timer, uint64_t val) { void TIMER_IRAM timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autoreload, uint64_t reload_count) { if (timer == NULL) { - #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM +#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM log_e("Timer handle is NULL"); - #endif +#endif return; } esp_err_t err = ESP_OK; @@ -79,9 +79,9 @@ void TIMER_IRAM timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autorel }; err = gptimer_set_alarm_action(timer->timer_handle, &alarm_cfg); if (err != ESP_OK) { - #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM +#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM log_e("Timer Alarm Write failed, error num=%d", err); - #endif +#endif } } @@ -96,9 +96,9 @@ uint32_t timerGetFrequency(hw_timer_t *timer) { void TIMER_IRAM timerStart(hw_timer_t *timer) { if (timer == NULL) { - #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM +#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM log_e("Timer handle is NULL"); - #endif +#endif return; } gptimer_start(timer->timer_handle); @@ -107,9 +107,9 @@ void TIMER_IRAM timerStart(hw_timer_t *timer) { void TIMER_IRAM timerStop(hw_timer_t *timer) { if (timer == NULL) { - #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM +#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM log_e("Timer handle is NULL"); - #endif +#endif return; } gptimer_stop(timer->timer_handle); @@ -118,9 +118,9 @@ void TIMER_IRAM timerStop(hw_timer_t *timer) { void TIMER_IRAM timerRestart(hw_timer_t *timer) { if (timer == NULL) { - #ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM +#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM log_e("Timer handle is NULL"); - #endif +#endif return; } gptimer_set_raw_count(timer->timer_handle, 0); From 5c24611b913e90d65d75b5208359f6364a2509f9 Mon Sep 17 00:00:00 2001 From: Parsaabasi Date: Fri, 25 Jul 2025 12:35:55 +0200 Subject: [PATCH 268/290] feat(github): remove ESP32 forum from issue template --- .github/ISSUE_TEMPLATE/config.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index e879b09bec2..060397abd1e 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -3,6 +3,3 @@ contact_links: - 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 From 10e73be7146d6b6d80777016bdc4ddb810cf56a7 Mon Sep 17 00:00:00 2001 From: Parsaabasi Date: Fri, 25 Jul 2025 12:49:46 +0200 Subject: [PATCH 269/290] feat(github): Update template type --- .github/ISSUE_TEMPLATE/Issue-report.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/Issue-report.yml b/.github/ISSUE_TEMPLATE/Issue-report.yml index a16a6ae3d44..864ef65b92b 100644 --- a/.github/ISSUE_TEMPLATE/Issue-report.yml +++ b/.github/ISSUE_TEMPLATE/Issue-report.yml @@ -80,6 +80,17 @@ body: - other validations: required: true + - type: dropdown + id: type + attributes: + label: Type + description: How would you define the type of the issue? Please select from the types below. + options: + - Task + - Bug + - Question + validations: + required: true - type: input id: IDE attributes: From b3152a4ffc38f374cb70ff999f3c64a9bef75297 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, 25 Jul 2025 14:10:32 +0200 Subject: [PATCH 270/290] feat(zigbee): Update SDK to latest --- idf_component.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/idf_component.yml b/idf_component.yml index 82f14ea554a..f9357a401f9 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -54,12 +54,12 @@ dependencies: espressif/esp_modem: version: "^1.1.0" espressif/esp-zboss-lib: - version: "==1.6.4" # compatible with esp-zigbee-lib 1.6.5 + version: "==1.6.4" # compatible with esp-zigbee-lib 1.6.6 require: public rules: - if: "target not in [esp32c2, esp32p4]" espressif/esp-zigbee-lib: - version: "==1.6.5" + version: "==1.6.6" require: public rules: - if: "target not in [esp32c2, esp32p4]" From b139bae5028ac2be25cd91943f62c7546b307ea1 Mon Sep 17 00:00:00 2001 From: Wulu Date: Sun, 27 Jul 2025 19:50:20 +0800 Subject: [PATCH 271/290] docs: Remove incorrect statement on ESP32-S3 default resolution --- docs/en/api/adc.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/en/api/adc.rst b/docs/en/api/adc.rst index 434384f8d9b..9c16db54ec1 100644 --- a/docs/en/api/adc.rst +++ b/docs/en/api/adc.rst @@ -52,8 +52,7 @@ This function will return analog value in millivolts (calibrated). analogReadResolution ^^^^^^^^^^^^^^^^^^^^ -This function is used to set the resolution of ``analogRead`` return value. Default is 12 bits (range from 0 to 4095) -for all chips except ESP32-S3 where default is 13 bits (range from 0 to 8191). +This function is used to set the resolution of ``analogRead`` return value. Default is 12 bits (range from 0 to 4095). When different resolution is set, the values read will be shifted to match the given resolution. Range is 1 - 16 .The default value will be used, if this function is not used. From ed6e95d4fc207575d932dc12a7783eff724280f4 Mon Sep 17 00:00:00 2001 From: Paula Scharf Date: Mon, 28 Jul 2025 08:46:14 +0200 Subject: [PATCH 272/290] feat(board): use existing led API --- variants/sensebox_eye/variant.cpp | 46 +++---------------------------- 1 file changed, 4 insertions(+), 42 deletions(-) diff --git a/variants/sensebox_eye/variant.cpp b/variants/sensebox_eye/variant.cpp index d8a37f58758..23bc1d385f7 100644 --- a/variants/sensebox_eye/variant.cpp +++ b/variants/sensebox_eye/variant.cpp @@ -1,50 +1,12 @@ #include "esp32-hal-gpio.h" #include "pins_arduino.h" -#include "driver/rmt_tx.h" extern "C" { -void blinkLED(uint8_t color[3], rmt_channel_handle_t led_chan, rmt_encoder_handle_t ws2812_encoder, rmt_transmit_config_t tx_config) { - ESP_ERROR_CHECK(rmt_transmit(led_chan, ws2812_encoder, color, sizeof(color), &tx_config)); - rmt_tx_wait_all_done(led_chan, portMAX_DELAY); - - // Wait a moment - delay(50); - - // Turn LED off - uint8_t pixel_off[3] = { 0x00, 0x00, 0x00 }; - ESP_ERROR_CHECK(rmt_transmit(led_chan, ws2812_encoder, pixel_off, sizeof(pixel_off), &tx_config)); - rmt_tx_wait_all_done(led_chan, portMAX_DELAY); -} - void initVariant(void) { - rmt_channel_handle_t led_chan = NULL; - rmt_tx_channel_config_t tx_chan_config = {}; - tx_chan_config.clk_src = RMT_CLK_SRC_DEFAULT; - tx_chan_config.resolution_hz = 10 * 1000 * 1000; - tx_chan_config.mem_block_symbols = 64; - tx_chan_config.trans_queue_depth = 4; - tx_chan_config.gpio_num = (gpio_num_t)PIN_LED; - tx_chan_config.flags.invert_out = false; - tx_chan_config.flags.with_dma = false; - ESP_ERROR_CHECK(rmt_new_tx_channel(&tx_chan_config, &led_chan)); - - // WS2812 encoder config (available in `esp-rmt`) - rmt_encoder_handle_t ws2812_encoder = NULL; - rmt_bytes_encoder_config_t bytes_encoder_config = { - .bit0 = { .duration0 = 4, .level0 = 1, .duration1 = 9, .level1 = 0 }, - .bit1 = { .duration0 = 8, .level0 = 1, .duration1 = 5, .level1 = 0 }, - .flags = { .msb_first = true } - }; - ESP_ERROR_CHECK(rmt_new_bytes_encoder(&bytes_encoder_config, &ws2812_encoder)); - - ESP_ERROR_CHECK(rmt_enable(led_chan)); - - rmt_transmit_config_t tx_config = { - .loop_count = 0 - }; - - uint8_t pixel[3] = { 0x10, 0x00, 0x00 }; // green - blinkLED(pixel, led_chan, ws2812_encoder, tx_config); + // blink the RGB LED + rgbLedWrite(PIN_LED, 0x00, 0x10, 0x00); // green + delay(20); + rgbLedWrite(PIN_LED, 0x00, 0x00, 0x00); // off } } From 0dcb1d1178c0d8c73870a83f892fada1114d8fc0 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, 28 Jul 2025 06:56:12 +0000 Subject: [PATCH 273/290] ci(pre-commit): Apply automatic fixes --- .../sensebox_eye/partitions-16MB-tinyuf2.csv | 2 +- variants/sensebox_eye/pins_arduino.h | 26 +++++++++---------- variants/sensebox_eye/variant.cpp | 4 +-- variants/sensebox_mcu_esp32s2/APOTA.ino | 4 +-- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/variants/sensebox_eye/partitions-16MB-tinyuf2.csv b/variants/sensebox_eye/partitions-16MB-tinyuf2.csv index 960f3fbbd71..55dc6213161 100644 --- a/variants/sensebox_eye/partitions-16MB-tinyuf2.csv +++ b/variants/sensebox_eye/partitions-16MB-tinyuf2.csv @@ -7,4 +7,4 @@ 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, 11968K, \ No newline at end of file +ffat, data, fat, 0x450000, 11968K, diff --git a/variants/sensebox_eye/pins_arduino.h b/variants/sensebox_eye/pins_arduino.h index 99984dbc6a4..70c2bd880c9 100644 --- a/variants/sensebox_eye/pins_arduino.h +++ b/variants/sensebox_eye/pins_arduino.h @@ -10,15 +10,15 @@ #define USB_SERIAL "" // Empty string for MAC address // Default USB FirmwareMSC Settings -#define USB_FW_MSC_VENDOR_ID "senseBox" // max 8 chars +#define USB_FW_MSC_VENDOR_ID "senseBox" // max 8 chars #define USB_FW_MSC_PRODUCT_ID "Eye ESP32S3" // max 16 chars -#define USB_FW_MSC_PRODUCT_REVISION "1.00" // max 4 chars -#define USB_FW_MSC_VOLUME_NAME "senseBox" // max 11 chars +#define USB_FW_MSC_PRODUCT_REVISION "1.00" // max 4 chars +#define USB_FW_MSC_VOLUME_NAME "senseBox" // max 11 chars #define USB_FW_MSC_SERIAL_NUMBER 0x00000000 #define PIN_RGB_LED 45 // RGB LED #define RGBLED_PIN 45 // RGB LED -#define PIN_LED 45 +#define PIN_LED 45 #define RGBLED_NUM 1 // number of RGB LEDs // Default I2C QWIIC-Ports @@ -28,14 +28,14 @@ static const uint8_t SCL = 1; #define PIN_QWIIC_SCL 1 // IO Pins -#define PIN_IO14 14 -static const uint8_t A14 = PIN_IO14; // Analog -static const uint8_t D14 = PIN_IO14; // Digital -static const uint8_t T14 = PIN_IO14; // Touch -#define PIN_IO48 48 -static const uint8_t A48 = PIN_IO48; // Analog -static const uint8_t D48 = PIN_IO48; // Digital -static const uint8_t T48 = PIN_IO48; // Touch +#define PIN_IO14 14 +static const uint8_t A14 = PIN_IO14; // Analog +static const uint8_t D14 = PIN_IO14; // Digital +static const uint8_t T14 = PIN_IO14; // Touch +#define PIN_IO48 48 +static const uint8_t A48 = PIN_IO48; // Analog +static const uint8_t D48 = PIN_IO48; // Digital +static const uint8_t T48 = PIN_IO48; // Touch // Button #define PIN_BUTTON 47 @@ -87,4 +87,4 @@ static const uint8_t RX = 44; #define LORA_TX 43 #define LORA_RX 44 -#endif /* Pins_Arduino_h */ \ No newline at end of file +#endif /* Pins_Arduino_h */ diff --git a/variants/sensebox_eye/variant.cpp b/variants/sensebox_eye/variant.cpp index 23bc1d385f7..4d6e38e73e0 100644 --- a/variants/sensebox_eye/variant.cpp +++ b/variants/sensebox_eye/variant.cpp @@ -5,8 +5,8 @@ extern "C" { void initVariant(void) { // blink the RGB LED - rgbLedWrite(PIN_LED, 0x00, 0x10, 0x00); // green + rgbLedWrite(PIN_LED, 0x00, 0x10, 0x00); // green delay(20); - rgbLedWrite(PIN_LED, 0x00, 0x00, 0x00); // off + rgbLedWrite(PIN_LED, 0x00, 0x00, 0x00); // off } } diff --git a/variants/sensebox_mcu_esp32s2/APOTA.ino b/variants/sensebox_mcu_esp32s2/APOTA.ino index afb741499b2..114f0325e92 100644 --- a/variants/sensebox_mcu_esp32s2/APOTA.ino +++ b/variants/sensebox_mcu_esp32s2/APOTA.ino @@ -1,5 +1,5 @@ -// APOTA is a arduino fallback sketch that is written to OTA1_Partition. -// APOTA opens an access point which waits to receive a .binfile on /sketch. +// APOTA is a arduino fallback sketch that is written to OTA1_Partition. +// APOTA opens an access point which waits to receive a .binfile on /sketch. // After succesful upload, the file is written to OTA0_Partition and the microcontroller reboots to the newly uploaded sketch. #define DISPLAY_ENABLED From e375698adeb0d3ef306782b1a669bf7a60d6b190 Mon Sep 17 00:00:00 2001 From: Paula Scharf Date: Mon, 28 Jul 2025 09:44:04 +0200 Subject: [PATCH 274/290] feat(board): spelling --- variants/sensebox_mcu_esp32s2/APOTA.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/variants/sensebox_mcu_esp32s2/APOTA.ino b/variants/sensebox_mcu_esp32s2/APOTA.ino index 114f0325e92..a1fbab402ca 100644 --- a/variants/sensebox_mcu_esp32s2/APOTA.ino +++ b/variants/sensebox_mcu_esp32s2/APOTA.ino @@ -1,6 +1,6 @@ -// APOTA is a arduino fallback sketch that is written to OTA1_Partition. -// APOTA opens an access point which waits to receive a .binfile on /sketch. -// After succesful upload, the file is written to OTA0_Partition and the microcontroller reboots to the newly uploaded sketch. +// APOTA is an Arduino fallback sketch that is written to OTA1_Partition. +// APOTA opens an access point which waits to receive a .bin file on /sketch. +// After successful upload, the file is written to OTA0_Partition, and the microcontroller reboots to the newly uploaded sketch. #define DISPLAY_ENABLED From a5e85f675e09aa9e5532dd9e4e24019e243f3ee8 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, 28 Jul 2025 07:44:47 +0000 Subject: [PATCH 275/290] ci(pre-commit): Apply automatic fixes --- variants/sensebox_mcu_esp32s2/APOTA.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/variants/sensebox_mcu_esp32s2/APOTA.ino b/variants/sensebox_mcu_esp32s2/APOTA.ino index a1fbab402ca..67348d0b20f 100644 --- a/variants/sensebox_mcu_esp32s2/APOTA.ino +++ b/variants/sensebox_mcu_esp32s2/APOTA.ino @@ -1,5 +1,5 @@ -// APOTA is an Arduino fallback sketch that is written to OTA1_Partition. -// APOTA opens an access point which waits to receive a .bin file on /sketch. +// APOTA is an Arduino fallback sketch that is written to OTA1_Partition. +// APOTA opens an access point which waits to receive a .bin file on /sketch. // After successful upload, the file is written to OTA0_Partition, and the microcontroller reboots to the newly uploaded sketch. #define DISPLAY_ENABLED From 311955ccbb0fa657ff6e03fcdd553bd5094c826a 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, 28 Jul 2025 11:59:01 +0200 Subject: [PATCH 276/290] fix(component): Use external diag logs to avoid error --- idf_component_examples/esp_matter_light/sdkconfig.defaults | 5 +++++ idf_component_examples/hello_world/sdkconfig.defaults | 5 +++++ idf_component_examples/hw_cdc_hello_world/sdkconfig.defaults | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/idf_component_examples/esp_matter_light/sdkconfig.defaults b/idf_component_examples/esp_matter_light/sdkconfig.defaults index 43871661856..8688318fa36 100644 --- a/idf_component_examples/esp_matter_light/sdkconfig.defaults +++ b/idf_component_examples/esp_matter_light/sdkconfig.defaults @@ -60,3 +60,8 @@ CONFIG_MBEDTLS_HKDF_C=y # Increase LwIP IPv6 address number to 6 (MAX_FABRIC + 1) # unique local addresses for fabrics(MAX_FABRIC), a link local address(1) CONFIG_LWIP_IPV6_NUM_ADDRESSES=6 + +# +# DIAGNOSTICS +# +CONFIG_DIAG_USE_EXTERNAL_LOG_WRAP=y diff --git a/idf_component_examples/hello_world/sdkconfig.defaults b/idf_component_examples/hello_world/sdkconfig.defaults index bb723653f8a..a604d9767fd 100644 --- a/idf_component_examples/hello_world/sdkconfig.defaults +++ b/idf_component_examples/hello_world/sdkconfig.defaults @@ -10,3 +10,8 @@ CONFIG_AUTOSTART_ARDUINO=y CONFIG_FREERTOS_HZ=1000 # end of FREERTOS # end of Component config + +# +# DIAGNOSTICS +# +CONFIG_DIAG_USE_EXTERNAL_LOG_WRAP=y diff --git a/idf_component_examples/hw_cdc_hello_world/sdkconfig.defaults b/idf_component_examples/hw_cdc_hello_world/sdkconfig.defaults index bb723653f8a..a604d9767fd 100644 --- a/idf_component_examples/hw_cdc_hello_world/sdkconfig.defaults +++ b/idf_component_examples/hw_cdc_hello_world/sdkconfig.defaults @@ -10,3 +10,8 @@ CONFIG_AUTOSTART_ARDUINO=y CONFIG_FREERTOS_HZ=1000 # end of FREERTOS # end of Component config + +# +# DIAGNOSTICS +# +CONFIG_DIAG_USE_EXTERNAL_LOG_WRAP=y From 6cc7a63cd021e6cd457d086dc1efb6b550554c65 Mon Sep 17 00:00:00 2001 From: Wulu Date: Mon, 28 Jul 2025 22:43:55 +0800 Subject: [PATCH 277/290] docs: Change ADC default resolution exception to ESP32-S2 --- docs/en/api/adc.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/en/api/adc.rst b/docs/en/api/adc.rst index 9c16db54ec1..416a8afd803 100644 --- a/docs/en/api/adc.rst +++ b/docs/en/api/adc.rst @@ -52,7 +52,8 @@ This function will return analog value in millivolts (calibrated). analogReadResolution ^^^^^^^^^^^^^^^^^^^^ -This function is used to set the resolution of ``analogRead`` return value. Default is 12 bits (range from 0 to 4095). +This function is used to set the resolution of ``analogRead`` return value. Default is 12 bits (range from 0 to 4095) +for all chips except ESP32-S2 where default is 13 bits (range from 0 to 8191). When different resolution is set, the values read will be shifted to match the given resolution. Range is 1 - 16 .The default value will be used, if this function is not used. From f5b08cd81297136fbf0121835858bca39bd4d394 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 28 Jul 2025 13:38:14 -0300 Subject: [PATCH 278/290] feat(codeql): Add CodeQL analysis for interpreted languages (#11662) --- .github/CODEOWNERS | 1 + .github/codeql/codeql-config.yml | 26 +++++++++++++++++++++++ .github/workflows/codeql_actions.yml | 31 ++++++++++++++++++++++++++++ .github/workflows/codeql_python.yml | 30 +++++++++++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 .github/codeql/codeql-config.yml create mode 100644 .github/workflows/codeql_actions.yml create mode 100644 .github/workflows/codeql_python.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 64d241ba20a..d07ef88044d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -11,6 +11,7 @@ # CI /.github/ @lucasssvaz @me-no-dev @P-R-O-C-H-Y +/.github/codeql/ @lucasssvaz /.gitlab/ @lucasssvaz /tests/ @lucasssvaz @P-R-O-C-H-Y diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml new file mode 100644 index 00000000000..c640d7bd6ef --- /dev/null +++ b/.github/codeql/codeql-config.yml @@ -0,0 +1,26 @@ +name: "CodeQL config" + +packs: + - trailofbits/cpp-queries + - githubsecuritylab/codeql-cpp-queries + - githubsecuritylab/codeql-python-queries + +queries: + - uses: security-extended + - uses: security-and-quality + +query-filters: + - exclude: + query path: + - /^experimental\/.*/ + - exclude: + tags contain: + - experimental + - exclude: + problem.severity: + - recommendation + - exclude: + id: tob/cpp/use-of-legacy-algorithm + +paths-ignore: + - tests/** diff --git a/.github/workflows/codeql_actions.yml b/.github/workflows/codeql_actions.yml new file mode 100644 index 00000000000..07688f896ba --- /dev/null +++ b/.github/workflows/codeql_actions.yml @@ -0,0 +1,31 @@ +name: CodeQL Actions Analysis + +on: + workflow_dispatch: + push: + branches: + - master + pull_request: + paths: + - ".github/workflows/*.yml" + - ".github/workflows/*.yaml" + +jobs: + codeql-analysis: + name: CodeQL Actions Analysis + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Initialize CodeQL + uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 + with: + languages: actions + config-file: ./.github/codeql/codeql-config.yml + + - name: Run CodeQL Analysis + uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 + with: + category: "Analysis: Actions" diff --git a/.github/workflows/codeql_python.yml b/.github/workflows/codeql_python.yml new file mode 100644 index 00000000000..312974cd3c1 --- /dev/null +++ b/.github/workflows/codeql_python.yml @@ -0,0 +1,30 @@ +name: CodeQL Python Analysis + +on: + workflow_dispatch: + push: + branches: + - master + pull_request: + paths: + - "**/*.py" + +jobs: + codeql-analysis: + name: CodeQL Python Analysis + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Initialize CodeQL + uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 + with: + languages: python + config-file: ./.github/codeql/codeql-config.yml + + - name: Run CodeQL Analysis + uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 + with: + category: "Analysis: Python" From 18daf31211eaba8ea7108263a938c6672e4c036a Mon Sep 17 00:00:00 2001 From: Parsaabasi Date: Tue, 29 Jul 2025 14:22:58 +0200 Subject: [PATCH 279/290] fix(github-template): indentation --- .github/ISSUE_TEMPLATE/Issue-report.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/Issue-report.yml b/.github/ISSUE_TEMPLATE/Issue-report.yml index 864ef65b92b..e1c13413764 100644 --- a/.github/ISSUE_TEMPLATE/Issue-report.yml +++ b/.github/ISSUE_TEMPLATE/Issue-report.yml @@ -81,14 +81,14 @@ body: validations: required: true - type: dropdown - id: type - attributes: - label: Type - description: How would you define the type of the issue? Please select from the types below. - options: - - Task - - Bug - - Question + id: type + attributes: + label: Type + description: How would you define the type of the issue? Please select from the types below. + options: + - "Task" + - "Bug" + - "Question" validations: required: true - type: input From 866359a0e38f726b539093237d6d688003f8ba96 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 29 Jul 2025 11:54:40 -0300 Subject: [PATCH 280/290] fix(codeql): Merge CodeQL workflows to avoid errors in PRs --- .../{codeql_actions.yml => codeql.yml} | 12 +++++--- .github/workflows/codeql_python.yml | 30 ------------------- 2 files changed, 8 insertions(+), 34 deletions(-) rename .github/workflows/{codeql_actions.yml => codeql.yml} (72%) delete mode 100644 .github/workflows/codeql_python.yml diff --git a/.github/workflows/codeql_actions.yml b/.github/workflows/codeql.yml similarity index 72% rename from .github/workflows/codeql_actions.yml rename to .github/workflows/codeql.yml index 07688f896ba..fb0badd78ec 100644 --- a/.github/workflows/codeql_actions.yml +++ b/.github/workflows/codeql.yml @@ -1,4 +1,4 @@ -name: CodeQL Actions Analysis +name: CodeQL Analysis on: workflow_dispatch: @@ -7,13 +7,17 @@ on: - master pull_request: paths: + - "**/*.py" - ".github/workflows/*.yml" - ".github/workflows/*.yaml" jobs: codeql-analysis: - name: CodeQL Actions Analysis + name: CodeQL ${{ matrix.language }} analysis runs-on: ubuntu-latest + strategy: + matrix: + language: [python, actions] steps: - name: Checkout repository @@ -22,10 +26,10 @@ jobs: - name: Initialize CodeQL uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 with: - languages: actions + languages: ${{ matrix.language }} config-file: ./.github/codeql/codeql-config.yml - name: Run CodeQL Analysis uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 with: - category: "Analysis: Actions" + category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/codeql_python.yml b/.github/workflows/codeql_python.yml deleted file mode 100644 index 312974cd3c1..00000000000 --- a/.github/workflows/codeql_python.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: CodeQL Python Analysis - -on: - workflow_dispatch: - push: - branches: - - master - pull_request: - paths: - - "**/*.py" - -jobs: - codeql-analysis: - name: CodeQL Python Analysis - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - - name: Initialize CodeQL - uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 - with: - languages: python - config-file: ./.github/codeql/codeql-config.yml - - - name: Run CodeQL Analysis - uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 - with: - category: "Analysis: Python" From 4eff7f9ae408a9fdd5d15c86184bda785d881aa3 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 29 Jul 2025 14:43:25 -0300 Subject: [PATCH 281/290] fix(template): Fix issue report template --- .github/ISSUE_TEMPLATE/Issue-report.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/Issue-report.yml b/.github/ISSUE_TEMPLATE/Issue-report.yml index e1c13413764..97834925020 100644 --- a/.github/ISSUE_TEMPLATE/Issue-report.yml +++ b/.github/ISSUE_TEMPLATE/Issue-report.yml @@ -80,12 +80,12 @@ body: - other validations: required: true - - type: dropdown - id: type - attributes: - label: Type - description: How would you define the type of the issue? Please select from the types below. - options: + - type: dropdown + id: type + attributes: + label: Type + description: How would you define the type of the issue? Please select from the types below. + options: - "Task" - "Bug" - "Question" From 2b9d7576fa918e3f27ebd743690489c0874c2309 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 30 Jul 2025 10:27:31 -0300 Subject: [PATCH 282/290] ci(component): Move component compilation to a separate workflow --- .github/scripts/set_push_chunks.sh | 1 - .github/workflows/build_component.yml | 133 ++++++++++++++++++++++++++ .github/workflows/push.yml | 120 +++++------------------ .github/workflows/tests.yml | 11 +-- 4 files changed, 159 insertions(+), 106 deletions(-) create mode 100644 .github/workflows/build_component.yml diff --git a/.github/scripts/set_push_chunks.sh b/.github/scripts/set_push_chunks.sh index ff0af7da6e8..69cd9a7f7de 100644 --- a/.github/scripts/set_push_chunks.sh +++ b/.github/scripts/set_push_chunks.sh @@ -78,7 +78,6 @@ chunks+="]" echo "build_all=$build_all" echo "build_libraries=$BUILD_LIBRARIES" echo "build_static_sketches=$BUILD_STATIC_SKETCHES" - echo "build_idf=$BUILD_IDF" echo "chunk_count=$chunks_count" echo "chunks=$chunks" } >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/build_component.yml b/.github/workflows/build_component.yml new file mode 100644 index 00000000000..5553b4b2024 --- /dev/null +++ b/.github/workflows/build_component.yml @@ -0,0 +1,133 @@ +name: Arduino as ESP-IDF Component + +on: + workflow_dispatch: + inputs: + idf_ver: + description: "IDF Versions" + default: "release-v5.3,release-v5.4,release-v5.5" + type: "string" + required: true + idf_targets: + description: "IDF Targets" + default: "esp32,esp32s2,esp32s3,esp32c2,esp32c3,esp32c6,esp32h2,esp32p4" + type: "string" + required: true + push: + branches: + - master + - release/* + pull_request: + paths: + - "cores/**" + - "libraries/**/*.cpp" + - "libraries/**/*.c" + - "libraries/**/*.h" + - "libraries/**/*.ino" + - "libraries/**/ci.json" + - "idf_component_examples/**" + - "idf_component.yml" + - "Kconfig.projbuild" + - "CMakeLists.txt" + - ".github/workflows/build_component.yml" + - ".github/scripts/check-cmakelists.sh" + - ".github/scripts/on-push-idf.sh" + - ".github/scripts/sketch_utils.sh" + - "variants/esp32/**" + - "variants/esp32c2/**" + - "variants/esp32c3/**" + - "variants/esp32c6/**" + - "variants/esp32h2/**" + - "variants/esp32p4/**" + - "variants/esp32s2/**" + - "variants/esp32s3/**" + - "!*.md" + - "!*.txt" + - "!*.properties" + +concurrency: + group: build-component-${{github.event.pull_request.number || github.ref}} + cancel-in-progress: true + +jobs: + cmake-check: + name: Check CMakeLists + runs-on: ubuntu-latest + if: ${{ !(github.event_name == 'pull_request' && startsWith(github.head_ref, 'release/')) }} + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - run: bash ./.github/scripts/check-cmakelists.sh + + set-matrix: + name: Set Matrix + runs-on: ubuntu-latest + if: ${{ !(github.event_name == 'pull_request' && startsWith(github.head_ref, 'release/')) }} + outputs: + idf_ver: ${{ steps.set-matrix.outputs.idf_ver }} + idf_target: ${{ steps.set-matrix.outputs.idf_target }} + steps: + - name: Get IDF Version and Targets + id: set-matrix + run: | + # Default values + idf_ver="release-v5.3,release-v5.4,release-v5.5" + idf_targets="esp32,esp32s2,esp32s3,esp32c2,esp32c3,esp32c6,esp32h2,esp32p4" + + # Override with inputs if provided + if [[ -n "${{ inputs.idf_ver }}" ]]; then + idf_ver="${{ inputs.idf_ver }}" + fi + if [[ -n "${{ inputs.idf_targets }}" ]]; then + idf_targets="${{ inputs.idf_targets }}" + fi + + # Convert comma-separated strings to JSON arrays using a more robust method + idf_ver_json=$(printf '%s\n' "$idf_ver" | tr ',' '\n' | jq -R . | jq -s . | jq -c .) + idf_targets_json=$(printf '%s\n' "$idf_targets" | tr ',' '\n' | jq -R . | jq -s . | jq -c .) + + # Debug: Print the JSON for verification + echo "Debug - idf_ver_json: $idf_ver_json" + echo "Debug - idf_targets_json: $idf_targets_json" + + # Set outputs - ensure no extra whitespace + printf "idf_ver=%s\n" "$idf_ver_json" >> $GITHUB_OUTPUT + printf "idf_target=%s\n" "$idf_targets_json" >> $GITHUB_OUTPUT + + build-esp-idf-component: + name: Build IDF ${{ matrix.idf_ver }} for ${{ matrix.idf_target }} + runs-on: ubuntu-latest + needs: set-matrix + strategy: + fail-fast: false + matrix: + # The version names here correspond to the versions of espressif/idf Docker image. + # See https://hub.docker.com/r/espressif/idf/tags and + # https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-docker-image.html + # for details. + idf_ver: ${{ fromJson(needs.set-matrix.outputs.idf_ver) }} + idf_target: ${{ fromJson(needs.set-matrix.outputs.idf_target) }} + container: espressif/idf:${{ matrix.idf_ver }} + steps: + - name: Check out arduino-esp32 as a component + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + submodules: recursive + path: components/arduino-esp32 + + - name: Setup jq + uses: dcarbone/install-jq-action@e397bd87438d72198f81efd21f876461183d383a # v3.0.1 + + - name: Build + env: + IDF_TARGET: ${{ matrix.idf_target }} + shell: bash + run: | + chmod a+x ./components/arduino-esp32/.github/scripts/* + ./components/arduino-esp32/.github/scripts/on-push-idf.sh + + - name: Upload generated sdkconfig files for debugging + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + if: always() + with: + name: sdkconfig-${{ matrix.idf_ver }}-${{ matrix.idf_target }} + path: ./components/arduino-esp32/idf_component_examples/**/sdkconfig diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 1523b7231be..fc85566aa8b 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -25,34 +25,32 @@ on: pull_request: paths: - "cores/**" - - "libraries/**" - - "!libraries/**.md" - - "!libraries/**.txt" - - "!libraries/**.properties" - - "!libraries/**.py" + - "libraries/**/*.cpp" + - "libraries/**/*.c" + - "libraries/**/*.h" + - "libraries/**/*.ino" + - "libraries/**/ci.json" - "package/**" - - "idf_component_examples/**" - - "tools/**.py" + - "tools/get.*" - "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/esp32c3/**/*" - - "variants/esp32c5/**/*" - - "variants/esp32c6/**/*" - - "variants/esp32h2/**/*" - - "variants/esp32p4/**/*" - - "variants/esp32s2/**/*" - - "variants/esp32s3/**/*" + - ".github/scripts/install-*" + - ".github/scripts/on-push.sh" + - ".github/scripts/set_push_chunks.sh" + - ".github/scripts/sketch_utils.sh" + - "variants/esp32/**" + - "variants/esp32c3/**" + - "variants/esp32c5/**" + - "variants/esp32c6/**" + - "variants/esp32h2/**" + - "variants/esp32p4/**" + - "variants/esp32s2/**" + - "variants/esp32s3/**" + - "!*.md" + - "!*.txt" + - "!*.properties" concurrency: group: build-${{github.event.pull_request.number || github.ref}} @@ -62,14 +60,6 @@ env: MAX_CHUNKS: 15 jobs: - cmake-check: - name: Check cmake file - runs-on: ubuntu-latest - if: ${{ !(github.event_name == 'pull_request' && startsWith(github.head_ref, 'release/')) }} - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - run: bash ./.github/scripts/check-cmakelists.sh - gen-chunks: name: Generate chunks runs-on: ubuntu-latest @@ -78,7 +68,6 @@ jobs: build_all: ${{ steps.set-chunks.outputs.build_all }} 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 }} chunk_count: ${{ steps.set-chunks.outputs.chunk_count }} chunks: ${{ steps.set-chunks.outputs.chunks }} steps: @@ -99,13 +88,7 @@ jobs: - 'tools/**' - 'platform.txt' - 'programmers.txt' - - "variants/esp32/**/*" - - "variants/esp32c3/**/*" - - "variants/esp32c6/**/*" - - "variants/esp32h2/**/*" - - "variants/esp32p4/**/*" - - "variants/esp32s2/**/*" - - "variants/esp32s3/**/*" + - "variants/**" libraries: - 'libraries/**/examples/**' - 'libraries/**/src/**' @@ -121,11 +104,6 @@ jobs: - 'libraries/NetworkClientSecure/src/**' - 'libraries/BLE/src/**' - 'libraries/Insights/src/**' - idf: - - 'idf_component.yml' - - 'Kconfig.projbuild' - - 'CMakeLists.txt' - - "idf_component_examples/**" - name: Set chunks id: set-chunks @@ -133,7 +111,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_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' }} @@ -233,59 +210,6 @@ jobs: - name: Build Sketches run: bash ./.github/scripts/on-push.sh - build-esp-idf-component: - name: Build with ESP-IDF ${{ matrix.idf_ver }} for ${{ matrix.idf_target }} - needs: gen-chunks - if: | - needs.gen-chunks.outputs.build_all == 'true' || - needs.gen-chunks.outputs.build_libraries == 'true' || - needs.gen-chunks.outputs.build_idf == 'true' - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - # The version names here correspond to the versions of espressif/idf Docker image. - # See https://hub.docker.com/r/espressif/idf/tags and - # https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-docker-image.html - # for details. - idf_ver: ["release-v5.3","release-v5.4","release-v5.5"] - 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 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - submodules: recursive - path: components/arduino-esp32 - - - name: Setup jq - uses: dcarbone/install-jq-action@e397bd87438d72198f81efd21f876461183d383a # v3.0.1 - - - name: Build - env: - IDF_TARGET: ${{ matrix.idf_target }} - shell: bash - run: | - chmod a+x ./components/arduino-esp32/.github/scripts/* - ./components/arduino-esp32/.github/scripts/on-push-idf.sh - - - name: Upload generated sdkconfig files for debugging - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - if: always() - with: - name: sdkconfig-${{ matrix.idf_ver }}-${{ matrix.idf_target }} - path: ./components/arduino-esp32/idf_component_examples/**/sdkconfig - # Save artifacts to gh-pages save-master-artifacts: name: Save master artifacts diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ddc9b64aace..058d9a3a793 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,20 +16,17 @@ on: pull_request: types: [opened, reopened, closed, synchronize, labeled, unlabeled] paths: + - ".github/scripts/install*.sh" - ".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" + - ".github/scripts/sketch_utils.sh" - "tests/**" - "cores/**" - "libraries/*/src/**.cpp" - "libraries/*/src/**.h" - "libraries/*/src/**.c" - "package/**" + - "!*.md" + - "!*.properties" schedule: - cron: "0 2 * * *" From b9c0f689ae3bdb7e40cc34b69ae2a8681a060af5 Mon Sep 17 00:00:00 2001 From: wulu Date: Wed, 30 Jul 2025 22:36:29 +0800 Subject: [PATCH 283/290] docs: Specify ADC resolution errata for ESP32-S2 v0.0 --- docs/en/api/adc.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/en/api/adc.rst b/docs/en/api/adc.rst index 416a8afd803..f2245cc1e5d 100644 --- a/docs/en/api/adc.rst +++ b/docs/en/api/adc.rst @@ -52,10 +52,12 @@ This function will return analog value in millivolts (calibrated). analogReadResolution ^^^^^^^^^^^^^^^^^^^^ -This function is used to set the resolution of ``analogRead`` return value. Default is 12 bits (range from 0 to 4095) -for all chips except ESP32-S2 where default is 13 bits (range from 0 to 8191). +This function is used to set the resolution of ``analogRead`` return value. Default is 12 bits (range from 0 to 4095) for all chips. When different resolution is set, the values read will be shifted to match the given resolution. +.. note:: + For **ESP32-S2 chip revision v0.0**, the default ADC resolution is 13 bits (0-8191) due to the `ADC-112 errata `_. This is fixed in later revisions (v1.0+), which use the standard 12-bit resolution. + Range is 1 - 16 .The default value will be used, if this function is not used. .. note:: For the ESP32, the resolution is between 9 to12 and it will change the ADC hardware resolution. Else value will be shifted. From 673048f73e41cfddccfdbc676f38f7ff7b146dfc Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Thu, 31 Jul 2025 08:21:11 -0300 Subject: [PATCH 284/290] change(esptool): Upgrade esptool to 5.0.2 --- 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 3909c833c56..1b4b005dd34 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -81,7 +81,7 @@ { "packager": "esp32", "name": "esptool_py", - "version": "5.0.0" + "version": "5.0.2" }, { "packager": "esp32", @@ -469,56 +469,56 @@ }, { "name": "esptool_py", - "version": "5.0.0", + "version": "5.0.2", "systems": [ { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-linux-aarch64.tar.gz", - "archiveFileName": "esptool-v5.0.0-linux-aarch64.tar.gz", - "checksum": "SHA-256:2bf239f3ed76141a957cadb205b94414ec6da9ace4e85f285e247d20a92b83e3", - "size": "58231895" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.2/esptool-v5.0.2-linux-aarch64.tar.gz", + "archiveFileName": "esptool-v5.0.2-linux-aarch64.tar.gz", + "checksum": "SHA-256:0c1fa4f5e96f715133fa65572063fa65bd120cd941b667cecd3360436a62b97b", + "size": "57815944" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-linux-amd64.tar.gz", - "archiveFileName": "esptool-v5.0.0-linux-amd64.tar.gz", - "checksum": "SHA-256:3b3835d266ac61f3242758f2fe34e3b33dbe6ee4b5acde005da793356f9f7043", - "size": "100783748" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.2/esptool-v5.0.2-linux-amd64.tar.gz", + "archiveFileName": "esptool-v5.0.2-linux-amd64.tar.gz", + "checksum": "SHA-256:519e0015872d527bdca850b18575d4f635fa88ccdffe47a14c99a80a90b780c5", + "size": "100787554" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-linux-armv7.tar.gz", - "archiveFileName": "esptool-v5.0.0-linux-armv7.tar.gz", - "checksum": "SHA-256:e55cd321abecfcf27f72a2bff5d5e19a5365fd400de66d71c5e7218e77556315", - "size": "53461760" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.2/esptool-v5.0.2-linux-armv7.tar.gz", + "archiveFileName": "esptool-v5.0.2-linux-armv7.tar.gz", + "checksum": "SHA-256:8df698d46a64b0b4a36d2a5bbd6bae58f81ca0a5e6451cd3f2d69a33340cc0f1", + "size": "53046401" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-macos-amd64.tar.gz", - "archiveFileName": "esptool-v5.0.0-macos-amd64.tar.gz", - "checksum": "SHA-256:424da2bdf0435257ad81bcb7eae6fd8dd7f675ce5b2ee60032f4ecec4d6a5d45", - "size": "59629533" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.2/esptool-v5.0.2-macos-amd64.tar.gz", + "archiveFileName": "esptool-v5.0.2-macos-amd64.tar.gz", + "checksum": "SHA-256:5c27295975515b97a9280f46845bd3acd5fc9e6a0583cfe03efa66cc50195ab0", + "size": "59619952" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-macos-arm64.tar.gz", - "archiveFileName": "esptool-v5.0.0-macos-arm64.tar.gz", - "checksum": "SHA-256:b91dfe1da7b0041376683dec10a91dfb266fbda2fb86ed87c4a034ff7182ee56", - "size": "56343104" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.2/esptool-v5.0.2-macos-arm64.tar.gz", + "archiveFileName": "esptool-v5.0.2-macos-arm64.tar.gz", + "checksum": "SHA-256:93f0d9ef169f9bc6e32ed6f381977f63a5df7483b8002a5676dddf055bdbf775", + "size": "56344929" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-windows-amd64.zip", - "archiveFileName": "esptool-v5.0.0-windows-amd64.zip", - "checksum": "SHA-256:2294107f66db6f09b886b337728a981173c9e7eab45a030928a8a5a1370611ca", - "size": "59105322" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.2/esptool-v5.0.2-windows-amd64.zip", + "archiveFileName": "esptool-v5.0.2-windows-amd64.zip", + "checksum": "SHA-256:1caef993a16c5915714a0da772d93f2e3239f316c06223981b262b838287268c", + "size": "59097582" }, { "host": "i686-mingw32", - "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-windows-amd64.zip", - "archiveFileName": "esptool-v5.0.0-windows-amd64.zip", - "checksum": "SHA-256:2294107f66db6f09b886b337728a981173c9e7eab45a030928a8a5a1370611ca", - "size": "59105322" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.2/esptool-v5.0.2-windows-amd64.zip", + "archiveFileName": "esptool-v5.0.2-windows-amd64.zip", + "checksum": "SHA-256:1caef993a16c5915714a0da772d93f2e3239f316c06223981b262b838287268c", + "size": "59097582" } ] }, From 30847588bc8909334479e4ee1ba48f43d051f8d0 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Thu, 31 Jul 2025 21:50:52 -0300 Subject: [PATCH 285/290] feat(codeql): Add CPP analysis --- .github/scripts/process_sarif.py | 129 +++++++++++++++++++++++++++++++ .github/workflows/codeql.yml | 55 ++++++++++++- 2 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 .github/scripts/process_sarif.py diff --git a/.github/scripts/process_sarif.py b/.github/scripts/process_sarif.py new file mode 100644 index 00000000000..fad689b6390 --- /dev/null +++ b/.github/scripts/process_sarif.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 + +# This script is used to process the SARIF file generated by CodeQL and +# to rename files back to .ino and adjust line numbers to match the original .ino files. + +import json +import sys +import os + +def process_artifact_location(artifact_location, renamed_files): + """ + Process a single artifact location to rename .cpp files back to .ino + """ + if 'uri' in artifact_location: + uri = artifact_location['uri'] + if uri in renamed_files: + print(f"Renaming file: {uri} -> {renamed_files[uri]}") + artifact_location['uri'] = renamed_files[uri] + return True + return False + +def process_region(region): + """ + Adjust line numbers in a region by decreasing them by 1 + """ + if 'startLine' in region: + region['startLine'] = max(1, region['startLine'] - 1) + if 'endLine' in region: + region['endLine'] = max(1, region['endLine'] - 1) + +def process_physical_location(physical_location, renamed_files): + """ + Process a physical location to rename files and adjust line numbers + """ + file_renamed = False + + if 'artifactLocation' in physical_location: + if process_artifact_location(physical_location['artifactLocation'], renamed_files): + file_renamed = True + + # Adjust line numbers if the file was renamed + if file_renamed and 'region' in physical_location: + process_region(physical_location['region']) + + return file_renamed + + +def process_sarif_file(sarif_file, renamed_files_file): + """ + Process SARIF file to rename files back to .ino and adjust line numbers + """ + # Read the renamed files mapping + with open(renamed_files_file, 'r') as f: + renamed_files = json.load(f) + + print(f"Loaded {len(renamed_files)} file mappings:") + for cpp_file, ino_file in renamed_files.items(): + print(f" {cpp_file} -> {ino_file}") + + + # Read the SARIF file + with open(sarif_file, 'r') as f: + sarif_data = json.load(f) + + files_processed = 0 + + # Process each run + if 'runs' in sarif_data: + for run in sarif_data['runs']: + # Process results + if 'results' in run: + for result in run['results']: + # Process all locations in the result + if 'locations' in result: + for location in result['locations']: + if 'physicalLocation' in location: + if process_physical_location(location['physicalLocation'], renamed_files): + files_processed += 1 + + # Process related locations if they exist + if 'relatedLocations' in result: + for location in result['relatedLocations']: + if 'physicalLocation' in location: + if process_physical_location(location['physicalLocation'], renamed_files): + files_processed += 1 + + # Process artifacts if they exist + if 'artifacts' in run: + for artifact in run['artifacts']: + if 'location' in artifact and 'uri' in artifact['location']: + uri = artifact['location']['uri'] + if uri in renamed_files: + artifact['location']['uri'] = renamed_files[uri] + files_processed += 1 + + print(f"Processed {files_processed} file references") + + # Write the processed SARIF file + with open(sarif_file, 'w') as f: + json.dump(sarif_data, f, indent=2) + +def main(): + if len(sys.argv) != 3: + print("Usage: python3 sarif_nobuild.py ") + sys.exit(1) + + sarif_file = sys.argv[1] + renamed_files_file = sys.argv[2] + + # Check if files exist + if not os.path.exists(sarif_file): + print(f"SARIF file not found: {sarif_file}") + sys.exit(1) + + if not os.path.exists(renamed_files_file): + print(f"Renamed files mapping not found: {renamed_files_file}") + sys.exit(1) + + try: + process_sarif_file(sarif_file, renamed_files_file) + print("SARIF file processed successfully") + except Exception as e: + print(f"Error processing SARIF file: {e}") + import traceback + traceback.print_exc() + sys.exit(1) + +if __name__ == "__main__": + main() diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index fb0badd78ec..9b2c6bccab1 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -7,6 +7,10 @@ on: - master pull_request: paths: + - "**/*.c" + - "**/*.cpp" + - "**/*.h" + - "**/*.ino" - "**/*.py" - ".github/workflows/*.yml" - ".github/workflows/*.yaml" @@ -17,15 +21,48 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - language: [python, actions] + language: [python, actions, cpp] steps: - name: Checkout repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Process .ino files + if: matrix.language == 'cpp' + run: | + # Create a mapping file to track renamed files + echo "{}" > renamed_files.json + + # Find all .ino files and process them + find . -name "*.ino" -type f | while read -r file; do + echo "Processing $file" + + # Get the relative path from repository root + rel_path=$(realpath --relative-to=. "$file") + cpp_path="${rel_path%.ino}.cpp" + + # Create new .cpp file with Arduino.h include + echo "#include " > "$cpp_path" + + # Append the original content + cat "$file" >> "$cpp_path" + + # Update the mapping file + jq --arg ino "$rel_path" --arg cpp "$cpp_path" '. += {($cpp): $ino}' renamed_files.json > temp.json && mv temp.json renamed_files.json + + # Remove the original .ino file + rm "$file" + + echo "Converted $file to $cpp_path" + done + + echo "Renamed files mapping:" + cat renamed_files.json + - name: Initialize CodeQL uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 with: + build-mode: none languages: ${{ matrix.language }} config-file: ./.github/codeql/codeql-config.yml @@ -33,3 +70,19 @@ jobs: uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 with: category: "/language:${{ matrix.language }}" + output: sarif-results + upload: failure-only + + - name: Process SARIF file + if: matrix.language == 'cpp' + run: | + sarif_file="sarif-results/${{ matrix.language }}.sarif" + + # Run the Python script to process the SARIF file + python3 .github/scripts/process_sarif.py "$sarif_file" "renamed_files.json" + + - name: Upload SARIF file + uses: github/codeql-action/upload-sarif@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 + with: + sarif_file: sarif-results/${{ matrix.language }}.sarif + category: "/language:${{ matrix.language }}" From 81cc594e63f50d5f3c2045b0cb069f06ff46fc27 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Sun, 3 Aug 2025 17:32:18 -0300 Subject: [PATCH 286/290] fix(push): Fix typo in yaml --- .github/workflows/push.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index fc85566aa8b..48530e30bc9 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -96,7 +96,7 @@ jobs: - 'libraries/Network/src/**' fs: - 'libraries/FS/src/**' - static_sketeches: + static_sketches: - 'libraries/NetworkClientSecure/examples/WiFiClientSecure/WiFiClientSecure.ino' - 'libraries/BLE/examples/Server/Server.ino' - 'libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino' @@ -112,7 +112,7 @@ jobs: IS_PR: ${{ github.event_name == 'pull_request' }} MAX_CHUNKS: ${{ env.MAX_CHUNKS }} BUILD_LIBRARIES: ${{ steps.changed-files.outputs.libraries_any_changed == 'true' }} - BUILD_STATIC_SKETCHES: ${{ steps.changed-files.outputs.static_sketeches_any_changed == 'true' }} + BUILD_STATIC_SKETCHES: ${{ steps.changed-files.outputs.static_sketches_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' }} From f6b1910e8ba5a9aff99fa00b2133b10f34f85e4f Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Fri, 8 Aug 2025 10:22:19 -0300 Subject: [PATCH 287/290] fix(codeql): Remove rule causing false positives --- .github/codeql/codeql-config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml index c640d7bd6ef..1c284c9d68e 100644 --- a/.github/codeql/codeql-config.yml +++ b/.github/codeql/codeql-config.yml @@ -20,7 +20,9 @@ query-filters: problem.severity: - recommendation - exclude: - id: tob/cpp/use-of-legacy-algorithm + id: tob/cpp/use-of-legacy-algorithm # We use legacy algorithms in many places for integrity checks + - exclude: + id: cpp/dead-code-goto # Too many false positives in no-build mode paths-ignore: - tests/** From 9d13bcc674bb7176df5d52f319a6cb1b16e17653 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 13 Aug 2025 22:15:41 -0300 Subject: [PATCH 288/290] fix(tests): Change results folder --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/tests.yml | 36 ++++++++++++++++++++++++++++- .github/workflows/tests_build.yml | 6 ++--- .github/workflows/tests_hw.yml | 31 +++++++++++++++++++++---- .github/workflows/tests_qemu.yml | 8 +++---- .github/workflows/tests_results.yml | 12 +++++----- .github/workflows/tests_wokwi.yml | 22 +++++++++++++----- README.md | 2 +- 8 files changed, 93 insertions(+), 26 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 5e0d99c0457..6a803943690 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -13,7 +13,7 @@ ## Description of Change Please describe your proposed Pull Request and it's impact. -## Tests scenarios +## Test Scenarios Please describe on what Hardware and Software combinations you have tested this Pull Request and how. (*eg. I have tested my Pull Request on Arduino-esp32 core v2.0.2 with ESP32 and ESP32-S2 Board with this scenario*) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 058d9a3a793..925855844ac 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -28,7 +28,7 @@ on: - "!*.md" - "!*.properties" schedule: - - cron: "0 2 * * *" + - cron: "0 0 * * *" concurrency: group: tests-${{ github.event.pull_request.number || github.ref }} @@ -45,9 +45,43 @@ jobs: name: event_file path: ${{ github.event_path }} + check-last-run: + name: Check last run + runs-on: ubuntu-latest + outputs: + run_tests: ${{ steps.last-run.outputs.run_tests }} + steps: + - name: Checkout + if: github.event_name != 'pull_request' + # if: github.event_name == 'schedule' + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: gh-pages + + - name: Get last run commit and compare with current commit + id: last-run + run: | + if [ ${{ github.event_name }} != 'pull_request' ]; then + # if [ ${{ github.event_name }} == 'schedule' ]; then + last_run_commit=$(jq -r '.commit_sha' ./runtime-test-results/test_results.json) + current_commit=${{ github.sha }} + if [ "$last_run_commit" == "$current_commit" ]; then + echo "Last run commit and current commit are the same. Skipping tests..." + echo "run_tests=false" >> $GITHUB_OUTPUT + else + echo "Last run commit and current commit are different. Running tests..." + echo "run_tests=true" >> $GITHUB_OUTPUT + fi + else + echo "Not a schedule event. Continuing..." + echo "run_tests=true" >> $GITHUB_OUTPUT + fi + gen-matrix: name: Generate matrix runs-on: ubuntu-latest + if: ${{ needs.check-last-run.outputs.run_tests }} + needs: check-last-run outputs: build-types: ${{ steps.set-matrix.outputs.build-types }} hw-types: ${{ steps.set-matrix.outputs.hw-types }} diff --git a/.github/workflows/tests_build.yml b/.github/workflows/tests_build.yml index ac1f40644ed..c74224941af 100644 --- a/.github/workflows/tests_build.yml +++ b/.github/workflows/tests_build.yml @@ -24,7 +24,7 @@ jobs: if: github.event.pull_request.number != null uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: - key: tests-${{ env.id }}-bin + key: test-${{ env.id }}-bin path: | ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.bin ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.elf @@ -71,7 +71,7 @@ jobs: uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 if: steps.check-build.outputs.enabled == 'true' && github.event.pull_request.number != null with: - key: tests-${{ env.id }}-bin + key: test-${{ env.id }}-bin path: | ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.bin ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.elf @@ -81,7 +81,7 @@ jobs: - name: Upload ${{ inputs.chip }} ${{ inputs.type }} binaries as artifacts uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: - name: tests-bin-${{ inputs.chip }}-${{ inputs.type }} + name: test-bin-${{ inputs.chip }}-${{ inputs.type }} overwrite: true path: | ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.bin diff --git a/.github/workflows/tests_hw.yml b/.github/workflows/tests_hw.yml index 6f5fc67f7b9..d9fb755c94a 100644 --- a/.github/workflows/tests_hw.yml +++ b/.github/workflows/tests_hw.yml @@ -39,7 +39,7 @@ jobs: if: github.event.pull_request.number != null uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: - key: tests-${{ env.id }}-results-hw + key: test-${{ env.id }}-results-hw path: | tests/**/*.xml tests/**/result_*.json @@ -61,6 +61,7 @@ jobs: if: ${{ steps.check-tests.outputs.enabled == 'true' }} uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: + # Workaround for missing files in checkout sparse-checkout: | * @@ -84,7 +85,7 @@ jobs: if: ${{ steps.check-tests.outputs.enabled == 'true' }} uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 with: - name: tests-bin-${{ inputs.chip }}-${{ inputs.type }} + name: test-bin-${{ inputs.chip }}-${{ inputs.type }} path: | ~/.arduino/tests/${{ inputs.chip }} @@ -102,7 +103,7 @@ jobs: uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 if: steps.check-tests.outputs.enabled == 'true' && github.event.pull_request.number != null with: - key: tests-${{ env.id }}-results-hw + key: test-${{ env.id }}-results-hw path: | tests/**/*.xml tests/**/result_*.json @@ -111,7 +112,29 @@ jobs: uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: always() with: - name: tests-results-hw-${{ inputs.chip }}-${{ inputs.type }} + name: test-results-hw-${{ inputs.chip }}-${{ inputs.type }} + overwrite: true + path: | + tests/**/*.xml + tests/**/result_*.json + + gitlab-tests: + name: Internal Hardware tests + runs-on: ubuntu-latest + if: false + # if: github.event_name == 'schedule' + steps: + # The decision to run the tests will be made inside GitLab + # GitLab should only perform the actual test execution and save the results as artifacts in + # a format that can be downloaded and parsed by this GitHub Actions workflow. + + + + - name: Upload Internal Hardware test results as artifacts + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + if: always() + with: + name: test-results-gitlab overwrite: true path: | tests/**/*.xml diff --git a/.github/workflows/tests_qemu.yml b/.github/workflows/tests_qemu.yml index fa3f874cbbb..d9ddf6e1b0c 100644 --- a/.github/workflows/tests_qemu.yml +++ b/.github/workflows/tests_qemu.yml @@ -23,7 +23,7 @@ jobs: if: github.event.pull_request.number != null uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: - key: tests-${{ env.id }}-results-qemu + key: test-${{ env.id }}-results-qemu path: | tests/**/*.xml tests/**/result_*.json @@ -115,7 +115,7 @@ jobs: if: ${{ steps.check-tests.outputs.enabled == 'true' }} uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 with: - name: tests-bin-${{ inputs.chip }}-${{ inputs.type }} + name: test-bin-${{ inputs.chip }}-${{ inputs.type }} path: | ~/.arduino/tests/${{ inputs.chip }} @@ -127,7 +127,7 @@ jobs: uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 if: steps.check-tests.outputs.enabled == 'true' && github.event.pull_request.number != null with: - key: tests-${{ env.id }}-results-qemu + key: test-${{ env.id }}-results-qemu path: | tests/**/*.xml tests/**/result_*.json @@ -136,7 +136,7 @@ jobs: uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: always() with: - name: tests-results-qemu-${{ inputs.chip }}-${{ inputs.type }} + name: test-results-qemu-${{ inputs.chip }}-${{ inputs.type }} overwrite: true path: | tests/**/*.xml diff --git a/.github/workflows/tests_results.yml b/.github/workflows/tests_results.yml index ebba2a3aa08..28227bfd3b1 100644 --- a/.github/workflows/tests_results.yml +++ b/.github/workflows/tests_results.yml @@ -113,7 +113,7 @@ jobs: with: script: | const ref = process.env.original_ref; - const key_prefix = 'tests-' + ref + '-'; + const key_prefix = 'test-' + ref + '-'; if (process.env.original_event == 'pull_request' && process.env.original_action != 'closed') { console.log('Skipping cache cleanup for open PR'); @@ -163,15 +163,15 @@ jobs: - name: Generate report if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled env: - REPORT_FILE: ./runtime-tests-results/RUNTIME_TESTS_REPORT.md + REPORT_FILE: ./runtime-test-results/RUNTIME_TESTS_REPORT.md WOKWI_RUN_ID: ${{ github.event.workflow_run.id }} BUILD_RUN_ID: ${{ env.original_run_id }} IS_FAILING: ${{ env.original_conclusion == 'failure' || env.original_conclusion == 'timed_out' || github.event.workflow_run.conclusion == 'failure' || github.event.workflow_run.conclusion == 'timed_out' || job.status == 'failure' }} run: | rm -rf artifacts $REPORT_FILE - mv -f ./unity_results.json ./runtime-tests-results/unity_results.json + mv -f ./unity_results.json ./runtime-test-results/unity_results.json touch $REPORT_FILE - python3 ./runtime-tests-results/table_generator.py ./runtime-tests-results/unity_results.json >> $REPORT_FILE + python3 ./runtime-test-results/table_generator.py ./runtime-test-results/unity_results.json >> $REPORT_FILE - name: Generate badge if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled @@ -179,7 +179,7 @@ jobs: with: label: Runtime Tests status: ${{ job.status == 'success' && 'passing' || 'failing' }} - output: runtime-tests-results/badge.svg + output: runtime-test-results/badge.svg color: ${{ job.status == 'success' && 'green' || 'red' }} style: flat @@ -190,6 +190,6 @@ jobs: git config user.email "41898282+github-actions[bot]@users.noreply.github.com" if [[ `git status --porcelain` ]]; then git add --all - git commit -m "Updated runtime tests report" + git commit -m "Updated runtime test results" git push origin HEAD:gh-pages fi diff --git a/.github/workflows/tests_wokwi.yml b/.github/workflows/tests_wokwi.yml index 03dd64fc0fb..6af66cf0e42 100644 --- a/.github/workflows/tests_wokwi.yml +++ b/.github/workflows/tests_wokwi.yml @@ -135,17 +135,27 @@ jobs: with: github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id }} - pattern: tests-results-hw-* + pattern: test-results-hw-* merge-multiple: true path: artifacts/results/hw + - name: Download and extract parent GitLab results + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 + continue-on-error: true + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + pattern: test-results-gitlab + merge-multiple: true + path: artifacts/results/gitlab + - name: Download and extract parent QEMU results uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 continue-on-error: true with: github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id }} - pattern: tests-results-qemu-* + pattern: test-results-qemu-* merge-multiple: true path: artifacts/results/qemu @@ -221,7 +231,7 @@ jobs: if: needs.get-artifacts.outputs.pr_num uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: - key: tests-${{ env.id }}-results-wokwi + key: test-${{ env.id }}-results-wokwi path: | tests/**/*.xml tests/**/result_*.json @@ -274,7 +284,7 @@ jobs: with: github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id }} - name: tests-bin-${{ matrix.chip }}-${{ matrix.type }} + name: test-bin-${{ matrix.chip }}-${{ matrix.type }} path: | ~/.arduino/tests/${{ matrix.chip }} @@ -289,7 +299,7 @@ jobs: uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 if: steps.check-tests.outputs.enabled == 'true' && needs.get-artifacts.outputs.pr_num with: - key: tests-${{ env.id }}-results-wokwi + key: test-${{ env.id }}-results-wokwi path: | tests/**/*.xml tests/**/result_*.json @@ -298,7 +308,7 @@ jobs: uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: always() with: - name: tests-results-wokwi-${{ matrix.chip }}-${{ matrix.type }} + name: test-results-wokwi-${{ matrix.chip }}-${{ matrix.type }} overwrite: true path: | tests/**/*.xml diff --git a/README.md b/README.md index f40315c03cc..f8ff1f28eaa 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![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/blob/gh-pages/runtime-tests-results/RUNTIME_TESTS_REPORT.md) +[![Runtime Tests](https://github.com/espressif/arduino-esp32/blob/gh-pages/runtime-test-results/badge.svg)](https://github.com/espressif/arduino-esp32/blob/gh-pages/runtime-test-results/RUNTIME_TEST_RESULTS.md) ### 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) From e38dba808f2a189e53d2e683f2d0faa8085e7605 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 13 Aug 2025 22:22:53 -0300 Subject: [PATCH 289/290] fix(tests): Fix last commit check --- .github/workflows/tests.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 925855844ac..4b915cf36de 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -63,13 +63,19 @@ jobs: run: | if [ ${{ github.event_name }} != 'pull_request' ]; then # if [ ${{ github.event_name }} == 'schedule' ]; then - last_run_commit=$(jq -r '.commit_sha' ./runtime-test-results/test_results.json) + if [ -f ./runtime-test-results/test_results.json ]; then + last_run_commit=$(jq -r '.commit_sha' ./runtime-test-results/test_results.json) + last_run_failed=$(jq -r '.tests_failed' ./runtime-test-results/test_results.json) + else + last_run_commit="none" + last_run_failed="true" + fi current_commit=${{ github.sha }} - if [ "$last_run_commit" == "$current_commit" ]; then + if [ "$last_run_commit" == "$current_commit" ] && [ "$last_run_failed" == "false" ]; then echo "Last run commit and current commit are the same. Skipping tests..." echo "run_tests=false" >> $GITHUB_OUTPUT else - echo "Last run commit and current commit are different. Running tests..." + echo "Last run commit and current commit are different or last run failed. Running tests..." echo "run_tests=true" >> $GITHUB_OUTPUT fi else From ead6c1cc9485d1f68d369c643c3efd8358f2a283 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 13 Aug 2025 23:52:27 -0300 Subject: [PATCH 290/290] fix(tests): Move results to proper folder --- .github/workflows/tests_hw.yml | 22 ---------------------- .github/workflows/tests_results.yml | 1 + 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/.github/workflows/tests_hw.yml b/.github/workflows/tests_hw.yml index d9fb755c94a..e095ebe6dc8 100644 --- a/.github/workflows/tests_hw.yml +++ b/.github/workflows/tests_hw.yml @@ -117,25 +117,3 @@ jobs: path: | tests/**/*.xml tests/**/result_*.json - - gitlab-tests: - name: Internal Hardware tests - runs-on: ubuntu-latest - if: false - # if: github.event_name == 'schedule' - steps: - # The decision to run the tests will be made inside GitLab - # GitLab should only perform the actual test execution and save the results as artifacts in - # a format that can be downloaded and parsed by this GitHub Actions workflow. - - - - - name: Upload Internal Hardware test results as artifacts - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - if: always() - with: - name: test-results-gitlab - overwrite: true - path: | - tests/**/*.xml - tests/**/result_*.json diff --git a/.github/workflows/tests_results.yml b/.github/workflows/tests_results.yml index 28227bfd3b1..56883ecf52e 100644 --- a/.github/workflows/tests_results.yml +++ b/.github/workflows/tests_results.yml @@ -172,6 +172,7 @@ jobs: mv -f ./unity_results.json ./runtime-test-results/unity_results.json touch $REPORT_FILE python3 ./runtime-test-results/table_generator.py ./runtime-test-results/unity_results.json >> $REPORT_FILE + mv -f ./test_results.json ./runtime-test-results/test_results.json - name: Generate badge if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled

    *ptM@WNYc*CowO^YW?Cx0Nz9(wGHZ8tH; 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 p-}>{(!?V9VeR=xcqZxe( +#include +#include +#include +#include +#include +#ifdef DISPLAY_ENABLED +#define SCREEN_WIDTH 128 +#define SCREEN_HEIGHT 64 +#define OLED_RESET -1 +#include +#include +Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); +#include +Adafruit_NeoPixel rgb_led_1 = Adafruit_NeoPixel(1, 1, NEO_GRB + NEO_KHZ800); + +#endif +#include "esp_partition.h" +#include "esp_ota_ops.h" +#include "esp_system.h" + +String ssid; +uint8_t mac[6]; + +// Create an instance of the server +WebServer server(80); +bool displayEnabled; + +const int BUTTON_PIN = 0; // GPIO for the button +volatile unsigned long lastPressTime = 0; // Time of last button press +volatile bool doublePressDetected = false; // Flag for double press +const unsigned long doublePressInterval = 500; // Max. time (in ms) between two presses for double press +volatile int pressCount = 0; // Counts the button presses + +const unsigned char epd_bitmap_wifi[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0xff, 0x00, 0x00, + 0x00, 0x3f, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x7c, 0x00, 0x03, 0xe0, 0x00, 0x00, 0xf0, 0x00, 0x01, 0xf0, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x78, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x7f, 0xe0, 0x0e, 0x00, + 0x0c, 0x01, 0xff, 0xf0, 0x06, 0x00, 0x00, 0x07, 0xff, 0xfc, 0x02, 0x00, 0x00, 0x0f, 0x80, 0x3e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x07, 0x80, 0x00, 0x00, 0x38, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x70, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x01, 0xe0, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x78, 0x00, 0x00, 0x00, 0x03, 0x80, 0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +// 'checkmark', 44x44px +const unsigned char epd_bitmap_checkmark[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0x83, 0xc0, 0x00, 0x00, 0x00, 0x07, 0xc7, 0x80, 0x00, 0x00, 0x00, 0x03, 0xef, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +void IRAM_ATTR handleButtonPress() { + unsigned long currentTime = millis(); // Get current time + + // Debounce: If the current press is too close to the last one, ignore it + if (currentTime - lastPressTime > 50) { + pressCount++; // Count the button press + + // Check if this is the second press within the double-press interval + if (pressCount == 2 && (currentTime - lastPressTime <= doublePressInterval)) { + doublePressDetected = true; // Double press detected + pressCount = 0; // Reset counter + } + + lastPressTime = currentTime; // Update the time of the last press + } +} + +// Function to switch the boot partition to OTA1 +void setBootPartitionToOTA0() { + const esp_partition_t *ota0_partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_0, NULL); + + if (ota0_partition) { + // Set OTA1 as new boot partition + esp_ota_set_boot_partition(ota0_partition); + Serial.println("Boot partition changed to OTA0. Restarting..."); + + // Restart to boot from the new partition + esp_restart(); + } else { + Serial.println("OTA1 partition not found!"); + } +} + +void setupDisplay() { + displayEnabled = display.begin(SSD1306_SWITCHCAPVCC, 0x3D); + if (displayEnabled) { + display.display(); + delay(100); + display.clearDisplay(); + } +} + +void displayStatusBar(int progress) { + display.clearDisplay(); + display.setCursor(24, 8); + display.println("Sketch wird"); + display.setCursor(22, 22); + display.println("hochgeladen!"); + + display.fillRect(0, SCREEN_HEIGHT - 24, SCREEN_WIDTH - 4, 8, BLACK); // Clear status bar area + display.drawRect(0, SCREEN_HEIGHT - 24, SCREEN_WIDTH - 4, 8, WHITE); // Draw border + int filledWidth = (progress * SCREEN_WIDTH - 4) / 100; // Calculate progress width + display.fillRect(1, SCREEN_HEIGHT - 23, filledWidth - 4, 6, WHITE); // Fill progress bar + + display.setCursor((SCREEN_WIDTH / 2) - 12, SCREEN_HEIGHT - 10); + display.setTextSize(1); + display.setTextColor(WHITE, BLACK); + display.print(progress); + display.println(" %"); + display.display(); +} + +void displayWelcomeScreen() { + display.clearDisplay(); + + // Draw WiFi symbol + display.drawBitmap(0, 12, epd_bitmap_wifi, 44, 44, WHITE); + + // Display SSID text + display.setCursor(40, 13); + display.setTextSize(1); + display.setTextColor(WHITE, BLACK); + display.println("Verbinde dich"); // "Connect" + display.setCursor(60, 27); + display.println("mit:"); // "with" + + // Display SSID + display.setCursor(40, 43); + display.setTextSize(1); // Larger text for SSID + display.print(ssid); + + display.display(); +} + +void displaySuccessScreen() { + display.clearDisplay(); + + // Draw WiFi symbol + display.drawBitmap(0, 12, epd_bitmap_checkmark, 44, 44, WHITE); + + // Display SSID text + display.setCursor(48, 22); + display.setTextSize(1); + display.setTextColor(WHITE, BLACK); + display.println("Erfolgreich"); // "Successfully" + display.setCursor(48, 36); + display.println("hochgeladen!"); // "uploaded!" + + display.display(); +} + +void wipeDisplay() { + display.clearDisplay(); + display.println(""); + display.display(); +} + +void setupWiFi() { + WiFi.macAddress(mac); + char macLastFour[5]; + snprintf(macLastFour, sizeof(macLastFour), "%02X%02X", mac[4], mac[5]); + ssid = "senseBox:" + String(macLastFour); + + // Define the IP address, gateway, and subnet mask + IPAddress local_IP(192, 168, 1, 1); // The new IP address + IPAddress gateway(192, 168, 1, 1); // Gateway address (can be the same as the AP's IP) + IPAddress subnet(255, 255, 255, 0); // Subnet mask + + // Set the IP address, gateway, and subnet mask of the access point + WiFi.softAPConfig(local_IP, gateway, subnet); + + // Start the access point + WiFi.softAP(ssid.c_str()); +} + +void setupOTA() { + // Handle updating process + server.on( + "/sketch", HTTP_POST, + []() { + server.sendHeader("Connection", "close"); + server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK"); + ESP.restart(); + }, + []() { + HTTPUpload &upload = server.upload(); + + if (upload.status == UPLOAD_FILE_START) { + Serial.setDebugOutput(true); + size_t fsize = UPDATE_SIZE_UNKNOWN; + if (server.clientContentLength() > 0) { + fsize = server.clientContentLength(); + } + Serial.printf("Receiving Update: %s, Size: %d\n", upload.filename.c_str(), fsize); + + Serial.printf("Update: %s\n", upload.filename.c_str()); + if (!Update.begin(fsize)) { //start with max available size + Update.printError(Serial); + } + } else if (upload.status == UPLOAD_FILE_WRITE) { + /* flashing firmware to ESP*/ + if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { + Update.printError(Serial); + } else { + int progress = (Update.progress() * 100) / Update.size(); + displayStatusBar(progress); // Update progress on status bar + } + } else if (upload.status == UPLOAD_FILE_END) { + if (Update.end(true)) { //true to set the size to the current progress + displaySuccessScreen(); + delay(3000); + wipeDisplay(); + } else { + Update.printError(Serial); + } + Serial.setDebugOutput(false); + } + yield(); + } + ); +} + +void setup() { + // Start Serial communication + Serial.begin(115200); + rgb_led_1.begin(); + rgb_led_1.setBrightness(30); + rgb_led_1.setPixelColor(0, rgb_led_1.Color(51, 51, 255)); + rgb_led_1.show(); + + // Configure button pin as input + pinMode(BUTTON_PIN, INPUT_PULLUP); + + // Interrupt for the button + attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), handleButtonPress, FALLING); + +#ifdef DISPLAY_ENABLED + setupDisplay(); +#endif + setupWiFi(); + // Set the ESP32 as an access point + setupOTA(); + server.begin(); +} + +void loop() { + // Handle client requests + server.handleClient(); + +#ifdef DISPLAY_ENABLED + displayWelcomeScreen(); +#endif + + if (doublePressDetected) { + Serial.println("Doppeldruck erkannt!"); // "Double press detected!" + setBootPartitionToOTA0(); +#ifdef DISPLAY_ENABLED + display.setCursor(0, 0); + display.setTextSize(1); + display.setTextColor(WHITE, BLACK); + display.println(""); + display.display(); + delay(50); +#endif + // Restart to boot from the new partition + esp_restart(); + } +} diff --git a/variants/sensebox_mcu_esp32s2/variant.cpp b/variants/sensebox_mcu_esp32s2/variant.cpp index 0c58ef2cbe2..aa1eb3dc7c5 100644 --- a/variants/sensebox_mcu_esp32s2/variant.cpp +++ b/variants/sensebox_mcu_esp32s2/variant.cpp @@ -1,29 +1,10 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2021 Ha Thach (tinyusb.org) for Adafruit Industries - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - #include "esp32-hal-gpio.h" #include "pins_arduino.h" +#include "esp_partition.h" +#include "esp_system.h" +#include "esp_ota_ops.h" +#include "esp_log.h" +#include extern "C" { @@ -41,12 +22,51 @@ void initVariant(void) { pinMode(PIN_XB1_ENABLE, OUTPUT); digitalWrite(PIN_XB1_ENABLE, LOW); - //enable UART by default - pinMode(PIN_UART_ENABLE, OUTPUT); - digitalWrite(PIN_UART_ENABLE, LOW); + //enable UART only for chip without PSRAM + esp_chip_info_t chip_info; + esp_chip_info(&chip_info); + if (chip_info.revision <= 0) { + pinMode(PIN_UART_ENABLE, OUTPUT); + digitalWrite(PIN_UART_ENABLE, LOW); + } //enable PD-Sensor by default pinMode(PD_ENABLE, OUTPUT); digitalWrite(PD_ENABLE, HIGH); + + // define button pin + const int PIN_BUTTON = 0; + pinMode(PIN_BUTTON, INPUT_PULLUP); + + // keep button pressed + unsigned long pressStartTime = 0; + bool buttonPressed = false; + + // Wait 5 seconds for the button to be pressed + unsigned long startTime = millis(); + + // Check if button is pressed + while (millis() - startTime < 5000) { + if (digitalRead(PIN_BUTTON) == LOW) { + if (!buttonPressed) { + // The button was pressed + buttonPressed = true; + } + } else if (buttonPressed) { + // When the button is pressed and then released, boot into the OTA1 partition + const esp_partition_t *ota1_partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_1, NULL); + + if (ota1_partition) { + esp_err_t err = esp_ota_set_boot_partition(ota1_partition); + if (err == ESP_OK) { + esp_restart(); // restart, to boot OTA1 partition + } else { + ESP_LOGE("OTA", "Error setting OTA1 partition: %s", esp_err_to_name(err)); + } + } + // Abort after releasing the button + break; + } + } } } From d4e5c5f969aba994e3e1c1994348bffb9856e95a Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 3 Jul 2025 12:25:33 +0300 Subject: [PATCH 209/290] IDF release/v5.5 adb3f2a5 (#11543) IDF release/v5.5 adb3f2a5 --- 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 1d753792b43..a02be509094 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.5-cbe9388f-v1" + "version": "idf-release_v5.5-adb3f2a5-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.5-cbe9388f-v1", + "version": "idf-release_v5.5-adb3f2a5-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", - "size": "421300036" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", + "size": "430508851" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", - "size": "421300036" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", + "size": "430508851" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", - "size": "421300036" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", + "size": "430508851" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", - "size": "421300036" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", + "size": "430508851" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", - "size": "421300036" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", + "size": "430508851" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", - "size": "421300036" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", + "size": "430508851" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", - "size": "421300036" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", + "size": "430508851" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cbe9388f-v1.zip", - "checksum": "SHA-256:b737ffb86a1b377db12dd610d06936ca8d85d877c872f532a68f6f0a3f666a3f", - "size": "421300036" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", + "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", + "size": "430508851" } ] }, From c2d23258f197d0f3422c31e75ab848919fc097bb Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Thu, 3 Jul 2025 06:25:51 -0300 Subject: [PATCH 210/290] feat(matter): enables BLE Matter commissioning with NimBLE (#11537) * feat(matter): enables BLE Matter commissioning with NimBLE * fix(matter): commentary typo and formatting * fix(matter): commentary typo and formatting * fix(matter): removes forcing second network clustter * fix(matter): adds matter source code to CMakeLists.txt * 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 | 3 +- .../MatterColorLight/MatterColorLight.ino | 15 +- .../MatterCommissionTest.ino | 13 +- .../MatterComposedLights.ino | 13 +- .../MatterContactSensor.ino | 13 +- .../MatterDimmableLight.ino | 15 +- .../MatterEnhancedColorLight.ino | 15 +- .../examples/MatterEvents/MatterEvents.ino | 9 ++ .../Matter/examples/MatterFan/MatterFan.ino | 15 +- .../MatterHumiditySensor.ino | 13 +- .../examples/MatterMinimum/MatterMinimum.ino | 11 +- .../MatterOccupancySensor.ino | 13 +- .../MatterOnIdentify/MatterOnIdentify.ino | 13 +- .../MatterOnOffLight/MatterOnOffLight.ino | 15 +- .../MatterOnOffPlugin/MatterOnOffPlugin.ino | 15 +- .../MatterPressureSensor.ino | 13 +- .../MatterSmartButon/MatterSmartButon.ino | 15 +- .../MatterTemperatureLight.ino | 15 +- .../MatterTemperatureSensor.ino | 13 +- .../MatterThermostat/MatterThermostat.ino | 13 +- libraries/Matter/src/Matter.cpp | 18 ++- libraries/Matter/src/Matter.h | 2 +- libraries/Matter/src/MatterEndPoint.cpp | 139 ++++++++++++++++++ libraries/Matter/src/MatterEndPoint.h | 117 +++++---------- .../src/MatterEndpoints/MatterColorLight.cpp | 2 +- .../src/MatterEndpoints/MatterColorLight.h | 2 +- .../MatterColorTemperatureLight.cpp | 2 +- .../MatterColorTemperatureLight.h | 2 +- .../MatterEndpoints/MatterContactSensor.cpp | 3 +- .../src/MatterEndpoints/MatterContactSensor.h | 2 +- .../MatterEndpoints/MatterDimmableLight.cpp | 2 +- .../src/MatterEndpoints/MatterDimmableLight.h | 2 +- .../MatterEnhancedColorLight.cpp | 2 +- .../MatterEnhancedColorLight.h | 2 +- .../Matter/src/MatterEndpoints/MatterFan.cpp | 3 +- .../Matter/src/MatterEndpoints/MatterFan.h | 2 +- .../MatterEndpoints/MatterGenericSwitch.cpp | 3 +- .../src/MatterEndpoints/MatterGenericSwitch.h | 2 +- .../MatterEndpoints/MatterHumiditySensor.cpp | 3 +- .../MatterEndpoints/MatterHumiditySensor.h | 2 +- .../MatterEndpoints/MatterOccupancySensor.cpp | 3 +- .../MatterEndpoints/MatterOccupancySensor.h | 2 +- .../src/MatterEndpoints/MatterOnOffLight.cpp | 3 +- .../src/MatterEndpoints/MatterOnOffLight.h | 2 +- .../src/MatterEndpoints/MatterOnOffPlugin.cpp | 3 +- .../src/MatterEndpoints/MatterOnOffPlugin.h | 2 +- .../MatterEndpoints/MatterPressureSensor.cpp | 3 +- .../MatterEndpoints/MatterPressureSensor.h | 2 +- .../MatterTemperatureSensor.cpp | 3 +- .../MatterEndpoints/MatterTemperatureSensor.h | 2 +- .../src/MatterEndpoints/MatterThermostat.cpp | 3 +- .../src/MatterEndpoints/MatterThermostat.h | 2 +- 52 files changed, 447 insertions(+), 155 deletions(-) create mode 100644 libraries/Matter/src/MatterEndPoint.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 20cfc2b0955..e71911c1e38 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -184,7 +184,8 @@ set(ARDUINO_LIBRARY_Matter_SRCS libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp libraries/Matter/src/MatterEndpoints/MatterThermostat.cpp - libraries/Matter/src/Matter.cpp) + libraries/Matter/src/Matter.cpp + libraries/Matter/src/MatterEndPoint.cpp) set(ARDUINO_LIBRARY_PPP_SRCS libraries/PPP/src/PPP.cpp diff --git a/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino b/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino index f3e45887576..e28c96e266c 100644 --- a/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino +++ b/libraries/Matter/examples/MatterColorLight/MatterColorLight.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -14,16 +14,22 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif #include // List of Matter Endpoints for this Node // Color Light Endpoint MatterColorLight ColorLight; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // it will keep last OnOff & HSV Color state stored, using Preferences Preferences matterPref; @@ -81,6 +87,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); @@ -95,6 +103,7 @@ void setup() { Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); +#endif // Initialize Matter EndPoint matterPref.begin("MatterPrefs", false); @@ -121,7 +130,7 @@ void setup() { 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.println("Matter Node is commissioned and connected to the network. 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 @@ -154,7 +163,7 @@ void loop() { ); // 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."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } // A button is also used to control the light diff --git a/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino b/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino index 0e93ed6d155..aa593758548 100644 --- a/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino +++ b/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -14,19 +14,27 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif // List of Matter Endpoints for this Node // On/Off Light Endpoint MatterOnOffLight OnOffLight; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); @@ -41,6 +49,7 @@ void setup() { Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); +#endif // Initialize at least one Matter EndPoint OnOffLight.begin(); @@ -64,7 +73,7 @@ void loop() { Serial.println("Matter Fabric not commissioned yet. Waiting for commissioning."); } } - Serial.println("Matter Node is commissioned and connected to Wi-Fi."); + Serial.println("Matter Node is commissioned and connected to the network."); Serial.println("====> Decommissioning in 30 seconds. <===="); delay(30000); Matter.decommission(); diff --git a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino index b98cc8e19c9..48a6db8bedd 100644 --- a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino +++ b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -14,7 +14,10 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif // List of Matter Endpoints for this Node // There will be 3 On/Off Light Endpoints in the same Node @@ -22,9 +25,12 @@ MatterOnOffLight Light1; MatterDimmableLight Light2; MatterColorLight Light3; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // 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. @@ -56,6 +62,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); @@ -71,6 +79,7 @@ void setup() { Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); +#endif // Initialize all 3 Matter EndPoints Light1.begin(); @@ -103,7 +112,7 @@ void loop() { Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); } } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } //displays the Light state every 5 seconds diff --git a/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino b/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino index e4c41460d3a..6472012a2ff 100644 --- a/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino +++ b/libraries/Matter/examples/MatterContactSensor/MatterContactSensor.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -30,15 +30,21 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif // List of Matter Endpoints for this Node // Matter Contact Sensor Endpoint MatterContactSensor ContactSensor; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // LED will be used to indicate the Contact Sensor state // set your board RGB LED pin here @@ -67,6 +73,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection @@ -75,6 +83,7 @@ void setup() { Serial.print("."); } Serial.println(); +#endif // set initial contact sensor state as false (default) ContactSensor.begin(); @@ -99,7 +108,7 @@ void setup() { Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); } } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } } diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index 79751905c20..2b853b25677 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -14,16 +14,22 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif #include // List of Matter Endpoints for this Node // Dimmable Light Endpoint MatterDimmableLight DimmableLight; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // it will keep last OnOff & Brightness state stored, using Preferences Preferences matterPref; @@ -77,6 +83,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); @@ -91,6 +99,7 @@ void setup() { Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); +#endif // Initialize Matter EndPoint matterPref.begin("MatterPrefs", false); @@ -116,7 +125,7 @@ void setup() { 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.println("Matter Node is commissioned and connected to the network. Ready for use."); Serial.printf("Initial state: %s | brightness: %d\r\n", DimmableLight ? "ON" : "OFF", DimmableLight.getBrightness()); // configure the Light based on initial on-off state and brightness DimmableLight.updateAccessory(); @@ -143,7 +152,7 @@ void loop() { Serial.printf("Initial state: %s | brightness: %d\r\n", DimmableLight ? "ON" : "OFF", DimmableLight.getBrightness()); // configure the Light based on initial on-off state and brightness DimmableLight.updateAccessory(); - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } // A button is also used to control the light diff --git a/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino index 8e12581fdf2..ac22ae768c5 100644 --- a/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino +++ b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -14,16 +14,22 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif #include // List of Matter Endpoints for this Node // Color Light Endpoint MatterEnhancedColorLight EnhancedColorLight; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // It will use HSV color to control all Matter Attribute Changes HsvColor_t currentHSVColor = {0, 0, 0}; @@ -85,6 +91,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); @@ -99,6 +107,7 @@ void setup() { Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); +#endif // Initialize Matter EndPoint matterPref.begin("MatterPrefs", false); @@ -143,7 +152,7 @@ void setup() { 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.println("Matter Node is commissioned and connected to the network. 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 @@ -176,7 +185,7 @@ void loop() { ); // 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."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } // A button is also used to control the light diff --git a/libraries/Matter/examples/MatterEvents/MatterEvents.ino b/libraries/Matter/examples/MatterEvents/MatterEvents.ino index dac599bf9fa..f33b13cf7fb 100644 --- a/libraries/Matter/examples/MatterEvents/MatterEvents.ino +++ b/libraries/Matter/examples/MatterEvents/MatterEvents.ino @@ -14,11 +14,17 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // List of Matter Endpoints for this Node // On/Off Light Endpoint @@ -119,6 +125,8 @@ void setup() { delay(10); // Wait for Serial to initialize } +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); @@ -134,6 +142,7 @@ void setup() { Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); +#endif // Initialize at least one Matter EndPoint OnOffLight.begin(); diff --git a/libraries/Matter/examples/MatterFan/MatterFan.ino b/libraries/Matter/examples/MatterFan/MatterFan.ino index 705aa4853da..ac620167a40 100644 --- a/libraries/Matter/examples/MatterFan/MatterFan.ino +++ b/libraries/Matter/examples/MatterFan/MatterFan.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -14,15 +14,21 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif // List of Matter Endpoints for this Node // Fan Endpoint - On/Off control + Speed Percent Control + Fan Modes MatterFan Fan; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // 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. @@ -76,6 +82,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); @@ -90,6 +98,7 @@ void setup() { Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); +#endif // 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); @@ -141,7 +150,7 @@ void setup() { 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.println("Matter Node is commissioned and connected to the network. Ready for use."); } } @@ -162,7 +171,7 @@ void loop() { Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); } } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } // A builtin button is used to trigger and send a command to the Matter Controller diff --git a/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino b/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino index 1c7889db849..3149cf1dfbe 100644 --- a/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino +++ b/libraries/Matter/examples/MatterHumiditySensor/MatterHumiditySensor.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -21,15 +21,21 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif // List of Matter Endpoints for this Node // Matter Humidity Sensor Endpoint MatterHumiditySensor SimulatedHumiditySensor; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // set your board USER BUTTON pin here - decommissioning button const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. @@ -60,6 +66,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection @@ -68,6 +76,7 @@ void setup() { Serial.print("."); } Serial.println(); +#endif // set initial humidity sensor measurement // Simulated Sensor - it shall initially print 95% and then move to the 10% to 30% humidity range @@ -92,7 +101,7 @@ void setup() { Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); } } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } } diff --git a/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino b/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino index db591ee2226..31599ad10cb 100644 --- a/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino +++ b/libraries/Matter/examples/MatterMinimum/MatterMinimum.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -22,15 +22,21 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif // List of Matter Endpoints for this Node // Single On/Off Light Endpoint - at least one per node MatterOnOffLight OnOffLight; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // Light GPIO that can be controlled by Matter APP #ifdef LED_BUILTIN @@ -62,6 +68,8 @@ void setup() { // Initialize the LED GPIO pinMode(ledPin, OUTPUT); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection @@ -73,6 +81,7 @@ void setup() { delay(500); } Serial.println(); +#endif // Initialize at least one Matter EndPoint OnOffLight.begin(); diff --git a/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino b/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino index 333f178e9de..ecab016b473 100644 --- a/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino +++ b/libraries/Matter/examples/MatterOccupancySensor/MatterOccupancySensor.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -28,15 +28,21 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif // List of Matter Endpoints for this Node // Matter Occupancy Sensor Endpoint MatterOccupancySensor OccupancySensor; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // set your board USER BUTTON pin here - decommissioning only const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. @@ -52,6 +58,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection @@ -60,6 +68,7 @@ void setup() { Serial.print("."); } Serial.println(); +#endif // set initial occupancy sensor state as false and connected to a PIR sensor type (default) OccupancySensor.begin(); @@ -83,7 +92,7 @@ void setup() { Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); } } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } } diff --git a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino index b2e77900e95..ec7129ecad9 100644 --- a/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino +++ b/libraries/Matter/examples/MatterOnIdentify/MatterOnIdentify.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -26,15 +26,21 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif // List of Matter Endpoints for this Node // Single On/Off Light Endpoint - at least one per node MatterOnOffLight OnOffLight; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // Light GPIO that can be controlled by Matter APP #ifdef LED_BUILTIN @@ -88,6 +94,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection @@ -96,6 +104,7 @@ void setup() { Serial.print("."); } Serial.println(); +#endif // Initialize at least one Matter EndPoint OnOffLight.begin(); @@ -125,7 +134,7 @@ void setup() { Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); } } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } } diff --git a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino index 5faa0a385b0..3310cb8c4e9 100644 --- a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino +++ b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -14,12 +14,18 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif #include +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // List of Matter Endpoints for this Node // On/Off Light Endpoint @@ -68,6 +74,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); @@ -82,6 +90,7 @@ void setup() { Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); +#endif // Initialize Matter EndPoint matterPref.begin("MatterPrefs", false); @@ -93,7 +102,7 @@ void setup() { 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.println("Matter Node is commissioned and connected to the network. Ready for use."); Serial.printf("Initial state: %s\r\n", OnOffLight.getOnOff() ? "ON" : "OFF"); OnOffLight.updateAccessory(); // configure the Light based on initial state } @@ -118,7 +127,7 @@ void loop() { } Serial.printf("Initial state: %s\r\n", OnOffLight.getOnOff() ? "ON" : "OFF"); OnOffLight.updateAccessory(); // configure the Light based on initial state - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } // A button is also used to control the light diff --git a/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino b/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino index d14e2189ec1..372874ddc9a 100644 --- a/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino +++ b/libraries/Matter/examples/MatterOnOffPlugin/MatterOnOffPlugin.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -14,16 +14,22 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif #include // List of Matter Endpoints for this Node // On/Off Plugin Endpoint MatterOnOffPlugin OnOffPlugin; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // it will keep last OnOff state stored, using Preferences Preferences matterPref; @@ -67,6 +73,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); @@ -80,6 +88,7 @@ void setup() { Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); +#endif // Initialize Matter EndPoint matterPref.begin("MatterPrefs", false); @@ -91,7 +100,7 @@ void setup() { 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.println("Matter Node is commissioned and connected to the network. Ready for use."); Serial.printf("Initial state: %s\r\n", OnOffPlugin.getOnOff() ? "ON" : "OFF"); OnOffPlugin.updateAccessory(); // configure the Plugin based on initial state } @@ -116,7 +125,7 @@ void loop() { } 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."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } // Check if the button has been pressed diff --git a/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino b/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino index db035e951c9..0a097ec979b 100644 --- a/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino +++ b/libraries/Matter/examples/MatterPressureSensor/MatterPressureSensor.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -21,15 +21,21 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif // List of Matter Endpoints for this Node // Matter Pressure Sensor Endpoint MatterPressureSensor SimulatedPressureSensor; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // set your board USER BUTTON pin here - decommissioning button const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. @@ -60,6 +66,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection @@ -68,6 +76,7 @@ void setup() { Serial.print("."); } Serial.println(); +#endif // set initial pressure sensor measurement // Simulated Sensor - it shall initially print 900hPa and then move to the 950 to 1100 hPa as pressure range @@ -92,7 +101,7 @@ void setup() { Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); } } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } } diff --git a/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino b/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino index f8da970595d..29caf00004c 100644 --- a/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino +++ b/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -14,15 +14,21 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif // List of Matter Endpoints for this Node // Generic Switch Endpoint - works as a smart button with a single click MatterGenericSwitch SmartButton; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // set your board USER BUTTON pin here const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. @@ -43,6 +49,8 @@ void setup() { Serial.print("Connecting to "); Serial.println(ssid); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection @@ -54,6 +62,7 @@ void setup() { Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); +#endif // Initialize the Matter EndPoint SmartButton.begin(); @@ -62,7 +71,7 @@ void setup() { 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.println("Matter Node is commissioned and connected to the network. Ready for use."); } } @@ -83,7 +92,7 @@ void loop() { Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); } } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } // A builtin button is used to trigger a command to the Matter Controller diff --git a/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino b/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino index d46427591ab..b7fcc11d873 100644 --- a/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino +++ b/libraries/Matter/examples/MatterTemperatureLight/MatterTemperatureLight.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -14,16 +14,22 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif #include // List of Matter Endpoints for this Node // Color Temperature CW/WW Light Endpoint MatterColorTemperatureLight CW_WW_Light; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // it will keep last OnOff & Brightness state stored, using Preferences Preferences matterPref; @@ -88,6 +94,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); @@ -102,6 +110,7 @@ void setup() { Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); +#endif // Initialize Matter EndPoint matterPref.begin("MatterPrefs", false); @@ -133,7 +142,7 @@ void setup() { 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.println("Matter Node is commissioned and connected to the network. 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() @@ -166,7 +175,7 @@ void loop() { ); // 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."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } // A button is also used to control the light diff --git a/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino b/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino index 086155aeffe..46d6ace361f 100644 --- a/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino +++ b/libraries/Matter/examples/MatterTemperatureSensor/MatterTemperatureSensor.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -21,15 +21,21 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif // List of Matter Endpoints for this Node // Matter Temperature Sensor Endpoint MatterTemperatureSensor SimulatedTemperatureSensor; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // set your board USER BUTTON pin here - decommissioning button const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. @@ -60,6 +66,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection @@ -68,6 +76,7 @@ void setup() { Serial.print("."); } Serial.println(); +#endif // set initial temperature sensor measurement // Simulated Sensor - it shall initially print -25C and then move to the -10C to 10C range @@ -92,7 +101,7 @@ void setup() { Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); } } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); } } diff --git a/libraries/Matter/examples/MatterThermostat/MatterThermostat.ino b/libraries/Matter/examples/MatterThermostat/MatterThermostat.ino index bf76477c846..2c446f59e34 100644 --- a/libraries/Matter/examples/MatterThermostat/MatterThermostat.ino +++ b/libraries/Matter/examples/MatterThermostat/MatterThermostat.ino @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -21,15 +21,21 @@ // Matter Manager #include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space #include +#endif // List of Matter Endpoints for this Node // Matter Thermostat Endpoint MatterThermostat SimulatedThermostat; +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // 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 +#endif // set your board USER BUTTON pin here - decommissioning button const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button. @@ -62,6 +68,8 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection @@ -70,6 +78,7 @@ void setup() { Serial.print("."); } Serial.println(); +#endif // 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 @@ -94,7 +103,7 @@ void setup() { Serial.println("Matter Node not commissioned yet. Waiting for commissioning."); } } - Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); // after commissioning, set initial thermostat parameters // start the thermostat in AUTO mode diff --git a/libraries/Matter/src/Matter.cpp b/libraries/Matter/src/Matter.cpp index b16edfd85c1..5ddacc1622c 100644 --- a/libraries/Matter/src/Matter.cpp +++ b/libraries/Matter/src/Matter.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -17,6 +17,10 @@ #include #include +#if CONFIG_ENABLE_MATTER_OVER_THREAD +#include "esp_openthread_types.h" +#include "platform/ESP32/OpenthreadLauncher.h" +#endif using namespace esp_matter; using namespace esp_matter::attribute; @@ -151,6 +155,18 @@ void ArduinoMatter::begin() { return; } +#if CONFIG_ENABLE_MATTER_OVER_THREAD + // Set OpenThread platform config + esp_openthread_platform_config_t config; + memset(&config, 0, sizeof(esp_openthread_platform_config_t)); + config.radio_config.radio_mode = RADIO_MODE_NATIVE; + config.host_config.host_connection_mode = HOST_CONNECTION_MODE_NONE; + config.port_config.storage_partition_name = "nvs"; + config.port_config.netif_queue_size = 10; + config.port_config.task_queue_size = 10; + set_openthread_platform_config(&config); +#endif + /* Matter start */ esp_err_t err = esp_matter::start(app_event_cb); if (err != ESP_OK) { diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index 682a0498076..09e59b4e04b 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndPoint.cpp b/libraries/Matter/src/MatterEndPoint.cpp new file mode 100644 index 00000000000..ecf1acff579 --- /dev/null +++ b/libraries/Matter/src/MatterEndPoint.cpp @@ -0,0 +1,139 @@ +// 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. + +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include + +uint16_t MatterEndPoint::secondary_network_endpoint_id = 0; + +// This function is called to create a secondary network interface endpoint. +// It can be used for devices that support multiple network interfaces, +// such as Ethernet, Thread and Wi-Fi. +bool MatterEndPoint::createSecondaryNetworkInterface() { + if (secondary_network_endpoint_id != 0) { + log_v("Secondary network interface endpoint already exists with ID %d", secondary_network_endpoint_id); + return false; + } + // Create a secondary network interface endpoint + endpoint::secondary_network_interface::config_t secondary_network_interface_config; + secondary_network_interface_config.network_commissioning.feature_map = chip::to_underlying( + //chip::app::Clusters::NetworkCommissioning::Feature::kWiFiNetworkInterface) | + chip::app::Clusters::NetworkCommissioning::Feature::kThreadNetworkInterface + ); + endpoint_t *endpoint = endpoint::secondary_network_interface::create(node::get(), &secondary_network_interface_config, ENDPOINT_FLAG_NONE, nullptr); + if (endpoint == nullptr) { + log_e("Failed to create secondary network interface endpoint"); + return false; + } + secondary_network_endpoint_id = endpoint::get_id(endpoint); + log_i("Secondary Network Interface created with endpoint_id %d", secondary_network_endpoint_id); + return true; +} + +uint16_t MatterEndPoint::getSecondaryNetworkEndPointId() { + return secondary_network_endpoint_id; +} + +uint16_t MatterEndPoint::getEndPointId() { + return endpoint_id; +} + +void MatterEndPoint::setEndPointId(uint16_t ep) { + if (ep == 0) { + log_e("Invalid endpoint ID"); + return; + } + log_v("Endpoint ID set to %d", ep); + + endpoint_id = ep; +} + +// helper functions for attribute manipulation +esp_matter::attribute_t *MatterEndPoint::getAttribute(uint32_t cluster_id, uint32_t attribute_id) { + if (endpoint_id == 0) { + log_e("Endpoint ID is not set"); + return nullptr; + } + endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); + if (endpoint == nullptr) { + log_e("Endpoint [%d] not found", endpoint_id); + return nullptr; + } + cluster_t *cluster = cluster::get(endpoint, cluster_id); + if (cluster == nullptr) { + log_e("Cluster [%d] not found", cluster_id); + return nullptr; + } + esp_matter::attribute_t *attribute = attribute::get(cluster, attribute_id); + if (attribute == nullptr) { + log_e("Attribute [%d] not found", attribute_id); + return nullptr; + } + return attribute; +} + +// get the value of an attribute from its cluster id and attribute it +bool MatterEndPoint::getAttributeVal(uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *attrVal) { + esp_matter::attribute_t *attribute = getAttribute(cluster_id, attribute_id); + if (attribute == nullptr) { + 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 MatterEndPoint::setAttributeVal(uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *attrVal) { + esp_matter::attribute_t *attribute = getAttribute(cluster_id, attribute_id); + if (attribute == nullptr) { + 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 MatterEndPoint::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 callback is invoked when clients interact with the Identify Cluster of an specific endpoint. +bool MatterEndPoint::endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled) { + if (_onEndPointIdentifyCB) { + return _onEndPointIdentifyCB(identifyIsEnabled); + } + return true; +} + +// User callback for the Identify Cluster functionality +void MatterEndPoint::onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { + _onEndPointIdentifyCB = onEndPointIdentifyCB; +} + +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndPoint.h b/libraries/Matter/src/MatterEndPoint.h index 95d3d3c08df..3138014d624 100644 --- a/libraries/Matter/src/MatterEndPoint.h +++ b/libraries/Matter/src/MatterEndPoint.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -16,7 +16,8 @@ #include #ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL -#include +#include +#include #include using namespace esp_matter; @@ -29,93 +30,47 @@ class MatterEndPoint { ATTR_UPDATE = true }; - uint16_t getEndPointId() { - return endpoint_id; - } + using EndPointIdentifyCB = std::function; + + // 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 function is called to create a secondary network interface endpoint. + // It can be used for devices that support multiple network interfaces, + // such as Ethernet, Thread and Wi-Fi. + bool createSecondaryNetworkInterface(); + + // This function is called to get the secondary network interface endpoint ID. + uint16_t getSecondaryNetworkEndPointId(); + + // This function is called to get the current Matter Accessory endpoint ID. + uint16_t getEndPointId(); - void setEndPointId(uint16_t ep) { - endpoint_id = ep; - } + // This function is called to set the current Matter Accessory endpoint ID. + void setEndPointId(uint16_t ep); // helper functions for attribute manipulation - 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 nullptr; - } - endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); - if (endpoint == nullptr) { - log_e("Endpoint [%d] not found", endpoint_id); - return nullptr; - } - cluster_t *cluster = cluster::get(endpoint, cluster_id); - if (cluster == nullptr) { - log_e("Cluster [%d] not found", cluster_id); - return nullptr; - } - esp_matter::attribute_t *attribute = attribute::get(cluster, attribute_id); - if (attribute == nullptr) { - log_e("Attribute [%d] not found", attribute_id); - return nullptr; - } - 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) { - esp_matter::attribute_t *attribute = getAttribute(cluster_id, attribute_id); - if (attribute == nullptr) { - 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) { - esp_matter::attribute_t *attribute = getAttribute(cluster_id, attribute_id); - if (attribute == nullptr) { - 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; - } + esp_matter::attribute_t *getAttribute(uint32_t cluster_id, uint32_t attribute_id); - // 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; + // get the value of an attribute from its cluster id and + bool getAttributeVal(uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *attrVal); + + // set the value of an attribute from its cluster id and + bool setAttributeVal(uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *attrVal); + + // update the value of an attribute from its cluster id + bool updateAttributeVal(uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *attrVal); // This callback is invoked when clients interact with the Identify Cluster of an specific endpoint. - bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled) { - if (_onEndPointIdentifyCB) { - return _onEndPointIdentifyCB(identifyIsEnabled); - } - return true; - } - // User callaback for the Identify Cluster functionality - using EndPointIdentifyCB = std::function; - void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB) { - _onEndPointIdentifyCB = onEndPointIdentifyCB; - } + bool endpointIdentifyCB(uint16_t endpoint_id, bool identifyIsEnabled); + + // User callback for the Identify Cluster functionality + void onIdentify(EndPointIdentifyCB onEndPointIdentifyCB); protected: + // used for secondary network interface endpoints + static uint16_t secondary_network_endpoint_id; + // main endpoint ID uint16_t endpoint_id = 0; EndPointIdentifyCB _onEndPointIdentifyCB = nullptr; }; diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp index 39d79e86325..aff0972528b 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorLight.h index 99449addd50..b07432a2cf5 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterColorLight.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp index 3c4fccfa046..db90edf1177 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h index 539bc386e92..3c8b2dca882 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp index 17b0fe7a247..52dcc8da7c0 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -60,6 +60,7 @@ bool MatterContactSensor::begin(bool _contactState) { contactState = _contactState; setEndPointId(endpoint::get_id(endpoint)); log_i("Contact Sensor created with endpoint_id %d", getEndPointId()); + started = true; return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h index 257da785e53..687bf0d0b4b 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterContactSensor.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp index 5167cf1f21c..4659dd71675 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h index 4497edd2fe2..45b112100cb 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp index 9b245fb9408..5e9feb5aadd 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h index a4baef968a4..97f0279b9e4 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterFan.cpp b/libraries/Matter/src/MatterEndpoints/MatterFan.cpp index 1647490aa05..5745604ebde 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterFan.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterFan.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -110,6 +110,7 @@ bool MatterFan::begin(uint8_t percent, FanMode_t fanMode, FanModeSequence_t fanM setEndPointId(endpoint::get_id(endpoint)); log_i("Fan created with endpoint_id %d", getEndPointId()); + started = true; return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterFan.h b/libraries/Matter/src/MatterEndpoints/MatterFan.h index a1cd6e42423..53736ac70f2 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterFan.h +++ b/libraries/Matter/src/MatterEndpoints/MatterFan.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp index e20479af088..f69d4a2ab7f 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -79,6 +79,7 @@ bool MatterGenericSwitch::begin() { setEndPointId(endpoint::get_id(endpoint)); log_i("Generic Switch created with endpoint_id %d", getEndPointId()); + started = true; return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h index 14118462932..ffcc6f47706 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h +++ b/libraries/Matter/src/MatterEndpoints/MatterGenericSwitch.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp index d31d0e43728..ef8276e4a04 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -68,6 +68,7 @@ bool MatterHumiditySensor::begin(uint16_t _rawHumidity) { rawHumidity = _rawHumidity; setEndPointId(endpoint::get_id(endpoint)); log_i("Humidity Sensor created with endpoint_id %d", getEndPointId()); + started = true; return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h index aed758b7b7a..48c3a4b9e28 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterHumiditySensor.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp index 0d55c37708a..f91a02e14a9 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -71,6 +71,7 @@ bool MatterOccupancySensor::begin(bool _occupancyState, OccupancySensorType_t _o occupancyState = _occupancyState; setEndPointId(endpoint::get_id(endpoint)); log_i("Occupancy Sensor created with endpoint_id %d", getEndPointId()); + started = true; return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h index 30f312a9841..acfa7fec632 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp index f400390f9a7..afd764088c5 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -79,6 +79,7 @@ bool MatterOnOffLight::begin(bool initialState) { setEndPointId(endpoint::get_id(endpoint)); log_i("On-Off Light created with endpoint_id %d", getEndPointId()); + started = true; return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h index ec524d2c300..2c52858cc9a 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp index 9b08958684c..33cee105833 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -78,6 +78,7 @@ bool MatterOnOffPlugin::begin(bool initialState) { onOffState = initialState; setEndPointId(endpoint::get_id(endpoint)); log_i("On-Off Plugin created with endpoint_id %d", getEndPointId()); + started = true; return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h index 0b05c0944c4..e3489b355a8 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp index 86d245d4041..8674ad5936b 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -61,6 +61,7 @@ bool MatterPressureSensor::begin(int16_t _rawPressure) { rawPressure = _rawPressure; setEndPointId(endpoint::get_id(endpoint)); log_i("Pressure Sensor created with endpoint_id %d", getEndPointId()); + started = true; return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h index 0715c05609d..6b1973049ca 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterPressureSensor.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp index 863f86386c1..248bd29f05f 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -61,6 +61,7 @@ bool MatterTemperatureSensor::begin(int16_t _rawTemperature) { rawTemperature = _rawTemperature; setEndPointId(endpoint::get_id(endpoint)); log_i("Temperature Sensor created with endpoint_id %d", getEndPointId()); + started = true; return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h index 3be6101166c..51a1eeb3b0a 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h +++ b/libraries/Matter/src/MatterEndpoints/MatterTemperatureSensor.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. diff --git a/libraries/Matter/src/MatterEndpoints/MatterThermostat.cpp b/libraries/Matter/src/MatterEndpoints/MatterThermostat.cpp index 5a68421bd8a..6ee18ef0cc9 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterThermostat.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterThermostat.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. @@ -202,6 +202,7 @@ bool MatterThermostat::begin(ControlSequenceOfOperation_t _controlSequence, Ther setEndPointId(endpoint::get_id(endpoint)); log_i("Thermostat created with endpoint_id %d", getEndPointId()); + started = true; return true; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterThermostat.h b/libraries/Matter/src/MatterEndpoints/MatterThermostat.h index 2d64bdf3b01..53df61d191e 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterThermostat.h +++ b/libraries/Matter/src/MatterEndpoints/MatterThermostat.h @@ -1,4 +1,4 @@ -// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// 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. From 18f647611bda1a5e0f7fc5bb95a21c40f18e0f74 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, 3 Jul 2025 15:39:46 +0200 Subject: [PATCH 211/290] fix(spi): Fix bus clock for ESP32-P4 + remove S2 leftover (#11547) * fix(spi): Fix bus clock for ESP32-P4 * fix(ci): Ignore unused-variable warning * 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-spi.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/cores/esp32/esp32-hal-spi.c b/cores/esp32/esp32-hal-spi.c index d39aceb5f8d..107b94da0d6 100644 --- a/cores/esp32/esp32-hal-spi.c +++ b/cores/esp32/esp32-hal-spi.c @@ -60,6 +60,7 @@ #elif CONFIG_IDF_TARGET_ESP32P4 #include "esp32p4/rom/ets_sys.h" #include "esp32p4/rom/gpio.h" +#include "hal/spi_ll.h" #else #error Target CONFIG_IDF_TARGET is not supported #endif @@ -639,9 +640,6 @@ spi_t *spiStartBus(uint8_t spi_num, uint32_t clockDiv, uint8_t dataMode, uint8_t } else if (spi_num == HSPI) { DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI3_CLK_EN); DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI3_RST); - } else { - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI01_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI01_RST); } #elif CONFIG_IDF_TARGET_ESP32S3 if (spi_num == FSPI) { @@ -662,6 +660,31 @@ spi_t *spiStartBus(uint8_t spi_num, uint32_t clockDiv, uint8_t dataMode, uint8_t DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI01_CLK_EN); DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI01_RST); } +#elif CONFIG_IDF_TARGET_ESP32P4 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-variable" + if (spi_num == FSPI) { + PERIPH_RCC_ACQUIRE_ATOMIC(PERIPH_GPSPI2_MODULE, ref_count) { + if (ref_count == 0) { + PERIPH_RCC_ATOMIC() { + spi_ll_enable_bus_clock(SPI2_HOST, true); + spi_ll_reset_register(SPI2_HOST); + spi_ll_enable_clock(SPI2_HOST, true); + } + } + } + } else if (spi_num == HSPI) { + PERIPH_RCC_ACQUIRE_ATOMIC(PERIPH_GPSPI3_MODULE, ref_count) { + if (ref_count == 0) { + PERIPH_RCC_ATOMIC() { + spi_ll_enable_bus_clock(SPI3_HOST, true); + spi_ll_reset_register(SPI3_HOST); + spi_ll_enable_clock(SPI3_HOST, true); + } + } + } + } +#pragma GCC diagnostic pop #elif defined(__PERIPH_CTRL_ALLOW_LEGACY_API) periph_ll_reset(PERIPH_SPI2_MODULE); periph_ll_enable_clk_clear_rst(PERIPH_SPI2_MODULE); From ac961f671abd5ae1da0a15fd4bee71ed807c2cf3 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Thu, 3 Jul 2025 16:42:28 +0300 Subject: [PATCH 212/290] Update core version to 3.2.1 --- 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 b1355e908ae..97bb3ac794b 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 2 /** 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 0796eddf318..18de5aa2180 100644 --- a/libraries/ArduinoOTA/library.properties +++ b/libraries/ArduinoOTA/library.properties @@ -1,5 +1,5 @@ name=ArduinoOTA -version=3.2.0 +version=3.2.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 116dcbacaa8..c64c60d0421 100644 --- a/libraries/AsyncUDP/library.properties +++ b/libraries/AsyncUDP/library.properties @@ -1,5 +1,5 @@ name=ESP32 Async UDP -version=3.2.0 +version=3.2.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 7ef636223ec..b009b14e194 100644 --- a/libraries/BLE/library.properties +++ b/libraries/BLE/library.properties @@ -1,5 +1,5 @@ name=BLE -version=3.2.0 +version=3.2.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 0a382410bba..4bc1427e3f8 100644 --- a/libraries/BluetoothSerial/library.properties +++ b/libraries/BluetoothSerial/library.properties @@ -1,5 +1,5 @@ name=BluetoothSerial -version=3.2.0 +version=3.2.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 5e70a6ec03a..42e4c38dc9d 100644 --- a/libraries/DNSServer/library.properties +++ b/libraries/DNSServer/library.properties @@ -1,5 +1,5 @@ name=DNSServer -version=3.2.0 +version=3.2.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 c7e48501c04..ee1caae0792 100644 --- a/libraries/EEPROM/library.properties +++ b/libraries/EEPROM/library.properties @@ -1,5 +1,5 @@ name=EEPROM -version=3.2.0 +version=3.2.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 7ebc69be71f..0815a69ce6b 100644 --- a/libraries/ESP32/library.properties +++ b/libraries/ESP32/library.properties @@ -1,5 +1,5 @@ name=ESP32 -version=3.2.0 +version=3.2.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 263e9823275..ff1ad5d59da 100644 --- a/libraries/ESP_I2S/library.properties +++ b/libraries/ESP_I2S/library.properties @@ -1,5 +1,5 @@ name=ESP_I2S -version=3.2.0 +version=3.2.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 f3e5c109a9b..426a9464ace 100644 --- a/libraries/ESP_NOW/library.properties +++ b/libraries/ESP_NOW/library.properties @@ -1,5 +1,5 @@ name=ESP_NOW -version=3.2.0 +version=3.2.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 295761bd9fb..3b9777bca8f 100644 --- a/libraries/ESP_SR/library.properties +++ b/libraries/ESP_SR/library.properties @@ -1,5 +1,5 @@ name=ESP_SR -version=3.2.0 +version=3.2.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 6d36d61b783..b99a5f58e5c 100644 --- a/libraries/ESPmDNS/library.properties +++ b/libraries/ESPmDNS/library.properties @@ -1,5 +1,5 @@ name=ESPmDNS -version=3.2.0 +version=3.2.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 d34ae036417..cd2d8ead018 100644 --- a/libraries/Ethernet/library.properties +++ b/libraries/Ethernet/library.properties @@ -1,5 +1,5 @@ name=Ethernet -version=3.2.0 +version=3.2.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 35940fd5472..898982536b0 100644 --- a/libraries/FFat/library.properties +++ b/libraries/FFat/library.properties @@ -1,5 +1,5 @@ name=FFat -version=3.2.0 +version=3.2.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 07bd296bb83..fe86d613bdf 100644 --- a/libraries/FS/library.properties +++ b/libraries/FS/library.properties @@ -1,5 +1,5 @@ name=FS -version=3.2.0 +version=3.2.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 f2dafc36d1b..76da4c857e1 100644 --- a/libraries/HTTPClient/library.properties +++ b/libraries/HTTPClient/library.properties @@ -1,5 +1,5 @@ name=HTTPClient -version=3.2.0 +version=3.2.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 419f3b97b3f..dfe0474c3f3 100644 --- a/libraries/HTTPUpdate/library.properties +++ b/libraries/HTTPUpdate/library.properties @@ -1,5 +1,5 @@ name=HTTPUpdate -version=3.2.0 +version=3.2.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 9c793a26ac8..90aa966d27f 100644 --- a/libraries/HTTPUpdateServer/library.properties +++ b/libraries/HTTPUpdateServer/library.properties @@ -1,5 +1,5 @@ name=HTTPUpdateServer -version=3.2.0 +version=3.2.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 fefe5aab177..c1ad9c72ce1 100644 --- a/libraries/Insights/library.properties +++ b/libraries/Insights/library.properties @@ -1,5 +1,5 @@ name=ESP Insights -version=3.2.0 +version=3.2.1 author=Sanket Wadekar maintainer=Sanket Wadekar sentence=ESP Insights diff --git a/libraries/LittleFS/library.properties b/libraries/LittleFS/library.properties index a9dae69b7f8..e00ed49c312 100644 --- a/libraries/LittleFS/library.properties +++ b/libraries/LittleFS/library.properties @@ -1,5 +1,5 @@ name=LittleFS -version=3.2.0 +version=3.2.1 author= maintainer= sentence=LittleFS for esp32 diff --git a/libraries/Matter/library.properties b/libraries/Matter/library.properties index ac9e0964ab5..b601fce0ff5 100644 --- a/libraries/Matter/library.properties +++ b/libraries/Matter/library.properties @@ -1,5 +1,5 @@ name=Matter -version=3.2.0 +version=3.2.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 5f134bfdc55..a4bbf93c0ed 100644 --- a/libraries/NetBIOS/library.properties +++ b/libraries/NetBIOS/library.properties @@ -1,5 +1,5 @@ name=NetBIOS -version=3.2.0 +version=3.2.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 0b821e08d77..f2284981704 100644 --- a/libraries/Network/library.properties +++ b/libraries/Network/library.properties @@ -1,5 +1,5 @@ name=Networking -version=3.2.0 +version=3.2.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 455dea6a2bf..31af7a1bc8c 100644 --- a/libraries/NetworkClientSecure/library.properties +++ b/libraries/NetworkClientSecure/library.properties @@ -1,5 +1,5 @@ name=NetworkClientSecure -version=3.2.0 +version=3.2.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 0e547d188aa..2687b1dcd1c 100644 --- a/libraries/OpenThread/library.properties +++ b/libraries/OpenThread/library.properties @@ -1,5 +1,5 @@ name=OpenThread -version=3.2.0 +version=3.2.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 7158a027b0a..c39647cbe56 100644 --- a/libraries/PPP/library.properties +++ b/libraries/PPP/library.properties @@ -1,5 +1,5 @@ name=PPP -version=3.2.0 +version=3.2.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 eb0158e4932..6e0d38348c0 100644 --- a/libraries/Preferences/library.properties +++ b/libraries/Preferences/library.properties @@ -1,5 +1,5 @@ name=Preferences -version=3.2.0 +version=3.2.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 95ce14d6708..71b4082a0a7 100644 --- a/libraries/RainMaker/library.properties +++ b/libraries/RainMaker/library.properties @@ -1,5 +1,5 @@ name=ESP RainMaker -version=3.2.0 +version=3.2.1 author=Sweety Mhaiske maintainer=Hristo Gochkov sentence=ESP RainMaker Support diff --git a/libraries/SD/library.properties b/libraries/SD/library.properties index 66c4f5cfafd..cc51196ed54 100644 --- a/libraries/SD/library.properties +++ b/libraries/SD/library.properties @@ -1,5 +1,5 @@ name=SD -version=3.2.0 +version=3.2.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 855390e5057..590eb8ebc52 100644 --- a/libraries/SD_MMC/library.properties +++ b/libraries/SD_MMC/library.properties @@ -1,5 +1,5 @@ name=SD_MMC -version=3.2.0 +version=3.2.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 64db93aceeb..724137030d1 100644 --- a/libraries/SPI/library.properties +++ b/libraries/SPI/library.properties @@ -1,5 +1,5 @@ name=SPI -version=3.2.0 +version=3.2.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 78f77fe9794..fc4601e512c 100644 --- a/libraries/SPIFFS/library.properties +++ b/libraries/SPIFFS/library.properties @@ -1,5 +1,5 @@ name=SPIFFS -version=3.2.0 +version=3.2.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 ad5e10d3acb..768449ee1c4 100644 --- a/libraries/SimpleBLE/library.properties +++ b/libraries/SimpleBLE/library.properties @@ -1,5 +1,5 @@ name=SimpleBLE -version=3.2.0 +version=3.2.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 1e8db045610..6ad0c32c7d5 100644 --- a/libraries/TFLiteMicro/library.properties +++ b/libraries/TFLiteMicro/library.properties @@ -1,5 +1,5 @@ name=TFLite Micro -version=3.2.0 +version=3.2.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 975db96d1ad..8a2af554906 100644 --- a/libraries/Ticker/library.properties +++ b/libraries/Ticker/library.properties @@ -1,5 +1,5 @@ name=Ticker -version=3.2.0 +version=3.2.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 9d47dfc6719..677d736a635 100644 --- a/libraries/USB/library.properties +++ b/libraries/USB/library.properties @@ -1,5 +1,5 @@ name=USB -version=3.2.0 +version=3.2.1 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=ESP32S2 USB Library diff --git a/libraries/Update/library.properties b/libraries/Update/library.properties index c3ee8f7e506..4c756397aba 100644 --- a/libraries/Update/library.properties +++ b/libraries/Update/library.properties @@ -1,5 +1,5 @@ name=Update -version=3.2.0 +version=3.2.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 2a9ff530d57..bf6c26c65e7 100644 --- a/libraries/WebServer/library.properties +++ b/libraries/WebServer/library.properties @@ -1,5 +1,5 @@ name=WebServer -version=3.2.0 +version=3.2.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 03112c2fcc6..a282570ff8a 100644 --- a/libraries/WiFi/library.properties +++ b/libraries/WiFi/library.properties @@ -1,5 +1,5 @@ name=WiFi -version=3.2.0 +version=3.2.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 13a63c50bb1..1cc8e4b0f91 100644 --- a/libraries/WiFiProv/library.properties +++ b/libraries/WiFiProv/library.properties @@ -1,5 +1,5 @@ name=WiFiProv -version=3.2.0 +version=3.2.1 author=Switi Mhaiske maintainer=Hristo Gochkov sentence=Enables provisioning. diff --git a/libraries/Wire/library.properties b/libraries/Wire/library.properties index 655f4bd3194..22cc7f26d86 100644 --- a/libraries/Wire/library.properties +++ b/libraries/Wire/library.properties @@ -1,5 +1,5 @@ name=Wire -version=3.2.0 +version=3.2.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 9a558d70216..d9587f49fd5 100644 --- a/libraries/Zigbee/library.properties +++ b/libraries/Zigbee/library.properties @@ -1,5 +1,5 @@ name=Zigbee -version=3.2.0 +version=3.2.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 9c918733209..85a15ab3615 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "framework-arduinoespressif32", - "version": "3.2.0", + "version": "3.2.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/platform.txt b/platform.txt index 7bc89426323..62cb829dcf0 100644 --- a/platform.txt +++ b/platform.txt @@ -1,5 +1,5 @@ name=ESP32 Arduino -version=3.2.0 +version=3.2.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 0b9c9362deb4d24953a4a5b1196915e551e7e860 Mon Sep 17 00:00:00 2001 From: Dogus Cendek Date: Thu, 3 Jul 2025 23:13:42 +0300 Subject: [PATCH 213/290] Add Deneyap Kart v2 (#11545) * Updated Pins of Devkits Deleted soc_caps.h library and related commands at Deneyap Kart 1A v2, Deneyap Kart 1A, Deneyap Mini and Deneyap Mini v2. Added TX1 and RX1 pins and updated LED pin definition at all Devkits. Added BOOT (BT) pins at Deneyap Kart, Deneyap Kart 1A, Deneyap Mini and Deneyap Kart G. Changed D0 and D1 pin numbers at Deneyap Kart G. Changed D12, D13, D14, D15, PWM0 and PWM1 pin numbers at Deneyap Kart 1A v2. Added A8, T0, T1, T2, T3, T4, T5, T6, T7, T8, D16, D17, D18, D19, PWM2, PWM3, PWM4 and BAT pin numbers at Deneyap Kart 1A v2. Changed A2, A3, A4 (T0) and A5 (T1) pin numbers at Deneyap Kart and Deneyap Kart 1A. Renamed DA2 (DAC2) pin as DA0 (DAC0) and changed DAC1 and DAC2 pin numbers at Deneyap Mini and Deneyap Mini v2. * Updated board.txt of all Devkits Updated board.txt of all Devkits * Remove Repeating Pin Definition Remove Repeating Pin Definition * Fix Pin Definition Remove repeating pin definitions of SPI, I2C and DAC. Update RGB LED definition for using digitalWrite() command with RGB LED. * Remove Repeating Pin Definitions Remove repeating pin definitions of LEDB, SPI, I2C and DAC. * Update RGB LED definition Update RGB LED definition for using digitalWrite() command with RGB LED. * Fix broken links for external library test Fix broken links for external library test * Update UploadMode Config of Deneyap Kart 1A v2 Update UploadMode Config of Deneyap Kart 1A v2 * Add Deneyap Kart v2 Add pin definitions and configs of Deneyap Kart v2. * Update UploadMode config Hardware CDC is default now. * Fixed typo fault Fixed typo fault * Fixed build.board parameter Fixed build.board parameter * Removed unsupported Flash sizes and RAM type Removed unsupported Flash sizes and RAM type from menu. * Remove unsupported partition options Remove unsupported partition options * Fixed Annotations and Space * Update pins_arduino.h --- boards.txt | 223 ++++++++++++++++++++++++++ variants/deneyapkartv2/pins_arduino.h | 123 ++++++++++++++ 2 files changed, 346 insertions(+) create mode 100644 variants/deneyapkartv2/pins_arduino.h diff --git a/boards.txt b/boards.txt index 4198f3856b0..e47995985ed 100644 --- a/boards.txt +++ b/boards.txt @@ -33287,6 +33287,229 @@ deneyapkart.menu.EraseFlash.all.upload.erase_cmd=-e ############################################################## +deneyapkartv2.name=Deneyap Kart v2 + +deneyapkartv2.vid.0=0x303a +deneyapkartv2.pid.0=0x82EB + +deneyapkartv2.bootloader.tool=esptool_py +deneyapkartv2.bootloader.tool.default=esptool_py + +deneyapkartv2.upload.tool=esptool_py +deneyapkartv2.upload.tool.default=esptool_py +deneyapkartv2.upload.tool.network=esp_ota + +deneyapkartv2.upload.maximum_size=1310720 +deneyapkartv2.upload.maximum_data_size=327680 +deneyapkartv2.upload.flags= +deneyapkartv2.upload.extra_flags= +deneyapkartv2.upload.use_1200bps_touch=false +deneyapkartv2.upload.wait_for_upload_port=false + +deneyapkartv2.serial.disableDTR=false +deneyapkartv2.serial.disableRTS=false + +deneyapkartv2.build.tarch=xtensa +deneyapkartv2.build.bootloader_addr=0x0 +deneyapkartv2.build.target=esp32s3 +deneyapkartv2.build.mcu=esp32s3 +deneyapkartv2.build.core=esp32 +deneyapkartv2.build.variant=deneyapkartv2 +deneyapkartv2.build.board=DYDKV2 + +deneyapkartv2.build.usb_mode=1 +deneyapkartv2.build.cdc_on_boot=1 +deneyapkartv2.build.msc_on_boot=0 +deneyapkartv2.build.dfu_on_boot=0 +deneyapkartv2.build.f_cpu=240000000L +deneyapkartv2.build.flash_size=4MB +deneyapkartv2.build.flash_freq=80m +deneyapkartv2.build.flash_mode=dio +deneyapkartv2.build.boot=qio +deneyapkartv2.build.boot_freq=80m +deneyapkartv2.build.partitions=default +deneyapkartv2.build.defines=-DBOARD_HAS_PSRAM +deneyapkartv2.build.loop_core= +deneyapkartv2.build.event_core= +deneyapkartv2.build.psram_type=opi +deneyapkartv2.build.memory_type={build.boot}_{build.psram_type} + +## IDE 2.0 Seems to not update the value +deneyapkartv2.menu.JTAGAdapter.default=Disabled +deneyapkartv2.menu.JTAGAdapter.default.build.copy_jtag_files=0 +deneyapkartv2.menu.JTAGAdapter.builtin=Integrated USB JTAG +deneyapkartv2.menu.JTAGAdapter.builtin.build.openocdscript=esp32s3-builtin.cfg +deneyapkartv2.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 +deneyapkartv2.menu.JTAGAdapter.external=FTDI Adapter +deneyapkartv2.menu.JTAGAdapter.external.build.openocdscript=esp32s3-ftdi.cfg +deneyapkartv2.menu.JTAGAdapter.external.build.copy_jtag_files=1 +deneyapkartv2.menu.JTAGAdapter.bridge=ESP USB Bridge +deneyapkartv2.menu.JTAGAdapter.bridge.build.openocdscript=esp32s3-bridge.cfg +deneyapkartv2.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +deneyapkartv2.menu.PSRAM.opi=OPI PSRAM +deneyapkartv2.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM +deneyapkartv2.menu.PSRAM.opi.build.psram_type=opi +deneyapkartv2.menu.PSRAM.disabled=Disabled +deneyapkartv2.menu.PSRAM.disabled.build.defines= +deneyapkartv2.menu.PSRAM.disabled.build.psram_type=qspi + +deneyapkartv2.menu.FlashMode.qio=QIO 80MHz +deneyapkartv2.menu.FlashMode.qio.build.flash_mode=dio +deneyapkartv2.menu.FlashMode.qio.build.boot=qio +deneyapkartv2.menu.FlashMode.qio.build.boot_freq=80m +deneyapkartv2.menu.FlashMode.qio.build.flash_freq=80m +deneyapkartv2.menu.FlashMode.qio120=QIO 120MHz +deneyapkartv2.menu.FlashMode.qio120.build.flash_mode=dio +deneyapkartv2.menu.FlashMode.qio120.build.boot=qio +deneyapkartv2.menu.FlashMode.qio120.build.boot_freq=120m +deneyapkartv2.menu.FlashMode.qio120.build.flash_freq=80m +deneyapkartv2.menu.FlashMode.dio=DIO 80MHz +deneyapkartv2.menu.FlashMode.dio.build.flash_mode=dio +deneyapkartv2.menu.FlashMode.dio.build.boot=dio +deneyapkartv2.menu.FlashMode.dio.build.boot_freq=80m +deneyapkartv2.menu.FlashMode.dio.build.flash_freq=80m +deneyapkartv2.menu.FlashMode.opi=OPI 80MHz +deneyapkartv2.menu.FlashMode.opi.build.flash_mode=dout +deneyapkartv2.menu.FlashMode.opi.build.boot=opi +deneyapkartv2.menu.FlashMode.opi.build.boot_freq=80m +deneyapkartv2.menu.FlashMode.opi.build.flash_freq=80m + +deneyapkartv2.menu.FlashSize.4M=4MB (32Mb) +deneyapkartv2.menu.FlashSize.4M.build.flash_size=4MB + +deneyapkartv2.menu.LoopCore.1=Core 1 +deneyapkartv2.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +deneyapkartv2.menu.LoopCore.0=Core 0 +deneyapkartv2.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +deneyapkartv2.menu.EventsCore.1=Core 1 +deneyapkartv2.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +deneyapkartv2.menu.EventsCore.0=Core 0 +deneyapkartv2.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +deneyapkartv2.menu.USBMode.hwcdc=Hardware CDC and JTAG +deneyapkartv2.menu.USBMode.hwcdc.build.usb_mode=1 +deneyapkartv2.menu.USBMode.default=USB-OTG (TinyUSB) +deneyapkartv2.menu.USBMode.default.build.usb_mode=0 + +deneyapkartv2.menu.CDCOnBoot.cdc=Enabled +deneyapkartv2.menu.CDCOnBoot.cdc.build.cdc_on_boot=1 +deneyapkartv2.menu.CDCOnBoot.default=Disabled +deneyapkartv2.menu.CDCOnBoot.default.build.cdc_on_boot=0 + +deneyapkartv2.menu.MSCOnBoot.default=Disabled +deneyapkartv2.menu.MSCOnBoot.default.build.msc_on_boot=0 +deneyapkartv2.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +deneyapkartv2.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +deneyapkartv2.menu.DFUOnBoot.default=Disabled +deneyapkartv2.menu.DFUOnBoot.default.build.dfu_on_boot=0 +deneyapkartv2.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +deneyapkartv2.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +deneyapkartv2.menu.UploadMode.default=UART0 / Hardware CDC +deneyapkartv2.menu.UploadMode.default.upload.use_1200bps_touch=false +deneyapkartv2.menu.UploadMode.default.upload.wait_for_upload_port=false +deneyapkartv2.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +deneyapkartv2.menu.UploadMode.cdc.upload.use_1200bps_touch=true +deneyapkartv2.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +deneyapkartv2.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS) +deneyapkartv2.menu.PartitionScheme.default.build.partitions=default +deneyapkartv2.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS) +deneyapkartv2.menu.PartitionScheme.defaultffat.build.partitions=default_ffat +deneyapkartv2.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS) +deneyapkartv2.menu.PartitionScheme.minimal.build.partitions=minimal +deneyapkartv2.menu.PartitionScheme.no_fs=No FS 4MB (2MB APP x2) +deneyapkartv2.menu.PartitionScheme.no_fs.build.partitions=no_fs +deneyapkartv2.menu.PartitionScheme.no_fs.upload.maximum_size=2031616 +deneyapkartv2.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS) +deneyapkartv2.menu.PartitionScheme.no_ota.build.partitions=no_ota +deneyapkartv2.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +deneyapkartv2.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS) +deneyapkartv2.menu.PartitionScheme.noota_3g.build.partitions=noota_3g +deneyapkartv2.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576 +deneyapkartv2.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS) +deneyapkartv2.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat +deneyapkartv2.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152 +deneyapkartv2.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS) +deneyapkartv2.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat +deneyapkartv2.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576 +deneyapkartv2.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS) +deneyapkartv2.menu.PartitionScheme.huge_app.build.partitions=huge_app +deneyapkartv2.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 +deneyapkartv2.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) +deneyapkartv2.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs +deneyapkartv2.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 +deneyapkartv2.menu.PartitionScheme.rainmaker=RainMaker 4MB +deneyapkartv2.menu.PartitionScheme.rainmaker.build.partitions=rainmaker +deneyapkartv2.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080 +deneyapkartv2.menu.PartitionScheme.rainmaker_4MB=RainMaker 4MB No OTA +deneyapkartv2.menu.PartitionScheme.rainmaker_4MB.build.partitions=rainmaker_4MB_no_ota +deneyapkartv2.menu.PartitionScheme.rainmaker_4MB.upload.maximum_size=4038656 +deneyapkartv2.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs +deneyapkartv2.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr +deneyapkartv2.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720 +deneyapkartv2.menu.PartitionScheme.custom=Custom +deneyapkartv2.menu.PartitionScheme.custom.build.partitions= +deneyapkartv2.menu.PartitionScheme.custom.upload.maximum_size=16777216 + +deneyapkartv2.menu.CPUFreq.240=240MHz (WiFi) +deneyapkartv2.menu.CPUFreq.240.build.f_cpu=240000000L +deneyapkartv2.menu.CPUFreq.160=160MHz (WiFi) +deneyapkartv2.menu.CPUFreq.160.build.f_cpu=160000000L +deneyapkartv2.menu.CPUFreq.80=80MHz (WiFi) +deneyapkartv2.menu.CPUFreq.80.build.f_cpu=80000000L +deneyapkartv2.menu.CPUFreq.40=40MHz +deneyapkartv2.menu.CPUFreq.40.build.f_cpu=40000000L +deneyapkartv2.menu.CPUFreq.20=20MHz +deneyapkartv2.menu.CPUFreq.20.build.f_cpu=20000000L +deneyapkartv2.menu.CPUFreq.10=10MHz +deneyapkartv2.menu.CPUFreq.10.build.f_cpu=10000000L + +deneyapkartv2.menu.UploadSpeed.921600=921600 +deneyapkartv2.menu.UploadSpeed.921600.upload.speed=921600 +deneyapkartv2.menu.UploadSpeed.115200=115200 +deneyapkartv2.menu.UploadSpeed.115200.upload.speed=115200 +deneyapkartv2.menu.UploadSpeed.256000.windows=256000 +deneyapkartv2.menu.UploadSpeed.256000.upload.speed=256000 +deneyapkartv2.menu.UploadSpeed.230400.windows.upload.speed=256000 +deneyapkartv2.menu.UploadSpeed.230400=230400 +deneyapkartv2.menu.UploadSpeed.230400.upload.speed=230400 +deneyapkartv2.menu.UploadSpeed.460800.linux=460800 +deneyapkartv2.menu.UploadSpeed.460800.macosx=460800 +deneyapkartv2.menu.UploadSpeed.460800.upload.speed=460800 +deneyapkartv2.menu.UploadSpeed.512000.windows=512000 +deneyapkartv2.menu.UploadSpeed.512000.upload.speed=512000 + +deneyapkartv2.menu.DebugLevel.none=None +deneyapkartv2.menu.DebugLevel.none.build.code_debug=0 +deneyapkartv2.menu.DebugLevel.error=Error +deneyapkartv2.menu.DebugLevel.error.build.code_debug=1 +deneyapkartv2.menu.DebugLevel.warn=Warn +deneyapkartv2.menu.DebugLevel.warn.build.code_debug=2 +deneyapkartv2.menu.DebugLevel.info=Info +deneyapkartv2.menu.DebugLevel.info.build.code_debug=3 +deneyapkartv2.menu.DebugLevel.debug=Debug +deneyapkartv2.menu.DebugLevel.debug.build.code_debug=4 +deneyapkartv2.menu.DebugLevel.verbose=Verbose +deneyapkartv2.menu.DebugLevel.verbose.build.code_debug=5 + +deneyapkartv2.menu.EraseFlash.none=Disabled +deneyapkartv2.menu.EraseFlash.none.upload.erase_cmd= +deneyapkartv2.menu.EraseFlash.all=Enabled +deneyapkartv2.menu.EraseFlash.all.upload.erase_cmd=-e + +deneyapkartv2.menu.ZigbeeMode.default=Disabled +deneyapkartv2.menu.ZigbeeMode.default.build.zigbee_mode= +deneyapkartv2.menu.ZigbeeMode.default.build.zigbee_libs= +deneyapkartv2.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router) +deneyapkartv2.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR +deneyapkartv2.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.remote + +############################################################## + deneyapkart1A.name=Deneyap Kart 1A deneyapkart1A.bootloader.tool=esptool_py diff --git a/variants/deneyapkartv2/pins_arduino.h b/variants/deneyapkartv2/pins_arduino.h new file mode 100644 index 00000000000..f7eccadb13c --- /dev/null +++ b/variants/deneyapkartv2/pins_arduino.h @@ -0,0 +1,123 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include +#include "soc/soc_caps.h" + +#define USB_VID 0x303A +#define USB_PID 0x82EB +#define USB_MANUFACTURER "Turkish Technology Team Foundation (T3)" +#define USB_PRODUCT "DENEYAP KART v2" +#define USB_SERIAL "" // Empty string for MAC address + +static const uint8_t LED_BUILTIN = SOC_GPIO_PIN_COUNT + 46; +#define BUILTIN_LED LED_BUILTIN // backward compatibility +#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN +#define RGB_BUILTIN LED_BUILTIN +#define RGBLED LED_BUILTIN +#define RGB_BRIGHTNESS 64 + +static const uint8_t GPKEY = 0; +#define KEY_BUILTIN GPKEY +#define BUILTIN_KEY GPKEY + +static const uint8_t TX = 43; +static const uint8_t RX = 44; +#define TX1 TX +#define RX1 RX + +static const uint8_t SDA = 47; +static const uint8_t SCL = 21; + +static const uint8_t SS = 42; +static const uint8_t MOSI = 39; +static const uint8_t MISO = 40; +static const uint8_t SCK = 41; + +static const uint8_t A0 = 4; +static const uint8_t A1 = 5; +static const uint8_t A2 = 6; +static const uint8_t A3 = 7; +static const uint8_t A4 = 15; +static const uint8_t A5 = 16; +static const uint8_t A6 = 17; +static const uint8_t A7 = 18; +static const uint8_t A8 = 8; +static const uint8_t A9 = 9; +static const uint8_t A10 = 10; +static const uint8_t A11 = 11; +static const uint8_t A12 = 2; +static const uint8_t A13 = 1; +static const uint8_t A14 = 3; +static const uint8_t A15 = 12; +static const uint8_t A16 = 13; +static const uint8_t A17 = 14; + +static const uint8_t T0 = 4; +static const uint8_t T1 = 5; +static const uint8_t T2 = 6; +static const uint8_t T3 = 7; +static const uint8_t T4 = 8; +static const uint8_t T5 = 9; +static const uint8_t T6 = 10; +static const uint8_t T7 = 11; +static const uint8_t T8 = 2; +static const uint8_t T9 = 1; +static const uint8_t T10 = 3; +static const uint8_t T11 = 12; +static const uint8_t T12 = 13; +static const uint8_t T13 = 14; + +static const uint8_t D0 = 1; +static const uint8_t D1 = 2; +static const uint8_t D2 = 43; +static const uint8_t D3 = 44; +static const uint8_t D4 = 42; +static const uint8_t D5 = 41; +static const uint8_t D6 = 40; +static const uint8_t D7 = 39; +static const uint8_t D8 = 38; +static const uint8_t D9 = 48; +static const uint8_t D10 = 47; +static const uint8_t D11 = 21; +static const uint8_t D12 = 11; +static const uint8_t D13 = 10; +static const uint8_t D14 = 9; +static const uint8_t D15 = 8; +static const uint8_t D16 = 18; +static const uint8_t D17 = 17; +static const uint8_t D18 = 16; +static const uint8_t D19 = 15; +static const uint8_t D20 = 7; +static const uint8_t D21 = 6; +static const uint8_t D22 = 5; +static const uint8_t D23 = 4; +static const uint8_t D24 = 46; +static const uint8_t D25 = 0; +static const uint8_t D26 = 3; +static const uint8_t D27 = 12; +static const uint8_t D28 = 13; +static const uint8_t D29 = 14; + +static const uint8_t CAMSD = 4; +static const uint8_t CAMSC = 5; +static const uint8_t CAMD2 = 41; +static const uint8_t CAMD3 = 2; +static const uint8_t CAMD4 = 1; +static const uint8_t CAMD5 = 42; +static const uint8_t CAMD6 = 40; +static const uint8_t CAMD7 = 38; +static const uint8_t CAMD8 = 17; +static const uint8_t CAMD9 = 15; +static const uint8_t CAMPC = 39; +static const uint8_t CAMXC = 16; +static const uint8_t CAMH = 7; +static const uint8_t CAMV = 6; + +static const uint8_t SDCM = 12; +static const uint8_t SDCK = 13; +static const uint8_t SDDA = 14; + +static const uint8_t BAT = 3; + +#endif /* Pins_Arduino_h */ From aab542d658819c6ce20035558e88911e131c8aef Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 3 Jul 2025 23:14:53 +0300 Subject: [PATCH 214/290] Update Issue-report.yml to add v 3.2.1 --- .github/ISSUE_TEMPLATE/Issue-report.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/Issue-report.yml b/.github/ISSUE_TEMPLATE/Issue-report.yml index 9dba5e0ca8f..6dc1b0de171 100644 --- a/.github/ISSUE_TEMPLATE/Issue-report.yml +++ b/.github/ISSUE_TEMPLATE/Issue-report.yml @@ -43,6 +43,7 @@ body: - latest stable Release (if not listed below) - latest development Release Candidate (RC-X) - latest master (checkout manually) + - v3.2.1 - v3.2.0 - v3.1.3 - v3.1.2 From 1426927c837dfa0c10835eb3c769f7000db64c26 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Fri, 4 Jul 2025 18:37:56 +0300 Subject: [PATCH 215/290] fix(matter): Fix MatterSmartButon.ino when CHIPOBLE is on --- .../Matter/examples/MatterSmartButon/MatterSmartButon.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino b/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino index 29caf00004c..f4d978175cc 100644 --- a/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino +++ b/libraries/Matter/examples/MatterSmartButon/MatterSmartButon.ino @@ -45,12 +45,12 @@ void setup() { Serial.begin(115200); +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); -// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network -#if !CONFIG_ENABLE_CHIPOBLE // Manually connect to WiFi WiFi.begin(ssid, password); // Wait for connection From d3c5a82eed1fb30403186c738dbaa6f45cac93bc Mon Sep 17 00:00:00 2001 From: "Daniel.Cao" <144674500+DanielCao0@users.noreply.github.com> Date: Mon, 7 Jul 2025 16:56:44 +0800 Subject: [PATCH 216/290] fix(board): Update PSRAM configuration for RAK3112 to fix PSRAM error (#11552) * fix(board): Update PSRAM configuration for RAK3112 to fix PSRAM error * feat(board): RAK3112 add WisBlock module pin definitions to pins_arduino.h * fix(board): Update RAK3112 flash mode and boot settings for improved performance * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Daniel.Cao Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- boards.txt | 6 ++++-- variants/rakwireless_rak3112/pins_arduino.h | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/boards.txt b/boards.txt index e47995985ed..ac2b1a336e4 100644 --- a/boards.txt +++ b/boards.txt @@ -50805,10 +50805,12 @@ rakwireless_rak3112.build.dfu_on_boot=0 rakwireless_rak3112.build.f_cpu=240000000L rakwireless_rak3112.build.flash_size=16MB rakwireless_rak3112.build.flash_freq=80m -rakwireless_rak3112.build.flash_mode=dio -rakwireless_rak3112.build.boot=dio +rakwireless_rak3112.build.flash_mode=qio +rakwireless_rak3112.build.boot=qio rakwireless_rak3112.build.partitions=default rakwireless_rak3112.build.defines= +rakwireless_rak3112.build.psram_type=opi +rakwireless_rak3112.build.memory_type={build.boot}_{build.psram_type} rakwireless_rak3112.menu.PSRAM.enabled=Enabled rakwireless_rak3112.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM diff --git a/variants/rakwireless_rak3112/pins_arduino.h b/variants/rakwireless_rak3112/pins_arduino.h index 5d1e451494a..f1bcc7a6120 100644 --- a/variants/rakwireless_rak3112/pins_arduino.h +++ b/variants/rakwireless_rak3112/pins_arduino.h @@ -47,4 +47,17 @@ static const uint8_t SCK = 13; #define LORA_BUSY 48 #define LORA_IRQ LORA_DIO1 +// For WisBlock modules, see: https://docs.rakwireless.com/Product-Categories/WisBlock/ +#define WB_IO1 21 +#define WB_IO2 14 +#define WB_IO3 41 +#define WB_IO4 42 +#define WB_IO5 38 +#define WB_IO6 39 +#define WB_A0 1 +#define WB_A1 2 +#define WB_CS 12 +#define WB_LED1 46 +#define WB_LED2 45 + #endif /* Pins_Arduino_h */ From b709a782839e4bfb143df5be9a108ff4414a565c Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 7 Jul 2025 12:01:50 +0200 Subject: [PATCH 217/290] fix deprecated warnings caaused from esptool v5.0.0 (#11556) --- tools/pioarduino-build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pioarduino-build.py b/tools/pioarduino-build.py index b67580e264c..4d4161dd9ca 100644 --- a/tools/pioarduino-build.py +++ b/tools/pioarduino-build.py @@ -95,7 +95,7 @@ def generate_bootloader_image(bootloader_elf): env.VerboseAction( " ".join( [ - '"$PYTHONEXE" "$OBJCOPY"', + "$OBJCOPY", "--chip", build_mcu, "elf2image", From e2c7578fa87e9f20b0a86090b23d89ae22a0146f 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, 8 Jul 2025 12:08:56 +0200 Subject: [PATCH 218/290] feat(zigbee): Add Fan Control endpoint support (#11559) * feat(zigbee): Add Fan Control endpoint support * fix(zigbee): Update logs and change device_id * 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 + .../examples/Zigbee_Fan_Control/README.md | 83 +++++++++++ .../Zigbee_Fan_Control/Zigbee_Fan_Control.ino | 129 ++++++++++++++++++ .../examples/Zigbee_Fan_Control/ci.json | 6 + libraries/Zigbee/keywords.txt | 60 ++++++-- libraries/Zigbee/src/Zigbee.h | 1 + libraries/Zigbee/src/ep/ZigbeeFanControl.cpp | 60 ++++++++ libraries/Zigbee/src/ep/ZigbeeFanControl.h | 65 +++++++++ 8 files changed, 393 insertions(+), 12 deletions(-) create mode 100644 libraries/Zigbee/examples/Zigbee_Fan_Control/README.md create mode 100644 libraries/Zigbee/examples/Zigbee_Fan_Control/Zigbee_Fan_Control.ino create mode 100644 libraries/Zigbee/examples/Zigbee_Fan_Control/ci.json create mode 100644 libraries/Zigbee/src/ep/ZigbeeFanControl.cpp create mode 100644 libraries/Zigbee/src/ep/ZigbeeFanControl.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e8f44ac5ee0..f21183ee11e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -305,6 +305,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeElectricalMeasurement.cpp libraries/Zigbee/src/ep/ZigbeeBinary.cpp libraries/Zigbee/src/ep/ZigbeePowerOutlet.cpp + libraries/Zigbee/src/ep/ZigbeeFanControl.cpp ) set(ARDUINO_LIBRARY_BLE_SRCS diff --git a/libraries/Zigbee/examples/Zigbee_Fan_Control/README.md b/libraries/Zigbee/examples/Zigbee_Fan_Control/README.md new file mode 100644 index 00000000000..91700b669a0 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Fan_Control/README.md @@ -0,0 +1,83 @@ +# Arduino-ESP32 Zigbee Fan Control Example + +This example demonstrates how to use the Zigbee library to create a router device fan control and use it as a Home Automation (HA) fan control device. + +# Supported Targets + +Currently, this example supports the following targets. + +| Supported Targets | ESP32-C6 | ESP32-H2 | +| ----------------- | -------- | -------- | + +## Fan Control Functions + +1. Initialize a Zigbee fan control device. +2. Control fan modes (OFF, LOW, MEDIUM, HIGH, ON). +3. Respond to fan control commands from the Zigbee network. + +## Hardware Required + +* ESP32-H2 or ESP32-C6 development board +* A USB cable for power supply and programming +* RGB LED for visual feedback (built-in on most development boards) + +### Configure the Project + +In this example the RGB LED is used to indicate the current fan control mode. +The LED colors represent different fan modes: +- OFF: No light +- LOW: Blue +- MEDIUM: Yellow +- HIGH: Red +- ON: White + +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 ZCZR (coordinator/router)` +* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee ZCZR 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_Fan_Control/Zigbee_Fan_Control.ino b/libraries/Zigbee/examples/Zigbee_Fan_Control/Zigbee_Fan_Control.ino new file mode 100644 index 00000000000..4c0d15aa563 --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Fan_Control/Zigbee_Fan_Control.ino @@ -0,0 +1,129 @@ +// 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 simple Zigbee fan control. + * + * The example demonstrates how to use Zigbee library to create a router device fan control. + * The fan control is a Zigbee router 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_ZCZR +#error "Zigbee coordinator mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +/* Zigbee light bulb configuration */ +#define ZIGBEE_FAN_CONTROL_ENDPOINT 1 + +#ifdef RGB_BUILTIN +uint8_t led = RGB_BUILTIN; // To demonstrate the current fan control mode +#else +uint8_t led = 2; +#endif + +uint8_t button = BOOT_PIN; + +ZigbeeFanControl zbFanControl = ZigbeeFanControl(ZIGBEE_FAN_CONTROL_ENDPOINT); + +/********************* fan control callback function **************************/ +void setFan(ZigbeeFanMode mode) { + switch (mode) { + case FAN_MODE_OFF: + rgbLedWrite(led, 0, 0, 0); // Off + Serial.println("Fan mode: OFF"); + break; + case FAN_MODE_LOW: + rgbLedWrite(led, 0, 0, 255); // Blue + Serial.println("Fan mode: LOW"); + break; + case FAN_MODE_MEDIUM: + rgbLedWrite(led, 255, 255, 0); // Yellow + Serial.println("Fan mode: MEDIUM"); + break; + case FAN_MODE_HIGH: + rgbLedWrite(led, 255, 0, 0); // Red + Serial.println("Fan mode: HIGH"); + break; + case FAN_MODE_ON: + rgbLedWrite(led, 255, 255, 255); // White + Serial.println("Fan mode: ON"); + break; + default: log_e("Unhandled fan mode: %d", mode); break; + } +} + +/********************* Arduino functions **************************/ +void setup() { + Serial.begin(115200); + + // Init LED that will be used to indicate the current fan control mode + rgbLedWrite(led, 0, 0, 0); + + // Init button for factory reset + pinMode(button, INPUT_PULLUP); + + //Optional: set Zigbee device name and model + zbFanControl.setManufacturerAndModel("Espressif", "ZBFanControl"); + + // Set the fan mode sequence to LOW_MED_HIGH + zbFanControl.setFanModeSequence(FAN_MODE_SEQUENCE_LOW_MED_HIGH); + + // Set callback function for fan mode change + zbFanControl.onFanModeChange(setFan); + + //Add endpoint to Zigbee Core + Serial.println("Adding ZigbeeFanControl endpoint to Zigbee Core"); + Zigbee.addEndpoint(&zbFanControl); + + // When all EPs are registered, start Zigbee in ROUTER mode + if (!Zigbee.begin(ZIGBEE_ROUTER)) { + 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) == 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_Fan_Control/ci.json b/libraries/Zigbee/examples/Zigbee_Fan_Control/ci.json new file mode 100644 index 00000000000..15d6190e4ae --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Fan_Control/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee_zczr,ZigbeeMode=zczr", + "requires": [ + "CONFIG_ZB_ENABLED=y" + ] +} diff --git a/libraries/Zigbee/keywords.txt b/libraries/Zigbee/keywords.txt index 556b6408ea2..23f3af3bf02 100644 --- a/libraries/Zigbee/keywords.txt +++ b/libraries/Zigbee/keywords.txt @@ -12,25 +12,31 @@ Zigbee KEYWORD1 ZigbeeEP KEYWORD1 # Endpoint Classes -ZigbeeLight KEYWORD1 -ZigbeeSwitch KEYWORD1 -ZigbeeColorDimmableLight KEYWORD1 -ZigbeeColorDimmerSwitch KEYWORD1 -ZigbeeTempSensor KEYWORD1 -ZigbeeThermostat KEYWORD1 -ZigbeeFlowSensor KEYWORD1 -ZigbeePressureSensor KEYWORD1 -ZigbeeOccupancySensor KEYWORD1 ZigbeeAnalog KEYWORD1 +ZigbeeBinary KEYWORD1 ZigbeeCarbonDioxideSensor KEYWORD1 +ZigbeeColorDimmableLight KEYWORD1 +ZigbeeColorDimmerSwitch KEYWORD1 ZigbeeContactSwitch KEYWORD1 +ZigbeeDimableLight KEYWORD1 ZigbeeDoorWindowHandle KEYWORD1 +ZigbeeElectricalMeasurement KEYWORD1 +ZigbeeFanControl KEYWORD1 +ZigbeeFlowSensor KEYWORD1 ZigbeeGateway KEYWORD1 +ZigbeeIlluminanceSensor KEYWORD1 +ZigbeeLight KEYWORD1 +ZigbeeOccupancySensor KEYWORD1 +ZigbeePM25Sensor KEYWORD1 +ZigbeePowerOutlet KEYWORD1 +ZigbeePressureSensor KEYWORD1 ZigbeeRangeExtender KEYWORD1 +ZigbeeSwitch KEYWORD1 +ZigbeeTempSensor KEYWORD1 +ZigbeeThermostat KEYWORD1 ZigbeeVibrationSensor KEYWORD1 ZigbeeWindowCovering KEYWORD1 -ZigbeeIlluminanceSensor KEYWORD1 -ZigbeePowerOutlet KEYWORD1 +ZigbeeWindSpeedSensor KEYWORD1 # Other zigbee_role_t KEYWORD1 @@ -39,6 +45,8 @@ zb_device_params_t KEYWORD1 zigbee_scan_result_t KEYWORD1 zb_power_source_t KEYWORD1 ZigbeeWindowCoveringType KEYWORD1 +ZigbeeFanMode KEYWORD1 +ZigbeeFanModeSequence KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -73,6 +81,7 @@ printBoundDevices KEYWORD2 getBoundDevices KEYWORD2 bound KEYWORD2 allowMultipleBinding KEYWORD2 +setManualBinding KEYWORD2 setManufacturerAndModel KEYWORD2 setPowerSource KEYWORD2 setBatteryPercentage KEYWORD2 @@ -80,6 +89,13 @@ reportBatteryPercentage KEYWORD2 readManufacturer KEYWORD2 readModel KEYWORD2 onIdentify KEYWORD2 +addTimeCluster KEYWORD2 +setTime KEYWORD2 +setTimezone KEYWORD2 +getTime KEYWORD2 +getTimezone KEYWORD2 +addOTAClient KEYWORD2 +clearBoundDevices KEYWORD2 # ZigbeeLight + ZigbeeColorDimmableLight onLightChange KEYWORD2 @@ -171,7 +187,7 @@ setTilted KEYWORD2 # ZigbeeVibrationSensor setVibration KEYWORD2 -ZigbeeWindowCovering +# ZigbeeWindowCovering onOpen KEYWORD2 onClose KEYWORD2 onGoToLiftPercentage KEYWORD2 @@ -186,6 +202,26 @@ setConfigStatus KEYWORD2 setMode KEYWORD2 setLimits KEYWORD2 +# ZigbeeBinary +addBinaryInput KEYWORD2 +addBinaryOutput KEYWORD2 +onBinaryOutputChange KEYWORD2 +setBinaryInput KEYWORD2 +setBinaryOutput KEYWORD2 +getBinaryOutput KEYWORD2 +reportBinaryInput KEYWORD2 +reportBinaryOutput KEYWORD2 +setBinaryInputApplication KEYWORD2 +setBinaryInputDescription KEYWORD2 +setBinaryOutputApplication KEYWORD2 +setBinaryOutputDescription KEYWORD2 + +# ZigbeeFanControl +setFanModeSequence KEYWORD2 +getFanMode KEYWORD2 +getFanModeSequence KEYWORD2 +onFanModeChange KEYWORD2 + ####################################### # Constants (LITERAL1) ####################################### diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index b2e2e5dd027..65c9e7f0daa 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -16,6 +16,7 @@ #include "ep/ZigbeeLight.h" //// Controllers #include "ep/ZigbeeThermostat.h" +#include "ep/ZigbeeFanControl.h" ////Outlets #include "ep/ZigbeePowerOutlet.h" //// Sensors diff --git a/libraries/Zigbee/src/ep/ZigbeeFanControl.cpp b/libraries/Zigbee/src/ep/ZigbeeFanControl.cpp new file mode 100644 index 00000000000..f4b32ce1200 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeFanControl.cpp @@ -0,0 +1,60 @@ +#include "ZigbeeFanControl.h" +#if CONFIG_ZB_ENABLED + +ZigbeeFanControl::ZigbeeFanControl(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_THERMOSTAT_DEVICE_ID; //There is no FAN_CONTROL_DEVICE_ID in the Zigbee spec + + //Create basic analog sensor clusters without configuration + _cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(_cluster_list, esp_zb_basic_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(_cluster_list, esp_zb_identify_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_fan_control_cluster(_cluster_list, esp_zb_fan_control_cluster_create(NULL), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + + _ep_config = { + .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_HEATING_COOLING_UNIT_DEVICE_ID, .app_device_version = 0 + }; +} + +bool ZigbeeFanControl::setFanModeSequence(ZigbeeFanModeSequence sequence) { + esp_zb_attribute_list_t *fan_control_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_FAN_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_err_t ret = esp_zb_cluster_update_attr(fan_control_cluster, ESP_ZB_ZCL_ATTR_FAN_CONTROL_FAN_MODE_SEQUENCE_ID, (void *)&sequence); + if (ret != ESP_OK) { + log_e("Failed to set min value: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + _current_fan_mode_sequence = sequence; + _current_fan_mode = FAN_MODE_OFF; + // Set initial fan mode to OFF + ret = esp_zb_cluster_update_attr(fan_control_cluster, ESP_ZB_ZCL_ATTR_FAN_CONTROL_FAN_MODE_ID, (void *)&_current_fan_mode); + if (ret != ESP_OK) { + log_e("Failed to set fan mode: 0x%x: %s", ret, esp_err_to_name(ret)); + return false; + } + return true; +} + +//set attribute method -> method overridden in child class +void ZigbeeFanControl::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_FAN_CONTROL) { + if (message->attribute.id == ESP_ZB_ZCL_ATTR_FAN_CONTROL_FAN_MODE_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_8BIT_ENUM) { + _current_fan_mode = *(ZigbeeFanMode *)message->attribute.data.value; + fanModeChanged(); + } else { + log_w("Received message ignored. Attribute ID: %d not supported for Fan Control", message->attribute.id); + } + } else { + log_w("Received message ignored. Cluster ID: %d not supported for Fan Control", message->info.cluster); + } +} + +void ZigbeeFanControl::fanModeChanged() { + if (_on_fan_mode_change) { + _on_fan_mode_change(_current_fan_mode); + } else { + log_w("No callback function set for fan mode change"); + } +} + +#endif // CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeFanControl.h b/libraries/Zigbee/src/ep/ZigbeeFanControl.h new file mode 100644 index 00000000000..25b5862c5c4 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeFanControl.h @@ -0,0 +1,65 @@ +/* Class of Zigbee Pressure sensor endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#include "sdkconfig.h" +#if CONFIG_ZB_ENABLED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +// Custom Arduino-friendly enums for fan mode values +enum ZigbeeFanMode { + FAN_MODE_OFF = ESP_ZB_ZCL_FAN_CONTROL_FAN_MODE_OFF, + FAN_MODE_LOW = ESP_ZB_ZCL_FAN_CONTROL_FAN_MODE_LOW, + FAN_MODE_MEDIUM = ESP_ZB_ZCL_FAN_CONTROL_FAN_MODE_MEDIUM, + FAN_MODE_HIGH = ESP_ZB_ZCL_FAN_CONTROL_FAN_MODE_HIGH, + FAN_MODE_ON = ESP_ZB_ZCL_FAN_CONTROL_FAN_MODE_ON, + FAN_MODE_AUTO = ESP_ZB_ZCL_FAN_CONTROL_FAN_MODE_AUTO, + FAN_MODE_SMART = ESP_ZB_ZCL_FAN_CONTROL_FAN_MODE_SMART, +}; + +// Custom Arduino-friendly enums for fan mode sequence +enum ZigbeeFanModeSequence { + FAN_MODE_SEQUENCE_LOW_MED_HIGH = ESP_ZB_ZCL_FAN_CONTROL_FAN_MODE_SEQUENCE_LOW_MED_HIGH, + FAN_MODE_SEQUENCE_LOW_HIGH = ESP_ZB_ZCL_FAN_CONTROL_FAN_MODE_SEQUENCE_LOW_HIGH, + FAN_MODE_SEQUENCE_LOW_MED_HIGH_AUTO = ESP_ZB_ZCL_FAN_CONTROL_FAN_MODE_SEQUENCE_LOW_MED_HIGH_AUTO, + FAN_MODE_SEQUENCE_LOW_HIGH_AUTO = ESP_ZB_ZCL_FAN_CONTROL_FAN_MODE_SEQUENCE_LOW_HIGH_AUTO, + FAN_MODE_SEQUENCE_ON_AUTO = ESP_ZB_ZCL_FAN_CONTROL_FAN_MODE_SEQUENCE_ON_AUTO, +}; + +class ZigbeeFanControl : public ZigbeeEP { +public: + ZigbeeFanControl(uint8_t endpoint); + ~ZigbeeFanControl() {} + + // Set the fan mode sequence value + bool setFanModeSequence(ZigbeeFanModeSequence sequence); + + // Use to get fan mode + ZigbeeFanMode getFanMode() { + return _current_fan_mode; + } + + // Use to get fan mode sequence + ZigbeeFanModeSequence getFanModeSequence() { + return _current_fan_mode_sequence; + } + + // On fan mode change callback + void onFanModeChange(void (*callback)(ZigbeeFanMode mode)) { + _on_fan_mode_change = callback; + } + +private: + void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override; + //callback function to be called on fan mode change + void (*_on_fan_mode_change)(ZigbeeFanMode mode); + void fanModeChanged(); + + ZigbeeFanMode _current_fan_mode; + ZigbeeFanModeSequence _current_fan_mode_sequence; +}; + +#endif // CONFIG_ZB_ENABLED From 040e0ca42a04e644e5bffee62e2ce211aa3e02be Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 8 Jul 2025 07:09:59 -0300 Subject: [PATCH 219/290] fix(dangerjs): Disable target branch rule (#11565) --- .github/workflows/dangerjs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/dangerjs.yml b/.github/workflows/dangerjs.yml index 13bc907566b..bba96bfedee 100644 --- a/.github/workflows/dangerjs.yml +++ b/.github/workflows/dangerjs.yml @@ -24,4 +24,5 @@ jobs: instructions-cla-link: "https://cla-assistant.io/espressif/arduino-esp32" instructions-contributions-file: "docs/en/contributing.rst" rule-max-commits: "false" + rule-target-branch: "false" commit-messages-min-summary-length: "10" From 241e2576be918218e10a615de851f61b8ebd5936 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 8 Jul 2025 16:00:51 +0300 Subject: [PATCH 220/290] fix(async): Update IP setup in AsyncUDP (#11569) * fix(async): Update IP setup in AsyncUDP * fix(udp): Revert to IP_SET_TYPE_VAL in connect --- libraries/AsyncUDP/src/AsyncUDP.cpp | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/libraries/AsyncUDP/src/AsyncUDP.cpp b/libraries/AsyncUDP/src/AsyncUDP.cpp index cab9c951921..2d533831cd5 100644 --- a/libraries/AsyncUDP/src/AsyncUDP.cpp +++ b/libraries/AsyncUDP/src/AsyncUDP.cpp @@ -582,8 +582,8 @@ bool AsyncUDP::listen(const ip_addr_t *addr, uint16_t port) { } close(); if (addr) { - IP_SET_TYPE_VAL(_pcb->local_ip, addr->type); - IP_SET_TYPE_VAL(_pcb->remote_ip, addr->type); + IP_SET_TYPE_VAL(_pcb->local_ip, IP_GET_TYPE(addr)); + IP_SET_TYPE_VAL(_pcb->remote_ip, IP_GET_TYPE(addr)); } if (_udp_bind(_pcb, addr, port) != ERR_OK) { return false; @@ -692,17 +692,8 @@ bool AsyncUDP::listenMulticast(const ip_addr_t *addr, uint16_t port, uint8_t ttl return false; } -#if CONFIG_LWIP_IPV6 - if (IP_IS_V6(addr)) { - IP_SET_TYPE(&bind_addr, IPADDR_TYPE_V6); - ip6_addr_set_any(&bind_addr.u_addr.ip6); - } else { -#endif - IP_SET_TYPE(&bind_addr, IPADDR_TYPE_V4); - ip4_addr_set_any(&bind_addr.u_addr.ip4); -#if CONFIG_LWIP_IPV6 - } -#endif + IP_SET_TYPE(&bind_addr, IP_GET_TYPE(addr)); + ip_addr_set_any(IP_IS_V6(addr), &bind_addr); if (!listen(&bind_addr, port)) { return false; } From 2cb6fbccdbb6f07e1d20951727875613047a235f Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Tue, 8 Jul 2025 16:18:42 +0300 Subject: [PATCH 221/290] Add access methods to get the Wire bus number and I2C bus handle (#11570) * feat(i2c): Add method to access the I2C bus handle * feat(wire): Add access method to get the I2C bus number * 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-i2c-ng.c | 7 +++++++ cores/esp32/esp32-hal-i2c.h | 5 +++++ libraries/Wire/src/Wire.cpp | 6 +++++- libraries/Wire/src/Wire.h | 2 ++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-i2c-ng.c b/cores/esp32/esp32-hal-i2c-ng.c index 8e48d0e0397..a3b2307b8a8 100644 --- a/cores/esp32/esp32-hal-i2c-ng.c +++ b/cores/esp32/esp32-hal-i2c-ng.c @@ -56,6 +56,13 @@ static bool i2cDetachBus(void *bus_i2c_num) { return true; } +void *i2cBusHandle(uint8_t i2c_num) { + if (i2c_num >= SOC_I2C_NUM) { + return NULL; + } + return bus[i2c_num].bus_handle; +} + bool i2cIsInit(uint8_t i2c_num) { if (i2c_num >= SOC_I2C_NUM) { return false; diff --git a/cores/esp32/esp32-hal-i2c.h b/cores/esp32/esp32-hal-i2c.h index 35783d350b0..0e4f484bb46 100644 --- a/cores/esp32/esp32-hal-i2c.h +++ b/cores/esp32/esp32-hal-i2c.h @@ -19,6 +19,7 @@ #include "soc/soc_caps.h" #if SOC_I2C_SUPPORTED +#include "esp_idf_version.h" #ifdef __cplusplus extern "C" { @@ -39,6 +40,10 @@ esp_err_t i2cWriteReadNonStop( ); bool i2cIsInit(uint8_t i2c_num); +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) +void *i2cBusHandle(uint8_t i2c_num); +#endif + #ifdef __cplusplus } #endif diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp index f8d9496389f..34c814b5117 100644 --- a/libraries/Wire/src/Wire.cpp +++ b/libraries/Wire/src/Wire.cpp @@ -39,7 +39,7 @@ extern "C" { #include "Arduino.h" TwoWire::TwoWire(uint8_t bus_num) - : num(bus_num & 1), sda(-1), scl(-1), bufferSize(I2C_BUFFER_LENGTH) // default Wire Buffer Size + : num(bus_num), sda(-1), scl(-1), bufferSize(I2C_BUFFER_LENGTH) // default Wire Buffer Size , rxBuffer(NULL), rxIndex(0), rxLength(0), txBuffer(NULL), txLength(0), txAddress(0), _timeOutMillis(50), nonStop(false) #if !CONFIG_DISABLE_HAL_LOCKS @@ -62,6 +62,10 @@ TwoWire::~TwoWire() { #endif } +uint8_t TwoWire::getBusNum() { + return num; +} + bool TwoWire::initPins(int sdaPin, int sclPin) { if (sdaPin < 0) { // default param passed if (num == 0) { diff --git a/libraries/Wire/src/Wire.h b/libraries/Wire/src/Wire.h index 0deab7d4a57..b84aa5b2131 100644 --- a/libraries/Wire/src/Wire.h +++ b/libraries/Wire/src/Wire.h @@ -105,6 +105,8 @@ class TwoWire : public HardwareI2C { bool end() override; + uint8_t getBusNum(); + bool setClock(uint32_t freq) override; void beginTransmission(uint8_t address) override; From 6a5839acb2ead9b98bf0761c8bef16cbf327e6ca Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 8 Jul 2025 11:56:23 -0300 Subject: [PATCH 222/290] change(esptool): Upgrade esptool to release v5.0.0 (#11562) --- .github/scripts/package_esptool.sh | 129 ------------ .github/scripts/update_esptool.py | 236 ++++++++++++++++++++++ package/package_esp32_index.template.json | 60 +++--- 3 files changed, 266 insertions(+), 159 deletions(-) delete mode 100755 .github/scripts/package_esptool.sh create mode 100644 .github/scripts/update_esptool.py diff --git a/.github/scripts/package_esptool.sh b/.github/scripts/package_esptool.sh deleted file mode 100755 index 32b87b277e9..00000000000 --- a/.github/scripts/package_esptool.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -# Check version argument -if [[ $# -ne 3 ]]; then - echo "Usage: $0 " - echo "Example: $0 5.0.dev1 /tmp/esptool /tmp/esptool-5.0.dev1.json" - exit 1 -fi - -VERSION=$1 -BASE_FOLDER=$2 -JSON_PATH=$3 - -export COPYFILE_DISABLE=1 - -shopt -s nullglob # So for loop doesn't run if no matches - -# Function to update JSON for a given host -function update_json_for_host { - local host=$1 - local archive=$2 - - # Extract the old url from the JSON for this host, then replace only the filename - old_url=$(jq -r --arg host "$host" ' - .packages[].tools[] | select(.name == "esptool_py") | .systems[] | select(.host == $host) | .url // empty - ' "$tmp_json") - if [[ -n "$old_url" ]]; then - base_url="${old_url%/*}" - url="$base_url/$archive" - else - echo "No old url found for $host" - exit 1 - fi - - archiveFileName="$archive" - checksum="SHA-256:$(shasum -a 256 "$archive" | awk '{print $1}')" - size=$(stat -f%z "$archive") - - # Use jq to update the JSON - jq --arg host "$host" \ - --arg url "$url" \ - --arg archiveFileName "$archiveFileName" \ - --arg checksum "$checksum" \ - --arg size "$size" \ - ' - .packages[].tools[] - |= if .name == "esptool_py" then - .systems = ( - ((.systems // []) | map(select(.host != $host))) + [{ - host: $host, - url: $url, - archiveFileName: $archiveFileName, - checksum: $checksum, - size: $size - }] - ) - else - . - end - ' "$tmp_json" > "$tmp_json.new" && mv "$tmp_json.new" "$tmp_json" -} - -cd "$BASE_FOLDER" - -# Delete all archives before starting -rm -f esptool-*.tar.gz esptool-*.zip - -for dir in esptool-*; do - # Check if directory exists and is a directory - if [[ ! -d "$dir" ]]; then - continue - fi - - base="${dir#esptool-}" - - # Add 'linux-' prefix if base doesn't contain linux/macos/win64 - if [[ "$base" != *linux* && "$base" != *macos* && "$base" != *win64* ]]; then - base="linux-${base}" - fi - - if [[ "$dir" == esptool-win* ]]; then - # Windows zip archive - zipfile="esptool-v${VERSION}-${base}.zip" - echo "Creating $zipfile from $dir ..." - zip -r "$zipfile" "$dir" - else - # Non-Windows: set permissions and tar.gz archive - tarfile="esptool-v${VERSION}-${base}.tar.gz" - echo "Setting permissions and creating $tarfile from $dir ..." - chmod -R u=rwx,g=rx,o=rx "$dir" - tar -cvzf "$tarfile" "$dir" - fi -done - -# After the for loop, update the JSON for each archive -# Create a temporary JSON file to accumulate changes -tmp_json="${JSON_PATH}.tmp" -cp "$JSON_PATH" "$tmp_json" - -for archive in esptool-v"${VERSION}"-*.tar.gz esptool-v"${VERSION}"-*.zip; do - [ -f "$archive" ] || continue - - echo "Updating JSON for $archive" - - # Determine host from archive name - case "$archive" in - *linux-amd64*) host="x86_64-pc-linux-gnu" ;; - *linux-armv7*) host="arm-linux-gnueabihf" ;; - *linux-aarch64*) host="aarch64-linux-gnu" ;; - *macos-amd64*) host="x86_64-apple-darwin" ;; - *macos-arm64*) host="arm64-apple-darwin" ;; - *win64*) hosts=("x86_64-mingw32" "i686-mingw32") ;; - *) echo "Unknown host for $archive"; continue ;; - esac - - # For win64, loop over both hosts; otherwise, use a single host - if [[ "$archive" == *win64* ]]; then - for host in "${hosts[@]}"; do - update_json_for_host "$host" "$archive" - done - else - update_json_for_host "$host" "$archive" - fi -done - -# After all archives are processed, move the temporary JSON to the final file -mv "$tmp_json" "$JSON_PATH" diff --git a/.github/scripts/update_esptool.py b/.github/scripts/update_esptool.py new file mode 100644 index 00000000000..d99462fcb8f --- /dev/null +++ b/.github/scripts/update_esptool.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python3 + +# This script is used to re-package the esptool if needed and update the JSON file +# for the Arduino ESP32 platform. +# +# The script has only been tested on macOS. +# +# For regular esptool releases, the generated packages already contain the correct permissions, +# extensions and are uploaded to the GitHub release assets. In this case, the script will only +# update the JSON file with the information from the GitHub release. +# +# The script can be used in two modes: +# 1. Local build: The build artifacts must be already downloaded and extracted in the base_folder. +# This is useful for esptool versions that are not yet released and that are grabbed from the +# GitHub build artifacts. +# 2. Release build: The script will get the release information from GitHub and update the JSON file. +# This is useful for esptool versions that are already released and that are uploaded to the +# GitHub release assets. +# +# For local build, the artifacts must be already downloaded and extracted in the base_folder +# set with the -l option. +# For example, a base folder "esptool" should contain the following folders extracted directly +# from the GitHub build artifacts: +# esptool/esptool-linux-aarch64 +# esptool/esptool-linux-amd64 +# esptool/esptool-linux-armv7 +# esptool/esptool-macos-amd64 +# esptool/esptool-macos-arm64 +# esptool/esptool-windows-amd64 + +import argparse +import json +import os +import shutil +import stat +import tarfile +import zipfile +import hashlib +import requests +from pathlib import Path + +def compute_sha256(filepath): + sha256 = hashlib.sha256() + with open(filepath, "rb") as f: + for block in iter(lambda: f.read(4096), b""): + sha256.update(block) + return f"SHA-256:{sha256.hexdigest()}" + +def get_file_size(filepath): + return os.path.getsize(filepath) + +def update_json_for_host(tmp_json_path, version, host, url, archiveFileName, checksum, size): + with open(tmp_json_path) as f: + data = json.load(f) + + for pkg in data.get("packages", []): + for tool in pkg.get("tools", []): + if tool.get("name") == "esptool_py": + tool["version"] = version + + if url is None: + # If the URL is not set, we need to find the old URL and update it + for system in tool.get("systems", []): + if system.get("host") == host: + url = system.get("url").replace(system.get("archiveFileName"), archiveFileName) + break + else: + print(f"No old URL found for host {host}. Using empty URL.") + url = "" + + # Preserve existing systems order and update or append the new system + systems = tool.get("systems", []) + system_updated = False + for i, system in enumerate(systems): + if system.get("host") == host: + systems[i] = { + "host": host, + "url": url, + "archiveFileName": archiveFileName, + "checksum": checksum, + "size": str(size), + } + system_updated = True + break + + if not system_updated: + systems.append({ + "host": host, + "url": url, + "archiveFileName": archiveFileName, + "checksum": checksum, + "size": str(size), + }) + tool["systems"] = systems + + with open(tmp_json_path, "w") as f: + json.dump(data, f, indent=2, sort_keys=False, ensure_ascii=False) + f.write("\n") + +def update_tools_dependencies(tmp_json_path, version): + with open(tmp_json_path) as f: + data = json.load(f) + + for pkg in data.get("packages", []): + for platform in pkg.get("platforms", []): + for dep in platform.get("toolsDependencies", []): + if dep.get("name") == "esptool_py": + dep["version"] = version + + with open(tmp_json_path, "w") as f: + json.dump(data, f, indent=2, sort_keys=False, ensure_ascii=False) + f.write("\n") + +def create_archives(version, base_folder): + archive_files = [] + + for dirpath in Path(base_folder).glob("esptool-*"): + if not dirpath.is_dir(): + continue + + base = dirpath.name[len("esptool-"):] + + if "windows" in dirpath.name: + zipfile_name = f"esptool-v{version}-{base}.zip" + print(f"Creating {zipfile_name} from {dirpath} ...") + with zipfile.ZipFile(zipfile_name, "w", zipfile.ZIP_DEFLATED) as zipf: + for root, _, files in os.walk(dirpath): + for file in files: + full_path = os.path.join(root, file) + zipf.write(full_path, os.path.relpath(full_path, start=dirpath)) + archive_files.append(zipfile_name) + else: + tarfile_name = f"esptool-v{version}-{base}.tar.gz" + print(f"Creating {tarfile_name} from {dirpath} ...") + for root, dirs, files in os.walk(dirpath): + for name in dirs + files: + os.chmod(os.path.join(root, name), stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR | + stat.S_IRGRP | stat.S_IXGRP | + stat.S_IROTH | stat.S_IXOTH) + with tarfile.open(tarfile_name, "w:gz") as tar: + tar.add(dirpath, arcname=dirpath.name) + archive_files.append(tarfile_name) + + return archive_files + +def determine_hosts(archive_name): + if "linux-amd64" in archive_name: + return ["x86_64-pc-linux-gnu"] + elif "linux-armv7" in archive_name: + return ["arm-linux-gnueabihf"] + elif "linux-aarch64" in archive_name: + return ["aarch64-linux-gnu"] + elif "macos-amd64" in archive_name: + return ["x86_64-apple-darwin"] + elif "macos-arm64" in archive_name: + return ["arm64-apple-darwin"] + elif "windows-amd64" in archive_name: + return ["x86_64-mingw32", "i686-mingw32"] + else: + return [] + +def update_json_from_local_build(tmp_json_path, version, base_folder, archive_files): + for archive in archive_files: + print(f"Processing archive: {archive}") + hosts = determine_hosts(archive) + if not hosts: + print(f"Skipping unknown archive type: {archive}") + continue + + archive_path = Path(archive) + checksum = compute_sha256(archive_path) + size = get_file_size(archive_path) + + for host in hosts: + update_json_for_host(tmp_json_path, version, host, None, archive_path.name, checksum, size) + +def update_json_from_release(tmp_json_path, version, release_info): + assets = release_info.get("assets", []) + for asset in assets: + if (asset.get("name").endswith(".tar.gz") or asset.get("name").endswith(".zip")) and "esptool" in asset.get("name"): + asset_fname = asset.get("name") + print(f"Processing asset: {asset_fname}") + hosts = determine_hosts(asset_fname) + if not hosts: + print(f"Skipping unknown archive type: {asset_fname}") + continue + + asset_url = asset.get("browser_download_url") + asset_checksum = asset.get("digest").replace("sha256:", "SHA-256:") + asset_size = asset.get("size") + if asset_checksum is None: + asset_checksum = "" + print(f"Asset {asset_fname} has no checksum. Please set the checksum in the JSON file.") + + for host in hosts: + update_json_for_host(tmp_json_path, version, host, asset_url, asset_fname, asset_checksum, asset_size) + +def get_release_info(version): + url = f"https://api.github.com/repos/espressif/esptool/releases/tags/v{version}" + response = requests.get(url) + response.raise_for_status() + return response.json() + +def main(): + parser = argparse.ArgumentParser(description="Repack esptool and update JSON metadata.") + parser.add_argument("version", help="Version of the esptool (e.g. 5.0.dev1)") + parser.add_argument("-l", "--local", dest="base_folder", help="Enable local build mode and set the base folder with unpacked artifacts") + args = parser.parse_args() + + script_dir = Path(__file__).resolve().parent + json_path = (script_dir / "../../package/package_esp32_index.template.json").resolve() + tmp_json_path = Path(str(json_path) + ".tmp") + shutil.copy(json_path, tmp_json_path) + + local_build = args.base_folder is not None + + if local_build: + os.chdir(args.base_folder) + os.environ['COPYFILE_DISABLE'] = 'true' # this disables including resource forks in tar files on macOS + # Clear any existing archive files + for file in Path(args.base_folder).glob("esptool-*.*"): + file.unlink() + archive_files = create_archives(args.version, args.base_folder) + update_json_from_local_build(tmp_json_path, args.version, args.base_folder, archive_files) + else: + release_info = get_release_info(args.version) + update_json_from_release(tmp_json_path, args.version, release_info) + + print(f"Updating esptool version fields to {args.version}") + update_tools_dependencies(tmp_json_path, args.version) + + shutil.move(tmp_json_path, json_path) + print(f"Done. JSON updated at {json_path}") + +if __name__ == "__main__": + main() diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index bbb77f8ef5a..5f5d1f0e08b 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -81,7 +81,7 @@ { "packager": "esp32", "name": "esptool_py", - "version": "5.0.dev1" + "version": "5.0.0" }, { "packager": "esp32", @@ -469,56 +469,56 @@ }, { "name": "esptool_py", - "version": "5.0.dev1", + "version": "5.0.0", "systems": [ { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-linux-aarch64.tar.gz", - "archiveFileName": "esptool-v5.0.dev1-linux-aarch64.tar.gz", - "checksum": "SHA-256:bfafa7a7723ebbabfd8b6e3ca5ae00bfead0331de923754aeddb43b2c116a078", - "size": "58241736" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-linux-aarch64.tar.gz", + "archiveFileName": "esptool-v5.0.0-linux-aarch64.tar.gz", + "checksum": "SHA-256:2bf239f3ed76141a957cadb205b94414ec6da9ace4e85f285e247d20a92b83e3", + "size": "58231895" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-linux-amd64.tar.gz", - "archiveFileName": "esptool-v5.0.dev1-linux-amd64.tar.gz", - "checksum": "SHA-256:acd0486e96586b99d053a1479acbbbfcae8667227c831cdc53a171f9ccfa27ee", - "size": "100740042" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-linux-amd64.tar.gz", + "archiveFileName": "esptool-v5.0.0-linux-amd64.tar.gz", + "checksum": "SHA-256:3b3835d266ac61f3242758f2fe34e3b33dbe6ee4b5acde005da793356f9f7043", + "size": "100783748" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-linux-armv7.tar.gz", - "archiveFileName": "esptool-v5.0.dev1-linux-armv7.tar.gz", - "checksum": "SHA-256:ea77a38681506761bbb7b0b39c130811ed565667b67ebbdb4d6dcc6cb6e07368", - "size": "53451939" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-linux-armv7.tar.gz", + "archiveFileName": "esptool-v5.0.0-linux-armv7.tar.gz", + "checksum": "SHA-256:e55cd321abecfcf27f72a2bff5d5e19a5365fd400de66d71c5e7218e77556315", + "size": "53461760" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-macos-amd64.tar.gz", - "archiveFileName": "esptool-v5.0.dev1-macos-amd64.tar.gz", - "checksum": "SHA-256:900a8e90731208bee96647e0e207a43612b9452c2120c4fdc0ff4c6be226257b", - "size": "59631998" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-macos-amd64.tar.gz", + "archiveFileName": "esptool-v5.0.0-macos-amd64.tar.gz", + "checksum": "SHA-256:424da2bdf0435257ad81bcb7eae6fd8dd7f675ce5b2ee60032f4ecec4d6a5d45", + "size": "59629533" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-macos-arm64.tar.gz", - "archiveFileName": "esptool-v5.0.dev1-macos-arm64.tar.gz", - "checksum": "SHA-256:3653f4de73cb4fc6a25351eaf663708e91c65ae3265d75bd54ca4315a4350bb4", - "size": "56349992" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-macos-arm64.tar.gz", + "archiveFileName": "esptool-v5.0.0-macos-arm64.tar.gz", + "checksum": "SHA-256:b91dfe1da7b0041376683dec10a91dfb266fbda2fb86ed87c4a034ff7182ee56", + "size": "56343104" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-win64.zip", - "archiveFileName": "esptool-v5.0.dev1-win64.zip", - "checksum": "SHA-256:1e8fd89645daf94f2d4406ec73c9004e617ea921079515f9fd749205eece4d6d", - "size": "59102658" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-windows-amd64.zip", + "archiveFileName": "esptool-v5.0.0-windows-amd64.zip", + "checksum": "SHA-256:2294107f66db6f09b886b337728a981173c9e7eab45a030928a8a5a1370611ca", + "size": "59105322" }, { "host": "i686-mingw32", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-win64.zip", - "archiveFileName": "esptool-v5.0.dev1-win64.zip", - "checksum": "SHA-256:1e8fd89645daf94f2d4406ec73c9004e617ea921079515f9fd749205eece4d6d", - "size": "59102658" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-windows-amd64.zip", + "archiveFileName": "esptool-v5.0.0-windows-amd64.zip", + "checksum": "SHA-256:2294107f66db6f09b886b337728a981173c9e7eab45a030928a8a5a1370611ca", + "size": "59105322" } ] }, From ccc0a69ef88202519c0773ec254ee31cbe2baf82 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Tue, 8 Jul 2025 11:58:36 -0300 Subject: [PATCH 223/290] change(esptool): Upgrade esptool to release v5.0.0 (#11563) --- .github/scripts/package_esptool.sh | 129 ---------------------- .github/scripts/update_esptool.py | 2 +- package/package_esp32_index.template.json | 60 +++++----- 3 files changed, 31 insertions(+), 160 deletions(-) delete mode 100755 .github/scripts/package_esptool.sh diff --git a/.github/scripts/package_esptool.sh b/.github/scripts/package_esptool.sh deleted file mode 100755 index 32b87b277e9..00000000000 --- a/.github/scripts/package_esptool.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -# Check version argument -if [[ $# -ne 3 ]]; then - echo "Usage: $0 " - echo "Example: $0 5.0.dev1 /tmp/esptool /tmp/esptool-5.0.dev1.json" - exit 1 -fi - -VERSION=$1 -BASE_FOLDER=$2 -JSON_PATH=$3 - -export COPYFILE_DISABLE=1 - -shopt -s nullglob # So for loop doesn't run if no matches - -# Function to update JSON for a given host -function update_json_for_host { - local host=$1 - local archive=$2 - - # Extract the old url from the JSON for this host, then replace only the filename - old_url=$(jq -r --arg host "$host" ' - .packages[].tools[] | select(.name == "esptool_py") | .systems[] | select(.host == $host) | .url // empty - ' "$tmp_json") - if [[ -n "$old_url" ]]; then - base_url="${old_url%/*}" - url="$base_url/$archive" - else - echo "No old url found for $host" - exit 1 - fi - - archiveFileName="$archive" - checksum="SHA-256:$(shasum -a 256 "$archive" | awk '{print $1}')" - size=$(stat -f%z "$archive") - - # Use jq to update the JSON - jq --arg host "$host" \ - --arg url "$url" \ - --arg archiveFileName "$archiveFileName" \ - --arg checksum "$checksum" \ - --arg size "$size" \ - ' - .packages[].tools[] - |= if .name == "esptool_py" then - .systems = ( - ((.systems // []) | map(select(.host != $host))) + [{ - host: $host, - url: $url, - archiveFileName: $archiveFileName, - checksum: $checksum, - size: $size - }] - ) - else - . - end - ' "$tmp_json" > "$tmp_json.new" && mv "$tmp_json.new" "$tmp_json" -} - -cd "$BASE_FOLDER" - -# Delete all archives before starting -rm -f esptool-*.tar.gz esptool-*.zip - -for dir in esptool-*; do - # Check if directory exists and is a directory - if [[ ! -d "$dir" ]]; then - continue - fi - - base="${dir#esptool-}" - - # Add 'linux-' prefix if base doesn't contain linux/macos/win64 - if [[ "$base" != *linux* && "$base" != *macos* && "$base" != *win64* ]]; then - base="linux-${base}" - fi - - if [[ "$dir" == esptool-win* ]]; then - # Windows zip archive - zipfile="esptool-v${VERSION}-${base}.zip" - echo "Creating $zipfile from $dir ..." - zip -r "$zipfile" "$dir" - else - # Non-Windows: set permissions and tar.gz archive - tarfile="esptool-v${VERSION}-${base}.tar.gz" - echo "Setting permissions and creating $tarfile from $dir ..." - chmod -R u=rwx,g=rx,o=rx "$dir" - tar -cvzf "$tarfile" "$dir" - fi -done - -# After the for loop, update the JSON for each archive -# Create a temporary JSON file to accumulate changes -tmp_json="${JSON_PATH}.tmp" -cp "$JSON_PATH" "$tmp_json" - -for archive in esptool-v"${VERSION}"-*.tar.gz esptool-v"${VERSION}"-*.zip; do - [ -f "$archive" ] || continue - - echo "Updating JSON for $archive" - - # Determine host from archive name - case "$archive" in - *linux-amd64*) host="x86_64-pc-linux-gnu" ;; - *linux-armv7*) host="arm-linux-gnueabihf" ;; - *linux-aarch64*) host="aarch64-linux-gnu" ;; - *macos-amd64*) host="x86_64-apple-darwin" ;; - *macos-arm64*) host="arm64-apple-darwin" ;; - *win64*) hosts=("x86_64-mingw32" "i686-mingw32") ;; - *) echo "Unknown host for $archive"; continue ;; - esac - - # For win64, loop over both hosts; otherwise, use a single host - if [[ "$archive" == *win64* ]]; then - for host in "${hosts[@]}"; do - update_json_for_host "$host" "$archive" - done - else - update_json_for_host "$host" "$archive" - fi -done - -# After all archives are processed, move the temporary JSON to the final file -mv "$tmp_json" "$JSON_PATH" diff --git a/.github/scripts/update_esptool.py b/.github/scripts/update_esptool.py index dd5de5526c3..d99462fcb8f 100644 --- a/.github/scripts/update_esptool.py +++ b/.github/scripts/update_esptool.py @@ -186,7 +186,7 @@ def update_json_from_release(tmp_json_path, version, release_info): continue asset_url = asset.get("browser_download_url") - asset_checksum = asset.get("digest") + asset_checksum = asset.get("digest").replace("sha256:", "SHA-256:") asset_size = asset.get("size") if asset_checksum is None: asset_checksum = "" diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index a02be509094..9c2c754504e 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -81,7 +81,7 @@ { "packager": "esp32", "name": "esptool_py", - "version": "5.0.dev1" + "version": "5.0.0" }, { "packager": "esp32", @@ -469,56 +469,56 @@ }, { "name": "esptool_py", - "version": "5.0.dev1", + "version": "5.0.0", "systems": [ { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-linux-aarch64.tar.gz", - "archiveFileName": "esptool-v5.0.dev1-linux-aarch64.tar.gz", - "checksum": "SHA-256:bfafa7a7723ebbabfd8b6e3ca5ae00bfead0331de923754aeddb43b2c116a078", - "size": "58241736" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-linux-aarch64.tar.gz", + "archiveFileName": "esptool-v5.0.0-linux-aarch64.tar.gz", + "checksum": "SHA-256:2bf239f3ed76141a957cadb205b94414ec6da9ace4e85f285e247d20a92b83e3", + "size": "58231895" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-linux-amd64.tar.gz", - "archiveFileName": "esptool-v5.0.dev1-linux-amd64.tar.gz", - "checksum": "SHA-256:acd0486e96586b99d053a1479acbbbfcae8667227c831cdc53a171f9ccfa27ee", - "size": "100740042" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-linux-amd64.tar.gz", + "archiveFileName": "esptool-v5.0.0-linux-amd64.tar.gz", + "checksum": "SHA-256:3b3835d266ac61f3242758f2fe34e3b33dbe6ee4b5acde005da793356f9f7043", + "size": "100783748" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-linux-armv7.tar.gz", - "archiveFileName": "esptool-v5.0.dev1-linux-armv7.tar.gz", - "checksum": "SHA-256:ea77a38681506761bbb7b0b39c130811ed565667b67ebbdb4d6dcc6cb6e07368", - "size": "53451939" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-linux-armv7.tar.gz", + "archiveFileName": "esptool-v5.0.0-linux-armv7.tar.gz", + "checksum": "SHA-256:e55cd321abecfcf27f72a2bff5d5e19a5365fd400de66d71c5e7218e77556315", + "size": "53461760" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-macos-amd64.tar.gz", - "archiveFileName": "esptool-v5.0.dev1-macos-amd64.tar.gz", - "checksum": "SHA-256:900a8e90731208bee96647e0e207a43612b9452c2120c4fdc0ff4c6be226257b", - "size": "59631998" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-macos-amd64.tar.gz", + "archiveFileName": "esptool-v5.0.0-macos-amd64.tar.gz", + "checksum": "SHA-256:424da2bdf0435257ad81bcb7eae6fd8dd7f675ce5b2ee60032f4ecec4d6a5d45", + "size": "59629533" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-macos-arm64.tar.gz", - "archiveFileName": "esptool-v5.0.dev1-macos-arm64.tar.gz", - "checksum": "SHA-256:3653f4de73cb4fc6a25351eaf663708e91c65ae3265d75bd54ca4315a4350bb4", - "size": "56349992" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-macos-arm64.tar.gz", + "archiveFileName": "esptool-v5.0.0-macos-arm64.tar.gz", + "checksum": "SHA-256:b91dfe1da7b0041376683dec10a91dfb266fbda2fb86ed87c4a034ff7182ee56", + "size": "56343104" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-win64.zip", - "archiveFileName": "esptool-v5.0.dev1-win64.zip", - "checksum": "SHA-256:1e8fd89645daf94f2d4406ec73c9004e617ea921079515f9fd749205eece4d6d", - "size": "59102658" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-windows-amd64.zip", + "archiveFileName": "esptool-v5.0.0-windows-amd64.zip", + "checksum": "SHA-256:2294107f66db6f09b886b337728a981173c9e7eab45a030928a8a5a1370611ca", + "size": "59105322" }, { "host": "i686-mingw32", - "url": "https://github.com/espressif/arduino-esp32/releases/download/3.2.0/esptool-v5.0.dev1-win64.zip", - "archiveFileName": "esptool-v5.0.dev1-win64.zip", - "checksum": "SHA-256:1e8fd89645daf94f2d4406ec73c9004e617ea921079515f9fd749205eece4d6d", - "size": "59102658" + "url": "https://github.com/espressif/esptool/releases/download/v5.0.0/esptool-v5.0.0-windows-amd64.zip", + "archiveFileName": "esptool-v5.0.0-windows-amd64.zip", + "checksum": "SHA-256:2294107f66db6f09b886b337728a981173c9e7eab45a030928a8a5a1370611ca", + "size": "59105322" } ] }, From ee021855a156847dfcf75a9aeb8d585213f09e42 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 9 Jul 2025 07:24:42 -0300 Subject: [PATCH 224/290] feat(docs_version): Update docs in update-version script (#11564) * feat(docs_version): Update docs in update-version script * fix(logging): Fix log message * fix(idf_version): Add error if IDF version is not found --- .github/scripts/update-version.sh | 14 ++++++++++++++ docs/conf_common.py | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/scripts/update-version.sh b/.github/scripts/update-version.sh index 9a38b27a57a..622f2fe8ff8 100755 --- a/.github/scripts/update-version.sh +++ b/.github/scripts/update-version.sh @@ -1,4 +1,5 @@ #!/bin/bash +# Disable shellcheck warning about using 'cat' to read a file. # shellcheck disable=SC2002 # For reference: add tools for all boards by replacing one line in each board @@ -23,7 +24,15 @@ ESP_ARDUINO_VERSION_MINOR="$2" ESP_ARDUINO_VERSION_PATCH="$3" ESP_ARDUINO_VERSION="$ESP_ARDUINO_VERSION_MAJOR.$ESP_ARDUINO_VERSION_MINOR.$ESP_ARDUINO_VERSION_PATCH" +# Get ESP-IDF version from push.yml (this way we can ensure that the version is correct even if the local libs are not up to date) +ESP_IDF_VERSION=$(grep "idf_ver:" .github/workflows/push.yml | sed 's/.*release-v\([^"]*\).*/\1/') +if [ -z "$ESP_IDF_VERSION" ]; then + echo "Error: ESP-IDF version not found in push.yml" >&2 + exit 1 +fi + echo "New Arduino Version: $ESP_ARDUINO_VERSION" +echo "ESP-IDF Version: $ESP_IDF_VERSION" echo "Updating platform.txt..." cat platform.txt | sed "s/version=.*/version=$ESP_ARDUINO_VERSION/g" > __platform.txt && mv __platform.txt platform.txt @@ -31,6 +40,11 @@ cat platform.txt | sed "s/version=.*/version=$ESP_ARDUINO_VERSION/g" > __platfor echo "Updating package.json..." cat package.json | sed "s/.*\"version\":.*/ \"version\": \"$ESP_ARDUINO_VERSION\",/g" > __package.json && mv __package.json package.json +echo "Updating docs/conf_common.py..." +cat docs/conf_common.py | \ +sed "s/.. |version| replace:: .*/.. |version| replace:: $ESP_ARDUINO_VERSION/g" | \ +sed "s/.. |idf_version| replace:: .*/.. |idf_version| replace:: $ESP_IDF_VERSION/g" > docs/__conf_common.py && mv docs/__conf_common.py docs/conf_common.py + echo "Updating cores/esp32/esp_arduino_version.h..." cat cores/esp32/esp_arduino_version.h | \ sed "s/#define ESP_ARDUINO_VERSION_MAJOR.*/#define ESP_ARDUINO_VERSION_MAJOR $ESP_ARDUINO_VERSION_MAJOR/g" | \ diff --git a/docs/conf_common.py b/docs/conf_common.py index 6945c0d190d..af1d615f753 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -4,7 +4,7 @@ # Used for substituting variables in the documentation rst_prolog = """ -.. |version| replace:: 3.2.0 +.. |version| replace:: 3.2.1 .. |idf_version| replace:: 5.4 """ From 87b718a59cbeed010eee2c6a79004e22f71564ac Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Wed, 9 Jul 2025 07:25:16 -0300 Subject: [PATCH 225/290] fix(merge): Fix merging CN Json (#11574) --- .github/scripts/merge_packages.py | 16 ++++++++-------- .github/scripts/release_append_cn.py | 5 +++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.github/scripts/merge_packages.py b/.github/scripts/merge_packages.py index 7e4f47ca8b3..8d1f200ec5c 100755 --- a/.github/scripts/merge_packages.py +++ b/.github/scripts/merge_packages.py @@ -4,6 +4,7 @@ # Usage: # python merge_packages.py package_esp8266com_index.json version/new/package_esp8266com_index.json # Written by Ivan Grokhotkov, 2015 +# Updated by lucasssvaz to handle Chinese version sorting, 2025 # from __future__ import print_function @@ -36,20 +37,19 @@ def merge_objects(versions, obj): # Normalize ESP release version string (x.x.x) by adding '-rc' (x.x.x-rc9223372036854775807) -# to ensure having REL above any RC +# to ensure having REL above any RC. CN version will be sorted after the official version if they happen +# to be mixed (normally, CN and non-CN versions should not be mixed) # Dummy approach, functional anyway for current ESP package versioning # (unlike NormalizedVersion/LooseVersion/StrictVersion & similar crap) def pkgVersionNormalized(versionString): - - verStr = str(versionString) + verStr = str(versionString).replace("-cn", "") 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 "-cn" in str(versionString): + verStr = verStr + "-rc" + str(sys.maxsize // 2) + else: + verStr = verStr + "-rc" + str(sys.maxsize) elif len(verParts) != 4: print("pkgVersionNormalized WARNING: unexpected version format: {0})".format(verStr), file=sys.stderr) diff --git a/.github/scripts/release_append_cn.py b/.github/scripts/release_append_cn.py index b29fe0c31ba..2342834bb7e 100755 --- a/.github/scripts/release_append_cn.py +++ b/.github/scripts/release_append_cn.py @@ -17,8 +17,9 @@ def append_cn_to_versions(obj): if isinstance(obj, dict): - # dfu-util comes from arduino.cc and not from the Chinese mirrors, so we skip it - if obj.get("name") == "dfu-util": + # Skip tools that are not from the esp32 package + packager = obj.get("packager") + if packager is not None and packager != "esp32": return for key, value in obj.items(): From 4ee17dea045b2b4f8bd5965bdde6e9110b612026 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Fri, 11 Jul 2025 11:25:27 -0300 Subject: [PATCH 226/290] feat(matter): new matter lambda function example (#11561) Adds a new Matter Library example using lambda function to creat 6 endpoints using a single callback --- .../MatterLambdaSingleCallbackManyEPs.ino | 112 ++++++++++++++++++ .../MatterLambdaSingleCallbackManyEPs/ci.json | 7 ++ libraries/Matter/keywords.txt | 6 + 3 files changed, 125 insertions(+) create mode 100644 libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/MatterLambdaSingleCallbackManyEPs.ino create mode 100644 libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/ci.json diff --git a/libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/MatterLambdaSingleCallbackManyEPs.ino b/libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/MatterLambdaSingleCallbackManyEPs.ino new file mode 100644 index 00000000000..4992771d925 --- /dev/null +++ b/libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/MatterLambdaSingleCallbackManyEPs.ino @@ -0,0 +1,112 @@ +// 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. + +/* + This example creates 6 on-off light endpoints that share the same onChangeOnOff() callback code. + It uses Lambda Function with an extra Lambda Capture information that links the Endpoint to its individual information. + After the Matter example is commissioned, the expected Serial output shall be similar to this: + +Matter App Control: 'Room 1' (OnOffLight[0], Endpoint 1, GPIO 2) changed to: OFF +Matter App Control: 'Room 1' (OnOffLight[0], Endpoint 1, GPIO 2) changed to: ON +Matter App Control: 'Room 5' (OnOffLight[4], Endpoint 5, GPIO 10) changed to: ON +Matter App Control: 'Room 2' (OnOffLight[1], Endpoint 2, GPIO 4) changed to: ON +Matter App Control: 'Room 4' (OnOffLight[3], Endpoint 4, GPIO 8) changed to: ON +Matter App Control: 'Room 6' (OnOffLight[5], Endpoint 6, GPIO 12) changed to: ON +Matter App Control: 'Room 3' (OnOffLight[2], Endpoint 3, GPIO 6) changed to: ON +Matter App Control: 'Room 5' (OnOffLight[4], Endpoint 5, GPIO 10) changed to: OFF +*/ + +// Matter Manager +#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 + +//number of On-Off Lights: +const uint8_t MAX_LIGHT_NUMBER = 6; + +// array of OnOffLight endpoints +MatterOnOffLight OnOffLight[MAX_LIGHT_NUMBER]; + +// all pins, one for each on-off light +uint8_t lightPins[MAX_LIGHT_NUMBER] = {2, 4, 6, 8, 10, 12}; // must replace it by the real pin for the target SoC and application + +// friendly OnOffLights names used for printing a message in the callback +const char *lightName[MAX_LIGHT_NUMBER] = { + "Room 1", "Room 2", "Room 3", "Room 4", "Room 5", "Room 6", +}; + +// simple setup() function +void setup() { + Serial.begin(115200); // callback will just print a message in the console + + // We start by connecting to a WiFi network + Serial.print("Connecting to "); + Serial.println(ssid); + // 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); + + // setup all the OnOff Light endpoint and their lambda callback functions + for (uint8_t i = 0; i < MAX_LIGHT_NUMBER; i++) { + pinMode(lightPins[i], OUTPUT); // set the GPIO function + OnOffLight[i].begin(false); // off + + // inline lambda function using capture array index -> it will just print a message in the console + OnOffLight[i].onChangeOnOff([i](bool state) -> bool { + // Display message with the specific light name and details + Serial.printf( + "Matter App Control: '%s' (OnOffLight[%d], Endpoint %d, GPIO %d) changed to: %s\r\n", lightName[i], i, OnOffLight[i].getEndPointId(), lightPins[i], + state ? "ON" : "OFF" + ); + + return true; + }); + } + // last step, starting Matter Stack + Matter.begin(); +} + +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.println("Matter Node is commissioned and connected to the WiFi network. Ready for use."); + } + + delay(500); +} diff --git a/libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/ci.json b/libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/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 68aaebb1d4d..edba06083bd 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -36,8 +36,10 @@ EndPointSpeedCB KEYWORD1 EndPointOnOffCB KEYWORD1 EndPointBrightnessCB KEYWORD1 EndPointRGBColorCB KEYWORD1 +EndPointIdentifyCB KEYWORD1 matterEvent_t KEYWORD1 matterEventCB KEYWORD1 +attrOperation_t KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -111,6 +113,10 @@ onChangeLocalTemperature KEYWORD2 onChangeCoolingSetpoint KEYWORD2 onChangeHeatingSetpoint KEYWORD2 onEvent KEYWORD2 +setEndPointId KEYWORD2 +getEndPointId KEYWORD2 +onIdentify KEYWORD2 +endpointIdentifyCB KEYWORD2 ####################################### # Constants (LITERAL1) From c6a3bcb014c7fff53e6c1c41fec50e3ec4de8514 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Sat, 12 Jul 2025 00:11:41 -0300 Subject: [PATCH 227/290] feat(matter): removing wifi requirement for H2 and C5 (#11581) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR removes WiFi provisioning support from CI and examples (shifting to Thread/BLE provisioning), updates the CI configs for all Matter examples to drop the WiFi requirement, and adds new API keywords and a fresh “LambdaSingleCallbackManyEPs” example. - Deleted the WiFiProvWithinMatter example (its .ino and ci.json) since BLE is now used for provisioning. - Stripped "CONFIG_SOC_WIFI_SUPPORTED=y" from the CI JSON of existing examples to test Thread-only builds. - Updated keywords.txt with new Matter API identifiers and introduced a new “LambdaSingleCallbackManyEPs” example with CI and source --- .../Matter/examples/MatterColorLight/ci.json | 11 +- .../examples/MatterCommissionTest/ci.json | 1 - .../examples/MatterComposedLights/ci.json | 1 - .../examples/MatterContactSensor/ci.json | 1 - .../examples/MatterDimmableLight/ci.json | 1 - .../examples/MatterEnhancedColorLight/ci.json | 9 +- .../Matter/examples/MatterEvents/ci.json | 1 - libraries/Matter/examples/MatterFan/ci.json | 9 +- .../examples/MatterHumiditySensor/ci.json | 1 - .../MatterLambdaSingleCallbackManyEPs.ino | 126 +++++++++++++++ .../MatterLambdaSingleCallbackManyEPs/ci.json | 6 + .../Matter/examples/MatterMinimum/ci.json | 1 - .../examples/MatterOccupancySensor/ci.json | 1 - .../Matter/examples/MatterOnIdentify/ci.json | 1 - .../Matter/examples/MatterOnOffLight/ci.json | 1 - .../Matter/examples/MatterOnOffPlugin/ci.json | 1 - .../examples/MatterPressureSensor/ci.json | 1 - .../Matter/examples/MatterSmartButon/ci.json | 1 - .../examples/MatterTemperatureLight/ci.json | 1 - .../examples/MatterTemperatureSensor/ci.json | 1 - .../Matter/examples/MatterThermostat/ci.json | 1 - .../WiFiProvWithinMatter.ino | 152 ------------------ .../examples/WiFiProvWithinMatter/ci.json | 7 - libraries/Matter/keywords.txt | 8 + 24 files changed, 153 insertions(+), 191 deletions(-) create mode 100644 libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/MatterLambdaSingleCallbackManyEPs.ino create mode 100644 libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/ci.json delete mode 100644 libraries/Matter/examples/WiFiProvWithinMatter/WiFiProvWithinMatter.ino delete mode 100644 libraries/Matter/examples/WiFiProvWithinMatter/ci.json diff --git a/libraries/Matter/examples/MatterColorLight/ci.json b/libraries/Matter/examples/MatterColorLight/ci.json index d5f63487506..90b393f9156 100644 --- a/libraries/Matter/examples/MatterColorLight/ci.json +++ b/libraries/Matter/examples/MatterColorLight/ci.json @@ -1,7 +1,6 @@ { - "fqbn_append": "PartitionScheme=huge_app", - "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", - "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" - ] - } + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/examples/MatterCommissionTest/ci.json b/libraries/Matter/examples/MatterCommissionTest/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterCommissionTest/ci.json +++ b/libraries/Matter/examples/MatterCommissionTest/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterComposedLights/ci.json b/libraries/Matter/examples/MatterComposedLights/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterComposedLights/ci.json +++ b/libraries/Matter/examples/MatterComposedLights/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterContactSensor/ci.json b/libraries/Matter/examples/MatterContactSensor/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterContactSensor/ci.json +++ b/libraries/Matter/examples/MatterContactSensor/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterDimmableLight/ci.json b/libraries/Matter/examples/MatterDimmableLight/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterDimmableLight/ci.json +++ b/libraries/Matter/examples/MatterDimmableLight/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterEnhancedColorLight/ci.json b/libraries/Matter/examples/MatterEnhancedColorLight/ci.json index 0665800b12b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterEnhancedColorLight/ci.json +++ b/libraries/Matter/examples/MatterEnhancedColorLight/ci.json @@ -1,7 +1,6 @@ { - "fqbn_append": "PartitionScheme=huge_app", - "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", - "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" - ] + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] } diff --git a/libraries/Matter/examples/MatterEvents/ci.json b/libraries/Matter/examples/MatterEvents/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterEvents/ci.json +++ b/libraries/Matter/examples/MatterEvents/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterFan/ci.json b/libraries/Matter/examples/MatterFan/ci.json index 0665800b12b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterFan/ci.json +++ b/libraries/Matter/examples/MatterFan/ci.json @@ -1,7 +1,6 @@ { - "fqbn_append": "PartitionScheme=huge_app", - "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", - "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" - ] + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] } diff --git a/libraries/Matter/examples/MatterHumiditySensor/ci.json b/libraries/Matter/examples/MatterHumiditySensor/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterHumiditySensor/ci.json +++ b/libraries/Matter/examples/MatterHumiditySensor/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/MatterLambdaSingleCallbackManyEPs.ino b/libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/MatterLambdaSingleCallbackManyEPs.ino new file mode 100644 index 00000000000..c60cadd784f --- /dev/null +++ b/libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/MatterLambdaSingleCallbackManyEPs.ino @@ -0,0 +1,126 @@ +// 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. + +/* + This example create 6 on-off light endpoint that share the same onChangeOnOff() callback code. + It uses Lambda Function with an extra Lambda Capture information that links the Endpoint to its individual information. + After the Matter example is commissioned, the expected Serial output shall be similar to this: + +Matter App Control: 'Room 1' (OnOffLight[0], Endpoint 1, GPIO 2) changed to: OFF +Matter App Control: 'Room 1' (OnOffLight[0], Endpoint 1, GPIO 2) changed to: ON +Matter App Control: 'Room 5' (OnOffLight[4], Endpoint 5, GPIO 10) changed to: ON +Matter App Control: 'Room 2' (OnOffLight[1], Endpoint 2, GPIO 4) changed to: ON +Matter App Control: 'Room 4' (OnOffLight[3], Endpoint 4, GPIO 8) changed to: ON +Matter App Control: 'Room 6' (OnOffLight[5], Endpoint 6, GPIO 12) changed to: ON +Matter App Control: 'Room 3' (OnOffLight[2], Endpoint 3, GPIO 6) changed to: ON +Matter App Control: 'Room 5' (OnOffLight[4], Endpoint 5, GPIO 10) changed to: OFF +*/ + +// Matter Manager +#include +#include +#if !CONFIG_ENABLE_CHIPOBLE +// if the device can be commissioned using BLE, WiFi is not used - save flash space +#include +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +// 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 +#endif + +//number of On-Off Lights: +const uint8_t MAX_LIGHT_NUMBER = 6; + +// array of OnOffLight endpoints +MatterOnOffLight OnOffLight[MAX_LIGHT_NUMBER]; + +// all pins, one for each on-off light +uint8_t lightPins[MAX_LIGHT_NUMBER] = {2, 4, 6, 8, 10, 12}; // must replace it by the real pin for the target SoC and application + +// friendly OnOffLights names used for printing a message in the callback +const char *lightName[MAX_LIGHT_NUMBER] = { + "Room 1", "Room 2", "Room 3", "Room 4", "Room 5", "Room 6", +}; + +// simple setup() function +void setup() { + Serial.begin(115200); // callback will just print a message in the console + +// CONFIG_ENABLE_CHIPOBLE is enabled when BLE is used to commission the Matter Network +#if !CONFIG_ENABLE_CHIPOBLE + // We start by connecting to a WiFi network + Serial.print("Connecting to "); + Serial.println(ssid); + // 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); +#endif + + // setup all the OnOff Light endpoint and their lambda callback functions + for (uint8_t i = 0; i < MAX_LIGHT_NUMBER; i++) { + pinMode(lightPins[i], OUTPUT); // set the GPIO function + OnOffLight[i].begin(false); // off + + // inline lambda function using capture array index -> it will just print a message in the console + OnOffLight[i].onChangeOnOff([i](bool state) -> bool { + // Display message with the specific light name and details + Serial.printf( + "Matter App Control: '%s' (OnOffLight[%d], Endpoint %d, GPIO %d) changed to: %s\r\n", lightName[i], i, OnOffLight[i].getEndPointId(), lightPins[i], + state ? "ON" : "OFF" + ); + + return true; + }); + } + // last step, starting Matter Stack + Matter.begin(); +} + +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."); + } + } + } else { + if (Matter.isDeviceConnected()) { + Serial.println("Matter Node is commissioned and connected to the network. Ready for use."); + } else { + Serial.println("Matter Node is commissioned. Waiting for the network connection."); + } + // wait 3 seconds for the network connection + delay(3000); + } + + delay(100); +} diff --git a/libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/ci.json b/libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/ci.json new file mode 100644 index 00000000000..90b393f9156 --- /dev/null +++ b/libraries/Matter/examples/MatterLambdaSingleCallbackManyEPs/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/examples/MatterMinimum/ci.json b/libraries/Matter/examples/MatterMinimum/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterMinimum/ci.json +++ b/libraries/Matter/examples/MatterMinimum/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterOccupancySensor/ci.json b/libraries/Matter/examples/MatterOccupancySensor/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterOccupancySensor/ci.json +++ b/libraries/Matter/examples/MatterOccupancySensor/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterOnIdentify/ci.json b/libraries/Matter/examples/MatterOnIdentify/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterOnIdentify/ci.json +++ b/libraries/Matter/examples/MatterOnIdentify/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterOnOffLight/ci.json b/libraries/Matter/examples/MatterOnOffLight/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterOnOffLight/ci.json +++ b/libraries/Matter/examples/MatterOnOffLight/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterOnOffPlugin/ci.json b/libraries/Matter/examples/MatterOnOffPlugin/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterOnOffPlugin/ci.json +++ b/libraries/Matter/examples/MatterOnOffPlugin/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterPressureSensor/ci.json b/libraries/Matter/examples/MatterPressureSensor/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterPressureSensor/ci.json +++ b/libraries/Matter/examples/MatterPressureSensor/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterSmartButon/ci.json b/libraries/Matter/examples/MatterSmartButon/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterSmartButon/ci.json +++ b/libraries/Matter/examples/MatterSmartButon/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterTemperatureLight/ci.json b/libraries/Matter/examples/MatterTemperatureLight/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterTemperatureLight/ci.json +++ b/libraries/Matter/examples/MatterTemperatureLight/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterTemperatureSensor/ci.json b/libraries/Matter/examples/MatterTemperatureSensor/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterTemperatureSensor/ci.json +++ b/libraries/Matter/examples/MatterTemperatureSensor/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/MatterThermostat/ci.json b/libraries/Matter/examples/MatterThermostat/ci.json index 556a8a9ee6b..90b393f9156 100644 --- a/libraries/Matter/examples/MatterThermostat/ci.json +++ b/libraries/Matter/examples/MatterThermostat/ci.json @@ -1,7 +1,6 @@ { "fqbn_append": "PartitionScheme=huge_app", "requires": [ - "CONFIG_SOC_WIFI_SUPPORTED=y", "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" ] } diff --git a/libraries/Matter/examples/WiFiProvWithinMatter/WiFiProvWithinMatter.ino b/libraries/Matter/examples/WiFiProvWithinMatter/WiFiProvWithinMatter.ino deleted file mode 100644 index 3434217624d..00000000000 --- a/libraries/Matter/examples/WiFiProvWithinMatter/WiFiProvWithinMatter.ino +++ /dev/null @@ -1,152 +0,0 @@ -/* - 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 - -// 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; -} - -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); - - 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() { - // 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/ci.json b/libraries/Matter/examples/WiFiProvWithinMatter/ci.json deleted file mode 100644 index 0665800b12b..00000000000 --- a/libraries/Matter/examples/WiFiProvWithinMatter/ci.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "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 68aaebb1d4d..6c2e092e417 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -36,8 +36,10 @@ EndPointSpeedCB KEYWORD1 EndPointOnOffCB KEYWORD1 EndPointBrightnessCB KEYWORD1 EndPointRGBColorCB KEYWORD1 +EndPointIdentifyCB KEYWORD1 matterEvent_t KEYWORD1 matterEventCB KEYWORD1 +attrOperation_t KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -111,6 +113,12 @@ onChangeLocalTemperature KEYWORD2 onChangeCoolingSetpoint KEYWORD2 onChangeHeatingSetpoint KEYWORD2 onEvent KEYWORD2 +setEndPointId KEYWORD2 +getEndPointId KEYWORD2 +getSecondaryNetworkEndPointId KEYWORD2 +createSecondaryNetworkInterface KEYWORD2 +onIdentify KEYWORD2 +endpointIdentifyCB KEYWORD2 ####################################### # Constants (LITERAL1) From 0a45a0614244002f82fe7f006effeda7c8075469 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Sat, 12 Jul 2025 02:12:36 -0300 Subject: [PATCH 228/290] feat(wire): std::functional Wire slave callback functions (#11582) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR enhances the Wire library to support std::function–based callbacks for I2C slave mode, enabling the use of lambdas and captured contexts. - Replaces raw function pointers in TwoWire and HardwareI2C with std::function for onRequest and onReceive - Updates constructors, method signatures, and default initializations to use std::function - Adds new example sketch, CI config, and documentation updates demonstrating the functional callback API --- cores/esp32/HardwareI2C.h | 6 +- docs/en/api/i2c.rst | 135 +++++++++++++++++- .../WireSlaveFunctionalCallback.ino | 37 +++++ .../WireSlaveFunctionalCallback/ci.json | 5 + libraries/Wire/src/Wire.cpp | 6 +- libraries/Wire/src/Wire.h | 12 +- 6 files changed, 184 insertions(+), 17 deletions(-) create mode 100644 libraries/Wire/examples/WireSlaveFunctionalCallback/WireSlaveFunctionalCallback.ino create mode 100644 libraries/Wire/examples/WireSlaveFunctionalCallback/ci.json diff --git a/cores/esp32/HardwareI2C.h b/cores/esp32/HardwareI2C.h index 65b7e2036b2..c44f34e1ee7 100644 --- a/cores/esp32/HardwareI2C.h +++ b/cores/esp32/HardwareI2C.h @@ -20,6 +20,7 @@ #include #include "Stream.h" +#include class HardwareI2C : public Stream { public: @@ -36,6 +37,7 @@ class HardwareI2C : public Stream { virtual size_t requestFrom(uint8_t address, size_t len, bool stopBit) = 0; virtual size_t requestFrom(uint8_t address, size_t len) = 0; - virtual void onReceive(void (*)(int)) = 0; - virtual void onRequest(void (*)(void)) = 0; + // Update base class to use std::function + virtual void onReceive(const std::function &) = 0; + virtual void onRequest(const std::function &) = 0; }; diff --git a/docs/en/api/i2c.rst b/docs/en/api/i2c.rst index eac04b76a23..06d4d1953a6 100644 --- a/docs/en/api/i2c.rst +++ b/docs/en/api/i2c.rst @@ -347,20 +347,147 @@ This function will return ``true`` if the peripheral was initialized correctly. onReceive ^^^^^^^^^ -The ``onReceive`` function is used to define the callback for the data received from the master. +The ``onReceive`` function is used to define the callback for data received from the master device. .. code-block:: arduino - void onReceive( void (*)(int) ); + void onReceive(const std::function& callback); + +**Function Signature:** + +The callback function must have the signature ``void(int numBytes)`` where ``numBytes`` indicates how many bytes were received from the master. + +**Usage Examples:** + +.. code-block:: arduino + + // Method 1: Regular function + void handleReceive(int numBytes) { + Serial.printf("Received %d bytes: ", numBytes); + while (Wire.available()) { + char c = Wire.read(); + Serial.print(c); + } + Serial.println(); + } + Wire.onReceive(handleReceive); + + // Method 2: Lambda function + Wire.onReceive([](int numBytes) { + Serial.printf("Master sent %d bytes\n", numBytes); + while (Wire.available()) { + uint8_t data = Wire.read(); + // Process received data + Serial.printf("Data: 0x%02X\n", data); + } + }); + + // Method 3: Lambda with capture (for accessing variables) + int deviceId = 42; + Wire.onReceive([deviceId](int numBytes) { + Serial.printf("Device %d received %d bytes\n", deviceId, numBytes); + // Process data... + }); + + // Method 4: Using std::function variable + std::function receiveHandler = [](int bytes) { + Serial.printf("Handling %d received bytes\n", bytes); + }; + Wire.onReceive(receiveHandler); + + // Method 5: Class member function (using lambda wrapper) + class I2CDevice { + private: + int deviceAddress; + public: + I2CDevice(int addr) : deviceAddress(addr) {} + + void handleReceive(int numBytes) { + Serial.printf("Device 0x%02X received %d bytes\n", deviceAddress, numBytes); + } + + void setup() { + Wire.onReceive([this](int bytes) { + this->handleReceive(bytes); + }); + } + }; + +.. note:: + The ``onReceive`` callback is triggered when the I2C master sends data to this slave device. + Use ``Wire.available()`` and ``Wire.read()`` inside the callback to retrieve the received data. onRequest ^^^^^^^^^ -The ``onRequest`` function is used to define the callback for the data to be send to the master. +The ``onRequest`` function is used to define the callback for responding to master read requests. + +.. code-block:: arduino + + void onRequest(const std::function& callback); + +**Function Signature:** + +The callback function must have the signature ``void()`` with no parameters. This callback is triggered when the master requests data from this slave device. + +**Usage Examples:** .. code-block:: arduino - void onRequest( void (*)(void) ); + // Method 1: Regular function + void handleRequest() { + static int counter = 0; + Wire.printf("Response #%d", counter++); + } + Wire.onRequest(handleRequest); + + // Method 2: Lambda function + Wire.onRequest([]() { + // Send sensor data to master + int sensorValue = analogRead(A0); + Wire.write(sensorValue >> 8); // High byte + Wire.write(sensorValue & 0xFF); // Low byte + }); + + // Method 3: Lambda with capture (for accessing variables) + int deviceStatus = 1; + String deviceName = "Sensor1"; + Wire.onRequest([&deviceStatus, &deviceName]() { + Wire.write(deviceStatus); + Wire.write(deviceName.c_str(), deviceName.length()); + }); + + // Method 4: Using std::function variable + std::function requestHandler = []() { + Wire.write("Hello Master!"); + }; + Wire.onRequest(requestHandler); + + // Method 5: Class member function (using lambda wrapper) + class TemperatureSensor { + private: + float temperature; + public: + void updateTemperature() { + temperature = 25.5; // Read from actual sensor + } + + void sendTemperature() { + // Convert float to bytes and send + uint8_t* tempBytes = (uint8_t*)&temperature; + Wire.write(tempBytes, sizeof(float)); + } + + void setup() { + Wire.onRequest([this]() { + this->sendTemperature(); + }); + } + }; + +.. note:: + The ``onRequest`` callback is triggered when the I2C master requests data from this slave device. + Use ``Wire.write()`` inside the callback to send response data back to the master. slaveWrite ^^^^^^^^^^ diff --git a/libraries/Wire/examples/WireSlaveFunctionalCallback/WireSlaveFunctionalCallback.ino b/libraries/Wire/examples/WireSlaveFunctionalCallback/WireSlaveFunctionalCallback.ino new file mode 100644 index 00000000000..a18fd2f023e --- /dev/null +++ b/libraries/Wire/examples/WireSlaveFunctionalCallback/WireSlaveFunctionalCallback.ino @@ -0,0 +1,37 @@ +// This example demonstrates the use of functional callbacks with the Wire library +// for I2C slave communication. It shows how to handle requests and data reception + +#include "Wire.h" + +#define I2C_DEV_ADDR 0x55 + +uint32_t i = 0; + +void setup() { + Serial.begin(115200); + Serial.setDebugOutput(true); + + Wire.onRequest([]() { + Wire.print(i++); + Wire.print(" Packets."); + Serial.println("onRequest"); + }); + + Wire.onReceive([](int len) { + Serial.printf("onReceive[%d]: ", len); + while (Wire.available()) { + Serial.write(Wire.read()); + } + Serial.println(); + }); + + Wire.begin((uint8_t)I2C_DEV_ADDR); + +#if CONFIG_IDF_TARGET_ESP32 + char message[64]; + snprintf(message, 64, "%lu Packets.", i++); + Wire.slaveWrite((uint8_t *)message, strlen(message)); +#endif +} + +void loop() {} diff --git a/libraries/Wire/examples/WireSlaveFunctionalCallback/ci.json b/libraries/Wire/examples/WireSlaveFunctionalCallback/ci.json new file mode 100644 index 00000000000..3c877975d62 --- /dev/null +++ b/libraries/Wire/examples/WireSlaveFunctionalCallback/ci.json @@ -0,0 +1,5 @@ +{ + "requires": [ + "CONFIG_SOC_I2C_SUPPORT_SLAVE=y" + ] +} diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp index 34c814b5117..cda098d2d5b 100644 --- a/libraries/Wire/src/Wire.cpp +++ b/libraries/Wire/src/Wire.cpp @@ -48,7 +48,7 @@ TwoWire::TwoWire(uint8_t bus_num) #endif #if SOC_I2C_SUPPORT_SLAVE , - is_slave(false), user_onRequest(NULL), user_onReceive(NULL) + is_slave(false), user_onRequest(nullptr), user_onReceive(nullptr) #endif /* SOC_I2C_SUPPORT_SLAVE */ { } @@ -596,14 +596,14 @@ void TwoWire::flush() { //i2cFlush(num); // cleanup } -void TwoWire::onReceive(void (*function)(int)) { +void TwoWire::onReceive(const std::function &function) { #if SOC_I2C_SUPPORT_SLAVE user_onReceive = function; #endif } // sets function called on slave read -void TwoWire::onRequest(void (*function)(void)) { +void TwoWire::onRequest(const std::function &function) { #if SOC_I2C_SUPPORT_SLAVE user_onRequest = function; #endif diff --git a/libraries/Wire/src/Wire.h b/libraries/Wire/src/Wire.h index b84aa5b2131..9cebdfaa304 100644 --- a/libraries/Wire/src/Wire.h +++ b/libraries/Wire/src/Wire.h @@ -48,10 +48,6 @@ #ifndef I2C_BUFFER_LENGTH #define I2C_BUFFER_LENGTH 128 // Default size, if none is set using Wire::setBuffersize(size_t) #endif -#if SOC_I2C_SUPPORT_SLAVE -typedef void (*user_onRequest)(void); -typedef void (*user_onReceive)(uint8_t *, int); -#endif /* SOC_I2C_SUPPORT_SLAVE */ class TwoWire : public HardwareI2C { protected: @@ -77,8 +73,8 @@ class TwoWire : public HardwareI2C { private: #if SOC_I2C_SUPPORT_SLAVE bool is_slave; - void (*user_onRequest)(void); - void (*user_onReceive)(int); + std::function user_onRequest; + std::function user_onReceive; static void onRequestService(uint8_t, void *); static void onReceiveService(uint8_t, uint8_t *, size_t, bool, void *); #endif /* SOC_I2C_SUPPORT_SLAVE */ @@ -116,8 +112,8 @@ class TwoWire : public HardwareI2C { size_t requestFrom(uint8_t address, size_t len, bool stopBit) override; size_t requestFrom(uint8_t address, size_t len) override; - void onReceive(void (*)(int)) override; - void onRequest(void (*)(void)) override; + void onReceive(const std::function &) override; + void onRequest(const std::function &) override; //call setPins() first, so that begin() can be called without arguments from libraries bool setPins(int sda, int scl); From 1f0d4b5dc0d6008583ac9527907325b9f2506caa Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 14 Jul 2025 13:17:56 -0300 Subject: [PATCH 229/290] ci(gitlab): Initial GitLab setup (#11577) * ci(gitlab): Initial GitLab setup * fix(version): Add to version update script * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .github/CODEOWNERS | 1 + .github/scripts/update-version.sh | 5 +++++ .gitlab-ci.yml | 25 +++++++++++++++++++++++++ .gitlab/workflows/common.yml | 26 ++++++++++++++++++++++++++ .gitlab/workflows/sample.yml | 6 ++++++ 5 files changed, 63 insertions(+) create mode 100644 .gitlab-ci.yml create mode 100644 .gitlab/workflows/common.yml create mode 100644 .gitlab/workflows/sample.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 75a2b46d619..64d241ba20a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -11,6 +11,7 @@ # CI /.github/ @lucasssvaz @me-no-dev @P-R-O-C-H-Y +/.gitlab/ @lucasssvaz /tests/ @lucasssvaz @P-R-O-C-H-Y # Tools diff --git a/.github/scripts/update-version.sh b/.github/scripts/update-version.sh index 622f2fe8ff8..59a95d01105 100755 --- a/.github/scripts/update-version.sh +++ b/.github/scripts/update-version.sh @@ -45,6 +45,11 @@ cat docs/conf_common.py | \ sed "s/.. |version| replace:: .*/.. |version| replace:: $ESP_ARDUINO_VERSION/g" | \ sed "s/.. |idf_version| replace:: .*/.. |idf_version| replace:: $ESP_IDF_VERSION/g" > docs/__conf_common.py && mv docs/__conf_common.py docs/conf_common.py +echo "Updating .gitlab/workflows/common.yml..." +cat .gitlab/workflows/common.yml | \ +sed "s/ESP_IDF_VERSION:.*/ESP_IDF_VERSION: \"$ESP_IDF_VERSION\"/g" | \ +sed "s/ESP_ARDUINO_VERSION:.*/ESP_ARDUINO_VERSION: \"$ESP_ARDUINO_VERSION\"/g" > .gitlab/workflows/__common.yml && mv .gitlab/workflows/__common.yml .gitlab/workflows/common.yml + echo "Updating cores/esp32/esp_arduino_version.h..." cat cores/esp32/esp_arduino_version.h | \ sed "s/#define ESP_ARDUINO_VERSION_MAJOR.*/#define ESP_ARDUINO_VERSION_MAJOR $ESP_ARDUINO_VERSION_MAJOR/g" | \ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000000..89a45022bc2 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,25 @@ +workflow: + rules: + # Disable those non-protected push triggered pipelines + - if: '$CI_COMMIT_REF_NAME != "master" && $CI_COMMIT_BRANCH !~ /^release\/v/ && $CI_COMMIT_TAG !~ /^\d+\.\d+(\.\d+)?($|-)/ && $CI_PIPELINE_SOURCE == "push"' + when: never + # when running merged result pipelines, CI_COMMIT_SHA represents the temp commit it created. + # Please use PIPELINE_COMMIT_SHA at all places that require a commit sha of the original commit. + - if: $CI_OPEN_MERGE_REQUESTS != null + variables: + PIPELINE_COMMIT_SHA: $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA + IS_MR_PIPELINE: 1 + - if: $CI_OPEN_MERGE_REQUESTS == null + variables: + PIPELINE_COMMIT_SHA: $CI_COMMIT_SHA + IS_MR_PIPELINE: 0 + - if: '$CI_PIPELINE_SOURCE == "schedule"' + variables: + IS_SCHEDULED_RUN: "true" + - when: always + +# Place the default settings in `.gitlab/workflows/common.yml` instead + +include: + - ".gitlab/workflows/common.yml" + - ".gitlab/workflows/sample.yml" diff --git a/.gitlab/workflows/common.yml b/.gitlab/workflows/common.yml new file mode 100644 index 00000000000..9086da018ab --- /dev/null +++ b/.gitlab/workflows/common.yml @@ -0,0 +1,26 @@ +##################### +# Default Variables # +##################### + +stages: + - pre_check + - build + - test + - result + +variables: + ESP_IDF_VERSION: "5.4" + ESP_ARDUINO_VERSION: "3.2.1" + +############# +# `default` # +############# + +default: + retry: + max: 2 + when: + # In case of a runner failure we could hop to another one, or a network error could go away. + - runner_system_failure + # Job execution timeout may be caused by a network issue. + - job_execution_timeout diff --git a/.gitlab/workflows/sample.yml b/.gitlab/workflows/sample.yml new file mode 100644 index 00000000000..32b6fce042d --- /dev/null +++ b/.gitlab/workflows/sample.yml @@ -0,0 +1,6 @@ +hello-world: + stage: test + script: + - echo "Hello, World from GitLab CI!" + rules: + - if: $CI_PIPELINE_SOURCE == "push" From 82d56bc679dfcd8de2fb06596ff4c4bcca8e6247 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Wed, 16 Jul 2025 05:51:31 -0300 Subject: [PATCH 230/290] feat(gpio): new functional interrupt lambda example (#11589) * feat(gpio): new functional interrupt lambda example * fix(readme): schematic diagram allignment * fix(example): uses volatile for ISR variables Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(example): uses volatile for ISR variables Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(example): uses volatile data type also for the pointers * fix(readme): clear documentation * feat(example): improves ISR execution time Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat(gpio): simplifies the example and documentation * feat(gpio): uses IRAM lambda and fixes volatile operation * fix(doc): fixing documentation apresentation * ci(pre-commit): Apply automatic fixes * fix(ci): Update README.md --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Me No Dev --- .../FunctionalInterruptLambda.ino | 157 ++++++++++++++++++ .../GPIO/FunctionalInterruptLambda/README.md | 147 ++++++++++++++++ 2 files changed, 304 insertions(+) create mode 100644 libraries/ESP32/examples/GPIO/FunctionalInterruptLambda/FunctionalInterruptLambda.ino create mode 100644 libraries/ESP32/examples/GPIO/FunctionalInterruptLambda/README.md diff --git a/libraries/ESP32/examples/GPIO/FunctionalInterruptLambda/FunctionalInterruptLambda.ino b/libraries/ESP32/examples/GPIO/FunctionalInterruptLambda/FunctionalInterruptLambda.ino new file mode 100644 index 00000000000..57d35383f17 --- /dev/null +++ b/libraries/ESP32/examples/GPIO/FunctionalInterruptLambda/FunctionalInterruptLambda.ino @@ -0,0 +1,157 @@ +/* + SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + + SPDX-License-Identifier: Apache-2.0 + + 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. + + ESP32 Lambda FunctionalInterrupt Example + ======================================== + + This example demonstrates how to use lambda functions with FunctionalInterrupt + for GPIO pin interrupt callbacks on ESP32. It shows CHANGE mode detection + with LED toggle functionality and proper debouncing. + + Hardware Setup: + - Use BOOT Button or connect a button between BUTTON_PIN and GND (with internal pullup) + - Use Builtin Board LED or connect an LED with resistor to GPIO 2 (LED_PIN) + + Features Demonstrated: + 1. CHANGE mode lambda to detect both RISING and FALLING edges + 2. LED toggle on button press (FALLING edge) + 3. Edge type detection using digitalRead() within ISR + 4. Hardware debouncing with configurable timeout + + IMPORTANT NOTE ABOUT ESP32 INTERRUPT BEHAVIOR: + - Only ONE interrupt handler can be attached per GPIO pin at a time + - Calling attachInterrupt() on a pin that already has an interrupt will override the previous one + - This applies regardless of edge type (RISING, FALLING, CHANGE) + - If you need both RISING and FALLING detection on the same pin, use CHANGE mode + and determine the edge type within your handler by reading the pin state +*/ + +#include +#include + +// Pin definitions +#define BUTTON_PIN BOOT_PIN // BOOT BUTTON - change as needed +#ifdef LED_BUILTIN +#define LED_PIN LED_BUILTIN +#else +#warning Using LED_PIN = GPIO 2 as default - change as needed +#define LED_PIN 2 // change as needed +#endif + +// Global variables for interrupt handling (volatile for ISR safety) +volatile uint32_t buttonPressCount = 0; +volatile uint32_t buttonReleaseCount = 0; +volatile bool buttonPressed = false; +volatile bool buttonReleased = false; +volatile bool ledState = false; +volatile bool ledStateChanged = false; // Flag to indicate LED needs updating + +// Debouncing variables (volatile for ISR safety) +volatile unsigned long lastButtonInterruptTime = 0; +const unsigned long DEBOUNCE_DELAY_MS = 50; // 50ms debounce delay + +// State-based debouncing to prevent hysteresis issues +volatile bool lastButtonState = HIGH; // Track last stable state (HIGH = released) + +// Global lambda function (declared at file scope) - ISR in IRAM +IRAM_ATTR std::function changeModeLambda = []() { + // Simple debouncing: check if enough time has passed since last interrupt + unsigned long currentTime = millis(); + if (currentTime - lastButtonInterruptTime < DEBOUNCE_DELAY_MS) { + return; // Ignore this interrupt due to bouncing + } + + // Read current pin state to determine edge type + bool currentState = digitalRead(BUTTON_PIN); + + // State-based debouncing: only process if state actually changed + if (currentState == lastButtonState) { + return; // No real state change, ignore (hysteresis/noise) + } + + // Update timing and state + lastButtonInterruptTime = currentTime; + lastButtonState = currentState; + + if (currentState == LOW) { + // FALLING edge detected (button pressed) - set flag for main loop + // volatile variables require use of temporary value transfer + uint32_t temp = buttonPressCount + 1; + buttonPressCount = temp; + buttonPressed = true; + ledStateChanged = true; // Signal main loop to toggle LED + } else { + // RISING edge detected (button released) - set flag for main loop + // volatile variables require use of temporary value transfer + uint32_t temp = buttonReleaseCount + 1; + buttonReleaseCount = temp; + buttonReleased = true; + } +}; + +void setup() { + Serial.begin(115200); + delay(1000); // Allow serial monitor to connect + + Serial.println("ESP32 Lambda FunctionalInterrupt Example"); + Serial.println("========================================"); + + // Configure pins + pinMode(BUTTON_PIN, INPUT_PULLUP); + pinMode(LED_PIN, OUTPUT); + digitalWrite(LED_PIN, LOW); + + // CHANGE mode lambda to handle both RISING and FALLING edges + // This toggles the LED on button press (FALLING edge) + Serial.println("Setting up CHANGE mode lambda for LED toggle"); + + // Use the global lambda function + attachInterrupt(BUTTON_PIN, changeModeLambda, CHANGE); + + Serial.println(); + Serial.printf("Lambda interrupt configured on Pin %d (CHANGE mode)\r\n", BUTTON_PIN); + Serial.printf("Debounce delay: %lu ms\r\n", DEBOUNCE_DELAY_MS); + Serial.println(); + Serial.println("Press the button to toggle the LED!"); + Serial.println("Button press (FALLING edge) will toggle the LED."); + Serial.println("Button release (RISING edge) will be detected and reported."); + Serial.println("Button includes debouncing to prevent mechanical bounce issues."); + Serial.println(); +} + +void loop() { + // Handle LED state changes (ISR-safe approach) + if (ledStateChanged) { + ledStateChanged = false; + ledState = !ledState; // Toggle LED state in main loop + digitalWrite(LED_PIN, ledState); + } + + // Check for button presses + if (buttonPressed) { + buttonPressed = false; + Serial.printf("==> Button PRESSED! Count: %lu, LED: %s (FALLING edge)\r\n", buttonPressCount, ledState ? "ON" : "OFF"); + } + + // Check for button releases + if (buttonReleased) { + buttonReleased = false; + Serial.printf("==> Button RELEASED! Count: %lu (RISING edge)\r\n", buttonReleaseCount); + } + + delay(10); +} diff --git a/libraries/ESP32/examples/GPIO/FunctionalInterruptLambda/README.md b/libraries/ESP32/examples/GPIO/FunctionalInterruptLambda/README.md new file mode 100644 index 00000000000..9488c317fde --- /dev/null +++ b/libraries/ESP32/examples/GPIO/FunctionalInterruptLambda/README.md @@ -0,0 +1,147 @@ +# ESP32 Lambda FunctionalInterrupt Example + +This example demonstrates how to use lambda functions with FunctionalInterrupt for GPIO pin interrupt callbacks on ESP32. It shows CHANGE mode detection with LED toggle functionality and proper debouncing. + +## Features Demonstrated + +1. **CHANGE mode lambda** to detect both RISING and FALLING edges +2. **LED toggle on button press** (FALLING edge) +3. **Edge type detection** using digitalRead() within ISR +4. **Hardware debouncing** with configurable timeout +5. **IRAM_ATTR lambda declaration** for optimal ISR performance in RAM + +## Hardware Setup + +- Use BOOT Button or connect a button between BUTTON_PIN and GND (with internal pullup) +- Use Builtin Board LED (no special hardware setup) or connect an LED with resistor to GPIO assigned as LED_PIN.\ + Some boards have an RGB LED that needs no special hardware setup to work as a simple white on/off LED. + +``` +ESP32 Board Button/LED +----------- --------- +BOOT_PIN ------------ [BUTTON] ---- GND +LED_PIN --------------- [LED] ----- GND + ¦ + [330O] (*) Only needed when using an external LED attached to the GPIO. + ¦ + 3V3 +``` + +## Important ESP32 Interrupt Behavior + +**CRITICAL:** Only ONE interrupt handler can be attached per GPIO pin at a time on ESP32. + +- Calling `attachInterrupt()` on a pin that already has an interrupt will **override** the previous one +- This applies regardless of edge type (RISING, FALLING, CHANGE) +- If you need both RISING and FALLING detection on the same pin, use **CHANGE mode** and determine the edge type within your handler by reading the pin state + +## Code Overview + +This example demonstrates a simple CHANGE mode lambda interrupt that: + +- **Detects both button press and release** using a single interrupt handler +- **Toggles LED only on button press** (FALLING edge) +- **Reports both press and release events** to Serial output +- **Uses proper debouncing** to prevent switch bounce issues +- **Implements minimal lambda captures** for simplicity + +## Lambda Function Pattern + +### CHANGE Mode Lambda with IRAM Declaration +```cpp +// Global lambda declared with IRAM_ATTR for optimal ISR performance +IRAM_ATTR std::function changeModeLambda = []() { + // Debouncing check + unsigned long currentTime = millis(); + if (currentTime - lastButtonInterruptTime < DEBOUNCE_DELAY_MS) { + return; // Ignore bouncing + } + + // Determine edge type + bool currentState = digitalRead(BUTTON_PIN); + if (currentState == lastButtonState) { + return; // No real state change + } + + // Update state and handle edges + lastButtonInterruptTime = currentTime; + lastButtonState = currentState; + + if (currentState == LOW) { + // Button pressed (FALLING edge) + buttonPressCount++; + buttonPressed = true; + ledStateChanged = true; // Signal LED toggle + } else { + // Button released (RISING edge) + buttonReleaseCount++; + buttonReleased = true; + } +}; + +attachInterrupt(BUTTON_PIN, changeModeLambda, CHANGE); +``` + +## Key Concepts + +### Edge Detection in CHANGE Mode +```cpp +if (digitalRead(pin) == LOW) { + // FALLING edge detected (button pressed) +} else { + // RISING edge detected (button released) +} +``` + +### Debouncing Strategy +This example implements dual-layer debouncing: +1. **Time-based**: Ignores interrupts within 50 ms of previous one +2. **State-based**: Only processes actual state changes + +### Main Loop Processing +```cpp +void loop() { + // Handle LED changes safely outside ISR + if (ledStateChanged) { + ledStateChanged = false; + ledState = !ledState; + digitalWrite(LED_PIN, ledState); + } + + // Report button events + if (buttonPressed) { + // Handle press event + } + if (buttonReleased) { + // Handle release event + } +} +``` + +## Expected Output + +``` +ESP32 Lambda FunctionalInterrupt Example +======================================== +Setting up CHANGE mode lambda for LED toggle + +Lambda interrupt configured on Pin 0 (CHANGE mode) +Debounce delay: 50 ms + +Press the button to toggle the LED! +Button press (FALLING edge) will toggle the LED. +Button release (RISING edge) will be detected and reported. +Button includes debouncing to prevent mechanical bounce issues. + +==> Button PRESSED! Count: 1, LED: ON (FALLING edge) +==> Button RELEASED! Count: 1 (RISING edge) +==> Button PRESSED! Count: 2, LED: OFF (FALLING edge) +==> Button RELEASED! Count: 2 (RISING edge) +``` + +## Pin Configuration + +The example uses these default pins: + +- `BUTTON_PIN`: BOOT_PIN (automatically assigned by the Arduino Core) +- `LED_PIN`: LED_BUILTIN (may not be available for your board - please verify it) From ce7ef9c2ba61deff89d86913a966d33c070fb3a4 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Wed, 16 Jul 2025 13:42:07 +0300 Subject: [PATCH 231/290] IDF release/v5.5 cf8dad07 (#11601) IDF release/v5.5 cf8dad07 --- 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 9c2c754504e..6e2dd0ab337 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -51,7 +51,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.5-adb3f2a5-v1" + "version": "idf-release_v5.5-cf8dad07-v1" }, { "packager": "esp32", @@ -104,63 +104,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.5-adb3f2a5-v1", + "version": "idf-release_v5.5-cf8dad07-v1", "systems": [ { "host": "i686-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", - "size": "430508851" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", + "size": "430423461" }, { "host": "x86_64-mingw32", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", - "size": "430508851" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", + "size": "430423461" }, { "host": "arm64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", - "size": "430508851" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", + "size": "430423461" }, { "host": "x86_64-apple-darwin", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", - "size": "430508851" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", + "size": "430423461" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", - "size": "430508851" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", + "size": "430423461" }, { "host": "i686-pc-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", - "size": "430508851" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", + "size": "430423461" }, { "host": "aarch64-linux-gnu", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", - "size": "430508851" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", + "size": "430423461" }, { "host": "arm-linux-gnueabihf", - "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-adb3f2a5-v1.zip", - "checksum": "SHA-256:c7bdda06e7ddae51880fc0e1c76114a8e766a9d682e3645e7794f7126b895a94", - "size": "430508851" + "url": "https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.5/esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "archiveFileName": "esp32-arduino-libs-idf-release_v5.5-cf8dad07-v1.zip", + "checksum": "SHA-256:c8310c661871a5d82b8b09a2b8d792936bf9a5023ed6dcb683ff93ff9ea4aaa7", + "size": "430423461" } ] }, From ac05f18720e83d1e9deee24db7ab13718219b4d6 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, 16 Jul 2025 12:12:43 +0000 Subject: [PATCH 232/290] ci(pre-commit): Apply automatic fixes --- cores/esp32/esp32-hal-cpu.c | 3 ++- libraries/SPI/src/SPI.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/cores/esp32/esp32-hal-cpu.c b/cores/esp32/esp32-hal-cpu.c index d6bc6b0f191..e9113da4219 100644 --- a/cores/esp32/esp32-hal-cpu.c +++ b/cores/esp32/esp32-hal-cpu.c @@ -19,7 +19,8 @@ #include "esp_attr.h" #include "esp_log.h" #include "soc/rtc.h" -#if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) && !defined(CONFIG_IDF_TARGET_ESP32C5) +#if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) \ + && !defined(CONFIG_IDF_TARGET_ESP32C5) #include "soc/rtc_cntl_reg.h" #include "soc/syscon_reg.h" #endif diff --git a/libraries/SPI/src/SPI.cpp b/libraries/SPI/src/SPI.cpp index 0492065b798..6229f887553 100644 --- a/libraries/SPI/src/SPI.cpp +++ b/libraries/SPI/src/SPI.cpp @@ -84,7 +84,8 @@ bool SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss) { _miso = (_spi_num == FSPI) ? MISO : -1; _mosi = (_spi_num == FSPI) ? MOSI : -1; _ss = (_spi_num == FSPI) ? SS : -1; -#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5 +#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 \ + || CONFIG_IDF_TARGET_ESP32C5 _sck = SCK; _miso = MISO; _mosi = MOSI; From 6015fd73e0d9d065c80fc79ef0f35d3273a217de Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Wed, 16 Jul 2025 13:53:36 -0300 Subject: [PATCH 233/290] feat(openthread): native API extension (#11598) * feat(openthread): native API extension * fix(openthread): wrong return type and parameter * fix(openthread): wrong field reference * fix(openthread): CR/LF fix * feat(openthread): print leader RLOC information * feat(openthread): code improvements * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../LeaderNode/LeaderNode.ino | 85 +++- .../RouterNode/RouterNode.ino | 61 ++- libraries/OpenThread/keywords.txt | 18 + libraries/OpenThread/src/OThread.cpp | 363 +++++++++++++++++- libraries/OpenThread/src/OThread.h | 63 ++- 5 files changed, 565 insertions(+), 25 deletions(-) diff --git a/libraries/OpenThread/examples/Native/SimpleThreadNetwork/LeaderNode/LeaderNode.ino b/libraries/OpenThread/examples/Native/SimpleThreadNetwork/LeaderNode/LeaderNode.ino index dfea9776838..b3c4091e1dc 100644 --- a/libraries/OpenThread/examples/Native/SimpleThreadNetwork/LeaderNode/LeaderNode.ino +++ b/libraries/OpenThread/examples/Native/SimpleThreadNetwork/LeaderNode/LeaderNode.ino @@ -3,6 +3,9 @@ OpenThread threadLeaderNode; DataSet dataset; +// Track last known device role for state change detection +ot_device_role_t lastKnownRole = OT_ROLE_DISABLED; + void setup() { Serial.begin(115200); @@ -27,8 +30,84 @@ void setup() { } void loop() { - // Print network information every 5 seconds - Serial.println("=============================================="); - threadLeaderNode.otPrintNetworkInformation(Serial); + // Get current device role + ot_device_role_t currentRole = threadLeaderNode.otGetDeviceRole(); + + // Only print network information when not detached + if (currentRole != OT_ROLE_DETACHED && currentRole != OT_ROLE_DISABLED) { + Serial.println("=============================================="); + Serial.println("OpenThread Network Information:"); + + // Basic network information + Serial.printf("Role: %s\r\n", threadLeaderNode.otGetStringDeviceRole()); + Serial.printf("RLOC16: 0x%04x\r\n", threadLeaderNode.getRloc16()); + Serial.printf("Network Name: %s\r\n", threadLeaderNode.getNetworkName().c_str()); + Serial.printf("Channel: %d\r\n", threadLeaderNode.getChannel()); + Serial.printf("PAN ID: 0x%04x\r\n", threadLeaderNode.getPanId()); + + // Extended PAN ID + const uint8_t *extPanId = threadLeaderNode.getExtendedPanId(); + if (extPanId) { + Serial.print("Extended PAN ID: "); + for (int i = 0; i < OT_EXT_PAN_ID_SIZE; i++) { + Serial.printf("%02x", extPanId[i]); + } + Serial.println(); + } + + // Network Key + const uint8_t *networkKey = threadLeaderNode.getNetworkKey(); + if (networkKey) { + Serial.print("Network Key: "); + for (int i = 0; i < OT_NETWORK_KEY_SIZE; i++) { + Serial.printf("%02x", networkKey[i]); + } + Serial.println(); + } + + // Mesh Local EID + IPAddress meshLocalEid = threadLeaderNode.getMeshLocalEid(); + Serial.printf("Mesh Local EID: %s\r\n", meshLocalEid.toString().c_str()); + + // Leader RLOC + IPAddress leaderRloc = threadLeaderNode.getLeaderRloc(); + Serial.printf("Leader RLOC: %s\r\n", leaderRloc.toString().c_str()); + + // Node RLOC + IPAddress nodeRloc = threadLeaderNode.getRloc(); + Serial.printf("Node RLOC: %s\r\n", nodeRloc.toString().c_str()); + + // Demonstrate address listing with two different methods: + // Method 1: Unicast addresses using counting API (individual access) + Serial.println("\r\n--- Unicast Addresses (Using Count + Index API) ---"); + size_t unicastCount = threadLeaderNode.getUnicastAddressCount(); + for (size_t i = 0; i < unicastCount; i++) { + IPAddress addr = threadLeaderNode.getUnicastAddress(i); + Serial.printf(" [%zu]: %s\r\n", i, addr.toString().c_str()); + } + + // Method 2: Multicast addresses using std::vector (bulk access) + Serial.println("\r\n--- Multicast Addresses (Using std::vector API) ---"); + std::vector allMulticast = threadLeaderNode.getAllMulticastAddresses(); + for (size_t i = 0; i < allMulticast.size(); i++) { + Serial.printf(" [%zu]: %s\r\n", i, allMulticast[i].toString().c_str()); + } + + // Check for role change and clear cache if needed (only when active) + if (currentRole != lastKnownRole) { + Serial.printf( + "Role changed from %s to %s - clearing address cache\r\n", (lastKnownRole < 5) ? otRoleString[lastKnownRole] : "Unknown", + threadLeaderNode.otGetStringDeviceRole() + ); + threadLeaderNode.clearAllAddressCache(); + lastKnownRole = currentRole; + } + } else { + Serial.printf("Thread Node Status: %s - Waiting for thread network start...\r\n", threadLeaderNode.otGetStringDeviceRole()); + + // Update role tracking even when detached/disabled, but don't clear cache + lastKnownRole = currentRole; + } + delay(5000); } diff --git a/libraries/OpenThread/examples/Native/SimpleThreadNetwork/RouterNode/RouterNode.ino b/libraries/OpenThread/examples/Native/SimpleThreadNetwork/RouterNode/RouterNode.ino index 5ffa535ad51..a8959792f5b 100644 --- a/libraries/OpenThread/examples/Native/SimpleThreadNetwork/RouterNode/RouterNode.ino +++ b/libraries/OpenThread/examples/Native/SimpleThreadNetwork/RouterNode/RouterNode.ino @@ -22,8 +22,63 @@ void setup() { } void loop() { - // Print network information every 5 seconds - Serial.println("=============================================="); - threadChildNode.otPrintNetworkInformation(Serial); + // Get current device role + ot_device_role_t currentRole = threadChildNode.otGetDeviceRole(); + + // Only print detailed network information when node is active + if (currentRole != OT_ROLE_DETACHED && currentRole != OT_ROLE_DISABLED) { + Serial.println("=============================================="); + Serial.println("OpenThread Network Information (Active Dataset):"); + + // Get and display the current active dataset + const DataSet &activeDataset = threadChildNode.getCurrentDataSet(); + + Serial.printf("Role: %s\r\n", threadChildNode.otGetStringDeviceRole()); + Serial.printf("RLOC16: 0x%04x\r\n", threadChildNode.getRloc16()); + + // Dataset information + Serial.printf("Network Name: %s\r\n", activeDataset.getNetworkName()); + Serial.printf("Channel: %d\r\n", activeDataset.getChannel()); + Serial.printf("PAN ID: 0x%04x\r\n", activeDataset.getPanId()); + + // Extended PAN ID from dataset + const uint8_t *extPanId = activeDataset.getExtendedPanId(); + if (extPanId) { + Serial.print("Extended PAN ID: "); + for (int i = 0; i < OT_EXT_PAN_ID_SIZE; i++) { + Serial.printf("%02x", extPanId[i]); + } + Serial.println(); + } + + // Network Key from dataset + const uint8_t *networkKey = activeDataset.getNetworkKey(); + if (networkKey) { + Serial.print("Network Key: "); + for (int i = 0; i < OT_NETWORK_KEY_SIZE; i++) { + Serial.printf("%02x", networkKey[i]); + } + Serial.println(); + } + + // Additional runtime information + IPAddress meshLocalEid = threadChildNode.getMeshLocalEid(); + Serial.printf("Mesh Local EID: %s\r\n", meshLocalEid.toString().c_str()); + + IPAddress nodeRloc = threadChildNode.getRloc(); + Serial.printf("Node RLOC: %s\r\n", nodeRloc.toString().c_str()); + + IPAddress leaderRloc = threadChildNode.getLeaderRloc(); + Serial.printf("Leader RLOC: %s\r\n", leaderRloc.toString().c_str()); + + Serial.println(); + + } else { + Serial.println("=============================================="); + Serial.printf("Thread Node Status: %s - Waiting for thread network start...\r\n", threadChildNode.otGetStringDeviceRole()); + + Serial.println(); + } + delay(5000); } diff --git a/libraries/OpenThread/keywords.txt b/libraries/OpenThread/keywords.txt index b62c2c23ddc..99821ce401c 100644 --- a/libraries/OpenThread/keywords.txt +++ b/libraries/OpenThread/keywords.txt @@ -13,6 +13,7 @@ OpenThread KEYWORD1 DataSet KEYWORD1 ot_cmd_return_t KEYWORD1 ot_device_role_t KEYWORD1 +OnReceiveCb_t KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -59,6 +60,23 @@ stop KEYWORD2 networkInterfaceUp KEYWORD2 networkInterfaceDown KEYWORD2 commitDataSet KEYWORD2 +getInstance KEYWORD2 +getCurrentDataSet KEYWORD2 +getMeshLocalPrefix KEYWORD2 +getMeshLocalEid KEYWORD2 +getLeaderRloc KEYWORD2 +getRloc KEYWORD2 +getRloc16 KEYWORD2 +getUnicastAddressCount KEYWORD2 +getUnicastAddress KEYWORD2 +getAllUnicastAddresses KEYWORD2 +getMulticastAddressCount KEYWORD2 +getMulticastAddress KEYWORD2 +getAllMulticastAddresses KEYWORD2 +clearUnicastAddressCache KEYWORD2 +clearMulticastAddressCache KEYWORD2 +clearAllAddressCache KEYWORD2 +end KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/libraries/OpenThread/src/OThread.cpp b/libraries/OpenThread/src/OThread.cpp index 7714d870cce..87b748d104d 100644 --- a/libraries/OpenThread/src/OThread.cpp +++ b/libraries/OpenThread/src/OThread.cpp @@ -2,6 +2,8 @@ #if SOC_IEEE802154_SUPPORTED #if CONFIG_OPENTHREAD_ENABLED +#include "IPAddress.h" +#include #include "esp_err.h" #include "esp_event.h" #include "esp_netif.h" @@ -132,16 +134,29 @@ const otOperationalDataset &DataSet::getDataset() const { } void DataSet::setNetworkName(const char *name) { - strncpy(mDataset.mNetworkName.m8, name, sizeof(mDataset.mNetworkName.m8)); + if (!name) { + log_w("Network name is null"); + return; + } + // char m8[OT_NETWORK_KEY_SIZE + 1] bytes space by definition + strncpy(mDataset.mNetworkName.m8, name, OT_NETWORK_KEY_SIZE); mDataset.mComponents.mIsNetworkNamePresent = true; } void DataSet::setExtendedPanId(const uint8_t *extPanId) { + if (!extPanId) { + log_w("Extended PAN ID is null"); + return; + } memcpy(mDataset.mExtendedPanId.m8, extPanId, OT_EXT_PAN_ID_SIZE); mDataset.mComponents.mIsExtendedPanIdPresent = true; } void DataSet::setNetworkKey(const uint8_t *key) { + if (!key) { + log_w("Network key is null"); + return; + } memcpy(mDataset.mNetworkKey.m8, key, OT_NETWORK_KEY_SIZE); mDataset.mComponents.mIsNetworkKeyPresent = true; } @@ -181,10 +196,18 @@ void DataSet::apply(otInstance *instance) { } // OpenThread Implementation -bool OpenThread::otStarted = false; +bool OpenThread::otStarted; +otInstance *OpenThread::mInstance; +DataSet OpenThread::mCurrentDataset; +otNetworkKey OpenThread::mNetworkKey; -otInstance *OpenThread::mInstance = nullptr; -OpenThread::OpenThread() {} +OpenThread::OpenThread() { + // static initialization (node data and stack starting information) + otStarted = false; + mCurrentDataset.clear(); // Initialize the current dataset + memset(&mNetworkKey, 0, sizeof(mNetworkKey)); // Initialize the network key + mInstance = nullptr; +} OpenThread::~OpenThread() { end(); @@ -214,13 +237,7 @@ void OpenThread::begin(bool OThreadAutoStart) { return; } log_d("OpenThread task created successfully"); - // get the OpenThread instance that will be used for all operations - mInstance = esp_openthread_get_instance(); - if (!mInstance) { - log_e("Error: Failed to initialize OpenThread instance"); - end(); - return; - } + // starts Thread with default dataset from NVS or from IDF default settings if (OThreadAutoStart) { otOperationalDatasetTlvs dataset; @@ -238,23 +255,46 @@ void OpenThread::begin(bool OThreadAutoStart) { log_i("AUTO start OpenThread done"); } } + + // get the OpenThread instance that will be used for all operations + mInstance = esp_openthread_get_instance(); + if (!mInstance) { + log_e("Error: Failed to initialize OpenThread instance"); + end(); + return; + } + otStarted = true; } void OpenThread::end() { + if (!otStarted) { + log_w("OpenThread already stopped"); + return; + } + if (s_ot_task != NULL) { vTaskDelete(s_ot_task); s_ot_task = NULL; - // Clean up - esp_openthread_deinit(); - esp_openthread_netif_glue_deinit(); -#if CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM - ot_lwip_netif = NULL; -#endif + } + + // Clean up in reverse order of initialization + if (openthread_netif != NULL) { esp_netif_destroy(openthread_netif); - esp_vfs_eventfd_unregister(); + openthread_netif = NULL; } + + esp_openthread_netif_glue_deinit(); + esp_openthread_deinit(); + esp_vfs_eventfd_unregister(); + +#if CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM + ot_lwip_netif = NULL; +#endif + + mInstance = nullptr; otStarted = false; + log_d("OpenThread ended successfully"); } void OpenThread::start() { @@ -262,6 +302,7 @@ void OpenThread::start() { log_w("Error: OpenThread instance not initialized"); return; } + clearAllAddressCache(); // Clear cache when starting network otThreadSetEnabled(mInstance, true); log_d("Thread network started"); } @@ -271,6 +312,7 @@ void OpenThread::stop() { log_w("Error: OpenThread instance not initialized"); return; } + clearAllAddressCache(); // Clear cache when stopping network otThreadSetEnabled(mInstance, false); log_d("Thread network stopped"); } @@ -285,6 +327,7 @@ void OpenThread::networkInterfaceUp() { if (error != OT_ERROR_NONE) { log_e("Error: Failed to enable Thread interface (error code: %d)\n", error); } + clearAllAddressCache(); // Clear cache when interface comes up log_d("OpenThread Network Interface is up"); } @@ -312,6 +355,7 @@ void OpenThread::commitDataSet(const DataSet &dataset) { log_e("Error: Failed to commit dataset (error code: %d)\n", error); return; } + clearAllAddressCache(); // Clear cache when dataset changes log_d("Dataset committed successfully"); } @@ -360,6 +404,289 @@ void OpenThread::otPrintNetworkInformation(Stream &output) { output.println(); } +// Get the Node Network Name +String OpenThread::getNetworkName() const { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return String(); // Return empty String, not nullptr + } + const char *networkName = otThreadGetNetworkName(mInstance); + return networkName ? String(networkName) : String(); +} + +// Get the Node Extended PAN ID +const uint8_t *OpenThread::getExtendedPanId() const { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return nullptr; + } + const otExtendedPanId *extPanId = otThreadGetExtendedPanId(mInstance); + return extPanId ? extPanId->m8 : nullptr; +} + +// Get the Node Network Key +const uint8_t *OpenThread::getNetworkKey() const { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return nullptr; + } + otThreadGetNetworkKey(mInstance, &mNetworkKey); + return mNetworkKey.m8; +} + +// Get the Node Channel +uint8_t OpenThread::getChannel() const { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return 0; + } + return otLinkGetChannel(mInstance); +} + +// Get the Node PAN ID +uint16_t OpenThread::getPanId() const { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return 0; + } + return otLinkGetPanId(mInstance); +} + +// Get the OpenThread instance +otInstance *OpenThread::getInstance() { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return nullptr; + } + return mInstance; +} + +// Get the current dataset +const DataSet &OpenThread::getCurrentDataSet() const { + + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + mCurrentDataset.clear(); + return mCurrentDataset; + } + + otOperationalDataset dataset; + otError error = otDatasetGetActive(mInstance, &dataset); + + if (error == OT_ERROR_NONE) { + mCurrentDataset.clear(); + + if (dataset.mComponents.mIsNetworkNamePresent) { + mCurrentDataset.setNetworkName(dataset.mNetworkName.m8); + } + if (dataset.mComponents.mIsExtendedPanIdPresent) { + mCurrentDataset.setExtendedPanId(dataset.mExtendedPanId.m8); + } + if (dataset.mComponents.mIsNetworkKeyPresent) { + mCurrentDataset.setNetworkKey(dataset.mNetworkKey.m8); + } + if (dataset.mComponents.mIsChannelPresent) { + mCurrentDataset.setChannel(dataset.mChannel); + } + if (dataset.mComponents.mIsPanIdPresent) { + mCurrentDataset.setPanId(dataset.mPanId); + } + } else { + log_w("Failed to get active dataset (error: %d)", error); + mCurrentDataset.clear(); + } + + return mCurrentDataset; +} + +// Get the Mesh Local Prefix +const otMeshLocalPrefix *OpenThread::getMeshLocalPrefix() const { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return nullptr; + } + return otThreadGetMeshLocalPrefix(mInstance); +} + +// Get the Mesh-Local EID +IPAddress OpenThread::getMeshLocalEid() const { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return IPAddress(IPv6); // Return empty IPv6 address + } + const otIp6Address *otAddr = otThreadGetMeshLocalEid(mInstance); + if (!otAddr) { + log_w("Failed to get Mesh Local EID"); + return IPAddress(IPv6); + } + return IPAddress(IPv6, otAddr->mFields.m8); +} + +// Get the Thread Leader RLOC +IPAddress OpenThread::getLeaderRloc() const { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return IPAddress(IPv6); // Return empty IPv6 address + } + otIp6Address otAddr; + otError error = otThreadGetLeaderRloc(mInstance, &otAddr); + if (error != OT_ERROR_NONE) { + log_w("Failed to get Leader RLOC"); + return IPAddress(IPv6); + } + return IPAddress(IPv6, otAddr.mFields.m8); +} + +// Get the Node RLOC +IPAddress OpenThread::getRloc() const { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return IPAddress(IPv6); // Return empty IPv6 address + } + const otIp6Address *otAddr = otThreadGetRloc(mInstance); + if (!otAddr) { + log_w("Failed to get Node RLOC"); + return IPAddress(IPv6); + } + return IPAddress(IPv6, otAddr->mFields.m8); +} + +// Get the RLOC16 ID +uint16_t OpenThread::getRloc16() const { + if (!mInstance) { + log_w("Error: OpenThread instance not initialized"); + return 0; + } + return otThreadGetRloc16(mInstance); +} + +// Populate unicast address cache from OpenThread +void OpenThread::populateUnicastAddressCache() const { + if (!mInstance) { + return; + } + + // Clear existing cache + mCachedUnicastAddresses.clear(); + + // Populate unicast addresses cache + const otNetifAddress *addr = otIp6GetUnicastAddresses(mInstance); + while (addr != nullptr) { + mCachedUnicastAddresses.push_back(IPAddress(IPv6, addr->mAddress.mFields.m8)); + addr = addr->mNext; + } + + log_d("Populated unicast address cache with %zu addresses", mCachedUnicastAddresses.size()); +} + +// Populate multicast address cache from OpenThread +void OpenThread::populateMulticastAddressCache() const { + if (!mInstance) { + return; + } + + // Clear existing cache + mCachedMulticastAddresses.clear(); + + // Populate multicast addresses cache + const otNetifMulticastAddress *mAddr = otIp6GetMulticastAddresses(mInstance); + while (mAddr != nullptr) { + mCachedMulticastAddresses.push_back(IPAddress(IPv6, mAddr->mAddress.mFields.m8)); + mAddr = mAddr->mNext; + } + + log_d("Populated multicast address cache with %zu addresses", mCachedMulticastAddresses.size()); +} + +// Clear unicast address cache +void OpenThread::clearUnicastAddressCache() const { + mCachedUnicastAddresses.clear(); + log_d("Cleared unicast address cache"); +} + +// Clear multicast address cache +void OpenThread::clearMulticastAddressCache() const { + mCachedMulticastAddresses.clear(); + log_d("Cleared multicast address cache"); +} + +// Clear all address caches +void OpenThread::clearAllAddressCache() const { + mCachedUnicastAddresses.clear(); + mCachedMulticastAddresses.clear(); + log_d("Cleared all address caches"); +} + +// Get count of unicast addresses +size_t OpenThread::getUnicastAddressCount() const { + // Populate cache if empty + if (mCachedUnicastAddresses.empty()) { + populateUnicastAddressCache(); + } + + return mCachedUnicastAddresses.size(); +} + +// Get unicast address by index +IPAddress OpenThread::getUnicastAddress(size_t index) const { + // Populate cache if empty + if (mCachedUnicastAddresses.empty()) { + populateUnicastAddressCache(); + } + + if (index >= mCachedUnicastAddresses.size()) { + log_w("Unicast address index %zu out of range (max: %zu)", index, mCachedUnicastAddresses.size()); + return IPAddress(IPv6); + } + + return mCachedUnicastAddresses[index]; +} + +// Get all unicast addresses +std::vector OpenThread::getAllUnicastAddresses() const { + // Populate cache if empty + if (mCachedUnicastAddresses.empty()) { + populateUnicastAddressCache(); + } + + return mCachedUnicastAddresses; // Return copy of cached vector +} + +// Get count of multicast addresses +size_t OpenThread::getMulticastAddressCount() const { + // Populate cache if empty + if (mCachedMulticastAddresses.empty()) { + populateMulticastAddressCache(); + } + + return mCachedMulticastAddresses.size(); +} + +// Get multicast address by index +IPAddress OpenThread::getMulticastAddress(size_t index) const { + // Populate cache if empty + if (mCachedMulticastAddresses.empty()) { + populateMulticastAddressCache(); + } + + if (index >= mCachedMulticastAddresses.size()) { + log_w("Multicast address index %zu out of range (max: %zu)", index, mCachedMulticastAddresses.size()); + return IPAddress(IPv6); + } + + return mCachedMulticastAddresses[index]; +} + +// Get all multicast addresses +std::vector OpenThread::getAllMulticastAddresses() const { + // Populate cache if empty + if (mCachedMulticastAddresses.empty()) { + populateMulticastAddressCache(); + } + + return mCachedMulticastAddresses; // Return copy of cached vector +} + OpenThread OThread; #endif /* CONFIG_OPENTHREAD_ENABLED */ diff --git a/libraries/OpenThread/src/OThread.h b/libraries/OpenThread/src/OThread.h index 359d581bb9d..6e21b854574 100644 --- a/libraries/OpenThread/src/OThread.h +++ b/libraries/OpenThread/src/OThread.h @@ -25,6 +25,8 @@ #include #include #include +#include "IPAddress.h" +#include typedef enum { OT_ROLE_DISABLED = 0, ///< The Thread stack is disabled. @@ -96,9 +98,68 @@ class OpenThread { // Set the dataset void commitDataSet(const DataSet &dataset); + // Get the Node Network Name + String getNetworkName() const; + + // Get the Node Extended PAN ID + const uint8_t *getExtendedPanId() const; + + // Get the Node Network Key + const uint8_t *getNetworkKey() const; + + // Get the Node Channel + uint8_t getChannel() const; + + // Get the Node PAN ID + uint16_t getPanId() const; + + // Get the OpenThread instance + otInstance *getInstance(); + + // Get the current dataset + const DataSet &getCurrentDataSet() const; + + // Get the Mesh Local Prefix + const otMeshLocalPrefix *getMeshLocalPrefix() const; + + // Get the Mesh-Local EID + IPAddress getMeshLocalEid() const; + + // Get the Thread Leader RLOC + IPAddress getLeaderRloc() const; + + // Get the Node RLOC + IPAddress getRloc() const; + + // Get the RLOC16 ID + uint16_t getRloc16() const; + + // Address management with caching + size_t getUnicastAddressCount() const; + IPAddress getUnicastAddress(size_t index) const; + std::vector getAllUnicastAddresses() const; + + size_t getMulticastAddressCount() const; + IPAddress getMulticastAddress(size_t index) const; + std::vector getAllMulticastAddresses() const; + + // Cache management + void clearUnicastAddressCache() const; + void clearMulticastAddressCache() const; + void clearAllAddressCache() const; + private: static otInstance *mInstance; - DataSet mCurrentDataSet; + static DataSet mCurrentDataset; // Current dataset being used by the OpenThread instance. + static otNetworkKey mNetworkKey; // Static storage to persist after function return + + // Address caching for performance (user-controlled) + mutable std::vector mCachedUnicastAddresses; + mutable std::vector mCachedMulticastAddresses; + + // Internal cache management + void populateUnicastAddressCache() const; + void populateMulticastAddressCache() const; }; extern OpenThread OThread; From a69c71f6ad771790ed4716fba063930f804806f6 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Wed, 16 Jul 2025 19:55:53 +0300 Subject: [PATCH 234/290] feat(core): Update core version to 3.3.0 --- .gitlab/workflows/common.yml | 4 ++-- cores/esp32/esp_arduino_version.h | 4 ++-- docs/conf_common.py | 4 ++-- 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 +- 46 files changed, 49 insertions(+), 49 deletions(-) diff --git a/.gitlab/workflows/common.yml b/.gitlab/workflows/common.yml index 9086da018ab..611e1d974f4 100644 --- a/.gitlab/workflows/common.yml +++ b/.gitlab/workflows/common.yml @@ -9,8 +9,8 @@ stages: - result variables: - ESP_IDF_VERSION: "5.4" - ESP_ARDUINO_VERSION: "3.2.1" + ESP_IDF_VERSION: "5.5" + ESP_ARDUINO_VERSION: "3.3.0" ############# # `default` # diff --git a/cores/esp32/esp_arduino_version.h b/cores/esp32/esp_arduino_version.h index 97bb3ac794b..120377c61f7 100644 --- a/cores/esp32/esp_arduino_version.h +++ b/cores/esp32/esp_arduino_version.h @@ -21,9 +21,9 @@ extern "C" { /** Major version number (X.x.x) */ #define ESP_ARDUINO_VERSION_MAJOR 3 /** Minor version number (x.X.x) */ -#define ESP_ARDUINO_VERSION_MINOR 2 +#define ESP_ARDUINO_VERSION_MINOR 3 /** Patch version number (x.x.X) */ -#define ESP_ARDUINO_VERSION_PATCH 1 +#define ESP_ARDUINO_VERSION_PATCH 0 /** * Macro to convert ARDUINO version number into an integer diff --git a/docs/conf_common.py b/docs/conf_common.py index af1d615f753..10d4bd715b2 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -4,8 +4,8 @@ # Used for substituting variables in the documentation rst_prolog = """ -.. |version| replace:: 3.2.1 -.. |idf_version| replace:: 5.4 +.. |version| replace:: 3.3.0 +.. |idf_version| replace:: 5.5 """ languages = ["en"] diff --git a/libraries/ArduinoOTA/library.properties b/libraries/ArduinoOTA/library.properties index 18de5aa2180..3a3f7e111e0 100644 --- a/libraries/ArduinoOTA/library.properties +++ b/libraries/ArduinoOTA/library.properties @@ -1,5 +1,5 @@ name=ArduinoOTA -version=3.2.1 +version=3.3.0 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 c64c60d0421..ddf9f79b6d9 100644 --- a/libraries/AsyncUDP/library.properties +++ b/libraries/AsyncUDP/library.properties @@ -1,5 +1,5 @@ name=ESP32 Async UDP -version=3.2.1 +version=3.3.0 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 335ab2fc965..c6fae19a4a1 100644 --- a/libraries/BLE/library.properties +++ b/libraries/BLE/library.properties @@ -1,5 +1,5 @@ name=BLE -version=3.2.1 +version=3.3.0 author=Neil Kolban maintainer=lucasssvaz sentence=BLE functions for ESP32 diff --git a/libraries/BluetoothSerial/library.properties b/libraries/BluetoothSerial/library.properties index 4bc1427e3f8..49211bf3b63 100644 --- a/libraries/BluetoothSerial/library.properties +++ b/libraries/BluetoothSerial/library.properties @@ -1,5 +1,5 @@ name=BluetoothSerial -version=3.2.1 +version=3.3.0 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 42e4c38dc9d..c193b919d02 100644 --- a/libraries/DNSServer/library.properties +++ b/libraries/DNSServer/library.properties @@ -1,5 +1,5 @@ name=DNSServer -version=3.2.1 +version=3.3.0 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 ee1caae0792..6d69f52a085 100644 --- a/libraries/EEPROM/library.properties +++ b/libraries/EEPROM/library.properties @@ -1,5 +1,5 @@ name=EEPROM -version=3.2.1 +version=3.3.0 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 0815a69ce6b..e664022388d 100644 --- a/libraries/ESP32/library.properties +++ b/libraries/ESP32/library.properties @@ -1,5 +1,5 @@ name=ESP32 -version=3.2.1 +version=3.3.0 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 ff1ad5d59da..b2763f4e7e8 100644 --- a/libraries/ESP_I2S/library.properties +++ b/libraries/ESP_I2S/library.properties @@ -1,5 +1,5 @@ name=ESP_I2S -version=3.2.1 +version=3.3.0 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 426a9464ace..f8e627dbc03 100644 --- a/libraries/ESP_NOW/library.properties +++ b/libraries/ESP_NOW/library.properties @@ -1,5 +1,5 @@ name=ESP_NOW -version=3.2.1 +version=3.3.0 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 3b9777bca8f..9d9787b7931 100644 --- a/libraries/ESP_SR/library.properties +++ b/libraries/ESP_SR/library.properties @@ -1,5 +1,5 @@ name=ESP_SR -version=3.2.1 +version=3.3.0 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 b99a5f58e5c..062d3b90b51 100644 --- a/libraries/ESPmDNS/library.properties +++ b/libraries/ESPmDNS/library.properties @@ -1,5 +1,5 @@ name=ESPmDNS -version=3.2.1 +version=3.3.0 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 cd2d8ead018..28f2a8697d9 100644 --- a/libraries/Ethernet/library.properties +++ b/libraries/Ethernet/library.properties @@ -1,5 +1,5 @@ name=Ethernet -version=3.2.1 +version=3.3.0 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 898982536b0..25b8c4e8acd 100644 --- a/libraries/FFat/library.properties +++ b/libraries/FFat/library.properties @@ -1,5 +1,5 @@ name=FFat -version=3.2.1 +version=3.3.0 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 fe86d613bdf..0f05f1134d5 100644 --- a/libraries/FS/library.properties +++ b/libraries/FS/library.properties @@ -1,5 +1,5 @@ name=FS -version=3.2.1 +version=3.3.0 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 76da4c857e1..bb5b0936255 100644 --- a/libraries/HTTPClient/library.properties +++ b/libraries/HTTPClient/library.properties @@ -1,5 +1,5 @@ name=HTTPClient -version=3.2.1 +version=3.3.0 author=Markus Sattler maintainer=Markus Sattler sentence=HTTP Client for ESP32 diff --git a/libraries/HTTPUpdate/library.properties b/libraries/HTTPUpdate/library.properties index dfe0474c3f3..88466a3a72e 100644 --- a/libraries/HTTPUpdate/library.properties +++ b/libraries/HTTPUpdate/library.properties @@ -1,5 +1,5 @@ name=HTTPUpdate -version=3.2.1 +version=3.3.0 author=Markus Sattler maintainer=Markus Sattler sentence=Http Update for ESP32 diff --git a/libraries/HTTPUpdateServer/library.properties b/libraries/HTTPUpdateServer/library.properties index 90aa966d27f..c182eeb8d7f 100644 --- a/libraries/HTTPUpdateServer/library.properties +++ b/libraries/HTTPUpdateServer/library.properties @@ -1,5 +1,5 @@ name=HTTPUpdateServer -version=3.2.1 +version=3.3.0 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 c1ad9c72ce1..3ef98d25be6 100644 --- a/libraries/Insights/library.properties +++ b/libraries/Insights/library.properties @@ -1,5 +1,5 @@ name=ESP Insights -version=3.2.1 +version=3.3.0 author=Sanket Wadekar maintainer=Sanket Wadekar sentence=ESP Insights diff --git a/libraries/LittleFS/library.properties b/libraries/LittleFS/library.properties index e00ed49c312..202d8ad4a6d 100644 --- a/libraries/LittleFS/library.properties +++ b/libraries/LittleFS/library.properties @@ -1,5 +1,5 @@ name=LittleFS -version=3.2.1 +version=3.3.0 author= maintainer= sentence=LittleFS for esp32 diff --git a/libraries/Matter/library.properties b/libraries/Matter/library.properties index b601fce0ff5..0b140bfa169 100644 --- a/libraries/Matter/library.properties +++ b/libraries/Matter/library.properties @@ -1,5 +1,5 @@ name=Matter -version=3.2.1 +version=3.3.0 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 a4bbf93c0ed..71d22d6f363 100644 --- a/libraries/NetBIOS/library.properties +++ b/libraries/NetBIOS/library.properties @@ -1,5 +1,5 @@ name=NetBIOS -version=3.2.1 +version=3.3.0 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 f2284981704..f7e04f4de3b 100644 --- a/libraries/Network/library.properties +++ b/libraries/Network/library.properties @@ -1,5 +1,5 @@ name=Networking -version=3.2.1 +version=3.3.0 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=General network management library. diff --git a/libraries/NetworkClientSecure/library.properties b/libraries/NetworkClientSecure/library.properties index 31af7a1bc8c..6ebf4c0ec70 100644 --- a/libraries/NetworkClientSecure/library.properties +++ b/libraries/NetworkClientSecure/library.properties @@ -1,5 +1,5 @@ name=NetworkClientSecure -version=3.2.1 +version=3.3.0 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 2687b1dcd1c..550d4eb1627 100644 --- a/libraries/OpenThread/library.properties +++ b/libraries/OpenThread/library.properties @@ -1,5 +1,5 @@ name=OpenThread -version=3.2.1 +version=3.3.0 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 c39647cbe56..537708b1261 100644 --- a/libraries/PPP/library.properties +++ b/libraries/PPP/library.properties @@ -1,5 +1,5 @@ name=PPP -version=3.2.1 +version=3.3.0 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 6e0d38348c0..0a7e678aa6c 100644 --- a/libraries/Preferences/library.properties +++ b/libraries/Preferences/library.properties @@ -1,5 +1,5 @@ name=Preferences -version=3.2.1 +version=3.3.0 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 71b4082a0a7..1d72a8faff5 100644 --- a/libraries/RainMaker/library.properties +++ b/libraries/RainMaker/library.properties @@ -1,5 +1,5 @@ name=ESP RainMaker -version=3.2.1 +version=3.3.0 author=Sweety Mhaiske maintainer=Hristo Gochkov sentence=ESP RainMaker Support diff --git a/libraries/SD/library.properties b/libraries/SD/library.properties index cc51196ed54..9d868dce799 100644 --- a/libraries/SD/library.properties +++ b/libraries/SD/library.properties @@ -1,5 +1,5 @@ name=SD -version=3.2.1 +version=3.3.0 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 590eb8ebc52..f96ee4377c2 100644 --- a/libraries/SD_MMC/library.properties +++ b/libraries/SD_MMC/library.properties @@ -1,5 +1,5 @@ name=SD_MMC -version=3.2.1 +version=3.3.0 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 724137030d1..3403d1c5d4f 100644 --- a/libraries/SPI/library.properties +++ b/libraries/SPI/library.properties @@ -1,5 +1,5 @@ name=SPI -version=3.2.1 +version=3.3.0 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 fc4601e512c..486ec1b4ce6 100644 --- a/libraries/SPIFFS/library.properties +++ b/libraries/SPIFFS/library.properties @@ -1,5 +1,5 @@ name=SPIFFS -version=3.2.1 +version=3.3.0 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 768449ee1c4..a7f12207afe 100644 --- a/libraries/SimpleBLE/library.properties +++ b/libraries/SimpleBLE/library.properties @@ -1,5 +1,5 @@ name=SimpleBLE -version=3.2.1 +version=3.3.0 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 6ad0c32c7d5..d2dc127f5ab 100644 --- a/libraries/TFLiteMicro/library.properties +++ b/libraries/TFLiteMicro/library.properties @@ -1,5 +1,5 @@ name=TFLite Micro -version=3.2.1 +version=3.3.0 author=Sanket Wadekar maintainer=Sanket Wadekar sentence=TensorFlow Lite for Microcontrollers diff --git a/libraries/Ticker/library.properties b/libraries/Ticker/library.properties index 8a2af554906..8795deb22ce 100644 --- a/libraries/Ticker/library.properties +++ b/libraries/Ticker/library.properties @@ -1,5 +1,5 @@ name=Ticker -version=3.2.1 +version=3.3.0 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 677d736a635..4c2c032545e 100644 --- a/libraries/USB/library.properties +++ b/libraries/USB/library.properties @@ -1,5 +1,5 @@ name=USB -version=3.2.1 +version=3.3.0 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=ESP32S2 USB Library diff --git a/libraries/Update/library.properties b/libraries/Update/library.properties index 4c756397aba..5fd633ec358 100644 --- a/libraries/Update/library.properties +++ b/libraries/Update/library.properties @@ -1,5 +1,5 @@ name=Update -version=3.2.1 +version=3.3.0 author=Hristo Gochkov maintainer=Hristo Gochkov sentence=ESP32 Sketch Update Library diff --git a/libraries/WebServer/library.properties b/libraries/WebServer/library.properties index bf6c26c65e7..913dd00e036 100644 --- a/libraries/WebServer/library.properties +++ b/libraries/WebServer/library.properties @@ -1,5 +1,5 @@ name=WebServer -version=3.2.1 +version=3.3.0 author=Ivan Grokhotkov maintainer=Ivan Grokhtkov sentence=Simple web server library diff --git a/libraries/WiFi/library.properties b/libraries/WiFi/library.properties index a282570ff8a..82ccb32b702 100644 --- a/libraries/WiFi/library.properties +++ b/libraries/WiFi/library.properties @@ -1,5 +1,5 @@ name=WiFi -version=3.2.1 +version=3.3.0 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 1cc8e4b0f91..1b19186c40b 100644 --- a/libraries/WiFiProv/library.properties +++ b/libraries/WiFiProv/library.properties @@ -1,5 +1,5 @@ name=WiFiProv -version=3.2.1 +version=3.3.0 author=Switi Mhaiske maintainer=Hristo Gochkov sentence=Enables provisioning. diff --git a/libraries/Wire/library.properties b/libraries/Wire/library.properties index 22cc7f26d86..182e98790bc 100644 --- a/libraries/Wire/library.properties +++ b/libraries/Wire/library.properties @@ -1,5 +1,5 @@ name=Wire -version=3.2.1 +version=3.3.0 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 d9587f49fd5..dab96b82a61 100644 --- a/libraries/Zigbee/library.properties +++ b/libraries/Zigbee/library.properties @@ -1,5 +1,5 @@ name=Zigbee -version=3.2.1 +version=3.3.0 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 85a15ab3615..4c3e4725a9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "framework-arduinoespressif32", - "version": "3.2.1", + "version": "3.3.0", "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 9e98650ca62..82560190c8f 100644 --- a/platform.txt +++ b/platform.txt @@ -1,5 +1,5 @@ name=ESP32 Arduino -version=3.2.1 +version=3.3.0 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 98d309f84a997138e018174c05232e91836e681f Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Fri, 18 Jul 2025 10:44:01 +0300 Subject: [PATCH 235/290] feat(ci): Enable builds on IDF 5.3, 5.4 and 5.5 --- .github/workflows/push.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 68148fbcff7..f2f2c0b5ca1 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -248,7 +248,7 @@ jobs: # See https://hub.docker.com/r/espressif/idf/tags and # https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-docker-image.html # for details. - idf_ver: ["release-v5.5"] + idf_ver: ["release-v5.3","release-v5.4","release-v5.5"] idf_target: [ "esp32", From 6cb518448793f0d42b81cf6e8d02662a8846c4fc Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Fri, 18 Jul 2025 11:12:22 +0300 Subject: [PATCH 236/290] fix(build): Fix build for IDF 5.3.3+ and older releases --- cores/esp32/esp32-hal-i2c-slave.c | 8 ++++++-- cores/esp32/esp32-hal-ledc.c | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cores/esp32/esp32-hal-i2c-slave.c b/cores/esp32/esp32-hal-i2c-slave.c index e616934958e..6d69418e787 100644 --- a/cores/esp32/esp32-hal-i2c-slave.c +++ b/cores/esp32/esp32-hal-i2c-slave.c @@ -338,7 +338,9 @@ 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, 4, 0) +#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)) \ + || (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 5, 0)) \ + || (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 3) && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 4, 0)) i2c_ll_set_mode(i2c->dev, I2C_BUS_MODE_SLAVE); i2c_ll_enable_pins_open_drain(i2c->dev, true); i2c_ll_enable_fifo_mode(i2c->dev, true); @@ -366,7 +368,9 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t i2c_ll_disable_intr_mask(i2c->dev, I2C_LL_INTR_MASK); i2c_ll_clear_intr_mask(i2c->dev, I2C_LL_INTR_MASK); -#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) +#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)) \ + || (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 5, 0)) \ + || (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 3) && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 4, 0)) i2c_ll_enable_fifo_mode(i2c->dev, true); #else i2c_ll_slave_set_fifo_mode(i2c->dev, true); diff --git a/cores/esp32/esp32-hal-ledc.c b/cores/esp32/esp32-hal-ledc.c index 18b722f80a2..ffb24db4599 100644 --- a/cores/esp32/esp32-hal-ledc.c +++ b/cores/esp32/esp32-hal-ledc.c @@ -88,6 +88,9 @@ static bool find_free_timer(uint8_t speed_mode, uint8_t *timer_num) { } } +#ifndef SOC_LEDC_TIMER_NUM +#define SOC_LEDC_TIMER_NUM 4 +#endif // Find first unused timer for (uint8_t i = 0; i < SOC_LEDC_TIMER_NUM; i++) { if (!(used_timers & (1 << i))) { From 346e7f41386bef558d56a6113d433f824667a278 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Fri, 18 Jul 2025 11:18:13 +0300 Subject: [PATCH 237/290] fix(build): Enable I2C FIFO mode only on IDF 5.5+ --- cores/esp32/esp32-hal-i2c-slave.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cores/esp32/esp32-hal-i2c-slave.c b/cores/esp32/esp32-hal-i2c-slave.c index 6d69418e787..2a357b3a747 100644 --- a/cores/esp32/esp32-hal-i2c-slave.c +++ b/cores/esp32/esp32-hal-i2c-slave.c @@ -368,9 +368,7 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t i2c_ll_disable_intr_mask(i2c->dev, I2C_LL_INTR_MASK); i2c_ll_clear_intr_mask(i2c->dev, I2C_LL_INTR_MASK); -#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)) \ - || (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 5, 0)) \ - || (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 3) && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 4, 0)) +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) i2c_ll_enable_fifo_mode(i2c->dev, true); #else i2c_ll_slave_set_fifo_mode(i2c->dev, true); From 530c1a43fe9425061c396486d744110ce6ca6f83 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Fri, 18 Jul 2025 11:19:50 +0300 Subject: [PATCH 238/290] fix(build): Enable I2C FIFO mode only on IDF 5.4.2+ --- cores/esp32/esp32-hal-i2c-slave.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-i2c-slave.c b/cores/esp32/esp32-hal-i2c-slave.c index 2a357b3a747..c8e59653a8f 100644 --- a/cores/esp32/esp32-hal-i2c-slave.c +++ b/cores/esp32/esp32-hal-i2c-slave.c @@ -368,7 +368,7 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t i2c_ll_disable_intr_mask(i2c->dev, I2C_LL_INTR_MASK); i2c_ll_clear_intr_mask(i2c->dev, I2C_LL_INTR_MASK); -#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) i2c_ll_enable_fifo_mode(i2c->dev, true); #else i2c_ll_slave_set_fifo_mode(i2c->dev, true); From 000336bad0446d3b8ded72b1d92e5edc407f8f69 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Fri, 18 Jul 2025 11:25:36 +0300 Subject: [PATCH 239/290] fix(build): Enable I2C FIFO mode only on IDF 5.4.2+ --- cores/esp32/esp32-hal-i2c-slave.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cores/esp32/esp32-hal-i2c-slave.c b/cores/esp32/esp32-hal-i2c-slave.c index c8e59653a8f..79c994869e2 100644 --- a/cores/esp32/esp32-hal-i2c-slave.c +++ b/cores/esp32/esp32-hal-i2c-slave.c @@ -343,7 +343,11 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t || (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 3) && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 4, 0)) i2c_ll_set_mode(i2c->dev, I2C_BUS_MODE_SLAVE); i2c_ll_enable_pins_open_drain(i2c->dev, true); +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) i2c_ll_enable_fifo_mode(i2c->dev, true); +#else + i2c_ll_slave_set_fifo_mode(i2c->dev, true); +#endif #else i2c_ll_slave_init(i2c->dev); i2c_ll_slave_set_fifo_mode(i2c->dev, true); From 211a0ce1438ad7108ded0299238876f22036d946 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Fri, 18 Jul 2025 09:15:48 -0300 Subject: [PATCH 240/290] fix(ci): Fix artifact names --- .github/workflows/push.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index f2f2c0b5ca1..1523b7231be 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -283,7 +283,7 @@ jobs: uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: always() with: - name: sdkconfig-${{ matrix.idf_target }} + name: sdkconfig-${{ matrix.idf_ver }}-${{ matrix.idf_target }} path: ./components/arduino-esp32/idf_component_examples/**/sdkconfig # Save artifacts to gh-pages From 3ad17de6aa6f74f7d01bff4197f9f7a7481b2bb4 Mon Sep 17 00:00:00 2001 From: Sugar Glider Date: Fri, 18 Jul 2025 13:02:55 -0300 Subject: [PATCH 241/290] fix(build): make core compatible with IDF 5.3 (#11607) * fix(uart): make it compatible with IDF 5.3 * fix(ci): Fix artifact names * fix(build): Fix ESP_NOW and WiFi for IDF 5.3 * fix(build): Fix NetworkClient for IDF 5.3 * fix(build): Fix WiFi for IDF 5.3 * fix(build): Fix WiFi Captive Portal for IDF 5.3 --------- Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Co-authored-by: me-no-dev --- cores/esp32/esp32-hal-uart.c | 11 +++++++++++ libraries/ESP_NOW/src/ESP32_NOW.cpp | 4 ++++ libraries/Network/src/NetworkClient.cpp | 8 +++----- libraries/WiFi/examples/WiFiScan/WiFiScan.ino | 2 ++ libraries/WiFi/src/AP.cpp | 2 ++ libraries/WiFi/src/WiFiAP.h | 2 ++ libraries/WiFi/src/WiFiGeneric.cpp | 2 ++ libraries/WiFi/src/WiFiGeneric.h | 2 ++ 8 files changed, 28 insertions(+), 5 deletions(-) diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index 6e5a22da9f8..8bd446a8eb8 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -389,7 +389,12 @@ static esp_err_t _uartInternalSetPin(uart_port_t uart_num, int tx_io_num, int rx #endif if (tx_rx_same_io || !_uartTrySetIomuxPin(uart_num, rx_io_num, SOC_UART_RX_PIN_IDX)) { if (uart_num < SOC_UART_HP_NUM) { +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) gpio_input_enable(rx_io_num); +#else + gpio_func_sel(rx_io_num, PIN_FUNC_GPIO); + gpio_ll_input_enable(&GPIO, rx_io_num); +#endif esp_rom_gpio_connect_in_signal(rx_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RX_PIN_IDX), 0); } #if SOC_LP_GPIO_MATRIX_SUPPORTED @@ -422,8 +427,14 @@ static esp_err_t _uartInternalSetPin(uart_port_t uart_num, int tx_io_num, int rx if (cts_io_num >= 0 && !_uartTrySetIomuxPin(uart_num, cts_io_num, SOC_UART_CTS_PIN_IDX)) { if (uart_num < SOC_UART_HP_NUM) { +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) gpio_pullup_en(cts_io_num); gpio_input_enable(cts_io_num); +#else + gpio_func_sel(cts_io_num, PIN_FUNC_GPIO); + gpio_set_pull_mode(cts_io_num, GPIO_PULLUP_ONLY); + gpio_set_direction(cts_io_num, GPIO_MODE_INPUT); +#endif esp_rom_gpio_connect_in_signal(cts_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_CTS_PIN_IDX), 0); } #if SOC_LP_GPIO_MATRIX_SUPPORTED diff --git a/libraries/ESP_NOW/src/ESP32_NOW.cpp b/libraries/ESP_NOW/src/ESP32_NOW.cpp index d461fe1473d..e61160a16dd 100644 --- a/libraries/ESP_NOW/src/ESP32_NOW.cpp +++ b/libraries/ESP_NOW/src/ESP32_NOW.cpp @@ -9,6 +9,10 @@ #include "esp32-hal.h" #include "esp_wifi.h" +#ifndef ESP_NOW_MAX_DATA_LEN_V2 +#define ESP_NOW_MAX_DATA_LEN_V2 1470 +#endif + static void (*new_cb)(const esp_now_recv_info_t *info, const uint8_t *data, int len, void *arg) = nullptr; static void *new_arg = nullptr; // * tx_arg = nullptr, * rx_arg = nullptr, static bool _esp_now_has_begun = false; diff --git a/libraries/Network/src/NetworkClient.cpp b/libraries/Network/src/NetworkClient.cpp index 89411a42453..355cbc6c361 100644 --- a/libraries/Network/src/NetworkClient.cpp +++ b/libraries/Network/src/NetworkClient.cpp @@ -23,11 +23,9 @@ #include #include -// It is already defined in IDF as: -//#define IN6_IS_ADDR_V4MAPPED(a) ip6_addr_isipv4mappedipv6((ip6_addr_t*)(a)) -//#define ip6_addr_isipv4mappedipv6(ip6addr) (((ip6addr)->addr[0] == 0) && ((ip6addr)->addr[1] == 0) && (((ip6addr)->addr[2]) == PP_HTONL(0x0000FFFFUL))) -// Keeping as a memory of the change. -//#define _IN6_IS_ADDR_V4MAPPED(a) ((((__const uint32_t *)(a))[0] == 0) && (((__const uint32_t *)(a))[1] == 0) && (((__const uint32_t *)(a))[2] == htonl(0xffff))) +#ifndef IN6_IS_ADDR_V4MAPPED +#define IN6_IS_ADDR_V4MAPPED(a) ((((__const uint32_t *)(a))[0] == 0) && (((__const uint32_t *)(a))[1] == 0) && (((__const uint32_t *)(a))[2] == htonl(0xffff))) +#endif #define WIFI_CLIENT_DEF_CONN_TIMEOUT_MS (3000) #define WIFI_CLIENT_MAX_WRITE_RETRY (10) diff --git a/libraries/WiFi/examples/WiFiScan/WiFiScan.ino b/libraries/WiFi/examples/WiFiScan/WiFiScan.ino index 98733adb0bb..d840959dcb2 100644 --- a/libraries/WiFi/examples/WiFiScan/WiFiScan.ino +++ b/libraries/WiFi/examples/WiFiScan/WiFiScan.ino @@ -58,7 +58,9 @@ void loop() { Serial.println("-------------------------------------"); Serial.println("Default wifi band mode scan:"); Serial.println("-------------------------------------"); +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) WiFi.setBandMode(WIFI_BAND_MODE_AUTO); +#endif ScanWiFi(); #if CONFIG_SOC_WIFI_SUPPORT_5G // Wait a bit before scanning again. diff --git a/libraries/WiFi/src/AP.cpp b/libraries/WiFi/src/AP.cpp index a649c3898cb..00c3a1e3733 100644 --- a/libraries/WiFi/src/AP.cpp +++ b/libraries/WiFi/src/AP.cpp @@ -305,6 +305,7 @@ bool APClass::enableNAPT(bool enable) { return true; } +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) bool APClass::enableDhcpCaptivePortal() { esp_err_t err = ESP_OK; static char captiveportal_uri[32] = { @@ -343,6 +344,7 @@ bool APClass::enableDhcpCaptivePortal() { return true; } +#endif String APClass::SSID(void) const { if (!started()) { diff --git a/libraries/WiFi/src/WiFiAP.h b/libraries/WiFi/src/WiFiAP.h index 2b7ce469801..67cc0f988d3 100644 --- a/libraries/WiFi/src/WiFiAP.h +++ b/libraries/WiFi/src/WiFiAP.h @@ -53,7 +53,9 @@ class APClass : public NetworkInterface { bool bandwidth(wifi_bandwidth_t bandwidth); bool enableNAPT(bool enable = true); +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) bool enableDhcpCaptivePortal(); +#endif String SSID(void) const; uint8_t stationCount(); diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index 171bd293738..66f8908af77 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -781,6 +781,7 @@ wifi_ps_type_t WiFiGenericClass::getSleep() { return _sleepEnabled; } +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) /** * control wifi band mode * @param band_mode enum possible band modes @@ -843,6 +844,7 @@ wifi_band_mode_t WiFiGenericClass::getBandMode() { return WIFI_BAND_MODE_2G_ONLY; #endif } +#endif /** * get the current active wifi band diff --git a/libraries/WiFi/src/WiFiGeneric.h b/libraries/WiFi/src/WiFiGeneric.h index ebeecb51e16..cdc1519d30b 100644 --- a/libraries/WiFi/src/WiFiGeneric.h +++ b/libraries/WiFi/src/WiFiGeneric.h @@ -116,8 +116,10 @@ class WiFiGenericClass { bool setTxPower(wifi_power_t power); wifi_power_t getTxPower(); +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) bool setBandMode(wifi_band_mode_t band_mode); wifi_band_mode_t getBandMode(); +#endif wifi_band_t getBand(); bool initiateFTM(uint8_t frm_count = 16, uint16_t burst_period = 2, uint8_t channel = 1, const uint8_t *mac = NULL); From 9641de1b12c3ae4980fc1c6b9a2f939a0b6d4934 Mon Sep 17 00:00:00 2001 From: Paula Scharf Date: Thu, 3 Jul 2025 15:22:07 +0200 Subject: [PATCH 242/290] feat(board): add senseBox Eye board --- boards.txt | 190 ++++++++++++++++++ variants/sensebox_eye/bootloader-tinyuf2.bin | Bin 0 -> 22352 bytes .../sensebox_eye/partitions-16MB-tinyuf2.csv | 10 + variants/sensebox_eye/pins_arduino.h | 90 +++++++++ variants/sensebox_eye/tinyuf2.bin | Bin 0 -> 186912 bytes variants/sensebox_eye/variant.cpp | 71 +++++++ 6 files changed, 361 insertions(+) create mode 100644 variants/sensebox_eye/bootloader-tinyuf2.bin create mode 100644 variants/sensebox_eye/partitions-16MB-tinyuf2.csv create mode 100644 variants/sensebox_eye/pins_arduino.h create mode 100644 variants/sensebox_eye/tinyuf2.bin create mode 100644 variants/sensebox_eye/variant.cpp diff --git a/boards.txt b/boards.txt index ac2b1a336e4..2363fe2a63b 100644 --- a/boards.txt +++ b/boards.txt @@ -41309,6 +41309,196 @@ sensebox_mcu_esp32s2.menu.EraseFlash.none.upload.erase_cmd= sensebox_mcu_esp32s2.menu.EraseFlash.all=Enabled sensebox_mcu_esp32s2.menu.EraseFlash.all.upload.erase_cmd=-e +############################################################## +# senseBox Eye + +sensebox_eye.name=senseBox Eye +senseBox_eye.vid.0=0x303A +senseBox_eye.pid.0=0x82D1 +senseBox_eye.vid.1=0x303A +senseBox_eye.pid.1=0x82D2 +senseBox_eye.vid.2=0x303A +senseBox_eye.pid.2=0x82D3 + +sensebox_eye.bootloader.tool=esptool_py +sensebox_eye.bootloader.tool.default=esptool_py + +sensebox_eye.upload.tool=esptool_py +sensebox_eye.upload.tool.default=esptool_py +sensebox_eye.upload.tool.network=esp_ota + +sensebox_eye.upload.maximum_size=1310720 +sensebox_eye.upload.maximum_data_size=327680 +sensebox_eye.upload.flags= +sensebox_eye.upload.extra_flags= +sensebox_eye.upload.use_1200bps_touch=true +sensebox_eye.upload.wait_for_upload_port=true + +sensebox_eye.serial.disableDTR=true +sensebox_eye.serial.disableRTS=true + +sensebox_eye.build.tarch=xtensa +sensebox_eye.build.bootloader_addr=0x0 +sensebox_eye.build.target=esp32s3 +sensebox_eye.build.mcu=esp32s3 +sensebox_eye.build.core=esp32 +sensebox_eye.build.variant=sensebox_eye +sensebox_eye.build.board=sensebox_eye + +sensebox_eye.build.usb_mode=0 +sensebox_eye.build.cdc_on_boot=1 +sensebox_eye.build.msc_on_boot=1 +sensebox_eye.build.dfu_on_boot=0 +sensebox_eye.build.f_cpu=240000000L +sensebox_eye.build.flash_size=16MB (128Mb) +sensebox_eye.build.flash_freq=80m +sensebox_eye.build.flash_mode=dio +sensebox_eye.build.boot=qio +sensebox_eye.build.boot_freq=80m +sensebox_eye.build.partitions=default_16MB +sensebox_eye.build.defines= +sensebox_eye.build.loop_core= +sensebox_eye.build.event_core= +sensebox_eye.build.psram_type=qspi +sensebox_eye.build.memory_type={build.boot}_{build.psram_type} + +sensebox_eye.menu.JTAGAdapter.default=Disabled +sensebox_eye.menu.JTAGAdapter.default.build.copy_jtag_files=0 +sensebox_eye.menu.JTAGAdapter.builtin=Integrated USB JTAG +sensebox_eye.menu.JTAGAdapter.builtin.build.openocdscript=esp32s3-builtin.cfg +sensebox_eye.menu.JTAGAdapter.builtin.build.copy_jtag_files=1 +sensebox_eye.menu.JTAGAdapter.external=FTDI Adapter +sensebox_eye.menu.JTAGAdapter.external.build.openocdscript=esp32s3-ftdi.cfg +sensebox_eye.menu.JTAGAdapter.external.build.copy_jtag_files=1 +sensebox_eye.menu.JTAGAdapter.bridge=ESP USB Bridge +sensebox_eye.menu.JTAGAdapter.bridge.build.openocdscript=esp32s3-bridge.cfg +sensebox_eye.menu.JTAGAdapter.bridge.build.copy_jtag_files=1 + +sensebox_eye.menu.PSRAM.disabled=Disabled +sensebox_eye.menu.PSRAM.disabled.build.defines= +sensebox_eye.menu.PSRAM.disabled.build.psram_type=qspi +sensebox_eye.menu.PSRAM.opi=OPI PSRAM +sensebox_eye.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM +sensebox_eye.menu.PSRAM.opi.build.psram_type=opi + +sensebox_eye.menu.FlashMode.qio=QIO 80MHz +sensebox_eye.menu.FlashMode.qio.build.flash_mode=dio +sensebox_eye.menu.FlashMode.qio.build.boot=qio +sensebox_eye.menu.FlashMode.qio.build.boot_freq=80m +sensebox_eye.menu.FlashMode.qio.build.flash_freq=80m +sensebox_eye.menu.FlashMode.dio=DIO 80MHz +sensebox_eye.menu.FlashMode.dio.build.flash_mode=dio +sensebox_eye.menu.FlashMode.dio.build.boot=dio +sensebox_eye.menu.FlashMode.dio.build.boot_freq=80m +sensebox_eye.menu.FlashMode.dio.build.flash_freq=80m + +sensebox_eye.menu.FlashSize.16M=16MB (128Mb) +sensebox_eye.menu.FlashSize.16M.build.flash_size=16MB + +sensebox_eye.menu.LoopCore.1=Core 1 +sensebox_eye.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 +sensebox_eye.menu.LoopCore.0=Core 0 +sensebox_eye.menu.LoopCore.0.build.loop_core=-DARDUINO_RUNNING_CORE=0 + +sensebox_eye.menu.EventsCore.1=Core 1 +sensebox_eye.menu.EventsCore.1.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=1 +sensebox_eye.menu.EventsCore.0=Core 0 +sensebox_eye.menu.EventsCore.0.build.event_core=-DARDUINO_EVENT_RUNNING_CORE=0 + +sensebox_eye.menu.USBMode.hwcdc=Hardware CDC and JTAG +sensebox_eye.menu.USBMode.hwcdc.build.usb_mode=1 +sensebox_eye.menu.USBMode.default=USB-OTG (TinyUSB) +sensebox_eye.menu.USBMode.default.build.usb_mode=0 + +sensebox_eye.menu.CDCOnBoot.default=Enabled +sensebox_eye.menu.CDCOnBoot.default.build.cdc_on_boot=1 +sensebox_eye.menu.CDCOnBoot.cdc=Disabled +sensebox_eye.menu.CDCOnBoot.cdc.build.cdc_on_boot=0 + +sensebox_eye.menu.MSCOnBoot.default=Disabled +sensebox_eye.menu.MSCOnBoot.default.build.msc_on_boot=0 +sensebox_eye.menu.MSCOnBoot.msc=Enabled (Requires USB-OTG Mode) +sensebox_eye.menu.MSCOnBoot.msc.build.msc_on_boot=1 + +sensebox_eye.menu.DFUOnBoot.default=Disabled +sensebox_eye.menu.DFUOnBoot.default.build.dfu_on_boot=0 +sensebox_eye.menu.DFUOnBoot.dfu=Enabled (Requires USB-OTG Mode) +sensebox_eye.menu.DFUOnBoot.dfu.build.dfu_on_boot=1 + +sensebox_eye.menu.UploadMode.default=UART0 / Hardware CDC +sensebox_eye.menu.UploadMode.default.upload.use_1200bps_touch=false +sensebox_eye.menu.UploadMode.default.upload.wait_for_upload_port=false +sensebox_eye.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB) +sensebox_eye.menu.UploadMode.cdc.upload.use_1200bps_touch=true +sensebox_eye.menu.UploadMode.cdc.upload.wait_for_upload_port=true + +sensebox_eye.menu.PartitionScheme.default_16MB=Default (6.25MB APP/3.43MB SPIFFS) +sensebox_eye.menu.PartitionScheme.default_16MB.build.partitions=default_16MB +sensebox_eye.menu.PartitionScheme.default_16MB.upload.maximum_size=6553600 +sensebox_eye.menu.PartitionScheme.large_spiffs=Large SPIFFS (4.5MB APP/6.93MB SPIFFS) +sensebox_eye.menu.PartitionScheme.large_spiffs.build.partitions=large_spiffs_16MB +sensebox_eye.menu.PartitionScheme.large_spiffs.upload.maximum_size=4718592 +sensebox_eye.menu.PartitionScheme.app3M_fat9M_16MB=FFAT (3MB APP/9MB FATFS) +sensebox_eye.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB +sensebox_eye.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728 +sensebox_eye.menu.PartitionScheme.fatflash=Large FFAT (2MB APP/12.5MB FATFS) +sensebox_eye.menu.PartitionScheme.fatflash.build.partitions=ffat +sensebox_eye.menu.PartitionScheme.fatflash.upload.maximum_size=2097152 +sensebox_eye.menu.PartitionScheme.tinyuf2=TinyUF2 Compatibility (2MB APP/12MB FFAT) +sensebox_eye.menu.PartitionScheme.tinyuf2.build.custom_bootloader=bootloader_tinyuf2 +sensebox_eye.menu.PartitionScheme.tinyuf2.build.custom_partitions=partitions_tinyuf2 +sensebox_eye.menu.PartitionScheme.tinyuf2.upload.maximum_size=2097152 +sensebox_eye.menu.PartitionScheme.tinyuf2.upload.extra_flags=0x410000 "{runtime.platform.path}/variants/{build.variant}/tinyuf2.bin" +sensebox_eye.menu.PartitionScheme.gen4esp32scheme4=Huge App (16MB APP) +sensebox_eye.menu.PartitionScheme.gen4esp32scheme4.build.custom_partitions=gen4esp32_16MBapp +sensebox_eye.menu.PartitionScheme.gen4esp32scheme4.upload.maximum_size=16646144 + +sensebox_eye.menu.CPUFreq.240=240MHz (WiFi) +sensebox_eye.menu.CPUFreq.240.build.f_cpu=240000000L +sensebox_eye.menu.CPUFreq.160=160MHz (WiFi) +sensebox_eye.menu.CPUFreq.160.build.f_cpu=160000000L +sensebox_eye.menu.CPUFreq.80=80MHz (WiFi) +sensebox_eye.menu.CPUFreq.80.build.f_cpu=80000000L +sensebox_eye.menu.CPUFreq.40=40MHz +sensebox_eye.menu.CPUFreq.40.build.f_cpu=40000000L +sensebox_eye.menu.CPUFreq.20=20MHz +sensebox_eye.menu.CPUFreq.20.build.f_cpu=20000000L +sensebox_eye.menu.CPUFreq.10=10MHz +sensebox_eye.menu.CPUFreq.10.build.f_cpu=10000000L + +sensebox_eye.menu.UploadSpeed.921600=921600 +sensebox_eye.menu.UploadSpeed.921600.upload.speed=921600 +sensebox_eye.menu.UploadSpeed.115200=115200 +sensebox_eye.menu.UploadSpeed.115200.upload.speed=115200 +sensebox_eye.menu.UploadSpeed.256000.windows=256000 +sensebox_eye.menu.UploadSpeed.256000.upload.speed=256000 +sensebox_eye.menu.UploadSpeed.230400.windows.upload.speed=256000 +sensebox_eye.menu.UploadSpeed.230400=230400 +sensebox_eye.menu.UploadSpeed.230400.upload.speed=230400 +sensebox_eye.menu.UploadSpeed.460800.linux=460800 +sensebox_eye.menu.UploadSpeed.460800.macosx=460800 +sensebox_eye.menu.UploadSpeed.460800.upload.speed=460800 +sensebox_eye.menu.UploadSpeed.512000.windows=512000 +sensebox_eye.menu.UploadSpeed.512000.upload.speed=512000 + +sensebox_eye.menu.DebugLevel.none=None +sensebox_eye.menu.DebugLevel.none.build.code_debug=0 +sensebox_eye.menu.DebugLevel.error=Error +sensebox_eye.menu.DebugLevel.error.build.code_debug=1 +sensebox_eye.menu.DebugLevel.warn=Warn +sensebox_eye.menu.DebugLevel.warn.build.code_debug=2 +sensebox_eye.menu.DebugLevel.info=Info +sensebox_eye.menu.DebugLevel.info.build.code_debug=3 +sensebox_eye.menu.DebugLevel.debug=Debug +sensebox_eye.menu.DebugLevel.debug.build.code_debug=4 +sensebox_eye.menu.DebugLevel.verbose=Verbose +sensebox_eye.menu.DebugLevel.verbose.build.code_debug=5 + +sensebox_eye.menu.EraseFlash.none=Disabled +sensebox_eye.menu.EraseFlash.none.upload.erase_cmd= +sensebox_eye.menu.EraseFlash.all=Enabled +sensebox_eye.menu.EraseFlash.all.upload.erase_cmd=-e + ############################################################## nano_nora.name=Arduino Nano ESP32 diff --git a/variants/sensebox_eye/bootloader-tinyuf2.bin b/variants/sensebox_eye/bootloader-tinyuf2.bin new file mode 100644 index 0000000000000000000000000000000000000000..c7676c718f2383a78785da38dcffde52ca67eab0 GIT binary patch literal 22352 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 C4c&VH literal 0 HcmV?d00001 diff --git a/variants/sensebox_eye/partitions-16MB-tinyuf2.csv b/variants/sensebox_eye/partitions-16MB-tinyuf2.csv new file mode 100644 index 00000000000..960f3fbbd71 --- /dev/null +++ b/variants/sensebox_eye/partitions-16MB-tinyuf2.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, 11968K, \ No newline at end of file diff --git a/variants/sensebox_eye/pins_arduino.h b/variants/sensebox_eye/pins_arduino.h new file mode 100644 index 00000000000..583cb38283e --- /dev/null +++ b/variants/sensebox_eye/pins_arduino.h @@ -0,0 +1,90 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +#define USB_VID 0x303A +#define USB_PID 0x81B8 +#define USB_MANUFACTURER "senseBox" +#define USB_PRODUCT "Eye ESP32S3" +#define USB_SERIAL "" // Empty string for MAC address + +// Default USB FirmwareMSC Settings +#define USB_FW_MSC_VENDOR_ID "senseBox" // max 8 chars +#define USB_FW_MSC_PRODUCT_ID "Eye ESP32S3" // max 16 chars +#define USB_FW_MSC_PRODUCT_REVISION "1.00" // max 4 chars +#define USB_FW_MSC_VOLUME_NAME "senseBox" // max 11 chars +#define USB_FW_MSC_SERIAL_NUMBER 0x00000000 + +#define PIN_RGB_LED 45 // RGB LED +#define RGBLED_PIN 45 // RGB LED +#define PIN_LED 45 +#define RGBLED_NUM 1 // number of RGB LEDs + +// Default I2C QWIIC-Ports +static const uint8_t SDA = 2; +static const uint8_t SCL = 1; +#define PIN_QWIIC_SDA 2 +#define PIN_QWIIC_SCL 1 + +// IO Pins +#define PIN_IO14 14 +static const uint8_t A14 = PIN_IO14; // Analog +static const uint8_t D14 = PIN_IO14; // Digital +static const uint8_t T14 = PIN_IO14; // Touch +#define PIN_IO48 48 +static const uint8_t A48 = PIN_IO48; // Analog +static const uint8_t D48 = PIN_IO48; // Digital +static const uint8_t T48 = PIN_IO48; // Touch + +// Button +#define PIN_BUTTON 47 + +// UART Port +static const uint8_t TX = 43; +static const uint8_t RX = 44; +#define PIN_UART_TXD 43 +#define PIN_UART_RXD 44 +#define PIN_UART_ENABLE 26 + +// SD-Card +#define MISO 40 +#define MOSI 38 +#define SCK 39 +#define SS 41 +#define SD_ENABLE 3 + +#define PIN_SD_MISO 40 +#define PIN_SD_MOSI 38 +#define PIN_SD_SCLK 39 +#define PIN_SD_CS 41 +#define PIN_SD_ENABLE 3 + +// USB +#define PIN_USB_DM 19 +#define PIN_USB_DP 20 + +// Camera +#define PWDN_GPIO_NUM 46 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 15 +#define SIOD_GPIO_NUM 4 +#define SIOC_GPIO_NUM 5 + +#define Y9_GPIO_NUM 16 +#define Y8_GPIO_NUM 17 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 12 +#define Y5_GPIO_NUM 10 +#define Y4_GPIO_NUM 8 +#define Y3_GPIO_NUM 9 +#define Y2_GPIO_NUM 11 +#define VSYNC_GPIO_NUM 6 +#define HREF_GPIO_NUM 7 +#define PCLK_GPIO_NUM 13 + +// LoRa +#define LORA_TX 43 +#define LORA_RX 44 + +#endif /* Pins_Arduino_h */ \ No newline at end of file diff --git a/variants/sensebox_eye/tinyuf2.bin b/variants/sensebox_eye/tinyuf2.bin new file mode 100644 index 0000000000000000000000000000000000000000..6b0fb1bcd0417ce9175fc75bf09b49f7516ab078 GIT binary patch literal 186912 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 d9 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�Dc@MAz`I8W?zJ6G*d%QrtNn+@ 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

  • g99!^@*%}K9xVHmoMhmqpk_cfA663JN5D<{Q6H>`BEx(>E%WI`kk!Y zL*?W3^40wMS6TU5D!+uvnO_>?l7T8MB?zbnX2dPE_2oCTb?ROZ01RmVc?AVOe?7Aa zXeeln$%dAGSnt>}J>p;*QzC0M57rs0cEa+t4fiTZYQ^OA$gV({OpiJ$O+D7sZ z|Kl7+bz0gZw3>j{oET!p&J2qy`3`M!aL6i5?)8!S7$XmY&!ayx+?VM0{&UzPfX|eb zi5%^m^%;0YKzj+hf~RBPN|%2hIFgZU zZVh~y2P;YqTJTx8=n>;uNX+=~86Wh?~mH|T3tfA$|T zR-SHFiwqR2o)UE|2CR(dH^ySiIS9PT=-gS?c!!d0>rR@?*_n$SS_2#?LmX1AG3TJD z?GC+3#njljp8$Ril1Bm3MC1J36S*xRnk8yJ&ayKumh&h$De~McrZ~RTgDG0Exx-|N z?Di!DZ^I&4fL=s+W%^=K&ZfM3f44w6ut0n%VuR2>D6(g1Iw|j0X%r>GVfl_PMF$`9 z%AyKosqj{?AN)hpk_8u3Ya}%W13p#U?|Hs8 z_;OjjCtFnRXLRz~&P1e>_p14ZD3QFbGcimg>kOaz<82Z8_}J}X`uOu6^k4=l@Vdn+ z0cP8VUXLeoG?qI7g?t8!M@XsnX+!j!0OizDCu*=?8(E_4_MC)e_2*Wrp^8S4f{F@(bT0D%n!Vz&N6 zAZC^EFZ=^(+GC8`ze$w}b#l1fz^LElg*rK`>IJtIA~{?q2HF!Gf69agEV{9<8@(@@ zh7>=L$MI!eJW=u)C&90e(;LWOU3jj=n}Mu(&*kKAdVbSqZr7W>2AcjFn!c|1pB(xMSK1619WRzo0)Ab z2L=THnT!7{#(!7@fA$^E$A*bx(chFO^t?YTX@Y9}^jyT1?C&KogmW;2f77CevtK;J zJkP=@5#{_;sm;jT1SEf#FCPfaB)-x>`2u}O=heq)n7@EN&U+8PBa$mgMVYhC;`MkX zM{~2FIrNV$bEIf#^9-W-W(|32%ln{d!k2s{()#Cj`AIMjf3tCyW^R)aJme9&q)P}aWSFKF$eB~@Uy8Z;mf~OhE4AnjSdsxh;V*s|fDpKiW z==QqqRXrDQST6b_=&4GsV--B9K=xE|85AH`{f#k^jC0TmxB&CJN$m^yvd0M${YLA% z1~^a6f2@1~U-~cN!&aDcG@E=9!`|?fli(oI7I^PQtDX$>&KrYHK6Bl9xp0O8y0Mmi z=jn?hQM1V0DBo;E+aiqqgMoh*&V!vI*5;?8DWh*q`Z)jpA@9rMn<(@DlQeD9a!k0S zo>Z+;1$HZ-wgfdp6PQ4%brHb@6h$ivuB=R;e^}H)5@$7mfrb&KA&f1GU=hfy1(BaKVD2T^E@-pJoB8N^Zjv_m7F7lN-{$w z*>E~IRFb3J=p1@T5o3&uo92;r6v0|6j>7j35pSVap!EQ3oqKry_o+g~53p9%aw{z^ zf9{QjG7Ehr^1Sdt0>y34WmR8|u1V7v_ATZ^L3odht}CTNw@f9SL|=TH$FV_t+T++E zJ`NAxWr3$#r;1CsRWNpMwV?YlBsUbfxzVjfe5@K1id@`ixybD}EG|?oy$4zvKJ*Nt zW8hOeeyH+|(Z>g91ldpK@@uiTyx~&(e?fz;F}vnXDB|wz@!BQbOnQ8vpSXK5-l>zD zQ1KJ@5MDa%?A&R`i%j(*6EAYq3uxPjQ*dnYRiL>~dc7TnC!G1}jgqy57%l!hM0)UL z5z5{gtdV@%DwL0N82TgC)~m0Pt>{s*FCZWSt&Bv-lBedN(u^qmVt;|!H(oS_koyG$fENAswiv1lKa44uKq(7+co zX=XZg!Wl)}u;f^gr1VG%k zbUX6-^MPc3FXrQ0z4UAvo?46CA&!~&bxBOiXHU}COw&y$vXAZrs#biPgnx7fw5=#d zUxgoEKl$K9yd9@;^k4LShoWgziSekhc7=LsLS21K8B9AD9;~Cq{-}lvf4y5wMk~re z@)HyFTHHU0$V;TfpUq{k^4_-&5hZ|KZgsl?=$6m2}kt@%ER&-UC=wV^dSHiAl!Lg4Ew5kv} z6e$3R5k!5GFE4?~5Vqbze_zJ@uF=byvy(tCkX1v{Js^3GadsqTLaI|daL^RzAjI72 zaou(@ng`CN9pid=p_ec;Jb@$Qrx8H~7sW21mKI=2DW$92lE#J;IlK`+OAR;8A|o6jogSGGf7S@$b8Zm^Z4smj zf879K5M1{i2aO}1soI-%+t|9NA{g1&Fb`)(6>uzL!`3m(KC#o5RbGdJ;hs^Le~|LO zWBFtc`L@m*Z#1z!v{N5)p04|l*)#q^PX@0@_!zQ>gzw?h@6n#$r`tm&6>)oj9idOM zN592SdKAj%0=b0qf1Bsv0>7i}1m5#KehlKpVt$66-?P*FhBht#$2KkBXm5{76fu<| z-Dg+H^Ka1S#?2FSrJ7OKIYE^bWDt87flqhv_POKbYvNC4O;BeQ^ZJA}U}_amKeJ8J zoY_zzwzPRQtyV4P0LLk= zcA4@CisLOlB8?l4cljHwK4L>&NMmx5IY>yA6sC#kr6nUxKICR+14~>*cKLqA!UfQM z6RE|ZK)W=oH~;QVQov1Ipqy+m@^gKEhCQK1nw*2qr6?MduNhB@&1`4}C5OHpYTmvT z{MVSdK&(wIfA(RuSVA9%&4hCurS#$pU^aZF(&ekV!Np{D1Lgkl0^IEhs~CRxcDREo zgeP_qDm|f-xZr4-pFGf5LTG+pXW4up66R-y<^z#1e{g7i4hzD|{2dtU5x(4XVRNhq zwMz&~x7tJo6*ZjyM&jI;U3)CXL6PHZ{;zH5TNI^mf9rV{iMiGJeUmWQot3r{b5STi zgZK>0K~RinJ1%qNMu_I~0w zQ*cokZ{rc6#@{fH;f)sg<$SWgFA7$OoWCTyo0wdmWD%{K@&}vou|_sJt`w%{1J~Ex z3BRzKfA%eN=B^uBItHleks3kODLDlVo{uP3`F-)5$k>-#l_vMO4OIlbO!_GNHvO~U zPBT$w1lCEkDm{g5hfjWXD?RyLbOVD5Eed(Fa(Rr{w}6GL&q0NMZmggEU^=3HrQ=SV zqb#JsG0vte!DS{qibznUze;az%0GvQY^A!be?5L2kkUN1naSVa^PN%6=OmNR!wCiO zHgys3Hx&EMz%5ytuQYCap?aR_b|3c(?$d`$s(BJe1U3Ah*730E0^jyJ?-!c{h$ z55^LdO1N|US5{Ls9RCByU2wE~X*Df`->cww2aYBddZ*UR59V$ScvLao0s#s&K$eq{~y+L_$q zW>QTst;=CJr}mjWxr*scP<77v(VC0dXyf&Lm8!J4f?M<+eg89I(oK;n)?>zk|`JEK99M7 z?5XBHLbR^V>v~bgNiuJnanerK+5rA&R9Fk;dy2oNI63>=ZF3* zXCU+%ISJGh@q=oBnNH)D^g=k#f1av&UByJl^CV}t(+HYZ;qcSy? z;mX&M+*M;M%ZoWY?v zIT|Q9?s;CR0=74Q;|$*=MgC$7GFld~hX>&;s-4-me!%(=vEl_T4xW(HR^_i)f2fCbxDQ=&Qt-9u+G{a=C>NZ?R&mNp)ADdx$Apyl&B`Pw zE|Xh=NN2)Yvwab*ZUXo67S5lo?gRbs-7j&-;{RiS*9?Z2M+Qx;D4`tc36AE zg~`OVD>oy$Y(t9ZA}!(?8eKhZI;%M*1r|oWvzmakh}97Z_)UM@DP*&FjX(j%!VCyl z+R6&L=?E?Ae7Mlg5>STCtZZMud6uN+Q%$hIKaL;?yu<-3a+RdR+!r9AJU*EU#v zJ@k9d8%RkuL(=qYQaX_!LVqO%)SM@vK%z;nMsRFQ9yH!2>}q1U51m1kG*qd87|{q^ z!>2HfjFM+kmvt!p(f6Q_?9eiQf#V>YzYM=OsmBFy+zQ8>?+pI8iT;rj(AwrT)x-j3 zKm!6neI{SbARwm+VW^!n&Pl4zf|xhtPTl0b(+t1;U1jcpa9jh&7=JjfBWK210%1%Z z|Bs#w%jk*_nwVUJ5zu}wgb*3oeJ2$36`~|VA>Rw(g8uM(!o{uJ3BQ~RgGjg!%ZrIO zF6fWTNBZ5ZEErm^y|Gy719zIlNz{S^p<**Mp@~;Y1IAzc9d%MoKk5;SZ&(o@%3E$m z#-D{(m~4z*HML6q(|;J9p&2ibu;ODHROi9pBwr7BIvT+USGhFTpxeLjK+;=$Szh$j zb}=4Q(T@-8q`eZM^1A7Ks2?5UI~f{Pqqh`ov&U(UG-h_voE`w!THn|)si z(ipqoNELeujxjdzY?zg8LI{%3^`7;%7H0yU_tize(}>9_S$~s|m_(kwP>ry9L)N5N zzsdtdO}>JdwT02Y#_c8Th!*AGZ6XJ&CX;QBvZE;uGt=oRz6?XnC(WP1G>6&PG{Vq1 zDo9&+!grI0ead(_53Cg^rmDB$P4~i7{{}(WLJS_tEghH7O`|4p=iaFXRq?K9i>drc zzdxMO&9sKGC4a!=N}5W%Folc_pzTIc+i}5SG**{(@czwYv*Y62JGj7^c)!1S5EtN5 zbVC=UbjUCqZFi8+Sg#uB#j`s>#kI)nsRiYO*s;HQBjcHQAY=nt$xfQcZSdt0p@lne4c-ihp3g z3shsBQq@@J#71VTa{-Xy-szvf;=$s>FdKf)iDNuj_j{$i&>BEIqUFJyyU|MLha5E6 zIhR|t)ejx$pJ|Dcjx*qVEtY~7JG+_14lixsrGI&(ExOIlPX?Qvod%m7SGO&4ek%2B zv>Zk{=YNM42nn1o?t3h5kMjdd`-)q1e}X;E7gpV41g>r-qA!j0{i1DFqfO4JIH?JF zYptsF73EzVCp01NReDa#OIK}nh67z|CEJ!9NWHaq*`HalNf4K_QKahsig zTMaflug7h6KCv2Xb{>n{?7Uz#*zDXNx7m5yYJafVxh-z9^M=)6vokhsvvaG}V6!tc zZnN`eO!sCjFk0pGX=BzgyA&(&mbkiHXA@#ID7mAkm@04^Ej+L&6^HX@toJg~Vuivbc zBY*MdsF=4by3p&mmkfi(WVp&QvFx6^DHPtz_(Cp7urD8IfFoYVPu$`XW?`zw(LkdZ zdG9VvtWxg6ZpS&$kLG{_2fmU+Ow{Wb%wW}4<{`l?4jZNdes=KCYNQ%C_eM!po%+ThL z8Jad&TP^Aso)RCm$1R3Y>x${4_6Lh$)DDj6qxN%)Vbu1G>7#as#V~4H;-fZVF^t-8 z;-mImi(%Ami;vpBTMVOiMSRr0Xfcf1XXB&xL5pG32I8akeoVhX9krEg)ZRg(c7N-j zEfl?3kYLyPSk8mBQn?pL3IQp?zf!N`2)DSnRSnjphyQ|6vv;TQKIOJnW`+Ech1q2t zXw-tZ;AT3UZKk&yL^H!<{e1g0(F~+1L3jf88|9ToR?DY-syxx8 zT9O?CHd8;lRewL5*wmh{BP1O4EA~Uh*P`n_71u8-&HM(s_9^s|5KXP@b3JN2`T`q>Bi**p5#EBe`U z3GIQ1GuV+kl#qH>qde52b*_({AtQUYcDhBmMLXT9+`vv3D!7a*qxB+2>VIcL^|NgK z>^%LfuYQ)UpPBTt`eyCyAe`}11sg^F0~T#0ack>Lb1rma+rPrvKEC$IzU^#@Nr8tw z)tfL;IgI`0W_E;a^~jHWqeiLQOpv0;pHQs2-S`SM^zW?in`26^W`oT&(ree-G@CtC zaS4vfc|iU45~Q&}GLE&0XMgENC}ZuzHfw$lMVzamYS?Cjk+mMTMnzskjNn(EL2-aP zQs%BLbIWD!BV}#|k$C?DMil-~!EzwrR}%=R5K8CYF#`?1oNx?ZGclY5)Z|XR8I`)E z?G2m@V@dN{}Gc6*}?&o>Jqb+XfTOnj| z<=&d@OO}_u7N=g9b&FH4;*~_XW^|xj-6?3O7PmF$0&bmbbuh9Ob!QrB`oP z>D3u3y*f*!S7)pAs;JVd#YC?H-5MuWeWPg`K9iY`d&#_8--_Q#PS}bcO^$EH0d&vC zjTo2;T)Gm-U83ZP+?~eAUDCf9Xx>?!(7g8X*^I z+j!{{B7Of|Ak{I_m*`$kn71(6R|utaYl@Z?Aux`=TqSYudn8WwK5W%prT4PEUX`-K z7GIJ;`c6zBeeX&jeH{s;@5BVscR&K^>rNnjlVWU1-b>`lMkDnrx9Rl7Dwdv0>9uP5 zNN&+VZc?&TJ}#L^2Xy-ZENfm<|_rB9;t*=qU}_Wc9=!>=CSk{lf+@h-(^;>MDe$#a77bT*4pciyl0rIz&$ljD9 z1Z2gS%69n=SL(8XD|2x@c~&=H7yk%*K7O#W2qHH0$H+C$nLk zeblUvv;AhnID4g8A7@o&!#I1SSs!O_m<{7>Ub8;V9yc4t*)7fbI74_4pjV5H^s2L2 zBWZ>-C(@^N+~R#5=~L*n7sjNU;uL5Oqd?!Jwtw@6AEsa2>T+WJ4(&`QOXqKh#$s8@ zaw0=hxK$ZUnvdCJ`N|amG%M0tFH=Xpl1}cID`rWL?`9-|P%?z-9 zw|w^(2#|KIjm+Cy$%iCG2$_{*NSB74jDMb-b0QXtzMC+Tn0?D&ce=?_y@3eO+07XL zWoSJ9%dpmX$uC1@^zYj`i8q4!;~8GW`Env$-i!jthO*VO&{jj9Wm09U7ZkZey)@nK z#qpPP8>X9-kSH~iM5*cVo0%N7K)-gEX=k0_)ap>`dsT!IyplNWin?TcI{09s*?SFwu1pgJ- z3It?9Sj@7)6m$=bctgIu9;u$?#UPI_uda4)!`-reZ?(G?w?_hwsCMtgEzy1U?vT5N z_kW%80TP?8q*{I*IU@SE#$4gq1DT|ih_tYP&?%pysHq8P+$V{~)xbE;X1GS2|6T)e zI}6`0Rq>8WZt-X2$U4>Om4EIibd^6a$rZY18yb~EeX07L;bmQ|q7H94iV;Z&>IWK@ z8o=YI_g!4%sPdgpDzKe=Y`gq&{5HrD6?_HUuj0S3&!W%aKV$@H)qQqC%({*sRuVqr zT5J3>##!~xSn?!Ox_KN&#pJRSA+`zYcj-~Gb5c7#`VR&pa~HD#_qcgzc8eqZ%E&m zfaaEJ$a%x?#NoDh`s0T5J$m|m55@6eD&nbkX?MOAPn*E-VSr4Fr|}v-47bQ1PaUM; z!*Gl4iKq56;KLL-+aqaYY_m(<=D+Ve1VN-secXv!*g$McO~tjJD;)P zBXCn|D%>=v9s`!~Au$W_V5+-9^g;|F|3x+pYv?v2LMLqF7G1*9_Hc`?Wogi_nKrel z9V`i`!7L3tFgs2l!7z?o*Mx2`z#+ZX zoX8>Zo0b2CB<9mJm_{+}GV-2-=$nnCCdxm3H}b2@xaP|r9n?$p!cL@^wUW!4I+Pq> zHN)b{4#t;89)VAhHjI9YQq>0Zi*QK}UYvrM@8rwF)=3TwC3r(`6)cm##-jmiClR zHVTq2@qZr@5a`+>0zA066y}#!{B0yAS2vFfwBo-_(u$wgKe0~`Yk$$0WL!%gs2xJz zOzV~epH)6}gCP0#;u=P47cOMJB>u!ccVIske7c!P4q3jOoME}(o+K66PdSbwNJq3o zHCY_dE?x8ShXH*YF$r}H-j`#+w#xRbSAm3qTF>x7E152Q3<;?C@4y0D{JoU2p5sQ9Nu(j3n zJzRVW+yiX*%E}Xj(pJZKr9JX>hpZ-LU<14J)9>P|@Utg0+_$ub#77piz$3>`#D4+u zIRA*Bslq^)E0=1g8WPI^D&^AS@duB`A7rOPa5Yp?k822Y zK6t%`?Z_>91V49Kld)VThoKsM(xex>rAaUNBki<8S<$3d?ltYSN_n20LIKOP#7ZU9 z#9HdjZ{sb6D#lLyZky0DugUC7mVXEACohIfdF~Oke*$j)Y_zuXoiFV{tGMGeF{48) zORTyf*%VcVMxx*9JgZmw+!LCdK~ZGFv51Rj$&xv~n)@)T&i+$mXwq8ln8I&*Is>AOadu2T)b#>_x<7=N(*=gR+c zzAlO=y`VK#Ud4i!_%}GAhOVqh@0mjus^9m^&C!2v>k8xV_M*-){={*JcW?*8>-*|R z0$v}+AZB}Z(L1qNB3|Ey!JXjs$v@TqP6GE1RR+Y2k)$9S)j2?j2 z{R&!le-~|QyW=F<)_*vmZTqg*+BSW8`?j4isI#_xY=B;?d6}$jcfK8O+d1*Mbw&5$#&8x4DN!Jd(#=+#E&hgIi>D-za~`+y>v&Kl1VZ`HO48szXY@Zf6{PH9XbDJ_MtC*}=X1tC1q>BTRtDUfO? zxXwe?V7-_}0d}}mJAaD&2e=}CMNY+!)*^pn-dsEIS{w8TJKV~eB0iKR_$_UMln!kf zUFRKCu^IvNJi8ja;qJNU4&)BunBwbGO1a=x=CjZ);E=R{Kr|@o5I?1g!ZJm%?P`SZ z<#|6gv9L^=RUfE?uuSvyuuM0q%;#P2H?z1r0N>3`}i%`xRKsKuIonQ{+OaA-7B-Z^fWZ z1K-20k(B~69J<%0+(2PvIxVFKxAL+NDV);#NPckZ)qg9bJwLQ{{&qpSOj*({oYNa! zg>(AbWD4hWekUQ`ZZX7SYOZN+AB*W_s{SJse5pdQD0^EIuM6SvV||iMufS2;E7^2W z-^4>pd(F;%6KwIF{xu>L1XJ!aUw^N}XCOGQ5V}5tm+YbI2P?a17V&mcKnY}DOfjO- zi4EP;@PDdMe!q8X%>Th`RuJ41E=24DbXl|e9t`d-_7wT^vV8gerrRI5T9WE|z;aay zl>E36j$KUg#a&wg)I-RRS;F*67%1>ED{O0htEBwl6npxw7+zxx0y1cAnh@TX;ZdL) z3eXst7$2z_4Z6?3($EV~3T!PywXiKTZZIhvoPU$6PP!d(PO=@|>h<4mhrjecrFJ;0 zs>^oBNo)s39fE%XIy$sh{tqKVh;B9Io zX0-}WRZ&jVfcXg!=0^zTyWfoJ4X$d=8>S-_&70s;ERIv7dA_Ouzy4s8tAqV)vMZhH82`RI?Xf-c>D;Li9o{pMy4IwUjMN zNjqO-X8W%KP$6oJtNfVc87|*243;VA-9p5Jfi+g}D`qb6G6`4}v-qHZ5wva+{C|yB zarj9O)q5j2PLvC%AxeP$+FGAV6RuE9l}7_F9lcGy1y;=H)`qQ@d z^Vs5>>0iU9+HI#bbH7+mGj|}YQJxXF81bt~r^=S33ZPGENowm2pKhVmB!9PRTc_hk z14k+Jd$NH!IV#_%I{dFwA*x3+QC;9|w5b@K!+(gXywi4{Yk(x2Pd7!;@#$tKf`>7mN7eTc>bu)QID2OgjbLo% z!nmEgYU2+5;gxQ-dBbx@xViObASSJJp7dajtlZEHoJ~Z2hkk41&*0Z1^+zm_Qi9V! zD1qQ^G}|M}J%p%voa+;G7k8lrB&uUGv4q1*+G6#ivol$=G@e_P0)LG$ric%2^j(DM zz5!YYI#jM~l@FI<81`%7bH-=LkKI6a2F`Nx$RWNS{%fV1-zubfnqjJ3(RJ6!gCJKbV8qaWr>~uPrvdwxkfg z8rnoDAZz>wN8HH;27kiC%2=XuqRL!C)fhk#C_BfqmyQ;#o^68d!U_xDt|CW`7d?;m za?2{Yzy>DLu4O3D{A#j{=HG%giSXf3Z#lVT)p#D}KjgV(Rci8w@F<>g%OWr(oPn6w zgCEh%f=$BcAL0(|_nipr_W7W{56f?{w%+0@-zy`$B<7w4Ie(wH#`v;S{Z$NL@gJ@ zs6TF?KHz%=si*uM`W#9Unm(yPWRYnz!3NG?nPPeuXI5Z(}NwO;A`b zOZ5G1oz;6+LcPbHbiEI+(d*rg_93bx`t7L^FvzpW4}V<@HGk7Uz(n8cyw1KeJ9{Uq z%;_xM7tqH<*Plk6w_XHw4jSs505{ihKHg+Qq2bZ^j9Vw3AsN1kbJGA-=9zsbsnJ!YPBZ}uidTyW}g>|C%Z zIs~4-gnypD5Xdi^N3vi9MNe2Tt5Fnd_*jJ(102KcduS%|QbmVA6CM2;HB3AtZRTIf zNE>GYX;ZF|HUg107b9uI1$%WMRh(S#cV@%{2J$s}Rr|caIhYrPR*s(EArEn!WrTA8 zO5`|6#(lqM*tG(KzJu?WM6h;M?Vk1Rl;`{?iJoyZfZpWwW*}Cu6mHY3s7UePr{5(mT+BUGFI;zc!Cw z(dnMznU0?g8_Kt*R&g&-o6&dliciOSM_2!bd&$f1{q}pwQ>k6;MHl%Hkcg#j~r?74k5CGggCOI#QMA z#Mg+GiJWIeoy8Tl+Kb#tz+4W(m%^Lhz}*HTqiQ$`=XB-`tsAM^Ezunomc(W){$<@I~^Ombb9NE z)oNTvBpMiNI?AJ5>QoH0pNgGLzzmc}^?`YZ)33waTa9yqJM|gHzhws zZ%W~%PqEII{|xj)ZD^t@OEJVW@@n92{4G^5ln-Ed^j%GYqt>^J@E-e)M~p`eyb`)_ ztOs7Hfmfy{fLB&B@JgsuEdfc6Kp;t~6cws0h!JpQKGq#>QRtR`vs(ze@*i3&e5kg9 z3SD_JtM)WN5^>KwPMXu0T zYiN|67P6elRkULK?l4XjU-YD@SE!Q3T?2xi+fzKs&T8Xhk2P+5W3z8E1O+@v_DQvUaAyp@Hz7? zIlAHGWOfPuOa2~<*`^Sx~$!2iSy+%fFx0}2nskc zYli$DW~C9JuqOZLp~^qFz;z7p)hGjD5dqp2Gg`JEjKv5*RFlFe7zj+RI0s691J9E1 z?4?en9k2F)*@n|sJ|haHENDxl*9cF+J#4o(RJhtzR)1InM;#n897hl!oPfe%a~S8! z>$hf7Pm`}VXHS0Cp<+A!#69G~=4JrmDvl#5wsB+)(O?y%z4F3yT4Nfh0!)Btq%-}i zbHaFZ5fj31X1xfFEi61ZttT0M^|?kh`U*NxwJimg_dwIHBLv-kpa5MGanKZy6Bt^P z>_->|sDG}h0E6_b%R<{$7}y?kku4~jl64*7q2mb8#R2c+{olc`C3JPf&p(dAWN;wC zcT8gXdi*T7b2ijrIr?Kwj6gM3_h4T=18x?vpyJTf(z2;#MWLzXp{Y-oO?|eAdnou~ z5{r%jw7NHITIe}4_Xs@~q2zE4UR4KkpeQt{p???<-sufc58wTQ6h;tq`NCJwU$Gkf z&hewr=e&?wCQR)yY@7U&H3iMru)WYVW%AT2ibwSmboa3RIKZiMv_NE2&{+-22YoWHO?KkVXr82; zp)ZRkY41issIIpO3oE9f5ll)c5dr}WBtPtskT(<@hc>0HaVY} zLw-CV%PrM6!BE>nGX-ba%q*DN zcHlly&%&a9*o#8rMi6v1?(BIpGr5Nk5DK-DSwt4igq0W`Rp+mJ2q8pW2L{`L=dQr` zqTI^-EFr1Je*kj=-a5!BgA`adpRlk9%y`F08|TN-D%Aj4c$1`l2N3)SWbOZe_J0#D zfZc@)C%0-m5N*;lE88!GJl-ze5zEgMVh9xDXX!Rri?j>B$)X?_T5PkwF@;;aoyGiN zmb<@TV~4f8g^_i^rx0^?i!=AG3~>~^O4-xKguI=uy6DCnUzp|pd9gVbT`J{gMwbrT zto$3Pll)8?QGZbZuF)4-b%bVyG=JW#?C5HYv=l@@?L6u@rAfs~FH!3>9(9Jp@H?hg z@Y2J9gCmkno}_KD1JJM8(382a>ELTZGl#>KSGkb<-|~U>rnHQ|xV+ouk-T z(MA4}5toXyfn>>%-CwrEqEDmNOuP~PUMP-14<0d>c^>R(h3#NmwpH2DYJYfg20S@f z?gmd1mOEDVMwrVa5{J9Z%8Tr=OywzdVo{dDi5%?1_S7Qv3$Icb@r)r1^JeC7;Tf&i zX!JG86ntXNaVtGBTz#UO`ouMmDdi8w$vj-G;)%VX{K3k_80_%T-FeBTLvW0OrZT}{ zgX52Iyp`A9CaiRR78*i{Hh;}P2qveUp|D>hMx_w;NN}?cW`LYSs0WMx7u5-VqT4ih zQh3bYXz{JXDTNF0BxWl`_EW0C6zwvTDP&cGM{?yu(SH_P3zuF-9f*h$ z{@g4scmZ}HtDvv15SEZi#CS;4(x7zDU(?i2C&x4j2wLa&w3* zzKkYUL^GE2S+Ew29GNQSo-}3XdXA_Xi%w=TbB`k$z4<-RoA@$scws560+Gv*Y6SMa zqQFrB44#A*;u#3|i+}NOx(R+h!{+fvGNN@DQ}77>iTayh6+(~NXkB|e^5pz0)%_gy z8*UXpg5Z4Tuz1w|hP$}HevJ8wsN`32i*dU|O_mq-W7z3dwI-Vw9T7bA;21%AoUK~G z%I1xNm42y(t?0O@jY?S5@(hcbG%nNM7!z%LY=g`3?SeIk9)HaOtT7Nn3@9~Yxmkbd zDE*~m`;n|pI_g>0cxh@EiGO&8s!A2fEfhkH7jeHTRI5e?+h1b zV&ENDeFcov|0RgE@go=(hKhi}1wtq^8yX3Z`iQQBLK03B=Ae#_x52B`h3yLXm1Yj+ z2OUDxZiJ2*G=EbN!gDe)7{;Xfitb!6!-5@4E#a276-Y;*84Fy}_)L#v(>4XBPUOR* zSUd7|kEFICo<8*~{fOj0=yv#w%6JzW+%B;(snhFax)m;x!k;+f!V*(=u2X z39kbvH!e66aYfBnf0Riv{%)~L`Pr}9xFE*hbLCF=0(p%-z*0VZy}I9xcY1-bFaB$D z40<19hZUlzZW4v!LKJaqE!e8dj-Vw~em1ZQ-=SOBljv`jduxVx7ayy1g~n$p7@woQ z!pQ}bpnnea6)?C_huoja7tf%0jld+HoK~0#vT@ zuJ(cfF7xjcl!)ajycFy_SLjSUquxv5DQMzuB&jMLpMP-S8r-En@`m5Two*p4sa3j?k40Re zl<0Q#-C@XZ26l3RKedv_tAa>^tA`L41B_)?c*eiT0GlT&A-X{b_uI3+DJDD(B#cEE zm28q8UX(Ek?XtJPW(zHF;1HC$yoExp!sR|2GBPc+W!Xu|JRG6L-=)|bXi2RETG+PL z{eQ6}lQK`ec)MS!iID$r6l7u~#&i?6R!$A&XDfS5>BMbTXQVRZztw}Z>MA#qSVMUa zJ^x0Brp$5{`I{zjfp_7N)x|`pHSuVem~K+=k1KDwz%69}ekC?n?w#3O@EIz8r(8R^ zE%vDLFkBTqdJUg!Du(0uRmrBi;5P_Io_{mh^cws=2FGMLu7YbX{N4@sn7WzqE4#)2 zS@2I%H!Hh>{A4{pCDn#MY2CV|cZ{=Gq{mrA85|>wGc-A$i(8eBVmlPyA+E<4EL;i? z3@32QkDzpnf*HAX!dOXDQ&_YTCuCIT3(We*wNnUHAl-%L6>lQT$eCT_0PDf zj!`pzKM7sJ7Z$dR|C5|pm_Fg9PYwEnZ*t=LgngPMea)%s6FQfqiGv@XW6&82&&mqDGk_8V$-8aVR=p zUI>)7cpfbKJ;V(E0c(-}hv}Yk}mw%G|^C{>i zK76dBZo(+PJ+m_%>*=@iwU3>G@K)E+BCv5>cuP83Wp1oXne&;Q*_WJtouB#3>C{LTLCxk5H~9v@^(-Ii%Iv_u%o1;<(G}u{Yu|CQb^r2F zs{0mN0k-{SASg(Ci0q| zE4MQ}*Q+hK!JwY2x2oqdXvj!o7X48O_qeOpph(lSlfUE>;k0z-6Mr#U7p|Xg)`aU1 zcMz@@a={kj3VX+c7@ZWETf%;NMq4iJoO);gYgDkvI>?>P80fG?&naPU~ z4FDNtdE~#~EUA;*FMpEf!{Alqw$4gA11a6@C>bwCW5Fss!!Q8K8qKlrW24A@6Y8G^ zex>Yf>s*{)*Va*-zb(Fp#Qk<$r{K5aJ_)}a{x|pAIaz!8TKZS)6CI zmA{*8dZk!zxek7SXLa-gj0?nm%@y!(pS5)53drn$g1d{o%K*D1@gaY;>1c#4I@_UkYi)S zN^~VO z7jS`O$k2HM6hSFJ9ZWNIh|jz5AhS43&N)X{iGLNUDlw!9o&JV7VwR=~!;nZ!6;_B^ zsW-n)Mxzfbfhne20fv5WUzy3sM)UYq)hj)L#VWw zhWa?Sv>k=xUd+rPRG|H&lo~gJ0VbnEC?AAb`42NwO7S1jbr8|D+IOuia? z27dvDN(S?T8d3jMJg7uKZPbkV%I;k7J{By}<_*uWp#sSx{pgk2+|swf*n=az;WwD- zW-l*&?3K29rA;1byWH=eKpbBkW4DSu`Pc^j15yJyzF+Vuh1kYWE0UXp%>vHq990Qa zfOxdH%l~a{OH9=mq1{+%iPywXW7%VLGk+?N@BwMOlRb0~JmfFQG@xgy z+vsu}e&CmQLb#+h*1u_6fmAJ<;A!4}O^gft9`!=8O@A)O z2`+pgYGHQqfseVs^=(XJI< z_7L(WWZAE1Rh2nns;bDL@r{i7*?;PN=OHeBPxWHRk1)f`t(_~5X5;(5QFTRQeuRrX zEu{Flu9Xx&H+Y32f8!)BaEFqnDSjGxE^s4UD)2L761P&gKci^}Mj%9GT;TQ^sZ_>%@eUiJ-`+unMa8bnr ztA#4XQmIN$4)1S->RMdV^}~UxtU*B*5YewYpeBHxLtzLdPWKT@T;h${UA$3}ew zXtp;gK*44Yf?EwB;uOiY;D2T>=dJ;w&9h4>aO^7JMr|1v?k+qkI4Xc-^XHn7WQzdF z<{1QZU4sXbyM^)vEpDv`!wXoQomQn=Ke4um|GYw*i6Y2{a#t4CPZ4yF2p^Q^ewemBL zadw#UJG|03n^)@N=GLD_ScS9Y<-HKGLY9l^w^n|UewV6BPcDc?`nZS*D3h73S?vQ6 z>J6dBQu@?IW(raSmquo&Cco)wLrZ~7F4z-+ym|lCcQT88JbxYImG*FfXK5qg$b7#$ zEO%(W4;*Dz*82y^gnCO%h*g%3>}B$uAjAF8c)=r0&R%ZzNHcTLdjDp!+@H@Z_vfSK z{s(9q#~Up7Uni3_egqkkkjegq6-JBw{2XOT8yPxeVnu@!NeDE@M%vr%sJ(3)*%tGL zVe^y5Ifd|z8GrI~_U4%Kd%ACjJPj^f;ZhtuE-dV3+TD&~?M}z)+H0Vz@atG@AHt|>OKUJ7RU-o(iaX62`tX-D~akvdFBrj36 zlX+2+_;C#QyvwhCUWNW!O8fqpM2p0Sbm+fVRrdW)cYmnRe^2Sqf2ehi_1k_sgZ>jP zBIv&hD6!#o2L0F9LePK1Rp`HYI`rQQw-fYVZf_O(uRvN>-wyiEY3T_4S91qK|4qLn zn#8TT1U^peDFhGAPZLgj!SL@i_(rrW)!`ct8Q~irVepM@Hs2p< z;p>3v>3^k(qsO2)np>JjRzc1fAqZ|P^4Fynp-{2nP*M?(0%miYAem9Tyq!uOe6l4! zcu~hvI~KYdzGIItsFo)TND6!&v5X4!O%+0B1b`IJ!q`~|7%18qSfH7}0!PKHsU2Y< zRcqB-su--HS89mE8hRZK+>$|1>1)FyKkNe55P#LoI;`Pe+Ze3jmb2ophB0Pbedm0b zHS=kaJ;VjBLQVh`3{sEh?Fcg%xebTG5#<08GV^STO!$So^zhuDYNE23(zyd-*by{+>~2r#k4 zPJeI-7q`Z738xo#z$N^eR)!_I4uXX*i(hYt>&n}cO*7!wdTX-j(CvwbmiDmv+bNzK z##fJ<#K6YGtYSR+cH!byrAgz5!$3syUc~0On%HGxbAdr8ei%q2CbR?ci1*8J`pAX0 zc+Z*Q1d^`=SEZb;>|x%#@}%rx{x=`DCVwa=7@2QHqZnuxwogUkHaOL|kF!zjRIPBR zRP9c@1;}_?v{K#NZ;o|t&#>Fqx1*jt`rv7ai=y`tTb_SvB3A?sjdBSp_C$&6Y3SIw z#fQF3Go5tBhq8*VJyn~B9p9XyKj!8?|B}ta>H4eA`SWj&7lCrguCRxG(Vw$YHGiwx zr}}fgzLweumSAObqD$xebGr5?jGp5=i#aEzl5?W3yU{VRGY8P6cBB`5XCP%;nVRVQ z8BG$TsKEo&mkigqI1cFA1@vmw1+;gUE}&CVnG0xEDsut#rk<_~=xrmI3#fPrIz{>} zOmv78hZ!6q=OrJ0(p5+(yW2d`5jKAl%_h;YJ)b;xC-@-_e zW}P-hQZ`oiR4|f$%X)u2^RzK+XE&Ziy}Q;6C|`7@7x)jMR;~0o%7BjeWq)F-97D46 zHaQFHJ-K6cP6MRp%kxnWKeA(Xu*Hf{tAA^=c7R&N?A@(a1UT#8YE6Jz9kYUIOC=p@ z)p_brs}JsOiglvNU^uJS<3otEx*%#bof^(+2bG5b%eO*cW~XLISYj6)-T}l79e9)8>bgF|fiVe3*~%A!iPn0|D!VxJt-A0qNd5+WE3xP-hB^08Qe|D6^MWl6Bp?=IGDc+RHva^Gf@KLHjV|s8s10gmEjyY`)w) zYJ|0qn9Pr`_(lnj5FfFSQxI{ zTZZ}^z$z81tWvQaXMbeahb>zCh>Z0uUBwxJ+I!r(Fcz=VD?1bFjgMA&5&-_iv4^0p~Fn{{<(A8`R{>j2W9EP5` zj$(r<7z1f-I_Zmvkww+au-(z4YpH^kVY_JvC>vH-*=-7%Rr!BN5%0&6)PkGLqD>nt z7$f#lu^W}fQpoF=N*Vf7s)=43eN8SumI{MsoE_*d3U_Ozz&AG0HY}n&wv|0q_g$(< zzmUF#BJ3=nFMmtvaU|8$USB>77kV)(Lt|)RWw66sW0Wcbh?gz9YritmLC6}6fRw0&O40QBb!Cz8rl1hrjN%cu)-=Cyv zb^6ajai|#QI>*`MlAzTj)na6}G@R)`FGhEBEAz8aWq<$9F5tsr<80Cv`JDPxQ}j!G zZ_!aWd&YmYS$vra7y$*KM^f-FaCf(cXjqz@8Qd>Qa@yLKSSUk220zOE?d=ERP2uFr z_Y#b#{NmXZr+Bsy1`Yuxat^WBnWVvUm2U<1JJ$uDqCpjq^<6HTzL&vxFI|vTXcEsa zeQ>A=$$#luWCVyNW_GWlHcR0%55oME+s8gGj>kSOR%0Ju41JU#=Uj$^K{ksH`ulqU zE%Ps+c*gw-LcOAA$>*)nCsGo8t{MlKVjoA3W5DESy}PVe^r+DW30hzVZ2Gg|`vhA& zx-K+`S5n;E$^!ygQOJUHOx`ab6aWsBYheTj4}WpNn~8TCZAW=K6K?+`E0E?aZ{TyM zX8UZYY;Cx>E#~A_?kotqGvuvju|T^hxOYn};W3}^{+$+QX>5p_bGN+O$_4%aIVUzA zhMwXAHxiP;w>Z;kVxAMny^ZC<{UTVL&u)H*iK5nNJ4`dF&+NZUNz+dI5T z6@LYep9`cT+*6fa2W*c!xW^*hYAe3B__x?x-I`>9RWSN~c+3kU&zyG$E9tf93TOEq z?5rA_s&VD(t8L;0kMt=I3)Z4$A`pU1cT;WQf=5&?uVD;I?lvJatesU4ZdEt$I` z&7`)ZQU>Q#AQpE4`%E(zTnWh@|BjeqNBz=?FBO|%5@~xVZyyGuBZ4;gLf%a_G=CyW zli$v0jp3ABS;M)umRG1tmxH&>#Sl$L+O10qvg{PtTC-hO*m3E zp#kSh z{j5l5`~8zE^jej?&zkmQSA4&p7tfyZe#ia(*J6IdDsz;OTeb+&K6$i@5$;bD;%I*f z83PoN#JQ$G+EnJABu_d6mmJ@Bo zeZ^N?;591+^QQ9p_+1irC)!};T;?14REe9dmKOOA!s*ItOpp6<+V`X=vG(A z2P>V=NnW>Fr0o%Q92r~X@)k59C@3ti_4q4naKEcOQeNY69OVL|pb~>~@O{5WEep3k z!d}QNZdPrw4#6Ex3~4zPkz=Ik)LOaPn}pc0*IgH zD!=ClS)~RaR&mmvqQcyTWUB5s#s%6;dRS!@-3e1=NL?7iFsj@mF$>y$U|40|(a1e~ zb`pkF-l&IF=H4zip46z_jG+$bw&QRz=olZ$^f^UDSeKcMxhlUHr zrY~*CVg47TN)GI(+>)nIDYbr!U&+BxzGsB3AMvZq;gLM+h6gYG2*YWr1A3uJ8_@oS z^f`m@4M!Wb0lXhCzi!lTZpmM?8cu&y(2;_5^vi0GAw)-ct&Fe(Fw>QrTBzT#tci`(CeR=`T<}H| z-YGoGxk}3^uNj#m9#W1%E8)aE3pIJCgo>r(n9~DsgODvaKN#EoFgEy^noKLF1UXgr5>NS%Qx}mJFt?ScC&uTxg1J!`NzRIlf@sWS%PP&E_p5J6P5mHQ^D{Hox zYV0`po0^g^N0FUg_s}7 z3Lt}wUhiAwq0p_-D6udP!71@T;@QCZ4A*C$fl(w6Xf}C(y|X&i%I$ zcOUx>4RlDnndy-liTp_i<|-%FZ`7D{)1%lv7nvBj!^P93DnqAj>x^y<&&qlYs4T`3 zB>&@xN@cmnP~|>@`T3L}^_I8qL~1DCJ}f4L9(V+fuZltseD9T*0c*&;3XYx5vIi6a z@o|6hal$O&?CvFS=V3vz!TfkZ2o>ysf(Jr&Cepnhg&sHolqEdWjCX_zeh)8O#r1M0 zg&v5(Pak;pN;wxv|J(=O7GcsCJmr50QPW!CbPN)4udGZqA=!(yPoQ}_x3drb*+#Gs zJ&|ObBsY#}K>@%mG}N})No4Q`x`=frckX|Ig8u_DhLh+=ybgr{m+QiSxGWGF|5@@s z^+lpvW#}?#uV4HO{ zNwsn%UM`G8BZt*x@O$vn@7a?E*6(W8PICDvgP57KR; z>{adf7#psy6FXU7r_S$ueHFd9qAq{OwRI?-eFJN&NcOce(R8@$wNyEx?(f4eKsQ^1 z-=J$^ipSZJAr`AA{cfv2lB#HK20s9S_7U2+!p$U>0ft8i z_nSAo8}v($V)&8!{6K>$%M~6I)AFZZPWew?4f#J2ewo;Z4;NeD1F=+uv6X+Sqi()5 z?-Fq&`~^Z5olp33Gg8=d&%u*hf%xl#Cp?^_!%eqv!9rD^Fus|pA6?H&5shIhyrrts zcnQYw_*8NiimRos4R&hc2NtM$gF3X}aS^sNbvc@K9 zOqOp*fwU2OxfqF<8Lb`B0gWVnm3wH!1#ip*&dWE*ivvxiH{&#Ppq~ZZ1#9K~7!n>U z1P{4~#XR9Z+1x|-d!_Ae>3e+s4E{Z{MsMO*z%xh*x&x8*9GVIsk;Z?yju6?aG6y-1 zP4g~?#|j)<#1tCC6?|+17IJeVzN{9@iEdYE))I~Nn;5M|5rvVVn}rWu5`Q!LS!07b zwsV0$Bd+D6IN0W0rm}MI-VurK#pjg<{iX0M77^Xdm>D2SP5R3#@!svtX>E<$+0 zQZK&|e_Cb#N-Qe-x7>fCvVV73RQB(AYE&^R6S==ebpp;I&UT$FwIX~{`!IjjYKk$U{0SEG* zgSNXvSGz;kTAkd=P0DVaEn|pLC8)Zy9yH#acW}jdk$9fI9tw1(*_R5-(L%6`XIw!>~8i=%MX~Pg-5|2F6ZZ7z=TAN-?*v^xIN4f|DH65#uR}Ps=;|$tz z98CmUG!ChN@l1cwGR8-|sAr5-$3`$8nZ0+-F5vd`hObroH)MFxl`););bS_#Go*bg zH4~=t%zI*VyWpy>aXk*a3|%7!+IpKb*KfuVbcNybiY!S6MFGMm}$5 zjdJkkc;(*KpT==<6ZMi|=XniRWa44TN79wMAS;s#;_!cA`JraU`-O1hdC$!3<%#>- zCI^2ut`0vakGE+28?N&S>#2xhD=3=35$HkEzDmhYey2;_7>#wb0QCY*Ug@aHNp1Ey z8fSOm4vS#FXr*+Fv%~I<63-d<{d=jH zKvu4q5RkcEfvgo|=p@3EaIt|dR?v2JjO&F18m@l`P!T@sQF7x{p%7hV>$09vGtgVg zrTU~{`kU(Ya@8WMPQ4FhP%_Rj($XLbat3t~YdJ3PFikf2I+a9LN+@A3`c=f8MJj}( zO2M&L?8AIT#BRE;hz4eWfg3756eE`_~DojGugjf)O!AaPaoIneyAu z>jQS#3;KXntx2Z>*;d~< zR*J?d_Vuwz+A2R)4`*fmYs}(P#D&l62HO=rEY*KH zDmd3sO1uEt!4UM)D1X0kBJ=I{&$pvJC>Ja-t0q3N(EPqdq4^okviWBTq4}Ai`Ppzf zI5a1wTar-+c2$LYN00qK1F`+WM01SSa6CntLf1SgA?~52(h9Ds&s^GO-xo zs7KD@0xv-J;QUt)`>dPt2h*xvs`lzzWYd(NL#9d7^I;X}TQ(|p-H6gLb`t|+)j)s9 z`ycUsfZ!w#&O*7Q3Mo|CD=mMNY#F|4i4{0jR7aNdF>%2bS}ar0QL+$;K|z20N(F%{ z;XBa03946?p8?;BKHSLqCpDt%Ayi^Zc&Ad{Y&KQ%ea$B3|C&&p>U{edlwK4nfxak# zz9`8Il|WyV3=Wm#B;F10Md~8&s)LO^h;N6k@?Fe2WGUnSKm8m##5&twXG1gkR-CG_ zd>b&e4_D%vc>@eNsf^YDbkKhlq#D`Z)D&X~>5>f|{WClot&)Pc2nCbZ*Fkx~V+b$w z!I@|%dPMn_%8YEvKg*0gNqC#s$8_;WMiB!#oloy`Bg?XZ0Kf*~?f!fgn+B!U}KJW6Q4L!&On0*4wC1-z`nB~Mjlkm?p z{4+zm*Nrx8s5%d;HnAbqMpo0O(~gnj4)f{qZkr1AFGvmY6YHRvf-!Lt?tk=zW1LMK zi`|08YvXL_Axp5h603wV8VL`3vTJ`27FPf_9D!ho!aPwX=*Nm*vRR>sK!z@#16@7` zx_nM%XbyDwoWY?vInjUT4f0bIoT?Euva94Zf7MsL=bu3(yOAYFUYzGvn*5Pf{)Wru znyb9w9vOE-*G{iR4EA2ur;<&)v}|GBljxYSEA};{7MeX_r@6FghR;e7;6t!504Y9$ zdm<8xg!t?#!#%SS@0o@E|B)p1CZ~DiFfn`N6+Q=FT5K8aTLgc%CROv<>D2VRtqRTw zPz;KS{)qPs_3cvcNz?8bJZWSmx5R~Qln}0$^XCu{8kH7Z2PY)Udk;>K`;NX2CrC#{ zUxE|#NsT_u4KR&`?_2}Nzu+*#Q3=OIaBPL+PjJ*d0T0`3W*hrwv32~HWV70m)$--nhGKtlpugdEG1uSV^Lg+qtNEN{^~2QeQ$Ik>Oi9dCQfYihSvf{PsV8@cH)MQAssfkMdk7liMX^Ex4 zFw8`=>}sC+L=GAYHED&a&ssYDFl)OKt9fk_RPz}o(Xx67XoLJ-?Y%VpHb0g8dnb6tlky38kUP{`U#pEYC9&Rv3dYbGY= z-m2M!{VP>d-cK@01C7IO$8>5Kb-UH<{gpH|5qp=uK0&iEBb7TOQA~~v=7<6W>l-TD z%&vdZfAd;`DY75d>gUhLn??ilmcZX{;P1}o*?T!W{|kR9FPwcxiq7g|EXi#09q4zx zRrL(w%5N>OS9k`K9@{?A=1C;&RMu5DSVhbjv`JuhN?<%%1C*31>+O-TuT|kXJNUSh)aRIF>j35jTQV z#!wJ2)-^A7<$R8uA>kueQuPVnDmy3PA*9*xGJia)2| z_4+!`WAOchK;i+XZ18I3s}qO~TaL!W9_Ef|s?lp!uph>0xye~}kxQ)>)IBaWtjtEw z5%#@Y0AC{ilt1``vH897N6o^FRRMpcJWuh>CaX6HlkmSdM(1(puC3NJPCzV+TV4^JvRXNWMp*x>Q$zwe)aoz&#PbURki9C$2i3%W?k3r78QTOyWz0! z;2qh(@i=zVXRb?{WQI8(lK;IBj4Ld-FUK1%|4Z#sT@uCA;rxu%PvFY;6Wf?N&3D9x z*Jg*J(o8%pP5i{SC$6Mp1kX87qx$s~)GoDDGvhim!7G~gDNuo$kV>{)C*9%!X(Doj zPHr3Qd-ZOS%5Q&gh#?R+1@7(LZcEr@kGMpcd$uA!$W0zR!!EA6gX2*)wzz`@`61?FE7z=2bTUCb(?X2+~ehrNTV_JHHjHU)LAtDj$ zO^>N}Kk8B^5+^-MH3pA?eK39wtPd@O4qpAJBSS^RD?I{A#%R1cHpPZ_y8U0WAqhdV z(m*tzkeN6pp#j7@`E_Iy(XGRX09+sed(6nI(u#3tu6@$Lp8Q`8z2ptw(&6kf+)U7A4-BQ+Ptt|iO`!?O(76}^7j#QA9F>F??3EnSV!O@X-ilNHL8@<7k z-Qz?8r;)d|Sj*vd`ISrA=}}!Avm0JP7GsNml1QZgIfD~H>= z)FNqVW)TuPJkD`N37vHs6RiW^(K!ax0Hn?-?&5uQNba1Ra~G03bathi5)UR*;!k=~ zyUAotd_P;H_NpaIV#wScB6Fu)WJ*kA4pEFq9a@&^7R5Vg0ZmFLhXw3dlB0bJHYv{U zC9;vJ87zN9p41ln=IDYCl9?(ZFY-rPJ*cQWQ(4ks=2l0@6gLcYJ#MBqAd4z{gH;h= zxkMVjB12aoHOYc+MY_prsm9J!BVk>LG*TyzWGGjOzE@V^dFAzol+$N4dd01NPVZTL zK+^^Vz9+K9Ijclj*>pxH1gl=rV|kJ1W9$SMXvTl>Z;jH{Q`{=%9Cj~XJqcIzBwEpO z<;9p-sm#Sp=*a4ev7TfqszDDppLo(u($Tikrc=wMH!{Exb0WWR4AuzJ=VAi%PCyPp z`KpUXH8@J9FE_fqdPJ0dUCg>B|KrQ(;o)A-ay&Tv8{lK$`^`2Q_-;{AKBAL|Md^5; zJt=>)ntAl-9E2v@$_qWHZWFiaw?uVghK$8`4~i|P%sa!Hzv4^6ePt?AwL$C$06pCR zI&*BbSMK_P6_h)BRF1gd$-*h{J_`k-Ga%nFhyl6H4HAYFO??ds5(1b;EL< zW}|WWBxYPbi5Ztq&F@eZ4BZR^F6lhW)k=SiJRW3Z2{=+DQp9H$F(NgHgsWncMx-vM zy9rDhzNgF}N;d_K%L_!0lAUG!4JjCiQaU3_MaIX)(RzCHXC9yDYfbXnL|2Y-ZNLnC zv~6jgTZ;G1Y*#^aFZtj#6y599qvEt2G$z_iGBWU!Xp%IXdnN=67v3ug5q#|y&#`~} zkbNKLtc`sB0(^>p_x19(M$6mP8~+w%Fk zZFv#emJ0=Uk3kvosp#&pn%TLZ+roUuDq~vSUX2#!uv;7kIr31Scgoi9{24apzQbt7 zY}lB;m#y2F|LdZjHs-cJ^k!pzeYAgH16MN}^FX1A{D!^WH}Uhqf-;HWYB zsC1m~Lg^AsP6q$0Q}xZyo@>&MxX^7A2vbndj-!~%^q6!QHUrTk1WU^N$mkLfvP`G& z9Bi&9m2P_YUe*k*kPwq0i2QKC=->?KAWUGSQJzDIxS(}M61~7z*wF*NtuTKEgzqf~ zUl)V#ACu|OPlxY98^y2E`Q{Yjo1-B9$GYA?yw`7Z@x4GN1xqCU>Z2Etb+jM@_uh*! zXGQvbqQ#j)a9P%LL0VtdMKM?xvyMMir*%9q7nKC_v$HisbO5(_2r*m3Xy(rx$ANE! z{HeQ~@RUlzM5k7&Z*wO1^ODroz$FFlL<=1=$oYn%!BHQI>qA9tXS{`g8Dbp@E10`x-zWQ4p|%7WmwA;^JqCJ#g{ld2oO6+m%LlclvZ( z+_&;);Nk~0ec)m|-qpE6UK_3XcRmA!5Csu^*ka9L82j|a-7vO1{+t+lO6mn;d)Q@W zPRBUFB@72kScg;e4hI&~;aLx$1J6j@ay^6OW&b1skVOO_2P@7y3+RlUmm3B#tjuC) zI9L9OF59DveyHAthsu9YL9#Y4|3l}`L?g1;yc8JoA}!Xij*}SHl~@eB%q)g+qe>01 zUc8b`SdE-jYE0NGJ@g-Efx%kc9SjF)Wj$%q&-Szb(W$b#k2Fq@Ng3l4Qw08fWl-4l*!P)3$_5gfA}(oKf>>VwH-zWV-!kY7vrXui5Q zP6KH?G%Z#~W)%CzU*)-_c=WZNd~PEr@pQ&}k;K2`YaR4RKZ*Ycp9xUvZuD_r>DGLt zf=yi45Q~2)YIhs47zVAn(rsA}(^m9>;ud%K+TvH-%=x!dOib@3Wp1{_fP&SL(<1rh zOG#r|P)QC&O4!YEZ~mHj!AddGbqOD|<%c4l`jiCD|1B$oF%v=Nx!lG!kS+M# z73{k$=vcA&056&@sT*3sYOw4`sl~SvHS!-c1gU@P*+gj=MWx6y)IaJRbP^bj9Fx3t zG)&s~g=7zUjA#XR@dg#E0CFk0n16df^?UPx8UY7hIe z?)&f9(7AZQMQmqXZR)nO3WLtMvp&D7H(s#v_Xe$6|5zUz`DXdWXsMMkr5Ym#&VRR4 zdN6KPJKHufh6w>gHrqvHdg8rNzAc6VCUl4cBi4s&F+$c}FUR=p3=R3u+`w<<&S* z(u7ZnF=}pRBED~Av2-zTt|wob@E?5f+KYe0YC$S`4PCq3LDq#84e-#LSjtG zZ1f@Yv7>Ck3TQRYdz~Qm<2LqpOMIL=n4kyi4XjE)z2wGpcGRDMgQ<3|fT0y}MbaW0 zjQL&X^{|Q_N-UC|wb8tHQGFMqA-I@e5G48(b3BTpV8IG9S>!jNVRMbsa(@DPw{m}k zYMgJhV}l>2tC&7;F_hxB&P~7{mo(vz51Q!5ki{TWY%Na0_rxZ6=Rf+Eetfhz1%7NR zPR1V_i&ODYxtJbXzokb_6Fqhor{QDoVtVYK+7BO}-9e8-_4GLWIX#YLarpS|YI;Np z)A8}+&Gb0cI1nE#$LaBQdL}+PE{1>JZ!S(j_wpq;fE$zW?FZ zitW=a+{(f1_s0)E3%}psR#HA>m%-10+{!U5`!jAOnu$T$CEUt2EbUWnGsqbwEr7NXQcl)8(h9_CgyQ0g&CEoZ6UaVx7SHA1N`v(z8Cm1UHAic;6G z)D~{#tI4$XigTTBQ^@w!i^zYy@Q&P~x0Som+i%+)-0FK#OGgv4)Zz;_`oeX}0@9Jq zxtIUIL}cvorEby73Bkt`f%G_~+1a!tqGt8nHXAg9{;=o7vBR;A>26p@Zlnu4aQYzI zW$)trmnLJN=LIWxS{8)xYz;U$#{q`({HAXS%@ODMZHVl}zBabv!ZAPUDK#m>GF+LEq@< zSJ6?s_2Phin5sx-$UJLj_zPp*-8F7VGd_7lmxFD^>vODLB6f{lM$5s$^kxAL24eY2JQA+BtG z3oZ+XG@0!lTJ`@+^=a#z3p{I$R*zo(^y+_S#YueJG6K=W!Ic-i0W^yf#K#k%Q5BH| zFLZo?s1mqbbH_6GKGfLNfF|syV{psI!PHDAKlezx^$9~ z7a!f#-s#dwN_Kp7SNn69PEs=C5v`m=Q~2BvBPz?gXlLVdYZbi9Mmrn&x9+~P;Uys7 zeULm+vc6jFe8cRJvUy@>_2s$EqHkc@0&!@2gwo!rPj;eJpX>!)v6Fq!qSNvsOgHw6 zT^4_RzZlgOyI*|F(m&x=Ue*=6U+iP)4cyB3uGqa|J4=VD{Jt}Gujp^3ZHrs^X{SD? zNvw+>b1N%4^%+(1bL_?2o%(dPSfV?`^PT#1Ml8`C!q;i+5SHi;@ldBeo%=1(9b!hO zKAkm|=nlbm>eIQ^65SzkJN4;&+j7(@$Yd~TI;riEo!DyLht z#O;dGqL*CrlZFbrmEY^HJC#NH>n>&fPuf>C%DeEDJb6K<>JHxEKg0!|Zr86Sy?lzX zN;{QNKWX^n>*$705?_bc$9&5=dLzua9aQ8I0dz61F zctzYi8wZg{a)AXX&m85-ohy_HZCWECMQLXJtyKc2_2xcl*57s-Z(-wYqw)5Z@%DG) z?Rn$vDdR1`+9*|!iYS+z)?2*LcuO+g)KmJ~PsUrscspXeeP+DvK7}DkaD<-{=3 zz`Aim3P~zcYh3^egn`CWqI~sj5T$>F3gwNT^qXOk6Tta>fcMRCQ7bFjbex#eW*~yA z&4Bc;+w`_a8gEw{Z&}9MMQz4h-XDed-A3(q>4}xf&20v5jW@pkG>W@d>-iPR5F@|5 zReyWac>A02_MGwdr19oA-hOYqEjHeY_4dNbmR5bOY-lys%0INk8s*Qe`rLm$ZM>~E z-X1sJmKbmM8E<#D>RwVjO}fIQuet&Y$EzsdQ66k-tn+Cfm@f>FoQ_i8uUdy_dzf1nT=PXtB-IemI z3k}6j@II!>-XTA=&^VBIwGaK(^0)dpE7s1B+|hckyU#H3LbX$3&-0^c-MyCmCV?5c zb+Z(VYPsHB(&zb6cl+VnV+}X6+~W15nL9Bp9_DMLqagI?6&NM zTzLhVXg+szd7kKR@C+zO_oU0s3!?UK#fVimULWGh`w4&2?Pei3u*{vku%r#7 zwHxr>dm9LAcwSM`wt&UqEolQ$ZHa}6YL`)bnh7e_UI(??p!VmYwLcEEyClF_yg|E} zjQmlGn+WT=nB1a4^54uPgfW&6UAP$%89GQH-vyc&$K3D$%tAc(c2%q(mlFHgh43Ty zAjxreTbVnZs5XD{&PvS}SBqi1g*qDf*nFeYwa|Zd{KGc6&f#qgV)>6p61889uD8c*W z!Kk0MKXe(UwZ`a_Cpwv>l}|uE>_)nS`J?Vppl4sSivH6XQ<2gP%vJ&36%QOEi`rz^ zEdZ+kQu`QY<$6-#2ViQrq-}(EKx~OHmVgH=Xy%{o9o=(4frHx?=Fy)YI$RS_W`N0Y zO4)@55-5Lk8&a!Gt1D7L7x|VZYoE`Ee8ldIgCfo>22Xxbn7hT32H7b<*XMASNV zqk&9TR?1j42E^2#t5tuE0qgngCR;Cwgv|@lGl0(Dm0!TC zyIm>~8AisSjOROzjwxe%-1lc^U9eYOde-5QS>9&WPPkN%_H0XeVP05}GHlnktK!;~ zp1oQ`OK7u{okzu(5MELz46StqnaAgXN>>e~>z<Wmg+jW(&m7VT{XdVN9f0MG}~Bn+((Qeryu3qPdOE%>_ox6v=6wP@ec zC@CSP7Qt6%rY=xiI{l+omByo>d)&U^NQ)OfR#4}>ZuFjblNJ7!!{2oHI{|+MFc~@U zbi?!gJ@Gy6zsH_Zy_sEqimVOt(ujlE@~VGsZIG1;4gTH+^nKK@ymr+sQqZian+Iuj z-*Y$Jz|?Tg{AOO9W_3xA+MMF$E@_qxqvbjSUpvJg9C#nf$qC;&g72rJQ&Ia-Ufk}) zfVS1##0p1lBk*#THb-!Nw!q9QmuJruEEP`amMicudSPx2nM~P%Z@2-~dnm+GXhMG{ z1`k71a;V8E?qU8dco8u28N5g>NCQ^#YFLaD?yEKJc)^axyp~$G7!D@8!g7|=zT4a2 z3}8Ix0QSq*x@5^Ej-WpZ zM%6xZBAff1*0I3%9=^C3I_IYe#9n`}FT??*f|Odyi#0q@YfHUbY!CL=YH)>r%z_N3 zy~?`>x;TaRbuC#km=~ctAN=2T@cNhzGU%6ECQ7LvVe4w8LmDd}j01n6=!Iy#kHL=d z`i_4y>b7DQ(M$c2$s`Zh|U>@V9YVF*guW z%TAnA`952cNu;mP^8^{5i!|Us$eVvYC=5?KqlyxyP;}m#&8!wbuOn1}Sw|?hSYN!3 z@TvQJg#fEu+}jN_XBENzIyQfOOu+hqx}#wf=X;C%b}+1B$!aJ_Ph|(WFX@6Ipbru8 zMJ%Fq+AY?yLay+UIKAt?OFg3o4srfLcp%>aeIAKgY4Jr`RVXz%L26pg`tA_-$E=5+ z)Bl~`j}<#qcs>9|Qgi@bA3_jDQrWQ3!f}HckG6kBnrT2DJZ(H5#hlpz)Kk*MVH;+~+i0d?8pS3p8IKN_ismEzcy0o6Mg7)-iKAWb$q zg6{?1gL162(m)IDQ-@ed^N3DZ9O5CqFOdUjpl4 zfkhw=ST#ZPQ@X&t{TY8ihX-EMQjghgv0*~+Pn0K8Yp(F|EEt*h?@o}$+}Hy13(Sl4 zMk~<2XQHi$Yv~6xMAg;?*>54NWI4orfjU;N_dQnE7Lz8|s+GL`3od|h*d1aWObHut z%#0w4$kUUJ#ZBuLWZkhqwtstdyPE6B#`Qdw3rr&?u(-5EAhv({iVh#QNY+1CLXKRR zyEHADrRZO^2^JvUNb$3XzDUOxqhRXkfe@c30YVrkpzPI)zfa*~rGUeH77o1zpPZ}8 z)kc-nQ>-`gd$jrf9g@=rjpfM=G5wPD$*QDPIt|wluFqf5$xe^;3GK1v7qOy&Dbe%w zjGm(<3i4Iwr{{l2%-N^_S7;Y>i0w{$wRabf4o^&gI5Wt66*iu%-st*+7!i#T_xy7~ zYnHA1+(+VR^}+Nn%4t{m%}A7KA$3{}I{tMxIzABPSQg(omYnn4q&gzy1;2=t2fJ(< zDgW`x^N{kt#&sj*+hR%iwdWf1g2ZlQe2PxSZ_>&5xNd)BJa+&6h4lRR&!*?q20j1y zXVLRl5*R%npwsi*Ug-I<|0ndk4=4^vI3F$FXx3@@eL5|7OaEZByfucFcR^}*S`K6! z2soq7w17HEJ`*c>ajajbSbtNHQF%tgcWZ?ApGe6kuOsUFA~hL`wh_}isF{8t z9S4x_gMA?o-4|%Biw%JWZ#nHcNWOuoN>I;DzW>*HHu(m+U4RSJvlLeHKeF|etlZJ5 zZ_<4e*qf~9Ca_mPzFWi_2e8M?1v#S(SF0N=u{%ZNF{J1ZBSnA6SgF61-}1a2vo@2@P0LeY7;}b#sOrEl zvfg;W(8yp(P_e%S+=qT@)nipdXcAf-J`!)KMgK(@0Nw7+c5}Y$bRA+BijmdPt$TYrYUvX{v#H;Dmk$&gp@ zTZi}|rtxZxBS>$ND|=2vBQ+smY5B@HL^mo(8$(c+RaDOnY(v9h#sqBF1(c(>r_pDw z@PD&VjI-B}fHIl)sU)C4`>+1r^ynFLv`2s9w}x=?sxF*lGvValnsDME(tLAYa>*UN z?`Pe_lV7%{z2B_wX_s7no;__xhb?wb8*Yy7X!hR*v4yppwj?fN@pT+K=4D)CQrNQ5=cF_*{FXE1=PqdMu zZ$j!0-t9Fu(3t)6=k46nULSKQz}SDfNLbM|H%J5&ET)1`Ov`jC=^`W<^sjA(=# zCl*uuWDMjb?TijbLw#>nVR4ecS7XS|1}C0aVJ39Tnu;|KEh8nr_0;^QQk- z!jWehZdx;OXZ?~3oarGL#Xy{P*0Eg%)Vpn}qhK?bdRe=w9O~$OJB^*Xmd-9!c|?<* z9K8xoD^P_Cn~5OBw_S>Uo60o#$^Yw46g2=VXLo8?d244BE9-wTLZbbKfslWk?{Ej( z^m<21x#QeOd0D3c9voZYM=X-`{OqYbP|o0oej8@|82qpVjp;;dc5ZDTL;!GbLKuL6 z)VQ!4@qL=u-eIRMX;(o$6Ki`Tyg+UPNR%f41->#4{`XvIIT!i8;e-v!ZnR#hB@^Yf z>_n<74G17Dc3D1_r#5$^y#9Y!Y2t>SP$(hyd=d^&9@v3Ucngyl+dC8a`PaztliBlM zWKq5|s2ZCv{ODkBKRXx9uo@Fw6hLnbpGJ~=aJDi9+DtoFmWzS4a z+0)*Gro}*=XxhS71M;xY)?^Y(YmhcBP^M9;nAO}1&GPUXy>ey7(yPF#URadac|YD_ zw2ss)5KoZUqg-n4UGaYt`|ZEs+jG_ZB;-?nl|Pu+;`<9OzGr*N2fqN{r~O=fzg9gr zzMpKyD4I-MTANMs(xS;$6SE&4iDXxr5|t&8x^|Z(_{~`+O*!#<(z4AlN)uU#mOd75 zIRMDN>Q*zJdk1I3oceDjD2MTjLh%%=ec!i3`0(-g+-e{rF!O)H{_oViVoggua>u+h zNrh?y-8#XGb-A^G-(vs{k6eGQO~KY|YznN?$}afNe!?k!#dFVAIxU|&Er(GqWa3B35} z(EYr)bN_M2&>DYn55K>WPpQXs_%-clby#_l)~m?t(7;%1sSq#^SLGmGzaxg#Fj5Qp z%D%(q?iJNJ;&-nBI6 z;cT2+Uz_T=OzW@xPlOcSBs>UJy-LKoG)}E_iu)0$4&Hxvj3&n^DzpThxe>927k3N$ zzg72$)ig;3y-t!NIz_|IHAM?f14n{PveSN$7ta)O&(`pkcHW`}muEYGc|Z5pSK`;` zbpU710YgLJ-h=+8*ZrdT`V7W|^98uI^V}1*9x8Web9Gs){`9Q*Vj5riieLvjhqeka zN#6BCm+F6`Tp*eChyre&`%_rpKCJZ&Q^UM{=Ocsp+?`H;ohKdEgrM#f0<9qHzhj0m zTwfdmIlO(L|&SmeI^pu zvY*r@;(oLyn~PqR@Wk55m6s4f*n?rda-m}GnXrGjk7-yWrtJ~Q$w6%46Ep@1Pg&7` z>tqo#;3`QY11>y`jlFZ%)4xKVW6jOz^O#=~&aZ1mD>HGT)h*p=b6(QmmL}SG-_gt5 zmIJ)6VxYrvVUfKOMEmB0bdU^$Ziq>^q(K;3FO*imFOy*3v2-B1oaKGTtwQ*S)rB%* zEqs6F{Te`r&moRAJ{t*y4dl5&K5AxK5P?N-M~HvHuQ9=w{t!+{q^@`Wr`UPHtvMKU zi~BZ>#9$c%b2oJoeeLF@*??^&C(O{#EV15Y zsdb|bo`Wl|k#Ax43BuiXR`TKb8(2oJ>;1>eup6f#xh_^8Rka!CAwM!ka;sJjL z%R>`K&t7SDaE@BF8lVui|K$A|22{(7pW(P@fG%;5{96S>^0b8NUa8pti={1e}p^* z??XiA3)r;uTc^+9Z$rZnSY=`OR)&8M_Bq6g8bE1whwUH{u( zg5&`Ndk+5r8p^xL^+)+Mo4=uqHdIGjZtJEMP%ihdzX3Ychv9=mEm12hDfYZ{*1uth&nfaE(yib2E=tF$&{IW2BTj#VCrwamU4cq(yz}~IpmycvqQLj?!{6*# zD$jVOOC4rHZDHOxytC^WiUwM9qrE~Jvv8aV`tNlWa^+Pc&5?=tjP!?EJimfkyz%Ip zG;@Qww=W|X^_I$T2T0dm*ZzM9;0&y8&lUa#ml!6v2%MwZ4d7UH7qJQl_}njY534)r zY{c+7F7AVF?3T+X=!{E$D!fa%0s~;HT<~HHR(%*?^{~yEe@OX2hZn#JgsuIJ8lYMU zP#t{$N@ajrC|~ok4yfE7BVusl7>veiFd9uT%7+R(ml-g+kiOhtj(&d|>EENW>qFvR z00@AEK|&iX0Lb5<+YEuIgl{Gnpge%-5xZ+&g!t_zuG69N^=F#;8<$fSuCpB72WJ5g z;W>9!J`s<=Kjs#h`*(kXn{(_b8oIMcgm=$%k`J+4*rN5T1pPPzZ3s7x2U;~!$Pc6C zPkz{y!i<(8&+?*4x^;gAx20)F_~<}!clgMVl-m4#rAP60T>d_>g3k{Rt>4q#5#EGq%LqZObj{QvJ@B^FWzJY_>{ds$uP|P zknUnCOJmFC7y&K5e;g2frTjxV3?>M*Ng1bX&~txjMUHYG381W4_2U@#;vsbND6*ok zt+$ZhM~PSMRb1fKGw6;GrwedTuv8WRO+d20*Eq~-o{4VkxW>b+gKilj*RRnm46997Z5c&FJHguY?B~J^7a`a1^iELC+ z;gyP}#8;tzs#`X~)EfQ|eJr$4gNNt-JsX%`;A)4NVCVN{l#ChmgdRuY@oO{>hvQ7Z zBY8aIOdxJ~#*L$rpK5vV0r#Tj2vMzY2I@Rvt~_pRp65n?$Xo8V@AGT{24jMn&FbXE zeZXVO&&E;koR@%0AK_W2RmJcV3Y!J#f6Qa^ydOq?PHN@vjbnjaD0U-!!v$udHTLWn z0?K^5*@WOi!@rxcobsIc4X$}jARvI0utsrckO(bhkOs{6zkmiDtJJ+=I;jodvh&cvFy@+wdxCLtq2H zDF*$2)&TaQf`K+L$(k?tPMF=6u;8mx-S#7%Bmsk6)w(RZis&d3`+?q|GDzo=mT`G9 zUal$1t>xEP`C;1G*opHR$?+W3}( ze08CD1n+B`&q+of^gK$OLC z-T@_}^SqoOO*8Yfo64ISZ6>yODCo^hTupQ7;FR3A(pn-1iDgXngjS|G=y$onjlovX zA9D>)UP1HgRy9xsjT!ox<&Pgt(4e(XI#({SS4xo!?L5iP> zc$%|^%c&9Ut=>erkYXSUVvT&eCkb+zxbmIy&WZ3z4!PK!%H?2{Ip`{qd}sFIe>xMl zI}8eii)U_CM}NO2+c7K#KGGFdM)KmJs#fUZRM$4$m>G&{h%T~K!~+#{g^!PatXg&z z?3`2+;zZT5oN!fZPSdzEi7*1+T5<+oF-(PDBk)e~I9h=|PaKP%L!Zbq8lXAY#9>w3 zYiU=ZN_1O|)}p32?jIDYdMrKdrE8K+f@QB^x~&2~f-G8YE4*w!()QaLA*_rL!mT5H zM^;otuC50*E`IwfkEMT*wD6jLbkp{uZLg1e0P3iU%!<#4CuGfBo3sqFsw!t)HVbo( z&HAzG)XeXy_Rl=MJv?njc>B@t>j$v>ge$TB;ronz zBjEc(v#TL}cU4Dv{6YMEY~~TjON+<4J7#|l-^D+V=^e9nLwbA{z0Zz+f032l2Q7UG z&-$wUv!L!-`>GDjJPv*NYI}Iztk&&e9y%0WmeaWX=#keOt9H(=#J0AFm&~dMaMwWL zlkx*r04B6fMhOe8ecFu|)tJRc^&z-Y=fB}Dr z>28*uHXNR?bHI8Ei921esKQ5v!=S6ShbPbcQ#kz+JRw>e&b$OcJ*yT#aui0l4>b!Y z-r!u<0erBz6EJi@8^Afh7q^5_3&cC~T;c--+xcZV6A?1i@P~+hjIj#uzN>QkJ#9}^ z>sOb5%%Tm#1o^d>S@G7Q z6zWF})T`enD6{~7rYj9l59Tz{_OR9*bCqE{c9sssi(2oXEiA+x}ufF0zL}!)oWSLM@>&lHYrmON`Rem%Xk|b;W(@zW;WYB z4W(^JF*)DTNl7M1;8x9sm#VEZM_qtbq!I$9r~Py@`svfFIUaS64TRARL^3RoB=S2B z1>T2;Z^=iUc*W8ya_h-8i&z1)v84`IfeU#1RM*gdTA}6OB_UrZ4t-CP>Y;ae5Jr!pzeN@p^$;K@nkh(4PxUxU5nl~#1 zL)>4b+!p_a14_1C+xW<`sz^oJ7Xy<`W}Nz0bATKln>9IXXYT@9-T=g-0_emSkoief+cg=_Lmj^#;JqN`lFm?Sw*jj1P*qgntUd7C z4R4WI)$m>XJ@{R!H+c*BkDq8FtfaB!IB3TeDvhf|K-Vg;N~Dt^XdDT9{6grn{J;fP zQ>41PJ|GWyfh_TJ*wW=gxwN0-R-P5iM25?MkmLh(UMq;ul_xmPb`z;Ve>#(d$Ek>7^_RZonlbVqTxsmU?e{X~(;bt^IL-oZ1_e8xg zG^`_b(+Ug}8kWcRp5d#?Y}8LpB;b)+JWB?EBmpJl0aj;^kue*pdR17C+W4hKh14iXhPn zoL!|Wcb^-*M@FNly6qv)0F0u#J?!<^qG41ooh(@|=7yLsKZU0XF;sjL)E0T)z79?-Cn~II6Wp_Jc)#+=QJ_Q-2DhS~A9@g;8~j6|7ra04)XJrwew$ z+`1lNRNeLp&p-;J%5xr*9!C{gPmg>Z?H>!Jihbn#b1<+3^ivirI{-LJ>BJ;c5B{{_ zw+P<`04Twij6$13W=8L6C=ANcaRB68`xFh(lciJvft*_G1E3_JQ;x`wFeAc$zE&3` zn-Rt?$y%rbd7oQKor*bwSgcxa6v!A7765q^s+`(Km6fnLPjjI{DD3&3vcF^51pJqc zzHjR}4fQeI-=}C1h5=>*&IB|xh8n7%hU$fV?Jzp;RE%XS4Vc<}B5Gj(H$%1_(AFCl z4QN}D9{C0;o!UpGf>@ysKtDf!!;8TFEc9UJ!}+?1BA&p2z7r(tH0(CiR6#X;z-sCq z=fur~2SzZsoD*{Ajh*Tm6c`GDXvo*#uDP*w%})8f8_{Q04ITIpEn%lVXRX&_?uoD% z9)=3carmFNUrQKuvfgx3(p3gRo>UguifsZd$5vVVUA?tu!}eGZ zIG+5EI>b7>rR+sl2W5ZIqwpchZ_8tmCB$$`i$kpSwI^*t$NAh%)h@LnuA_GaLL488!>EM8;8aDZ;B!myx2GqY+`);3)f3%jG5)#x(@aJ47+LPr>Yor83w1Sbllo65Sg62n~s5s3+T{r`=Q#8gdV1L=AVmy9up0a*J` zy>=xmMdkMZSgeJA7Ho;OUOgXBedRHPXNxiVPhv*TXwNxD5A?e4@v}=~(SZ{Qg0XYj z*fsqwe6JHC+!1O4U$G`4M5$BP5q+^4^ySPMgTBB7|0$$gd?sdu4viiiIHQ-}W0cnl zQT`?)|KCP_?=csIpwMl(yJ5M{%GXGgw%SpZhR2N}(y3H`$o!d0z4v%}-<9+cPjAb- zpBYc@pqa(f6A#FLb#$t|N7L(0f3q;ARO$8lxKJ-XR3Fip>!Ty0rGD=IU)fjx+kexu z|5}HkGX;~(Cm$3GlpIamC{Co%rvr=%Ek$Vd%quNi6iCxSQwR-ox9EbI(>dB&#_; zm7=H*e@FUaLEuu%{nv7h<#XNW9FIgX5|7M6#KBo z?8$-uKPFht_*y5pmMFn8yPkjSn2&~U*L-%H@a zF+Br+7gk3D7e3i7aN$ihcktKIFo=;d^lx2`{;kc-zxDdV9xv1;1pCECE%Y~V{)eH? zg8rQUepEtFA8bHp3;;@*j)@zVMuRbC#{^@vMWcL8ibnYoqEWs^tK=La6Qdx*4D}3c z*xJP$;b}qI5|qz-Cai;m(k>KLxm7Qn9Zm6n7TqUR0{Wz)$X=*u_&I?QJ8Ljf!7VJV z&Q4O!U?ocE%vm820S^kWD9*9>$=DVVBWPzaLMd+RgsEJPp}Ojn|H3=z&XjL4yjc6C z251jo)){RaPsbvqy~p#a!`4P2Lgk@vt_i5s$PH`$Qc_K2HUS_DVrPorJ8t$yu;9>t ze0J<4uZgy|2-@3(Z;`L7&F~)&|I7DZYVc}PFrN+-w#T+#+BU?LWb*Xmww%0B{6ri*MH|vffP3 zROsb}OYqHxDsM7i$u4b2r32@`5j)n7b}P&(7v52!M*gor?lD=$VSr7}-wqFa1-|)q zGkdkLuY;-Cj)IJr9!N8JlA6PRgE+`XL{CsB2%t^$O7J{G(HRJ!3IG(1qDmD8 zQ8cahwL#*)$ZD%X*$B(X=$P^wjE@?B3>bHln3|1!PR%xQ0V|x+9q9^x#y&2s!|Ij( zM5(sOHf1alwJl1Ta^MV0N}}^-zO)trL+9I&-A~!9CE^VXn^ts?aw*H^h>n!j;V_h^ z(7|dQ3>1;S=B)T0#CQMh4pm-MU^Sg19xSw*e~86b zNt^#LD(J3xH_5aPQnKxr{TXWU%n;`76vX&Ri-Bhp$JQbXSI8oNLj_c?RjrKd7o;h9 zYDV*a;5%{BfOW7i(w1B(_*UeY(4*pBc`WMPD8dky`xeT=Z$R{HE;6pa^`=oIo-E`O;ZMNmwD336djarrV`owbS^?QtGP7E zwB?W1n6|lh#@fn%W@^WhQ(>5mcWR!E&>BZP;mmJFpNx6(ri%<(_~O7$6_2VhUTyv^ z`L17SHo1&CPNm}>+zob8vvPSqt4YknXl~rbLTfQzzbFPu`{AaNLiDv?LY~lsVUIJyQc6$VMf9cor~)j#@kq=NyjgY-nIO z!1g=Rw%+p&Op4r*0prd@%cUF#3yD&IrwgqVZLC%P0$Ak274-S*MivQ%x6Xn$PW8C^hk%QC)~$$Y^p`l#E?t6b%RTq zyk53)jhA(5&VE`xg7Qm&i_1rT2+WOMdEj^aAyLn+tXjSslLYX zf;2L8v*dT_oURi2J$(u>^nxkfT;Z>}} zQ%w+m#_ud}iAxIc6w_dzU1F6>{6q-1Cy*~58o{L@Xf7L?bBX?X*4%-DV9bxvF!Z(c zY#;||AP2|k*)Wg;YQ`RbpPY6(aA#7+=f~R6Tb!-zLesiUCYS(6pot5-L;UNOZ~Jk+ zznZkDWIlF)XW{}IwHs1^X?x{qfA64+I61t3xLbC>4@YpkBe=+#A0l%mHDl_(V34)) zE4Q9e6%K8!KDz)GL7qHyBbLokFo=UZk^PXjUSKT#mjQsjT2;Y#-ttf_|Ig9<63AD! zL8iTy3)}$}>$6odzo}pa3#2Cccd(QL1uMw^hEc}dRFH0DyAKqklV`tO=cM0RdayTt zilXh?3-C)j{vfW-`ESAEM?KSI^4ivfGKw32zd?a9@3INLE8vS_n@K*{AJ$!-+yD>2 z35pZvkS4{ET^NeKkCIxd#&fa!c7KEu+LA{G%YW;S11Dy%zx)h-TwwKlA&XQ7`tcj; z$7w{U*hNh$3VA_)18O&4fJQg9YUJ~O^TjX6@%r|tv_;~uJ#oS71ZhH?;A=H69W3{! zI+IOC2#ON{WAdQ)JK!||Pk~>&T0j2KXrZ>rVwa)6x7QRlnVA9)ZOf#8Lfe+O z5)<3i9MZ%>dE2@UG!^|d?JweI@~@DOYDMCohe`62(27r0J-G~|+SLkqV7dX#&UC`j zNTVE=j)Xr_Be!u#;v;9lwD)jSjdYxG&`C~z-J+sqJPOOjJ?}zT9UWhT9vSgd-!3(Ozu6sJu)-y#*1E;eWNAP{5YGd|+xF#vG^=JLttVKI zglz@G!HJWtFjPlys63pQ8$#8AAc;JkOj{Hhe~!eB;skA3MJrtPU7iFrW5;VrWHt5| zYFH@U-q<4wm0XZuMLn}y8ur!KNv5p}Nrh9i(akv<9bzR&rDBuZ`JN4bDoy+5A!My_B9r$g!4h^$Bk=sZd%9bC)Vw8*4AEOL0DS0yPP}1=?pqNF00eh^&`!1hx5E?d zjwb=jn250W#>!wJ_}Wx|e6-b5JKiabo&ApH(x4zD8Ji3qbWHHRGXw;JSA{3)6y7cL#5j8@6CK zcFH@pu*{ z3z4sdzqx3cNBr&VBI0jnGX7RTi}5_78}h|5n#o(P>8Y7?qx9uq@#k*KPB%2c4FIcj zq)FMpA7Sux?q&rLrEJ#jRG^9DMccTVbass_60{Ovtz%4oJu{uGTj=vir4>(1q3{U8yvx)97 zMQx0kKI0v;{O1orp!qkD0HmgA@6SVtBsE3;fVoxw2m5USoCPss^*@u4TZKKYBh$MN zim!rfx&LN=m@wb4N9U#Ks*G4!i~ywxa&6?6J(*Q@@jtbl6oq$8=c4J|j@bG-BNRk4 zS>C&Bf(W}!lHmLHj3C~cE*FM6Sj0dvNj^=si4)=7)>L}WfFZ58q$g%Jo2=f4;RPxo zo!hmnjH#(q7*K+$g2ezl8*(uGLA~m^F{Y|Q zy{ZCW+-;F}wJbprF2!t=MQRGOkW@w1;qLNWFY?)*d(S1G{pIFfrapXwAU($T zh4@#02`N5Bytq%p3rJ3QRmX`~VO9vH2*Js=;N*0GU2r0_Hu+Nc%UL~nKxBXQ1Xx59 zXc1voa_AsJH$Rql|A&@UQ{{ns3fhI>W47R9(8^=b*T-^J zKQ;h|Rfu|Z0VT7k%r?6c`;SWB35L?QK_I1X9lHjaqKzPoor=69i|@Ceg+E!)XXrlb z@-X}tZK0giEJzJ3&cCngxl=4Jtc#32VO=xz608TbutW(18bf`EU z7^60%%0BdCQ9W0FGx35_+UdJdI@tCy^nNP~g`9R|PMV47o`&3-X7W5F%!7@8WNa0k zii=hb`2kcpeIXWVdZt0}(VKIK@N@G14s@fVdaR^v6662KG7=fF_P&h!dD;_t>G*eX z^G^FM{tk}hA{aaM9_rG>m!le~LIjl1O(Vtd)h(u_+>>T^kR=ZDV!aSPYIRxm z3HA!$s7Bj7x6&y&TFrWILJuH+ygl^rIETcii}fzCPQLX>7ZKzG@}vJjf_%u6C8qrz zY6GALFMDe)bS&Ix6)cr%IGFYuNT=(w-7eZiZTp3J7(<2gzlPdb6>xt8;XW69AMr7S zstFc{c`w?zz?=dzfATj5I>7=6(E{N7FX-Hayk>QWdXh^wv9K#8%WNip&k)R+DNkL2 zBn2ohPD!TxyhYb5=$AO?G61Tmnvw(}8#9BCWeU<{n24|ciW5;8`BeUm#SmI1Sv%E8 zg*??_NR;o}$Nf)nnu+saWIeJBQf@>^eMGcKUC%oPfLPN}nFoT*W)Nf;wTn*?G^L(% zyf6=T;dWog8E?A$b(~&*krKjV(PlK=`6rqbUv_W-Hv9sewC)t7jJkUmpkVQY9f;#^hA>bj0pb{+u_{}Tjd!NK_omUFd<3pg~AsBI8nt|TrrJ@!n+5++dJQC%v zT%92AdD7+SaXK)R>nOgTGX)r>YvIG!t+OXcEIxlJX_#-3YxrD&8T>h7~Qq-`Df4{NU431X|EnZ z<1i5uTVx0Ij0>PbU+)bzPMzr4IP~c7&*^}g;nbQ+!KS3?hgklhw~d?{XWlsO6;d?AabFcZPw>cPKqOu7kKgUsFU518gFt-f1#_E%rbvT0kg!9 zwXLwl9@J}x^e7Q3@|p!5Ai)A=0|!*4pl3$@BXluMk{arl2Hn-EG8v7XpU9mPFd9-T zh_3u53!%+^lF{aLs7##Y{GVuBZ~s~fUH$+HS);G>Tx`gHSSN~u`SKK#A!1z%E3~90 z+2qa*_mtPJ(IhSSV6e#$v@B*OJmNCYrL4Wrfs}>16_iXzkDTaj!E0hDfsXco0NMc|C{yy-0_8Etrr zq|_ewxU}Pc_q+SH-__1rIg~(?(OhasKH#%iE>t^o3Ng$SJ%h{vAvR1VO{o;3jYQPQ zE_ZGS{atYzQ(>i`as_}@=NZa?1r_p8;}2&#ba?HD%GufLo7&0ku0HL5VsHg@%>W#t zkWIhpBsy4-|GoH=AZ|iw(jgVaxur>qb^A+~SVA{{QCU2S;&lN0!h+#8Z;MM@N2dnt z-WN;|B*$U$)Ma?*izQ?EXvX4bMr`uJzRJ(-y?jnz<+FM(pV?RW^xn(c`Y7L9alu!e z>hgv11WS`(IpLyE_jRbwkZv){8{E-_HkZ~F(1d5}>59;on!Q}Ld5l}EED~>i86XRb z1uZ6jfkdKC6a%HwB}kPl3?aoumF#op)l@$G_Uu z!UEvMS>UofBXC(|&nx2;lubU}VXUQtogIvSQpD(E{_!WE6!851^!_#Ih)wmt(_$XuT*CtVQRL{}cJpJhVuO?E^EOK4`G?$JlM@=2q&pvH7KzZs-) z)B3}lb4PGWo>V#q@2TRYarBKKZJcTC7S+XGyL6r)4NnqEyHF;5#O0PYPDNLa_G`F* zRacQJV7L6}%?8>8>f-29=tVHB$awF|*zVX#T;K&ru9=jFdoE3=5S#=& zPkCs%HBi7W9A7GE;fynqYbO(#_>g)6Uv#AV)iC?>>zK`P$C za!FI;TpTKKY+SjSt`KwOaah(-mW+6fj%oaL-s1@D;geu$19+7Q`^5#AN;S4OJMTre zX_GSn<^Zav*)8W}46_AY!-91j>TsYf8FA0S|Ixrx1~Ojl_x#o|KVxAjx-c9vZ`2LR8rB13&ui_wpaIFs3%(j)2ig<4m1uea0vI36kw^Zm4}O6B zmsB#(Br*KJ*QX4Apzie9{J=A789(slEA48@@@&D>vs$PQS$(5I>cms04EEr4NVrOV zBAW0VCPY?axmc^qbMe>f2KL2YudX+1{_}g`uZu?y7kc4;uOWFtul%)<(Vf3Gk{9+> zes1sObNVWu)qDBOzRIWfUf$M6`QD26&0nW_QJ$6Ee0162-ELTMZt)YLv<6Rj*~+73 zXW%2QKk-voelPd6{Ic}rH&9=Gj~dHw-MQA^)jwnXLEE?laqZy}>}C1AqAx##A3tr< zmtXNY*WcEEU$p*GyREYktM(LgVp4gma0YE+btAu({1@l4o$@1p0hEEHF`+PLP{`kX_nbSk&9uLZF~DZF@cW~&;i^cWTX$X>jnGU%GrR(+3kaL;e zA@6v(<7qNAlb3vNbaEzik`#6l70cfxU({wLogLQW67S4(iH~Ku#A9Ba{7gKRjg4Kl7ZN@elid%8F5CHxBeG8TVV3kQE|>ck#u1@iL4wWbO zlQkwZBQ2Y=sM@(0k0GS#TyfC36t(eX&PT;3fO?iAdnb>D4(XD#AUT&Jnz*H+MQGDx zVFp6i65RPsBv^@`I*5RLtahn?C6A9cp{p)-vcP&Jh^)6bjG`-juh1}P7oTtz}Gfabji?QaVocG-|t~sNS+@K**<) zahx}SGlhkae>V&vmr2)uj)wkb8&%=H67@}%f4q5B8$NR3P>eOx9)2uOiFy)Yu-&v-mo_ zJmzlYxjwQyJ2I&}Q~0x%$K0hnjvJ^v&WCy|k6CUq^}ak?$7tn$Ne`9he^`0`I+T^? z>JlTSCagr$xQG(9UPmSJ=4mAw(xpV1T8Y@hs7!C^WmkI2uMc zEf;N!T|A^ZXGSA`4VGGMu)tvxs-}TIFdM*#Jf|g#()^Ge5TwcVQVk3l#^p%^C#E>} zQejzPUfJ?MfmB;IqXIYN5xQ9*JNyN>BlaCgQ!kB9BuY+yfy@9?xk;S}vK*=jQc!C+ zRmxl%g8_asjzM^EMcItX;2Ye=0$Irq89}2?Qp@htly>=l#9YwQc8MP$U!2;mW;d4x zT=%0P5{ltELHbH3J(FI5Q;+x#D!vn!<@oh8dZLW)I@&$$k zTFb7+$JJneJobiraJt*)#)1zbASYedO^{uuaYo6 zp=iNPg2Y>OD;a$PxaZ>4kGFs!Zg7m(=VLq#W5g+hKs_2`artj?)vK8qQtT-`l zmuEA3<0D}O$U0*IL|=YD^b~C}$vGgta)bsi%&h!(=i1Br@tcTp9*Ic&gDRjOP*>ZN z$cQGh_flhO8VcZODkGiN{-gZMfJkvcGo4obvcJ+EX=YO;ipJWlF zpu_(@txY4bY8-qIT14pzMAY1yhy8Rew$EIYZbAZep!nedC5|S9_gWqP1-S*>7I^q> zLAqR8ktIKWHRk&c$TR3~t?Y%rqI4lGL*oK}HTGM>%;JJI^tMlsQr(U~8NEl#f0%k& zZ61@6<{Ii*k!3>Vc5m3y@cN0kG&}+1o0Ka5^Gf7PU69L{_rXPF_tkix`-;drR)pVi z<<%5wnpcjiw@ID}+UhO-(8JTd?J&`!rXNBx;yrT3e%2M5X>WN&7KOGJNMlBL zRFyBk3%bkYoV``9zJOYHvf%yH-B<8mcH8a*sMgD+IQO*(*4axG8D-?J>?BGI&#@~o zNm6Eo&~nIm$v(%BdZ%rNlN;SI&L4Y!0dfqv3vzN?bCJ5|g#OS&yXc{O^%x}IxP+cu zLr=aPq;0M;bKc9%5wBp+XPE*JPu1|P!&WJ9`IU@QHeawcxblkaxg%X8HJTda$@xgM z!R*b8CHCDVF!iHBk|g9~)G#+`{LCs)635^Mq_(luyX$ea!9Qq{kXcJ)Iah>#k>%(t z9euZ-K2YHeXe=F-X~8d`#QBUb2L;jia@a$arAS{ycpNcv2YaR?GvL5&@p{(V+$RZ9=vUcsN)3Z(`ek7km>c23J~doUe|0e!X%2HRC)L z_vy$|M(>cKKlWnmkbSX366e*4P%rTwJ{{ITM&Uwjl+4QJ(#mEu5LfyjCP~Txp{94z zj4Y^7v3Jk~(nm@{o7EIKr=6pLh_qSQAxRt|AL(dQwOJ=3CS@eb1uKq!|3V*CVqDh< zp0-%dYb9;F6sFlbo8yyFq2_Vkt8v1SX>C`7cXT^<0iOG19GHb)bUTO3#c~i+V_n?! zTazr-Ok~{r+gLefL+<`9NJX* za%}iGd1oB8 z;Fq)p{t+bURRd3dI+q6K)$m zD77*xJbWV3FLmXGxo|?SebD({^g+pU4EJlx6V{u{`XW8rIk=`+!}1ph9e7)JP0Ovp z4N>LY7a^~+*YZ}C8uB_oUMI-w@bRf9c`n&}k{b}S-W>dY0*n9%{e?w$Zm$AAR9IDs zBHPPF6q&iH)y*e#S^uzc_{%V8&J_-_okxFdPU>5Uho~gq9v;crGD>cmG|}4 zQRNkj&P(2Ziz4I|ib&wi5&WT^ktQ^d_Viiqfp%Yvy=+{pZ*(%@8?vTV(NnT5<#|m$m$3KPvu$u2m+s1t50Rtl9jY_sIdGH>|_ zGFO+Jhs+Z@BW2zaO=gGWn@Z#CAc*Yr*13xuezA~$);>l5L{+fV3%-fqlUGVSOjK76 za(efCb2^WiPKCmAfE`FRvP54m8Ha#`7^1 ze3?m5MR*XO7kpQcRv{=wXpn=y>qXu1pe(TNR-9Mem9M0_%Ri^OO98(#n5@?wsFBiH~a*753e{6c^^C#A@7E0O|8vSS5bR&8xGo~eF)(HwczIq`OV#1+#&7I8odA; zozEoRugFH{HbATMtkt;<0ciIA@LQEj`x1As*?hnJ;))4+RR>#|R==j%3=YqE#d=|Xz1j(^KC-RNY=sWyA{f);A#I1&Z z2kiNMul0nttz_Vufd;Eqz zZ-3Vd{Jbe7$JcQ9GvMd{zSqFdKU?1`{5 zDkSMW7$WK2ZjkhT>b}Kc`)K}1d)eJRar7F&w{s$hCvce9KAQJRbsv-b*dC+$?%bzt~pLeKA!;y~eA>>-zqmcp4m*0e)X%Pl1;=x=vXmt92#vcr! zJT7A0K&U#i{_TSI$P3{;T94>>56Zm8GHnqpX{iSDMr(#r7)X%0AtcCk2C-)eJcr>x zB2)h4h2cQ*CQs7ynEBsIuk9eXK@KrN#AOZC;ReaH8Q@(9f3j7FbPQz&ar`gFYN_C! ze&xm9E#l(R|Sd#?^J;%fo>qrMSbERv|ETPzRhi~~hr|m~>?UiPBjrToTPJsG? zr_VBLG4*vsSO7JijqB#q2eV{Gdls~-qsx|MgCeqRB~3-v@F7BZFhQ_?0-0z~UaE)e zU2^q-SY*V&deZnXreRdRLwl$G26;~rC0FCTn9VpZXBn8ez^6oLy}C= zL9SFLK*5wEhFrj8ZVw952x9n`b`pH18dv+(lvDR(d|%x2$w?-MKjrwfNl@#9P9j_J z?T+kv@uMB!KyuzM%vvIUr)43vc+~?KtV9f~C@952gGXf+rCo^LmOheSxuso|nlQH4 zJKW6VoyC=Yg*0za(N}TaLvV=M;HE2kkq<7}Otf)&Y0p&W@c#SV?JA`jk&is4%huW-IW z5r8lZ;CJY+en#%)dyIl2jcDk;Ej#-Ag zj#8)cPr{SaMRZ<&{$XLeirhu4zlomHs(YGN!>dmlHN22+D_Dm$I9>S_e5)=fGtd=swG z+nTvG8LA<&TmaH4Ux3p~BdYuq@|`q8-^Da_2TxJrLf`FwUs|CZY)Vsj!rHU&Mc(JkhQ8^5a9QVA{$rUM^>F_I43=kxXz`)u;C8pDJRsMSsAHE??Vv0~ri z7;s-;wl)9(rXD2*e3oQHsiJ-Uy1RXj)^LJnGY&SByANeb1?O%R4b}=drmBbd#TV_ikL@ZN?fRGfp>}no7dni_9j3G6P1@go(HjgIh#TX_cOz%m9h$YBp5s9yG`#lDL%S#P0#wAo<`EV!2U^T_DC zV3a(6I`sZ);r;&n!A8i)j4C-D&c2V0?@N`fa5^lYWCp=$awz#ay|V)qv{1UwHL#e+ zo+v_3+^RWS;5&!9Vik79gArX(P;2zA2!=VvQvF zfwrGQeB@yfao81RLsyvFS`lP8lo9847PVJ{VyGfEbcY4F`EHlBKgDFa?oP~nz7o?|X#Z7wKhz8puG$=yD_sVOufgF!P zW;b=RAhT~C(}K*LzFXwO_(h8^OYQ6$FJ??DV3sns9^MF)>Jk5*#G> z<3_%fVA|Y=rW=$n#N-=q8lim)>&_VR^Bw=M1#x6kc zHS# zn!s>H=Ykuu^?)0ap(mUPpH$na;fh`l!xeo=7aj@26lDHDR)8u%+J`u%)NMVNDD@G*d?p-KC?4!f(CTxb;rs z*5Lsq?KHI}!HW)mY&AulFKGE`Fg=*BaFe~Puogaz@R8xugiB~Fel*}7Z_iCxoSI}} z{Er=p5&VyE-5bVITZjzu$}loW{<98)43bMW1q0!8xU>lB*SFGt*Po=7wZi_ivbMi7 zQCnHdBl=+PddAO53#jc5>6jCYbzfYGxC=D1dm>uPaDK>rn(5S7Kjl6Tv}+MR^t|j{ z;J?QbbNUr&x^tI_+h1(tpX;^icWZGxOM53nl}@vjT-$ZP99E zDpo-uRRC^4k-rPx50=Qgf8IhoO;D6gNtmvDkBS%0#(Q1(yhV23uS?)uh2@&127>2=W>?a_qR>-!`}k*$6pJ7?7n|xCDES|@JFV_P+X)@-4{S{aYbK# zvAA88suj$Qh3hu%p-wnE5^L{bTqVsDY*nsX?PbH_gS&~skT6laf7Be@LaQ6E@3T?_ z)c?R=Wi$MPcfN`%99!Uvz3j%|Z=e`gs5~v-C@<{OdtNu5qp*ZTNcQINZ=OX?;UT0c zjmc|QdCzXJCSRfTxEPIfZc#Ez-oaa3XJsO{mn?)F3e}Z7I2MGIRV#(`Rv??7O z*AG6@4?Z+gAzkBn%rMk7t}`sn5PA#cq*k|}){)@Yb6bq7QIM8e@h*GLLmB9z?3JHLKdm~rE%~_x zw(ZL=*t!ZSX@suXCTuxRKGV*Y&~v;x>M z6DA2Cl6t)_)g^!=N*@Gz!QcOdUrUzeUI#VeT8{LTf1tHY3a;<+<-2IoglwspWk^dg zMC7TM{2=&SyYG=SdaS1v)WXLU;+*o>I|hQh-Lt$emHcveApSfF9wimvsPwIbd!Z6yTMqgPOv>Zh zH)S}he;YF;F@b|LC5;`#C>N4t4Yi0@gqyH7xYArW!Wwbz4Ijg)8f$M}$>MYj26QDc zKMJvec^DfbCWBLYwM&tn#X$-R`N3gXqY@S*)_7?0gG*$)1)sA?sUW!|C*8fn^FEu*z$8n;iA?rBe}2=f1khvkcUw*Dk;DX>;Aw}dew?*E zJktqN7H4bNvzy?PDqjrG*B&WI&QyP)>U$OkJ&ay6j&jb6?typTqBKwY1IsTd$xU|; zmL${;wgzrOgYQ{9RQjF^?(l^fI6tFIGU4lD<$O8}vYSW6yLvy>bI_xL{j|UlSG*=8CDF z_Q$v<*P@1mt9Jta_3S?&oR8s`y~E89w)gwB(VkP3!+8hcM0b1!ZgLkie>$aY zWd&a}S3p0)Y)j>naw+Q?S1MtBl<)G7-U{EI3lxAU@h*#DD%ll-gd+2Y6=XKqGv^D< z6^ZV-0@A%opE>*zGm7m_sja}B2B&NpP5Z!uJg6LKL{Xz_Pu-R=sRju%x*nf6sjY!m;uIr2O6i{@}Dj}t*%ophHnmkKJ?UG(7N1{n9oZ2*N)!AG7Q++ zJ(hthEig04yT;o=W06uAM@AmFmdFDV*r4YSF5H&kz+(XP7ta`8 z;F>4xm!EiwA`3V#e?~wtv(_!1LB0as6f8wBzN@I$M&Ow#q`Cj5W8x{cAD2vWH@2xk zsXOR=RZE+y+{s2}c+uT?a`ApRWr}j@MtMAjDSX}8?Ud_sITbUAVHNaP4sTzsv;hHP5fKKiVyN)411f7{TmWQk+%?t# zo3^0WO}lY2HSGp@1=g!mYuB4T0Sog&mtwgDISE@Rqg&$@x^9sVV=zKelvCHp(?C|` zBsR~rN0nLHP@Q}UTTm9?q zt-ddOv7MG_b625Wg(=o5w25wW)$l-7bR7Au=Y=Dmc_-EDplG0XhTuOJOlm^|v`1|u z?tNn~aPQ-LE$`ctqT}8f)_T1evz48Lz-cJ(Ke_;>e}kKL{j4%~+z~ytfMJHuS>`$Q z;W9JeuMXD#S>zpmM-O$p^}OW$U~gm{Z~ech;}<6OP{$k3OJ-|?%nS@3wT{m>M&_Hs zs4+5vltAI_=NKbHf%13m0h#|67AW6SjLiAUoc*)POk8BI?Cx3SZu$ST_ro(I42qD$Swb*ABmEM1s}Q+vgIEJxu!mKTl@EZ^(Y$Jd8bANSX&k5`=N ze=q#9r~O~j8{c@|^u}`s_lDkh33n!X<5~X)^v3@%=#5|R zMsNIG|DQ&0Je6H`!C85Y2Nn|_=Ko7}W5&08Zv4h2od%`xOB$u|VrLko@f>FtO5+v1 zqBP!onrM?tpGMl`cTVa2#(Xz^V}?nAe^F&J729fElL+MpNAoY@HdcTpn($Zxk~8sP ziu_02}b!jJF<-053TnMzYK!pB&1Wis3Ll7=d~O|<#qI-u4%fBZN9 z@zFNb)7qC?vzK;($3`y4uY~RxPm1AdI=xqJxLE^#e+)mAtW1W1{{&&bvu;i>Ne4@A zee=geT;409AE({Su-~{hU|_!m-$HBk*krS`Q%#AvnULSV|02;uaBrvdTyvvzfhi33 zy&Q?*>LN2-W&Q$T-$g@%7H;EEe<+-*zu^6Tae~lt#IqyM2W2lBi;$LIYf2POx?`aq z9<3hhFk?O&Pp6ghzDq^?ME?9pCu)ci*Oi`?Fum%FqpsMKljRy9c*f>+($^YOmPs9} zK@q|eRfI(!c)nF{2Sr(Z=Ge@`Z3JiVojr$-lB zOf;S@qw$o014!eAKx^K78Cs+KA%TJQO~T?$O54 zpX6@i==QNNjz+R^wD-?#s!~YfXwm05j((TL#?c%4IC|R{N7G+8+c*m7RTBMj1zw!^V*~riXF#)o=Qko`laPP!s)Li2UfkE!Y0`j9<3@h5mnze->46`XxnD2k7l+ME(bsY@pel=}Vhr7sx1z4=8Q zr5=jD6Ky*=&rU+$`lcdQy)S%{;fq!D$QU0mQ1n#BIBoUwf4-!^fUpF4diJuKDrlHY_7;`hGLL7_x>5%~|Y_es?)EmD&KJm!aB?xH3g;k7&A-Zkb&Up=lJ5LXLsuiB9+)COHir|zgDWDO&&){F8$D^Fd|0&k| zA4+7^OaCY9f6V?*DBm_8RT%Fyqe z34iZHWv!z1i0JVixD)t)_!^k(C~v&dp?1NG&GOv(e`~ZJLQUQ#3d7E;g-;`VWcW0h z+#Hu2m-9&?{%Ga~N9F`hQ_0vJB^LPdKYOgZUK42V+fKDep2dGxJj_vKV+ zP}RTiJd$i)bb%mQ^2)LV)dCZi&x13v1Hmty$esNWD4LW9p|A%Lp`G$=VB*Am6RglD1^@f-QYVaV6k2{1ZGrg%)4kV&z}cTFx8MX0 z5qXbLml+FwQ4Qz4mx5!zcO^J%-*cWqa+|80(vO0tv6ZKQ9C#7DqD^f1T#)iwdC$M& z9a5tfTU;zdwf9Ye|RAz9X#I+s#7YJUE4PJ~ZJ~ z#J>CHwkik*m6O&P_UI%WDswSIK{GPIFA@DbHiP?dq_BR4B1fBDaSq#$^JlVFc1oQ_ z{U7B$-^2^*UeQ0(3c|ox%*6Ujf0EyNO0U0Qjy#iOsKtPdOu=#xghkm=UTD86F|$VS z39Z3_^1`PKsiv>P4uS~A!2-N`fRK3{9-i%xwu2A#*v(e#5<2uGOOzhT6Q%j#(37ra zAe66&VN-GZjMT@Ee8bufmC7bS4~BvXEuVV6j2CJu+R$2N?#1L0mWnV_e=P5M(h&6@ zPjxW%c0J6eTe6~XEG-*@dD+k%6%qZElLD&EI?n4eX~E%NQ>vmoXoV`ydr(V`;jM;) zO(Y|X1lvIn6Dsm^LEVYH-@nxAuyl(4#0wp^6Wm%A$>Wqi7`1+}=pPj?v_Qu{Eez=p zGEZY4%dEy~r#Mg+(Zn(Vf8a*zj4BFFuhl})Y3Lgg(XxT}d(QiznW0`6VJZR`n+|Px z(;S_`3A{_fe!jUs&C8)t{98Cpx&?<~8dvJ4n#SSmccs&S%MvZkg5?K#>5o{MLw*o4 zf5gC*D{`zRHs1EilU~Mx>=83}Ied>p?N(#x*djgSgo23>Fn7dijG>a(JYn>rM?f;= zF?96kD3nq9n_I zlng;EpzodB+fCG|9wmFyA$q<6d-BUx`LCW1m1!8vGipM|T)7+dWZKD>h;!58O zb;9XdCloA4#1>HbpNK;~LuLQ!&4#kyE${ywh~j&sHMmmFEH_#-85)4_C4$rf73TUS zQ}Nr~V>Gi3RuQU;s!81q9Sn2`6kG8b#lBvC37-s_e`JW@pJ5eRK0!4;QY);xcJBeNM5H+Wp2xHsI0in{|9H_YT}da1jOxj}d=0!EU5>HtM9 zosfczS=-DiMbcuAtx^n=K&t$5|cRn1JYCq@uyMHE?SmKqa~Dx2#+P1hima zMX_8*f3aK!V-H0gg@qiTzmlVK7_qGY?R`ONF4Bd9w5XL7AHEzsW^e-cI;3w<2D}1I z9w;cMf37P3ql8qS)Bl)N&{dyk+Y4%MuhViI)!rhf?KHRcU3%3Ru(LISt$NNTlS+`y;+xN_sScFgUt$?z9u6&MKqh_tq?r*`%lsZyh)zo{d-LD1r zLy3bg%CD?76u|4@nkWOFr##;+R5XNV*76G;rer=1q%=Gb*Kj?JQF548Kj`{a6>UDso?-ymA5$u8CiL#nVL)GqzK>~yuHR4IlII5Cs8@x2hKJKU+JF8L`Jtj zu+@XS^|ZF*zX$qf6^3k209oX#UodR=e6^Zdc~eNV!E3b~ zLh$p&A))G{=U0xHQ^@7N=}^y*@A&-6Gx;~?UY`5BMtR1p36*D@_l)H^qrZ3C@^kg~ zJ}WhZs6bZ*liwVTSTDJY*}_kWIjRjc(sZYuq|ne13k)X?6_PE`RVO`%Iw|Y3SM zaMEVpJFSXe|4zrv}@`6Y;xD)T0mM!@Gl2#*NNt4$Z65CUqC^( z%j<6do%AW{q&@Oi&!SFRh;A$n)(lK)m4z->4u#wx*+3eFN6Hs_j22YkP(eC!InJYZ zBB;FHnlcRnTJ zopxHOW7d=@aAr-l8Rl`pf7S{O+lt#kU*iPd;dg@#Z4v#k{fSQmm3i5^@CoLneMnW| zyk4Mry^y(`O)!Z_Cw##?Yz<$qod9dPVx>_bMNl`vo${QOMrCg4X@8+Be;<|#hg6+w ziQs8(7>{NlD`m;AT%!DsJ{9-3DI-FLQ%1te7kK&wI&qf4m!1k(#pq!UPJf zy-ctjUvRscGG;JkJ&PZXtA%p?iVoG6+5?ZD{LTuaEH6MIf(Ouzy39oM3;#kbQ!78U z!YJJ4@O+D_+Dv&S)54J;;Y<4yO}I9j=W(Rx!7z{2(%Pk&viGSeeJ-Sx^d!%+^t>4E zc?Pc=9tgIqHwS-+e`>FloskNPt?whTnRLjW8<+c8qRBN-@a$0KI}BPUOgIJoG9BTN z(npAz`o_=yPcde5i!b&lX~alT8N+St8~j3kf4NcYS5}~v4t^Nb9_JD16H5Vwx$i#0 zl{7yQ0e*zLqt~*Gd&D}4t6@g=r|E>R%M0u5d4@*C)N@&ae{TkS+&O}8d7i`fpdd(b zzo^96C+LO+rtD9hQlmq+&8{LT?mjqa_m58_$^a3G?V4-MoVVCaTmigPp+}ns976(P zgDl$W9o*sgobvEDR+ZXoHwf2cZK{qn9uhIv&|Q2 zIU^r(fSxeO&MaRQ79N3j*0&KLh_bidwxIxdC=Js6Q;#ySw~6 z9A?)^smc}x|C@;6I3R%!B`DP-fMI|;x@%xrq8ZjI7F(G@vDSYh_c%;;Ug4)VTI5XYZWW+Fq;=f(#(LCF#$P}@ z2H2;d$YI^eX=`$FqpQ!@r#SB$L}Z{haU{(GYvrD478Vj2!4Ta0&Apf_y;$cWkmWv0 zuw{^GQ|?#{{nMmOL$H<6E?nvNr?tDjI<4Ooe|~z8etNrcTK>mkS^?9ZoBiBrbrT*b zCcG9##nX#JTas=NfHvG^#+=E+i>j}m^HYRJO!7TZ(&K1H#2{S9uI1q-h ze;$45hHnMiVF#CAInJL5ja5OU7&+Kl0V2hKE5MHmxE9)~{8P=#=YR&rv17$dkah?0oisr2e<(ze^t?w_&;fPcIxX)}APtj2B+e{e*F$Lt zeI)u5r(*Hp5``}Ll3haG{4JxKSCZk_tJ8Ie=U;)G_kHrd^wLmw-$6trR3PpO6P8Ku z@h0f;wV)^QG06ldpNZu$m_>4QW)XPFH=)9CrK!gG{!!1jcIxMkck1UI{-i)be}ZZA zKy(-Uac{w~;7?gDCYa=mO&tu_b9pC&qImANfZG6#tg+uhGov?+Iwr(`o2I7Rn4Dmu zxbIy(*$c)} zz53w+38o(Xt)ApbiYAW$@-T6>e|U8iM^Dm3^0{Z}49snEk-I~+OUbx36^FrrSIZOK zhNtn11qPJEND@sLfa-XYs4>9f)CqNQiOs~7{*AUG>L~wv$*6wBY!1_ZTP^3oV8&uZ z7moxJvA5cuKANmS=1~nV8{4l8%>mMbGw}F#IC*nWE$?4f0uIY1$VY)^e@>QND8K2_ zrBwd#w3YdCM4fH$nDMhKiqr+-mX-scibY@)Q;R8n!>l@spo zbXY2cO&^Y4^7SXrZQU=nf5@T*_u4NM;1w0}?YMcmNxg0=CYLgS5m*r~)KoIAeGp*> zdW;Ez?*h$#lq!NhM#W=nL_GhRTU1rKX?0Y->WTtxqqP|HwQG7Y&pirev+^W2w-yHb z+y)F>Ty;$4kQ1h@3H~g!{lGnD0zCohpcX!r++FYoHJz(J_dy*Df8s=|yT2#}sy34q zwp0W^K%h+UciDj|d=GD{b2XxqrBF`K;E}HV-@t2VND|>aYDZJkN`@&JQVYH`I07#O zs(LQ(g5QI=n^+R1yzKln;2tSAmGsEpJyqxZVf@{t=`XTl8IRYo<3^op8;%c#@qO1j zedB9G?B4y@hTqhxe=~EB7KZ4&hpyIOIJ3|;y`kBrJpA&C_9X|uyr_N2!Y}KzFJ#Zk zbbIE|j9ZB9+u$#Kc9pIwG`cr}iQ&_Fcu8N8u&2pf&tDu|$7J@Fo9J-yBe`N*=(j8V@Xv;uu1@Asy z+Qm!TxaTSmfcabitciDE4Dzhu&tmR`R5&H(j!D+eHJiiErLl7vc&?W79u7a3#m?nu z=eC&Hnrj{p`o#=d6MFg(7fj2lVgyWK&{XWPjpRzR$j9C1iY+eiU4`7Ys9$|ZheTl{ zpwXv_(kWUPe{@QxiqT8?hBzr(Z{$ipW=GRm)IA*C;I;@-2e&al2Hyi$yZ6(k2yIYE z6OwU$b%`k5mFkrCIx}m8vIyD}vEL!I=gq zxExG3!u%0&e{8iz ziu?25H8!Hs^jU*&A!#2>A4I8=hc>Bb?E^1ZU7Kj)Jzv}|T3Ve_D~*oWit+wIaNz^> z8EC8f6lCw?ePeL^a-Ig7haruh?dber+(rx8B&4kGTg=y(lT64mjuD*rSMZmnxAwtJ zuiANgi542iccCM*7QbZSX;VCge~h((mz*(~_?qB6R5ogW&B|$v$hasr!6Y?-`YS{^ zq;GA<=k=GW_{dXinLM(Wu-!P0~)~e;SV;FYGN| zU$+;U9z4V*lSmkOF`Bt+F@QH0EZn>ixP~AdkT(ysnv6wv!#2pH9}4lm&(@=M4>@T6 zWK0sWAgZpzg6#)T>=!;{#PFVaNKXpz_a5UHtafhW#RxJ%>Q8Zjn8-939#yDC39kFXYDsg}+bf3au88R9SU zqQqb1sVRbL?RETVe~;^_S%yAvNNsY8OIHbLhBgqv4R`+8ScYgjz6)#tTe>)w#Up`gdrUs{VKmBnT6eeFz>IYYi>VA5_W;mTLZ^1v8bwB;&M)*BW zwryfW^b0jgy8OwkXCVdpnG&ThPtaJdf`hv=I*og?O^w2C=I)D}RJ$LB;>5$jpGWsD zgL+f~v~%Et|6r}b2mgS^2S4LZR?0gpXXJyw|7qfbe=pr*4)MWPj|-<_xBey3pkl{O zf#xc+D=nNCy9{+1@nWwa?S;J9KNC&+(=lWmd!lK-sQXrEA4bz|(2*mElL<#jB13fK z??o%hhsM?aG=&%CXJA&ZHisAG+?mx~>Ga^s*@MG~;iECg-yPPPR#9X3zx~xjgWdmW z(@$mhfA{`Kj!O@0_!o6!!w+j2Mz;PA?wBFj`d?8NBwMF;@%~hrc=yaRQN$1KLJ=RT zWMb-1L#F;qh^b%WbnnjJf7X-+(K(B{h4^7dB5mnJR?h)62#@wU@TsWf1BPpg-l8O*+?RiQf}#tsg06|oPfXQkwm0# z{i!n~5xKPPR466L6~FC85|M9f!|w3E)b{fv5m|5UMgEX8a7D&0jK&rD6Ak2^sidmhJ`~PiOsu4E&LQbT{yL`fqQOfxl;cq=CQR z$$E8}Vc-kT-N66q)kp&$Vz*>Ae)DRT+4xsV)n429E(Dm-`NVd(^21btvll+29&;)` z7ZXN-$ES+^JZLHSD?!(fS#QSO^hipve`~@h#kdU`r`ye{Kt( zJ8BG9dLgD2n820#5t+AmgvouSr*)2dBJNI<kMPBXkzMvx<-A14VgOZPPoD zM;1M;H!b|Y;g4H>bsKVka2rZZ*3bHYJN#V9SDzvoNWJ=nAWclRBiC0+Yc^NfmpH>( zf5Ca5Ly*A|^9asMYQ;Y~riLeae`n~B$+}#av4T%#Z5J*rlw`K+GS(4|-{Jm5Mt2;3 zubEv#zcrh!oELeutNHYJ{6+C>Zd2jDKB4>g5_u{}n8vL=iYS)%%*m_M$P|O&;5>*6 zh3gYS*Tc8?h;P=2Z*ie-^!D;jdb?FA!&C`N%)>eFcb!K0`)cJ^ir9OQf5}dng48Bg zn0|k_kI4tM`U!l#hvOIE?^5{0!RJ=^S!+uoZ{Ke$iD+mI+NuoSh@%%yp2Fa* zPJCr6#_Z#U^WU{>zI1?Le;pZmbSdSSzKEs`yJ^KnJ~k0oju)y_7{&7wjm6p}cWALZe|h}OnKP>BnrAiq zK2+Owcn>@|yN+1cl^l@W)tB4gNdJ|bMIpA7SY5!V8nJrH5 zSMY=mB@G1_6cV6qBJQ%zAyuH?QL-$3wn=|a?MwKc>fmo8er55q!Bx@sBMsmZu3^Vv z(xc1dR|<`Hdf}Zkf3FUO@qEga-bhW>fG*f9hKl~sg|DWve25T5lY0uckrVtYW4Mij z1^5yU zFLtQ{$Rq6eDYTo3q2%x!$SI-lCGiC`sHzU!L4yc)2nTS)L0ngx+*U{s-Ctnxyh8WGz~18UCw+cNf@yPKhVa~R2_ZZs=pgc#CpCoU(;Bqmk2#3& z)GJ<1e{ufXYEnuuFM~hnw_y+QvWJYphnV$;DB44&=P;Nks~|PSiVyh=t?BYq6IY7) z2$ZR)ylQ@LP@9$dLKx{KTJoXVVpbx?1EpLYo?%#u>-%P+$8KY_sn`CHoCym$ialz zy1hNwj{n{hpbnO@@16uxMcakjJMK=b-2TJ#l$gu}6Fzl&$8{CkJEl4+t=ofl$2|d8 zZU15FK{!qdOoQX#-Cy9<%kcM4?~bFt!RfWzf4KYO?O#qky#332swm5?KXxG2-BrJW ze>!?|dc3K}{Z1Iv-`p5ul1E3~_KbS{*n7<;d0_PGd)g1li`Wl|n-;M}IyYidBuCQm zuz$Zt-zC+SZ$a(NauBYYEKyaIcrG&<-U?;Js$<9{1*4WIrI0yFc+cRBf=h<%zzx*E z;!AXdA`BSY4tFB?oK=ia3YsswrQXwMfA-YI^cdeuK$cn2yrzDURn!x9Fw9l@{%)PZ z3l;io4FuTDKU!D5Q-0=d22|?FGt%)KhCW^O9ZOjpCp>9j3(|=H_1*MWFwM23P~58% z`A7((h?xmV|Fv4km2%%CpArlkeN03Fo}g#o?)x9_jHT3rv0R!S3Qo0aJ)JiIHLg(QzhETqn zo`Z?BnklB8HjwrGW5RnNsZk5~aZ|zl?yz!epVw)-_6XdBouZ`$f5E`EmIaLn$3wvTQO<)* z6lGzugDAd?J7t2sIiw%O%>M|s;|ucyTX3F}9`_07O+ZU!`;lm-{tM0`+}ad;3;Cn- zsB5w25+v3>%IBvs@eW+{i74%2&tD&W)rdOI5N*xe>ZORe1n<-K-vua)i0JIybg@gO zx+SWtY9VtcG%MKLWj8x*fB&AJ0+smRJcsXHs!>6$rpl(!W`escqntlq(z+yZv>@yy z1-?Qv_&$iZ2_DCJ(y5j@=>f_{ydDAVd6)r$+c3ydmS`zUMi9D)Xwh#Kl}fhLk-3|Z zStkzQ%VGyGLTkE2Rz4;UNjPU>3+UX2zGX3dnN?H+qDL{izg99xf5ttI%)KG}LywQc zL{v^`7hD|C-+R3N+tW06q-Oq{^CWd@O%ZD9uasnbW@d{6nqkdic0qXcf2Ay=Of2A{ zs2yM^@gG(}mm8!vUHrv~hQD~B#($W?{6)~Ay<|V!aWvdptU05%sJ%Z65gUhj1T(=@ zqHfVe1yU_;wTqrwe^nl5#A#+tt6Fakei`L{xV{=!%0x=4dRQJDe$ScWX=&1{1q?Sk zqz0OP9u}k>cIorH9MH?Ir`>ygGF#_qq@EVdkWNEN)K@LRG-TZv#PT3~iqZ=ln7 zZcMePRv|piXGU=C5W!OsfJjx^Ze^rg>yzr}9$%nZE=c=>0t(BXz z;We4Hd}gh;Zbh-DZN$ne-y`uq`a)25V0=kSy*Q-8F=U6>a!B;W6kh_)&nD*Om`WT& zYAHy=>FXOtqv_~MqZx|iz*D~L=_j96_mJ* z-jG8=f4`iN|NKygy46B<`^6V&Q!E*?WPzV=hY=Px`DuOfl&VjjzM<*SA``IvN z{Cx?VL2V{H+LAvcqN(iX8ixVh&`jWY)yaST19oS0b1)6Ml%HH7$B@%U&W)KlH`~TD zXkixFiD{{#G(Sz0zC;J7&LukVSrmT+v;ePq0+YSF}RUQnNUqb`b`=8)c0AHP+{L((PdKD~ z4#q=5c<5R3$y<$l=Z9WD^|nY*^u1N`6ByE8XWBSj?lX62Vq6_RyA3F;$FoJY=k@$XFeWFjj(Ef1?|# zPr*~52+)ccs00m4T{kKu%ilmQB`!?maT&E3-?kk3qq!hzzM6_GLB0Cx1JTpJ?<&bP zfvd1VG%KUax^lbH{k9#h%n-?uMtvb!Ft}lm9^CMsa6I{Y%dDp0*M|N|V6*v^x8gtU z{w*+GR+?PNOhuX97&mYg^5<5-Nbt1AEnC1h2h5!J07Huq zYD7n6)PbTF8(r@moenM!4(VozDo2DD%`I8XW#bkb;yo}3OT;L zbz$hXAK7ieU7l9+G8ewu{ZM$seZ*_WBeu4u*SdZ9N&=>aLu=T@zhy5Ye*nnQ>^h}k zs?`L44zWMSriQg8`CoIh1G#aZznDmIzF9c?h0j!spo7nB_dqT=>8+)SCNRBI%|CD} z5tfMhjBQNmoXjwS4$3c2XDqIsZF8qp^}z9B;6-qrLP2qo!VR5!5VWOJYLeQyj3zlZ z2KAY?h~&Cs(=;<1Xg_Oa>MQi$nJlTo`+0M2))}&DUR|)NtRAxi@a_MYZ0z=oyI4f zhmy>C?_M*DZV~j0VX)cK1*r`x6Qe8iy%wQ5Kg+yzu(q#-Ipx_dHJNbVf6`%K#a}(vM)ovR^or56 zzH>0V$kk?|Jznqhs;)PC-yREgoKhuwy2I{I?Bi`-kpQ#NIJ<2RSZuU<=&T61lntF3 zSsU3F-5r=36gkFd4SZ$r;~wUN-RkP@rCoa2TU1vCQX5tqtE-be*Oe3N3Tuef6jV@6 zK5deRxjwSHf3Zyuun$$(IzDQJAyw9!SZl9^Dh#U$Lurh9qsoG}QBAT+;}I$qRzJ{j z3#7dm&5k`65!^T867+;lyRD7q9DBi|EkpNFD5@(Nm22WkXW{;LY_3U}qDJPwox);v z?@XVYtrmFec$j@)0N5dJLJdqFg%`mJ%)8q^u9M=Pf9$q8czPWed-r0Z7U6yO3={qH zhVj*-v&08A?aYPI?m<6nHAq@!lPW+;H9$ggYo64(p`RiG?mVmLpJe8%Eufq#VXky3 zCNRUyf90ibk*^!Dms!<1K@E88R(_RNmgB8k{A<3%b`w{MyLckwsm5$uIiq6SEx2+6 zy5Vk^_j+vCvkh!4OCI-JjgPGYOXFinN}rWB-at}D#&QsSZKxxvFsumQn_Q; zd70lxGM4M^Uu^<^rxwJ7Z?2P_6=hZh)3)>ff5=jPiPGf923JSSpXcZc5ZuN&>4l&> z9Yy<`(m`I@SB%@-?`nDUz~Q?I>epf0&v}sMfme4x9nKevDydJAFX-^cf-$u5(qZWQ zi#I(~TwL6uRJ6xPl@;<8mU?buWpPDgOfeo+6kGNcXI2(_0$IhQeX;SpT0z&tV_Osq zfBTbmRJ6rN6?kJUbd@(W{}x^)QrJ#{XtoHMCq&;bG^pns!(Hb#ZV&#i6W5|X3j0~P zekv#%U;p6V=zLk21|y3bx(st+fW>G-Qj9;0*0&jEa~XTM3|zpK56!cJ3U9*wg$Z~* zqnb7t&|qhA8Ota=hC!d@c{tg;C{d7Nf6A_0@m-Pg)D z-ek-n1`Y2}jr&0Lg!cKimDoV5edH4D*|8?S{^E6bhADAqFA@Xe?GEr zL3srt^D6A+W;j_;8gPG(|6IUrh|#XPRZuHSMw;9kh0Kqlidad3-uR4>ecgS_N5g|E za?Gwx;Nu5hVK=*~3?{g+{!gwwhM)Pb|IXB=@`P^Q=ge%tC9igHwlUbNujpxugdl(zodnt0T%Xrf>k7jv!(f5wo*hChvqE$A9^9~>fTc??ds`|mv=?aACp?S{|r z{)J*n=ePC8NT>b_cxz;Q8@B~K=11W@vjXfhH((0A*v;`;em|CzutC$6 z+906S2F{C0j?WowcD;nK_sA=h0Es|$zuT`fBOi;jQ_O6zgV$l(!E?`4DTpfZw108# z8&OgYCFPWfIP-_2SfvfKEIr}Rh>14|mfh+x{54Ve5~nbAa2L1s8jRL_&i?>i@QL~b zJ|&S|)elZlEny|!kqq;JN+?j=tEa6x-%z%IWR=|{eSWAJ>+O)0HfHgON%%EM*^IEK z4;rK$VkY<{70J+4$qV1lJn897=6}5ZbinAHvX8rKhw?k^HY;F^glsRl4fHTLNE`rYx_~fg7OxMHTTj0aPXR9gRG#>s=hR;m++y&o%1%Kzm zXE}Ve`3rpBg-;cH_QB^Ed`$3Zf{zNH{?I!X!o79yc^ckm-33TU@vDEPnzGH%iFtC|<{Hu#Akgao&0gZKwhb^F3I#DCz`x2}4Q` zuF>;(_Ji9%Bbh-XE#fv@D5y2?Ee5_#DYor!UtJ6x_OLz2k)G346NWvGX8SzN{CRFn zfL*>$%Sr-Q=_-vb<~GEa23)@=uK2=Q+^-(q7yJ#B0)D!rxZ)W6RDTNsDf8e_1(($E zo;tIFBwV~yM@z%J)Sw{wtL(`%boK0Eny%)&Pmi;jlo#P2xhQmA2%Uc%&o3GmnsA5W z)Bn<;D!2WmL+yzV+H>o8AM)@Q9r7p1-$=_FzB6Y_-{+=3X|hED`*Fm@EBdwpnxk z+eqD)O^3PfbeQ{2hq>=`nEMWZiFei`+T54?aF`xUE-`4fW`EF37|zZz)AXA`T!;oT z8>1tpvzdZ?=f`b~h>xbq@{i-$nw%d6!@0r(H`81J1*gsP=`-)0HlwQSBAi&gUi{@;Tm$F%>|`8lQx*@GLzvzm!*Pr^5LB& zw}T5EYmRiGFJ&$?P6q~m9B+b$yFAO%=Uy*WanA*KUu-(>KBD;!B5rvpz)Q8t1%Cv6>(wj%xDVzmc$NNJ@JYTT z_h#;i%W=cx%r1KezHxn)as&-46jZHHlGSKEnAQqr(fXH{t-qv|u{9V$TLhX)i$8D8 zramaJ#h)COj_i`KbY!oJ-O`cK-WqPLAx8GDFkBtc#uc4(6rJEbot<3iDO~NSTa;|K z-8`&3(SI~Qp7dKVCOd#jE$y^KR*mV5D%3s>|Mk{2h>*J7;ZF~Ym+Yrapg$XP%v>o_ zOwjXia^s zcI3aQRa1^vSWWbbasI?cHRULLT}R+AOn!)Ahkw$+@sfj1A5&8fRv_lB=cjFg^K2G5 zmqk=FkP0Om%Q5qwStCqF+A+j=BX@m659eq#KwmU5@{v7S-=+p@LAKKxX)5w11~-Nk z;nFk8sH9R78$z*#$GTZX-y_MO=R!ojMTejvR+c8xHg(ar*c{RiVnt^k+%WNv!iM<~ z8-J!18|Eu)K~GVdNliJm73u(-*H-zRf4AeZl$xTzPe^tbL%T^D`7o;PYS+1g^j{xt4VjMBiD=|~>erdOSydK~296b`g#{a8bWrCGE zT65^~|BttKfp4P9;>Yu7Xi8frMJf+Ls(%!%mPe(aEd|X$DicYus7Qf|xM&yG$08&G zf>1~c4P(^xvA!R>KGxT|=qgZrB~8<&6rn8&1r!P>PKam$g+8G3JLlY)G;LFKfB)a- z&xdsG+M{O`1H`)_*do z_>eXO!fY#Egrwv$)fW?g`yCNZ!zr|5JGHK-CRdTGtKZq@q1-vg?MC z=)ev?^2YA^udqL^ScN#)_e0-g?uRcsk_3W|1nEDB?Tb1!|J6dSnUw1e$hD!TkH+qN zVTO2OO)JidB`Y&w5lS3L5BG(KpMMY!iiQu@B{07bIn67tLI2Zh6ExQBi3iX=(ii$c zx|8tOVh)hY1JSS+XQ9XJGAxHc=-V#|oZp@3djt#p>I-^g~6UD*JuNe`RDIXGclyWq+`I-&BWt z(Q6z+z+4B-DE@O|i{PHhiC+oTQ(FiC(KV)es!^lq+qY_JLSNTH+37Wy%NFVdx7pxq zH7q_ZII9JCqz-Cud=Neu%Ye`DaveKI&k7@NLu4650^RV-?_;{3&doe6EZ8BqCt23u z)bZj3BsiTRHG()1I?Qq~4S&Hv1ZRtO>5?kT!K^jnj?&ZiJJFo46xHs_f5TTu?*EyQ zAotyZ7T6Q*(&@#vgIUl_!@Unf!PQU-!TPA)DdO_(>iO|U!NcQDP_qO&JBTl9{9V=g1hY!1B&^_TyOnt!Z!6HZ!8pK3FD zvXVok=j)F(KRvKIU{Eqy2hVR%~v=8>{jAd?k2W(RZa)OhEf?4<6jPEcIy{ z`jlDfvjo|XI$U^&=ln(M*hn4-1uCZ@Kfum4R3uP2`RG>qBDawzOCde63bHK|Y=5HRyOlJYgy*eiT7-Kl zBy`AtVH>i&YIFdjiD|IuYpiR~hstUTcT)ga6;z>NE-ZiTdR~aM`m@u4Rv$Yu%JFCy z{hFpnAls*xch#?P{*+bJ?EpTZ+X4I^IDelxCVc*mupki!@agISyl%`NIe=IEuP$;< zI==Gv{I71gqkq%?YQ%xlJI}xxfFA~^o`0Jas%O#M-u){Z6(o*U(q%STD4#E_>X>!?m0Wm2+1+(a&|8OA`z$gn(>sU`PtH>~(WT9%B;7bXFb1Ux4N?kY9| zq?d<40e`bRteZli-u)dzThQh4=OZK9f?khDhTF0@qAk69Jr>Hl;ni|!jYU>&6`@cJ z_X_1qY05lB$nh@8Q*WEEhug(>L7wtV98O+o+*N@sOa-e+IMZky?kN(u2LeUhXfN=K zeIJf@#KCJ7abtW-b5C-Gd$}~9FI?Da$TAqMNq$7y^~?C@-1k4`P{xn4+Dr!L8$Rr@;Vq5Sl)d0nJuj&Acu;U5r17P%zV91bNT ztp;x0lnF4jj}8tCA8IdF%+(e~osiB+zb#8ZE0=AKA#Pqfi39?JVc$G57sm2}dTw(} zK7T*l>jN4hST~kDI-ZK64|4pIUi3i(aR%%`lgYT*Ch8Cz?an+g--wEo1s2gdju-1; z37b8^c}!O7{k&vmxN*>B^Wt%>%0U~Y?eXJ~;((rram!c=XMrF5U;uH3OTHrEU@ z!W!}uy!NTw=8Ad=6%}2)uuYk^t_M`3@9pd zQlL%40;R;TxMyz0H6ERZ!RigP>VM3gc)v(bXc%{^_c1z3H^Dt()JXj)zeCS&_|1%1 z1$hHdV)N1P7}9ueBHOS^?376Nhk`pfB`ps9xk_0u7J}$baI7cfRSSKU75agC{~yB5 zVo(dA=Y*UNN4?tK?-{yjvD!Y5j%B@%WEt%7d@YMBU~zJA3JXvHuPbHeuzxrzWCbgv z^s0!scveX1MM_+-qocEsdAM=OkqB;NEB~-b=NN7iZ!`*Pyc&|&>c~Zq^wBG%D;TfX zK%>{49{lpE|Fp`{_G&0q!~EYkW+PxU%;*jx$)^E%CzTkeKY-(%X54BfL6sh*N@iAL zI>rm`$5W^^dUyUz>2j8m)PJeh3p)X{=tPee{q#X+i@MIe3}79oN!g1{_I_hM5zG}k zl6F39gb{s&CP(~M5=5{Li?wS+DZKql_S*FkH*&9+{qt|h=0@A((7UF#PrP* z_eMBqNk#JjdmpkuXoA(z>YgH7Ig1ZD6@8KGYFsd`ne*87-08CZBPfpV=L+A zX5V5|HBIBC59Jto*+Xz2M8O9(czgda5p-ju0Ic`EEbYb^GckiG}{i--Dc{lgu0b#l)RJNG_ySmGn8*kLu; zVR3n4V?>8#LRof$Exp=t7(P$;?m`8TB&z7hh3bojo}qy`lYMAJ!oHpq!yIeP8>&OP zo+IaceCw^M$PNu0lqD8VmY*)iCH8xSG3QENBfRmP(OgLqVSk{XrSmvgf&M-m;f!mg zO{$V~9tn*nPJtI4Qz~<%>uLRMF>}sL`q%;YEVE4{B<_q^Srk#pI>$po zPSuhJQRSiZUG|WM`6&w32<}^S&{3DMp{b^n*4U@xgvGc-(ba^t20bQP0 zkKn+0ZnKV1-mf8C&Y!hh2}e-DFnjg{WAIEhAP0vtIDhm@rGrV~!B*Li1{<1sg$LUc z@4{fCjGL0egXJ6SP{$VXhZKdLLH`b!`*RUbITsqc0C7kwY~r>~7Y|m^JA#l%ClOxi zG(3jY_VDoFg`qrz`^;n02dttG_Sz))TweTKWFQiHnRGxQHS`}_y4PCYf<7QHn>`W! z4zlkfg@4!30jMoh(*uVx!VHEvI?3EG<%vsHGCgnt*u1;7|F`}@#?K^!NuRQnnAAl{yW z#x^uW(AvgJ5A4GS6jS{s)c>n2a%G3UMDGTr1%#Hr-@b_e1t327R~k&MFcC|}7&S#x zTr1~v@NRxa=o$6<=MvX0)(00z9rE_y<%j+~tXF>MPs9EQKg6Zg!4O*o1g6(34X|*V zJb%2iW%c4~%KuKXd+!o6pU%ujb~OQ=UIa`IH@f~5@;H4RM&NO{F%?TMJjE5(b7>Vm zehmugi!H9czEi-kTs#aI7AP6A_v5xU4~uRf&7HtAk4a7-fPWQ_Nmj^99+Moit?vH36;%s*I0vKi;q!P1 zo92$0@dU#KbWYHyxPaF5dITaAD}drlm;p`crE*`-^VQJ3(a%>Kr>p0yy2$g@zm4nV ze6{Sp-p*Hb=RIGINDbaKLYB8j9bc$3FU=g<$wV^WgN%ht92&twMuW^Jd9qn?H-Blx zbs|5rf!mag;ud0H+B3oo%&oD5NKRdRI3|iJQb~j3QpK6IFnexxV5Y z4NO6~Q=qM^Q7cnTGX?P{!jy2{?a??VJ@6Ok{HokK_(||7djbo*pJb&kPqo#P$o&^bb3T2-oC%axJp=18tf;e$R%0LaC zv$!4!Kpk2+dEDzLFE)IYkM1gyFJG9T$rJmxi2>)K>us5J)?M3Rg>YPFyYyDvF2dC4 zyfRBUj(B1_^6-p*8@^_N_Y9x1z&nOb5b(Fn{tB~wpk{jqBTvplWd576 z<`1dnSsut#3$GD?!oM1!(a5sD^?@e;z5-w6;n|;WhbIF5lLdSI#|j!M4_nLkK}x0n zZ~n0HzyGC z`5R{?Tj9mXCdl71dPEA`Jgl?7i{TOs-{tsIIqFzTbB?vk(8R=xprFtO|FPLsP<#Nf zF!Hgw!*j6eq2K=k;SjXyRKX#rsxtH}w>5YXyh%;)7N~+1#eXS9{cB*HCO8qIndr`) z_yR8%jYpRJ?NCBXT7Wp@Ob@i?Sa4BC6bkP5 z?4w6F8hf*k?gdTf-GBZs_R&S&8rTau?JpzG3o@3VNP z+$M{5kXO<{TYsa8muLa*-M>8Q<6ba8)rSR^*HCvCl%3OphsD*>l&SDp4bo>2$JAp# zx~Nk<4fb1rVzH(}FEycHCFYSSXb%WEgYkl1BVA+&@2>3z)mOx( zaLK!hs(&@35gAt(e1MJ|cabtXFo9@s-WO6Qu+&OauynSL;Y!*GNdWr#KdFebQnBRm z;G3yYWVoVX!-B5s?c@)1o$GBDt*|LD^_nGqPlpUs-jJk;(};C^Ihjfiua~Y=;%7rV z9`^+-=^m*+M5Y5P)nLi-a86WE@z)k4?(UE1I)8&Qg!EA-qg~#JqJrJD%Nch3uKKpBYz)mGBDX@7L!Sb^go=uz$QG)l-NUPrF zUFP2p%i*cn0soPLdUTjoc?gyye`q#B{dj2!O;I2Y>*21VGbY$Ks6z{Iq&zt1>fx}w z!GF7bB^x!8d3T4LQ^&2{PLW9{Pf!jEnq?u|0%U$^AttrX@`PTBPTK)#_wa=(X$O?u zs4!)hdExI+cB*|hEF_z6O3(=RdI|)+w|g#UYn-DGgVb@h>KuB}3)j9&hX@Pc!Q|_9 zwaDV5Ynw)*TJbjd5Zk=bdJ@-KA2&?%CVwRDfZx~f!|dOTucZUVfV6Z0de*XMX4X_Y3n3Hbd-8);S?J>I3AU8)ZiZdtC!l-n zACOMSA(EHBi6z#Cjzt?Eu!<(YgKyl7%MwB$;8`F$if`t;Yp^;w(A6Hpq?(wy?@O&w z&O>--K(>e{c-Z5!f!;nN4NnEGlbts6AZ;mg{28*~A)R}s zT;$4K3hfwBmb+ZM1NP}J$(Q$I!(m-lA-mnVOA#H%=Fa;wYB(^kg}h<3k$(c2Ln^d; z&@Xt3bb0@CGPHIKVaN?oHhkc9hUSV@_!e9VPpTJrXOy(y)#SToQ|?k{i`M=v1eWpM zCZi?Z6WYm(Ro)gOw<#cqu|?VA1kRlSnalG2%zvq4@3Am=ZFFha@AD@IcJ$7ln7i^P zW|coFc)oZ3gX-)Q?h`uNl~!uZ^;Gank}{sQUsoza#VT^V9<@et{EPdcL8rc|kK(NINh0@r zWV*UT`nJzGEc9+zi+@&1uU>)g*@8>kUj)(kMGTWeJBGMtXd$m@HnRebl{UT8N<7)-D-<=9SXaRF;x%t2`YH81916o2Bp+x|pC7iQqTbu?S- zr9nDHYVj#KMy}@8e#A6Rw^Dzk??m^&&R1x3-tB=kX^~b)??6$Fpl?HIjdRk61th$Q z5ZXMN6DhQD-n|7+dpFW?k7FYWKyuxDs`SCa4jFIIRDJOf6sJwoVkc+w<*BHJWKmUJ zcT4gEcxGe2sDDSFZhI2?bfY#DD>bztq&F(Z6^E7MmJGCtD^jA%R-&EfpNz19$&{tz zL&*xpUWmJP2A{p$$Y8r8^pE0Ua7{jKi5nE-xR={hpL2q|%%Uw!gX2)vt;}vE^3=b& z`@z3-ZEJYG4}o_uXRYkb+NJX$ZqqGVs>E*c9x}#n%YQjx<8ongw}eW@HVCD1(19jm zyK(YlvCkQ$Sfx;JM7iDi2Q~3UFVr&KIqAnqtGEUfL<1C(%8v96? zfuUot?iFzl)Pz06nU^Hk7Iuu$9_9Zp`Y`w4*~J{xhnY$GFgNw04|7{L zeVFW?`Y=BoGKTeG6m6K$59%|aoxN(nynWvJ!hi5vPDoXKA`r!Q3SyNMbFJD{5BKS2 zR@-BJir{~wmEn>yq~hsFCsHBf`}D&76mhG(T@Yc63=zh01*FtOO-bO!1eO}P(cXu3 zc7u;g^ZFpGr_{6jROn=n@#0=HP$$c%>M#N)j+r?b*11fmh=q4Rs%4R*M0v!PCyayw zZhsCP?i`QM249!+9K_eT=o+IYm~^hK=lBE~Z7{id_2!oBS8=i)m_QTH8`W=P19PC* zm)XNDGDFxq_zAW43vu4oF1dweKnIR`FZpk*=w8v%vE6+)E=}p` zw=vnykc%S45-PuA@ZAiXVz%LZyoia0>;xbm1Xtoqc<)MlnO$C?RKseP zcj3)SraM^be0I4LFYclJ@awq^Q}B}0Xum=MCF+Cv%%P+3(Jm#hO|K(|Xcrg-KYxt% zgf4|A1CJXuO74NA{p>b;{y3H5kTxn}MCnu}a6*Tmm<>uXu~IR5jM#? zak38&z1>Hzd2wdV7WDVP{qwXh#h%EVxj>x<@)Pi~3oayVGtKo`L_+{>L!Y0Q9)Bm@atLMt znOpiOu^^cknI$K$Vz;RzdBp`_u;4N*pN@kIw+5FXZ+e2N7EJW0%P<#WI$^6i>)TSi z2v(y-_-zt*dRs7Sqcs7+ONcYaA0p}-Y9UhC(tHBg-V_*I{I9@=1@!^)Y$FY{5)F}u(bD2-EaO*D!*AkpW7?*~DJ=+`4+DqC}tg%cZt80TJiaJSe z)uqjshucgVTzvU(*3aRl<||E|sy20FN3TtNl6CF@`e~~_wvn@V`?ju$Cc<=ONAcgARKhJ0xnewU|813^y15B z#;^w6NZYyL?LnwPNGXGqlnj>gLT8GsXDJtHBPNL6aRw(Z&D(gKxBY>0trFcH4U1z>T7Ms?Y zubp1RaS`Tg3%BzJinS+`D&T#cs(__yTV>$Q^73&vS@;{oGTM@{6Rd`{|D{)t)-Xtgz;TpZ)y7<@m*uW z@UEwNg?Ek2->0-@xo)GDp72IJeEEO(zJ}j@-~XQZ!|zLCt0?VY*ya{I?QXDNhOGZk zbWkwAN~dx23{IAJ^Bn}EkmGx3gf#5Owtui{q+V*1RRnaY4JMd508eMd8FPaN z26V-N&qd|r8kDHzVVwfjX|`k~MXW@*Wl5ooZcAk{TZte^dg-WIQ!>%Fz{*%4y7Xvg z%kKFRTNc6d_Rt4l9`}->eZ%hZ$uJE@%3)@prmW(LJh7Rf)8vXjkeX=`?F2PUe}9_5 zX)IbM5{}D5MdwUfy=UeN?z|@H%D#xq^+wS?~uYQ?rV7ww&rE={9%1oF{IxenX!;{i!moRbPueZ%yB2H(1k8 zIetVmlRlQRDVGBa?4Bj5f_p{>ikXzUG-_Swjf=mkjxX8en4Vkuy(14>PUl%o zVJRYNoB<6tS8=Gi!mI$GGVelAoAloIov;7+5AV==@&ZLQh&ENwM&j~s9+zw1R=dFWmicvk3@DJSF(-hg3jTzm57Fz9IHFOs&D|(a!P3!3F$j z?=R%Pz;PQwj>iLO@yvFk#^#!077ewRqtEdM@;RQ(oVlw$$Meu+nSnX)w+(O1%h{F3 zP2M-n9izA91ni6XtZe)JR@oamp_V#EDYa?}x}|@RO5O%b4SyAm$JGp^ngPKCy1Jid z-ovf+#}o(RP)$B6Nnc)+JpoBfLX8&dt?6~voL%<&T(>9=dyTlEnS3gsbc5pu^epb~ zpC9&lPHNfxZ-lh-xTB8%sh-dkq&oC8R*Rb6wW<&G0NUN>)Y~uY;X~biF%)DXkL2dC zM{+19Xd}Z9sDG(it?3_F(@U%-@~e)v2CRdoF;Dbeo!a--K|Nbc&foWwvop0Py6UL2 z&gfk|T_E@G=TPY?djhQB1jP>JOX0LbYFcABjo#tknl3Fr{|M@fBgjA_DEwu)(#xpf zN{>hQhgUnj7ys}|zjGyz!SiPHT3?DyL$CGWR;R12zJDz8jZ82?gKulPDv|Znr;!Hr zM$4Voe`y5xLBY>$k;*g?;0HgCYL}nD^8&-qZSr|(wNAQ&S~n|PL!+=jC%6-e1^4*o zYfvzputQEhz09b20tKidOcPg`vQ%E;44_Vm7R6Eh1h+vmoH=IcBdrr#Zfx(uA_8n8-$I*O?(Yyi1KXC0+U^AOWCr~M*5RfOv<%ux7;-r7SjX9?cM0+o- zBiCGV+A$#06IIzjoJt=oZplH0>Mi~4i8i@;&7b?P25QH32TZ*?pkc#89w>w>kJ92uiNuLn|~~Q)Tp>HkE-A1#U44+C|ukC!%(`M5aGzf z?q1=%`qtgn6UBa$>4*`i_CD38-nTkM`xp%@MMFDGFxqd2lIsEFqj=RLgf-opN2X4& z(l*$*$qn!tR(DKa#4o`u3xRRjmIbevmtL8dQ^A#Nzz>DQW<9YEyKtiBOOKv|fq#uU zepd0gpy!rrTbk$^F46_EE_5xX74cSk7O^$fJtdCW$66C7TK1eRfLWjwrW8~wP zuj->%=j2C_`eBeD#nr)zES1_X1pcSOikP(Fy}eG**V}R`?EP^suJk(W#?H-{ht+)u zJ6{AY)gI3mXK8T5@r0V;?ScqK%YRqJq-vxG8pDbVx9n9Emx4>ksLqoTdW{$Fh(T#| zfmQr6ML7;wB)QJEMJT~BZwaUfhpEfLKxlYaz!c$#f!l)y0HiiG`1o15_%lMmP&D8d zbt=SVO8fVyls9W)E!c{%%FyWRzzc-a%Zj*rqN68kA%C4$aSKg zS?kfZ2-~tSo)F^G{l5M&!+(>hv0v!CR3lx_fD$fIPR690c87<@xIJOLHYtmuQ7cLs z1wm00s_S{)`{EUebg=1ck?q-dka-zw2DklaL_y@#AMxlmISnpuVVG1ffP605`)!S( zsa8wtL-4_ij2da;X`QC4e*3%Qy6U&zmZ9mQ-=5Zl3fum6)7O=UT7Os73yM`yifSJv zuNH;_Gag`21DOq0rt@8_H(TMWtS2}M1zF}4!qjl<(S5KQb(EskApoO)e_^8gV+22+kKJ-rFO1PoG3N^4+4P;}!Bc$eDhtFlJ z30Z33S~YNk8bCk5{(sOsufM%;hyPUJ*Zy6F6-XCYB2?o2duNTfyUwVgttXg>vs+bj zUyZN4?s_l7=$el(1P2SXpJZ~ra6{nA8#{jB5unpvlVL(%F8Ui-1* z?6r6QK;2OZ%}HGRU)D7*{KUE<*xW&x6Kg)j#_xS6F`sf2CVy}FlyzQ#Qp$5b&`TW( zet}Q4jv4VdL@d1&_4fb0lVu&x9vS}#W^JGMeekIc#W)F>*nZOepR|(=!{;9wHB_-Q zSBYug3NZ)5jP-eJf&X!&t*b3?M%WhkHc0w?TVPdxl_Be=H6y}0v@TP1nA^M>P4PT5 z94qXrNnvVq^MAu>j>~zNjZi*8>XSaJRM`-oitp@dLyV`;A$3Si)Vok6EmQaLQ^6;*>&{MoKPF6>ONyEzSoHBY? z9AQ&LR|;yT7MMr@oJb{z8&_UD4BD3KMWJU0!@n?I(cU{DspY-so1Dm=dH{0<2m;?V2sp^D5)}D0tqOk9>48Dp-mnI%0jM6e27`dHU!&mb}h5`jH zy|JPdv40J)bi}gB9cXjqH6o#GL-k1_q-S~*!Ws!}AjD<{;2yRBxVm#QkkFR!h$r;v zAERY;_eG~=F}@dCwyT_7IZJZR2(Fr- z?1iWsDBd)X2;QkFHl%M&5Me^F0WGmO*r_Sxlz#@HF3n{tQ!Pm0kwr7!6%;{e4*VA4 z-F-#e>QclN5?s%qTPS?%40Lpo<@&q~?xpYF!Ft`x^!Tn))g!>-xIV`_B%wzWG&Hq0 zbGu~SuP4`ouf;?qu5S17;&ddG55+A(Wovw^Yf6Dg=GPPvmCU7vVNVQ5QPx^8QMvSyGqT#5GxDANM_uVxV0hauM_wLR%ET4#|r@@#3$%cs5u3 z715{X;}BaUh-(ZNH6~I)FgSmpyMY810{M&( zsOF7Y#n00+?1}65v4gSzgIvPKGN|m^eSbFB`{V;FPy8vHPq4W@OQmy0_wod;#AeWF zXlr)gcusmR9o3j^q9n~&*(wuEPdO?^Nl#LO00~)`pbaN1R}z|~VO%IVH)M38ox8k%I}iB;so4A%%)gntg6WRI-Zp;uSe=N)7ovTC)ZY&HD8D5l#lX&BH8 z|BYz;XJ`;Z@o)#rB4@Ii1hdrV@X_+4pQKW8=(Yi2A4EB1@7UA8=(YiKHQt(em>k|cz?d&n!HHl zm$@b{<2Lgvi(HdeitCmkOuK2FhAxkp2(-NqM5It?I+XiZ1_f_`qSu*OER_COK8uA4 z*3DsFHU$s1O3o7Sy@VA&0;IMaHpP+ZSyf1Fht3(>6F zo1ogqS+!H4+V!m3o1ogqS%0-tq1yGV+MBT2$62*gvD%v!xu!z3>shr^q1yFS?bKC* zC@Nq(Txt37SPfsDt6_XsDO(8iuw20nep#FAJr?IQ(vq-_zN5>@7KruA9a&Gg78s=` zm!XB1O=R;P-Jao$5AJN2fjc5vN!M`7+NX!2ks|m)OMec65;C_}s+0ysepvTe1jbvjyADq-xz%{9@VL!vMvzZ@l1F9_-^)O`C)sqLCl`)vFDgQne#}@9|OCHUl3_b7U*J37S_kU zp&ZD_q`D~j*ndPG-7>QaT7Mqmt{y{$zj@nGEZLNsc{~poez#%O8LIZByiv)N7uc(tnqp)BK6X036P4=X0zPLkc=AK5G0yLH=nPq61l)l0! z=yNPt_a$Ym-#$0Yw6*Mth+FS;)`WA6Y|0mu~v6t~3JIEB>{W-UvX2R(iU=s ztd>Y-BHuu%(ljg)Jwca#7=&?uXE(z^lJ~720^NPGAxd{E_yLCT@nM1oCcX~Hn>;bV zCB>v7MSo)|@z@8zaI?7)j`BSXPD9+4OFW1SRpWp)ERNfRfWQf88}9C(%Dt{zJe{1p zqMuhh&m1PW^R?V2ph)^d8IWwmV^^^vbQnDXirX?hR#zNB7+E|hSSD98K=Rn?_3ZG1 z+r+bDOvj6%H@nE!fqk19c7f7qk&6CL`l_0wV}FDNt%7*cDR($bQkK6>fdmfjp)L3{ z!hn1R!JJ7W(-JhCb0f*Tb_(v~A*l%(=b`I!-K(@X92m?n&^$2}mXei$EUu&!flO*; zo6Av+8U!hVJ8vi4?36yj?IsV(a8&a-)m(0^D-ZrxBc<)WEe5Sr^UlELdd8JI04}l8 zLw{1Mj6xLY`AU^l6n(*L++{ZB#six%3>i#|%Ms!~yDydq0>^JfyuK1@+f(Gq{Sl!s zA!}@A4a8PMOc3t$a6JxJG>H8LuI+F=0oOBdJq7g+lasacX~wRH=l7ritehM>pV3wi zl8WMPvgh6NV=Jw2w7Hps~z&1E^Z69P%-Lg`MQ`dOtLpbP25ByS83qS&2`gHXh?X5b)% zuxR#vd_3{od~Q=bPpkQIb^bz3S5Gf9e26+H5|QI?bjL^q4Ov@Q78|@_+f{ zhky9y=`VK+XM%#hUhuXJpd%3JdO=@zPet+HpVPQ5Ob^`ay~{NvhT*O-gN1)qge3&) z;Z4+Y{GRi589MpPM;~BmE!?c*r#RD|B5qX!Iw^!%8W1bO&|*Ll;^=I>n_K$=1y*y; zE6M$=J#{{p)?C`al_gTbDsF9?7JuzpOhaFJ*T`J0pW+G+oZ@B=b-auI0)1SXbc&l1 z;?jPDTq71XP$Z-qtQ4$;VB(DsgvXi?>})a%dm;V^Tt{3^_ZTi1aY;BluL*`;AvdcA z+wvyWYWfPYoQ78l5DE|E`?ZLBppHwc;L^6iT?Hg#mIf%b5lYw#;r;MC1%JPjiqvI3 zIx@tAmt{Vn)sm~;Mhlny5KJ8YDpmdCDQ?a|ZcgP%t}uXr)bQI?#LcM)dAV8RH@{=l z1b;*U^yo>CL-^qpj^zmL7A_NRuvt)sAAUQiMkpb%>J_8rBv%kXbm}>8Q@94=y-;%G z(_4>SgeEwhF$|Vx*+1K5?0-2^J$7g~_vlG0unm_uhOlfilx&G_M`lwYeD>5CRR|xL z-}j|vF~lASuj~TkBk4Xynjl6CQ&TYs)xBq2TulOiXX zQ}E9~|FSF1jsAAiZdIrpAx_J<4k2jPA|i38Xb+>-H#0*at_0ayf6c7%-)%K&cp|s_ ztz*V7g`VNo&%v}6CIb&2-@klJ73V}{UX+w#I)XCY!LG@8#S@oe1wlLuZ&WyO^87?* z@@ddw*#0WL%hCe=+JAy7X+6^XCsC}p78V37 z=>b8%&APxVcn^&e^c5%-uJ@ms-5_|I#^Ft4WyPU)>iq5Vw)sCTJb@OGMtsNCa%kGaDFA6;$`eZUj~tQ{}IneZYTY_Kt^EVt?!_yGgG7Z^N4`@Sfo_ zHLwC7XrEn={qp#3Mg0Ac8gQ$DmAh4ec){u5J*=|vKfVO>v5@%_VQzfcOqlvA&^0rZ z7R^!Xo~>57P!0SwqV8#GO@C4YSE~Ut1VU?jNYYOPf9{+TC=aIdhzuz3Fob{+fUyNc zl0P`B0ea*x+-nj){90+fH4M{6TqDL;EVzb;Wvh&a| z#2~BmuDHsB0A!Hsvw-G`B>c7?2Q+C(*u>8RmEI+@C0_IZ8H(fKd3?rsc$mJz+hTBO z`7@0uGcBg7u%PzYw$w%V3=I9GEKDn7Fl#?l9xg9Ggnv@}n1dwLH>}~yOjg-r%keG__Ox}R z4_2icCAe?YvgK4bv!A2|+oO$_Gj$zuaBNl7@v=qzw2J=<{Fe1XX#h1H!pCIxON8Nd zcz+a3YT4Hkle^W()QUKv!l$Gr;?dh-_hhp>zbW)Rq>)gMM5mMsA_&RBq(o5p0=M;0 zCikRAj*39S_}#b6dQI?BZj{Bnlb=>FEF;%sc+8V3acfSx&&xOrV zj;^BHi~l`bo@xMAK&ihk{&h>NhBUXP1(@bmFN%Ls%Hhr@y7uUJG&b>D+=H#ITeb*i z_HD(E&2vo&2p4GSp5WCSjMV>r@Y|w5n=7|@fXg)1B^ZUF~SYfyGVkP&q7qwcS z_P~E$UTP*wNsP8;Pag@+{p-6okX=F|}Avbebp19MN zzRg)K_+swtK2MM6&7;ydBF6nf4U@mw0W?#iyuZJUJ8 zP0wHqQ~E)nzTKKVFN<5JrF^wW1S(lyg{+~eHunl0?b_iAg!FyvDJZ>`mZ=JOPvRr=}Ua2fTVplT7+ z+_j(`(p{M9`&eB%8BEUgq@~lMUp#-9FJ}rj6{tGuo^eiEHWA30Jek#kSi{n~kJ%(; zZx&IEQj1CtYZ+WZoRB@kXa~OAB#698jTxxMq^L1zYD|V2lSMI+{;D|K7=7K=vxnkf zJ)7}a#Cq1N&pENx<{p1rNsEk@B_$mx;)R+gu(rzuXN?TBwZK{Y=P`x1iXVS>Jn=L~ z`_v9#WsJy%|Ho!ju#D^$L9Df|f0W9_u@ndQa`Fe1!54aqbSU9TIeA6+8OL_4T74+f z6DpRI-8ULF&X!q@AKV2SA-hFH|0Rt#$7!T{Z7A8bZ)Z{8+>9o0JEWN`c2nq;9(r$t zYr}77WGnA$59#26>G^{D2BUv!_l^elC}^{6s1;ybBj6sL`oPkWPiz6u4*6Osn+fmp zHIA6Eo=|e}s*xId3=jbEh&l&t`0$v4R9qEz0$tH$y5T;nC!1~18?Kq2vYB;dGo`Yb z&1ExNNEa24&$;a6Ii>^#Cp76)d<2}37)zi*uH4rIaVnIW`!-xrl@x#aYASr|S@0Vm zxM#iwQCp<(3`mVYh7!MSqoaZ3$>(GhC`ds63ehl_sShpe@E*_YBP_(%{6vZXVh~7- zR-kEeNhB<7;LpjKr|}Tsfj(%RBHPFD?x`KlmdhSWM|;DtZ(BS1w&kmGGqiZjpG(L5 zl4owK9DK1485)_;*`9xkZALcnwDj4hIt{nEkp;-p1=fs8mBr$NV~ zhLh zo4K_kSiFVecPa4#w>FW*+bI51B|e{9`x|qPd@IGjuEc*AaBCH($%PazD)IBVwSE?V z7sM}Kig63MwI8y$`!H?+#w~(QRGcnj+)Ws_j9cqsaVs${rznTbL~iY3jDD29AG~%^ zx)*4PxTS-GsJDo@@M|hP>2bEmj!R+WyZJAjErT91y7^b(x^$j$)jPdSZoUTAR~ruY z6~HuYJqUjT!7aR9RJskK>?63%b<&E@bufb}*{EhCn2lWi(<1mbq5cxW^T9MBz0S~{ zEvQ2SGn*y|&*fHI#1@#R=r`OVzE9W8hP(x&A#Xi%#wIpVx4j=R*mkAY2cHcOwnxH) ztqek2*kEhKm)yle#s|WK?H){S>yq3MyeT}`&_I8D3ma@|@~$ABAa6MurwpnqwD|gc zmGQPKy)KAnxiq^eJysobiw}tw9A^-BO8MSdi@y?a1;Dt2>KI#GF5=wBxLS35Eq)W? zY!tUy9b1e4CgQxuxQKDJ9LJ#r$5msOadjt)hjG;y9#?rR?mmoD$5l3qvtyh(u12u9 zl^A~)F|N@4QM7UO*KXqqI<3yxCOgs~=xpN`8=P%(U}R0E5oJ=YdS^wGv!W)XcW#sU zoNt!QLR8}_6fEwva{t+3(*uM0Yo6H5JzD|%CX6)T#^UR|hjq?v#`rer#3wYK*Z}Hf z*afTc5PI`29Jzb9>NI$)j+&(A)73`D1eJeF5pr@(_EzM->TLH0Fh+Pw%pUhXzFjm`uDkSwgGm5a2EQ%_Zdsz(LWFRN9+_`_; zq;(7w#Kb&Zf(8#)ew$2ZLbFk+YcxYbUyG(uEgg>G<`RgrAEP6>E#&3b6%XMw!8OfT zJ;kI|&=!#*$-l!VZF?t7A^+!Hpt9T0?DW8vvv}D9RqoR!Fq%kCUP`q(UfFUE6SwxN z?+mP;nD|dE;$vD^Lu08SAt=LVHfnz+;bQHG-O`S639KpuT}UswCx3nvk51Qocz$}; z=C+Q@JZ=-cWWPx++-G@sE=dbN9;s;K24ivSJg#I2)NbBz&L-9sx8BZ`;J(8bPq!M%tTe8q5{FTVY)=BVAtls@Kb>Tiy|$cfj^C`Z*%-DnMB$K#78%GO z0Ts*3)|_p27y7R*DPFFHCO(Wi^`?P>`$6r5*;)&?X|@*6TP@rT`?(t$JA9$ZLN#wn zAdL2VVDR5FSa98w;<_gdf+K%j_hbNl`qX*fg75HIChT|Y501i*AbZT4wfIIGjKST= zO;wvsI6#Vc*TR8(*}}nA*TNJCr$KlmTr)zi*xdQrJXgMvFBYy(3I4l_{%?0b<0+!y z-#^6z-`ipnPXKpKW+jM1f4V};ysH5P+1-k>#x^`)tqFg{i1NHIeYEA;2w7|FlaWhN}76eEMk5w9z=``LfV9(T2(}^^!6Lw3D;yc z*xWJKOM7gwn$RvfU>-8ZnqCuO@0lt9`Il>4R>Dno1v7b6RcOk9`(bZU! zy@_h9sqeIU^qE3GD6hdRz_4(xj5dlffkqo?Ou(fbA$x*5d)gD=PJVxqD;zPYgbw|Nj;E_> z)FYedI{tpT&O5@TeSMOf{WX`ik4xJIp`i(z@DQ&8f{AgIXLcn%pG@I`#B-le+&=hi z!+3)df4o~f%hxmhO(p&Z7T*YMz@yFs@cR~iAryG#a%p}pY;C~J8rt%zYHWbgk8Z{W z&vZ97Kn-+n=nH>t)+o=bJ#7u*xmm}#S*L?~=yvRo)X%9wN3e0`&sgWor^XeI&^TEq z(VBprbBD+hW{Ipf&nORE%ie0}&b7(|Zz5U2jTw6RCunE@Sw>i1Wshv%z#i%UiIVkU z=7_;Q7-Q$HF>2UR(%BO74i-E`Rhz~?4bMeDKu0;Ba87?p*LM1^8m{=BS|Esqf#1iI z|EduT`=Zl>)y|r>=pL-9v|T+|4NyE-buS_8!|ELv|64H;v5vw{tX|#PAxDn=&HMzQ zyKdl01`##fGTlDPxqO_)kpbcR9DhRLP?0n1KF17nRw1}}6FDky@#7SqrKhz<$FEg9 z?jgKUg#dp>gH_dD6`~Pg7=;%MbL4(oD|vY(aKO+fP|rd~vQp1N2Ib2f>Ae6+Ry#J& z#+7`_gqXK-B~>i+7p`O@3)#7n7g%ViV^uXj4)>to?W76Co6!Fpq-1g>Z?Qbra3!Bn zNGgE46mEScE*e|4rnM94jVPOM?KWE`Y41dVNC^%rlly@%Ejpa(GqkPY8 zj)AnkG!%GKuvASS$CWPc2&c!Z>34U>lR%xgeXS_lzhxkN99Rfr@>d#F3`{|s0y}I; z4Of3E`Cx+r+6>L|#-b9@l!2DADT8gUDJc+6gYZbWW^`56i#V?fwaLMc-j8 zc)cdbza1q*q}gfl*$z2)@xQv{LQ)>nzAusG;D7G#JZJ5K+uIi{MFtD*H@ZlpbLKLum9-X>0BE7)H@^Ko|6#TNrocvPRf&E!>r6R5uAgK-hnx z9%Nd$G*3?j2dl1!g2M+oMZrNNrwp?UXP-9$dqggnEZi8wGi?8wboV2u=`fL)Uv5kb z=e!>`JPT(^oLdSxa=8NN%`^`z+J=YW5m<{2C(GcGbvc-i=L)fj-*2kQclpx-9wD@f(R+cXZIAAbUte&&rH{_KTC9^2#L(&`{Fc?jD|l1H)) zvJS%oBf>G^@N5r0SC2Pb8g9~l`0d8HIwdn~?FHXJco+QYQP=1WR`?#+cwm1wE^I|i zmRN4qq-Rm7Hmw>r-F#HRF~j#lC@e0`M!PVoTGRwr;8w(Qg7lv;f4; z4&aA?w*WH6i}!Whx>5}iA+rsv{iaDNY+r4`91uN-y-F*z$Z+msN}4p3#d+0u1AAoB zS0AhK1%@CCx4~Pq;On*o$Ekm+7!$&(7@s}TF5?IYUO^lEY(wqGtP$)QZp8MFI~&oY zG{W<7*G9ai#BYgc#2XL}J``cS)=7H=KaS8?g2_7jMVPD~AB^rmLo{5~7T-mmsNqHR zXcKu$f7_fU|A|>O{!^xJQB{ci@O7~~Ev;F0zdDPM#;I7cnCvOrO^JWke;i>cdez5@ zT1gU%^{IBDt^ZXLBsFm6zhNuT?fzYb$hR-M(0^o(kJweR|NJ|UBQF1;SwrVy=!n_? zBtI(_JJj1#)SgSxvh}~qnfc~>%bCUHsrM8!&Rb|pRLNX?d~UZz;W4J(G@=-qwR9os z)|`HZ6|!oLVy=0CVmN;~^S_-2qr6h%Js&AG1r>wQ=hi3&qr;XngVFVCSaDbUS1}a* zl8CYz8cNHDOMhKK{^<-?K)zrL8Ii8?a9btxW9K2oJjteH`5smEzKN=z6RDfC!escU zn3RAH~PEMX%zGc70id&k=gbB(41|`tE#W=rT6r=CBYKA1`p9R#WGjgyfs#X z9xFrj>ia?tOR5n_Z=+Z0?~9`2D5%;QizF)^I-QiP|B8RGE5?Jkw6I-q$6K9t#dId! zLqh|ov|!e#4!MW^&Or33v?aek^ju&pP;2Q;z)8HaKVHRmHbaVSL4$y5mKD4hL{Jr2 z>{k93PZkhXJv6Ub5M#X4-2EGDqP;E+rGBxlsYW5^w2Y1? zx;544Y~oIFChTB$@`5*D&z-Yh(0jbC15R>R)xgd&1n7$bTZIueo1sp-qUDUcw;}lr z+IlcN)cPh<>Sb)Yp)VyB4sCm#u8oY{E~qWy=6Fd-(H+wd73H^YiPZ$JeyfjW`+2Y* z&b@yTiTyB4#eUfIMsL^;Oy35*M_zU+USoAlOR)kmZ*{}ZHARAJ3aQP!xxY=u?`B51 zFM$=g(4ZQ=pdj6|w@vO94~od$E52@(gB7p!VlR@0B4ZAD=)UB<$C_<)43LgI6&CXb zo>tV?(`W+=7W}KVn?00hNZ1>%L3?^}uT6jSl7P;I!YQAYD?Pykb0nZ+k}2Wh2Gr21 zKL*UEJLVR|L`f*(vyJvXFco8956!D-7!=A!Cx9G zz4tp5m=!|vNC_SHw=9h)=~q@#sNC72UHLGy#_>R;yY2s>C0r>EXsnoA(G!x0LqUHM zQ671URY|BK-vPb1b5pDaE{*JRXj4=`AGQCs?}^t?=T%VW{Y{nZX|++Mn+gOQkd-&O zV{T^6&W&t#1vEPkI&cs)IhS!NwbEZF#dhh$$>-_B+{jME(n6n*%(0lY%&{bjyz!5= ziop?L1EO{&J|aeTCQ{EIeiDm@{K0>6e8TqOOgIlq#96{e?c+p zoZNkW$G!!O_~DnL&Tqt7Bdwuq1X&Xe7k?8^_UbMkd2v&w$L9>l-SvSkKhS?J2d~~E z%iI44I|1!$J?#WWsjvC*tA7aom)0Y+g58&Gc= z9HpOCu3)Fv7PmFUJ^4!uH?>ANVNBuE>v24z0|)e;3yT*avBCP4^$u$7dF<~8AN_AE zg_?qE{~H}|i}lC4Z*{QtKO28}o)qnzg6B53aGOus#1qo5uPB`%aGUpVn|D~nDk)=U zEbEMaz0xN4a01s2Uk^5g4SZ^e$C2eMx5sESI!Btbd=Uh+j$y)rHBE_#2C$|WK_Q%; zt6}kiZ6U#%m*aIzRHS_qW9^lHSkPCJMS{L69&sZ0fq0mM)~fM>lOKO*gjqN+^ajdb zn(~G&H=pg&sFA6%ky+Uq;eC)OSb8>LnhAu>TaR2sJxp(~S zh_xr{f3eXieJKk5Hcr6L!uaPe{oml9|KGOfw-m|f7(`g$;++djnr7#M{y*~W8wde1pS(Z?*`I1uv>|CP1pcCGGOS;d6=2Pk>dF=2$dc%Zg!c%T=)7ab22VTq`#BQ4ym2(>QR7My?JogEzvdK^uXvC}O%fF)$FxRV!~#beR|ff>WwZ-rO0h*b!g8ITI_#p*B`(LE8r?kF3CXwcn42HjRM z##4M(AnP11VNq;Vuz5!#dL+Dx06%7R%{5wG_nLpKt|bgll)*`Ptd~w{wjw@Iv#{V8 z45ZXNH%8ndS=@pa_;@*a^(C||O;y-z7;9wKZxMH3c4(`dTzHA%32V*DR0JPiy*e9x zbwx!Om6NN68tG$+0oRmqQgL=0p{u&4jKucWqOUwvBNofnT!Oj7=&PZ9QTD&c{i)ar z`_q4W&Q4idR9lm){@zK}lBvl(Rk4as^@Gnu7;QzzlxMUPBhI$T_d1D zxU_w==csG8;Oos-FD+;DQFz0ponrDEq_);QqqY$N6-c!hsc)NDlKLFokRS9%N$HDA z+s))WNRqwmS4gt{&){~1@c#279iNg&p9Fs#zHa_0Pjvu|GyQ_F-pYCQM4s)5hn|k0 zkJ)ZGI_#eQ>8Jmg87-~tG%Dfi0JlC¬sE)Q1svL_lWT1dSo9SSOtgy9%}+f}v?v zgh9mixD9`KSF7TI#*ngfZDtJ{r;2Oe0WjwT*A$bSJm3=4s+a8sXldvLIr)lh2aO&GVi0ZEV7Y>9-?#sd`j`*&_;C#H7(zm5g_2j*f z^@`-YSeK`VyZq9p!d>1w>(zBmWYCmA%At^;!2{B3nsDFFhQ7_$gth*$Z(sRGD{52D z7xzH7x@ey7fO$I9sCt^emNAIH;Pih%@L3cfSA_aWMQg*~befZdFKm6VtDjX)es2)< z{n?6$zW?nl?ECt`*!RJ=!hPRkUZYF7t!V@xwpaSg!8StuYLrYFt>~}8(JyS^7oO5K z_Y~;+9Gp0=CC2g?LQl|K%&amRdg3iC*z0VMvoCf|+H)|TZPyv7RdK1J5AlB&U_>h_ zm{x_eiN<<{0-Lbn?Ot>$7B{tY(WyuwFmZSg6)Uh1dVY&JjKC09u6PX=NU@f8=SNf& zobr4}v;(Ec^KH*YnBqBQZE_EM75Jn*qz2Ayax~vLQTDjZ<1mQmgB{f!%wG_#lxc^i2&P}-|A}Sz)i=w|4H{d zq?>#?P1J1^i!Q*T#}{XfcFYNve|flkk5az$)ap)JdTB9vrg%S`>ji&vSvq{E7mKsT za3$oTpj38bRp|@i+2BMOf%Mbt|DZOGd4qKGIOhV04ql3P?s?j>3##-JFmnT*JYlj0 zl|(=9UEjxyW_n_47`c6@bYfL_((PWYPP%+%ha=>)FZo&ZYb_0Uy^UaxGX(c7vU9mn z;}}@HGBr!n-BWc%=reyo-X`RhCx5v0H6urut5s<|?F%XhE*8?L?zRN7!=A?h3T;LlA0xu^xy}BZc z%Y@vV)fv?0xr~kj(ea#_yyKd?+U4M#C2jwcJnh3r&m&K}>(M_ZPmADx_MMmi`8*2$ z^Vid`LAvVn%?rYos;q6P{o2a(`Cu!59EoI75DIi*;NTnc^g0>VS1Bp%~ zRS?G~ibeTnq>Kf>7_u`_R}`=h zwmE19*~veQBQ#_N5QK)&+krRB*U4vVCcvOWBw9>1ba%etl~f zvLDE~Wc#@pyFCvDjX~mpC2c+apQWV7J8+2znARW0R%VS@I>1QcvsJ>%xv)R|>eZO8 zwc~w<#P6>n-)5({e2MmL-u~lw-7{1Ti`kl~(4mdU8142iGjg-Doay4AC82R=TB@z) zbCG|6nU5`AKxZj82SuabJ)zPM(S1LQah??=M`+~i zbB1=l)i$0-Co2;>CvbD4}gy{Ya{bSjD(+d(p^@Yed+b#|A+1Je%ha>4GBp^-ohL6-ZRapr12q1j*u? zpc5AigtxB|zOW081nhF|KmqRwH+tW3d=Bo8%bt;}LQuc8lC*2)Y=l(2FbmK_sb z_LY?6S-Rc0PFd7%D{T^&_F%x3Qwe*l^O8)(ARS1 zFzIGEW~zCf=Yj2*GfaBy`3@SD4s!;lOz3k8&HTKxtD6Znu4h}gx*31riHT-fucMl2 z#LvhXt$c}!>0o%t-DGl=*@b#rpf$$s8+^Q4RZNfdPZFYkyT#Y75f#&{djru4bW1QH zd?sF+P;Y6>(m4{K&%x?z{cCBVBC~s-OpKf##SU_ zJ%J})-Gtx3nUcC{!aBIo-5Q6zM+YzU{LcS7;>QiF}!gT2I_!sVv6hJm56wo zUd%TfqpozhIcIa(3Hxlm=vcIEiQ}@8X%wfk_!jAhf%Si6-Ss4d>LJ$k7}?T^PUVI5 zSvpnCLv~}$-R#1CEnrg{WW7z;OTd?LOT`5*tcbObT~O@v8gUvvL?U7y&dq6HA6t%T z-))I}&H)5o@&s59LMDjUJs1iDboGO%(-V^Af$Odm`##vlw_Sv^+=JjNS@cx7Q?%{^ zVdZk6hrWLh-(Q9y37`W7=s*EFP=F5f-JM7yGa!HB=tV!j0U00i@mcvd_}HIAC!mm| zxj)*|{r0GUEvGtCc*=ga_@Zw>h_2YIel(QRIp{#Cq*aYhSwU=#&?zCzUJI9e&8@NR zTV!|nEj$i_?4!0SEQF)hur5M4s%>N4NYAtSvF?An6dJ+t6rWSYu6dcbhBv{SXV^7p zvM3JOi3>p;0W>OSzWD~1#j->a455HDAv(3wCl~l`>c~K*9zH$^7=TQ!`t?s1(qI8N zX2=J7lT64%xC@hhxG1`Z8U~hiUysi~&y!OU2`C9XzK>(kTQ82^R;S{r@vhoB@kSH1 zMD>3mk;OXEO};#4?_OAdYy_`2x(6>DmNK3KUhc$w8ZRdvx(~xjNr#~{45*6xRE}MG zk7jHQWhCH@@7$*jIH`3#oW6J;_Rc=Fs{U&(C?wvoX{o|5{%*IwV+6%G+UFCiJ^ zCW87VzEweV*j~fuCGm{N_ia)#kMBm8H9miPz1veutZ6^D+ZY}!}1cmZa7~VPeSwomA89GMe#xqXg=@j28={>HBh9AG}Hp|t|tAG znDQ9nHm?M2t}5P>Z#*&i8d&f=Q7Ec_BYRlEPXefracr3X|f#!e9 zs3!NITP?0zo4dk=^NoIbH*U){^Eu~$xfQ;}XqzykQ_w$`&-u=I2LBA8KIGvtoA{6S zjEvjwJS>09=X?uty{n{=cdck-K%^p7IE^>f_J`)<+~z~b1gz#ES<4*i3_vE`JruGgP1G6j}w zld}hOel*8!t;8aDeH#>%&%w1g=c|SG#;j=hWt-6ZRFS1Q>m4)eS@5Kh>85{Q2WPhQ zZ}|f)zUcl40I^O(;|fE6_=Ek_jfXBO(#(Q(qnhe(-x{PS61Su)dnclw`>^a%`ngBm zjqe<<^h(V>f!%sUTv*hsuvVU-?_3BEEd7`@5oF zFcEyCp9rD>$Jk8V?ifl4$LbbbR~CLxrYX+WNOXhueZ=%cde*?_Ty%f*B;V!}oe5VR zp3nIm_Zaqz6M8o(x42R>nNX0VNU_zhbNR(#JN)9%koN<#_>ZHiW!6aV{%}$0pfB6v zxS&WML~_|`^K*Urar}5dN(;Ap_p7E2`#MYXyJ1Rfmqmi@U+!tB}|Q^s-!l>$bbbDU(alh>wRCuq;reQ}VCw z8ur=Zwrx)O4u#8MGHf}@3ssJR1ltXk-8R3gz=`pEd=>9CsoR>wW@S&{#FeWn5y{5ZX*Wy6Z95oENXV87~IEfgOwCN1OO((?GnHYbu_r*q~0al|H})FN@V=cV(9D3-qK>fncLI#1;}BWfx})3om~Bn##N`-h0oWMFcv`G zKX`$}tvX=`ZW{w{dvi?|;T*ER2;$^w23c`1i467mCPd&Q$OP8x4S5KP>G_a=Ogc?F z{zjmNj07*U1}lHez7m*EWS@$TbEw5^K(7}rs;VG6#_=1_F{34?c=04osCJ#2&$>T= zs$HiHth*XT-BU5F8}~$Ar{Liu@lrEfN=7i)ziDi`s~q=q7@I3PRc}*R`7zdAis(*5 zh|w0bq7sU4MBaY;Ig`RQuX!QHsyiD;c9`;I6z8)e)bxkP7(9lm!R z!7SNF@bU=ksCdsa7Zmt3$SZzD%H=Xv-&7zjt79HHo=Dw0NY3m3ogps8(7@}uN9s7&54jvY(a?za(ZG8EZo-1 zFkym3GA5!S(GNZU?LKQFq%ViBFuOPYxx$W&1?OtjJMR_0yF-t|OQ^$syi7;mf({;O z4{(y=$h$Q0bEIE-17o=s9TTdFcOhx}=ZxBMUul0iF?#itFTnl2DQ4+2^hE5rLC?q= zfUjdc#2;zO5?Y&UnJJ!qf`**f@B)rp;6turx5gECDjnCs@LW8Mj-z6<^$ZQ8Z}G}e zo6s$l-3k|U+6CZ)8y|fuFi`n^lMyUV^#ERjiR}Re0 zW*1)$laqL*0oRoZ-&L>OtyIXz#dv7cCY^tDjyw)nRaCl9CRnLtSixXIk;qOWG^(S) z@q+lkGw_j~BjVUjkFiZ0+YBe-3m>*=9TDH2ie&Oe^3f}x1o`O33)q94R0hW#IBBJw zYA3g<$G0yi$|ddnF)%4L_cuJGnfqgGQfltcy=DXohI;9(4h`|y7b z_~+6k@z1j<{`nUX@XrSqup`7Jy$jfDgUfq3SsLh+-BCM!Q52gNMC5a4gY3t{dHKsu z`(InWK>qa}MY)vko9@AI9_@S{<NA#~C^~3U}GZ*1z&#DLA zHIBdYu588$GVMUdbr-B=TRx9rz0^y5ce~$QQQ?r z!#G~S3-Lgr2W^4zz$YubHxV}+fI)*}lnm?kAf{}hDN6lbkpgyVwh04Kafa=%2op?J zkAGEco8C<5Ddqy3F8|Vj|IrbYXuZI}n!U$6!Gv~tiQyWzPWy-01=Nmv)i{3_@E$8~ zz)oX(Igq4>XUg=XRsdT;U2}@jQD;oK-{3C-F=@vzvAAg!962QEw)Y>r3WbYJ3$lfyV3&aBMz!^GgNw7KZA`G`&Uia_>><^cqQlqY{$PRM|Qc_ic< zUY;zDPSWhPyisUd<(+6UyX(=i8<_swy3I4ing5Pqpn+)o=8YH3CMbdNzMwUQS>svH z2@*1LvX1vA4TL;)SDZ^qW!=x~)x~cJN%Ujgk0FX(`hM1(L~=~5`%1!Rm>i=sVg1Nu z#DA5<0QtqZR*9SEir;^~7sGIyhVZ`Wn{WsEa%cvmF+A2L35Y(EsqnrDx`8P6A))g6NlBEelpjQ{5&7L*lm*(@IKg*}x8Js@x6gu^PP;pLbKl@@N?QmtFmZ=ShiauW7Zvh~@JgGZdkw`Oqll5a zK>QpgAgPE3>V&$Kcd_T-i)~o1<_w3{nz!iMJ>XTf!osXOoq2`J_2Zql6KrF{e5e_} zfe(#K#e#iWWt)H0%4&NuOvms4vHF%atW+@!hI45gd4LbYNQ#fgF!W>kkRgWe+3Q{P zdv2&ztF^t0pL7Evuu5)<`Mgp5p)ZMM`{)C}$ReC^Qd@MJX{iec%!wNL6xyhMs|;Mr zN&9#q;ge1A3~i<>JC=37dx1m++bBjM$MO<6o1kcY`rv;i(x-m$-ah!)>D3q`Oehh5 z?Gg6I^7V97)xxOaupCY$6T&LOWSWZuVJIX!G$ES#|%+NE)OlJTSvJn~TENmHlb)f>@*}732+>8iT z@R6qbu`7RX?9u)Uq02m>H3TXf_=ZJkHep2ujafE3T(LyrlW(=8E^RaCqjZpj%Z^|l z--$0-eY%?Ps7E=?Jf7fNuAw|&?MzsfdGCN|+z}DnsWd{V;Udrq-ZePk(|Ce{2`^25z}cI3zwzEueqJW3YU!hbMeH6J?nad}Z2@Hfwrn zNS_%F$rNTElO0Q!7ss`{YYgK^qsuuPMOT=<7(m-=f)x!{>3O|;x9DJec`XMMBQDMz z@X~R=$#r)v4z4=VFUQ2INj$&C!lo!H6%``K|0WTS62AQaXCRr4)9Wl=Ya@1{2PcvR zLxO*Mr`MvLbPC#y-ks_9E!9!W27catu|*#;2)_Z5;9&&edWF}E;z?6+3#}jbaSE^a z?J)hhF_n&4>*9)#1#nk7rFC)Y3x%|6=Gi4^bco*dj3_^AWMp51;bv$eZl62h{SDWD zfa4j~Dl;)KnO^736{YE93snBpvM$b&WpaPM3eS`4(K`6eUt`GLE^eV(2!XFd7yEx* zhTqiMi1$mql@2jaCx`Jl@Wh?($CJ-;9jrRe%LQN$4jL?$hohCXBNjU^^eDa79mCtM1t66hGAG$~?PgQ9=P z|3q4ePh!4lPr}FQS$FhuBhz5$_rBU$k3rL8->04BMvs2!`(;L^aH$?hCqg8X_}O9( z^n^4`>5NIL1u{Y(AR!i6I1e#)u5nm#c%qpUyj~f;a3`)2ONnKA1p7hm@1T8NnN6v% zM?o2Lve^3>_^f5*3L_ff#J4~PvYda)6O!TdZ~3Lp{Mdk*gk&x^@~)p7w~-Jy>`jem zQ+@Sk_{Mxr%aUY^&)fv8ZXy)*O)?Q(6z&ZSfzgo+9fJ87=)>iQw;T|MXHo50#1v>l zg7gu7@=6$RUc*wbx^Mf)paw-NHn~R1ziDX-ibzO#M6ImJ_$nU zblx}rbuGAOx%FoXJxqBuJMd~S*o369@5M7pu{UWH90kK);4cU*35)FPj=BV|;imWK zN}1b7bfLaz$M8(ZN#F%*A0+zLD`6BU361Z@YZPgH7)8pZ6bUC+!tYRo+ce&i1%jcx z43#t-u1DWOwgun8sO(%U1r_yq7x$2|@x98eBAs1^#RY#jyR5aqXw~8( zRx1uW53}hbSmj9NPv^o|eZ32LEb}-lE#7<+*+s8$_Q%K<<-9j}-EF3h8%&gp^A}Z! zvG0}|=`Lo4__vKXUyn$8m$n(TbfVjHiR}%n3rSPnp%58fYc){eBf#3if=5 zX@KJnkm?=jsspRlNEv^@rR}?i>}!BLZiiQ^&Gchc_<^uGul2M&+sL}7Kx1IO#KL^3 zg&vY_g>xFwMOp;Oq6xaOz)!!p6gSOS&&$xK^1BgbjTDR54DyDiJN3sh|4NN_9_aZR<#n4ic=pU`-=rPdG}!>@I)c8`&+@9!WJb?e8>;Yt%b4v^)RP`A&0vSt9G{i{0^aw|avf-c(ifnG2O}tb0Gf zaxa6tNl_#PlirK1uD81DSx*@xt!{<&7@+%hBm0z1K9_&9mkmuQkWa{jE4J)Wsm=m( z7RCVc{5_foePkmkBYwXZ9jl{|9MR!`JR$Ici?V=63dOOV&CQx!LR#c`knGF@TPrqy z5<{eX(oL1G#4ytBa4lCT-JC)TjC&=lfCxOlgh2vaL^%&5>J}Ug^Khexh~au^3EG+& zlsDs86JC6U4{=6Vwmbovk3dBh^ImIC-p&zb4aNzO)LnmBti39oK(v`928hi&I_C&BE#dS( zjSLx`JiD@r4p9zOU#hPjvmZI}hP=%p&}wM!E>3`t zI!*nkq#07e#jw794OQei6?rFrlAe*`T9M!C@QyfapWhNgBo#BEkg+JE5RrwKjyjD@ zyWbJ>Un_HbLy{ZJu!cx zp4TJPGlJIhs#cFayq*Q2dMH6s>)}p!uIF3}sb`^9Pt>2Nr%CQy&nHk1Cs<9Ma-bIQ zb&-6q?zxbH$xU8nbBZ|k#Ta!?uEXW?ML5kBf@F%qX%!0847}Io8*!b^AdiGZmiT|d zJ2Ai--JhD3AT4fDd0eRg7i5sLSWhZG&y@{BHuoYSCX&$^!FQC%m$;t&CB)qrc5TEZ z8P&4vmMk++Mfc6bCireY3<cmM= zbW~18KFaT%UV*IpG9a+D9lQ7^3^|d#xA5-%P5RJxAcV;d=3$SVsPq+h(ArZ{X?v(A_WN zsb4tYI+e@1cP}#1?a;Ma;%+T5O-oGD5)&}d3=82~KoO)-a2Bd`#4KQv=3^rYTdj`E z;qT3k%iyogkqCb$IpW}NF6)2U-%2Kmb2d&CYa;>c{>Nfur40w5S$6N;jZ)F#Ha_sb z)sw4x@aN&)bMjCEnq(r` zxsdION1p}nxW2E%GwTeqUXEwHhS9I!-!m_xIaV25GrSVdP>T}pfF2|bOuKh<{mbzT zwKnk%uOexn8g}pKGE9HB$EVWhLNZa}s?7QVbZiz9-iG2uJ=`^{I|dyCj%UJ5obC5M zT2a_MgEClxL3o*naxDAUPAKy(%BrmAW1KbvXKxxfdz*L@jA?dP1#VieBU61E>t3YI z`LESE@A;9A!ohP)FeGE>%C|{8hFq&Kdz0|!HucFQ`x82Ub*q1Rp!y~qOQ2!%WK!%3 z?@BTs;T_6U5fSF(iZoS3oW6-z@ZPGU!SKYXB+lGyzwl^c?k2BwoAe)2O_CX_{0Eu_=v1fhH4~t%ds>NO5${d- z7SVAfHU5bo%p{udhSoLZP= zb^v5Ro4?MZ%;@hgqS0rF7_0h$MVfxVitZoY+zK^pqF?mEItqlH7w|lu>fk?qkt&rx zAYAP)4;vZbkThn0p^*qxKM_U1gFh-tW~DcGufUr~%clFG*1{&;s+W)|Tu1lvF8`It z%8s!X)rYJ?v_&&*Ys(Mt?A!|JZW2HRmRiikrIr>Kzk&CbzYX8N6B3f3ZN&R4j(#lz zoR{qF6zg(2;zjxHPu&ipDnmt8*{wp>T5qrm317Sr&sd9ps?9~HSGKadbezjy&AA$5 z*)_OAbA{RCS@#WOju>9Q!vxf(lH1l3uekOoND>^TF^M$ZExRR_-NK+@!LL*y@zhMU zJW3gDWp}nKi>tmBD2wN6orZpe@tB0A(4Wb;RhG#MqsK!lT{p&}lj?EDRa5~{ewub_ zFW#H%h0^nXE<+7+cVN~ICEC1Ka4`Expr70u5a;$^w@{p0hQ!;Q2}EF#igOFY0eVpJ zTcb)?&rn>>NlXeMq3U@cu1WyDfZdz$FE|l5-U=(odtt>9OI^w!(wyNF=pCZ$?2RfZ zSD=?PZh?_1vz`~PuRvBJnY@)D|M_?Vw3LE2l^BwL%FKGsK4etIs2sRTqOm}oXQom% zG_5Ya<`l7XijyI*9jyI|HIT+Am7{_9wf~l(4?RKQF zTXc3`!cTc7Wy7<_}5?TCE=c%5g9>YoH`XKWxQE$H8oqcM8$HE@NT5Q%;^h+C{3Da?^NQiU&Owpf zD1W`7_Stww=j<_oO^hyv!XV?LkzsPlEr|C!r_Uz631Vr@Atl_qQ%>@=&Tv;2#(CSH$9fPY`@B9ZZOoR$^f$_?1 z46C>fe#zp_kr)EAF;46iTN`M5;ZT2Wsd?TB(!Laqsq(e7$I=LoWs#M@|x-*edoMN0pw&Bwh99yY(AJ;*=f$- zAWeNu#yqE4mpNm^;rV)IFY$?gZNR9?Fgx$#5t~mbE65(Uz}Wza9eR~v(mjXn9X4UL#(Xr3EV&TOf%*xZe9yQ#8B$^6Ex^WpAcm-i~EY z-4Jq&tl9hj6K^JP^Zx{IX6DWR9p21+8`|L~7XV!dh*y@hw@2HO33K2nYXpCd|B611 z?V3KN5&9HM=#$=IC_$nWW|VhE{uODHB!7;F6K${+p~3yhGtG*$Z+AzVc#21H2qbCg z?6@xQSD+38w+9umX~+J508b<=UP1_RPrU3V?NcGV>)a5ep7@3KSxT+#KT9P4fv)2+ z;07z3c2@k*+J@^_E*xUh%EIv5?y`2kZ;SK{%GX$gDmJYe-CAuzg-tjj4kp$R9_VfB z(T=Kw&i)Du&_Ad9Gt@r^eRIs{mjl1K@S9KkbG~*G|C~JPpTqNiL?KFSHu|Y*-VAu` zzQ3qIB@48tnWs)CAg!xU*HV6a#j;R{h-#9vGc|+kpr1O&_Lzp_`>1W+*$`~iP1LjV z&S7LuKZ1CWeoB@J(Y`rDC%*e_BXRJ2oK^_jZTa{p3~q~0L}b<3GfT>J44?Bm>q7ch zxGIgf66_am`)7-Pf)U{n4JePD;U~PMk=XhB;cN6j<-V}4k$e#yPSwelq6~cX`SjKA zEN@YO>d*4sqPUtA8n4oKlLCDFlP{=FLVWr;s-Z@OJF-`(y2Qs6pmN`bbO4bF=MW>5 zAhnbe4vL<4S}<69Z+t=T&BLTCi2q#)H>S*CDvEOZo#*6#G(0+D$KH+pr6uxN+zM6p z6y{_&8jEz00|b2?DVgb)z5`B}IxwOsHfa~MvqQryv|)E+vA-&j!x5?Y&@mhJ4B|sy z%P0}&XTj5me?2C`{A}}gDH2*D`@1Z2!pwK1M{dA>MW1rIrcXnVJ}uUjs01py1AVF^ z9Mma!7aop(g)J0hrAMLwtb?Dc4~%zA;Dk!o30>esv~a*xWrDnD)^b3og5@33Ce~7g z`FcnvLcT>P=3EszI7_jxmSQ;Soza}&FX7l7VlVmk$oM>e`L0os4w$?0uQT)Wj#621 z_Vi}OH&Hi^pymw4B!_cg=4PVJ()X8t!1uao3F5OYRg|vqYud{y2&+1N z5mK+D$DPC*^~cBK8KHSQ0WTDexqcpR%e=fSeLsJ2AD?+n>;+{JdlhAqgL`b=QDuBb z@SX70j{2+_u5+rC1m+J+Ub|4q_J~e}&w>*-QBGjDAgp>S`)?gO^6OzL{KA2t4Fa1* z2o#=wFv4hvDvFM-5#P}{27uTIk{(`fyVg6p<`jm4_#VTwVV5Coxi2S*t|riBr#ko7 z4pbXUe+hjml$D6De`e)6!_2kujFNP=%!nwXUPHAbo?$n%gI~e#x%%{EN-8Hi+M?;` zh}{~JipxphSNz>@eRCKEGP1P$&B~>6HZ;B%BFcnJD zr`l->IsF%$`lb#-B9IzKwj2Eg>fK~ODM`o6jc7~-&BQP{DuFE+LkKLkb7o10Sl4ZF z5Yea$h}bZ@z!T`KK^B1{gR_=FUdN?dODmBUz1U2ogflU40|PObqLP zr8Zk?sEqe5n~e3M%iU|FKBt8jo;MMNk}Vn55T3Ohra)d3lZ$lg^yL$Is^fbS3qj4E zN+`0Q_f9gmGq(;8=!ok1{m|w(@ui25A*J>ECh<@|LElB&Q+STJ^UX#i-2X&WWBKKX z{%1%yf6woNzG`?CtAvht6<2k@t6<%K7w$AN1hYbt?rdkD6A6D};*|e~_!DnE{0I0G zUp%bhPvq(UzvEBnyTYHCYYyR0%nQSxc(616#9ovvK28tePrQ{LhClIQdK>=4qr*b@ z6Vp`uiMX4>@h67e@MrKRUTedjkp38dqE9FM3D*5Hv?nqK1&Lip9E-wm9@Z9rkr^Ku zRY5F^X^*OKwpBw_2;o3{8xaRW|0i%Dj@?LcAS^l+2V$763mk|K+i)QML2)1`sDrCG zMfwdL#}HG)$NcXwH8x)S-(hOJ*h(=qo@&)FHB`)rf>}mJeBhc8=EPsGA(#{2Q;3Oa z*JuzEThQ4L@#iSw2J3#gRdexwl6g>6OKnAOw{lwmPNv& zAne7~i>-?E*yxDybx47$p*hll8=52GSuALm8#!Q3v1VRHX`A?`F06 zRS_X;U22pn0?o;iCNymmRXSeV>o; ziVEvK28qHP^nqYKJfx+6=eI)$Gf$@sXEE;^zOlYR!MQ3F!*sQO;+AriT{wE4V;?f{ zuEuEAy^Ih!9w7xYgFi>Rd5)9*q_Mz(sYFRFmEDEWgW)$<{Vnh_ zVbAq^N*1)@5D>zD?2^xPB=k6{;%>8MP1ZR+wV`LYc3nFE8+yxjr|2)PCL_he#%36? z8Ai#0=5LStQW8uIAN7TDf;3JtLN0kX?3&4mK+uYz9fsG>qbV8f0}O7*?gS}@Pp^Ps zk_bJPxMWFsvr9>2Jp$>t8ul+$5{7ty_nWA*DJ3?g7^yUWx@${`3I@1e)YKiH*j+kJ z;@vMg8Z8NG$|$Wyd+1766U(l}jT+%u-z?J1uauK`CyS+6BCirC`tbK|IZrDwNn^2+ z{Vt_DyY>O{uAjdg_O8vb*v3cbBbyTNmIP_8dTOFIOi>%8lj<(glwSHtO+`sxt0{w2 zqo!h{3N;mfEA3KKanh%1DxN?F(Fbi*Q{AQK)D$Z{PE$=f`p7TUQ$2ldP(6*J58tAm zM$@i)TRk<<2ECx3#?V%I)zetowB_n)9Btoy>S;V}!rH6FH9enSn#^#^ri>vrP!(qK6Zo;i+6@z)y}s$Rasz3Kfw7WWWaL@T#ea_4bek?fb1aU;k;2cm)YEE6U@ML9+BU$2 z+viod6(j!}!?b;df3{$(HoyE)C!OnjU^Et_6sUSvSRtwi;O{Z9>MB@sC-q)$pI2Rf zAMiV-3puzwGS!s6!UXc39xd8HI1%;UiHRO%OdPgDz|t z1zsKdtY2kL?r)1l5K~G8+uLp|BV`#%9$~92gH*C*;7cGyZ zDMpNg_jA`+%5AtVDVg;a;UxM#XFWX9IS>ZcQeXt2@T8@@kU=Dv=P~eSl#ca$PWB7- z1NU-YmR)GI3k_D!4-Vj>fM!ytiC=O(zkuYB^NYiRmTBVFRn6#V#tC0yV^2U4SnmfE zt{BNUdlHf6ZDcLi8Es0rP1(nPD?xb|hkO#;nu4zkwGD%3u8S>x-S@#3hkuj*#kTY?HTt^{UbV6M{jWt7}9aVUev zbHqazh0r=8gdVcxK$UBWlH&mD8b|aJ2dRrf;do@J@5gOI7?t(V(Fn;sWC8`NCdj}f zo#HS}C~~Lu#qE!EF*cwKD)M!vKg@4`Otk}AkrndNC?T?N zr7gYc&uASsQLRIF)H=kWX$?_3oQ2nth9jpa%#KE~m}e6{Ptj8q;{x&B8(~zcIs**s zjg@$jroz>wpXo`*??--|Dir8)ARI=EA#vP@3rgWm0%oU56bn>|0@(FyiykMH!RvGD zxn-m%dT)IHh#N(XH;Q3FpvDVlkYNJ`)($P4E$z<@@ zd{Y!Ysv0%R*i0_N<6mXKuqW3k6<#ibD=JQ9xxlID=nP9y#n|k{30zUhD4oC75N+i2 z0d5_`D>k@)lQYXD=~K)$pIPUf!t-9v3`^i@!aE%h<$r{|?`EBJ)DlLKw0PL|hvJ#c z;~xLYA@E?sjd13!bX>`24>%4b_+Dj`LcOkO;8(v~4@>>y4;UGdB`XZOp+qQY zhv%$9WsbY&ex#Kkqc%GeG@v~-p3y`Ej=`|EGC|FM{8j!gvr=3#!^mjFxN}S}^i#Es z5^FM1@m)bsDbYmvJJK{vZKo-{;|iW&H=QJ_^`vBBYMQ2Z=Y?#!Ux&Q)a^k9CmBAbT6?G z>UhmDiD!3ZOZNZ9d??mWc-A%iylkl#-pKCGmf}#mx+PoEBWefU;F~nrb+Q3ooS!!} zL;U^DMun7tS0nK0DPfDRU099d+agpUA9tI7-N$Kzdvc_~UFjI04(>pzkqbys(HY?b z`Eb_*`NK=@>x|O&b<#WT>-4!v+t*2<`#NnqI531)E5`QwJ92Hu{l+c%7;ohAF5{K_ zWpk4vJvE?xYz5poL!UF(+(g_UMoSBAV^~?mUbFNFJEP_t+aoXK9Gh5;iDVMDz`|aC zV@8gEA5^U28)n?d=M=M#HQ-AASqSnlr-XGOs*HtA^Yb|YhsnauFg(JVm;wts!qAdo zVp!K2xK2*H4Z~B{%|@bP@+Cz7(4d^-*kS&2>`*`d0yN>-z=AS#3W05qJ zEO1w~2V!6NZmAPLV_Fp1Llp1ZtVU)#F^N5NM#rp|-m!-Hann8M5B}0&4?2K*(3jkR zMvLL$oi>>rNoYQ+Z8FCUP&b)>ky+RSr2ogT@h{c>dQs_wH;RjPKe2KuN>B-}-W$&d z(W}>cqeyfQ1n4}U*tYT??m^w(2SNwHRBbUk+727vJbDF!E0;!lUwsf-wn5B9xw2JUdg7x)%=8U zQ1Cq4BZf^YgHyxR2Xc~^CQ|(k>|i1f<_T# zDLpsb(uiS2urBzL<{b*rs;&%V9=8Z3LLeaaDHv2-03^aa0ri|f3zJu$03x&7m-iUr zpEBby#uf2aZ3sXj36x38`aAgIY&^+2XJ| zsv(=)+1`c}2g2lFBal#7N#MBj2=EiZ=EUq^@vMa2a8Ix?tvtAYlu*tl@eP7y8nqpX zIuuHX#{%c(91fnEHDE0e!h(h)1!#qC*iu05JQ!S>=7)l&(vuIrJ2@II`0xT`06)R| z%+XM$1g~M?ie;yQr{>fJ{WA>v>w)=sZypWSI2W!xlA2K(Se{=2^}z%TR?Rs8nefWN z<{o{5jWclUPrkE%gWX>{ByWn)fxtKTvfJ=Y-@(^<0sipo;Loho1@QN8=s08W->$ie zY~6)J!nI$qX4d2iVrgL6$}&!X|5Y$He0S;#29pe3bKiu2D7k;>$z=^C>F}wRo@*Xdj4xDA9sos%ilo5moz9eUSu^|vo_c3&DYx|6 zisgF8D1_ql_K3!{GN;5jGT3-+((d1k3|#74kaONS5HoHX3N)h#y~kKjnt==~!)7QX zJxK36#6JEFVikDK!%d$0Wxa(x;>ww%+YGy~+)Yq_t~9W8MD=2PfoA!Rpg1GxakwIs zL&rdmtZq^WumN$T;*h-*TI6hYYpXm8Xtk-K9DBo2vJEvu*bytYVHX&%uI}oa)32zI z8t}ofzu^EMQM|ZY@Kk=%cM@W@M->N8_RNzP0Yl*%g)HqR;M*xmk8E_uce!G1$)VYuh*#V5^x5^ziYS$JF- z6#aQ|EWG70=@C7SxzBULVR%5=L2>!Nqj4%9CT@Uh#rxot00mgr5@@^J=f%t4j>Zn0 z{ycvA@qJCq^4`v#@WEmZ8^0%aaP@`G#LI(D|^2kTIOmCYaGyXnQe|`P8!nDrl`Z<8~av&~SF^5q9?;)G)h$nsm+q zkT<#)6xxoC1#&Drv|i<>X0*VvsW?oKHM*&eEDB}P28zV%jD@peX)QUca~iSR1M-T3 zoIR|kAC9(VD=T2uJ9~4U5~nG+JkjtG)PSY@@^r{!Jvd>J;EZoS(;XwiruCqi2h{%`xH(b!MWyl%94ta}(7LQQ0!7=SLajeSEnWh9_)_@PwB;JmK;7Pk1!K6YeEXsAs*njf>ys zlV5T4%pgZ;YHLRu1y$d2RE!$lta$U%I$FZ3^5%4O$xVptPXO|6Qt*~|hFGr(#k{w7 zDn|S8CRNXgXVNPmv40MKf-o2u1mp20W&ah<4p#7)P&8@OU#V5SX_F2;#vmt-J(S3=QUhVfKax6xoko=?R zeYH27%+puQn`l&jBWCRD8H$)eb!eSjQUt^DyD)%W)YvH29Zy^dehuLaqK?LOdI2hE z+B7pn$_O5q@k_9!$NUuhlS~AT;Mp0K!SjhnN>4PcJQ`6y^Y703nd>ntC&0Q>k$gAJ z82t4`AP-F=2G6<@Mc5pYJ7VyI{qSu2^>D2vF(D7Gk+rvfWmsvjWvD-Rd{$$yB>!;f zN$K5$``{u;EYuQxwM4R(xJ^r34GI1Q_#jC&4N6eXFAtv2ufs=JwGzFxgnWgXxJt`8 zq2-8L;v?m5$}$S$H&$r`QcR37^lbt-A2JLpvKMl|XX68>X_fz+fp zQpB6nnw9k=EM+okuj9mFk*agH0G{8+(92>7F2hPeS_epJ*!)Axmz-bm|u%K?jrk2k^L|K~dY23#; zv53)k@KTiIzqcb9=h-_drF*y#jiWv+0daguNB^#CXJ5*{>%#c1{JWO#rJaz0Ah^F^ ze9-oP9$xML6*El7^)q}wDLS;DG_SQu+fU+^rgr;DVe3Q4XAWr7IjWB;U`LFeb2-l6 zUv#L!_b{7wpc_%IOW2_FpW3$%k-b_Omaynz>dhWFvHogkOcLi=bT6Be3-%HGI&E3EqL587)V zrVmT_4l0A3eRy@=*G6W^VmLc{j%t#UQEB^4Be@6i=9De@m0rR8AECn}5jPOGgX6#%jZrPixp1`=PxV%;2lqx%cjZP5Bw~n-H9qqrYWAcb$!TK358o4|l-eHD zN|E+_eq3u$e%a!%_KZf=7KUY^-){6^IF~nxWiRL$Np9^FQ@IO$RZC)auw+)k{O`Na zSD_^YQs*0>6~Xg!4hQ8~1K#Ktrmwnxby}Fdss;5`XWyNSm=%Mk5z4IUt4vg1b@p9Y zT!_9(o>LbL%rM;9U}VHQCUwwPtqAF>_Js6REj{|cYV~LIRqybtPp9a*)K{%X+aNf; zFrOYb=F#IjJUwp9qOh*Njn{Np>$uNwE)XkaSCwMT{G~L|w6feLl;;Z7#A8l>_@aOt zRN}isZ`-8}4np+P;57~q#TJ)S;!K7+tnAh=Y=g>pREpFTG#o34Iw;?VimRMlPpjiv z97$T;u`VL4O+6Ut^g*~(l_~64~daf@x;VU_v->%I;`=BO%yEX^y@lD(591K|4 ztrc+ZgNIA+f(m${9Qj3PIloJPV=|!q+MP@xw-XU8vCX}Rw#w#drJAsNg*y3e+#a=i z%7_;1cX`kxmRIZ|@S+1s0EBm)q#Sd!YK(dBwb)3%}C8rC4(vwXMd-(J{rNwpU z8tsDuHlh}5yMIp_MnywXjdw@R+AfM(EQwW>Zl5hA|=$f1t2;MhK z3ig`gx6c!SvfiG8mvZtOZGj&RIQ{KWV(_I|XT@>QPw?E~%S_0B!sPES4J?}VO>j@% zq2Tv<#iiVee1B=6R~}S9C&;n81Em}@LkUI=Z7dB$JWg&&d7CsPMHX`Z7AQQ8A9_D{H$VB?Sc=0s2uy3)k zG%#saiEMyFUP*9&#V}~dibQK7zF@8iA65hX@lEjG`K6_SiE#3LUTv^$MkQPsS^=~R zxW4?ag2(fYW!6i%Y9lW6Lbcqz7|v-|wCbrnpA!yY|9&O@{Xwecs^)xuX{EDs24q=% zx3)qV>Mn*ih~w@eLu*>nM;CydPUBxf%eFf|;7%;&{_E8s@i8N85aU=G6TUH}5Y zYZrr!OT;+Ay_dJ!#vsxHHdR-PbA-|=`?RgHRAntE3n-nH>wjG#_1Mbko$`e-gx z71hGK%1qXr)<-_(wnwS2#^(w_C?@*m(ib}%y63!_Q$z78$Xng_0KC-&Skrj*-8wyf z;Jxa5FF^8t3{6I5-e~onPOo@=eyFipewwJCOC%9oKO9hL6H)CY!x^wtaE7|QIN;6g zz)7FatEc|Wne{03oI}gCHkajFfHJWfF~q5Nz;S~my%u$SBRJQEQ7c0nJkq6V3 zNt{p`qDUv}&J|;JU9fUSQgI!s|I|i)bte-#fq_?lCRX2rFP=YOngMZsfJ_6$p9NAq z&@3a+EWJf2BU6;}xj$u-DdixMI@#R^p;S*a>Ff`gqwfMv#CMBPj)kXc`oD>q{;zVz z=xj~@_d3z|Rjc~HXH@-P96qO*MC>TYImmiY0zo=o4K&T!oA(5qCZH(^Eyt-2Fd)w+ zE_T=pDiGPz&a}kDdbjIyID6HfI!=OwQD=o0fySo zKG956W}{a12yed|b%5AMAN2)-e^^x%rjbs6#QsA~VI}(n>HwvWsiv@!eexqb{U`hh zm77o6_Izunwjl^!gtk4<+OBPLBDRf3^EY&A|rvNmJfA`?|DO`BE8wv+Eu(ts^a;6 zUyCB$cwa{qCCXQJp)%xumL$fV4GC6f&Z5OQNLyBqf9X#M7PhjEbNO4j10pK-iZ~rt z6r1a_>DTGk-2#m4?Rpy;UH=s3YfbfkqtESVR;1O9?d;gX+0xagD<~$~E2Bd$>zjxo zU}tIuv4?Huh4)jli0istc$26Rh^p`XRCLD970wc@U?OT*d=uu2e|ruQ;tU3^8%Pnv z>RrVT@;k4x`x1U(O&I?3TNZ_=r0?M1n`9JMT}RadGf}Y4Kr(FRw$Dd)%QxkJCGn{Y z^kjG3D7aIRn0%u18X<`mCEgfB{NcPY1n$SGc4_r|lB{Wv?~UFQwcYrhlMM z*ivkPQRDJQ+hLwO79jFvrGmJBf-e%dK@j~p-|dR4PR9pM>ZAO;Z`{J0jj%o+;iHP} zLho{332=pD;}~asrr(}Z$v)@jqDtTz57!XVegqnR4MjMog$Oy5UR@L&r#k97;%%r& z{S`~hB=#rJVsX*0p<$VK28U&b*vW&|HY$6$GG@39MrIid9eAjFD$+-PrBa%N#>0?F zpcCZ}FiHQ4my>FVH^SRp;8#eGXa0F&vLdlaQ>`_+S~ZMa(Pbfso-zUcyr zP<`#F^&gO8Cy=>3YdvBfSZPJe|D7>{gtY;sN+K{|O2f_g=q|ZKUuTQ^3 z{Ae-0z2^TC3mvCKW{u?e`^8Jf#gv+x!s24K z;a9!h+|=g0-PL}72tr%9#y!Pjut9{>k*4;Ao>Gbn$M#^H4Zr}0?JKccxiJN<#+z6- zhIE6}t*je2gk8%XP@P6k!3f;&h5+H9cH%j$H`_ryww?9kFcB`P? z`8W|tz4Iw#JCWh#_XsSx{05Y;v7UdD^^U{1z}U7-$5rru_j>281)OWCew4G&<}*i^ zbEC+dfM!Yeqv;r48|gfxUW?PN;RbQN&cu3dhC~^cYQ&~XOwWr-flJK8Fy8E1+#u$6 z=n@}GAu4(Hjbhf7jL~4ZQ3QRwn^s2@t-~bg@QJQQJL}$ig%R60jdgFKslT)CjWp$8 z-9^8uzIxq$mE_{G81Fgmj74-y!cMwcbj}3MRiU?dNm=XIOwl8hem!ru-NwwA+fm@-bfCM;1EU} z+wclT?r)5UXAyD+L!G~ON(V2n4r@IDP-vzuUycI&$oC=U@u%FZtEgy7ot6JcK%=((+D*o;x}+|JYaGG}wg`J&dJzqgC}>H72G zN`%`r7$+jW)oOZjasqys@P&xXt*d}sr!dZ50+%`tXU~#YuU;)C-u43yUpEPH9_EjK z68;ZY9_CZpAP<%ghzg!Xtzr6$a z#=JPPvxMy!y?O#|7`pcg(PeO~P?C0ku2fMuatN9SKaW*!=v4B(m2Eg3olOiv@g$%J zlHo!8Jd9GO)pc?__5ttfT~lwV&eA!q5&!lkl2)iTX9bapOq!v%l62j2c+e4X!rCUq zn=F2IQhQ;fCda$vU)~rFv-ZRLTO-J)#9xWf#+6kXE1|a6H=zG`B14Od)&q@y1^E~z zcnW5rI1O_24^SjoEi$>S$bfc5!fbl*dAQqYHphn%@R%=KR04kbM2JEjIN6zirysB& z7P2KLx(9~e4(QQp$|;i){r#>AT}Q?WC&wdWT9iLC7WD8T3t=E^8-s#Fw|z>|u1D0b zk89p~ex8w*z)PP!Vr07b*re}&&@HQQ-22cEjB^E9h1VM1ARVO>Oz^4$fzxBJ#`C0& zV^Jqj4NQzL;bkZy_F2`W$V1RX?<&Z87_wwpsK61IShFxDrA{m0=j`8j7L(0~F=$JNs!F77R zYp$u2c}QbgU9jqoTB=9wVNS+BiNTh{FHui=puKfS;&@^ml8$CjUBB-j-b})@0kC6{vO=_ zGmM54lIW%-CaQ^~tF)YdrVDCLik8!$LxP_N;+^5` zj~bL}A>A^a=6se=8Y)`0vJZ?h!c39xyuY-`! z6wWv0@?3O^ez7;k&|#QDMS2#ifqtHH%*aT~I{=G@=!fg-Xhu4g*1>#WFAe4tb4FXT zLgh2-VT|24zZ1RbisuBD1c-sB5`-h%+$SJE1pjEvGMIyPu6ug_jN;4twFuJyTo<0a zMowBCBk|;EIN|4i9pM8lF?QeRPjOB`?ju;F7D#n(KOZ<51!VSHKB`)ViJbIsdOTA! zAuILbx(TqF+y;;Oc_}XCk=a@C_HUX(4m#I=+k_4}UvkTGa!z#g|Jb%K_y&H39$U|4EWfKT$M@~K5A8eXtRNqdX>1QT>Inl7}os~ zrisS&IVOBkp&7sX2~u#xX?BKxi5U_9T`XZgfw zCn&$h`z8{9*Dt^PENRV}_wWYc2-$Fu-tQTP8r4CD1rhe@)0!9ppR_O1VqjEH$W2No z;nkZ^lN}~L<9ah6*PH6>OIa7adU-qRA`tz0c!Q#Pumn2s~UkHW|cmITjz|TNEXi z!?VZ}s-dD6Xys~*XkSultO@I14cV}2BzUvKn*D>b%VjMrHfpYrY(ubxIJ-~-izf&@ zix+NxyQiR_AXf-9oC!4Rh2nsCWmI*0?3?ta0#|uP0q4!O!OCq@_6W^(Z+}nCs>^Ib z&s=YuEvI^6FMPNOCthL+*1O~#`6Rnl4};2tSoAiRs4wuw@vdUMTs_Gb-QS*GVRNN0 zc5j><+}j0SMEJMz4H!zIevO+-4x?w`A?G`P2Q0@?*u6a|*Ych73>3WqF3P>c#=da) z8P120!rx-#E>buK3(LQVhq1tU&6E3*_NDFZ&u)c*rCOg2BkD)rBptiOqDu~l23M`_ z5@u-nFf%mZPjtt0OoV6`RGywcxLN56gN1}2s3+R)qXaesQ71_R&Jsv`?xOD779j|K ztQWgAI<5fZGM|ma1GtuKMw}|}W{TGz(X_l`|D#P5-`~-O@Bi}x5cPQ9TGZtiWM?=A z*nR(pxG#Z^qR9TA$z*bePLRkY5;ve(gAxn~abQWq4D`qZqJSK7DH2`9lNmteiZde_ z+QD1VJzZUoRd>CX1XMDUkQ+h*0zo`~0v_8JLfWQC6=fkACy1Tl% z>eZ`PuU>t>i9feSvks|!i+B+2tas}`oC_)uZYe)|Jl$AIH?He;qpOZ}{&3O(=E(lX z;eZ9nG?r&f81+aPzV*!?o$DRnI`-Rhs=Rw>XdFaMG@G#wBh1ALu=z)3Qc;9|WrE13 zib9NE9`34k*ubU}(-U+Q3OOOL783gg!nYVZUq^vUInxrY^UfF|ts2DELXruGNT~F8 z;6_33z-XOw-H1%R-ALeaJ)q(9o$axXsA3FtFWZT~@|OR!tG(FsU8iR`V@MzV1GxXQ`@^5_!zZl)^=p1A=ZvDq= zahBF`$Ho<$>v1}qz402(^#LB9;O&E)CnD_G_|p&3dSZ$2un7Cq^dnGXZ_pF-84!}Q zVX>ggZtCD25g*Qg#o#548;UMmKkM?9+) zyKUlcd9lLgb@;3X`U4VCZxt7hvYDFglXz}dKdX39YK}%CY}Ib$)o5i1KfwVSl6S5j zb+zNtTybx%Soy(Z>94f94iBppN-6K;RI6w4sFvyJG4^YJ;WyHe4i~G$uWVu_#+wYu z73=W1OzEy@3}&0G+M`vl8^2ihJv4_6WC(eq*9hF!t+e{PG$v=ls&ph>sFgm?LDB_; z1eujnur@(HhoNilkmuV`Zx+8do9+}i7cwPsMaf9kZWEy*VL*rPZzRIMJFY&f+PrI0 zNe!;Fi5p{oY~FjDgl$$sIURT`RaS8+)PZFG9n?WCB0Eb;RIn1FuoBi#C2VAsurF7v zfJ*oSaUR0cYPsS^_DMm^ZRFM6R?pH=@*TJa328D;56xny&3k{U*|ZVLY9vsIqFBK@ zR}#eO!NLX!8>>8yDz@_UCjsHX9gb{AmHh#mxCTmpzCsd~!z&HD>5$rQ36#Cbo&#l1 z7=es;qqVX}@v23KgF>!QG0FcjoG}(pOqNOGXiowsTghs@%%n zdS@!sTaIn{{X(wcXMAI>>73mJZ{+ZWyNtmXMvl;4IGDY#KfQ1_yzpKlK`SZcyfa~h zif_q(UX!|x#KoR&CXrqmV{x}^7-|!1ZQkjrAlccN@y1jXmkQq0vhF*yXL6fyDZT#} z5kyh=fK|M8f>m6V(}OL1Pp>@mgKVA$QVHZO(~{K!W`-^M!6eT0Z3Kc6PFlG)nh2`X z4Fs9vs)A&*XO&+z24RjJ$)qu|KPH%(l)20Am} zjG%Nv1cZX;qi=Y$CK z49^&W29PPh@i{nfP{qhT?Q8MpZv08dpG%1dQ;1*;+tGVre*CmXw|#0CoVW-qF8gYK zNU+BX-r1Sb@cr$o@__Wq83VmPQG0Yz*;y6OaYYEeEOY$~=Zs8Mu|Pd!%B=_=rR5R@ zxr|bZrMEj+27B}@gP~dm$c8CS9p&~t9P6Bs9@*OHnL6q{JzQ~P*pU1uxP8mi?1`!N z2@})o851+?mruOLo;)!V1`v$FnUNlUBNwuRNO>bW(95gYL8^Q&JBX0)po2`+=2?{v z?KA<(ITrrfe4><{sjbB!dT%|~PK5kVYpp0JuU zPo1=E;u+P(?V6p+sQB65*CF6!1rLe5mN1gAi+#JZe58gRFu}6DZf+yb+Yqh@<8?oTLhMjg4EprjF_`>k z61@7%g2int?nVNs0Vt3;e^@yK%!tew`w9+G@dJ}ljcz@X@z5i zb82KnzOysVF@OjCki*8G3V=WeJPJj0GgQN>3rNRM;;T59Fc}HuUs@D%jPM@V*K>5h>;M^x()gZ ze3_XzNsG}?X*mQYSo`=Abt8rQ zZJ25nTdk&j7H)bg)WLjQjhm05%Ftj3KGZ{w4kOCNWnc*3=pDNnf5kmd$Y{fCK)PT8 zU8NMm8{Ym6zG21kXl>3*V!7njGHKyTTIV`Y8C)1Du3}5)ja@mGMB|ew@hlp#)6P*$ zA|miHj|lH$oQ}r3OZ=G#V?5dB$2t>aR>hQaR1fmHcJ+4&rsl310Maug?kTtZrPwg$N?4rG4 zA{)WE8D8IcH27n?+AqKydL`4~FdE#kZtO*?>8l?gHI2K{e~5ClqNmyqBO87^-djR^~}aCYgW%x30ZqQGn%sY+q}lT&$p^uq6KG%!Jaqe23N#; zpCsw*ad`CY$4NRze?c^CVfL#*P)iFrW&f6XG(-OVR=Zjet<&Ps42*4^nhX@zU2K~f zyHk7%9bE?ef1(F8Q^!y^a8pM*=X&f+6q$c_b;}F`s+9Lb{ve9E*l$LN*qdU^+14a8 zH`AJA6>BV_U&4LC*5!Vyp|p#?$b#&4LPmo{^aUbE$=!FV?4sgk9iMfJn;jc;#$5f` z#l+2q`!7G?LoOK>5ApqzEFNOlljqcnD$jQZ`Yg}Oe+PbTc^W5&mj~lFTdqR>lG^sZ z@DMM3<(w)P?CB+heCIqpuCX3ySG(_rzWj>wtyuhE=w-!XXkf)cY?QwFw!Qm)=)llt zTkeOR!-JaST>>VvvRvgvFcUxPoFK5c4h+q*2O(G{#g+nV?4^7SD}i zq32D>e*^<-&WQBNDWfn70r^zWwf*7BHZ6KXDAPvQIU^>Zwq1sWy$g@-!bpx~w!mKI zOzCoz+&!2-W{z2Fxdy1MFE*Cr->JRCax^cZ;VT}|Njf?t@=m_}$$%^MS zB-YPu%TMNt70BccIl}yQ6cmJaHcg)8jr2hke^yRuG5aRy?JK0{JY249M)neCr)pnG zWJ@-&Ogx09&eK#j+VXiuwch~}E3hoJLSj~|kXgY(GU*MUF@#kh)~WOMu@oe-zhWw+ zPaTE!De|B>mygvc-}m~CO?OmH=u|d!UppYmP#kkX#jd4|0?SVc%Vjm?$A!_vU)(0W ze_DWgt5Hq)9FoA4LK0CT)LaWAe!#RM4NV@~18U0C^NGohE&YmfMy$n(7y;E}^A7v& za&%RfLq*!egI0e>6j-DJ{IS6tA1WKup@L_Kkq4%1u~kigq953F?B^+kHs1tHw2BFE z!CaL+rO@opW+?;k*3wB+uCrB50^4NMe=+@(OgPuH@JiCcIcS5FsVTc|fzPU{m^MN0 znKo8h`w&mB`b#|7gnLw@VreeFRUm4M%RhYrKnF%(a&yI_3f zPUK5Ph(f*?@$5u@TB)hjVdULaj**aD9iA|N8(p=gKdqv0qy1hXf}8Fy%kq`cf4X2$ zuIG$MLPaq*;LXNWTqmRAL8zJta%v|}NrL}~)M{xy1xJ~}^0`UQj!w4R41=`8lrjc% z$ohL((AUUeeFlBmZ$x{;GZ*T|@}A9`3&yu)kY{eX&1-oNlE5~cn=Z{o9WYdyc{|t$ zFs4_08Z-vq-W7-vdth;ybd7eyf8Re1hJk%44bl>y3MKCSm9b$fF6%{~{B{1t#)fU3 zf5F(WWfU8hcy=fX`jKFGnDh8#rb#0AgUI?peUw6#<%01aGgCB|ri%?()w!U|K0APr zzFL?VsC;TIRH}Jo4~a2cvYt!kq1E_Qf(gijX5%wa9n?u{J_%OLPrdPve;r=muF5Tc z>21ZvIq7LV;n&Q*Btj=Y@`zE_SNz#x7$UEo)(c-W#`9AIzrHLys6TwwE*wuI*{rR` zfy4)KKg9zK_LEQZ<>Ow=3AjL+;LR)GN=lhg&451bg9s`^GRB-yDbfgcvp1Ud+dnHN z7`6k16RK-HGPK%RqqZJ#fBNU|S zpkt-9ph`W z-YUVZ+7}=T#~ci(xElwD2iO97;#Xk2ZSO~G=PhRa;7G?!g`D6%>bR$u9XwgR&~m^G zSz5azG~HUXlcrmTcu*M1<_f(|Y1*_wujAZjnxk|TEacZ!4ab!RimcxiJXE}W#otN? z&LBifqAwYjT_X#+f5hC<_d~JLZQ>DI#^+$DBil?ysTHL7xBM3U)Ego%u^agtBG4Ta zoJ?5NQob-&`HV4*#FV|KS6cR*7Z>ZBs`f6pSZVE145;g6xX>3{2W#(yMIGJnbA&(u zgZB%Ro;f2jiI{In3^E6SGFE-&36Tazt1^h&4q845+GUjLe;3p;;>K2l<$m)7uv&W! zZ4j#z+%ILGV6Y!nYI@XXFhWV=m<~ic={9lce#SPPR>k6`5O{h+6^1Ek7}R~(^D&jZ z#fNs`OOD7o3LO_lY^z@yOV~8|X2@4;7i;s)rc(PX?QK#G zkq;epQG_GtcEBB`Iz|rz^87-N{?8!Axb%~#1S%>t;mD(zP^DySjnY)hqZL8blGDq~ zh~)cp8_9QLzn=2VHZNUz8kE0(cYCk?6Ogbe@0?M)f5grPQKpWd@(^?s<1Khoemoeh z%c@pWjI(gQYa7AH65Q2}-?BJYxMlyk7@e9DIg55&ajxfo1Uavj#4UOXs;|E$ z_N*`3fB)iZQ_r)O7V!31Fm6ZN{(xIPm(iw&+$O255#zlq&6ey3VjMGx{)xtmP4lC4 z<_V5AJIsJ`n|khUfC4YGY5s?t#btq8ElolFsWcE3(-ubez_~EmfPX&{y{>94Mzhqi zofXquwur%wk=%ApP%Gg?KiDxY-&A8y80vF2e?_QOvV(BB_dCj!muM43yAp+4Gr;2K z#Y6CbZg4(lu2O0lk1||@{LK@_bFOA~W4`}bOn!V7Qt-YZ6@M7C2LJR?yNc!JT=n=+ zsO+*2&M&k+$@V>&vANr&56ZOWPGwu4cx>@XNjV*8@!QHmJ>vo^Hofr|5ttGiinCNg ze`^AB560x6f=NRrYIrvRnLn>5TZMDg=`RNL3bg^MylR2ld2BNGm_Y;H`uod-=j30F zCRTMmuT~*?F_+%J&HENo68Aoh7+i}|%IWXbOp+{0F)5TEA9;jjWvph`8{z)}xZyK+yt_fP0|#oUO-E2!#%&Ft2fo0pD_+94 zVQ$7(U!vTGz0LlP6klSwYK3`%oz_B?!8_`e7ldH^t`_Cq+BkH7>*vl=y?qe|f86w= zFdhf4zurgWBG4YtsN7?>W74g(Nid|)YwTAs1NAehg9wc>H8d~O>Baz%*V%Ic42Em8 zPx;d}B(gAWeJ5H+^r0bnQ%727bc?O+W^bj!==P%-&C*jm*w743UmM-_(&)C-yO@n` z*Nj9&^L((@Hy~>0WNk3RefXsIe^z#>?YGF{9)hap`Lo&xRm%n_$9B_E`v>`+(Oglv zQi{3i;3RyUdpCSM$VFb8BQ%$|39O}9>F?t^Fis<`V(K7mheMAI>kkQSeexw&?1s93 z>78Erhkgxa3;jL-le2Y&RwU;5e1lY>6KFRX+8Qt;Sd=*z&~f-*`rD9?kOEI!wvVqrHwsonC+-e_c8Nj6aL zp(A>N!hP@~?zuh!J_6KOx=&igoVu7ifWD0-kBuNwkySCui%?T%e+V=M4$25;8DrK{ zxS~$^3GF0_E2@x@%A6P5Q5Vo~beNH=U~5tIW_G2F2ymfVA+m zO9Bj5kWI8%d1ozYe9)`y(5$@ok+aye7VnK}S~+|`2p3KGI3P!+a?W+V*5>ByN5(kTz` z0rfZo9`$X2H~A3CaCI~{Z`^O+B&a~?inDq`HGFUnp4TI=;p%xHKPlUuji$C+wg>+% z0lhgNb!TO_*%wMyCJIk#U|(gOV>;~~7(tSA$ic&zPo9hof6pyAj9E{5mWBo8BUYeF ze9bG6w)$1jeowst1%4S?UwNJ@+9xCBJy%pItJrq#TKlEESR+@{$pJ@y>@)JWOcJVT z%QP>R$_IMEF6_~+St@H(YTkKAu{GHak9KNQ@0w2P<+HS2K3&h_P!3|*6jBhOhNVW> zr#0AeeV;80f0@v&?`yYO^jh1R+BaIUQSBq(*U!0D=mWb!Mw8J{&AArR@V}r{Tjw}W zBjlUfHWY`qw&``U7c`1``Ww7|`XK@hBE?9ZW11veY{K^2f{Q z)&=9%Kg~qLQbVFq0YhoCGM`JYLugHyz|pX}AZ1BSe*g+}e##B(7>C=G-?8I*#y-T!wO9@|I)_S$E0MRoFXbaK#fBMJ%% z0ri9il7=d2UmNQQ_gBMnWrUQupcOx3`%@rke+NmE-^FJ@&nnd@auyP~3i+;($W_ak zVIt>~e{-40Rmp?tC4QpF4)Y&p{NtS31D|!jJxMfv7ay{uSNIdVzyUPX%uq? zz*{8`BKnH82-H}tOVa5GssqZHPBEE@ubxq{RW50Y(n)*X2$Txn!MT3V?-Cc(%^)-S)6`2DZ#_UC?{D zZTkh68N%Y@f7h<|!b?@~15sp)Mw1d3e?XXO#^u1H82k+Lvd*d{ey?Dlg$0r;rzjtiDXK4)HTD)f0UxtkSazqqVywxwoTU(pZx0_KaG)RcJ zv@;+DprvE6t$**6Ko)HozK~1^t;fMko*oJB9q1Vdb9@|>Xq(KUPza!J5?HJZktl~R z#*l02+>KErbvbHEO%8?&sn8F;e~i+>kRxCDWt8qb`<=pk7-li$2RTkhR`f~!<5U7T z?J#mr+y>R1(^7$?$`MGDI-G}Q$?yxUN5E*$9qO~C`K%2v-reYpoF^Xd>R{0qo57oqfSxv}@f9)5@?NiLHnB~Uf4DgA&gH^pi--VI(S5~(BSqh&`mUWQbKOlu(eU6&_Hx`iLhZ4WwFkW$%J4sE5zc)#5#k1FI>?9{R@uX~ zf*CYQTn_R`Qoe%{CCP|$tkn|d!f%0>aIP%`SpzSUg4fmruHD!3f7-2qYc~h4WvTM0 z&!cqkXDs_O@$*3UAk2YkHKpkW@(J1}?#Nw;6&2&SPFOBX6bw}b*?AV7&XHCeAAuM6 zL5@Mr9T>meZ#C!K(T47o0BF;7KBcw$_$(S%L=woD-N=A4PCa=>6+FgSklGFJtE)|! z8qR@^Q%qt3+k|YGf5l)o;S}@DT(Oz$e9PxHoU~+pixW*SHM#Ug(f_fAoow;uowa!H zQV}ybIY4Rm5rWE!RZ0Si#={1(7C~e-bcm&F6S1Q|5{kjC?q?$CYB{@iA-mU~>u#|d zES@W23UG|u>NOBxaTB-oS)}y>8_^5~IJa4$-4&z#yttcte-YCvxW~sE&@vuZQiu?y z|IN>UFBx6N*6S?dSzg?O#W>9+e?r98JojQHs_fwM9p`#9LYu4JfHD4eJ;sY?iTW@3 zBYFZJFNIvXJ+w36BU_6HPH6*I(#VyRXEbt!7_AD1VByp3;SMm}g0JtAi~Uwy5&R9S z82e1Y`vl!1e|@HOsN!?1xbz)dNfl)HB=#(CC>ENP``m9tIa zyhUV?bNBhU(aoF_V=eiNFIg_~okR+#eHMHoONN|1h!w@-6PwS{mdqB;En!9$2GF+_?Urw3*706>&N(*mUVDzF`A9Z7>2YL8 zY(}=Yf6=}*gScxexGe}@&$++Gr(EYa*P%}Oh*sWkPOj+;6vmz&EJ$LHg8b#2R*)Cy zjX%gwpQ9rDAmbJRxWmJDVs(*=sj7Yfn#FTffIauy~R|shGR5J zyz3z6dIJv(2W6!HcGo&Cg)H~T8_vQBn+fcefB$rrUQ{FB#SThk@hnasn&mqDyR&t; zi0pOH@a9V16D3Db?T@?L4YjXh(~iB4I1+vL(t}a#bMC*>!LHD2gGkZ=6qS$A&xz!Ehoa)#Oob}VdN~JaJpmG`8+9>Yh!J0YHL?)^= zqe5t{7t-p{b$=?KBPi-yx%5LgC+`0-O>k45`IuZFTzU;ofxjps*5AaH^mkF4f99rM z|8F{NXLlt=(dmMeuRdaT;U)Or0dNs}|+!Wvm$al8g z!aY$;14;?OWpwb)AFhXz@cy$#f2wY-w{C-Ea*rR)YGg+&ChD!riPwO$Sdl3h`9!9khu{^tU#eD%W4(jm$;}mq57@w_ETZ z8!N=u;Jxk2T`(u`@@j5cxuMe8R=W=5;Ne-J6PKa+Hf0{C|mB1=S z}#h&()BCVdyLWs(k^glG%$*h36w z{DIK34+Ngg-NYqZo|4{Ve42)1zvq*?t<2Kr=a@06&pe~N{VlS<;KaCTNp zr=ganqJKGIxn3tMZ^rfJqG+8BaXWJViup)eAPeZScn*(miqopf@>i`|rKj~hYi~V9 z0e{K3SnN~}`+BLMQ-M!fg`bpt zd*GAQ?SW6Kr%x*4e*>RX4^{fxXQFi?sickDnM%U@r59kFaJOuLv37kue8s?kPz?-x zBPw3r@Ri`Kj4^$+?u$TjRIH9d*HJ-}vPo%x+#`jM6` zPI03uoX~D!E_o1Ey}~>QdCY?l+@Z>I>8qOI=g}rGi)Pouf6uMHUUseayNS-^NOFzZ^b{#@+*4V_87?1fjDC?bpp{QOE+dOlZ3I3nQ^5VYyw2nZB1N~#_ zaICPpcROyee~SII1tf|Goo03K;oNrwbI9@w+|H)Sobx8!FYaB6m?90|Fz@GsA4TIT zR&rGK;yi9^Cftzg*$^XNg#!j8Un&oSqmS7trRqqB*Kw}6XxdmkUrN}6u$j4eTu~bg zA|ReIrlXu2H+vVO($8IfBtN6g>{%~ZFmQZvJukM}e?04}a>Yt+p2~l!i$Nlolbja` zn|9zA&+<;Jz%{jKEI5pH$(H$AAIMLGIY>>u$+8UQlTmC?$b`j5(rl>hz{rRy zco`N-thI@Y>w~4592FXhxRQFYhAXMesB*S{zi|;XcPljY!x#hL6B`6WnW5HdDqG(V zixOD@f0rvCksROiFcz4q)<+s@l_*?hG1myo8TuN=9B(_8Vgh(ObUr8h_Nv*#cCOa zx}=$^ZfXrlgJV81UbAN@FT5|(bktED9{JP|9{JP|s8qoN!d%ows)s9S<-L~gO%yo5YoZ*{ zt^;<1U^qbKP>g6oG{a|5$H5K&V@L(bf4(L&(T`l^7eNQiXqA8SI`+S;U%-+Ks$e zs>Fn-q)H^&0|Fyj1l1=tdn|& zL4@93?Z^ThWxvuY?vw6?H*!VzLU@>X=IR4dT^(S#!VaSRHazC0G(6^}RExQ(v3jD- zTv4_5YK?ot?IMp`y-*UQei2J8T#4LO0(s`Ta10{}%%U-DpR}){L$!(n!{yK7{*l|d zl~!s&2zgUE_av@g^eu^2&p`Pbf7;~ZxYQczQDVInJtZs9;4B^-No9o26e=c>6Xy}8 z26U}>A?+~cglnf7>Csoj`7* zJ`~<4tpCeG3h(Cf4mBup*a=Yju`9`Q+MzVd>%7zS*k{Jpft;^5 z=6dGTu^0-lzsM&87Qp-v7sah1*o-~y{q~8@4!wOU=-FgigC#nnv4WS6f%FZ@kRAhx zNJ%u@*%4vy4+(q{au(tee>=wfmtkZS%mI;rFbKNLY@0z{dFoz)+4Ns^G@CAl*)&e1 zbGE^cPzbZ>)eV8!^w+lK$8ofTi6k!M1YtilghThY+}77=`h1F(tQU-d7uR8hmvjwU zA%EjNA@)MvyHGE;Z(gPCU2Hya{to_R5}B$fL$e;Ri$yvU5ZzcOO) zye>xFR5a>l_`31*u)xq7M-=2aUir}G8K@X>{3;&FP7%OR`CN;GkO*ccc;<2M`5*gOL&Mavr)+V|fQ z!El;hsQ7K3IsYx$e-*=)%N-?Vu@j$c#xZ#yPVjIr#X9>JNM^2h0&9#*??m}TgN8)Z zg8K4)qUy7{8|+Yq+7y^hFKP{|W>Tc65Q9wCD8X zx4LErst%fp{YIOL9a6Y%<1Whz@@1N@IlS-LZ_%di4R#xSf6^Cz8gu^@rtn(0t#5}E zUIq8$pU$iB=yjonoI!$lq*tj0p%F5esF?O}-Ua7q#^xvqs%W_ql9)EESU+;g`A7YB zVp9rPEoQG(f3+CuKu6+wOz;!HsvHMOc+ISQzV%2L0ccu1X~@9ys5|cE;%nISFFlXtuWL<=g&8%?KO+Xk^a?; z&eTPQP?RdCBf=`z6_{2W5I}wxiVl1yFV+RVplLGCf50u`eIYxD<_XAtxh&rdg8}YH z#V{ulx?v!6+>@(mp`)B;x8)#nkSW~{_d<0XArUSi@QAc>>yCijScA;e`4}>FDO+)H zTyJxia;}&N=0;j3%_!-h)&6Cn67`k`EeC8!5X;HMzV(0}mj&W!S-|^8^n+~+dWAL# z{-&`=e>@paz08Mvv^Z)B-X%CxW%16l5!}`(dct=dcjiHuWP+l&mX_BI0mCM3Z$8#@ zQiK-ag9jHjQ3Q_xI=3I+6sFu*mT7x2Lxj~KLGXqj?olEzVA;b~n!F zaYA$uYyoS=L1qgGo=d{}d0IKtu6-8PY!dcze+$l(TR+84e#tfjpNh|rc+*eZ)?>If z-D$B58Fjmz52asvAa95Ph9xE5XAHlOB z31{DTY3s#naZ3I`2=y=K$H+swC=mHkD3lpvnTFvaZLq9XPMU*hf6kHX z@Z>#xpY%S+?;zh47Vu>Q14(S)iXsrw7JJDrg7ZWqM){aZR}E#zx3T%WM~{%XgnWA< z!e**@=sQquWxexh!S~*BAAIkFTf+9+XzSEp9*Ae?q~me5x*x^E69WH$vM8{y5_jAj zt=ln(7JQ6v-AsU`ac@QIq;lNre*mSc%j!m5ga%$~qreINKKPF)_$n&0Qdd#RTdcSDw!+XVT#nocX z%fxvx5}=zm35FM^;bMG4oU1DEIuYRv|A!u*Crb1^Ch$8W&o_bRTz?_>f5dtk?EYxH zn8B|1`FN_~!t-%EIll(uTyQSV!>1SZHV@y>FE|I^`X>YP^x%m%2TsmE5AHHk<+dC~ z_(69A3sbku?_-|IxuOD7-n&Ptu|;4 zg9lw)RVyjZ0X@MoMg#;}C&fXsN!rOlafFtU0g!wEczQ(f1>7lk*{KAQm-yf z&U+u)v6_=o9?==NHRvbeye~xHxddYf*9b`=D?4D(BAD$}$H2GB>L{tAl;Y zaC+yy_d_l?&K-Y--EKIe72SA7i<@~ytAI3m>ZSL)dXYKzf8A%m2h5g)Phd5t0}n ze65sS#n$DHYztqPd*mGYKsUt54{F)osyRnz2e$+E!VS5%Fq|85crYZ~UDyXVWH2^f zy7@17OTFMVf4;d5$ul1rq!T#H6for$4(bM4-@_h!{F-)EPEKf7FU$)Q!pga#uqRf| zH9O8|SUCqaUsMo#fY&O~v_B5<82d--o}%v-8zJ#ZN^I&M-2-?(XD;C$cvr&Y(X%*H z@Hi$2p7l94P~KoxPx}P@rR9RhlH{C}ekcxy^G3o{f7CYXyo&L*E6}H4!L=nsy^E2O zw2KscK3C`7Z{H|*6P|$~E<*6~NrI_L7+Q^J2ChPEn1Xg4;^%JuGp$eYoM7^=i4%&O zwb4;0Wre+U`5NkZ0MX~bg@APVrIB7CR_9||L-;9ZfrxGbw$IUp=IPCpojBty0XaXRP3 z0bH(AT1ML@CSA9>b9y zeQL_RiHILC5N$(`aT&efZhC?8N;gc&sc`WEn3C_k8r=t`B)rLxNSKmmOXEVAlD%S{ zw85m$ESBQ5r$G>9`0%PyELUkf`*6 z`d+lub_|BHEf$z#%pJ}Z<+c_)!cgvAf3IP#*)JmvI_qescwGwFhOnE${B zw)if@&59oefZ12(D(G0zoHNK zmxmT!&}U9=@-VkKbEaQ}+uT%+L1LWi3g)~GM$v6dws!TPD+aL5!`$fYe;4OQKdcLP zqgU$!ZuH1EFWQZ+YHsvOZtK$&U7y{0#I$ey!i#dDZ$P)`cyggX*{Ff4{#pm{>Luj- zRo=3p+w>d;s5b=tz{;~>PGIHnFn{e8Z}jf3oq#?}&jRMJC06PGna4HSAzEDJ_Q!J# zCuLVDs<8`iol{h-OOz8~RupaBtNj8G3m4X9T_bJX(>1 zU&m?wz%JhXe}{Yb*FV^&XFs~DXP?_TkxiP%{W70@>nN(sC4=NNjH|D&BY*=<=uS<$zHe)UG1Ct4}A?(8yk1lh$s3Cb(y^VkoRXLj+vf77IFAT6kw5nkY< z?ml??eON#3uWA1GXnDo|uETtdsyWQ>Q<=j&U#0p-Z7(JmQPOXN`T4yf9Vx(b*SLwsXfA5$-YRm_WRFjU>}Xb`CFFbq%`L7?K3k6Z*$G5Y!4``2FLu3pP!)Z}yb z`A>7-GoQWm)ZLK5JRjRx+&jEtpMLpeUGYyCq6I;qaPz7O0)-%jYgG&(DdxQooh9HC zi+75uffyVCf5m|~D5N<;KnQ$Vg-{a0La5+e^$eK*_lSd#&!x05EQGqQSO^RRPGg(IBD76n?&*Y|klv=O7TgCp_nQnVqgr`_ zPG8YrRg^c`ZkpGq89Eg!%jHeBTT6QPpBRhW28S2|f6^{}c~Y;VU=V0BWfqBF`_vvz%P_^Cn@ln(nqlLW^%6K#aG`AuZcG4Kr^cepL~+=4-PZ@ zjSP08fguP1FoXdb{>J#uZv9BU^``co{qg!0h_`)zFL-j$(LNQ!@(_(%D&his#zTkd zb@F3zdRe}i+{n80RGn>X>BylCAH#>ipZmq#mR z#qdXZ_DxzbQ$EY;vSG9v|Dzb>f6O43dT#px#A+>yyvf-Vc^>-5$gcE{5qI@L|44j> zHBec<{G(It9Uqbb0fO!!EWne}&efX!nJ*qDbyFd=z8mYw;CY>I*GWp{2Rdf6|rx$nV@&?nt-;4J!CeS+91rIRZQ2Hro8*u=i(fyHH@P4z(( z^e}n%lkkB;vsA$sPtrwq{bKnKuXZgz)9fg`Y<0%q+31lR@G;9mc`giWe$*xnMpYlvN1rd zUrv!8z0aNqL7axzf9Znfx6r#DOl(tgwp7Z~z~Y%&I8jf&uN^k;R8`)yElMYiSsM5< zr6E`J%inK{>WaJAB?3DDzGRGhE#UWTvt+3@bP63I(EWW3bl>K=0Y{H|n`b@J?;>B5 zoBS%``g*H#FFfIBw2FtVVhfBd%|b>iin+hjAgC2qQ>Q)6e* zEft);7{SnBHB~r{;X?stg)w;<#n1rqW zMOu5}oJwB`e}&ldBE}`<){}~p@@E@}K8tf5f^^ycBBJ9YG{e9u*~E4zBImjaYTYI( zwv3ycN2 z_Sd7Qf6@NB>y=*Yui%(DC?CVNXyA12urr3JBNe<&&!%lq6N3cr6u6ZiWaf(E&>D=% zLrP5hbgpPN=%RSDICZS#dx+6wen`giqhMidj)^1^Gl4T#g6zeFQYxnkWJ$sW!80|7 z5o+ax@r*-;g7;bEy@FTHxB+pWz|J5(a{`%te-T~=Lo;$sqR;O-pYo}&yZ{NUoNddw z$6tFsint&HqjxuoNJNGTQCQt+Y*XQJaaD}D5NwkQ^9ZYM(}r{%=XO#yb<)V{4)rP7 z@q7<~XXC@;FLkK0{IPbJUHT`xN%GgLny59(^9Ip zf1{QvUx(Fq;>p)BZnXW}YJC}4?5~~-;Zj52z&QcTA#$W|<_EPz)dCIPPXRO7pKs2N zwGS2uTNq>(vhqbhT8!fdoLBVI0yOdXW2GK$h*dreYj2*Yhn8Omq5F;y z^CiEy3@n~pXe;UD8G2s&eK1R$&s0iBwDg;T>G0m&TH?fc!DhMwT1>ehj<9&jA~t93 z7iF_|ieB0LytPYe`$4=#bv2r z5ltL~dcO)8wldu5QXFP5JRhn#ug` z#WN~oi_z7pBVM}y7W|kI?91h)Pe2P}oWSPDLr)m@Ue;sIG?2Js(rAjxvj8hwXB5wH)j=;sZ0IU4c`}nq{zvRAw z4R4^zD;V!@Z-ZNRANRjr?$yU#I5%X3th}X*kNcY2&gbKvHMcJx_rc~U90y>U8Rq2v zP4RHIaud0^ujE^gqf^^|!gx>V9p;RB=EwG*FmOdR=$A%^w8xNdf2hefRMWL%=)2xA z8eWEe?0^p&ZUVd5Gb4`qvZH$VvWxG`&(G&uPmoXB-w`2}qGLOT@DTg(f7ipkrI`C{ z^nai1>VdO?oi8>}2xMRl(QoqG=YgC-f_x=sPcXo{3c$HYg?_itk z8t@rhg=rvU^!<#M|{2WhY1XbnCLv_ z?dQ@PPjN{Yv$&z5ORQoc+kTjMVhq7+)UL_Q=dL~SNQB*t!DNy55M-{=&aRfN$>P8+ z?tBNmyz`Ae-5#w|`ZM(Wov*O)vxN_#8=HCmCg9#vmwfEvZaB5 zvd3<_7>@z7ukxRRG4<&MVH50pXSU8hB;WaP#0`#1xT0k5jel{r5B5%J;-;56rJS-p z+p`zUX#rz`+6CMe0m3A}Y_Cxo;J_)!k8JEDQjR}sf3$g-&PQT&j_b*Dbcoht|7+Cs zIVI`Fg(P^9J;^?r+a6`}PS+!=hgv}dK84X%vCVO#%jYrw6LX*?8}uu z()>S5gsIvBg7iMhx$rbXs^sed|mk|iu@V8K2f?Scun~aBT*9@XcP`= zdvY~OWiOD2u1q@h49p$9!ZO?jGgKAQ+QH7q9_|=OD`egq2T7iH;1w_`M@ys6wSq`Z zhN+_?TJTQV^zS$t9#eM?p|;y6ogmW*CLLc3e{4`9KjgNBUHp(exkOR}AG_<>u#asK z0uEls!_spzLu20BS%EQ+vd<1?Pcaho4jS{$40)&$iDgQy*_rDm1xCCqpH-~y>UWj4 zKTnnM4t)({6JuPSFQcqHro1N&2)$o%o`;Jf>qn4on^;Y5j(0)fNT271O1^6*D|s(u ze-qrUh`=@}K`phK>K#AsLTlaXedfcYWF1@^WA$!%4-Ub2z`MMWIl?xXABT44EtJT#3rus%fk%~e^$5~vX*`!$jBK3Y+}9HuurVu!*9B$226!& zD~zY0=3sWCtJKAzQ^qH^W8i@2w_ukH;T}8Esr9XTT168Epjp0~j`Nb79r4`eA`1Cm z8#9pG{0=*eG;y0>p~DFixy>)q&1(la)hKQ=VzFApoCN8vhudhr{4mDjdjLZ~yuVY9 zU4Pc9dLuUq%d2v|k9`9bX*2ktcAMY`X1}tBN&yo_#Bh|CqITb<4>gHjej(hlpuJTM z{KsgnI6LCj31sxhXtA(w&qtet_w)~?Gf-!;UYfvqskeHkMCKdzg9TH=R`4yJ8zagr zprJn8i7l`AdeI*+W}xG>{o2mn=RbV0hJWhM5dCG1rlARk(hyGzEkXMbF7z6ATAikl>WE2YFtObLr*13;}Yo5+j;5| z`Oa&C4t7?bFC=xS@=Z6jpVvP_NW;1?7lB+yI%NwULU@leqF~rKU>-q2tNilFXfM8jC+5n`* z=j8;t)?FNtF2Ej&fmmQr~k_RgZui9duZDwl5z5YA*m z`@u_%(=wxV@=!Q|@#)kH9e*mMC0++KP*&VP)p#(VER zEBc8BrovR=NaEeK1Wr?}4ClofWe5zhm$1*L}ZCwckB=Np-G9a+)Ml}Nbhnv ze0a*guZ^b4Jb4ZNT~d0Qn-BjNR4TW??_s>-*=rd~i-j0xCR04l^%#up$iy&}!Su39 z%;R~ubM@t*+@6C2C4U9!XBIwB?P7cxQw&h=Aw#t*S;>;#G*oClReFE;zLzd*uSZ1d zSm|%Kx02^XY!;BvM+^rJkQspFo&)hZi$FT6AIoX1-|@YM3znNridR)3Y$OcN1t+w>IE&>3UD zPdqIB=K;O0Wor5+&RwgcE#+MofXf7Dd!%Dlw?YU|FlWz#*_R7kNjAj>a@(`zCGfX$ zY9{TySci5wyw2=Ct13^TizT$4+{Gsir4RE+AN;9Rz0ODI)xz>@Ie|J{wj4=TzRG#% zp!I8KO%8mljDOquoy*g|mJ#j7`KX}ViPW_i!!b1{KO5?87~$1V&FO@)=j3~m)u{q) z=<6+>#h7wWh;A44ZFL(WNEi05Z)LIctlHf_u#9=NQgQx=e2z$bi2*Mdy)hx%_}VLR zFo=N&Zg$1#D&RVXZy-ep`4m3?w3P@cQei~eu!8JSVt-tw0F8z{y^r1h{T+?LOYUZ4 zchub%Id%`bJNR7BvHP#jTzKpb2H#|DHt6Jk?&-eX{QryZ%)ueomXRy!REF_ln=%MP zhz0jvOzKeLkf%$DydVu)FqaC<#n&a5Qp%-_av^p!$JMwbftXpwKi{SikIDaF8%eyk zg^0cWz<)T@9I0SZ?0t&($ku#;Pu+E!#zjWNXv%8Bi$4aJ9pf?Qgb+KKvJi)krylRh zujZ?!m^ou}I^$PUitw&~REL<#ZV3&QvmXy7f1}q3%#bJTR}r#Zkjv`-Fh?2IeqhWR zhGUl2B6Zq;70VUvqZa9ly9{qWpbcNcaQMwE6B^BRgo9d|G(T9@TBiw$P63iPg;YpPw7jhi4E zB)iRdTyOQRRjp!`cuL^R`>cj)t9L-1+0@_O-zwIx8VQpin|FZ<*A6S?*zO{clz$_s z5X_+l;T$Tp%;vS~l{avOq-lmX0iI5V`~Av+UU`V-c8z;MUseBtVBAZV&nBKUi%lL& zJ)AazMdq zi&N6ubMPk7#vmD6K^&#`tAp!7-``uzIh@pAq=eA6Lk;X(nAOP1~>6DI>L$SUee| zo$P6VlX&gqNjSl#0vlS&f`1n{nY;pb0k3xTVnGgl^VV! zD$#CRSykv z#3CzgB+Qi(p?~(nlUS%(BNRw6h?XDVRbbM;6Tz0YUxU9AUk4-f&L(aZ)NnKBZ1O>G z&aLZF&3wi_&h>y^J18gimwom*ylEfjZYR`~l%i$08@YBD?ktjC1_6h(S0T;q_{;%D za+UNrr8O%31aTim2!Fp$=WSXuY=blTZI;zac#QJFXD`F6H?sU@(>tmpla|$Jx8n=U ze4q4NN~yxkYo*KBWqMD_aCk+-I%&`9!Rg75i^tV6#vAg#iY26vxaN?#!z*+(xt zzLdSNW*>XuP{FUH8g)@RUBNfF?aSXZAimMF_%lIVTrXO_V1N0f!h>(ogZreXSw1go z`8)=v%23Kc@c*0&j~Dz0^NDZstp7p~EseA{tya1kOGxnnJxVxBE8%#SbB>mC`mZfv zv{u5O>nNYLB`lw&x{E8}e0r=IW!9a7eAKmi&^vFY+7nTInPVSLK+#P_IWosCOR$R5 zQZXS3P9k~NXMgrclzvP#$F5yw6=$Z3{4!_LH+=kV55El4VMNH2-$Jm9mZ%uBcyBZJ zoS$zg$88I)D$X?>rPo=D{S{^QrCOBPX{p_1c49zgH)}F`6Upp8CTNBwK|#~x=-A#c zIf|?clcU2hwn?RQnJVBva45T2J|8b;ZE}Dvr@TX_B!A@o&;yU-1G9-Y;odK(QK4~p z|BnOAX+KdR(kkFj(xyr9v+N;k>N~V-*RgEpE@n-1?_So_DcIC$UvWE?0nQcmI<1lU zf^&Lkyoa!j(^x?y6U$(Lmcb}E#ixHxP3z=#{tQny>bkb>KlVUb-_ZSvvKB95Wv$;s zuX<|{dw-RG&&8H?%_3ITCs_t}X&G$VbD^@<)dnT;On(rH`>I2dI5Ra&5~rntR*eiu zVhm{2NCFxG0ZV1Vl}f?|IoWTM{?%Vc5@q$yj071?aK@%;;u;BeCfSqO#akj#yq&R0 ziUH=RD4_UW_9|y=45eCJKX9%j#8lOzd`HNUaDOb##1}y3_+ERwmN&lU*Jcl?k@gfV zHAd89rp~HJPXu1AftTBj=Gfn8CqLUc?am}If{(BC=r7a>Em^93MZ2mxrJFg|x5)b^ z={Xl7LejzUz`>EgK|MPF6Qd1GjI3mI+D=Qr!QXi-2S$GBhe|fUSj1_AcxO|zAPQiV z<$q-sq^e*q6vUt_Nh+!#$&vm7H;c_|NEX}pv{rj849lGB?lx#S8e#dgv-Tl4%%(7% zQYW2GVr?g{XhXcCI_WqhxK*Zf+%5KmKo#H+e*W*DpGUAjR`E+RSmO8+-*9ZVC8=o0 z{RRq`i{{!+)HoJsU(sh3tzZ(|lnJ&P%zrbS(ro*1tc@W-%jpWfplP_VQ{@Y)bVe|7 z`oZ~Rb`F|bXYuF-(O?#JJmg?OpSYB6Pvr4QPI@1NT`@|ZGntnjtI%Vmu*zxV(^Rc; z2KNh?AAH&un06)S`nr?V#UT#4*|fS)IoDajgbLM%tUyBe$D*ami!+nl)y&Eof`32# z(9}xd3-*zfmcT>b?57yS5uqVG5z@?B*02@jXccSC z3N{ui`Liv-W_6vlUy6mqrcI={1}M3_6>bn)o!_V01?;$vDR?Dd6`S=$Ra*Oy2>dIH3MUYvG- z&^UBp38ZxD=)k@Tf9@j-d_X^DffpPbuJ2TL5dke2;_-F6$W9I!&S`Z$jb_d@DpJdO zc;Fxj4>0FsIABJ!9EI#yU0)Jk$MO#EmveUO5t}Konl;eK-Ju3@{%0~a&wq2JSS8Q< zT@9RD{sqLud#4_S3$&-}Y(RN(?v($6e!DM`wIK-_JSMvl;R;G2`uQDAs$NIs;M4s4 zCpjSYlQzM0#y%7-ruirN;Mg$)rV`LCNc`gWC^4+`VFgDWGIYQ5I28Uc^cPTXX@0Y* z!fv#fcB30(S`t{sS75&zgnvJY*oAtVS1c++VTE2?g2jSPoK^|BT*;euJAMa31A~mS z>GFwjj%euv=o;+ zD^+0|u>J5L?D6238wC4j+Ezwh;1eMiTo3ASJ#Z$P(!RCbf;+OCaK37jkn@VeZ-7f+ zD+af|r!ND6nDZ&0S1%;pqQ~!R3+C#{(UxGEgIH zeq>eBZK30+#Ce2NL$y6Q+um%~uv@Gn#zpwH zbx>*av)*VQfK_NZc6UL2z84SMe4$ znZ7B0^urh&>wnALO2VgcRk(5ptUEY5PdP43HS+Gj06i-Y(4*)gflhP#AhzUl)2jb1mBbv7&l)2n4?)schi+oNS`}GP+N#=Ut%_SZ-|Jm;m2|Gjm&qCA6{KcQ3Jc=Hs2RyC71OtQWmcDz zfg4182_uPylKwN}aNB&61N%Q@1*U|_dqhg4oStU-8*?-ei+~E(xpFXh7w+|wCc49x4uLKSiCT~2; zd&L;O#^N%;ez5`O!W%cJaR#2k8Hm|yoTjf}YYFt3dOgbC&|=$!0~)GopDz3%_Gj~% z&;UG8du)U=B8<(sy=2iNDJJvnlbQA#A(eOnxhKLk9YBuBAGuW%E^OK{!%>?S+ndN!_Y)2Xu?>Xj za4%kF`Ok&Zdw!CaT&xV^f@(r^<1Rt3y51HS9kq!vXOE2iQx~DJFUBAXRMV3MlKuk= z)GafA3(+m4jlYjJ{$tSi&^Rf9CVxi;m9*ob>uh|r(ct|#Z0bk5Ax%aGa}axA^M59?r9QCv zVYtS@bt>+CjtQ&F$>v78oAUa&_8H6ZehzIV(zVEQ(%y6?Mrnn~!tWK`Xlx&{almhZ zB{No*eGvE%b|HQMjS*aG-K<&GNs()sC+wphL4~SVBlgVm zut$EA3*X$QOTJ#itMSHyKJ=O|U%5W?eXJZWHV`jXjwfHa*r*DhzJEincEb-zzV)ea z`^5{pBWzChqRFPOEhC`HNcHm(6XD(w(e!yJJ`9PaEVw557A%#d9{TM=LZHQFJc+n0 zq-2C}i;3>%-|PJph4j#bZa9vSkdmmUiiUBIl_M62Jw-}6zl)f{WiGf9gtG{P>@gDi zCs^)1!eAq_tCro;fqy1Mw%km&3Fc598bJLHjY1pP^oG*Ljkh>D2XC4dW&s6BkDrHk zX%+2_#GZ*wt7o14z3i4|qVgAR<3v~pV4ly5JK!}g=1?P(GbXHOb}GHy@gg!CeHE>W zNSu-NI&A=?hI1@(E12@n98(UhPsEL1N42RQL22N>1^)dMsek6b9u7mQaV$zz2wT>7 zNS1|e&Xt$SxlC>&Q+@~=8x^Mn`)}J(;XjpsD3!q1*mEH+Otj?zb(D2O2!bgBkA4|3 zp6*z7RqBbKHs!%y@YC}6T1Jn!xW0RZt}uPRA+p`WmVdoO&=1w#N9E(>65VD9LF)$@ zF~*)H{BC5>;D2M?4Km2f^CTWpiL6^G{_0D_hvYmMV=MJgd(^SJBH1d?(*KjpM&ebR z-JOqzCswbTz%Rk*J0zv#eiTP`GaurrfkP5vPMU(yJ&dv1884J&`iaI^4(GgEBRnHN z8R1DQEQKfDqO-um5J;QPdCsMxMS}CbRL)VOxBUW(DSyHfk@O~ZcPt{)md7Sqol4GS zMt?E3@n%@~>=&)hJA|Dh@GH?iQTXjhRF$qHjTAtKdE}#Z>2Rjor$l4dk`X~O7nluS zeh>$%atu?FSr|tJ(PPMsnkngrH~vJXWC+{{dBJ49@~)`(073oBfBqwyMjpDx(`kr- zCsnnl-hbxZC^-mt{HR533EPcUm|yqqmIyp$EmPjW96(!cw~S|(I?o&Ov(BZV7nCVMvEgqM(IBSjj4LH)d;(N?wx5w?V* zPf+EIyC5|)S3O}cVy8vY$CX)KQdIm~4voza;(td&pl)-A2s`H?G(|0E@U8@Q?>@3W zL6GZdFjpFcU(JhC^aR0;(Eo&&<&^)G!&KPWNl-j78Fu8HWGXPP`ZF7&<&^w zM1Rv&1k%-n=^LX4)i|OR(}&Tw6U@1|7^+2XPlmcq-Wn6H@U`L~*SGsbVvqxoM-c6q zM2xTqB8b&2(QfMU)zKKW_IvT2IVPSc7h!HgnF%$kFvXO4w`&yQ2)w&(GTikKzPLe2 z)U)PF_&IKvzhx_NnX)V83Z-M7KPpL{EPpe>y$WkMBJPghwl$$SXcosfZBS5m&e157(b=p7F2_4c_zj- z95oUf97@P*@-zrt5eJ{qBF46&3ma%YuSXn3&P5n~rTocm`pJifbxQK5%2gjLWZewe z>-~_01c~CIn!i)TQwog3dtf_)V1E<6dgABP%r8kr<)`H#WJLH`xD$Ssyh`YFq<(OA zaa@>wa1g(R*)v9!f>*XJ77;BJfulfU+jyIf@#7?EQH4UR$EVnf#$GkvIeM zq7&K_;gLbXMRUervS^Cuc=d}ADa^_lD!Ud}gI6a+U%;vIadkVeb|YVkvLL*t^gUAB z4R29O`R1L7_7hH~1ge6y5Pu`>ZJe<3`)nUviCR9<_s*9Yfkd<@ndkHW7{E^Bh=+jg zunW0F>02QjemNZX?vT)DD&pSRM^o^+_aT>Vcy{-B+o?Ku{yc94INt5>f-;x+^Lp3| zEiRWNpKjzesW-eFS@9Fsv3ejfJx#lRlo2;h6D*bqqnG8t#NE0_)_%kh(Y ziJwBQ^H1YDM(-7qpjxAw8B!P0HtIr`SSYIzjHcW-A0F?<)ExQdXO z0XzA~8h;zId|!D+bWsEQ!bd67(J`@`fqmEm6!7Si)HeVAwD4%X<2ij(_|yE_Gk=hJ z!T+=H>P2(W(L#eITiyC(qQX83b~VJWjiY&LdM$VSpgFUibAP5ZJt-3q;e=A9=*|CO zM^>b*RM-r)<^MDi<(BphEZo!%2_chr|v`h&q16W*B;`>qsBb1+F zgm_rooJ+XevL!kKrNZpjaFUyIPS=*r%r2>8N@hU1Y*=-lp8_{7wmIj))qOd*I+{1J z+bnl0MOE&$Bg`%j=j!8Tc1_p8j>T~fUd7%A#gt9g34ia!(2^d9>*jSj4dX!HZp^Nk zIUNcrC?Y3vRah5kZx@9ZTR8}2bWS7wMt=aLLxC+uSa zdBi~;V}HfH!aW9>e21KTubliSI?|gyw$!~g!7)=G+kVP9ee6ypLKYy_J8{9bZF+W2 zsx2!g&6b{%Zo468oULC@22=VQG=Z9_*Z6pP6YG1H-Y9)*=}oF{IlYPTJx)OGm*}B` zvaq7gC6nOR;=2!vcPvLO1;5gs;Mj*)Xfa}v!+#%R@00x&KEck7xJ+HA!4$b!%k*{) z!ED{oDOs5PGqX*Gqw8mIJUZOa>_$Ba>$K8Xvn>5CRR?p^~c`cmF1hX?wiy($HTa#a?(IOne z#)%wn(r(Vu*>831!%kD$2XZbRA>%R|*?-*&5`fl^{6MX!agc7rt@sFfuMArJEuf~# zj?NhS_hhQN@`gZh{;=XuS$>G{02C>g!tr@ST=|mo*9bNTvsQ_nW`DP|am~oh**g0W zN9SW32Jn0{yfrj1_cl0xjkn?p*KPcFY8Ns7D~hyvZQz|)Je22rmJHF37#r00S$`Y3 zSK8yVHFniRx7Sf8K@rYvSg3OwsUyE_4dUoI@uQvhXf4iZW4#gUR}8R^&kl)-PYe7f zf*B6X594uzb`iv$4Q&tRa<1atuzyCQ$228a)kLHlZSsmS73FTVmKm}a+)**?fMn0)ouhybZ&4n{Y+&p z&d-=&A;>Gk8O0Gy>pVBX4YS~KcSz=|VFk;;F;oNFDoAq}Tcsx|b@f%)(hJFy8 zw%9c=n`_4?6^BiwU)fhU4u48S!gkl|7!`_e%_%V6xTru%vHYFv5Jp=TE-Ek^BwGRy zIVt5Ae~nX^4QKHQQgQH<$6pomrIc&0lKt1c_gs-evGsCnD#aTHPvU6&Jo_D?II$5q zw!MasXcBGMN6G^Y3lxwb*oTrGc`Z&sV;RC@3FFEGgCULFd2!d9p??g@9W%`Qx-5D? z5q3BczW>|gkHC2T-^Qyz8$*g!fw&cjSJBo3ui_`<@*9S9lgkJFD`gJ(Nx6LR`_8WG zfwvwKWiLF9SP;VCu|e4UNiZy0+KfpyJr8p)EIW@GBxPASjl4SrAK|xScY?RhvEVRWXk#O7fH%N9Q=!dwwjf#)m(| z$+El=D9aoDuoAbflm7(4E8;E_VIDDTG%zbq5CI{ye!nHjR-0Ljta7bOic~i7eX9vMQ zLSaV(;eSkOEPOk{i&|WxJ&(%pqB-uFeC)sParN<2c+u@-xw-sj=xoO!3Exd?Gy1cX zw!1PLjjri2z#gmLLy+qh&fvA>kU$j#w(O)}*eHeN3@x^sh$iAmcykiohy#SFsv!92 zhuaBz5GYtm`7bPvVpYl9D8HT{&rrW(MP6YGO@AVE!~}6ghX_mMz^{UVLY<1TB;p5# zDPJr?m{ruOCt^uoYxp5dbexO5qr!16n3CU7gbStZX~em(-HSjHwn^8`{GEB5Fn^bO zqGKTVL}3*02{pGcTg-)*IZTvbT?naR>&ul&YZHRF5(uub zA%8(evJeMHLD;z0LJ&6Wv4}oVJ>8;^5jO0Jht|tgbl=b=8GJllw&5jGv#e0;$jaNfg&fucSUoz`_cGw$4 z$YTV@bQlq?WL!<2##QxkY{^e)m zQQP`=$D+0m=?xqjsl=ap#i;&Gbc||oW;jN5MgXJQ*b}3AMHoi)>-Tm_J{x>C0e_@E z*d36X0#BdrhDz<59)vSuO71{h#QTGw(;;-~KNA_q5QN3tUFu%D?YcmzSC6s{=>|%T z7)r#CVNX!%?&p`i+HEhlpggN1h{@F=Jbx1m#VuX<4XXwVZUWuq+oBEii6hH%EXMZ1&DF47IOXIl7b zGxC+k1mj=Tu+cgynWgIKStIVSw`V;RiTh>ds|l(j3)>gicIOGO@yI1QnUD(TSymo@ z4869pyV0vMezxA|B=}DKh?HL^JaP>yiC#`2Z;E#n#ufU|t(Rq?U@?5Z%72V??~ip) zE*mA>O48j#um??2_j(a6iC)!_g0&5NJ=8K#aavQXI_{;gd*m8t(Hj3!c=u{pjU!5> zlhYBPNp&dD48rf`@%5IpT6Xtiijc!mU^dh0IsPCX$pfplDizWMX7*-tdM&>7oSVcY z9ke9XFMq=E>2dgPXI_|<9jC~w6Ay)-cL904_)>uO;o>_@>8o1N z3qBt?@n-a=U^<@$f(A2z_n^Gqu4YSX?IR($E<7NanQ&-jpH`*__C#JUFhpcq6Hc#N zFJ9~Eujb@aU6Sufdz3n$yx}XDNVb26lJWgHKEXHf^Uhx6=Z+~)=6@zCV%8@Lcipd~ z0&)VVjD)x%fPI3f%3q;%#XVWTIP3|Xbu`$H_-@Y%C|O0pe4vaH8}Nf;;X8!3M0p#Q zYLs2!nE4tZ!ypTtw{XtmHTdw$} zfWvgNp<#vgK36O(qJQdXKM1MppP_Mo*>X8eqPDVUB zoeqqBKe7cGUk_EBgbWRYZ|V!-tQMGUJh!O;K3=PVD76r!9}4)+L1+UM7F z{>ci+S-A2#uyD?i|9&tL(Sb45Mo8tTQ39I=3(Bolqkl79*wr3fPyWk~wXCy*i-#Y7 zsa-lu(2x&t>BqY%P>tXmKPc@Naf#|jGF#jppx@$qX1 zF;>>mHGhuyfMZNukou8*=n~G9&p9{j1frP8IZeCS_muFMA9NeHVO}S38^@m#E)VID z7Po5q0$p)TO}8a8fjIqTYs%zG1sPV?exOMWS#w?EZZp$U=zAEpZg!C>xDy)VI+at($PmJ6u2(NyBT%cVJ?J+KA|=mkgb1zko2ta3k>yYuR1J2jI9~neOp@|=)f&AU zB5H5|=EGoDXX6V9fU0t?Tn)tW;(t3uRfoQI?Zql_eoK{Su6pJ7aSCDYASHFp2$9z7 zGAcdm3Tq)h;1jA2&2NA}7;sfr`VFq?nCp%N8>iov8oq+Kig&;gg2H_K*xmT0JMgn! zfgi36eqLGwT?N-yis|*$0(#xS(d+Ik0zRqM+z~*6Dx>04bUU94drVkuDt|p48*9wy z->seqEcqj_VfDHmj4=o0pip6>P7j}fA5d>af#wiMVPeXUnA56>%ZWy7`)5|wad8O_ zB|~0mmu)!?M4x-G0LS0$$N zp33tb?Xct>s;p?a?6;(Oh)0dKP!dukCdvceCDv+kj;UmCn_Fjvg?}}nl3hzUtZXYR z-p(JOmR0MtBR_6}DQ`3!vQMb=tQ~(G-Ve1JTJ1Mhb&OBZ{|ji>whWkSOzD_7GMv@x zj{$+24KoT7ea}3<3$n44cA&7KZS6q*kg#+r=>T;fZM?#luEus>JE36}e&IFop(@|p zl)YjcL4?7LNZKJ5ihoYPM!Ji?B2Fo-voqm(L4I4!?n&s5#8c|t__4!3X(MLj7Y7C! zf=fHbwV$>QcS9(A&gd_W%Ab>pm3R(5uBrnV$o^GgValcWc-TEwReILw4~w@#i28@& z@ld~Y1&6AxjP+Fc=eivNq#Fa%u~5A)_)aYFR4pm;RSlT$hJXDb5S8M=_{vb|H+#NT z6nLxFjfIM=)0(vS zfq5D%tP$Gdi%QSD!iq}Iba=W@&|K9rw+>#7sRh#IfzLTnb*A96%r;-1T#J558U^#* zVt8WrQ~$*lT`|j_#0EYgyt`hK@UEV9{i2Ib&Ofe4lz)VKyC4ppvFb?zp<;QILyTZ9_y5*47 zAk663m{E*vDyBMHC#TZOsq~oY5lCg?kCLhci<$(rF{-WrH>WWfy4JtP?or8~#^v!< z5KZX6gnxcmQ!vdMIi!(5Zql#XxemVSDlB`P{B1poKmQw*g1lRf)ETObdyC0(njW9{ z;ctSK4TS53=bnHY`h#i zFd|2V_Ykzlh)wDp#`I=W=~o*ku#T&fHVzEiiGQTkLk>?}MsvN&AVE6ca=8M7TdL~j zrZjyUrwCT^!6(p4P5$n6W2=SNFJp%nj$C{d)#rgq1HmuSr6S3S2a*+I z4~e9)&3<!_H-&e zM=rp!SGM5qy5>rDjedGP{?2sc@9drUJAdz0{9X7G{w~>!zx$R;Xf1moob`n|Go_hi zjSj0fQ-Yr5q3#1B>durPU~{nk%nPVj1>dl#UwHjXzJgF}qe`UrP3Xk}Ru4UCL~K9C zYAUT`Uf7S?RPW(ie0=d;eEci?1mhKxy1m@hqi!W#QS0_(S47?BN39!rqc<~qzki*| zIHq8U4?uEi2U4Adg9J)MNhh5b!E$R^LoHKM9KGCGk>yT{TJG3Txi@wZ;-)@Qk1Nq! z^(SA!@;NZKi`d4dkuKCSLq@3ZU#6tJdS<^51z|_1KT<- zz=1XGC&F@;*;oV2P%G2VwB3|>CV!6?SiXkQcX))sD5FWM1`dn`R%t(xMH{N^gIU6H z9b(g}!x^qT zlcZ2gMOk~3mDwomp*j}?&baMO>COq2z0Og6e$E4C|U=?HhpJP z0}XlzH860B$1~%v02RHR@JzSH5;Kv}CC6kYV=OcNQ>3^!=2MyRDJpe5FignxFr}l_ zB(i!LGED1Z3B&Xy^ZaEMB7bCrF-(Trsiw_@=uU5i$nN+om{vxs`txVCl_l}|@t{~+NxSE)`jeo61W=uV!Kf>sL zM4J>we}d6N#6n<`^=^1ss9uRFjIddKhTasq$8;=h~RT$!FWtoB&{Hcd5 zCyUAO4jwMIB6Ke7YZK73h3{!pH=QuqrP3%?EWkY8iUIBe7@yh9gejXKbk#i=`UVND zSv7^3@a3vF_=10Tn#jPLWE&RC6ddz?p(F*Z z!Hk}}q6{%NdF8N*!3PT?x2o`nzaA$5@B@9fBJ%+&vuQh7=JLvg16x$sx^v25Ok8LM zK4gHsA2c2&Kn~*bQk6nn47GjS6HnL4yzOYFxm~#bS(%Zs?|*~zgCP0eTL~L;JK|3V zW7lBp8bSB0%oCVuF1FB7y<0Z;EftQfKzN16LB{4hmSX> z)#EW7qbEhfG#P!Ea2&#{wW?r?VmAvrpjJSeh?A1Sy$BC|iiH^W~UKB&u z9zxX-_>3!K)e8Cz$Zi}et+Nfp<52vT$>k7<9{p*U0Dr%+ZX)G35dQivhlsGp=aRV% z4FlZ8W|`R_z|pG+pMhqd=-~qhfxRDc8IbwN2T5YDI2&1vtul*oSLEEcjSrjXH-#qp zV3_F4iwH|Vr+H}&Q~FD4)TWL(L^z8kS=|SJyy|m=|tC*AN|pH}wtHsN@C+!Y`e48Ax3}iSi0JV?%^E z1>`b(-vv1Z5g)(AM;hxPQk@fBJ*(sCimVQD8)4N!ZlhauUPQlG=-gr}7P2tN9K4Ys zGY9*l6!T`cV*U_W4BxYuHGyK5b&=0kKV27x#($?P;Nn}@-RQQJobPjve-$Ia2r?gx z-baS;gAGtS8byD83nu^ZA2Re+ud| z7V7#Gw9q$o)HbQ`Jk;tmD#qAh_InxqA%7Zg{$Y#@p8(P8;nsuF!d=z4%ze}7XjW1* z`NB^j^=J5XK=X=p`Kt%ekM>xZ@u!~A+WVHeZHf5V^tBPydYOMd06*9aM%{8Nv&^W= z$L3JieTGt7XvY^6fgad6B+M}?WHptUi^i0-;tg9m$$MS+`%|{L^!*W-1+~mxVSfGkCf@&Gx=`8gsc%$6@E9~)PjtO5wVN)%0^mFQrUm%U7N&gGo%`01^QaD^Yu*l{Yhj(y zwXWIG`Pk}Wro@Q`BAv5WkCRZc485I9GzTj;qc0ZJroglGW&ZNMQFX ziGX?To$Q{o65dr<+4LGKi+{@qyHm-Q9I~s7+p1}JC5E$m&^r(F8#kK2#+JBksn!`z zi(RlnYue)A_ftE%b~tOD<}9*bG&`zc2fl2qF?|_lN{5pB*y1d%O{roA=XyBR$bVzu zub4`|+jt}K#>k(v@Ls|2txDlANbts{VWmow;p_F^WVTuO$2BZpZGUmu1v6iy8*6sO z&On4W46qnlY}267zJj4Y5Ksv4J>Neikde!@B!$qXZMY}?&>jqMirjkVv%e~EP)M*IzE45v*cwBU#$NI z`oO}JqJd@hYL0o~Uw>qPKCH>jT1gCR4he6W(L4S0AzRk;K_Axk6&!zeF8?I~#&X)5 z4G(in$tYq*bhpOh%4=rHCW7h|y5^j6+L14;7nV-C0`1X)zQAoaGv#yOtM5(~`a^Zh zj;Ncvi(ki3#teBE(hs^qKeQK4Z_Aq&4L*T}aS4S!JQlGmsf-w-Uv!r!Mc z^G#ML*0L~HBP7phmn;jLOWhma3l{n(C?QXEm6fW+{T6<8F7_t3@NN$K2m6F{4t`&# zQ~sg7?oOHdHR+U7-8vgW?pzqEi8V zjfU?2G4Zh5r<@foZ$K@iIdj=xaIUv?Xv7vmWf?b8Ch(=`Fp(;#5GSE!vb+0Ks#;AA zu}yq!Z-2JfFDX&Si7EY^e0Xiq<+Hmp5R2ur4QguJi5cY!zkWwS+!f$NT59C0NmMg5 z%L{vnRg5_c^0SSgrk{T<1psqEjK6ZO6;?L|)dz~;!#RQvweK56wQ*)y9wm zV*E08{=*M>sl0LKK0H3I5s%Wx9C#G>N7ZNKoXb-$_t1Z7?8Mf11fkKwth^(vk-Y{l zQ!p$r_N-#tG@C4QDsq8sMy2q%ifamQ7p|VX&xzqwlxq@i;cS{j}lO zhLPMWL9~CB&77xs5|`G%B~@VT7SU$j8{{1Miae@Od1(E;rS7%&V1@UD)W;gE?WZjK z!B>d6aeA#8wH&$Q7tKlaz=E!hw`)+HQN>9W9O^q>Ci;%({kNZ}M)p(I&s2}bkLsZ& z8c=!ae$E+Pzselculn8B{*ZnZ7gVr1mLe-y&47RR*Qa1b$}1+5dpWfq2|9`-_9Mh< z!~`QAy?i>3Nd(a)m7=-mB8*4^U@pX>V}PtWMeRaHphXcCg?Te#;E?7#=$JFB|UJ1YpGq(lkhjT2k z7isb70`?+9FzNRfNS#_>Po4w`d<2&kSn;lX#0e;7*tCyGwyHzWCYMg2Mp;oiS<6}3 z73d}5GYqDfE#bf?Hk}^bOy!*GAYMn`-iv=Z`;E+mI>bR)HMo^!=3g>V>6i`SSPE>q zv0@$tXMvp(3d~mb#Y!!Pniz5KG?e10U`jVissf@CaWLf3Vxqzo8iBlP!3yjXIwT`A zUcK&I&>)2Pm}{Ma=q^(pI~Ny$?!pZ0k~LPB5J(n3BC!zFhXo;Hk1!AxS>OGO(VBqz`)#WRZs3vAeyKM<$kYcT2a6?=9bgf; zQ^Jiu`X!_xS*&BD2DUnnq4-8UU{HUe!r@ml&;N?Bc}=^KadMm=g=z=s6+rs)hS$N4 z-)y*KVWu6;JOdnDw#5LuQ8sIcO>LIk;w3B~y~%87U`pGFpr;-+*3!{D(9t}~lI})F z--deI(5g#6)K&dxORT!qzCgp*yi!TJdYS zTDH`zVX)#ubuN<-zA5tz1}8wUng*vgWx?Wr=sz$zf}W!*e7`3e_EE3=C+^KsVf5!?m_ zmoCG}l_NQ+23`$-&xSi1xZ*gzQNg+st#;MaK%6+VhV^ARD(tY`o#Of&($~jxI>Qb=p{Z+t|25EEh5j% z7)g<5_P-sc2)C{Y$CC=;3)*tg30@xMN>hbrF8L+sUor;TjLM<0_B+awqJT?fC&nqNRSKc;aA1&$??uO(`waET2H%GeDQ*hIAHtLK zEqps@H{8wMjzfdHU(nr!%;N|jeJ(RN8I}NpBRn!qhS)6r+#hMm3!@JWqEgwOE}4JA zzq={3jqYWj8S_x>H;0^G6Vno5QVSBhycSdT(;B3kM%@ z|518|DH%y_B&K8_iBZi-M~PPPVU%j@O5!B%J+9bHE;+b7#XnD-+8Vr*c zvQG?Te+S9_BxZjfkNV4=^N>9%sm-F<&!XASqS?=)+0UZc&kD=_CCuImbntdq)R@xI zFw>&=ukYR2{cyLVIYz4WxnX-IJa;fS+?F2l_sob|i@YDzKFF1va4T$9|K7LjC-A;@ zJql4S?Uw$-nKU9YU^jL@ljh3c=T+1mgzJuCswH^7Z$N)mxPxlw5!QhN9)PF|nlisb ziFTN-Ao@q8x`K@U6w4n8X$<}x9YIboD+xnTM9V@26#ftvb(U7+zo{dLo0GFhRi!Xb zx*=`Bkb)pEp=6;2TOlY-m6&S}m$tm|^Y6UTHR=@UcKsC_HqSQN}8VIpR zCRd_rU>Q*jd^V1*29In9PP;0o8aPJXO*L@VV9JPH`WE8-Nlg}%&sS$Lb4PCX;t^F% zm<2mymXEh*kkjj2g!T>BPwKE!jlx^@5M>N#o{fJ$V8f_kOC|OXwMAMD84D8mjx;QN z<-0P-R|-6hd*>f`ZdiruRpVJ;49Al5ghKU+);RQhUEs#U0*8(-RR-zlnIV z2A|Mh@@051F-3>*6~Y)0OYsx-U2Ucw(A)U}nm+bwJ-isrI1VvLIP;N(9*HY?U) zhObckwCWX4!tazP;Az!D;%A$N*Q}ZYzu$kXibpf}7Ez74w;+T;o|d}QF33X_?W)W+ z*>5x2;g79`n?q23EuJW`%oymAqIw8}_A5B(L-by(MCti>1@qjpFkQsFGL}Dy?JfM6 zBS~=65Ku(qgbO(liijM>77k93aCpusgYlg*XJ?$^nZfoHa%yiOihII4kcuEw;eLPQ zwfLZh8{&JyBT_Ft9=2o&^Rj@_kz@RqAjd(NVeC$Fjz0s^&I+aFAnpBfS`O0|2&1yl zp-wkNzwr|yv=ZM8X(j4qt;9YP$VZ+C)^;TX(3Ac$qLwIpZ-4;Yw#vB{qvRord@&j( z6f^zS>(&Ub-a%X8rI5YTgy4tv!%crLM9UJ^-Vv;2Fh8MeJd}Xveo#uWRn`Hxj63J$ zvRzbPVhOMYx(+=yw*;-`P#rO|Eoe7q?5U1;o2-s_D^W-66FR9B8K94$3Ey7NrBM+U zQ4YY*oSSm@0jeGF@c5uAVlf$8LgDQaT>@~z!F)SGEG(cSBGeIaqC5T?r=Wif;bM(i zLB6q@M&d98m-y;Us*xB{5O}bENI_u#eySkw7ow9zH3YoG-UFUm@Ttb<2xudYmSur{ z)JE)2v=Nb0fA&qnSBvwBF5(|#MFB2?e%i9Tw_u0u<`AhI4y2NK@g!lV0u6^M1C_D~ z%cwVr%D@hkmWoHH%79kco63JcH~7{b$^-Y2^**e2z!{>(A?`B5Ysi!!7Zj`|^THsa zLNIAl|A<o(eGC8DCgt2~XUUuU z=^G8lvq2<@2pkDkgQ#sGB#B=>L69UyAO_&tNeX*)&QjY0IcBEhZHS&@p$E4)4=^R$ z@LFsu&UwOCkYlsya#nxa2If4&ls3~tRJ85!eM;}qipEz( z4`Da2QBJh?GrMwQ;B_K7>0`BGcFyhe-6Z>X`CU@r-N>;8IjMiE2XlLs+Ghze7RUUp zVr4u;NuV%r5jLj4AKW-H9B_fx;fvO0MU#`l3t4)^yzw33WRcmfF>aWVgH=1HW5wNUQ4 z7uqDpxlw5MQ0aeJH^vQVjzEl$YZbTjL!IOgYZdx_ipulnKB;ASce;n*68yfs1Em&g z*!ELsHsA}TzETKu9>Y$f)6Nnd>ODc0Uss-gZ_l~P^QYfP5l+M@$W2q=ruqcdS>H!j zS#kP}dSbbxtvXYPYUO)At2$IrQ+1_Z7G_pPGsBPf>ra0Y!={X?3k63oVgp3dLaTC7 z@wH~gMaWCYdExR*ceeV4;fdtfHUnWi;lBX>7r=k9y+2H!qOJrysVYGK34}vH2rS|% zVg9gog7=?+ej)SDBBTtON-v-1?PY&;>p!4BjmqfzE8i8PQqg0-6?e5AsMYP!?A2lZ zTJY>Z1~PwzEsQYaemvuf0v3z5?5x(?1E1vajxNa;Qy1lU^04pNzz8v?i%s=*`<|gV zuWX85zGv#uh!^xc)C!sUetFRUpRjGdJk|EUiESe-A{5F0{|aoIzaD9ez_w9FVB6TP zT#*R2&0oGzCW>vh`9Gn{M6hW>F1{5iLd|!Q>f-HZ| zu;)BxIJNO6MAeb-Xa={0Xe`}A_Kq}NwZXgoONdc}M>hde-UWD+m5Ya384$}z40^-N zUJv_TjKq8P4eo01hVMk?!oP32Ci&h{1>Eq2u$yH^H9@Htv>U8XJJ1hb=9yBrv1}O2 zU&-Se7_*<_KeO$-M3=0%&Whp@ZsRtnXbU!z)*Q zat%j((YztHyDX*Ua}dZhL>5#I?8< zD%s6HDnG#q$GX2(v%8V(n1cs#tjok2nO**n9s%q4;Z6iZA8agBnfW*~IpE`lf4Ajp z6q$*tYSnFKmrbWc93gg_SG)r)_VL?|S@ZPvp;+Uabe$43X{Z#FYkCIJd*aI|MOSW9 zuw}8jywbkRR-P!jm)8dr5g303Q+}{i+BlAsUV#-jE?8NW8<7WA#ll@pS)6o?ld8?0 zi?LQm#nrV(MYEBAp0u}-DfbW^fJWiIEiu@$C2pIAbKNU#>*t!bcgI<~rdpZ7Np<26 zX2W4y-_4!bb`=}b)KyW|PgHfW5|liWs1h9I&mO?W%H7r^DCVgZoT`5naud}g(3CYo zXJ(B5W;a*m8_UL9T=&L6b#YjX#vuX=Vfqmu&1>U0{s@;|%at|~eZV~4psZCI-0sJ%^p6%76FpTM zq{@vs#+GSJWd%y#3j|2|dD7uTD~W(N(h*s|qP7FA&W(BkLj76X zJF}ZVkSFgUc(nUlJG=P#NUTf6o;iCY}#?UMLZnXA}$YX z5g#X8M5Y|;ooOFxWgTl`=r%Dne4CgHuWy%MPqI&xUk878iZ@yvLIFg%{@o&shv9ce z@GHPl`PN*E^amqkwxUb2(rnVYl z?87)-WtL#*XlRS5I7dZ{m31bF4Zv8$P`*;*4advcc%Z#k{fKXV*&+GfE04 z5cxjni1^IRM&G3u!hphjw+#1pdw=@wupO1}+c}cdy$y!Uq5Q;L&b3rmFT z5ydsXh5|xFG{=saQreFYbwI{tr9R z-yBF`wZEFzE|FqlmHiDZ=WUXaeQ zh%A5C-LJBYsVWFzP6=87$Xv!j7j7cr(I{}{9Y+-1;LMkCK{)ebqw~pPDP_amK{)f` z5Q_M7rf~4_wWc7P`FJB)J~n;V8HPDtXbOijpJ@uhncp6YGdUv1TS$)AXp8>pLF~_? zv{7$}Kr@$&0W|X`!y*X_9t@0tUp&|y%shXCs$=7ti!1I!-st)ObHYx88(<(eE98OP zVR1gWo#n5=2E_**8Mxf1A6_POQ>-)22MU%y}*kKbkNSrqy@@1J3j~jy#}6 zdF4c?#G4+*p~ai#;`%J5OoFcAPvw@h*@*j&9}C(gW7d;@!4AoLPWXmC9wU$CLQ?^< zJmL*7pqqrfFHm_?zOa+r{Q!83-4v2g9ia2e{w*aLfG+QjKb(#)Xec)No0um6p2|3s~SG_BTq?0 zG3D{?u%0K7+s)e`UG}18`znizq}-cJZK~oK$n}266?OsnQSwN`JnkU3Igp1qHcFfW zPIxh(#?*|)pHhl(8tm3hg42KW6_&`9)Dw8ot*G>3ZvPU7VKXdbWa58f#RQAL3=RFkR52UH4UGjDPEt*7;;vC9owPc*Q z%S`oUCZWvKQfBg_*+d-6Xq6(9t^Qb@NPXY_MMwzwzU7>GJ2~f^-Kf;1;+%=dIKCCTe`8Lo9o+k7G6sGkZk zUwVlQ)dzqq!0^lx6mjjuM`6|$37czm3da+vPzF;TTj*$3QW2J8jYhdK8x|z~5bMfU zk_hCDuX+DfNlpqoWOc*0Fr(z;1;OMbBvV#pbxl`JA$nAN%<6wWP?}tjID!;15QQCw zh-{4(un7vtjMRdq{LxlB@JHiPyQJRiAVL^v2+K0J6k%6xU2}?{qE*eDk7o;h!6qma zh?&N@;uHr$STv~p$)6;`kWYddJ!vTV2ezc@N>LlZTCxJCqGrmg#R8NAj^#>^*wT#Hd+U4&%rKiihR zFC;{_EnR;SVOzS0DcKsbE&br9Y)i3EggaimBKdX%Y)fD1XEB)n7?xIr3`;YekWUoD(wm84>6|}DH7vd7 z`72V;q%+Y1#-u#(Hrfr;S`?hZLHDdC)nVeRr z@4O(>-O}YS2zSSkE~zzcYeb>K0$2VszDc|!CWWHy6kkEoLQAo#BPRY7^X@^GuTSrQb!dU9q%qH_H1YK&C#zvf z-oqwQwQ#N?Dh4U$4AnLZe~|T@k7aqU$2Y6HWc3fDbKzQIttLd_bEtWB)X*#3|#$pd*A`Ff~*X_f6XX28Nn?v|#aHkz|A(W>%W5!fQv$drFeR%nfT ztj5eM7&6VurhQps)XhMK1n#?t#RPDZY zfM^KUGtb?Pj|Zm8k6Xv$BLP(1Pmg=g*hgATs*`LftFaG2+%HqM(w=CAu1NItC7Rlj zeFVlRg}u1FzcJgWGuo5zlFNUTe2F47{uHrBHt|>4PcTpT^x-D{0=KZm0)v1vrG3rv zl38^L=usSyB<9^(KE^cy+WjlrAn2`lcAFdeOT})hat=e(7m;xegYZ}gR9lV8CkX1d z+3|f0n|`fS+O!*`q$brDru1tjc>E=bS$D^{vHOakeT=Glmh_Ajx@>>r?WJd!G6H+H zUZ-REMCRJIT!~z!Hh$?>^woG}Bjt(g3zpB+*cFP4xQYzRjR}`C-3VS|Gvzr`slEGu2 z3b!|7=idYmH=~Sh3_jfq>8kC0U_dO@jj^&)g{ZYkZY*Yu7$>EV1i5_w1VXmjQnT32k3-MFwPNTA!=D?f~oY3 z?Ms?fp-e1TnOb~dp9o2YFf$d6%{eYEVB60a8Sd->Bm*pJPE|a>dakH& zo2hP%4TCDNR=su+C|@pk=v(* z#bu1y(_-xj#_SlTX+)DVhgN8;e7rr3g53!p(Ioaq-2p7;PB9+tFb=j=;9(+` zt|636UdNE0jlm2jT8&8qbuvMl6hY9$G?{;ziNl!k5jt!8nJCl@Wei#}amc))lOHBD zQ~JSGG#@K1hLMK&l?jUzp+U@vl%A&5S`D@2?9<2?-7Fp`xo}V;Go1V?VqyGISF57V z5>!9wECJ8MSZ0}?<2|j+vSCO+^EHhA>&r~x6Nq&OSDc!K7pQ$kQS)V{;3CY<8{vO{ zu_m17?Og|X<+-c>10Ce#ySnQjo0*cGvi|X3Wc}k8sQ&TNoF{BWIZJJm{=cq++(X_P zZh!jn!07g;O?#pu0?2p){Z{mX7hnq7)8DoJYBc?aw?2pv0|)gJeZx|s$%l!)mhXmD z0U(}W{;+F$^)7Tp_B%<6g5NW66zqSf9)7q7eh*~!rz@S2`>9vLqW!d-3Kk)C;>m!V z%FpbdmCf;|53C_lrN=gfWK)~QF(vQg?L{`aZ0aMFHDyk^Ci%9L6a`Gl%ROaNFJi3Z zan~r?nVj>UX4uL{sbEj_H3PnmS=< zvg?Rw>YEAIqKT%Y$=4)VFvX%^iu$sr7Z8>c(YG~cbnH`DVS13MB``bVM?QD zs=3T`9;H(^p>!&)+SEKw9LSc`k=t}J0p(KhaGPr8FKwHh?V7e@$60$~nGbU{i1IWbLZl@`Bv5^^=<+(8wWxIhlwQzi%0L-na1y&z9>3Xji%R2f>W`2LL#q|M(nE5!K z8~75l_gtTqeNh9-_O7(R;UzICxvIweS17srVkZ_d@iaSjI?>31^QwTQpt6kf_b42Ipn=# z^G3Y_f{pBUWDlsU7Q573*2-7@NVuuhe8p*fSY<2wcTu zU%#I!)c%h2&R~9KDt6EGRP3K*sfIONTYplFb<9kah`7p+EA*0AsJJTs`Y_R`zRk_I zC>1{TH~#-kd+mRT4GI7E*lYjZ+wuR~YhQ=G_NAwLx7U7XYfpRa_ZI)Oz4mLTNxQ4r zH^c0;Wlt`TGIK{>D(%&3dpfb&p3>6@u_9!ISRS<3PU&H;eRTJ?1J)7KI2$|Ii6MLd15Jj`Uf??=~TvV9ur_+vDaZArG4{`SK-#fmkU;nyF^ zCfiS-$#ywBty+NLAAKmBY~SCj$u=>^rY74>nQZ}6?PKtNR<_eFJVI@?3l72ki3oe` z6MygBUfX{@sJp%P!a-5&wYRCm?6qHC(bHag+@O%X_7@8y?6tpK7-6qHcR~PmJ!r4} zz>1)~_G=3x?6v>8Fv4DY_=G5qS-y|`Pxjh}W4qaFXR5o|Yd@88J@(pv9IsMbhrPCa zd=FnY#R3=m|4@7Fm$y)R?NPD+hq`wUY^uuohEIQPZ3-3aU!N0*2E zwXJ^!&Gr4Yr#;rwU;8h|+Qa_Z1GfJ^_t$P%{lDE``-#fLFXVeY~Q?L&oP1 z4hi;Q&(jBn6fimFvdhww&qZKJ0j(}OEPa19Kuc}1$3OQAA*8zW3u3z@9w7UkDW`DX zbEH=~@)m+b9R%?qy`h`3;kMs}MDo7uuMV7viL}3Ry>%V?tD>gXpR>O*^ksi#h_Js} z`bszZtGmm)*Xreite}XCURB%nez~^CdOTo1}lI zi@NZD?b}HJXK28DVkS*dO1UKu_;}$4#0GW_knVx>?zu58z32^mj>du?!>3D5voCr| zJdXE^rZbRca#x;#cZKE2d5qO;bJHwR^Z|G&sR;(z;(MagocKTiIwa<~2Qm3MV1e8QRi zy$Ptn+?bwIs0$DBzK+nd@E&@PILtcP7dBZUxQ{2T7_gzmEMArqd_&OWo9ch4*?pH- z+-oQyt}tfTCOukdjulqC#}HFR@rYFVavR8uY%zu|6D{w_)vj!VOM~X`?ge|$(DE=F zZ`tFrNN}izU!$CGb_lW2Tq)-6K@Z~TucGx~?xFMsyDK|N^3{{e17e*kd!+OsT#55W z!i|qy*@@Dh@u7R(V319LA=!T;eeg;rO02^Io7`L{XRIn5i?Plmpv-a=gDS;aJb`6$ z!ovx~jD6219dh7;(5@y`*@OLWcC9n)V+?qbZf7m!SOk#o2ud`3;XSOX1y#8=66G1H zlinaFygZcDAWF=A&y_QnE2|3GaNO&nYU@4SWBm4^vi3i4sI5o*g3W))i3`xoA@3?N zb9hfj`f6Tz$jspnK)uCNK%R<3m4Z#3#_d6cu5`yZ9SyZy$L*LIQy5Jc1FX9XfA)lHgIEUu}QK^>AH{Afps6G>rFtrzh2xemTeM6Iuw=~7{odh zmg=D}OB3OXwxP&E>?e+uxUU9d4*Ee(FynpbgIg2`ZzxJW?nC6+fWks=5j;V(f+Q|{ z*n^9(tO+E$MHHrBgD}ickiKo43%}|gr|QKhz;|Lp6-syk@o6n z3=*mJ7ys08Jpcs%p9*^V&+*he1b2$?jCir6L}DtC`7ab*m8Cme1X&>hS)yzH-+Qbt zeRNp){QQ|V*+1l<96=-Wl!S+o85?=AA1`=;%H0T4bth8M?b&GU&5LZ;{XWfxy7bk$ zd#YkUcq!-F>c)T7n#Xy}{k>+FZU)@!Q^D_F@92&j$rERO;`@!B--^rk6*i>3P@Pi5x5occ=O5mCY0!rD=b}FM{?Y^}fg<_z!uKZf#H& z_OGECK^k`+&@)cW1J!hHEosS z;S%r>zpNalEPPCB;@yLNV)iuRbGh;Tt8!rWF9xGnI}W#|0z)u2cPwy7#Rp4~(&$|| zX=F#n)K`Ctr8oF%*7UU3qAutZH-oJHW2NE^VaKpXHU?!19mz)kqNDlyN$N*p-lJjI z-FiE^N|l+^(77{0jClk6nofg>fUAYNepHRT9=ag*Sc$qMH$9GqJyP`7vZTeA>V_ zko^jhecM2yk@7QgB;HYqwElI%XV$%pw0A=y!?PAX5gqWmC=BMG7^xkNT*q(!D7>X( z0kMDAwE#$8uE*xO1=~J4o$h$p+?J*)OVd1NBP@)4kvF3TQ7SV2dTb*PWoHv{;yCd3aJi7&&8mdt5pXKSuI*^G*HJC`{)+4)Vb z_(OUPoX=G|Qth0uRXg1|4leJFa)w^xGHtW;&L4B#(`H$P%6@P?#BmrFL{Dz&4`_ds ztE`Vr*7{B~1(n|Y3&YHHPrAL-@?Nng#~nL`Xg+ML*>4p;lWsVQe0-3U^CiMWx8#D~r~0Rf*=rlY~p^dxEoZA1fx41{jA}0r> zX>jzbuYs^T06$mpj}BR4;PdGPZ=gAy zgX11bFzJrR#%+|jtLx6(^=*HXKo{Fe4>0TQ3)gzuwIZ9>beXVuNdw4KUcD#8<{5yp zrxSnCB;vw{Xl^V9)>?nqN^6}lfYcg` z+n4WIbH98u(zi+t)CzW%Beax6(A z1fZ68k9@$IT1}Dc`P6EgTbl#VLs0h4{@tMLeH6-mAt_TM6DreTCR8Rg_1f{5Ud4YW zob*pjSMgbbcmF>rzH>!a(Zgu>5v5n)?wy)0xO*RkyT_tCZXkb|j!-hCh3xA~yzvw( zd`3!qHHv-ON7(7p{a{U$59W#oh@H295pumrs(AvbRy-1oPvBH! z0^_6)F&|f2x+gG{r1{S$x|AEPH6i6jL@*YjYa-r-J@!Kt_f%g`93QGw3F%Xk(ob8L z!KxG1s5CfYFc8zjrNaX{WJQ+X(o-N@Q>~vb9eY10+uVOMrXGrcbwUe5X{@9y78xT| z&LA9#TBDVKIc4x5E=TVnRC<#13cO0+87!fUAB}GPlS@ZS2OjUL;9E~bRB$!r;=&aK zPEI_`ryeiU_A6EKvKPeiqr7lY<@_FtSq)ijgsj{Tj17F)7ynI|TVFSOm-dRbKH^ra z>=7>q86SV~q%HGF16%y48rhv0MUO@?vanK%)*kq;W{Y#wMAqlcrR$P`0XEp!PZ(nH zlx;AVW@lQUw4d?rRY~SdC$rhdxlK)3_pKjbg`?24jVrUwRs}R%*O;owE(@H!WGliTqIgk#O zOY@IK(_4Hm3f`L(sO*`35~Pn2a#FNyjd1av3W{6uJ!+R1qt!&22i{F`WMqwVq-Lc$ zMrVKB?1;}wV@pu^4KL~aK6;|{@1rLw5;`4DlKgMc6Se>MrpFqav^eK!yKt^r-G!>PXd11x_+iR5elN&+HWi1g$TT<~-B2<=nFDJf83 zvn8hlZo$Mo-VG#**-3#ZXyw<#=#N)m8@jPK@sK}>^wl+Qt{0^#LLNT--<>`51BtvV zHkmlLYvH}b9{OuBZo+#p$T$c!Dn2vri<%hpc#DiTwO}6FR=f{9M+=S5-Uxy|d;VqXvbY{=a(RxVxZ10Y5*?pv^wVfwTeRGz!8_nhY6YQ^{jYx~&mK>cp@ z%!qiVLw())+q7UFHQh^*?%o-csWM({bkDgYy-^uNSt*4ldvhRan1&+k0(E}_ec`)S zSz7oVZYWq%Z0=l`PU24DeP&66?g4pKk5Aw(iHzssL2iIcmnDr@in=U`E=!VBdykq4 z-N#J!=pwRE(hQuZMyLwZtqChq7-=7wMhH2Ya({0QF}=Y*DyOZx{i6Q9uEx6_zn5ke z+j9|@p&6Dxgg%UW$cG~J4h?^5`gPYTVdxsG*7d8>HUA@qAvh^BB)BQwdK|7L-Aa^K z#kd-{kiD)rFC0a0YUK>v7+ZgDDM;`XDj-*^0@+Ra@eLw&q)3MzMqxjl*iRK5LO#K< zSK19Xg^W1IyV5&w_IDM?wWwC?A~GORLmj1GJqyQ@{Bax79-fi+?# zuEuw_YP616-kqbDewxZKl~IiJg&molSfVmlO1iphlP0MP(oFim9v0?ahI$5$@WK(< zCay}eiJdmF4SkgQ@q&LWJG3_UdO7_9hBVh%jTamX$Opx#=#Syy#ACRwO?X9v;1wxF zn;CEu6c5LyjaEs&`gC){(mC?+5D*p}g_2PvYAG{`CA47j&X-E%AVyR6qRg-Xd zXxqjyzBF9adJ0QfguX2 zz#8d~uTfNiHNSrlRRBNN;XnS1Q3cinR$d=fpp2jjur2~iIqviSaRA3P7|kn#HYA&Z z212@lzaasflw$$h%hwI~4ecegGSS752l>IkQ2HJX{1~L@0iC7jofEWK)2m ztV*(q>r%Qb98ec+iU?!Z3+EJZ@nD$o;wktD@I&ov$`OAu;4rq-f6XCb0;Qp^K(p=E z;DAB^)S{VD3{)N@m%UV>p?iHlh5}e}0-mP9iwVcKlR907;;#YvuX~(4Hz0@_+DX*{ zI|`5V8!xg8XMC`Pd<0&njVhEdQD_;g;W|O8gt|H5Iz`bsJ-tuIT!A{l(=>Q7;kF`#`YE`41?r@Q=l783q)yr^ zv`$w-b$We{5?>MOw03u7ovw7%=?bmWm4CBNee{#e(>jg$yjwptntJwA>)!7DG`XmI zKUMC%en0hF+|^H=@BL5u$tKnyn-VsG$`$KupJuTmR}@S3h6q)iFg8L;&Yz-JTT$??VXQ#y&g#b&MMvIM~H2b&-pbYDavyKqg+} z2apJ*8DfYqSIG!Wvi|g|lN6dq=}- z1Ues1-XzfZ1T~)w65NAY`3hvHO%|HRXv%-RL9{lN5GdcAyoPJTHDV$fv|WUsEqN)7 zqeQYxi58VO)}T;G8!OlpjD3^vOd%nW2``aj0oqt5JRNcVc=)^k%9VedgviAkBp_eD z4}SIV`&>zX48CU|8>mpKZ~X}oi#N6x8pOU}!FFm=nyw|(P}pvfjWvFxHHs;Wf;@l! z8PGyz|D;V;IQidhvR6pB0n%hNp>!~njpb{{6b=ndAU#YVL~VQA z>;FhiMr~{06T-rjAGW_gYlNBp(>FAk+1&1 zMa(N5$!S#}cA^doJsvps-6PT5aPZi+S*O=wCTPsT>MtKNTHUVn9q;XftOB0uSanQd5$b1 z&6bnVFgl;+!MV31H#XxMaEt4s_aT6F;3iJ=l32{Iw6&8v$RufMku@@>lC~q3)n4l| zFOU(WG=vc1J&*rhVsbg@5cGc}jOEMhL@)X|vMDei42NKF9K+76=FxF82ogP;at`g! z?HdT~e7uE+Jl$~*r^0k#3ugR&0~wSzuO~;t4lgqS=R*FBCG^H?-n#MeI0xV(1(;C> zrY@jw%@{_GUH31or}w!Y_s=T#>GQ7pF-kuE9{1~&^lxzFeh1bH=>mT?Kow1Bc)`17 zTs%YV-(e8vpT`;O{X;Sqzn}u!-$P@6qMbgznU7ZT`Cc~Vpc2?C-$QQT-vRvd;fT^> zJmgmvkl@W8oNsGzDla8#Y#zV;KxsGSCC)kF{7ST9fxe(K?Hd>)d}7!9yG+nXQd+LC z_kGKz93psz-KU!2P6U5oe|kPL-jTD46|k=IdY?|B{X&jKHJ=FsxvFAo*KA0s9+=2@a7%Y)U=t(uBE`P9vE~SWC~5)Fc!}oDYvU z9};msC*pjxLhos|y4iGjIEL%=Ao}Qq>ZPfqa|nz56{U9Md|-cJ*ZJXy`wbE2FWuR7 z{?zT{ytq1TA{nf8&~eVKq|W!16V@E);z}Qo7XJy<4uVAQrvPC@ zp@p7#6aMY&))sc3Gz7yh2P%;KP___g0Hs4$2LW} zFk#ueD8^qHUb#Z+))#kw{IYdx`AiIK`%k*iE3200rvJZJt=Au?tJdEh?^>x|jW~bi z@&Dnfg-f%4NW?l%<9aBO32e!F3{elv8k^EMuGYQ%cA&IE@J?3v6In=(+T3y394*@4 z?LgYB?AAI$3>NABWXIXN%Y)&aH6GsEJPGbLS~c^%8`zYu;awe_c}J7=Tn2i4eM)AMjxW<8v#t z%nW2fSz-1II%a!&3_6}ZJ@f@+@#9g$()?e>_j-Y{1i}e$i{A>H-4EKLgi` zwJCeiA#~bU{hd7n}og zOO89zIPsu#7~`bD>p(9-4M?!tvo>8*1AAJLBVu!c8g#&Q~9o00IESx_7P#yIPIWm>ZqeVU#4UK*ke%n|h`q-B} z+dJX2478@v$CkWHT@d1SJ`v5N*GSv3pvPc!ZUwR!t4uvL)xiKQRLHT7XxE zi{(JFfT0^d04e}WHDvrL9rs?E88$KR4Ne0Rb+d4G8|sJJfq&DXCte+forjmK+nbRI zL%wS2%E<=8e|d=1w+L<)oaK-=1C}OXSS}%dFE^{`u^n6N8*I=QrWV0_Kv@2J>IOK0 zMm$1S@VEiF)W;8&@*iO}r=EAfCPAJUczo3NHqsMhF@DuX^j+VxDb45#XD057`QPHm z^(p~Y(Q9te518TS)NRj@u$jJ97s}-yHu}YSxPjqx;-04oblJ*-g zIi&g)x@_0cD@fP?IUpH51|@-}hu4}3f3*}_u^bnnHC>%9Dm@M5Y^F>tq=l}+#zYlN zJ*{vfRj3t*b;1XCv0ZoMpxaFiGB&Q9s4hy(i%JW4&lx~CV0V?1)$A;+ zW)o|9&5p{%5eA0#Oattkf8&ulm7*-$8_aO(B_0zKKzY;8kIv= z(J$was2wF}MAxlm;?+veD9$w>B#&x5zD&ld}S40ozW9RE^ zcH+pXJBDJ|^PVgfTOtv;C~qtzkQR^qNyc_L7BRz{?qnCXDj7EsFW2)5*PpPJ7V}G* zcgqTNIA*6b6{7d(mBJV@XU|!GNh^HKk-3t8kfRLAKjEI2HpCaSnEBZMi@vb4lfQbZ zpHpugSBYP23=h6YIul8A3r>+&lAUAsjU}|#C%tq7sYbv+Bwse=lrkn8VYDts#t*(q z2@~#E?hJ#bugb8nDfbgExFruP>1%_?v>=4+QDtcaIw@CK5^=>BRwOZhl@9V8{EYjQ*Vio9KP$%WA>Xdg1TM`-PJZYV?ldM4)tZVoR zUeu0HBSVj0DsIQ+*DL8;>ylL@_4s0sBVJBe^qme8RHJu<6;6R%zxqYRHaLw%tJr!3C#}NX#PlZGxF~;K>BQ+Oa+K5eRsE$zKNPDh}qi`nRjQ zc$UK-iDK5?+ohBMF<{(Agd_$YE`y*l_o zrs8To)m3nEO*g&7DC;sWRYXvA12$J(#g&4~{y78`te3XJoQety)KB1cj)uTj*N5Ij z5bK7DK*1G1qIzI|v80EwSlG3b4pm&8=&d-ts0r@tl2*d~(*<7~Xg>S4F7PnMNZ03f=iGbmy7So!^D-Y!2P|kI>0OQ^1DRfgHIimwX};83fh zD+?B0QIO0U-YP>WzsK;Nen?6+BXC0X4sb%14RAtrBv9vnssqjSd&>_r*X%8amaf68 zLkF6@dk^BRLlsx@uMiCb47Xcvw?xrsqIqF7YTSL@(3icXZuna7uCeX<8m^4?-!g=0!}mdZI0zEdq>07AIo@mFEzv}5qpjZ?gZ z!*I+s4vJ=f4tO`D)a)IHlWXcSEfY9ev2k+sQv;l__`oa800AuUDR$nn6_^;_1wnP_ zFkrQw-k}U-7kQFiaFW0=W6SSQneK?kK$?19Xb)~X52?og{U*`|$M$B>(5k)z&HlHG zRYh4eVMRL#Aei`@iYrSz2e?fIUQ&Vs-usudOZFFk)%Z>eE!10o#Lu+v?>z93cdxD% zMwQ=B%c84T9*xKGPB=m)OX>;TIN(h!s1@rEG+%oAO?A?A{Ngz%S_ds!LLx2NDPF9H zgBNR1tZp*WWKgh1lJpy#uI^=!|NTomJk9MjwaM5mH}X2E*Nk5E`un0=Tk-X;mjrPb zNSBU(Fj&R{54rl&4lHMOLG6KuF75SH{JkLV?a72R=-z$+k4wDLdy|2@7)g2@;36MIxu4|!jz`gmeg#$D6|jV8jpcA zfgKlWWXSySn!rd-Y&hD?r8bD=ZFSr@uX$W8*LKoAqQ(wfBKv6#2N+66Q>qGAz{RagZ&r2=7kRI+1(nkL6PT!=ifk4_cO<`$jNObGlQCHf zZu&K=HIQNvKJ~vwbaNiaZS8+j@9l41XqWLLT6n>~1s_kDVFH@IHV)tYGra46m=ITt zgls&jgXbH5DvW_wuuSV?IZZ7uc#?#F_Sm)mM4BW7W7lN?iPiD$1pQIm0bR7&pyx%K z!9Y%9#rcNBD;S6(mKVHQTJ(Gsw8_Sch@OPs|6*x0!#?vgL#sdQW?Frx%^i2!F&%Iu z-tgBg8uU0yvA|jyur5Ok%p$93uGe1yhG}!XmJ@CD226|}^MpReKof7gi0Kl4F#!f^ z(T5Wp!97}%09w==cpSZMRuXvMl{ARK!|9ze`zc&1JHsFlv^4^g7Z`^OH@#jzl69qoRCK+)t^07)OHOL{+qJt-&Y~Fu*ZpLk9^R(XpsCY~V4Q1em1* z-Z7R|x$f7Yz!4o7IHICQ+=#*3&qC@?x8vT$opwRmTA>7qxLknWyDXN6zZQxRaa;*g zJG`wNKg1SSFrgq3%iv>OF(O6~YmNjIQH$j5weY{K0)s-l*k!&k*sUFZw!Im$De^WA zB~Y461M|&dxto(YaZq%ER}$Pz0AAwB;pVqlpZ6tCJq+$j!Dw#i>)MtVs^+mcz$vU zx{KUji+U7CET&44K7>?(!>B+_LZ8!UJWJtS8tFB708H_Vc<@{&_;F7=FDzI31uT?n zA}_X!U-Fp~9OHR0o>+A&zEqi$W;)w=*~e=d;j!~9FI-iv*X>t-k;piTd&?8AlgPYm zaV?R8p+XMMXZ)r;olPBb@PgYj%u+QbH1YHc>V zJ2u|Vx%%Z2AEg>ce=CBcOPKCfn;6Xl`Q>G=oy(lWJ6nN7%;AM9y}e4EL>wiAay66y zKmVNFHNn3T=(*j0HBnk*3i}KVz-yZ+Y-Ki;BQ8TkIT^CEyVlq$AEJHVT+|^;qagWy zG^$9iaV1JqzHjZ*P(7`W{$EM@--K&ax{ON{4&tJ1K+J`MvYp*}iA`yTRm=TEr`dg% zn%j>25lwG@s<>Kc0!3A&}@Z^Yx0N?iTmep?_G|1rfmcw#R( z?U)569tf!eGwhtP#xWiKy-?efs=yRDt#;~wNCjdLlsJ*Z>K=$ze($^Kl6eU-2}EO- zP?#hV-tu{PDi7TPQ~92($f>;iTx)lynurFC zz=U;gB<=)vkkBxVdua5IMo0WUJq=DK9kK;c-F=GPjd-!r42Bv^Q4i+`2X+O=MLa3Z zfh6HDAR1oQbjLpt&Zj7!sdMz_)41c*HU;hRl0wAXqW`jY;N5SRW!Pp0)5o#Biu}->80t^tCW{3p%9aQ*5Pn&HH)8NUB!cZebAQLLLe~*kCq;-mk~Ht z2M+>6Aiw+O1c}2z12L}m1z?Ivvy^+Ed>5MbOOYl~HY9A}9T5t;M_(m{Xj38sbw)h| zAqRfM^57GtRU$DwA0q^ZIEVC_IPLXN!E`zBFm*I5ksXVPYnxQ}JL1o6JwBZTUHt=1KNQoCmM(wWO6qj(TUyV#*l=IsMac!nAbjI9>2dmo zj(1HCB=hc3U&&F3KLQEoho6iN^aBxQbv|0pL}7-nd>cUo1~Hss56cPnfpkQ$EPivM zQ!axfEPTNQ&yLFp_rkL>UqtBMUZ58LPQ1TEFUHV#fA4Pih4KDIqfIrOh>gD-^V`pRNT zs0vc|cWq(e!4xT~5@SZ?4u!Js{-zbbI@FZ0AV* zO^Fc@Fo$g77gpE(daG-HogvqiO=T^sJ3GPb8Hj#+J$-p$qq33Uwljj!>!gCvW?ikFuH>j~znC}klRrE-= z+BpG;<(#=@Gw_?I0GDxtaqz@m{Fk&ODR|cRXDH}8l zNSo#}KsD52@1;siD11JKDQR$OVWRu^WpS(E66oFz~0AHv@yIE)APTv*5Fw)wpsT9l;6XzB=@vpaSHcC)dXo#pM_JUua-x`(Rz z^@hk$RTRJ;?NCTzK3GU#QOLNs0i6;td=&`~L|pwbQ3gg6ksdjCRmO*TG;Z)x3E|rj zlm}T*pyqmi!pIT_uM-pw<*(?98c;h7z&JY4={J@r?E*UD>s7QlnP(_to2JauhzJbg z9n_5utI!8-6R?d!yN>-e3I1BVgM?E?ecC4UY+Z|gi}3F@;^W!|kISCcV3IaB~Lw7B%-Q$331=G4BQNrp){Oao8D&nzy! zAN6a7yI2A^g|WGv?5VdY=} zGVzjswTZPrG2m9C$f=2F;B7YCQUh;lft2Y>8aA#_gv!D0dBAUVXtvB3vR+_dh1MJm zTy*m)SUR=F>a}{~!L{03Y69xAgXs+*1l%ZUU%;oaFLZy%rykwdgeGoGQE`n^YZkT1 zFaWhcW{PWOy0wEWE>3IbSaZ3Z>+iGE@E|sSm>MvoGO|=mMiSPM|Lkrw67*GO>|LqZYu#-qu8LEu=9-igQK-z1uK>_(oB+b_C8-7mfR1EiR4; zvV+haX-5nr)(U6uw2E2}pI*)%t>!7p0R>DvNYM`;T%%)p;!;HFXp%Uwg%{7koR$-R zKC9GWX>{&7k>ofMzIlRl{86$>3}N?u zp8%Ygc)})Dm_YzN9E$;(rN1vl%26Ho7KkgIzY4puIs|Rmha4m7GTbrDPAJi4cfJaP z(sbL+oj=)x^ATV;rUV}sg;xu=mgAHgH!9g+;WQC}bv#M}1dYb!`5>!d9VuH*Wc;_-aEliVgqJCT??Qt5Ey(L$&@TTde6{4rjc zid!8MIdLut?GUqWj8!~=W_~+Xrt0&VqAoO|rVS!VJ2j8&=PW+vu8&O#*9n zid9^f2J3c)f~Fi=yK#3V5#yTmv?0Mkxl}x9fzC2WlU)Q`6A9~o5l5$7X+fnJF(zqJ zj7ucNMZ87&{z+m~Qs=T9vteLXYE*JeYUPPhNfH{BjGp%kjY^WjMkUb|#Hd6(DkuDK zKnDaxvOr11gK|R20V2#TBKzZci+kCz5*)hi=XVlzOUFK;j15?5)VM7}SulbfWKtDqPmsn{zxkhs7uSA+@rr?3oh@mBGu7t_{{+&n{Y{^-? zD_bx9Nx3p3{)O}+T*2~cv$?ZVc<T z!59ncREAQFF<7h9q|Z~r$~z#ERe?;&ml9Ury){8m#7BTzIJ~X$A?fw5M8X8r@gdyB z4${~-F7KR1$0c?Lj7#DZ8|eg#{?|u`{v`hk%;z*B+_%`o%hHw%1^&^5+{GG#)j`bK z32v4R&Xyv70H}Bz=gxbM4w;}q56uXnK`UDV;${VdqnC{p84}->AiJOvP5M6ZK6_zv zE?lZ%qybcH&*(!xx28LGjVW9oo7gV><@PQZYp7DV_*St>`s!gF#j{>;d#DBxPy#kZ zsxw7EiTL}AVf+ACZ*h&C*K>^pS=!l#YwRgpV?m^U#!#~%sXCL0(qx&XQgusMs&4Z4 zma5Isic}qV1e1LBV@G$9`oG~FSXZxo5JeEE{Rqnpb z#)m}XCw~mBvk_cg4;?6u8!~202o5A(!rAWT8zl=W?9i0+6`~S{#^y-eoEtIYpkISR zQ3ld~9F&V-6%hWQ$VFZfEsfnZh!?N$VxYLeF@cwTGh5B-VOob&rU8Q0uXGUHDzz|y zM#()sG$AUHkys!H29&AG*wScTt}5-v%eB0*W9FjPYUnpJ1;r8vcAVIbN*ZAq^mmzvB zVl9%K1iLxY;9%`8gH;A$*`v+{Rw4k;eLdyn)nQ^yKtoT8)@jm{Tr1fnFfjxzUE&Fd z5=A@%)?+LDs~rWr(5`h%`^6}yI}W#E0KQ=a#$XfBii54u1gq8Lh?cHw`AH5uB$eiW zw#tF~dp}Ov29L9)H#Wi{tM}vIZG!vB(wxn37}fjn@TcIuPO5?f!b7cBlr!lY>2(QG z{bT|~P;GKW3!BoIEiqNuX(TA$5PsP_SR8WlY*06$sm&EF9e)hf zvaL>yaMPK}Y#T#lmTP)vKOh|vnzILgqTvJq5n7{*9HTI(mLmq5##EG%<`}@sInbdw zrb<_#giU-&(X8%_?uR20@F3YD246Z3ZzG9jt1!T&q_LLTxpqsa3&+ zo;BBl=vb2k=LXhX>vw3{<$oEofFm&raN2!5H8kza7_$Ip-5lLdbd`E?>Mw{{V44>R z3cLM$DS;8wjkkw6oi!L}I{h1eToCheMSrd$q+Y`IjKfwUP@!3t(j@6jQkdKvxFHxq zz1%^v!1a6EBo$&m;x{4?FYou6Gj4DW!VF%A3_d|7#+3&2>wxrZ5{212EM`czJky2{ zPn(hu69)vAak*lJvM}GjsSU+QXRM|4M(MsJg0c6jbWcD4(bwi$o}8wC@MF^DtB5}3 z7(jq%&F~?3A>hKHnufa)mng$=%_cUbpSH>eW@e1M(bukoLm9?CIk$wwlK0)3|WQb)hBGdf0N?B)skIzj#fE3SUm8)?RWiRP6 z3HQ)S$mWca7hAF(o=9^bx6CxQbV=^)t=^Xodh;SZ!BmT7}?p!A1Pq3M(EA=_*?#nh#0 z;G-)KneKCcaAbQuIMz8@x!bJVaGW%k zs(HEGYOHsD6X@S{;Vo556Gnx3^cj%mss91J?klW5oD2mxVS8a1s9p=9NFfrtW z8$U!fpu?%`;)y;)1zJPZ=mKF52AZSJ^xPS!$58YIiVCD_@9bshtOUQa9q0ntNY=2 zzyT0{lpWJUdcQYyQKZn_D26?$Ml@Saize6cJdWh^1Tuw`1)U_ zHrq2^Y1iTL*53??itq`Fc(1M^kbkzKeacUN74-`*6y{c3S#$t$YN$A!f2P8>=pf{H z08-QuAC0AOcDmy0MMo;GlvgkZzJ4;N0$n)F$t&R#K!@RfIi43BCTwFuRJ zhr={UW`Gl}m3Au2aM+^*n|=}TeZ|2-96r2K5(#DwHyg>KLvLiEha8Ro0wGQBnWZtY zbSx!Feu;R0qH<^Ez>wBFkRV;_-!8+w$@E@vXb-wenGR#3eyxrWbPo)Z7acmrYV>YN z%+x#dG8zXP0v9oofW~7L%^tlka(_dA;rVUJ`flMqS0|qY2BwKPKb^E7o6=zu{c=Lg z-*t>_*&z7hUF#9iwiZ`$LY2MkQ8st(Hcn{16J2eH-xCrSV%6euZnKK9Ae4J@+=GD! znO_eKd9|GI>U%gn*y0)li|#Mw3;=d3N6U*RTXaBiI~NdVFvanXd$80CzV_cS@(8jP1av6iQ&NeGBD6)5E z#^4FC_-nj2_syA5jL5q-_me7r!V=gtBx>zO2UXV)TMuU{)M;o%E5SZz@p!`ndj5tn zxGw)84y&5G4MZy0|30!wC9Mv9Zpk;!3FcD0G<9{C72OWR%T{N@-+6tUUs?RDO z=SV4lnyX4xR!uF6#@5sZ1Ojew*dY}pF=xa$;@}zHzhW-!A9%%<>W4RfCWPLICT|38 zhcl!1SLX=eCKfl*1qo3rtjm!&5kp`O;*CojT>0wvJczn2r@|AtG6 zzWPUzEdjnwG!d*aUU(0og8V;IHKf)uiim>{Hnk(>^6UYrQ3{$@mcvh2&;vL zBRC;|U2pn1fO`MwwpO_po+-wcx&W;0_pkSif!-B=W}$}hPk*3)vyb>w>~4aIT5?go z9-b<^uPKye|FgaF?~1?v$>lIs2JvG8DUEML<&7(^$>uUiQv00F?!j*&W5esRSM(!R zm2^Ez53OhCo5?=bm(64!>#I&3&b08XF!=U?YvU;jKKq<@~)OaHub@AdW1w!e1MKbQRF zI{Ihrps@b=Yn;J93=Hd^j}m{Bfnoi#?>hSDFBM;bELXNxs#7k^sEa0VQ0;RfYM))% zv0ch%!@sS3&L7xQ`8;c2nDnF$>aBck`wJ?cZ|F)CHK@0L^0|D}zfwM!#6znA*|he+&glU_zdtYy#}9}1_h^qRj3# zC);3F%uk*J|3ER!cxM*gn2FaWT+_|yBq}}jV4ED!kdkA}DkygUQDn0`Ivo}b8A|WSE@h&xH4f5SgJz1`#feZ~} z+I_E@zEiYOk5MJIrJ^CWBgs9p6Ggj3SkHz5pY{UTaIC``JhoWN1awk!!!`MOdGX@i zMB)%*$_7dcmR=<|<+n80L=7+I7)lLR(PZE=RSuACO^Kz3fcgVfS$VgddgjCK9w?dK z=pY$?rH3*?H2!}B(y@6`P6e(@e)xTow6D`9VzVYD7#Uc>d@JZ8s`ua!b%$U z7x=VXWp~k_4<~N%1k_ZS7-^kwJ;iZP8V)Htcr?(jqnzsVw_xl|B#OdDJ>#5=#!b-B zu@bbfJ2tUQ)!N99@bKfjR7uW7D$@h$7*!^J1_(M^f|>=XH7-mlP7nB5y*hCvC>sj2 zwy1+~OgER6BY4ovRt?dck4zp`u@ACjSBe{) zHN_2%5$rCF@}{1beMLqlbaei%OrwJu*LH+sDay=WOL7d zaAPzLw9{o|qE(&-k6f#GQ|T%a?ttBm5TYc^7`waP?#h{N$0Y}24`i-NVt1TGtS~P1 zuw7`sZ~Xw?Ju@QgfvM~>c9$30+Jn&#fVK-~;gR+(_*`jrvh;5KHS)zPkVVm^WIZdq zj#PeEPBMPM5(23je8&vG9L?vttna zr?Dm5La`GHL$MPc3&l=Y4kzZAbt(S)L$MR?QDP_Xu2m_}a~ZBx)8Jt9Psfr77&H#| z&truB7>G_C=#K_Ov6+9xE4DbH6R~FJO^3BO38|uV#}H^X`5N7A;Led=Drto4K+bie z9gO-{fepGjVP$;S`ilY^bj6B)CBmO#ryUe8OS^`L)Zj3!f!{5Bu#@V*9~<672Oh~} zT_-;tGF%avA#%{k$f975BYrMNSYIzb9uD~TGx_VToB#e{Kbt?|-KV^wVGjN4Z@e+A z$2Sayi*B2SEKNjBqvdyYP-Q&?1!bmYE&pYu&v{090a zcmg`4t)@O=U}C)6U`+S;x51rVj7EBce?oI4J#@!C@}r9Jn`0tk1|W^hGk{P)d|t?w zJi1N9_Sk{P2hupQ;ag7j?13{Og0Wtz(6x4t&R(hJey6=tJ8D1$TsDKVyy7DKv)UqP7z-f%dg;Qt|K zwcVAi?!_?tOn+_}+M_=wg~nm}(4Xzk@OU5N@05GTzQ&~&W6jb!g46FSH8*p(zy@j6Zrmlv2 z2Qf#)Y~Mug;dOpJ6yKp?7an6%%6r)C;he;|iE|Y9Kox7VrMN$kAg$7dCrX|!NL(*x zp~UztH7Z+xE;fiz{(b9+^+RZK*=kwCVzFu|)1lN#S z8JNp1qoIL+{swAjkoW(lp~1Mn5krHqy$lWV9MRHf?kXA@WM^INWoUqp?=oIRLxbN= zzuL>t03W}3Cxc#sUJeeUdOyBoLeqZfHsVdvWoTe;qx{XYVMBwwf8WsHcM07L4OEu0 z%5Js>Zv;AIVr%fjxegg^4aT9Z!9KJkp#}#S#gpZKg=|wNS{&G2@nMUDd}JMHIFtyi zD?)d%uhJXbb5zn)^uU;-q0y{MJgm8%8ix}n-J{a3k3#ZRT7+yPv}@K6q`*BFegl)+ z+oa_+ULTP70nh1rU|)vxM<=D`6x1QqV%&*z+2$_&Em2IXtg^>GGc(KNY!$1lLQuoL z;Ne_QCR>*Z15`fGacjMP8 zMo!TGhmH~Zw|b-57t7J;lYP!Jwhm78a8g|7RJ)A5DJ$Zs?2bntO83l9?dbi}&n}#M z&@OZgTd(6}Pv9&kcJq@%Ki_31=eP&Yw2I|_xnlW#67|MCM{P5fue*=KxVu98aK{w* zk8_T+8Ee-KwR4%nobgt{qqVydt%6sJGDP4Antj<_dbptuT(F8qfja-~ffz<;zS9ar z!rKmv_233n!57);Gt^jgy*0I*uMcV>_5%E~f4Ul}Rq!wTpqnPb|Eu@I*S{eC@}ysX z7=O7W*!I6Y{<3c9zZHM^^4qP~i@!Xnd;DeGQ?kH(nAvF)Ys{{@^=PRAv%~1kb;VoQ z+2xi}PH(Jt4wNtes@0{!HB`q{a(a!mTTtO1W4>LQ%qr{zG*y+f=1v{66IcmpK(Nm> zy~|&Z+U?uKd-Un2K|Ur{WnAWcddEF~7V#df*`1>ny`{F~N4%0g*PU%BMN}8D*6Pld za4!ej)8d*}XLV&)Lvc*feIfFr@4xhQ$2bAY`B_!pc{zI0zeo!;fbwx+j9{T22J z7;4_jtYMCxT^M(vouKNf;AhqMiJv!*I&x;}MlXt?;Av=0ih)%zs5q9?IS^KV=<|2P zFqLoB>&?pFlx-g_aTQ+9tt&u7_W2lNgn5F$hhX^e9)9m^;{eR-Fz~{K)ibWQM#= zx^(aOCRxR#d&Rj)uBh~!rNUWNI-Jf;620l!ONFM<>0Z~Yq{xB{gz0k?rr2BqkbT?! zJUF3&#>82sRB*TM&a~uA z3ukI_riL>WIU`8gOOe@soRXzu%wh}b<`wmHGx-mF=>MftrGwiODFy|ZwY0FC>MgoC8dnfPG z2V$jn$hG(E7?-|pe@{c?HZ4%#^wThE36FlxCSEd&0o=DJ*-j0AUfALwLL$3Oh&IiZ z1jsgGjUxtD5?1&UuJ-7O1lGzMgFHJcXl?t7mydA5x6wBDHhr$9)9Q{L${YRcuTGM9 zO8s#{Rg>-4cS*)0qxrTIyyh!@+!;RgE0}E7)JkA0gZ`al2jzlupjG%bXcgxMrFZ)U zWj}#AK)a`L-WJ+`If0*mE}qPy_Y@J+bgCy~8e>1IfU zdmK3U^|;%C$)yu9K_!V}EB7(s@+my)g0#A>iCjsr_L&V6eCGx@W;4s$@%6&^qpDOHRj3i% z1?4u2-{FYF2D8CRmF65yJ&l15X%6C8($vCmVv9Q!-?tg#L}zfuwjJj+r}%MS z@u{b<1Q}RRkW8xIz!CKgj;PP1t5I|XO(nj6R~v%Ixc5i0CoN#eR*#2LKF z>gKRJoNI03N2G8V=3bX;>|D2$c6+Y)UAP~*XxA43fp z$dF!)3XvU0D&p?69mgt+`^uVnhESXXNO1y#q<4M{m+Lvwu4izkVTjfE{knKt>W{#G z$ff3rmFW%AoBx3pAy?7t(;-`BA9d&`R|k$N`!_xIiG=fi8N!UX=`oBN&6+T5#pVGdh6Ae4{JAy|Y)~U& zXA$rYwIYrb#H^z#564L9{&^T6uZ5j_=_$3NABE{Xk&X8%!`b)_{hZH?qCYTM(t#ee z&}|}|g>gtE^sodu)6At)rGY=Rg(FtC{?MkN2leGHv)E_FUC!JlX>uaYmR!hx^q?j4 zNxkzybH-H1C?1^`E~=cD&86wm{wr;=`+*^l=^Kz~U_76CsZ2W{WOzD=hPuXt&yj>< z1D|u^SLO_7kS%_SNaDFo%C40EQH)lJHZW5iw|4u+!tgg{z&Gg2Gsw%9CS`xhe=}U$ z5Nq%6TB}%RGy2vJWOu1&6))0%55rxhTAcphb7h{1&acH*`kE4l(GK*XtMn;SpzY13V}H z1z!KziU`THm!EDs2KN*X+r%Rv7e?DHKq)MCP6&?W-7{6WZmZe?(~M^=<=Dbv9VT#| zAzRpdYBfdVlfBZHb3^!lNzP&EHPY7KhoEsH@n;ZuC>~_{v5si8m>_sbRcibyy!M^l zH5J}8|DK}s_hjxI;@OCr$We7CQL*UrKSNcOp?Uih zJ7p9%Aet$B5Y?4O`Xip4uW&vAE3%STkD`dv2GyeZQUzM@^+San zOsWZiUA(v;j}SV`AS84vS}d8Xll9KzTpY-i%9eV3>@}EwQjY~4uSU$afEyVWv5F(u z66TB)$8A=PFE`bPW_zj9e}3OpLf6GM@;+NUzX#1Slj~|iud3GFZgc0!xnivisKH3+L3OszCoz6%ua9 z!7(5=^$N_&z#jMtv=??j$?u301bp!k6wFv@|AjW$;$EVrRLN?*S_mxu!cJauR3U7G zB5GnyJ&2U;!o+&6_^2b=T)NuW8PMT@ws0iT+LMQW^bEtkV1v%TpwLZd(2Vax4XWwv zzJgr2hVhPNAe6}$x(MZCeG$sqYjW>z0-^link;w6ia1HIG{kCxUy&^b^d&X!Y!!P~ zH{PO4Z)A4Qi4r@^V*Q@yldaEjZGMn)En*|5srPoM737>%<y-Brz{Ufo``4h2O_-gc23ETT_y!jkI6ENi{~F`D{Swb7~V zoZIynq|_W~^Y{2%YBje#xEh{q)(P!u$4IzZrCezo1KDtjDHn*>s5d_f6Rpi-pOA{43xZLLTGsk}%kRasIfh!!i3ibzvH zSxZ_aJTl^UbX;b0HV4NU$JrEc)TV8Jpkm!&X&ehz`C z=Mp_{%0d`|UkD>V5hftjkv|?D7Ek^)vb|MJvK7r2BNd(}X;Dtmgz$E~F*g#TAOT_$ z<%A8q^(Q@qC?sRGen}~5%@v+qz{E)nWBuZ!SrpTS*Ccc;Z`|4sH;%Edt4PAmuuYAs zWVy`J>3H$sAGM=$8_F#fmvC=?x|l2;6rX5BBcFIK74K=i;&busqZ+T1?co)Seu9 zzZnJ3Bfc==<9mQ=2W%UOcH>J`l9l2}qg{-6`CQqJ>?}xjBTUTB!sIrof2(n`udd-Q(e7jeY8&J>a6a~4=L zoKKI)aIQ|ZcP(80G}AG&cRjv5i7WaCUJ{PpZ;Jt9#g>NuZnB?=utnLs0QaJ1xA?c) zF8e$mVzTr@%$|Y0YYwFEe|pk(!rqn375@ZNS+#(vP$yA*5ba2e2Q(f{mj$0 zFR;L^`0wvnezd(yUGS7R_Z9%-nRaucPORvE+2?&&FeVy{+_t{lcCoL+m?-WV39;kt zT}y03>|OcLtgZsveq;KamH=OeJHF~nr9rnGtXG; zD$p1|i7*!JEl`>^f9_=Q0F3T|=b=j}eDeYL`eML}ZQASC7R#kWJse`8F)xC$^@L7iEE3O>Rp ziG>)KDeU8&GXcbRh>;cTzP2fe8ryyFUsZ57Bo^AS>O0}UNjLHqVRt67qV|e?sM1M3 zTVLM}EWMEz=7}%|7Ooh*Nu{mixgT@HBfr;>x+bwegSQ(a9z|pO55*L&h(-?*lJc@J z#UQkkT!v${f0&-nb48cv1cjPfqLJ>v+3me^W}{t;sz+%zA_F+f2T41 z%Bltwh{)_fOs@SFQ|H7lfU_Q)^YY=Gw~`M!>s?RZWcVFD^i8^CCD)N;{khY}6_G6r zJZtKDe`ubZdzH}-NW%H_6)R{Ldf2DGZAC9?CckKuH$zViA{%F;pF52tnz)+YNzLSM zVbx6fip#$CF*8SwsVebV>BZ!jsu6SG#W9ssOB_>mynW|DTRQ2L@G$bD4;i&{Ur4pvQ zlxT7Cnw^Anb(+iB2YP<#sCp_To%Q3bv|5sEf-98ejNwuEhi@v2Wh^cB)1>AMY$ z>g*l0T@T2S{EdlwpY-`y2tRepgBYDzk)F7J1n8)Tw~yRy9C`U)E};ijT`fF}+qQYnnve+;w?CAmpbFnHu4B^t*^0#z#>IO@L)_>d?z zv(RBlCo6h}qHocfBcd=N#)9@{k#rFMK1+#awNVIQtI)#x)(`bgc)d(ZWyyz#z3pbZ$QQXtH(Pfk^DO# zrCDgBTCVluihf1jDT>A>OI8_+#ws9Ga1*BOS`IZ~TdKb#tCgs_Y(g9B`uCrOvjA>f z+S5z>D8!fcqV9r?nN!>?E?(T_e{((*>7A8lpESz$K%Ob>KCUPaP5FMtNd}OINCuE^ zmJA^GgQQPz#YRc;ZQXL}kM~Pq2O4Q41)Ufum05Zu^969=BKwR%ZWcX%8Qnvx$@8na zAbF)0Za@^tn+$j~tb9p;Ol>{dfu0ZrYx>YKTwY1H!SZryyFR+)D{d%=f99QU#KA&y zu0-P2`GyX{U+D>73